Added some The Last Dynasty stubs

svn-id: r34217
This commit is contained in:
Sven Hesse 2008-08-30 23:59:46 +00:00
parent 8032491381
commit 805a46b229
9 changed files with 1278 additions and 12 deletions

View File

@ -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"
},

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -93,7 +93,8 @@ enum GameType {
kGameTypeBargon,
kGameTypeWeen,
kGameTypeLostInTime,
kGameTypeInca2
kGameTypeInca2,
kGameTypeDynasty
};
enum Features {

View File

@ -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 &params);
virtual void executeGoblinOpcode(int i, OpGobParams &params);
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 &params);
void o5_spaceShooter(OpGobParams &params);
void o5_getSystemCDSpeed(OpGobParams &params);
void o5_getSystemRAM(OpGobParams &params);
void o5_getSystemCPUSpeed(OpGobParams &params);
void o5_getSystemDrawSpeed(OpGobParams &params);
void o5_totalSystemSpecs(OpGobParams &params);
void o5_saveSystemSpecs(OpGobParams &params);
void o5_loadSystemSpecs(OpGobParams &params);
void o5_gob92(OpGobParams &params);
void o5_gob95(OpGobParams &params);
void o5_gob96(OpGobParams &params);
void o5_gob97(OpGobParams &params);
void o5_gob98(OpGobParams &params);
void o5_gob100(OpGobParams &params);
void o5_gob200(OpGobParams &params);
};
} // End of namespace Gob
#endif // GOB_INTER_H

1035
engines/gob/inter_v5.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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 \

View File

@ -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: