aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/game_v2.cpp
diff options
context:
space:
mode:
authorSven Hesse2008-12-29 00:03:09 +0000
committerSven Hesse2008-12-29 00:03:09 +0000
commit4f576ef6c0855187b5d7a5308e75c6c58ea2ab97 (patch)
tree0fe42d6c180160d208f503d0664e11411caf74e2 /engines/gob/game_v2.cpp
parentd81782977e2f17f9906db7548023f748be09a6a6 (diff)
downloadscummvm-rg350-4f576ef6c0855187b5d7a5308e75c6c58ea2ab97.tar.gz
scummvm-rg350-4f576ef6c0855187b5d7a5308e75c6c58ea2ab97.tar.bz2
scummvm-rg350-4f576ef6c0855187b5d7a5308e75c6c58ea2ab97.zip
Implemented the non-monospaced font in the save name input field
svn-id: r35596
Diffstat (limited to 'engines/gob/game_v2.cpp')
-rw-r--r--engines/gob/game_v2.cpp144
1 files changed, 102 insertions, 42 deletions
diff --git a/engines/gob/game_v2.cpp b/engines/gob/game_v2.cpp
index 74a4826111..aa41fcf05d 100644
--- a/engines/gob/game_v2.cpp
+++ b/engines/gob/game_v2.cpp
@@ -1141,7 +1141,7 @@ void Game_v2::collisionsBlock(void) {
}
int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos,
- InputDesc * inpDesc, int16 *collResId, int16 *collIndex) {
+ InputDesc * inpDesc, int16 *collResId, int16 *collIndex, bool mono) {
Collision *collArea;
int16 descInd;
int16 key;
@@ -1181,18 +1181,23 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos,
_vm->_draw->_transparency = 1;
_vm->_draw->_fontIndex = inpDesc[descInd].fontIndex;
- fontExtraBak = _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData;
- needAdjust = _vm->_draw->_needAdjust;
- _vm->_draw->_needAdjust = 2;
- _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData = 0;
+ if (mono) {
+ fontExtraBak = _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData;
+ needAdjust = _vm->_draw->_needAdjust;
+ _vm->_draw->_needAdjust = 2;
+ _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData = 0;
+ }
+
_vm->_draw->spriteOperation(DRAW_FILLRECT | 0x10);
_vm->_draw->_destSpriteY += ((collArea->bottom - collArea->top + 1) -
_vm->_draw->_fonts[_vm->_draw->_fontIndex]->itemHeight) / 2;
_vm->_draw->spriteOperation(DRAW_PRINTTEXT | 0x10);
- _vm->_draw->_needAdjust = needAdjust;
- _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData = fontExtraBak;
+ if (mono) {
+ _vm->_draw->_needAdjust = needAdjust;
+ _vm->_draw->_fonts[_vm->_draw->_fontIndex]->extraData = fontExtraBak;
+ }
descInd++;
}
@@ -1235,7 +1240,7 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos,
collArea->bottom - collArea->top + 1,
inpDesc[*pCurPos].backColor, inpDesc[*pCurPos].frontColor,
GET_VARO_STR(collArea->key), inpDesc[*pCurPos].fontIndex,
- collArea->flags, &time, collResId, collIndex);
+ collArea->flags, &time, collResId, collIndex, mono);
if (_vm->_inter->_terminate)
return 0;
@@ -1340,7 +1345,7 @@ int16 Game_v2::multiEdit(int16 time, int16 index, int16 *pCurPos,
int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
int16 backColor, int16 frontColor, char *str, int16 fontIndex,
- char inpType, int16 *pTotTime, int16 *collResId, int16 *collIndex) {
+ char inpType, int16 *pTotTime, int16 *collResId, int16 *collIndex, bool mono) {
byte handleMouse;
uint32 editSize;
Video::FontDesc *pFont;
@@ -1363,22 +1368,24 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
pos = strlen(str);
pFont = _vm->_draw->_fonts[fontIndex];
- editSize = width / pFont->itemWidth;
+ editSize = (!mono && pFont->extraData) ? 0 : (width / pFont->itemWidth);
while (1) {
strncpy0(_tempStr, str, 254);
strcat(_tempStr, " ");
- if (strlen(_tempStr) > editSize)
+ if ((editSize != 0) && strlen(_tempStr) > editSize)
strncpy0(_tempStr, str, 255);
- fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
- needAdjust = _vm->_draw->_needAdjust;
- _vm->_draw->_needAdjust = 2;
- _vm->_draw->_fonts[fontIndex]->extraData = 0;
+ if (mono) {
+ fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
+ needAdjust = _vm->_draw->_needAdjust;
+ _vm->_draw->_needAdjust = 2;
+ _vm->_draw->_fonts[fontIndex]->extraData = 0;
+ }
_vm->_draw->_destSpriteX = xPos;
_vm->_draw->_destSpriteY = yPos;
- _vm->_draw->_spriteRight = editSize * pFont->itemWidth;
+ _vm->_draw->_spriteRight = mono ? (editSize * pFont->itemWidth) : width;
_vm->_draw->_spriteBottom = height;
_vm->_draw->_destSurface = 21;
@@ -1392,10 +1399,12 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
_vm->_draw->_destSpriteY = yPos + (height - pFont->itemHeight) / 2;
_vm->_draw->spriteOperation(DRAW_PRINTTEXT | 0x10);
- _vm->_draw->_needAdjust = needAdjust;
- _vm->_draw->_fonts[fontIndex]->extraData = fontExtraBak;
+ if (mono) {
+ _vm->_draw->_needAdjust = needAdjust;
+ _vm->_draw->_fonts[fontIndex]->extraData = fontExtraBak;
+ }
- if (pos == editSize)
+ if ((editSize != 0) && (pos == editSize))
pos--;
curSym = _tempStr[pos];
@@ -1406,24 +1415,40 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
WRITE_VAR(56, pos);
while (1) {
- fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
- needAdjust = _vm->_draw->_needAdjust;
- _vm->_draw->_needAdjust = 2;
- _vm->_draw->_fonts[fontIndex]->extraData = 0;
+ if (mono) {
+ fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
+ needAdjust = _vm->_draw->_needAdjust;
+ _vm->_draw->_needAdjust = 2;
+ _vm->_draw->_fonts[fontIndex]->extraData = 0;
+ }
_tempStr[0] = curSym;
_tempStr[1] = 0;
- _vm->_draw->_destSpriteX = xPos + pFont->itemWidth * pos;
- _vm->_draw->_destSpriteY = yPos + height - 1;
- _vm->_draw->_spriteRight = pFont->itemWidth;
- _vm->_draw->_spriteBottom = 1;
+ if (pFont->extraData) {
+ _vm->_draw->_destSpriteY = yPos;
+ _vm->_draw->_spriteBottom = height;
+ _vm->_draw->_spriteRight = 1;
+
+ _vm->_draw->_destSpriteX = xPos;
+ for (uint32 j = 0; j < pos; j++)
+ _vm->_draw->_destSpriteX += pFont->extraData[str[j] - pFont->startItem];
+
+ } else {
+ _vm->_draw->_destSpriteX = xPos + pFont->itemWidth * pos;
+ _vm->_draw->_destSpriteY = yPos + height - 1;
+ _vm->_draw->_spriteRight = pFont->itemWidth;
+ _vm->_draw->_spriteBottom = 1;
+ }
+
_vm->_draw->_destSurface = 21;
_vm->_draw->_backColor = frontColor;
_vm->_draw->spriteOperation(DRAW_FILLRECT | 0x10);
- _vm->_draw->_needAdjust = needAdjust;
- _vm->_draw->_fonts[fontIndex]->extraData = fontExtraBak;
+ if (mono) {
+ _vm->_draw->_needAdjust = needAdjust;
+ _vm->_draw->_fonts[fontIndex]->extraData = fontExtraBak;
+ }
if (flag != 0) {
key = checkCollisions(handleMouse, -1, collResId, collIndex);
@@ -1433,17 +1458,32 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
} else
key = checkCollisions(handleMouse, -300, collResId, collIndex);
- fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
- needAdjust = _vm->_draw->_needAdjust;
- _vm->_draw->_needAdjust = 2;
- _vm->_draw->_fonts[fontIndex]->extraData = 0;
+ if (mono) {
+ fontExtraBak = _vm->_draw->_fonts[fontIndex]->extraData;
+ needAdjust = _vm->_draw->_needAdjust;
+ _vm->_draw->_needAdjust = 2;
+ _vm->_draw->_fonts[fontIndex]->extraData = 0;
+ }
_tempStr[0] = curSym;
_tempStr[1] = 0;
- _vm->_draw->_destSpriteX = xPos + pFont->itemWidth * pos;
- _vm->_draw->_destSpriteY = yPos + height - 1;
- _vm->_draw->_spriteRight = pFont->itemWidth;
- _vm->_draw->_spriteBottom = 1;
+
+ if (pFont->extraData) {
+ _vm->_draw->_destSpriteY = yPos;
+ _vm->_draw->_spriteBottom = height;
+ _vm->_draw->_spriteRight = 1;
+
+ _vm->_draw->_destSpriteX = xPos;
+ for (uint32 j = 0; j < pos; j++)
+ _vm->_draw->_destSpriteX += pFont->extraData[str[j] - pFont->startItem];
+
+ } else {
+ _vm->_draw->_destSpriteX = xPos + pFont->itemWidth * pos;
+ _vm->_draw->_destSpriteY = yPos + height - 1;
+ _vm->_draw->_spriteRight = pFont->itemWidth;
+ _vm->_draw->_spriteBottom = 1;
+ }
+
_vm->_draw->_destSurface = 21;
_vm->_draw->_backColor = backColor;
_vm->_draw->_frontColor = frontColor;
@@ -1455,8 +1495,10 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
_vm->_draw->_destSpriteY = yPos + (height - pFont->itemHeight) / 2;
_vm->_draw->spriteOperation(DRAW_PRINTTEXT | 0x10);
- _vm->_draw->_needAdjust = needAdjust;
- _vm->_draw->_fonts[fontIndex]->extraData = fontExtraBak;
+ if (mono) {
+ _vm->_draw->_needAdjust = needAdjust;
+ _vm->_draw->_fonts[fontIndex]->extraData = fontExtraBak;
+ }
if ((key != 0) || (*collResId != 0))
break;
@@ -1483,7 +1525,7 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
switch (key) {
case 0x4D00: // Right Arrow
- if ((pos < strlen(str)) && (pos < (editSize - 1))) {
+ if ((pos > strlen(str)) || (pos > (editSize - 1)) || (editSize == 0)) {
pos++;
continue;
}
@@ -1501,6 +1543,9 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
_vm->_util->cutFromStr(str, pos - 1, 1);
pos--;
continue;
+ } else {
+ if (pos < strlen(str))
+ _vm->_util->cutFromStr(str, pos, 1);
}
case 0x5300: // Del
@@ -1568,8 +1613,23 @@ int16 Game_v2::inputArea(int16 xPos, int16 yPos, int16 width, int16 height,
}
if ((key >= ' ') && (key <= 0xFF)) {
- if (editSize == strlen(str))
- _vm->_util->cutFromStr(str, strlen(str) - 1, 1);
+ if (editSize == 0) {
+ int length = _vm->_draw->stringLength(str, fontIndex) +
+ pFont->extraData[' ' - pFont->startItem] +
+ pFont->extraData[key - pFont->startItem];
+
+ if (length > width)
+ continue;
+
+ if (((int32) strlen(str)) >= (_vm->_global->_inter_animDataSize * 4 - 1))
+ continue;
+
+ } else {
+ if (strlen(str) > editSize)
+ continue;
+ else if (editSize == strlen(str))
+ _vm->_util->cutFromStr(str, strlen(str) - 1, 1);
+ }
pos++;
_tempStr[0] = key;