mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-08 10:51:11 +00:00
309 lines
9.2 KiB
C++
309 lines
9.2 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/>.
|
|
*
|
|
*/
|
|
|
|
#define FORBIDDEN_SYMBOL_EXCEPTION_strcpy
|
|
|
|
#include "watchmaker/ll/ll_string.h"
|
|
#include "watchmaker/globvar.h"
|
|
#include "watchmaker/define.h"
|
|
#include "watchmaker/ll/ll_util.h"
|
|
#include "watchmaker/game.h"
|
|
#include "watchmaker/classes/do_player.h"
|
|
#include "watchmaker/classes/do_dialog.h"
|
|
#include "watchmaker/t2d/expr.h"
|
|
#include "watchmaker/renderer.h"
|
|
#include "watchmaker/3d/t3d_body.h"
|
|
|
|
namespace Watchmaker {
|
|
|
|
// locals
|
|
int32 LastTextTime;
|
|
int console_3_4_xoffs = 0;
|
|
|
|
/* -----------------17/03/98 17.48-------------------
|
|
* Text
|
|
* --------------------------------------------------*/
|
|
void Text(uint16 x, uint16 y, uint16 dx, char *text) {
|
|
if (!text) return;
|
|
|
|
LastTextTime = TheTime;
|
|
|
|
TheString.x = x;
|
|
TheString.y = y;
|
|
TheString.dx = dx;
|
|
strcpy(TheString.text, text);
|
|
}
|
|
|
|
/* -----------------17/03/98 17.48-------------------
|
|
* ClearText
|
|
* --------------------------------------------------*/
|
|
void ClearText() {
|
|
if (!(bUseWith & UW_ON)) {
|
|
TheString.x = 0;
|
|
TheString.y = 0;
|
|
TheString.dx = 0;
|
|
memset(TheString.text, 0, sizeof(TheString.text));
|
|
}
|
|
}
|
|
|
|
/*-----------------17/02/95 09.53-------------------
|
|
TextLen - calcola lunghezza str dal car 0 a num
|
|
--------------------------------------------------*/
|
|
uint16 TextLen(Fonts &fonts, char *sign, uint16 num) {
|
|
uint16 Len, b, c;
|
|
b = 0;
|
|
|
|
if (sign == nullptr)
|
|
return (0);
|
|
|
|
if (num == 0)
|
|
Len = strlen(sign);
|
|
else
|
|
Len = num;
|
|
|
|
for (c = 0; c < Len; c++)
|
|
b += (fonts.StandardFont.table[(uint16)((uint8)sign[c]) * 4 + 2]);
|
|
|
|
return (b);
|
|
}
|
|
|
|
/*-----------------14/05/95 12.12-------------------
|
|
CheckText - returns how many lines it will write
|
|
--------------------------------------------------*/
|
|
uint16 CheckText(Fonts &fonts, uint16 dx, char *sign) {
|
|
uint16 a, b;
|
|
uint16 CurInit;
|
|
uint16 LastSpace;
|
|
uint16 CurLine;
|
|
|
|
if (sign == NULL) return (0);
|
|
// Azzera tutto
|
|
memset(TextLines, 0, sizeof(TextLines));
|
|
|
|
a = 0;
|
|
LastSpace = 0;
|
|
CurInit = 0;
|
|
CurLine = 0;
|
|
|
|
// Caso piu' semplice: sta tutto su una riga
|
|
if (TextLen(fonts, sign, 0) <= dx) {
|
|
strcpy((char *)TextLines[CurLine], sign);
|
|
return (1);
|
|
}
|
|
|
|
while (a < strlen(sign)) {
|
|
a++;
|
|
if (sign[a] == ' ') {
|
|
if (TextLen(fonts, (char *)(sign + CurInit), (uint16)(a - CurInit)) <= dx)
|
|
LastSpace = a;
|
|
else if (TextLen(fonts, (char *)(sign + CurInit), (uint16)(LastSpace - CurInit)) <= dx) {
|
|
for (b = CurInit; b < LastSpace; b++)
|
|
TextLines[CurLine][b - CurInit] = sign[b];
|
|
|
|
TextLines[CurLine][b - CurInit] = '\0';
|
|
CurInit = LastSpace + 1;
|
|
a = CurInit;
|
|
CurLine++;
|
|
} else
|
|
return (0);
|
|
} else if (sign[a] == '\0') {
|
|
if (TextLen(fonts, (char *)(sign + CurInit), (uint16)(a - CurInit)) <= dx) {
|
|
for (b = CurInit; b < a; b++)
|
|
TextLines[CurLine][b - CurInit] = sign[b];
|
|
TextLines[CurLine][b - CurInit] = '\0';
|
|
|
|
CurLine++;
|
|
CurInit = a + 1;
|
|
return (CurLine);
|
|
} else if (TextLen(fonts, (char *)(sign + CurInit), (uint16)(LastSpace - CurInit)) <= dx) {
|
|
for (b = CurInit; b < LastSpace; b++)
|
|
TextLines[CurLine][b - CurInit] = sign[b];
|
|
|
|
TextLines[CurLine][b - CurInit] = '\0';
|
|
CurLine++;
|
|
CurInit = LastSpace + 1;
|
|
|
|
if (CurInit < strlen(sign)) {
|
|
for (b = CurInit; b < strlen(sign); b++)
|
|
TextLines[CurLine][b - CurInit] = sign[b];
|
|
|
|
TextLines[CurLine][b - CurInit] = '\0';
|
|
CurLine++;
|
|
}
|
|
return (CurLine);
|
|
} else
|
|
return (0);
|
|
}
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
|
|
/* -----------------18/03/98 9.57--------------------
|
|
* PaintText
|
|
* --------------------------------------------------*/
|
|
void PaintText(WGame &game) {
|
|
uint16 lines, i;
|
|
int32 dx, obj;
|
|
FontColor color;
|
|
Init &init = game.init;
|
|
|
|
if (bTitoliCodaStatic || bTitoliCodaScrolling) return;
|
|
|
|
if (bDialogActive) {
|
|
obj = init.Anim[TimeAnim].obj;
|
|
if (obj == ocCURPLAYER)
|
|
Player->Mesh->ExpressionFrame = VisemaTimeRecon(TheTime - LastTextTime);
|
|
else if ((obj >= ocDARRELL) && (obj <= ocLASTCHAR) && (obj) && (Character[obj]->Mesh))
|
|
Character[obj]->Mesh->ExpressionFrame = VisemaTimeRecon(TheTime - LastTextTime);
|
|
}
|
|
|
|
lines = (uint16)CheckText(game._fonts, (uint16)game._renderer->rFitY((int32)TheString.dx), TheString.text);
|
|
for (i = 0; i < lines; i++) {
|
|
dx = (TheString.dx - (TextLen(game._fonts, TextLines[i], 0) * SCREEN_RES_X) / game._renderer->rFitX(SCREEN_RES_X)) / 2;
|
|
obj = init.Anim[TimeAnim].obj;
|
|
color = WHITE_FONT;
|
|
if ((obj >= ocCUOCO) && (obj <= ocCURPLAYER)) {
|
|
switch (obj) {
|
|
case ocNOTAIO:
|
|
case ocSUPERVISORE:
|
|
case ocCUOCO:
|
|
color = RED_FONT;
|
|
break;
|
|
case ocVALENCIA:
|
|
case ocCHIRURGO:
|
|
case ocGIARDINIERE:
|
|
color = GREEN_FONT;
|
|
break;
|
|
case ocKRENN:
|
|
case ocOROLOGIAIO:
|
|
case ocVICTORIA:
|
|
color = CYAN_FONT;
|
|
break;
|
|
case ocMOORE:
|
|
case ocMOOREBUCATO:
|
|
case ocDUKES:
|
|
case ocTRADUTTORE:
|
|
case ocCUSTODE:
|
|
color = MAGENTA_FONT;
|
|
break;
|
|
case ocCORONA:
|
|
case ocMOGLIESUPERVISORE:
|
|
case ocMOGLIE_KIMONO:
|
|
case ocSERVETTA:
|
|
color = YELLOW_FONT;
|
|
break;
|
|
case ocVECCHIO:
|
|
case ocCACCIATORE:
|
|
case ocCACCIATOREMALPRESO:
|
|
case ocDOMESTICA:
|
|
color = GRAY_FONT;
|
|
break;
|
|
case ocDARRELL:
|
|
case ocDARRELLALETTO:
|
|
case ocCURPLAYER:
|
|
default:
|
|
color = WHITE_FONT;
|
|
break;
|
|
}
|
|
}
|
|
game._renderer->_2dStuff.displayDDText(TextLines[i], FontKind::Standard, color, TheString.x + dx, TheString.y + i * 12, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
/* -----------------06/04/98 10.34-------------------
|
|
* PaintInventory
|
|
* --------------------------------------------------*/
|
|
void PaintInventory(WGame &game) {
|
|
int32 a, ci;
|
|
Init &init = game.init;
|
|
Renderer &renderer = *game._renderer;
|
|
|
|
if ((InvStatus & INV_ON) || ((bT2DActive == tOPTIONS) && !bShowOnlyLoadWindow)) {
|
|
if (bT2DActive != tOPTIONS) {
|
|
DisplayD3DRect(renderer, 27, 77, 188, 490, 18, 25, 18, 128);
|
|
DisplayD3DRect(renderer, 13, 124, 14, 49, 18, 25, 18, 128);
|
|
DisplayD3DRect(renderer, 215, 472, 12, 50, 18, 25, 18, 128);
|
|
renderer._2dStuff.displayDDBitmap(Console1, 3, 73, 0, 0, 0, 0);
|
|
|
|
if (InvLen[CurPlayer] > MAX_SHOWN_ICONS) {
|
|
if (InvBase[CurPlayer] > 0)
|
|
renderer._2dStuff.displayDDBitmap(ConsoleFrecciaSu, 3 + 14, 73 + 66, 0, 0, 0, 0);
|
|
|
|
if (InvBase[CurPlayer] < (InvLen[CurPlayer] - MAX_SHOWN_ICONS))
|
|
renderer._2dStuff.displayDDBitmap(ConsoleFrecciaGiu, 3 + 206, 73 + 416, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
if ((InvStatus & INV_MODE1) && PlayerCanCall(game._gameVars)) {
|
|
if (CurPlayer == VICTORIA)
|
|
renderer._2dStuff.displayDDBitmap(Console5, 22, 13, 0, 0, 0, 0);
|
|
else
|
|
renderer._2dStuff.displayDDBitmap(Console6, 22, 13, 0, 0, 0, 0);
|
|
}
|
|
|
|
if ((InvStatus & INV_MODE2) || (bT2DActive == tOPTIONS)) {
|
|
int ox;
|
|
|
|
if (bT2DActive == tOPTIONS) {
|
|
ox = 192;
|
|
console_3_4_xoffs = -94;
|
|
} else {
|
|
ox = 0;
|
|
console_3_4_xoffs = 0;
|
|
}
|
|
|
|
if (CurPlayer == DARRELL)
|
|
renderer._2dStuff.displayDDBitmap(Console3, 22 + console_3_4_xoffs, 13, ox, 0, 0, 0);
|
|
else
|
|
renderer._2dStuff.displayDDBitmap(Console4, 22 + console_3_4_xoffs, 13, ox, 0, 0, 0);
|
|
|
|
if (!PlayerCanSave())
|
|
renderer._2dStuff.displayDDBitmap(ConsoleNoSave, 227 + 22 + console_3_4_xoffs, 13, 0, 0, 0, 0);
|
|
|
|
if ((bT2DActive != tOPTIONS) && (!PlayerCanSwitch(game._gameVars, 0))) {
|
|
if (CurPlayer == DARRELL)
|
|
renderer._2dStuff.displayDDBitmap(ConsoleNoSwitchDar, 61 + 22 + console_3_4_xoffs, 13, 0, 0, 0, 0);
|
|
else
|
|
renderer._2dStuff.displayDDBitmap(ConsoleNoSwitchVic, 61 + 22 + console_3_4_xoffs, 13, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
|
|
if (bT2DActive != tOPTIONS) {
|
|
for (a = 0; a < MAX_SHOWN_ICONS; a++) {
|
|
if ((ci = Inv[CurPlayer][InvBase[CurPlayer] + a])) {
|
|
if (CurInvObj == ci)
|
|
renderer._2dStuff.displayDDText(ObjName[init.InvObj[ci].name], FontKind::Standard, RED_FONT, INV_MARG_SX, INV_MARG_UP + ICON_DY * a, 0, 0, 0, 0);
|
|
else
|
|
renderer._2dStuff.displayDDText(ObjName[init.InvObj[ci].name], FontKind::Standard, WHITE_FONT, INV_MARG_SX, INV_MARG_UP + ICON_DY * a, 0, 0, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
} else if ((bUseWith & UW_ON) && (bUseWith & UW_USEDI)) {
|
|
DisplayD3DRect(renderer, game._gameRect._useIconRect.x1 + 3, game._gameRect._useIconRect.y1 + 3, 63, 63, 22, 31, 22, 75);
|
|
renderer._2dStuff.displayDDBitmap(IconsPics[UseWith[USED]], game._gameRect._useIconRect.x1 + 3, game._gameRect._useIconRect.y1 + 3, 0, 0, 0, 0);
|
|
renderer._2dStuff.displayDDBitmap(Console2, game._gameRect._useIconRect.x1, game._gameRect._useIconRect.y1, 0, 0, 0, 0);
|
|
}
|
|
PaintDialog(game);
|
|
}
|
|
|
|
} // End of namespace Watchmaker
|