378 lines
13 KiB
C++
378 lines
13 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 "common/config-manager.h"
|
|
#include "common/translation.h"
|
|
|
|
#include "scumm/he/moonbase/map_main.h"
|
|
#include "scumm/he/moonbase/dialog-mapgenerator.h"
|
|
|
|
namespace Scumm {
|
|
|
|
enum {
|
|
kAlgorCmd = 'ALGR',
|
|
kAlgorRandCmd = 'ALRM',
|
|
|
|
kSizeCmd = 'SIZE',
|
|
kSizeRandCmd = 'SZRM',
|
|
|
|
kTileCmd = 'TILE',
|
|
kTileRandCmd = 'TLRM',
|
|
|
|
kEnergyCmd = 'ENGY',
|
|
kEnergyRandCmd = 'EGRM',
|
|
|
|
kTerrainCmd = 'TRIN',
|
|
kTerrainRandCmd = 'TRRM',
|
|
|
|
kWaterCmd = 'WTER',
|
|
kWaterRandCmd = 'WTRM',
|
|
|
|
kCancelCmd = 'CNCL',
|
|
kGenerateCmd = 'GNRT'
|
|
};
|
|
|
|
MapGeneratorDialog::MapGeneratorDialog(bool demo) : Dialog("MapGenerator"), _refreshing(false) {
|
|
// I18N: Random map generator for Moonbase Commander
|
|
_dialogTitle = new GUI::StaticTextWidget(this, "MapGenerator.Title", _("Random Map Options"));
|
|
_dialogTitle->setAlign(Graphics::kTextAlignCenter);
|
|
|
|
// I18N: Map generator algorithms
|
|
_algorDesc = new GUI::StaticTextWidget(this, "MapGenerator.Algorithm", _("Algorithm"));
|
|
_algorDesc->setAlign(Graphics::kTextAlignLeft);
|
|
_algorGroup = new GUI::RadiobuttonGroup(this, kAlgorCmd);
|
|
// I18N: Spiff algorithm
|
|
_algorSpiff = new GUI::RadiobuttonWidget(this, "MapGenerator.AlgorithmSpiff", _algorGroup, SPIFF_GEN, _("Spiff"));
|
|
// I18N: Katton algorithm
|
|
_algorSpiff = new GUI::RadiobuttonWidget(this, "MapGenerator.AlgorithmKatton", _algorGroup, KATTON_GEN, _("Katton"));
|
|
// I18N: Random algorithm
|
|
_algorRandom = new GUI::CheckboxWidget(this, "MapGenerator.AlgorithmRandom", _("Random"), _("Picks the map algorithm randomly."), kAlgorRandCmd);
|
|
|
|
// I18N: Map sizes
|
|
_sizeDesc = new GUI::StaticTextWidget(this, "MapGenerator.Size", _("Size"));
|
|
_sizeDesc->setAlign(Graphics::kTextAlignCenter);
|
|
|
|
_sizeGroup = new GUI::RadiobuttonGroup(this, kSizeCmd);
|
|
_sizeSmall = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeSmall", _sizeGroup, 4, _("Small"));
|
|
_sizeMedium = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeMedium", _sizeGroup, 5, _("Medium"));
|
|
_sizeLarge = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeLarge", _sizeGroup, 6, _("Large"));
|
|
_sizeHuge = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeHuge", _sizeGroup, 7, _("Huge"));
|
|
_sizeSAI = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeSAI", _sizeGroup, 8, _("SAI"));
|
|
_sizeRidiculous = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeRidiculous", _sizeGroup, 9, _("Ridiculous"));
|
|
_sizeMax = new GUI::RadiobuttonWidget(this, "MapGenerator.SizeMax", _sizeGroup, 10, _("Max"));
|
|
// I18N: Random map size
|
|
_sizeRandom = new GUI::CheckboxWidget(this, "MapGenerator.SizeRandom", _("Random"), _("Picks the map size randomly."), kSizeRandCmd);
|
|
|
|
// I18N: Map tile sets
|
|
_tileDesc = new GUI::StaticTextWidget(this, "MapGenerator.Tileset", _("Tileset"));
|
|
_tileDesc->setAlign(Graphics::kTextAlignCenter);
|
|
_tileGroup = new GUI::RadiobuttonGroup(this, kTileCmd);
|
|
_tileTerrandra = new GUI::RadiobuttonWidget(this, "MapGenerator.TilesetTerrandra", _tileGroup, 1, Common::U32String("Terrandra"));
|
|
_tileZanateros = new GUI::RadiobuttonWidget(this, "MapGenerator.TilesetZanateros", _tileGroup, 2, Common::U32String("Zanateros"));
|
|
// Demo version of the game only has tilesets 1, 2, 4 and 6. Don't create buttons for
|
|
// missing tiles.
|
|
if (!demo)
|
|
_tileDrijim = new GUI::RadiobuttonWidget(this, "MapGenerator.TilesetDaijim", _tileGroup, 3, Common::U32String("Daijim 3"));
|
|
_tileKyanite = new GUI::RadiobuttonWidget(this, "MapGenerator.TilesetKyanite", _tileGroup, 4, Common::U32String("Kyanite"));
|
|
if (!demo)
|
|
_tileEmerau = new GUI::RadiobuttonWidget(this, "MapGenerator.TilesetEmerau", _tileGroup, 5, Common::U32String("Emerau Glyph"));
|
|
_tileAblation = new GUI::RadiobuttonWidget(this, "MapGenerator.TilesetAblation", _tileGroup, 6, Common::U32String("Ablation Land"));
|
|
// I18N: Random tileset
|
|
_tileRandom = new GUI::CheckboxWidget(this, "MapGenerator.TilesetRandom", _("Random"), _("Picks the map tileset randomly."), kTileRandCmd);
|
|
|
|
// I18N: Percentage of energy pools
|
|
_energyDesc = new GUI::StaticTextWidget(this, "MapGenerator.Energy", _("Energy"));
|
|
_energyDesc->setAlign(Graphics::kTextAlignCenter);
|
|
_energySlider = new GUI::SliderWidget(this, "MapGenerator.EnergySlider", Common::U32String(), kEnergyCmd);
|
|
_energySlider->setMinValue(0); _energySlider->setMaxValue(6);
|
|
// I18N: Energy slider label
|
|
_energyLabel = new GUI::StaticTextWidget(this, "MapGenerator.EnergySliderLabel", _("Scarce - Lots"), Common::U32String());
|
|
_energyLabel->setAlign(Graphics::kTextAlignCenter);
|
|
|
|
|
|
// I18N: Random percentage of energy pools
|
|
_energyRandom = new GUI::CheckboxWidget(this, "MapGenerator.EnergyRandom", _("Random"), _("Picks the random amount of energy pools."), kEnergyRandCmd);
|
|
|
|
// I18N: Percentage of terrain
|
|
_terrainDesc = new GUI::StaticTextWidget(this, "MapGenerator.Terrain", _("Terrain"));
|
|
_terrainDesc->setAlign(Graphics::kTextAlignCenter);
|
|
_terrainSlider = new GUI::SliderWidget(this, "MapGenerator.TerrainSlider", Common::U32String(), kTerrainCmd);
|
|
_terrainSlider->setMinValue(0); _terrainSlider->setMaxValue(6);
|
|
// I18N: Terrain slider label
|
|
_terrainLabel = new GUI::StaticTextWidget(this, "MapGenerator.TerrainSliderLabel", _("Barren - Rough"), Common::U32String());
|
|
_terrainLabel->setAlign(Graphics::kTextAlignCenter);
|
|
|
|
// I18N: Random percentage of terrain
|
|
_terrainRandom = new GUI::CheckboxWidget(this, "MapGenerator.TerrainRandom", _("Random"), _("Picks the random amount of terrain level."), kTerrainRandCmd);
|
|
|
|
// I18N: Percentage of water
|
|
_waterDesc = new GUI::StaticTextWidget(this, "MapGenerator.Water", _("Water"));
|
|
_waterDesc->setAlign(Graphics::kTextAlignCenter);
|
|
_waterSlider = new GUI::SliderWidget(this, "MapGenerator.WaterSlider", Common::U32String(), kWaterCmd);
|
|
_waterSlider->setMinValue(0); _waterSlider->setMaxValue(6);
|
|
// I18N: Water slider label
|
|
_waterLabel = new GUI::StaticTextWidget(this, "MapGenerator.WaterSliderLabel", _("Driest - Wettest"), Common::U32String());
|
|
_waterLabel->setAlign(Graphics::kTextAlignCenter);
|
|
|
|
// I18N: Random percentage of water
|
|
_waterRandom = new GUI::CheckboxWidget(this, "MapGenerator.WaterRandom", _("Random"), _("Picks the random amount of water."), kWaterRandCmd);
|
|
|
|
_cancelButton = new GUI::ButtonWidget(this, "MapGenerator.Cancel", _("Cancel"), Common::U32String(), kCancelCmd);
|
|
// I18N: Generate new map
|
|
_generateButton = new GUI::ButtonWidget(this, "MapGenerator.Generate", _("Generate"), Common::U32String(), kGenerateCmd);
|
|
refresh();
|
|
}
|
|
|
|
void MapGeneratorDialog::refresh() {
|
|
_refreshing = true;
|
|
|
|
// ALGORITHM
|
|
bool randomAlgorithm = true;
|
|
if (ConfMan.hasKey("map_algorithm"))
|
|
randomAlgorithm = ConfMan.getInt("map_algorithm") == 0;
|
|
|
|
_algorGroup->setEnabled(!randomAlgorithm);
|
|
_algorRandom->setState(randomAlgorithm);
|
|
|
|
if (!randomAlgorithm)
|
|
_algorGroup->setValue(ConfMan.getInt("map_algorithm"));
|
|
|
|
// SIZE
|
|
bool randomSize = true;
|
|
if (ConfMan.hasKey("map_size"))
|
|
randomSize = ConfMan.getInt("map_size") == 0;
|
|
|
|
_sizeGroup->setEnabled(!randomSize);
|
|
_sizeRandom->setState(randomSize);
|
|
|
|
if (!randomSize)
|
|
_sizeGroup->setValue(ConfMan.getInt("map_size"));
|
|
|
|
// TILESET
|
|
bool randomTileset = true;
|
|
if (ConfMan.hasKey("map_tileset"))
|
|
randomTileset = ConfMan.getInt("map_tileset") == 0;
|
|
|
|
_tileGroup->setEnabled(!randomTileset);
|
|
_tileRandom->setState(randomTileset);
|
|
|
|
if (!randomTileset)
|
|
_tileGroup->setValue(ConfMan.getInt("map_tileset"));
|
|
|
|
// ENERGY
|
|
bool randomEnergy = true;
|
|
if (ConfMan.hasKey("map_energy"))
|
|
randomEnergy = ConfMan.getInt("map_energy") == -1;
|
|
|
|
_energySlider->setEnabled(!randomEnergy);
|
|
_energyRandom->setState(randomEnergy);
|
|
|
|
if (!randomEnergy)
|
|
_energySlider->setValue(ConfMan.getInt("map_energy"));
|
|
else if (ConfMan.hasKey("prev_map_energy"))
|
|
_energySlider->setValue(ConfMan.getInt("prev_map_energy"));
|
|
else
|
|
_energySlider->setValue(3);
|
|
|
|
// TERRAIN
|
|
bool randomTerrain = true;
|
|
if (ConfMan.hasKey("map_terrain"))
|
|
randomTerrain = ConfMan.getInt("map_terrain") == -1;
|
|
|
|
_terrainSlider->setEnabled(!randomTerrain);
|
|
_terrainRandom->setState(randomTerrain);
|
|
|
|
if (!randomTerrain)
|
|
_terrainSlider->setValue(ConfMan.getInt("map_terrain"));
|
|
else if (ConfMan.hasKey("prev_map_terrain"))
|
|
_terrainSlider->setValue(ConfMan.getInt("prev_map_terrain"));
|
|
else
|
|
_terrainSlider->setValue(3);
|
|
|
|
|
|
// WATER
|
|
bool randomWater = true;
|
|
if (ConfMan.hasKey("map_water"))
|
|
randomWater = ConfMan.getInt("map_water") == -1;
|
|
|
|
_waterSlider->setEnabled(!randomWater);
|
|
_waterRandom->setState(randomWater);
|
|
|
|
if (!randomWater)
|
|
_waterSlider->setValue(ConfMan.getInt("map_water"));
|
|
else if (ConfMan.hasKey("prev_map_water"))
|
|
_waterSlider->setValue(ConfMan.getInt("prev_map_water"));
|
|
else
|
|
_waterSlider->setValue(3);
|
|
|
|
drawDialog(GUI::kDrawLayerForeground);
|
|
|
|
_refreshing = false;
|
|
}
|
|
|
|
void MapGeneratorDialog::handleCommand(GUI::CommandSender *sender, uint32 cmd, uint32 data) {
|
|
if (_refreshing)
|
|
return;
|
|
|
|
switch(cmd) {
|
|
case kAlgorCmd:
|
|
ConfMan.setInt("map_algorithm", data);
|
|
break;
|
|
case kAlgorRandCmd:
|
|
if (data == 1) {
|
|
if (ConfMan.hasKey("map_algorithm") && ConfMan.getInt("map_algorithm") != 0)
|
|
// Store previous value
|
|
ConfMan.setInt("prev_map_algorithm", ConfMan.getInt("map_algorithm"));
|
|
ConfMan.setInt("map_algorithm", 0);
|
|
} else {
|
|
// Restore previous value
|
|
int previousValue = SPIFF_GEN;
|
|
if (ConfMan.hasKey("prev_map_algorithm"))
|
|
previousValue = ConfMan.getInt("prev_map_algorithm");
|
|
ConfMan.setInt("map_algorithm", previousValue);
|
|
}
|
|
|
|
refresh();
|
|
break;
|
|
case kSizeCmd:
|
|
ConfMan.setInt("map_size", data);
|
|
break;
|
|
case kSizeRandCmd:
|
|
if (data == 1) {
|
|
if (ConfMan.hasKey("map_size") && ConfMan.getInt("map_size") != 0)
|
|
// Store previous value
|
|
ConfMan.setInt("prev_map_size", ConfMan.getInt("map_size"));
|
|
ConfMan.setInt("map_size", 0);
|
|
} else {
|
|
// Restore previous value
|
|
int previousValue = 4;
|
|
if (ConfMan.hasKey("prev_map_size"))
|
|
previousValue = ConfMan.getInt("prev_map_size");
|
|
ConfMan.setInt("map_size", previousValue);
|
|
}
|
|
|
|
refresh();
|
|
break;
|
|
case kTileCmd:
|
|
ConfMan.setInt("map_tileset", data);
|
|
break;
|
|
case kTileRandCmd:
|
|
if (data == 1) {
|
|
if (ConfMan.hasKey("map_tileset") && ConfMan.getInt("map_tileset") != 0)
|
|
// Store previous value
|
|
ConfMan.setInt("prev_map_tileset", ConfMan.getInt("map_tileset"));
|
|
ConfMan.setInt("map_tileset", 0);
|
|
} else {
|
|
// Restore previous value
|
|
int previousValue = 5;
|
|
if (ConfMan.hasKey("prev_map_tileset"))
|
|
previousValue = ConfMan.getInt("prev_map_tileset");
|
|
ConfMan.setInt("map_tileset", previousValue);
|
|
}
|
|
|
|
refresh();
|
|
break;
|
|
case kEnergyCmd:
|
|
ConfMan.setInt("map_energy", data);
|
|
break;
|
|
case kEnergyRandCmd:
|
|
if (data == 1) {
|
|
if (ConfMan.hasKey("map_energy") && ConfMan.getInt("map_energy") != -1)
|
|
// Store previous value
|
|
ConfMan.setInt("prev_map_energy", ConfMan.getInt("map_energy"));
|
|
ConfMan.setInt("map_energy", -1);
|
|
} else {
|
|
// Restore previous value
|
|
int previousValue = 3;
|
|
if (ConfMan.hasKey("prev_map_energy"))
|
|
previousValue = ConfMan.getInt("prev_map_energy");
|
|
ConfMan.setInt("map_energy", previousValue);
|
|
}
|
|
|
|
refresh();
|
|
break;
|
|
case kTerrainCmd:
|
|
ConfMan.setInt("map_terrain", data);
|
|
break;
|
|
case kTerrainRandCmd:
|
|
if (data == 1) {
|
|
if (ConfMan.hasKey("map_terrain") && ConfMan.getInt("map_terrain") != -1)
|
|
// Store previous value
|
|
ConfMan.setInt("prev_map_terrain", ConfMan.getInt("map_terrain"));
|
|
ConfMan.setInt("map_terrain", -1);
|
|
} else {
|
|
// Restore previous value
|
|
int previousValue = 3;
|
|
if (ConfMan.hasKey("prev_map_terrain"))
|
|
previousValue = ConfMan.getInt("prev_map_terrain");
|
|
ConfMan.setInt("map_terrain", previousValue);
|
|
}
|
|
|
|
refresh();
|
|
break;
|
|
case kWaterCmd:
|
|
ConfMan.setInt("map_water", data);
|
|
break;
|
|
case kWaterRandCmd:
|
|
if (data == 1) {
|
|
if (ConfMan.hasKey("map_water") && ConfMan.getInt("map_water") != -1)
|
|
// Store previous value
|
|
ConfMan.setInt("prev_map_water", ConfMan.getInt("map_water"));
|
|
ConfMan.setInt("map_water", -1);
|
|
} else {
|
|
// Restore previous value
|
|
int previousValue = 3;
|
|
if (ConfMan.hasKey("prev_map_water"))
|
|
previousValue = ConfMan.getInt("prev_map_water");
|
|
ConfMan.setInt("map_water", previousValue);
|
|
}
|
|
|
|
refresh();
|
|
break;
|
|
case kCancelCmd:
|
|
setResult(0);
|
|
close();
|
|
break;
|
|
case kGenerateCmd:
|
|
ConfMan.flushToDisk();
|
|
setResult(1);
|
|
close();
|
|
break;
|
|
default:
|
|
Dialog::handleCommand(sender, cmd, data);
|
|
}
|
|
}
|
|
|
|
void MapGeneratorDialog::handleKeyDown(Common::KeyState state) {
|
|
switch (state.keycode) {
|
|
case Common::KEYCODE_RETURN:
|
|
case Common::KEYCODE_KP_ENTER:
|
|
ConfMan.flushToDisk();
|
|
setResult(1);
|
|
close();
|
|
break;
|
|
default:
|
|
Dialog::handleKeyDown(state);
|
|
}
|
|
}
|
|
|
|
} // End of namespace Scumm
|