541 lines
20 KiB
C++
541 lines
20 KiB
C++
/* 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "watchmaker/classes/do_dialog.h"
|
|
#include "watchmaker/globvar.h"
|
|
#include "watchmaker/define.h"
|
|
#include "watchmaker/3d/math/llmath.h"
|
|
#include "watchmaker/message.h"
|
|
#include "watchmaker/3d/loader.h"
|
|
#include "watchmaker/3d/geometry.h"
|
|
#include "watchmaker/3d/t3d_body.h"
|
|
#include "watchmaker/schedule.h"
|
|
#include "watchmaker/ll/ll_anim.h"
|
|
#include "watchmaker/walk/act.h"
|
|
#include "watchmaker/ll/ll_diary.h"
|
|
#include "watchmaker/ll/ll_util.h"
|
|
#include "watchmaker/classes/do_player.h"
|
|
#include "watchmaker/main.h"
|
|
#include "watchmaker/windows_hacks.h"
|
|
#include "watchmaker/classes/do_inv.h"
|
|
#include "watchmaker/ll/ll_string.h"
|
|
#include "watchmaker/classes/do_system.h"
|
|
#include "watchmaker/classes/do_camera.h"
|
|
#include "watchmaker/classes/do_string.h"
|
|
#include "watchmaker/renderer.h"
|
|
|
|
namespace Watchmaker {
|
|
|
|
// locals
|
|
int32 DebugSent = 0;
|
|
int16 NextDlg = dNULL;
|
|
int32 ic1, ic2;
|
|
|
|
/* -----------------03/06/98 10.11-------------------
|
|
* doDialog
|
|
* --------------------------------------------------*/
|
|
void doDialog(WGame &game) {
|
|
Init &init = game.init;
|
|
struct SItemCommand *ic;
|
|
uint8 r;
|
|
|
|
switch (TheMessage->event) {
|
|
case ME_DIALOGSTART:
|
|
if (TheMessage->wparam1 == dR391) {
|
|
if (Character[ocCHIRURGO]->Mesh)
|
|
t3dVectFill(&Character[ocCHIRURGO]->Mesh->Trasl, 0.0f);
|
|
if (Character[ocVECCHIO]->Mesh)
|
|
t3dVectFill(&Character[ocVECCHIO]->Mesh->Trasl, 0.0f);
|
|
if (Character[ocOROLOGIAIO]->Mesh)
|
|
t3dVectFill(&Character[ocOROLOGIAIO]->Mesh->Trasl, 0.0f);
|
|
if (Character[ocTRADUTTORE]->Mesh)
|
|
t3dVectFill(&Character[ocTRADUTTORE]->Mesh->Trasl, 0.0f);
|
|
|
|
bSuperView = 1;
|
|
game._renderer->setCurCameraViewport(t3dCurCamera->Fov, bSuperView);
|
|
}
|
|
|
|
//faccio apparire la scritta di descrizione della stanza di Darrell
|
|
if ((TheMessage->wparam1 == dR000) && bShowRoomDescriptions) {
|
|
t3dCurTime = 240;
|
|
RoomInfo.name[0] = '\0';
|
|
UpdateRoomInfo(game);
|
|
}
|
|
|
|
// I make darrell disappear
|
|
if ((TheMessage->wparam1 == dRLOGHI) || (TheMessage->wparam1 == dR000)) {
|
|
Character[ocDARRELL]->Flags |= T3D_CHARACTER_HIDE; //I hide darrell to make sure he doesn't show while he loads the animations
|
|
}
|
|
|
|
if ((init.Dialog[TheMessage->wparam1].flags & DIALOG_ONCE) && (init.Dialog[TheMessage->wparam1].flags & DIALOG_DONE))
|
|
return ;
|
|
|
|
StopDiary(game, game._gameVars.getCurRoomId(), init.Dialog[TheMessage->wparam1].obj, 0);
|
|
CurDialog = TheMessage->wparam1;
|
|
bDialogActive = true;
|
|
bDialogMenuActive = true;
|
|
|
|
CurDlgItem = -1;
|
|
CurMenu = mMAIN;
|
|
InvStatus = INV_OFF;
|
|
BigInvObj = iNULL;
|
|
NextDlg = dNULL;
|
|
ClearUseWith();
|
|
ClearText();
|
|
CharStop(ocCURPLAYER);
|
|
|
|
if (bFirstPerson)
|
|
game._renderer->setCurCameraViewport(74, bSuperView);
|
|
|
|
bDialogMenuActive = false;
|
|
//DebugFile("DLG: StartDialog %d",CurDialog);
|
|
// Se sono in un fullmotion
|
|
if ((init.Dialog[CurDialog].flags & DIALOG_RTV2) && (init.Dialog[CurDialog].ItemIndex[mRTV2]))
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGCONTINUE, MP_DEFAULT, (int16)CurDialog, mRTV2, 0, nullptr, nullptr, nullptr);
|
|
else if ((init.Dialog[CurDialog].flags & DIALOG_RTV3) && (init.Dialog[CurDialog].ItemIndex[mRTV3]))
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGCONTINUE, MP_DEFAULT, (int16)CurDialog, mRTV3, 0, nullptr, nullptr, nullptr);
|
|
else if ((init.Dialog[CurDialog].flags & DIALOG_RTV) || (init.Dialog[CurDialog].ItemIndex[mRTV]))
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGCONTINUE, MP_DEFAULT, (int16)CurDialog, mRTV, 0, nullptr, nullptr, nullptr);
|
|
// Se c'e' un predialog attivo
|
|
else if (init.Dialog[CurDialog].flags & (DIALOG_PRE1 | DIALOG_PRE2 | DIALOG_PRE3 | DIALOG_PRE4)) {
|
|
if (init.Dialog[CurDialog].flags & DIALOG_PRE_RAND)
|
|
while (!(init.Dialog[CurDialog].flags & (DIALOG_PRE1 << (r = (game._rnd->getRandomNumber(3))))));
|
|
else if (init.Dialog[CurDialog].flags & DIALOG_PRE1) r = 0;
|
|
else if (init.Dialog[CurDialog].flags & DIALOG_PRE2) r = 1;
|
|
else if (init.Dialog[CurDialog].flags & DIALOG_PRE3) r = 2;
|
|
else r = 3;
|
|
|
|
if (init.Dialog[CurDialog].ItemIndex[mPREDIALOG1 + r])
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGCONTINUE, MP_DEFAULT, (int16)CurDialog, (int16)(mPREDIALOG1 + r), 0, nullptr, nullptr, nullptr);
|
|
else
|
|
bDialogMenuActive = true;
|
|
} else
|
|
bDialogMenuActive = true;
|
|
|
|
break;
|
|
|
|
case ME_DIALOGCONTINUE:
|
|
CurDialog = TheMessage->wparam1;
|
|
CurDlgItem = TheMessage->wparam2;
|
|
bDialogMenuActive = false;
|
|
|
|
ic = &init.DlgItem[init.Dialog[CurDialog].ItemIndex[CurDlgItem]].item[CurPlayer][TheMessage->lparam[0]];
|
|
// Finche' non ci sono comandi che deve aspettare tempo, li fa tutti
|
|
while (ic->com) {
|
|
TheMessage->lparam[0] ++;
|
|
// DebugLogFile("IC %d %d %d | %d %d %d",ic->com,ic->param1,ic->param2,CurDialog,CurDlgItem,TheMessage->lparam[0]);
|
|
switch (ic->com) {
|
|
case IC_NULL: // Esce dal dialogo
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGEND, MP_DEFAULT, 0, 0, 0, nullptr, nullptr, nullptr);
|
|
break;
|
|
case IC_SET_PLAYER: // non fa niente
|
|
break;
|
|
case IC_ANIM:
|
|
//DebugFile("DLG: StartAnim %d",ic->param1);
|
|
StartAnim(game, GetAlternateAnim(init, ic->param1));
|
|
break;
|
|
case IC_SET_CAMERA:
|
|
ForcedCamera = GetAlternateCamera(init, (uint8)ic->param1);
|
|
bCutCamera = true;
|
|
bAllowCalcCamera = false;
|
|
break;
|
|
case IC_MOVE_CAMERA_TO:
|
|
ForcedCamera = GetAlternateCamera(init, (uint8)ic->param1);
|
|
bCutCamera = false;
|
|
bAllowCalcCamera = true;
|
|
break;
|
|
case IC_SET_TARGET:
|
|
CameraTargetObj = ic->param1;
|
|
CameraTargetBone = ic->param2;
|
|
break;
|
|
case IC_SET_CHAR:
|
|
CharSetPosition(ic->param1, GetAlternatePosition(init, (uint8)ic->param2), nullptr);
|
|
CharStop(ic->param1);
|
|
break;
|
|
case IC_WALK_CHAR:
|
|
case IC_RUN_CHAR:
|
|
case IC_BACK_CHAR:
|
|
CharGotoPosition(game, ic->param1, GetAlternatePosition(init, (uint8)ic->param2), (uint8)(ic->com - IC_WALK_CHAR), 0);
|
|
TimeWalk = 0;
|
|
break;
|
|
case IC_HIDE_CHAR:
|
|
Character[ic->param1]->Flags |= T3D_CHARACTER_HIDE;
|
|
break;
|
|
case IC_UNHIDE_CHAR:
|
|
Character[ic->param1]->Flags &= ~T3D_CHARACTER_HIDE;
|
|
break;
|
|
case IC_CHANGE_ROOM:
|
|
ChangeRoom(game, Common::String::format("%s.t3d", init.Room[ic->param1].name), 0, aNULL);
|
|
break;
|
|
case IC_EXPRESSION:
|
|
if (Character[ic->param1])
|
|
Character[ic->param1]->CurExpressionSet = ic->param2;
|
|
break;
|
|
case IC_CHANGE_PLAYER:
|
|
UpdatePlayerStand(game, (uint8)(CurPlayer + ocDARRELL));
|
|
CurPlayer = (ic->param1 == ocDARRELL) ? DARRELL : VICTORIA;
|
|
Character[ocCURPLAYER] = Character[ic->param1];
|
|
Player = Character[ocCURPLAYER];
|
|
Player->Flags &= ~T3D_CHARACTER_HIDE;
|
|
break;
|
|
case IC_DEBUG:
|
|
DebugSent = ic->param1;
|
|
break;
|
|
case IC_ITEM:
|
|
init.DlgMenu[ic->param1].on = (uint8)ic->param2;
|
|
break;
|
|
case IC_SET_FLAGS:
|
|
if (ic->param1 != dNULL)
|
|
init.Dialog[ic->param1].flags |= ic->param2;
|
|
else
|
|
init.Dialog[CurDialog].flags |= ic->param2;
|
|
break;
|
|
case IC_CLR_FLAGS:
|
|
if (ic->param1 != dNULL)
|
|
init.Dialog[ic->param1].flags &= ~ic->param2;
|
|
else
|
|
init.Dialog[CurDialog].flags &= ~ic->param2;
|
|
break;
|
|
case IC_ATFRAME:
|
|
init.Anim[aDUMMY].atframe[0].type = (uint8)ic->param1;
|
|
init.Anim[aDUMMY].atframe[0].index = ic->param2;
|
|
init.Anim[aDUMMY].active = 12;
|
|
ProcessATF(game, aDUMMY, 0);
|
|
init.Anim[aDUMMY].active = 0;
|
|
break;
|
|
case IC_NEXT_DLG:
|
|
NextDlg = (int16)ic->param1;
|
|
break;
|
|
case IC_SET_CHAR2:
|
|
if (CurAlternate[ic->param1]) break;
|
|
CharSetPosition(ic->param1, GetAlternatePosition(init, (uint8)ic->param2), nullptr);
|
|
CharStop(ic->param1);
|
|
break;
|
|
case IC_INTRO_TEXT1:
|
|
ic1 = ic->param1;
|
|
ic2 = ic->param2;
|
|
_vm->_messageSystem.doEvent(EventClass::MC_SYSTEM, ME_STARTEFFECT, MP_DEFAULT, FRAME_PER_SECOND, FRAME_PER_SECOND, EFFECT_FADEOUT_T1, &ic1, nullptr, nullptr);
|
|
if (ic2)
|
|
_vm->_messageSystem.doEvent(EventClass::MC_SYSTEM, ME_STARTEFFECT, MP_WAITA, FRAME_PER_SECOND, FRAME_PER_SECOND, EFFECT_MOVEIN_T1, &ic1, nullptr, &ic2);
|
|
break;
|
|
case IC_INTRO_TEXT2:
|
|
ic1 = ic->param1;
|
|
ic2 = ic->param2;
|
|
_vm->_messageSystem.doEvent(EventClass::MC_SYSTEM, ME_STARTEFFECT, MP_DEFAULT, FRAME_PER_SECOND, FRAME_PER_SECOND, EFFECT_FADEOUT_T2, &ic1, nullptr, nullptr);
|
|
if (ic2)
|
|
_vm->_messageSystem.doEvent(EventClass::MC_SYSTEM, ME_STARTEFFECT, MP_WAITA, FRAME_PER_SECOND, FRAME_PER_SECOND, EFFECT_MOVEIN_T2, &ic1, nullptr, &ic2);
|
|
break;
|
|
|
|
case IC_TIME_ANIM:
|
|
//DebugFile("DLG: StartTimeAnim %d %d",ic->param1,ic->param2);
|
|
AnimAutoPush = ic->param2;
|
|
StartAnim(game, GetAlternateAnim(init, ic->param1));
|
|
TheMessage->flags |= MP_WAIT_ANIM;
|
|
TimeAnim = GetAlternateAnim(init, ic->param1);
|
|
ReEvent();
|
|
return ;
|
|
case IC_TIME_ANIM2:
|
|
//DebugFile("DLG: StartTimeAnim %d %d",ic->param1,ic->param2);
|
|
StartAnim(game, GetAlternateAnim(init, ic->param1));
|
|
TheMessage->flags |= MP_WAIT_ANIM;
|
|
TimeAnim = GetAlternateAnim(init, ic->param1);
|
|
ReEvent();
|
|
return ;
|
|
case IC_TIME_WALK_CHAR:
|
|
case IC_TIME_RUN_CHAR:
|
|
case IC_TIME_BACK_CHAR:
|
|
if (!CharGotoPosition(game, ic->param1, GetAlternatePosition(init, (uint8)ic->param2), (uint8)(ic->com - IC_TIME_WALK_CHAR), 0)) break;
|
|
TimeWalk = ic->param1;
|
|
TheMessage->flags |= MP_WAIT_ACT;
|
|
ReEvent();
|
|
return ;
|
|
case IC_TIME_WAIT_CAMERA:
|
|
TheMessage->flags |= MP_WAIT_CAMERA;
|
|
ReEvent();
|
|
return ;
|
|
case IC_TIME_WAIT:
|
|
if (TheMessage->lparam[1] == 0) {
|
|
TheMessage->lparam[1] = ic->param1;
|
|
if (DebugSent && (LoaderFlags & T3D_DEBUGMODE)) PlayerSpeak(game, DebugSent);
|
|
}
|
|
if (TheMessage->lparam[1] > 1) {
|
|
TheMessage->lparam[0] --;
|
|
TheMessage->lparam[1] --;
|
|
TheMessage->flags |= MP_WAIT_RETRACE;
|
|
ReEvent();
|
|
return;
|
|
}
|
|
TheMessage->lparam[1] = 0;
|
|
bSkipTalk = false;
|
|
DebugSent = 0;
|
|
break;
|
|
case IC_TIME_FADOUT:
|
|
_vm->_messageSystem.doEvent(EventClass::MC_SYSTEM, ME_STARTEFFECT, MP_DEFAULT, ic->param1, 1, EFFECT_FADOUT, nullptr, nullptr, nullptr);
|
|
TheMessage->flags |= MP_WAITA;
|
|
ReEvent();
|
|
return ;
|
|
}
|
|
ic = &init.DlgItem[init.Dialog[CurDialog].ItemIndex[CurDlgItem]].item[CurPlayer][TheMessage->lparam[0]];
|
|
}
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGEND, MP_DEFAULT, (int16)CurDialog, (int16)CurDlgItem, 0, nullptr, nullptr, nullptr);
|
|
break;
|
|
|
|
case ME_DIALOGEND:
|
|
case ME_DIALOGEND_SKIPINTRO:
|
|
if (TheMessage->wparam1 == dR391) {
|
|
bSuperView = 0;
|
|
game._renderer->setCurCameraViewport(t3dCurCamera->Fov, bSuperView);
|
|
NextDlg = dR391_end;
|
|
}
|
|
|
|
CurDialog = TheMessage->wparam1;
|
|
CurDlgItem = TheMessage->wparam2;
|
|
game._messageSystem.removeEvent(EventClass::MC_DIALOG, ME_ALL);
|
|
// Se c'e' un enddialog attivo
|
|
if ((CurDlgItem == mQUIT) && (init.Dialog[CurDialog].flags & (DIALOG_END1 | DIALOG_END2 | DIALOG_END3))) {
|
|
if (init.Dialog[CurDialog].flags & DIALOG_END_RAND)
|
|
while (!(init.Dialog[CurDialog].flags & (DIALOG_END1 << (r = (game._rnd->getRandomNumber(2))))));
|
|
else if (init.Dialog[CurDialog].flags & DIALOG_END1) r = 0;
|
|
else if (init.Dialog[CurDialog].flags & DIALOG_END2) r = 1;
|
|
else r = 2;
|
|
|
|
if (init.Dialog[CurDialog].ItemIndex[mENDDIALOG1 + r]) {
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGCONTINUE, MP_DEFAULT, (int16)(CurDialog), (int16)(mENDDIALOG1 + r), 0, nullptr, nullptr, nullptr);
|
|
return ;
|
|
}
|
|
}
|
|
|
|
if ((CurDlgItem == mRTV) || (CurDlgItem == mRTV2) || (CurDlgItem == mRTV3) || (CurDlgItem == mQUIT) ||
|
|
(CurDlgItem == mENDDIALOG1) || (CurDlgItem == mENDDIALOG2) || (CurDlgItem == mENDDIALOG3)) {
|
|
//DebugFile("DLG: EndDialog %d",CurDialog);
|
|
StopObjAnim(game, ocCURPLAYER);
|
|
CharStop(ocCURPLAYER); //evito che negli interrupt (in particolare) rimanga in memoria l'animazione di ascolta
|
|
game._cameraMan->ResetCameraTarget();
|
|
init.Dialog[CurDialog].flags |= DIALOG_DONE;
|
|
CurDialog = dNULL;
|
|
bDialogActive = false;
|
|
bDialogMenuActive = false;
|
|
bAnimWaitText = false;
|
|
CurDlgItem = -1;
|
|
CurMenu = mNULL;
|
|
ForcedCamera = 0;
|
|
bCutCamera = false;
|
|
bAllowCalcCamera = false;
|
|
CameraTargetObj = ocCURPLAYER;
|
|
CameraTargetBone = 0;
|
|
TimeWalk = ocCURPLAYER;
|
|
TimeAnim = aNULL;
|
|
bPlayerInAnim = false;
|
|
if (NextDlg != dNULL)
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGSTART, MP_DEFAULT, NextDlg, 0, 0, nullptr, nullptr, nullptr);
|
|
else {
|
|
if ((init.Dialog[TheMessage->wparam1].obj) && (Character[init.Dialog[TheMessage->wparam1].obj]))
|
|
StartDiary(game, game._gameVars.getCurRoomId(), &Character[init.Dialog[TheMessage->wparam1].obj]->Mesh->Trasl);
|
|
else
|
|
StartDiary(game, game._gameVars.getCurRoomId(), nullptr);
|
|
|
|
DebugLogFile("EndDialog: resetto t3dLastCameraIndex");
|
|
game._cameraMan->resetLastCameraIndex(); //forzo ProcessCamera() a cercare una nuova camera, in modo finito il dialogo non rimane qualche strana camera
|
|
}
|
|
} else
|
|
bDialogMenuActive = true;
|
|
|
|
if (TheMessage->event == ME_DIALOGEND_SKIPINTRO)
|
|
if (! DataLoad(game, "WmStart.dat", 0)) {
|
|
DebugLogFile("SkipIntro: DataLoad() Failed. Quitting ...");
|
|
CloseSys(game);
|
|
}
|
|
|
|
if (TheMessage->wparam1 == dRLOGHI)
|
|
ProcessATFDO(game, fSTART_MAIN_MENU);
|
|
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
/* -----------------06/07/00 10.48-------------------
|
|
* GetAlternatePosition
|
|
* --------------------------------------------------*/
|
|
uint8 GetAlternatePosition(Init &init, uint8 pos) {
|
|
struct SDialog *d = &init.Dialog[CurDialog];
|
|
int32 alt;
|
|
|
|
if (!d || !d->obj || !(alt = CurAlternate[d->obj])) return pos;
|
|
|
|
alt --;
|
|
if (d->AltPosSco[alt]) return pos + d->AltPosSco[alt];
|
|
|
|
return pos;
|
|
}
|
|
|
|
/* -----------------06/07/00 10.49-------------------
|
|
* GetAlternateCamera
|
|
* --------------------------------------------------*/
|
|
uint8 GetAlternateCamera(Init &init, uint8 cam) {
|
|
struct SDialog *d = &init.Dialog[CurDialog];
|
|
int32 alt;
|
|
|
|
if (!d || !d->obj || !(alt = CurAlternate[d->obj])) return cam;
|
|
|
|
alt --;
|
|
if (d->AltCamSco[alt]) return cam + d->AltCamSco[alt];
|
|
|
|
return cam;
|
|
}
|
|
|
|
/* -----------------06/07/00 10.49-------------------
|
|
* GetAlternateAnim
|
|
* --------------------------------------------------*/
|
|
int32 GetAlternateAnim(Init &init, int32 an) {
|
|
struct SDialog *d = &init.Dialog[CurDialog];
|
|
int32 a, alt;
|
|
|
|
if (!d || !d->obj || !(alt = CurAlternate[d->obj])) return an;
|
|
|
|
alt --;
|
|
for (a = 0; a < MAX_ALT_ANIMS; a++)
|
|
if ((d->AltAnims[alt][a][0] == an) && (d->AltAnims[alt][a][1] != aNULL))
|
|
return d->AltAnims[alt][a][1];
|
|
|
|
return an;
|
|
}
|
|
|
|
/* -----------------03/06/98 11.31-------------------
|
|
* UpdateDialogMenu
|
|
* --------------------------------------------------*/
|
|
void UpdateDialogMenu(WGame &game, int16 dmx, int16 dmy, uint8 db) {
|
|
struct SRect t;
|
|
int32 a, ca1, ca2;
|
|
Init &init = game.init;
|
|
Renderer &renderer = *game._renderer;
|
|
|
|
if ((bDialogActive == FALSE) || (CurDialog == dNULL) || (bDialogMenuActive == FALSE))
|
|
return ;
|
|
|
|
if ((db == ME_MLEFT) && (CurDlgItem) && (init.DlgMenu[CurDlgItem].parent == mMAIN)) {
|
|
CurMenu = CurDlgItem;
|
|
Diag2Base = 0;
|
|
} else if ((db == ME_MLEFT) && (CurDlgItem) && (CurDlgItem != -1)) { // TODO: The original didn't have a check for -1 here
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGCONTINUE, MP_DEFAULT, (int16)CurDialog, (int16)CurDlgItem, 0, nullptr, nullptr, nullptr);
|
|
UsedDlgMenu[CurPlayer][CurObj][CurDlgItem] = 1;
|
|
} else if ((db == ME_MRIGHT) && (CurMenu == mMAIN))
|
|
_vm->_messageSystem.doEvent(EventClass::MC_DIALOG, ME_DIALOGEND, MP_DEFAULT, (int16)CurDialog, (int16)mQUIT, 0, nullptr, nullptr, nullptr);
|
|
else if (db == ME_MRIGHT) {
|
|
CurMenu = mMAIN;
|
|
Diag2Base = 0;
|
|
}
|
|
|
|
//if( ( db == ME_MLEFT ) || ( db == ME_MRIGHT ) ) DebugFile("DLG: Click %d %d",CurMenu,CurDlgItem);
|
|
|
|
for (a = 0, ca1 = 0, ca2 = 0; a < MAX_DLG_MENUS; a++) {
|
|
if (!(init.DlgMenu[a].on)) continue;
|
|
|
|
// se la servetta mi ha gia' dato la banconota devo fare in modo che non me la dia ancora
|
|
if ((a == mCOSEFATTI8) && (CurObj == ocSERVETTA) && (IconInInv(init, i2cBANCONOTA1))) continue;
|
|
|
|
CurDlgItem = a;
|
|
if (init.DlgMenu[a].parent == mMAIN) {
|
|
t.x1 = DIAG1_MARG_SX;
|
|
t.x2 = DIAG1_MARG_DX;
|
|
t.y1 = DIAG1_MARG_UP + DIAG_DY * ca1;
|
|
t.y2 = DIAG1_MARG_UP + DIAG_DY * (ca1 + 1);
|
|
|
|
ca1++;
|
|
if (CheckRect(renderer, t, dmx, dmy)) return;
|
|
} else if (init.DlgMenu[a].parent == CurMenu) {
|
|
t.x1 = DIAG2_MARG_SX;
|
|
t.x2 = DIAG2_MARG_DX;
|
|
t.y1 = DIAG2_MARG_UP + DIAG2_DY * (ca2 - Diag2Base);
|
|
t.y2 = DIAG2_MARG_UP + DIAG2_DY * ((ca2 - Diag2Base) + 1);
|
|
|
|
ca2++;
|
|
if ((ca2 < Diag2Base) || (ca2 > (Diag2Base + MAX_DIAG2_ITEMS))) continue;
|
|
if (CheckRect(renderer, t, dmx, dmy)) return;
|
|
}
|
|
}
|
|
CurDlgItem = -1;
|
|
if ((db == ME_MLEFT) || (db == ME_MRIGHT)) {
|
|
// Se si cambia la logica di incremento variarla anche in PaintDialog() nella gestione delle freccette
|
|
if (CheckRect(renderer, game._gameRect._diag2Up, dmx, dmy))
|
|
Diag2Base = ((Diag2Base - 1) < 0) ? 0 : Diag2Base - 1;
|
|
else if (CheckRect(renderer, game._gameRect._diag2Down, dmx, dmy))
|
|
if ((Diag2Base + 1 + MAX_DIAG2_ITEMS) <= ca2)
|
|
Diag2Base ++;
|
|
}
|
|
}
|
|
|
|
/* -----------------03/06/98 10.47-------------------
|
|
* PaintDialog
|
|
* --------------------------------------------------*/
|
|
void PaintDialog(WGame &game) {
|
|
int32 a, ca1, ca2;
|
|
int32 tx = 0, ty = 0;
|
|
FontColor tc;
|
|
Init &init = game.init;
|
|
|
|
if ((bDialogActive == FALSE) || (CurDialog == dNULL) || (bDialogMenuActive == FALSE))
|
|
return ;
|
|
|
|
game._renderer->_2dStuff.displayDDBitmap(ConsoleD1, 7, 366, 0, 0, 0, 0);
|
|
DisplayD3DRect(*game._renderer, 15, 373, 187, 211, 18, 25, 18, 128);
|
|
game._renderer->_2dStuff.displayDDBitmap(ConsoleD2, 223, 515, 0, 0, 0, 0);
|
|
DisplayD3DRect(*game._renderer, 223 + 6, 515 + 6, 536, 62, 18, 25, 18, 128);
|
|
DisplayD3DRect(*game._renderer, 223 + 546, 515 + 22, 16, 30, 18, 25, 18, 128);
|
|
DisplayD3DRect(*game._renderer, 223 + 542, 515 + 18, 4, 38, 18, 25, 18, 128);
|
|
|
|
for (a = 0, ca1 = 0, ca2 = 0; a < MAX_DLG_MENUS; a++) {
|
|
if (!(init.DlgMenu[a].on) || ((init.DlgMenu[a].parent != mMAIN) && (init.DlgMenu[a].parent != CurMenu))) continue;
|
|
|
|
// se la servetta mi ha gia' dato la banconota devo fare in modo che non me la dia ancora
|
|
if ((a == mCOSEFATTI8) && (CurObj == ocSERVETTA) && (IconInInv(init, i2cBANCONOTA1))) continue;
|
|
|
|
tc = WHITE_FONT;
|
|
if (init.DlgMenu[a].parent == mMAIN) {
|
|
tx = DIAG1_MARG_SX;
|
|
ty = DIAG1_MARG_UP + DIAG_DY * ca1;
|
|
ca1++;
|
|
|
|
if (CurMenu == a) tc = YELLOW_FONT;
|
|
} else if (init.DlgMenu[a].parent == CurMenu) {
|
|
tx = DIAG2_MARG_SX;
|
|
ty = DIAG2_MARG_UP + DIAG2_DY * (ca2 - Diag2Base);
|
|
ca2++;
|
|
if ((ca2 <= Diag2Base) || (ca2 > (Diag2Base + MAX_DIAG2_ITEMS))) continue;
|
|
|
|
if (UsedDlgMenu[CurPlayer][CurObj][a]) tc = GRAY_FONT;
|
|
}
|
|
if (CurDlgItem == a) tc = RED_FONT;
|
|
|
|
game._renderer->_2dStuff.displayDDText(Sentence[init.DlgMenu[a].titolo], FontKind::Standard, tc, tx, ty, 0, 0, 0, 0);
|
|
}
|
|
|
|
|
|
// disegno le frecce
|
|
if (Diag2Base > 0)
|
|
game._renderer->_2dStuff.displayDDBitmap(ConsoleFrecciaSu, 223 + 550, 515 + 0, 0, 0, 0, 0);
|
|
|
|
if ((Diag2Base + 1 + MAX_DIAG2_ITEMS) <= ca2)
|
|
game._renderer->_2dStuff.displayDDBitmap(ConsoleFrecciaGiu, 223 + 550, 515 + 56, 0, 0, 0, 0);
|
|
}
|
|
|
|
} // End of namespace Watchmaker
|