HOPKINS: Clean-up of CHANGE_TETE to fix switching characters

This commit is contained in:
Paul Gilbert 2012-11-24 22:25:19 +11:00
parent 6db4aca751
commit d52ae2f47b
6 changed files with 130 additions and 128 deletions

View file

@ -204,11 +204,11 @@ struct HopkinsItem {
int field2; int field2;
}; };
struct Sauvegarde1 { struct CharacterLocation {
int field0; int xp;
int field1; int yp;
int field2; int field2;
int field3; int location;
int field4; int field4;
}; };
@ -274,12 +274,14 @@ enum SauvegardeOffset {
, svField401 = 401 , svField401 = 401
}; };
enum PlayerCharacter { CHARACTER_HOPKINS = 0, CHARACTER_HOPKINS_CLONE = 1, CHARACTER_2 = 2 };
// TODO: Sauvegrade1 fields should really be mapped into data array // TODO: Sauvegrade1 fields should really be mapped into data array
struct Sauvegarde { struct Sauvegarde {
byte data[0x802]; byte data[0x802];
Sauvegarde1 field360; CharacterLocation field360;
Sauvegarde1 field370; CharacterLocation field370;
Sauvegarde1 field380; CharacterLocation field380;
int16 inventory[35]; // Originally at offset 1300 of data array int16 inventory[35]; // Originally at offset 1300 of data array
}; };

View file

@ -2743,14 +2743,14 @@ void ObjectsManager::BTGAUCHE() {
&& !_vm->_globals.PLAN_FLAG && !_vm->_globals.PLAN_FLAG
&& (uint16)(destX - 533) <= 0x1Au && (uint16)(destX - 533) <= 0x1Au
&& (uint16)(destY - 26) <= 0x21u) { && (uint16)(destY - 26) <= 0x21u) {
CHANGE_TETE(1, 0); CHANGE_TETE(CHARACTER_HOPKINS_CLONE, CHARACTER_HOPKINS);
return; return;
} }
if (_vm->_globals.SAUVEGARDE->data[svField356] == 1 if (_vm->_globals.SAUVEGARDE->data[svField356] == 1
&& !_vm->_globals.PLAN_FLAG && !_vm->_globals.PLAN_FLAG
&& (uint16)(destX - 533) <= 0x1Au && (uint16)(destX - 533) <= 0x1Au
&& (uint16)(destY - 26) <= 0x21u) { && (uint16)(destY - 26) <= 0x21u) {
CHANGE_TETE(2, 0); CHANGE_TETE(CHARACTER_2, CHARACTER_HOPKINS);
return; return;
} }
if (_vm->_globals.SAUVEGARDE->data[svField357] == 1) { if (_vm->_globals.SAUVEGARDE->data[svField357] == 1) {
@ -2758,14 +2758,14 @@ void ObjectsManager::BTGAUCHE() {
&& !_vm->_globals.PLAN_FLAG && !_vm->_globals.PLAN_FLAG
&& (uint16)(destX - 533) <= 0x1Au && (uint16)(destX - 533) <= 0x1Au
&& (uint16)(destY - 26) <= 0x21u) { && (uint16)(destY - 26) <= 0x21u) {
CHANGE_TETE(0, 1); CHANGE_TETE(CHARACTER_HOPKINS, CHARACTER_HOPKINS_CLONE);
return; return;
} }
if (_vm->_globals.SAUVEGARDE->data[svField355] == 1 if (_vm->_globals.SAUVEGARDE->data[svField355] == 1
&& !_vm->_globals.PLAN_FLAG && !_vm->_globals.PLAN_FLAG
&& (uint16)(destX - 567) <= 0x1Au && (uint16)(destX - 567) <= 0x1Au
&& (uint16)(destY - 26) <= 0x21u) { && (uint16)(destY - 26) <= 0x21u) {
CHANGE_TETE(0, 2); CHANGE_TETE(CHARACTER_HOPKINS, CHARACTER_2);
return; return;
} }
} }
@ -3068,117 +3068,117 @@ void ObjectsManager::CLEAR_ECRAN() {
} }
// Change Face/Head // Change Face/Head
void ObjectsManager::CHANGE_TETE(int a1, int a2) { void ObjectsManager::CHANGE_TETE(PlayerCharacter a1, PlayerCharacter a2) {
int v2; CharacterLocation *loc;
Sauvegarde1 *v3;
Sauvegarde1 *v4;
Sauvegarde1 *v5;
Sauvegarde1 *v6;
Sauvegarde1 *v7;
Sauvegarde1 *v8;
Sauvegarde1 *v9;
CH_TETE = 1; CH_TETE = 1;
_vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, 532, 25, 65, 40, _vm->_graphicsManager.VESA_BUFFER, 532, 25); _vm->_graphicsManager.SCOPY(_vm->_graphicsManager.VESA_SCREEN, 532, 25, 65, 40, _vm->_graphicsManager.VESA_BUFFER, 532, 25);
_vm->_graphicsManager.Ajoute_Segment_Vesa(532, 25, 597, 65); _vm->_graphicsManager.Ajoute_Segment_Vesa(532, 25, 597, 65);
_vm->_globals.NOT_VERIF = 1; _vm->_globals.NOT_VERIF = 1;
_vm->_globals.chemin = (int16 *)g_PTRNUL; _vm->_globals.chemin = (int16 *)g_PTRNUL;
if (a1 == 2) {
if (!a2) { if (a1 == CHARACTER_2 && !a2 && _vm->_globals.SAUVEGARDE->field370.location) {
if (_vm->_globals.SAUVEGARDE->data[svField188] == _vm->_globals.ECRAN) { CH_TETE = 0;
CH_TETE = 0; loc = &_vm->_globals.SAUVEGARDE->field380;
v3 = &_vm->_globals.SAUVEGARDE->field380; loc->xp = XSPR(0);
v3->field0 = XSPR(0); loc->yp = YSPR(0);
v3->field1 = YSPR(0); loc->field2 = 64;
v3->field2 = 64; loc->location = _vm->_globals.ECRAN;
v3->field3 = _vm->_globals.ECRAN; loc->field4 = Sprite[0].field0;
v3->field4 = Sprite[0].field0;
SPRITE_OFF(1); SPRITE_OFF(1);
SPRITE(_vm->_globals.TETE, v3->field0, v3->field1, 1, 3, v3->field4, 0, 20, 127); SPRITE(_vm->_globals.TETE, loc->xp, loc->yp, 1, 3, loc->field4, 0, 20, 127);
SPRITE_ON(1); SPRITE_ON(1);
SPRITE_OFF(0); SPRITE_OFF(0);
_vm->_globals.SAUVEGARDE->data[svField354] = 0;
_vm->_globals.SAUVEGARDE->data[svField356] = 0;
_vm->_globals.SAUVEGARDE->data[svField357] = 1;
T_RECTIF = 0;
v4 = &_vm->_globals.SAUVEGARDE->field370;
_vm->_fileManager.CONSTRUIT_SYSTEM("PERSO.SPR");
_vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO);
_vm->_globals.PERSO_TYPE = 0;
SPRITE(_vm->_globals.PERSO, v4->field0, v4->field1, 0, 64, v4->field4, 0, 34, 190);
LABEL_9:
SPRITE_ON(0);
return;
}
}
}
if (!a1) {
if (a2 == 2 && _vm->_globals.SAUVEGARDE->data[svField193] == _vm->_globals.ECRAN) {
CH_TETE = 0;
v5 = &_vm->_globals.SAUVEGARDE->field370;
v5->field0 = XSPR(0);
v5->field1 = YSPR(0);
v5->field2 = 64;
v5->field3 = _vm->_globals.ECRAN;
v5->field4 = Sprite[0].fieldC;
SPRITE_OFF(1);
SPRITE(_vm->_globals.TETE, v5->field0, v5->field1, 1, 2, v5->field4, 0, 34, 190);
SPRITE_ON(1);
SPRITE_OFF(0);
_vm->_globals.SAUVEGARDE->data[svField354] = 0;
_vm->_globals.SAUVEGARDE->data[svField356] = 1;
_vm->_globals.SAUVEGARDE->data[svField357] = 0;
v6 = &_vm->_globals.SAUVEGARDE->field380;
_vm->_fileManager.CONSTRUIT_SYSTEM("PSAMAN.SPR");
_vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO);
_vm->_globals.PERSO_TYPE = 2;
SPRITE(_vm->_globals.PERSO, v6->field0, v6->field1, 0, 64, v6->field4, 0, 20, 127);
goto LABEL_9;
}
v7 = &_vm->_globals.SAUVEGARDE->field370;
v7->field0 = XSPR(0);
v7->field1 = YSPR(0);
v7->field2 = 64;
v7->field3 = _vm->_globals.ECRAN;
v7->field4 = Sprite[0].fieldC;
}
if (a1 == 1) {
v8 = &_vm->_globals.SAUVEGARDE->field360;
v8->field0 = XSPR(0);
v8->field1 = YSPR(0);
v8->field2 = 64;
v8->field3 = _vm->_globals.ECRAN;
v8->field4 = Sprite[0].fieldC;
}
if (a1 == 2) {
v9 = &_vm->_globals.SAUVEGARDE->field380;
v9->field0 = XSPR(0);
v9->field1 = YSPR(0);
v9->field2 = 64;
v9->field3 = _vm->_globals.ECRAN;
v9->field4 = Sprite[0].fieldC;
}
if (!a2) {
_vm->_globals.SAUVEGARDE->data[svField121] = 0;
_vm->_globals.SAUVEGARDE->data[svField354] = 0; _vm->_globals.SAUVEGARDE->data[svField354] = 0;
_vm->_globals.SAUVEGARDE->data[svField356] = 0; _vm->_globals.SAUVEGARDE->data[svField356] = 0;
_vm->_globals.SAUVEGARDE->data[svField357] = 1; _vm->_globals.SAUVEGARDE->data[svField357] = 1;
_vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField188]; T_RECTIF = 0;
}
if (a2 == 1) { loc = &_vm->_globals.SAUVEGARDE->field370;
_vm->_globals.SAUVEGARDE->data[svField121] = 1; _vm->_fileManager.CONSTRUIT_SYSTEM("PERSO.SPR");
_vm->_globals.SAUVEGARDE->data[svField354] = 1; _vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO);
_vm->_globals.SAUVEGARDE->data[svField356] = 0; _vm->_globals.PERSO_TYPE = 0;
_vm->_globals.SAUVEGARDE->data[svField357] = 0; SPRITE(_vm->_globals.PERSO, loc->xp, loc->yp, 0, 64, loc->field4, 0, 34, 190);
_vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField183]; SPRITE_ON(0);
} _vm->_globals.HOPKINS_DATA();
if (a2 == 2) { } else if (!a1 && a2 == CHARACTER_2 && _vm->_globals.SAUVEGARDE->field380.location == _vm->_globals.ECRAN) {
_vm->_globals.SAUVEGARDE->data[svField121] = 0; CH_TETE = 0;
loc = &_vm->_globals.SAUVEGARDE->field370;
loc->xp = XSPR(0);
loc->yp = YSPR(0);
loc->field2 = 64;
loc->location = _vm->_globals.ECRAN;
loc->field4 = Sprite[0].fieldC;
SPRITE_OFF(1);
SPRITE(_vm->_globals.TETE, loc->xp, loc->yp, 1, 2, loc->field4, 0, 34, 190);
SPRITE_ON(1);
SPRITE_OFF(0);
_vm->_globals.SAUVEGARDE->data[svField354] = 0; _vm->_globals.SAUVEGARDE->data[svField354] = 0;
_vm->_globals.SAUVEGARDE->data[svField356] = 1; _vm->_globals.SAUVEGARDE->data[svField356] = 1;
_vm->_globals.SAUVEGARDE->data[svField357] = 0; _vm->_globals.SAUVEGARDE->data[svField357] = 0;
v2 = _vm->_globals.SAUVEGARDE->data[svField193];
_vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->data[svField193]; loc = &_vm->_globals.SAUVEGARDE->field380;
_vm->_fileManager.CONSTRUIT_SYSTEM("PSAMAN.SPR");
_vm->_fileManager.CHARGE_FICHIER2(_vm->_globals.NFICHIER, _vm->_globals.PERSO);
_vm->_globals.PERSO_TYPE = 2;
SPRITE(_vm->_globals.PERSO, loc->xp, loc->yp, 0, 64, loc->field4, 0, 20, 127);
SPRITE_ON(0);
_vm->_globals.HOPKINS_DATA();
} else {
switch (a1) {
case CHARACTER_HOPKINS:
loc = &_vm->_globals.SAUVEGARDE->field370;
loc->xp = XSPR(0);
loc->yp = YSPR(0);
loc->field2 = 64;
loc->location = _vm->_globals.ECRAN;
loc->field4 = Sprite[0].fieldC;
break;
case CHARACTER_HOPKINS_CLONE:
loc = &_vm->_globals.SAUVEGARDE->field360;
loc->xp = XSPR(0);
loc->yp = YSPR(0);
loc->field2 = 64;
loc->location = _vm->_globals.ECRAN;
loc->field4 = Sprite[0].fieldC;
break;
case CHARACTER_2:
loc = &_vm->_globals.SAUVEGARDE->field380;
loc->xp = XSPR(0);
loc->yp = YSPR(0);
loc->field2 = 64;
loc->location = _vm->_globals.ECRAN;
loc->field4 = Sprite[0].fieldC;
break;
default:
break;
}
switch (a2) {
case CHARACTER_HOPKINS:
_vm->_globals.SAUVEGARDE->data[svField121] = 0;
_vm->_globals.SAUVEGARDE->data[svField354] = 0;
_vm->_globals.SAUVEGARDE->data[svField356] = 0;
_vm->_globals.SAUVEGARDE->data[svField357] = 1;
_vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->field370.location;
break;
case CHARACTER_HOPKINS_CLONE:
_vm->_globals.SAUVEGARDE->data[svField121] = 1;
_vm->_globals.SAUVEGARDE->data[svField354] = 1;
_vm->_globals.SAUVEGARDE->data[svField356] = 0;
_vm->_globals.SAUVEGARDE->data[svField357] = 0;
_vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->field360.location;
break;
case CHARACTER_2:
_vm->_globals.SAUVEGARDE->data[svField121] = 0;
_vm->_globals.SAUVEGARDE->data[svField354] = 0;
_vm->_globals.SAUVEGARDE->data[svField356] = 1;
_vm->_globals.SAUVEGARDE->data[svField357] = 0;
_vm->_globals.SORTIE = _vm->_globals.SAUVEGARDE->field380.location;
break;
}
} }
} }

View file

@ -189,7 +189,7 @@ public:
void PARADISE(); void PARADISE();
void CLEAR_ECRAN(); void CLEAR_ECRAN();
void CHANGE_TETE(int a1, int a2); void CHANGE_TETE(PlayerCharacter a1, PlayerCharacter a2);
void VERIFTAILLE(); void VERIFTAILLE();
void PACOURS_PROPRE(int16 *a1); void PACOURS_PROPRE(int16 *a1);
int16 *PARC_VOITURE(int a1, int a2, int a3, int a4); int16 *PARC_VOITURE(int a1, int a2, int a3, int a4);

View file

@ -235,19 +235,19 @@ void SaveLoadManager::createThumbnail(Graphics::Surface *s) {
void SaveLoadManager::syncSavegameData(Common::Serializer &s) { void SaveLoadManager::syncSavegameData(Common::Serializer &s) {
s.syncBytes(&_vm->_globals.SAUVEGARDE->data[0], 0x802); s.syncBytes(&_vm->_globals.SAUVEGARDE->data[0], 0x802);
syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field360); syncCharacterLocation(s, _vm->_globals.SAUVEGARDE->field360);
syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field370); syncCharacterLocation(s, _vm->_globals.SAUVEGARDE->field370);
syncSauvegarde1(s, _vm->_globals.SAUVEGARDE->field380); syncCharacterLocation(s, _vm->_globals.SAUVEGARDE->field380);
for (int i = 0; i < 35; ++i) for (int i = 0; i < 35; ++i)
s.syncAsSint16LE(_vm->_globals.SAUVEGARDE->inventory[i]); s.syncAsSint16LE(_vm->_globals.SAUVEGARDE->inventory[i]);
} }
void SaveLoadManager::syncSauvegarde1(Common::Serializer &s, Sauvegarde1 &item) { void SaveLoadManager::syncCharacterLocation(Common::Serializer &s, CharacterLocation &item) {
s.syncAsSint16LE(item.field0); s.syncAsSint16LE(item.xp);
s.syncAsSint16LE(item.field1); s.syncAsSint16LE(item.yp);
s.syncAsSint16LE(item.field2); s.syncAsSint16LE(item.field2);
s.syncAsSint16LE(item.field3); s.syncAsSint16LE(item.location);
s.syncAsSint16LE(item.field4); s.syncAsSint16LE(item.field4);
} }

View file

@ -50,7 +50,7 @@ private:
void createThumbnail(Graphics::Surface *s); void createThumbnail(Graphics::Surface *s);
void syncSavegameData(Common::Serializer &s); void syncSavegameData(Common::Serializer &s);
void syncSauvegarde1(Common::Serializer &s, Sauvegarde1 &item); void syncCharacterLocation(Common::Serializer &s, CharacterLocation &item);
public: public:
void setParent(HopkinsEngine *vm); void setParent(HopkinsEngine *vm);

View file

@ -47,9 +47,9 @@ int ScriptManager::Traduction(byte *a1) {
char v48; char v48;
char v49; char v49;
int v50; int v50;
Sauvegarde1 *v51; CharacterLocation *v51;
int v52; int v52;
Sauvegarde1 *v53; CharacterLocation *v53;
int v54; int v54;
int v55; int v55;
int v56; int v56;
@ -1958,10 +1958,10 @@ LABEL_1141:
++v71; ++v71;
} while (v71 <= 29); } while (v71 <= 29);
v51 = &_vm->_globals.SAUVEGARDE->field370; v51 = &_vm->_globals.SAUVEGARDE->field370;
v51->field0 = _vm->_objectsManager.XSPR(0); v51->xp = _vm->_objectsManager.XSPR(0);
v51->field1 = _vm->_objectsManager.YSPR(0); v51->yp = _vm->_objectsManager.YSPR(0);
v51->field2 = 57; v51->field2 = 57;
v51->field3 = 97; v51->location = 97;
_vm->_globals.SAUVEGARDE->data[svField121] = 1; _vm->_globals.SAUVEGARDE->data[svField121] = 1;
_vm->_globals.SAUVEGARDE->data[svField352] = 1; _vm->_globals.SAUVEGARDE->data[svField352] = 1;
_vm->_globals.SAUVEGARDE->data[svField353] = 1; _vm->_globals.SAUVEGARDE->data[svField353] = 1;
@ -2186,10 +2186,10 @@ LABEL_1141:
_vm->_animationManager.PLAY_SEQ("RESUF.SEQ", 1, 24, 1); _vm->_animationManager.PLAY_SEQ("RESUF.SEQ", 1, 24, 1);
_vm->_animationManager.NO_SEQ = false; _vm->_animationManager.NO_SEQ = false;
v53 = &_vm->_globals.SAUVEGARDE->field380; v53 = &_vm->_globals.SAUVEGARDE->field380;
v53->field0 = 404; v53->xp = 404;
v53->field1 = 395; v53->yp = 395;
v53->field2 = 64; v53->field2 = 64;
v53->field3 = _vm->_globals.ECRAN; v53->location = _vm->_globals.ECRAN;
v54 = _vm->_globals.STAILLE[790 / 2]; v54 = _vm->_globals.STAILLE[790 / 2];
if (_vm->_globals.STAILLE[790 / 2] < 0) if (_vm->_globals.STAILLE[790 / 2] < 0)
@ -2202,7 +2202,7 @@ LABEL_1141:
_vm->_globals.SAUVEGARDE->data[svField355] = 1; _vm->_globals.SAUVEGARDE->data[svField355] = 1;
_vm->_objectsManager.DEUXPERSO = true; _vm->_objectsManager.DEUXPERSO = true;
_vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 373, 191, 3); _vm->_graphicsManager.AFFICHE_SPEED(_vm->_globals.SPRITE_ECRAN, 373, 191, 3);
_vm->_objectsManager.SPRITE(_vm->_globals.TETE, v53->field0, v53->field1, 1, 3, v53->field4, 0, 20, 127); _vm->_objectsManager.SPRITE(_vm->_globals.TETE, v53->xp, v53->yp, 1, 3, v53->field4, 0, 20, 127);
_vm->_objectsManager.SPRITE_ON(1); _vm->_objectsManager.SPRITE_ON(1);
} }
if (v76 == 245) { if (v76 == 245) {