[Scummvm-git-logs] scummvm master -> 03ae234c5e7c2040688e31fd2077dbde6db00f87
mgerhardy
noreply at scummvm.org
Thu Jun 2 08:10:10 UTC 2022
This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ca293e49aa TWINE: helper macros for seconds
35e0a747a4 TWINE: don't show the behaviour dialog in classic mode
bd99e76dfa TWINE: fixed lba1 classic date
03ae234c5e TWINE: implemented parts of the new game + option from lba1 classic
Commit: ca293e49aab7cc2c42720cca61d82bc2cb177fc4
https://github.com/scummvm/scummvm/commit/ca293e49aab7cc2c42720cca61d82bc2cb177fc4
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2022-06-02T10:09:25+02:00
Commit Message:
TWINE: helper macros for seconds
Changed paths:
engines/twine/renderer/redraw.cpp
engines/twine/renderer/screens.cpp
engines/twine/scene/gamestate.cpp
engines/twine/scene/scene.cpp
engines/twine/script/script_life_v1.cpp
engines/twine/script/script_move_v1.cpp
engines/twine/twine.cpp
engines/twine/twine.h
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index 930a146d3d9..e831150ca69 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -166,7 +166,7 @@ void Redraw::addOverlay(OverlayType type, int16 info0, int16 x, int16 y, int16 i
overlay->y = y;
overlay->info1 = info1;
overlay->posType = posType;
- overlay->lifeTime = _engine->_lbaTime + lifeTime * 50;
+ overlay->lifeTime = _engine->_lbaTime + TO_SECONDS(lifeTime);
break;
}
}
diff --git a/engines/twine/renderer/screens.cpp b/engines/twine/renderer/screens.cpp
index ee1be96f211..5fca7a5497c 100644
--- a/engines/twine/renderer/screens.cpp
+++ b/engines/twine/renderer/screens.cpp
@@ -183,7 +183,7 @@ void Screens::adjustCrossPalette(const uint32 *pal1, const uint32 *pal2) {
const uint8 *pal2p = (const uint8 *)pal2;
uint8 *paletteOut = (uint8 *)pal;
do {
- FrameMarker frame(_engine, 50);
+ FrameMarker frame(_engine, DEFAULT_HZ);
counter = 0;
uint8 *newR = &paletteOut[counter];
@@ -217,7 +217,7 @@ void Screens::fadeToBlack(const uint32 *pal) {
}
for (int32 i = 100; i >= 0; i -= 3) {
- FrameMarker frame(_engine, 50);
+ FrameMarker frame(_engine, DEFAULT_HZ);
adjustPalette(0, 0, 0, pal, i);
}
@@ -226,7 +226,7 @@ void Screens::fadeToBlack(const uint32 *pal) {
void Screens::fadeToPal(const uint32 *pal) {
for (int32 i = 0; i <= 100; i += 3) {
- FrameMarker frame(_engine, 50);
+ FrameMarker frame(_engine, DEFAULT_HZ);
adjustPalette(0, 0, 0, pal, i);
}
@@ -276,14 +276,14 @@ void Screens::setBackPal() {
void Screens::fadePalRed(const uint32 *pal) {
for (int32 i = 100; i >= 0; i -= 2) {
- FrameMarker frame(_engine, 50);
+ FrameMarker frame(_engine, DEFAULT_HZ);
adjustPalette(0xFF, 0, 0, pal, i);
}
}
void Screens::fadeRedPal(const uint32 *pal) {
for (int32 i = 0; i <= 100; i += 2) {
- FrameMarker frame(_engine, 50);
+ FrameMarker frame(_engine, DEFAULT_HZ);
adjustPalette(0xFF, 0, 0, pal, i);
}
}
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index fda6d4ef40b..290bbef9ca6 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -503,7 +503,7 @@ void GameState::processGameoverAnimation() {
_engine->_interface->setClip(rect);
Common::Rect dummy;
- while (!_engine->_input->toggleAbortAction() && (_engine->_lbaTime - startLbaTime) <= 500) {
+ while (!_engine->_input->toggleAbortAction() && (_engine->_lbaTime - startLbaTime) <= TO_SECONDS(10)) {
FrameMarker frame(_engine, 66);
_engine->readKeys();
if (_engine->shouldQuit()) {
diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index f3b2417577f..724f84a7eeb 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -668,7 +668,7 @@ void Scene::processEnvironmentSound() {
}
// compute next ambiance timer
- _sampleAmbienceTime = _engine->_lbaTime + (_engine->getRandomNumber(_sampleMinDelayRnd) + _sampleMinDelay) * 50;
+ _sampleAmbienceTime = _engine->_lbaTime + TO_SECONDS(_engine->getRandomNumber(_sampleMinDelayRnd) + _sampleMinDelay);
}
void Scene::processZoneExtraBonus(ZoneStruct *zone) {
diff --git a/engines/twine/script/script_life_v1.cpp b/engines/twine/script/script_life_v1.cpp
index 3fc45938812..0d47e923a7f 100644
--- a/engines/twine/script/script_life_v1.cpp
+++ b/engines/twine/script/script_life_v1.cpp
@@ -952,9 +952,9 @@ static int32 lGIVE_GOLD_PIECES(TwinEEngine *engine, LifeScriptContext &ctx) {
for (int16 i = 0; i < OVERLAY_MAX_ENTRIES; i++) {
OverlayListStruct *overlay = &engine->_redraw->overlayList[i];
if (overlay->info0 != -1 && overlay->type == OverlayType::koNumberRange) {
- overlay->info0 = engine->_collision->getAverageValue(overlay->info1, overlay->info0, 100, overlay->lifeTime - engine->_lbaTime - 50);
+ overlay->info0 = engine->_collision->getAverageValue(overlay->info1, overlay->info0, 100, overlay->lifeTime - engine->_lbaTime - TO_SECONDS(1));
overlay->info1 = engine->_gameState->_inventoryNumKashes;
- overlay->lifeTime = engine->_lbaTime + 150;
+ overlay->lifeTime = engine->_lbaTime + TO_SECONDS(3);
hideRange = true;
break;
}
diff --git a/engines/twine/script/script_move_v1.cpp b/engines/twine/script/script_move_v1.cpp
index 48798316550..7aaf3a942a4 100644
--- a/engines/twine/script/script_move_v1.cpp
+++ b/engines/twine/script/script_move_v1.cpp
@@ -385,7 +385,7 @@ static int32 mWAIT_NUM_SECOND(TwinEEngine *engine, MoveScriptContext &ctx) {
debugC(3, kDebugLevels::kDebugScripts, "MOVE::WAIT_NUM_SECOND(%i, %i)", (int)numSeconds, currentTime);
if (currentTime == 0) {
- currentTime = engine->_lbaTime + numSeconds * 50;
+ currentTime = engine->_lbaTime + TO_SECONDS(numSeconds);
ctx.stream.rewind(4);
ctx.stream.writeSint32LE(currentTime);
}
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index d6748c64a39..3fcc5b13514 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -720,7 +720,7 @@ void TwinEEngine::processInventoryAction() {
penguin->setBrickShape(ShapeType::kNone);
_movements->moveActor(penguin->_angle, penguin->_angle, penguin->_speed, &penguin->_move);
_gameState->removeItem(InventoryItems::kiPenguin);
- penguin->_delayInMillis = _lbaTime + 1500;
+ penguin->_delayInMillis = _lbaTime + TO_SECONDS(30);
}
break;
}
diff --git a/engines/twine/twine.h b/engines/twine/twine.h
index 9d1e96d3f90..0a222629c74 100644
--- a/engines/twine/twine.h
+++ b/engines/twine/twine.h
@@ -48,6 +48,8 @@ namespace TwinE {
/** Default frames per second */
#define DEFAULT_FRAMES_PER_SECOND 20
+#define DEFAULT_HZ (1000 / DEFAULT_FRAMES_PER_SECOND)
+#define TO_SECONDS(x) (DEFAULT_HZ * (x))
#define ORIGINAL_WIDTH 640
#define ORIGINAL_HEIGHT 480
Commit: 35e0a747a4e7602214f339a037a3bca229746828
https://github.com/scummvm/scummvm/commit/35e0a747a4e7602214f339a037a3bca229746828
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2022-06-02T10:09:25+02:00
Commit Message:
TWINE: don't show the behaviour dialog in classic mode
Changed paths:
engines/twine/renderer/redraw.cpp
engines/twine/renderer/redraw.h
engines/twine/text.cpp
engines/twine/text.h
engines/twine/twine.cpp
diff --git a/engines/twine/renderer/redraw.cpp b/engines/twine/renderer/redraw.cpp
index e831150ca69..154227d3bf3 100644
--- a/engines/twine/renderer/redraw.cpp
+++ b/engines/twine/renderer/redraw.cpp
@@ -642,6 +642,35 @@ void Redraw::renderOverlays() {
}
}
+void Redraw::setRenderText(const Common::String &text) {
+ _text = text;
+ if (_text.empty()) {
+ _textDisappearTime = -1;
+ } else {
+ _textDisappearTime = _engine->_lbaTime + TO_SECONDS(1);
+ }
+}
+
+void Redraw::renderText() {
+ if (_textDisappearTime <= _engine->_lbaTime) {
+ return;
+ }
+ if (_text.empty()) {
+ return;
+ }
+ _engine->_text->setFontColor(COLOR_WHITE);
+
+ const int padding = 10;
+ const int x = padding;
+ const int height = _engine->_text->lineHeight;
+ const int y = _engine->height() - height - padding;
+ const int width = _engine->_text->getTextSize(_text.c_str());
+ _engine->_text->drawText(x, y, _text.c_str());
+ _engine->copyBlockPhys(x, y, x + width, y + height);
+ const Common::Rect redraw(x, y, x + width, y + height);
+ addRedrawArea(redraw);
+}
+
void Redraw::redrawEngineActions(bool bgRedraw) {
int32 tmp_projPosX = _projPosScreen.x;
int32 tmp_projPosY = _projPosScreen.y;
@@ -683,6 +712,7 @@ void Redraw::redrawEngineActions(bool bgRedraw) {
}
renderOverlays();
+ renderText();
_engine->_interface->resetClip();
diff --git a/engines/twine/renderer/redraw.h b/engines/twine/renderer/redraw.h
index 1a7753f44e2..c5f340c08d9 100644
--- a/engines/twine/renderer/redraw.h
+++ b/engines/twine/renderer/redraw.h
@@ -109,6 +109,10 @@ private:
IVec3 _projPosScreen;
+ // big font shadow text in the lower left corner
+ Common::String _text;
+ int32 _textDisappearTime = -1;
+
/**
* Add a certain region to the current redraw list array
* @param redrawArea redraw the region
@@ -130,6 +134,7 @@ private:
int32 fillExtraDrawingList(DrawListStruct *drawList, int32 drawListPos);
void processDrawList(DrawListStruct *drawList, int32 drawListPos, bool bgRedraw);
void renderOverlays();
+ void renderText();
public:
Redraw(TwinEEngine *engine);
@@ -149,6 +154,8 @@ public:
OverlayListStruct overlayList[OVERLAY_MAX_ENTRIES];
+ void setRenderText(const Common::String &text);
+
// InitIncrustDisp
void addOverlay(OverlayType type, int16 info0, int16 x, int16 y, int16 info1, OverlayPosType posType, int16 lifeTime);
diff --git a/engines/twine/text.cpp b/engines/twine/text.cpp
index f4b07367964..0eb559045fe 100644
--- a/engines/twine/text.cpp
+++ b/engines/twine/text.cpp
@@ -39,6 +39,7 @@
#include "twine/resources/resources.h"
#include "twine/scene/gamestate.h"
#include "twine/scene/scene.h"
+#include "twine/shared.h"
#include "twine/twine.h"
namespace TwinE {
@@ -225,7 +226,7 @@ void Text::drawCharacterShadow(int32 x, int32 y, uint8 character, int32 color, C
}
}
-void Text::drawText(int32 x, int32 y, const char *dialogue) {
+void Text::drawText(int32 x, int32 y, const char *dialogue, bool shadow) {
// if the font is not defined
if (_engine->_resources->_fontPtr == nullptr) {
return;
@@ -241,7 +242,12 @@ void Text::drawText(int32 x, int32 y, const char *dialogue) {
x += _dialCharSpace;
} else {
const int32 dialTextSize = getCharWidth(currChar);
- drawCharacter(x, y, currChar); // draw the character on screen
+ if (shadow) {
+ Common::Rect dirtyRect;
+ drawCharacterShadow(x, y, currChar, COLOR_BLACK, dirtyRect);
+ } else {
+ drawCharacter(x, y, currChar); // draw the character on screen
+ }
// add the length of the space between 2 characters
x += _dialSpaceBetween;
// add the length of the current character
diff --git a/engines/twine/text.h b/engines/twine/text.h
index 13a860d6af5..6b114dd2864 100644
--- a/engines/twine/text.h
+++ b/engines/twine/text.h
@@ -172,7 +172,7 @@ public:
* @param y Y coordinate in screen
* @param dialogue ascii text to display
*/
- void drawText(int32 x, int32 y, const char *dialogue);
+ void drawText(int32 x, int32 y, const char *dialogue, bool shadow = false);
bool drawTextProgressive(TextId index, bool playVox = true, bool loop = true);
diff --git a/engines/twine/twine.cpp b/engines/twine/twine.cpp
index 3fcc5b13514..71fcbd9e002 100644
--- a/engines/twine/twine.cpp
+++ b/engines/twine/twine.cpp
@@ -842,9 +842,17 @@ bool TwinEEngine::runGameEngine() { // mainLoopInteration
} else if (_input->isActionActive(TwinEActionType::QuickBehaviourDiscreet, false)) {
_actor->_heroBehaviour = HeroBehaviourType::kDiscrete;
}
- ScopedEngineFreeze scopedFreeze(this);
- _menu->processBehaviourMenu();
- _redraw->redrawEngineActions(true);
+ if (isLba1Classic()) {
+ _text->initTextBank(TextBankId::Options_and_menus);
+ char text[256];
+ _text->getMenuText(_actor->getTextIdForBehaviour(), text, sizeof(text));
+ _redraw->setRenderText(text);
+ _text->initSceneTextBank();
+ } else {
+ ScopedEngineFreeze scopedFreeze(this);
+ _menu->processBehaviourMenu();
+ _redraw->redrawEngineActions(true);
+ }
}
// use Proto-Pack
Commit: bd99e76dfa57e4d59330ebaeb3d140e16135c497
https://github.com/scummvm/scummvm/commit/bd99e76dfa57e4d59330ebaeb3d140e16135c497
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2022-06-02T10:09:25+02:00
Commit Message:
TWINE: fixed lba1 classic date
Changed paths:
engines/twine/detection.cpp
diff --git a/engines/twine/detection.cpp b/engines/twine/detection.cpp
index fa6cfebae86..8adc5f461d6 100644
--- a/engines/twine/detection.cpp
+++ b/engines/twine/detection.cpp
@@ -511,8 +511,8 @@ static const ADGameDescription twineGameDescriptions[] = {
},
// Little Big Adventure - GOG Version
- // LBA.GOG
- // 11 October 2011 at 17:30
+ // TLBA1C.exe
+ // 1st June 2022 02:18
{
"lba",
"GOG Classic Version",
Commit: 03ae234c5e7c2040688e31fd2077dbde6db00f87
https://github.com/scummvm/scummvm/commit/03ae234c5e7c2040688e31fd2077dbde6db00f87
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2022-06-02T10:09:25+02:00
Commit Message:
TWINE: implemented parts of the new game + option from lba1 classic
Changed paths:
engines/twine/menu/menu.cpp
engines/twine/menu/menu.h
engines/twine/scene/gamestate.cpp
engines/twine/scene/gamestate.h
engines/twine/scene/scene.cpp
engines/twine/shared.h
diff --git a/engines/twine/menu/menu.cpp b/engines/twine/menu/menu.cpp
index b10d15be28f..30c3e4cac8f 100644
--- a/engines/twine/menu/menu.cpp
+++ b/engines/twine/menu/menu.cpp
@@ -27,6 +27,7 @@
#include "common/events.h"
#include "common/keyboard.h"
#include "common/scummsys.h"
+#include "common/str.h"
#include "common/system.h"
#include "common/util.h"
#include "graphics/cursorman.h"
@@ -97,6 +98,14 @@ static MenuSettings createMainMenu(bool lba1) {
return settings;
}
+static MenuSettings createLba1ClassicNewGame() {
+ MenuSettings settings;
+ settings.addButton(TextId::kReturnMenu);
+ settings.addButton(TextId::kNewGame);
+ settings.addButton(TextId::kNewGamePlus);
+ return settings;
+}
+
static MenuSettings createGiveUpMenu() {
MenuSettings settings;
settings.setButtonsBoxHeight(240);
@@ -157,9 +166,14 @@ static MenuSettings createVolumeMenu() {
const char *MenuSettings::getButtonText(Text *text, int buttonIndex) {
if (_buttonTexts[buttonIndex].empty()) {
- const TextId textId = getButtonTextId(buttonIndex);
+ TextId textId = getButtonTextId(buttonIndex);
char dialText[256] = "";
- text->getMenuText(textId, dialText, sizeof(dialText));
+ if (textId == TextId::kNewGamePlus) {
+ text->getMenuText(TextId::kNewGame, dialText, sizeof(dialText));
+ Common::strlcat(dialText, "+", sizeof(dialText));
+ } else {
+ text->getMenuText(textId, dialText, sizeof(dialText));
+ }
_buttonTexts[buttonIndex] = dialText;
}
return _buttonTexts[buttonIndex].c_str();
@@ -174,6 +188,7 @@ Menu::Menu(TwinEEngine *engine) {
_saveManageMenuState = _priv::createSaveManageMenu();
_giveUpMenuState = _priv::createGiveUpMenu();
_mainMenuState = _priv::createMainMenu(engine->isLBA1());
+ _newGameMenuState = _priv::createLba1ClassicNewGame();
_advOptionsMenuState = _priv::createAdvancedOptionsMenu();
Common::fill(&_behaviourAnimState[0], &_behaviourAnimState[4], 0);
@@ -740,6 +755,34 @@ int32 Menu::optionsMenu() {
return 0;
}
+int32 Menu::newGameClassicMenu() {
+ _engine->restoreFrontBuffer();
+
+ ScopedCursor scoped(_engine);
+ for (;;) {
+ switch (processMenu(&_newGameMenuState)) {
+ case (int32)TextId::kReturnGame:
+ case (int32)TextId::kReturnMenu: {
+ return 0;
+ }
+ case (int32)TextId::kNewGamePlus:
+ case (int32)TextId::kNewGame: {
+ _engine->_gameState->_endGameItems = true;
+ if (_engine->_menuOptions->newGameMenu()) {
+ return 1;
+ }
+ break;
+ }
+ case kQuitEngine:
+ return kQuitEngine;
+ default:
+ break;
+ }
+ }
+
+ return 0;
+}
+
static const byte cursorArrow[] = {
1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
1, 0, 1, 3, 3, 3, 3, 3, 3, 3, 3,
@@ -789,6 +832,12 @@ EngineState Menu::run() {
switch (processMenu(&_mainMenuState)) {
case (int32)TextId::toNewGame:
case (int32)TextId::kNewGame: {
+ if (_engine->isLba1Classic()) {
+ if (newGameClassicMenu()) {
+ return EngineState::GameLoop;
+ }
+ break;
+ }
if (_engine->_menuOptions->newGameMenu()) {
return EngineState::GameLoop;
}
diff --git a/engines/twine/menu/menu.h b/engines/twine/menu/menu.h
index 52211c05df8..da31ec3e02f 100644
--- a/engines/twine/menu/menu.h
+++ b/engines/twine/menu/menu.h
@@ -153,6 +153,7 @@ private:
MenuSettings _saveManageMenuState;
MenuSettings _giveUpMenuState;
MenuSettings _mainMenuState;
+ MenuSettings _newGameMenuState;
MenuSettings _advOptionsMenuState;
MenuSettings _optionsMenuState;
@@ -240,6 +241,8 @@ public:
/** Process hero behaviour menu */
void processBehaviourMenu();
+ int32 newGameClassicMenu();
+
/** Process in-game inventory menu */
void processInventoryMenu();
};
diff --git a/engines/twine/scene/gamestate.cpp b/engines/twine/scene/gamestate.cpp
index 290bbef9ca6..b1514ad4904 100644
--- a/engines/twine/scene/gamestate.cpp
+++ b/engines/twine/scene/gamestate.cpp
@@ -551,6 +551,27 @@ void GameState::addGas(int16 value) {
setGas(_inventoryNumGas + value);
}
+// late game items from lba1 classic new game +
+void GameState::handleLateGameItems() {
+ if (!_endGameItems) {
+ return;
+ }
+ debug("Give end game items");
+ _endGameItems = false;
+ _magicLevelIdx = 4;
+ setMaxMagicPoints();
+ giveItem(InventoryItems::kiUseSabre);
+ giveItem(InventoryItems::kiProtoPack);
+ giveItem(InventoryItems::kiHolomap);
+ giveItem(InventoryItems::kiTunic);
+ giveItem(InventoryItems::kiMagicBall);
+ giveItem(InventoryItems::kSendellsMedallion);
+ giveItem(InventoryItems::kiPenguin);
+ giveItem(InventoryItems::kGasItem);
+ giveItem(InventoryItems::kiCloverLeaf);
+ addGas(10);
+}
+
int16 GameState::setKashes(int16 value) {
_inventoryNumKashes = CLIP<int16>(value, 0, 999);
if (_engine->_gameState->_inventoryNumKashes >= 500) {
diff --git a/engines/twine/scene/gamestate.h b/engines/twine/scene/gamestate.h
index 7f22e7b1b5e..b64916f9b6c 100644
--- a/engines/twine/scene/gamestate.h
+++ b/engines/twine/scene/gamestate.h
@@ -119,6 +119,7 @@ public:
/** Its using FunFrock Sabre */
bool _usingSabre = false;
+ bool _endGameItems = false;
/**
* Inventory used flags
@@ -173,6 +174,8 @@ public:
int16 setMaxMagicPoints();
int16 setLeafBoxes(int16 val);
+ void handleLateGameItems();
+
void addGas(int16 value);
void addKeys(int16 val);
void addKashes(int16 val);
diff --git a/engines/twine/scene/scene.cpp b/engines/twine/scene/scene.cpp
index 724f84a7eeb..6d6bc68bbcd 100644
--- a/engines/twine/scene/scene.cpp
+++ b/engines/twine/scene/scene.cpp
@@ -601,6 +601,7 @@ void Scene::changeScene() {
debug(2, "Scene %i music track id: %i", _currentSceneIdx, _sceneMusic);
_engine->_music->playTrackMusic(_sceneMusic);
}
+ _engine->_gameState->handleLateGameItems();
}
ActorStruct *Scene::getActor(int32 actorIdx) {
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
index 96db5668165..126b4bafcaf 100644
--- a/engines/twine/shared.h
+++ b/engines/twine/shared.h
@@ -492,6 +492,7 @@ enum class TextId : int16 {
kReturnGame = 15,
kSaveSettings = 16,
kNewGame = 20,
+ kNewGamePlus = 255,
kContinueGame = 21,
kQuit = 22,
kOptions = 23,
More information about the Scummvm-git-logs
mailing list