mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-22 04:01:23 +00:00
Added some The Last Dynasty stubs
svn-id: r34217
This commit is contained in:
parent
8032491381
commit
805a46b229
@ -57,6 +57,7 @@ static const PlainGameDescriptor gobGames[] = {
|
||||
{"inca2", "Inca II: Wiracocha"},
|
||||
{"woodruff", "The Bizarre Adventures of Woodruff and the Schnibble"},
|
||||
{"dynasty", "The Last Dynasty"},
|
||||
{"urban", "Urban Runner"},
|
||||
{0, 0}
|
||||
};
|
||||
|
||||
@ -1771,7 +1772,7 @@ static const GOBGameDescription gameDescriptions[] = {
|
||||
kPlatformPC,
|
||||
Common::ADGF_NO_FLAGS
|
||||
},
|
||||
kGameTypeWoodruff,
|
||||
kGameTypeDynasty,
|
||||
kFeatures640,
|
||||
"intro"
|
||||
},
|
||||
@ -1784,7 +1785,20 @@ static const GOBGameDescription gameDescriptions[] = {
|
||||
kPlatformPC,
|
||||
Common::ADGF_NO_FLAGS
|
||||
},
|
||||
kGameTypeWoodruff,
|
||||
kGameTypeDynasty,
|
||||
kFeatures640,
|
||||
"intro"
|
||||
},
|
||||
{
|
||||
{
|
||||
"urban",
|
||||
"",
|
||||
AD_ENTRY1s("intro.stk", "3ab2c542bd9216ae5d02cc6f45701ae1", 1252436),
|
||||
EN_USA,
|
||||
kPlatformPC,
|
||||
Common::ADGF_NO_FLAGS
|
||||
},
|
||||
kGameTypeDynasty,
|
||||
kFeatures640,
|
||||
"intro"
|
||||
},
|
||||
|
@ -323,7 +323,38 @@ void Draw::adjustCoords(char adjust, int16 *coord1, int16 *coord2) {
|
||||
}
|
||||
}
|
||||
|
||||
void Draw::drawString(char *str, int16 x, int16 y, int16 color1, int16 color2,
|
||||
int Draw::stringLength(const char *str, int16 fontIndex) {
|
||||
static const int8 dword_8F74C[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
if ((fontIndex < 0) || (fontIndex > 7) || !_fonts[fontIndex])
|
||||
return 0;
|
||||
|
||||
int len = 0;
|
||||
|
||||
if (_vm->_global->_language == 10) {
|
||||
|
||||
for (int i = 0; str[i] != 0; i++) {
|
||||
if (str[i+1] < 128) {
|
||||
len += dword_8F74C[4];
|
||||
i++;
|
||||
} else
|
||||
len += _fonts[fontIndex]->itemWidth;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if (_fonts[fontIndex]->extraData)
|
||||
while (*str != 0)
|
||||
len += *(_fonts[fontIndex]->extraData + (*str++ - _fonts[fontIndex]->startItem));
|
||||
else
|
||||
len = (strlen(str) * _fonts[fontIndex]->itemWidth);
|
||||
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
void Draw::drawString(const char *str, int16 x, int16 y, int16 color1, int16 color2,
|
||||
int16 transp, SurfaceDesc *dest, Video::FontDesc *font) {
|
||||
|
||||
while (*str != '\0') {
|
||||
@ -337,7 +368,7 @@ void Draw::drawString(char *str, int16 x, int16 y, int16 color1, int16 color2,
|
||||
}
|
||||
|
||||
void Draw::printTextCentered(int16 id, int16 left, int16 top, int16 right,
|
||||
int16 bottom, char *str, int16 fontIndex, int16 color) {
|
||||
int16 bottom, const char *str, int16 fontIndex, int16 color) {
|
||||
|
||||
adjustCoords(1, &left, &top);
|
||||
adjustCoords(1, &right, &bottom);
|
||||
|
@ -69,7 +69,7 @@ public:
|
||||
int16 _destSurface;
|
||||
|
||||
char _letterToPrint;
|
||||
char *_textToPrint;
|
||||
const char *_textToPrint;
|
||||
|
||||
int16 _backDeltaX;
|
||||
int16 _backDeltaY;
|
||||
@ -146,10 +146,11 @@ public:
|
||||
void adjustCoords(char adjust, uint16 *coord1, uint16 *coord2) {
|
||||
adjustCoords(adjust, (int16 *) coord1, (int16 *) coord2);
|
||||
}
|
||||
void drawString(char *str, int16 x, int16 y, int16 color1, int16 color2,
|
||||
int stringLength(const char *str, int16 fontIndex);
|
||||
void drawString(const char *str, int16 x, int16 y, int16 color1, int16 color2,
|
||||
int16 transp, SurfaceDesc *dest, Video::FontDesc *font);
|
||||
void printTextCentered(int16 id, int16 left, int16 top, int16 right,
|
||||
int16 bottom, char *str, int16 fontIndex, int16 color);
|
||||
int16 bottom, const char *str, int16 fontIndex, int16 color);
|
||||
int32 getSpriteRectSize(int16 index);
|
||||
void forceBlit(bool backwards = false);
|
||||
|
||||
|
@ -62,7 +62,9 @@ const Common::Language GobEngine::_gobToScummVMLang[] = {
|
||||
Common::EN_USA,
|
||||
Common::NL_NLD,
|
||||
Common::KO_KOR,
|
||||
Common::HB_ISR
|
||||
Common::HB_ISR,
|
||||
Common::PT_BRA,
|
||||
Common::JA_JPN
|
||||
};
|
||||
|
||||
GobEngine::GobEngine(OSystem *syst) : Engine(syst) {
|
||||
@ -120,7 +122,7 @@ void GobEngine::shutdown() {
|
||||
}
|
||||
|
||||
const char *GobEngine::getLangDesc(int16 language) const {
|
||||
if ((language < 0) || (language > 8))
|
||||
if ((language < 0) || (language > 10))
|
||||
language = 2;
|
||||
return Common::getLanguageDescription(_gobToScummVMLang[language]);
|
||||
}
|
||||
@ -244,6 +246,12 @@ int GobEngine::init() {
|
||||
case Common::HB_ISR:
|
||||
_global->_language = 8;
|
||||
break;
|
||||
case Common::PT_BRA:
|
||||
_global->_language = 9;
|
||||
break;
|
||||
case Common::JA_JPN:
|
||||
_global->_language = 10;
|
||||
break;
|
||||
default:
|
||||
// Default to English
|
||||
_global->_language = 2;
|
||||
@ -387,6 +395,20 @@ bool GobEngine::initGameParts() {
|
||||
_saveLoad = new SaveLoad_v4(this, _targetName.c_str());
|
||||
break;
|
||||
|
||||
case kGameTypeDynasty:
|
||||
_init = new Init_v3(this);
|
||||
_video = new Video_v2(this);
|
||||
_inter = new Inter_v5(this);
|
||||
_parse = new Parse_v2(this);
|
||||
_mult = new Mult_v2(this);
|
||||
_draw = new Draw_v2(this);
|
||||
_game = new Game_v2(this);
|
||||
_map = new Map_v4(this);
|
||||
_goblin = new Goblin_v4(this);
|
||||
_scenery = new Scenery_v2(this);
|
||||
_saveLoad = new SaveLoad_v4(this, _targetName.c_str());
|
||||
break;
|
||||
|
||||
default:
|
||||
deinitGameParts();
|
||||
return false;
|
||||
|
@ -93,7 +93,8 @@ enum GameType {
|
||||
kGameTypeBargon,
|
||||
kGameTypeWeen,
|
||||
kGameTypeLostInTime,
|
||||
kGameTypeInca2
|
||||
kGameTypeInca2,
|
||||
kGameTypeDynasty
|
||||
};
|
||||
|
||||
enum Features {
|
||||
|
@ -529,6 +529,64 @@ protected:
|
||||
void o4_playVmdOrMusic();
|
||||
};
|
||||
|
||||
class Inter_v5 : public Inter_v4 {
|
||||
public:
|
||||
Inter_v5(GobEngine *vm);
|
||||
virtual ~Inter_v5() {}
|
||||
|
||||
protected:
|
||||
typedef void (Inter_v5::*OpcodeDrawProcV5)();
|
||||
typedef bool (Inter_v5::*OpcodeFuncProcV5)(OpFuncParams &);
|
||||
typedef void (Inter_v5::*OpcodeGoblinProcV5)(OpGobParams &);
|
||||
struct OpcodeDrawEntryV5 {
|
||||
OpcodeDrawProcV5 proc;
|
||||
const char *desc;
|
||||
};
|
||||
struct OpcodeFuncEntryV5 {
|
||||
OpcodeFuncProcV5 proc;
|
||||
const char *desc;
|
||||
};
|
||||
struct OpcodeGoblinEntryV5 {
|
||||
OpcodeGoblinProcV5 proc;
|
||||
const char *desc;
|
||||
};
|
||||
const OpcodeDrawEntryV5 *_opcodesDrawV5;
|
||||
const OpcodeFuncEntryV5 *_opcodesFuncV5;
|
||||
const OpcodeGoblinEntryV5 *_opcodesGoblinV5;
|
||||
static const int _goblinFuncLookUp[][2];
|
||||
|
||||
virtual void setupOpcodes();
|
||||
virtual void executeDrawOpcode(byte i);
|
||||
virtual bool executeFuncOpcode(byte i, byte j, OpFuncParams ¶ms);
|
||||
virtual void executeGoblinOpcode(int i, OpGobParams ¶ms);
|
||||
virtual const char *getOpcodeDrawDesc(byte i);
|
||||
virtual const char *getOpcodeFuncDesc(byte i, byte j);
|
||||
virtual const char *getOpcodeGoblinDesc(int i);
|
||||
|
||||
byte _byte_8AA14;
|
||||
|
||||
void o5_deleteFile();
|
||||
|
||||
bool o5_istrlen(OpFuncParams ¶ms);
|
||||
|
||||
void o5_spaceShooter(OpGobParams ¶ms);
|
||||
void o5_getSystemCDSpeed(OpGobParams ¶ms);
|
||||
void o5_getSystemRAM(OpGobParams ¶ms);
|
||||
void o5_getSystemCPUSpeed(OpGobParams ¶ms);
|
||||
void o5_getSystemDrawSpeed(OpGobParams ¶ms);
|
||||
void o5_totalSystemSpecs(OpGobParams ¶ms);
|
||||
void o5_saveSystemSpecs(OpGobParams ¶ms);
|
||||
void o5_loadSystemSpecs(OpGobParams ¶ms);
|
||||
|
||||
void o5_gob92(OpGobParams ¶ms);
|
||||
void o5_gob95(OpGobParams ¶ms);
|
||||
void o5_gob96(OpGobParams ¶ms);
|
||||
void o5_gob97(OpGobParams ¶ms);
|
||||
void o5_gob98(OpGobParams ¶ms);
|
||||
void o5_gob100(OpGobParams ¶ms);
|
||||
void o5_gob200(OpGobParams ¶ms);
|
||||
};
|
||||
|
||||
} // End of namespace Gob
|
||||
|
||||
#endif // GOB_INTER_H
|
||||
|
1035
engines/gob/inter_v5.cpp
Normal file
1035
engines/gob/inter_v5.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -30,6 +30,7 @@ MODULE_OBJS := \
|
||||
inter_bargon.o \
|
||||
inter_v3.o \
|
||||
inter_v4.o \
|
||||
inter_v5.o \
|
||||
map.o \
|
||||
map_v1.o \
|
||||
map_v2.o \
|
||||
|
@ -116,6 +116,7 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||
int16 brackPos;
|
||||
static int16 flag = 0;
|
||||
int16 oldflag;
|
||||
uint32 varPos = 0;
|
||||
|
||||
memset(values, 0, 20 * sizeof(int16));
|
||||
|
||||
@ -130,11 +131,61 @@ int16 Parse_v2::parseValExpr(byte stopToken) {
|
||||
valPtr = values - 1;
|
||||
|
||||
while (1) {
|
||||
operation = *_vm->_global->_inter_execPtr++;
|
||||
|
||||
while ((operation == 14) || (operation == 15)) {
|
||||
if (operation == 14) {
|
||||
uint16 n = _vm->_inter->load16();
|
||||
varPos += n * 4;
|
||||
|
||||
_vm->_global->_inter_execPtr += 2;
|
||||
if (*_vm->_global->_inter_execPtr == 97)
|
||||
_vm->_global->_inter_execPtr++;
|
||||
} else if (operation == 15) {
|
||||
uint16 n = _vm->_inter->load16();
|
||||
varPos += n * 4;
|
||||
|
||||
uint16 var_0C = _vm->_inter->load16();
|
||||
uint8 var_A = *_vm->_global->_inter_execPtr++;
|
||||
|
||||
byte *var_12 = _vm->_global->_inter_execPtr;
|
||||
_vm->_global->_inter_execPtr += var_A;
|
||||
|
||||
uint16 var_6 = 0;
|
||||
|
||||
for (int i = 0; i < var_A; i++) {
|
||||
temp2 = parseValExpr(12);
|
||||
|
||||
//uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
|
||||
|
||||
uint16 ax;
|
||||
|
||||
if (temp2 < 0) {
|
||||
ax = 0;
|
||||
} else if (var_12[i] > temp2) {
|
||||
ax = temp2;
|
||||
} else {
|
||||
ax = var_12[i] - 1;
|
||||
}
|
||||
|
||||
var_6 = var_6 * var_12[i] + ax;
|
||||
}
|
||||
|
||||
varPos += var_6 * var_0C * 4;
|
||||
|
||||
if (*_vm->_global->_inter_execPtr == 97)
|
||||
_vm->_global->_inter_execPtr++;
|
||||
}
|
||||
|
||||
warning("v5+ Stub: parseValExpr operation %d, offset %d", operation, varPos);
|
||||
|
||||
operation = *_vm->_global->_inter_execPtr++;
|
||||
}
|
||||
|
||||
stkPos++;
|
||||
operPtr++;
|
||||
valPtr++;
|
||||
|
||||
operation = *_vm->_global->_inter_execPtr++;
|
||||
if ((operation >= 16) && (operation <= 29)) {
|
||||
*operPtr = 20;
|
||||
switch (operation) {
|
||||
@ -373,6 +424,7 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||
bool var_1A;
|
||||
int16 stkPos;
|
||||
int16 brackStart;
|
||||
uint32 varPos = 0;
|
||||
|
||||
memset(operStack, 0, 20);
|
||||
|
||||
@ -381,10 +433,61 @@ int16 Parse_v2::parseExpr(byte stopToken, byte *arg_2) {
|
||||
valPtr = values - 1;
|
||||
|
||||
while (1) {
|
||||
operation = *_vm->_global->_inter_execPtr++;
|
||||
|
||||
while ((operation == 14) || (operation == 15)) {
|
||||
if (operation == 14) {
|
||||
uint16 n = _vm->_inter->load16();
|
||||
varPos += n * 4;
|
||||
|
||||
_vm->_global->_inter_execPtr += 2;
|
||||
if (*_vm->_global->_inter_execPtr == 97)
|
||||
_vm->_global->_inter_execPtr++;
|
||||
} else if (operation == 15) {
|
||||
uint16 n = _vm->_inter->load16();
|
||||
varPos += n * 4;
|
||||
|
||||
uint16 var_0C = _vm->_inter->load16();
|
||||
uint8 var_A = *_vm->_global->_inter_execPtr++;
|
||||
|
||||
byte *var_12 = _vm->_global->_inter_execPtr;
|
||||
_vm->_global->_inter_execPtr += var_A;
|
||||
|
||||
uint16 var_6 = 0;
|
||||
|
||||
for (int i = 0; i < var_A; i++) {
|
||||
temp2 = parseValExpr(12);
|
||||
|
||||
//uint16 ax = sub_12063(temp2, var_12[i], varPos, 0);
|
||||
|
||||
uint16 ax;
|
||||
|
||||
if (temp2 < 0) {
|
||||
ax = 0;
|
||||
} else if (var_12[i] > temp2) {
|
||||
ax = temp2;
|
||||
} else {
|
||||
ax = var_12[i] - 1;
|
||||
}
|
||||
|
||||
var_6 = var_6 * var_12[i] + ax;
|
||||
}
|
||||
|
||||
varPos += var_6 * var_0C * 4;
|
||||
|
||||
if (*_vm->_global->_inter_execPtr == 97)
|
||||
_vm->_global->_inter_execPtr++;
|
||||
}
|
||||
|
||||
warning("v5+ Stub: parseExpr operation %d, offset %d", operation, varPos);
|
||||
|
||||
operation = *_vm->_global->_inter_execPtr++;
|
||||
}
|
||||
|
||||
stkPos++;
|
||||
operPtr++;
|
||||
valPtr++;
|
||||
operation = *_vm->_global->_inter_execPtr++;
|
||||
|
||||
if ((operation >= 16) && (operation <= 29)) {
|
||||
switch (operation) {
|
||||
case 16:
|
||||
|
Loading…
x
Reference in New Issue
Block a user