Fixed a lot of critical bugs (affecting IVs, etc...), especially for Colosseum. Money and Pokécoupons are now limited to 9,999,999. Bag items are limited again to 99 in Colosseum.

This commit is contained in:
TuxSH
2015-09-19 21:39:36 +02:00
parent 03661fc19e
commit 5384da6e4e
24 changed files with 287 additions and 183 deletions

View File

@@ -1,6 +1,14 @@
###PkmGCTools v1.1.1:
Fixed a lot of critical bugs (affecting IVs, etc...). Money and Pokécoupons are now limited to 9,999,999. Bag items are limited again to 99 in Pokémon Colosseum.
To users of previous versions:
* If and only if you have modified a Colosseum save file with that previous version, please load this save file again,
and click "Bugs affecting Pokémon..."(in "Options", "Bug fixes"). Do it only once and only once (for each concerned save file).
* If you have imported or exported a Pokémon in the GBA format, please check its status alteration, its EVs, and its game of origin.
###PkmGCTools v1.1:
* GBA Pokémon are now **fully** supported.
* As a consequence onversion between Colosseum, XD and GBA Pokémon is now **fully** supported.
* As a consequence conversion between Colosseum, XD and GBA Pokémon is now **fully** supported.
* It is done (almost) exactly like it is in Colosseum/XD during a GC<->GBA trade (meaning, for example, that the data specific to shadow Pokémon is lost).
* Please note that A-Save discards all party-related information (e.g status alteration). The Devil is in the detail...
* The maximum number for items has been raised to 999.

View File

@@ -42,6 +42,8 @@ public:
void save(void);
void fixBugsAffectingPokemon(void);
protected:
void loadFields(void);

View File

@@ -83,7 +83,7 @@ public:
s32 storyModeSaveCount;
u8 checksum[20]; // digest
void fixBugsAffectingPokemon(void);
protected:
void loadData(u32 flags = 0);
void deleteFields(void);

View File

@@ -22,7 +22,7 @@
#include <boost/config/warning_disable.hpp>
#include <boost/config.hpp>
#define LIBPKMGC_VERSION 1001000
#define LIBPKMGC_VERSION 1001001
#define LIBPKMGC_VERSION_MAJOR ((LIBPKMGC_VERSION / 1000000) % 1000)
#define LIBPKMGC_VERSION_MINOR ((LIBPKMGC_VERSION / 1000) % 1000)
#define LIBPKMGC_VERSION_BUILD (LIBPKMGC_VERSION % 1000)

View File

@@ -59,8 +59,8 @@ using namespace LE;
#define LD_ARRAY(type,ar,sz,off) toArrayOfIntegers<u8*,type*>(ar, BUFFER_NAME+off, BUFFER_NAME+off+(sizeof(type)*sz))
#define LD_ARRAY_MAX(type,ar,sz,off,mx) toArrayOfIntegers<u8*,type*>(ar, BUFFER_NAME+off, BUFFER_NAME+off+(sizeof(type)*sz));\
for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = (ar[i__] > mx) ? mx : ar[i__];
#define LD_ARRAY_CONV(type,ar,sz,off,type2) type ar##_tmp[sz]; toArrayOfIntegers<u8*,type*>(ar, BUFFER_NAME+off, BUFFER_NAME+off+(sizeof(type)*sz));\
for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = (ar##_tmp[i__] > mx) ? mx : ar##_tmp[i__];
#define LD_ARRAY_CONV(type,ar,sz,off,type2) type ar##_tmp[sz]; toArrayOfIntegers<u8*,type*>(ar##_tmp, BUFFER_NAME+off, BUFFER_NAME+off+(sizeof(type)*sz));\
for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = (type2)((ar##_tmp[i__] > (type2)-1) ? (type2)-1 : ar##_tmp[i__]);
#define LD_ARRAY_E(type,ar,sz,off,etype) toArrayOfEnumIntegers<type,u8*,etype*>(ar, BUFFER_NAME+off, BUFFER_NAME+off+(sizeof(type)*sz))
#define LD_ARRAY_E_MAX(type,ar,sz,off,etype,mx) toArrayOfEnumIntegers<type,u8*,etype*>(ar, BUFFER_NAME+off, BUFFER_NAME+off+(sizeof(type)*sz));\
for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = ((u32)ar[i__] > (u32)mx) ? (etype)0 : ar[i__];
@@ -77,8 +77,8 @@ for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = ((u32)ar[i__] > (u32)mx) ? (etype
#define SV_ARRAY(type,ar,sz,off) fromArrayOfIntegers<type*, u8*>(BUFFER_NAME+off, ar, ar+sz)
#define SV_ARRAY_MAX(type,ar,sz,off,mx) for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = (ar[i__] > mx) ? mx : ar[i__];\
fromArrayOfIntegers<type*, u8*>(BUFFER_NAME+off, ar, ar+sz)
#define SV_ARRAY_CONV(type,ar,sz,off,type2) type ar##_tmp[sz]; for(size_t i__=0;i__<sz;++i__) ar##_tmp[i__] = (ar[i__] > mx) ? mx : (type) ar[i__];\
fromArrayOfIntegers<type*, u8*>(BUFFER_NAME+off, ar, ar+sz)
#define SV_ARRAY_CONV(type,ar,sz,off,type2) type ar##_tmp[sz]; for(size_t i__=0;i__<sz;++i__) ar##_tmp[i__] = ((ar[i__] > (type)-1) ? (type)-1 : (type) ar[i__]);\
fromArrayOfIntegers<type*, u8*>(BUFFER_NAME+off, ar##_tmp, ar##_tmp+sz)
#define SV_ARRAY_E(type,ar,sz,off,etype) fromArrayOfEnumIntegers<type,etype*, u8*>(BUFFER_NAME+off, ar, ar+sz)
#define SV_ARRAY_E_MAX(type,ar,sz,off,etype,mx) for(size_t i__ = 0; i__ < sz; ++i__) ar[i__] = ((u32)ar[i__] > (u32)mx) ? (etype)0 : ar[i__];\
fromArrayOfEnumIntegers<type,etype*, u8*>(BUFFER_NAME+off, ar, ar+sz)

View File

@@ -37,7 +37,7 @@ u16 Pokemon::calculateStat(size_t statIndex, PokemonSpeciesIndex species, Pokemo
// We're applying bonuses now
if(i == 0) return ((outStat + 100) * level / 100) + 10; // HP
else return (outStat * level / 100 + 5) * n[(size_t)getNatureStatAffinity(natureIndex, i) ] / 100;
else return (outStat * level / 100 + 5) * n[getNatureStatAffinity(natureIndex, i)] / 100;
}

View File

@@ -48,8 +48,8 @@ void PlayerData::loadFields(void) {
LD_FIELD_E(u8, trainerGender, 0xa80, Gender);
if (trainerGender > Female) trainerGender = Male;
LD_FIELD(u32, money, 0xa84);
LD_FIELD(u32, pkCoupons, 0xa88);
LD_FIELD_MAX(u32, money, 0xa84, 9999999);
LD_FIELD_MAX(u32, pkCoupons, 0xa88, 9999999);
LD_SUBSTRUCTURE_ARRAY(Pokemon, party, 6, 0x30);
LD_SUBSTRUCTURE(BagData, bag, 0x780);
@@ -59,8 +59,8 @@ void PlayerData::save(void) {
GC::PlayerData::save();
if (trainerGender > Female) trainerGender = Male;
SV_FIELD_E(u8, trainerGender, 0xa80, Gender);
SV_FIELD(u32, money, 0xa84);
SV_FIELD(u32, pkCoupons, 0xa88);
SV_FIELD_MAX(u32, money, 0xa84, 9999999);
SV_FIELD_MAX(u32, pkCoupons, 0xa88, 9999999);
SV_FIELD(u32, pkCoupons, 0xa8c);
SV_SUBSTRUCTURE_ARRAY(Pokemon, party, 6, 0x30);

View File

@@ -68,6 +68,7 @@ void Pokemon::loadFields(void) {
LD_FIELD_E(u16, partyData.status, 0x65, PokemonStatus);
LD_FIELD(s8, partyData.turnsOfSleepRemaining, 0x69);
LD_FIELD(s8, partyData.turnsOfBadPoison, 0x6b);
u32 st = pokemonStatusToBitField(partyData.status, 0, partyData.turnsOfSleepRemaining);
SV_FIELD(u32, st, 0x74);
@@ -80,8 +81,9 @@ void Pokemon::loadFields(void) {
LD_ARRAY(u16, EVs_tmp, 6, 0x98);
for (size_t i = 0; i < 6; ++i) EVs[i] = (u8)((EVs_tmp[i] > 255) ? 255 : EVs_tmp[i]);
LD_ARRAY(u8, IVs, 6, 0xa4);
for (size_t i = 0; i < 6; ++i) IVs[i] = (IVs[i] > 31) ? 31 : IVs[i];
u16 IVs_tmp[6]; // IVs are internally stored as u16
LD_ARRAY(u16, IVs_tmp, 6, 0xa4);
for (size_t i = 0; i < 6; ++i) IVs[i] = (u8)((IVs_tmp[i] > 31) ? 31 : IVs_tmp[i]);
LD_FIELD_CONV(u16, happiness, 0xb0, u8);
@@ -101,8 +103,8 @@ void Pokemon::loadFields(void) {
LD_FIELD(u16, unk1, 0xd4);
LD_FIELD(u16, shadowPkmID, 0xd8);
SV_FIELD_B(u8, obedient, 0xf8);
SV_FIELD(u8, encounterType, 0xfb);
LD_FIELD_B(u8, obedient, 0xf8);
LD_FIELD(u8, encounterType, 0xfb);
markings.load(marksTmp);
for (size_t i = 0; i < 4; ++i)
moves[i].load(data + 0x78 + 4 * i);
@@ -136,8 +138,8 @@ void Pokemon::save(void) {
if (partyData.level > 100) partyData.level = 100;
SV_FIELD(u8, partyData.level, 0x60);
SV_FIELD_E(u16, partyData.status, 0x65, PokemonStatus);
LD_FIELD(s8, partyData.turnsOfSleepRemaining, 0x69);
LD_FIELD(s8, partyData.turnsOfBadPoison, 0x6b);
SV_FIELD(s8, partyData.turnsOfSleepRemaining, 0x69);
SV_FIELD(s8, partyData.turnsOfBadPoison, 0x6b);
SV_FIELD_E(u16, heldItem, 0x88, ItemIndex);
SV_FIELD_MAX(u16, partyData.currentHP, 0x8a, partyData.stats[0]);
@@ -145,8 +147,12 @@ void Pokemon::save(void) {
u16 EVs_tmp[6]; for (size_t i = 0; i < 6; ++i) EVs_tmp[i] = (u16)EVs[i];
SV_ARRAY(u16, EVs_tmp, 6, 0x98);
for (size_t i = 0; i < 6; ++i) IVs[i] = (IVs[i] > 31) ? 31 : IVs[i];
SV_ARRAY(u8, IVs, 6, 0xa4);
u16 IVs_tmp[6];
for (size_t i = 0; i < 6; ++i) {
IVs[i] = (IVs[i] > 31) ? 31 : IVs[i];
IVs_tmp[i] = IVs[i];
}
SV_ARRAY(u16, IVs_tmp, 6, 0xa4);
SV_FIELD(u16, (u16)happiness, 0xb0);
SV_ARRAY(u8, contestStats, 5, 0xb2);
@@ -158,7 +164,7 @@ void Pokemon::save(void) {
SV_FIELD(u8, pkrsStatus, 0xca);
LD_ARRAY_B(u8, pkmFlags, 3, 0xcb);
SV_ARRAY_B(u8, pkmFlags, 3, 0xcb);
SV_FIELD_MAX(u8, GCUnk, 0xce, 31);
SV_FIELD(u8, markings.save(), 0xcf);
SV_FIELD_MAX(s8, partyData.pkrsDaysRemaining, 0xd0, 4);

View File

@@ -46,12 +46,9 @@ Save* Save::create(void) const {
0x6000: SaveSlot saveSlots[3]
*/
void Save::loadFields(void) {
// deleteFields();
saveSlots = new GC::SaveEditing::SaveSlot*[3];
u8* start = data + 0x6000;
/*delete saveSlots[0];
delete saveSlots[1];*/
saveSlots[0] = new SaveSlot(start, _is_decrypted);
saveSlots[1] = new SaveSlot(start + 0x1e000, _is_decrypted);
saveSlots[2] = new SaveSlot(start + 0x1e000*2, _is_decrypted);
@@ -62,6 +59,11 @@ void Save::save(void) {
SV_SUBSTRUCTURE_ARRAY(SaveSlot, saveSlots, 3, 0x6000);
}
void Save::fixBugsAffectingPokemon(void) {
for (size_t i = 0; i < 3; ++i) {
static_cast<SaveSlot*>(saveSlots[i])->fixBugsAffectingPokemon();
}
}
}
}

View File

@@ -210,6 +210,25 @@ bool SaveSlot::isCorrupt(void) {
}
inline void doFixBugsAffectingPokemon(Pokemon* pkm) {
// LibPkmGC <= 1.1.2 : For Pok<6F>mon Colosseum, IVs were loaded/saved as u8's where they were actually u16's. obedient was always set to true, and encounterType to a random value.
std::copy(pkm->data + 0xa4, pkm->data + 0xa4 + 6, pkm->IVs);
pkm->obedient = pkm->species == Mew || pkm->species == Deoxys;
pkm->encounterType = 0;
}
void SaveSlot::fixBugsAffectingPokemon(void) {
for (size_t i = 0; i < 6; ++i)
doFixBugsAffectingPokemon((Pokemon*)player->party[i]);
for (size_t i = 0; i < 3; ++i) {
for (size_t j = 0; j < 30; ++j)
doFixBugsAffectingPokemon((Pokemon*)PC->boxes[i]->pkm[j]);
}
doFixBugsAffectingPokemon((Pokemon*)daycare->pkm);
}
void SaveSlot::loadData(u32 flags) {
bool decrypted = (flags & 1) == 1;

View File

@@ -14,8 +14,8 @@ void VersionInfo::load(u8 lg, u8 gm) {
const LanguageIndex L[] = { NoLanguage, Japanese, English, French, Italian, German, NoLanguage, Spanish };
GameIndex G[16] = { NoGame, Sapphire, Ruby, Emerald, FireRed, LeafGreen }; G[15] = Colosseum_XD;
game = G[(gm > 7) ? 0 : gm];
language = L[(lg > 15) ? 0 : lg];
game = G[(gm > 15) ? 0 : gm];
language = L[(lg > 7) ? 0 : lg];
switch (language){
case Japanese: originalRegion = NTSC_J; break;
@@ -29,7 +29,7 @@ void VersionInfo::load(u8 lg, u8 gm) {
void VersionInfo::save(u8& lg, u8& gm) {
const u8 L[] = { 0, 1, 2, 5, 3, 4, 7 };
u8 G[12] = { 0, 4, 5, 1, 2, 3 }; G[11] = 15;
u8 G[12] = { 0, 4, 5, 0,0,0,0,0, 1, 2, 3 }; G[11] = 15;
game = (game > Colosseum_XD) ? NoGame : game;
language = (language > Spanish) ? NoLanguage : language;
@@ -98,7 +98,7 @@ PokemonStatus pokemonStatusFromBitField(u16 status, s8 * turnsOfBadPoison, s8 *
s8 tobp = 0, tosr = 0;
tosr = (s8)(status & 7);
tobp = (s8)((status >> 8) & 0xf);
if (tobp != 0) ret = Asleep;
if (tosr != 0) ret = Asleep;
status >>= 3;
for (size_t i = 0; i < 5 && ret == NoStatus; ++i) {

View File

@@ -214,7 +214,7 @@ void Pokemon::loadFields(void) {
LD_FIELD_MAX(u32, experience, 36, getSpeciesExpTable(species)[100]);
LD_FIELD(u8, happiness, 41);
LD_FIELD(u16, unk2, 42);
for (size_t i = 0; i < 6; ++i) EVs[i] = data[56 + statsOrder[i]];
for (size_t i = 0; i < 6; ++i) EVs[statsOrder[i]] = data[56 + i];
LD_ARRAY(u8, contestStats, 5, 62);
LD_FIELD(u8, contestLuster, 67);
@@ -272,7 +272,7 @@ void Pokemon::loadFields(void) {
u32 st;
LD_FIELD(u32, st, 80);
pokemonStatusFromBitField((u16)st, &(partyData.turnsOfBadPoison), &(partyData.turnsOfSleepRemaining));
partyData.status = pokemonStatusFromBitField((u16)st, &(partyData.turnsOfBadPoison), &(partyData.turnsOfSleepRemaining));
LD_FIELD_MAX(u8, partyData.level, 84, 100);
LD_FIELD_MAX(s8, partyData.pkrsDaysRemaining, 85, 4);
@@ -343,8 +343,8 @@ void Pokemon::save(void) {
SV_FIELD_MAX(u32, experience, 36, getSpeciesExpTable(species)[100]);
SV_FIELD(u8, happiness, 41);
SV_FIELD(u16, unk2, 42);
for (size_t i = 0; i < 6; ++i) data[56 + statsOrder[i]] = EVs[i];
for (size_t i = 0; i < 6; ++i) data[56 + i] = EVs[statsOrder[i]];
SV_ARRAY(u8, contestStats, 5, 62);
SV_FIELD(u8, contestLuster, 67);

View File

@@ -110,7 +110,7 @@ SaveSlot& SaveSlot::operator=(SaveSlot const& other) {
void SaveSlot::reload(const u8* inData, u32 flags) {
if (inData == NULL) Base::DataStruct::reload(NULL, 1);
else Base::DataStruct::reload(inData, 0);
else Base::DataStruct::reload(inData, flags);
}

View File

@@ -48,8 +48,8 @@ void PlayerData::loadFields(void) {
LD_FIELD_E(u8, trainerGender, 0x8e0, Gender);
if (trainerGender > Female) trainerGender = Male;
LD_FIELD(u32, money, 0x8e4);
LD_FIELD(u32, pkCoupons, 0x8e8);
LD_FIELD_MAX(u32, money, 0x8e4, 9999999);
LD_FIELD_MAX(u32, pkCoupons, 0x8e8, 9999999);
LD_SUBSTRUCTURE_ARRAY(Pokemon, party, 6, 0x30);
LD_SUBSTRUCTURE(BagData, bag, 0x4c8);
@@ -60,8 +60,8 @@ void PlayerData::save(void) {
if (trainerGender > Female) trainerGender = Male;
SV_FIELD_E(u8, trainerGender, 0x8e0, Gender);
SV_FIELD(u32, money, 0x8e4);
SV_FIELD(u32, pkCoupons, 0x8e8);
SV_FIELD_MAX(u32, money, 0x8e4, 9999999);
SV_FIELD_MAX(u32, pkCoupons, 0x8e8, 9999999);
SV_FIELD(u32, pkCoupons, 0x8ec);
SV_SUBSTRUCTURE_ARRAY(Pokemon, party, 6, 0x30);

View File

@@ -180,7 +180,7 @@ void Pokemon::save(void) {
data[0x7d] = (data[0x7d] & 0xf0) | unimplementedRibbons;
SV_ARRAY(u16, partyData.stats, 6, 0x90);
u16 EVs_tmp[6]; for (size_t i = 0; i < 6; ++i) EVs_tmp[i] = (u16)EVs[i];
u16 EVs_tmp[6]; for (size_t i = 0; i < 6; ++i) EVs_tmp[i] = EVs[i];
SV_ARRAY(u16, EVs_tmp, 6, 0x9c);
for (size_t i = 0; i < 6; ++i) IVs[i] = (IVs[i] > 31) ? 31 : IVs[i];
SV_ARRAY(u8, IVs, 6, 0xa8);

View File

@@ -20,6 +20,7 @@
DataUI::DataUI(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f), IDataUI(), mainLayout(new QVBoxLayout),
dialogButtonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)) {
this->setWindowTitle(appName);
connect(dialogButtonBox, SIGNAL(accepted()), this, SLOT(accept()));
connect(dialogButtonBox, SIGNAL(rejected()), this, SLOT(reject()));
}

View File

@@ -19,7 +19,7 @@
#ifndef _PKMGCSAVEEDITOR_GLOBALS_H
#define _PKMGCSAVEEDITOR_GLOBALS_H
#define PKMGCSAVEEDITOR_VERSION 1001000
#define PKMGCSAVEEDITOR_VERSION 1001001
#define PKMGCSAVEEDITOR_VERSION_MAJOR ((PKMGCSAVEEDITOR_VERSION / 1000000) % 1000)
#define PKMGCSAVEEDITOR_VERSION_MINOR ((PKMGCSAVEEDITOR_VERSION / 1000) % 1000)
#define PKMGCSAVEEDITOR_VERSION_BUILD (PKMGCSAVEEDITOR_VERSION % 1000)
@@ -32,6 +32,8 @@
#include <QLocale>
#include <QMap>
const QString appName = QString("PkmGCSaveEditor v%1.%2.%3").arg(PKMGCSAVEEDITOR_VERSION_MAJOR).arg(PKMGCSAVEEDITOR_VERSION_MINOR).arg(PKMGCSAVEEDITOR_VERSION_BUILD);
extern const QMap<QString, size_t> languageCodeToIndexMap;
extern QString currentSaveFileName;

View File

@@ -91,10 +91,11 @@ void ItemPocketEditor::setEditedItem(LibPkmGC::Item const & val){
}
void ItemPocketEditor::updateMaxQuantity(void) {
const int maxqty[] = { 0, 999, 999, 999, 999, 1, 999, 1 };
const int maxqty[] = { 0, 99, 99, 99, 99, 1, 99, 1 };
const int maxqtyPCOrXD[] = { 0, 999, 999, 999, 999, 1, 999, 1 };
ItemCategoryIndex ctgy = getItemCategory(itemNameFld->currentItemIndex(), isXD);
quantityFld->setRange(0, maxqty[ctgy]);
quantityFld->setRange(0, (isXD || flags == GIVABLE_ITEMS_ALLOWED) ? maxqtyPCOrXD[ctgy] : maxqty[ctgy]);
quantityFld->setDisabled(maxqty[ctgy] == 0);
}
void ItemPocketEditor::displayItem(void) {

View File

@@ -421,7 +421,8 @@ void PokemonUI::initWidget(void){
connect(versionFld, SIGNAL(versionChanged()), this, SLOT(versionChangeHandler()));
connect(copyInfoFromSaveButton, SIGNAL(clicked()), this, SLOT(copyInfoFromSave()));
connect(generateShinyIDsButton, SIGNAL(clicked()), this, SLOT(generateShinyIDs()));
connect(autoUpdateMainStatsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(autoUpdateStatsStateChangeHanler()));
connect(autoUpdateMainStatsCheckBox, SIGNAL(stateChanged(int)), this, SLOT(autoUpdateStatsStateChangeHandler()));
connect(mainStatsFlds[0]->statFld, SIGNAL(valueChanged(int)), this, SLOT(updateMainStats()));
connect(contestTypeSelector, SIGNAL(currentIndexChanged(int)), contestAchievementLevelFldsStack, SLOT(setCurrentIndex(int)));
}
@@ -506,13 +507,14 @@ void PokemonUI::parseData(void){
versionFld->setInfo(pkm->version);
connect(versionFld, SIGNAL(versionChanged()), this, SLOT(versionChangeHandler()));
currentHPFld->setUnsignedValue(pkm->partyData.currentHP);
for (size_t i = 0; i < 6; ++i) {
PokemonStatLayout* l = mainStatsFlds[i];
l->IVFld->setUnsignedValue(pkm->IVs[i]);
l->EVFld->setUnsignedValue(pkm->EVs[i]);
l->statFld->setUnsignedValue(pkm->partyData.stats[i]);
}
currentHPFld->setUnsignedValue(pkm->partyData.currentHP);
for (size_t i = 0; i < 5; ++i)
contestAchievementFlds[i]->setCurrentIndex((int)pkm->contestAchievements[i]);
@@ -524,6 +526,7 @@ void PokemonUI::parseData(void){
moveLayouts[i]->setMove(pkm->moves[i]);
autoUpdateMainStatsCheckBox->setChecked(true);
autoUpdateStatsStateChangeHandler();
versionChangeHandler();
abilityFld->setCurrentIndex((pkm->hasSecondAbility()) ? 1 : 0);
@@ -694,9 +697,11 @@ void PokemonUI::updateMainStats(void) {
(u8) levelFld->value(), (u8) l->IVFld->value(), (u8) l->EVFld->value());
l->statFld->setUnsignedValue(stat);
}
//currentHPFld->setUnsignedMaximum(mainStatsFlds[0]->statFld->value());
currentHPFld->setUnsignedValue(mainStatsFlds[0]->statFld->value());
}
currentHPFld->setUnsignedMaximum(mainStatsFlds[0]->statFld->value());
}
void PokemonUI::updatePkmAttributes(void) {
@@ -744,6 +749,7 @@ void PokemonUI::updateExperienceFromLevel(bool proportionally) {
experienceFld->setValue((int)experience);
connect(experienceFld, SIGNAL(valueChanged(int)), this, SLOT(updateLevelFromExperience()));
}
updateMainStats();
}
void PokemonUI::updateLevelFromExperience(void) {
@@ -751,14 +757,16 @@ void PokemonUI::updateLevelFromExperience(void) {
u8 lvl = Pokemon::calculateLevelFromExp(nameIndexToPkmSpeciesIndex((size_t)speciesFld->currentIndex()), (u32)experienceFld->value());
levelFld->disconnect(SIGNAL(valueChanged(int)), this);
levelFld->setValue((int)lvl);
levelFld->setUnsignedValue(lvl);
connect(levelFld, SIGNAL(valueChanged(int)), this, SLOT(updateExperienceFromLevel()));
}
updateMainStats();
}
void PokemonUI::speciesChangeHandler(void) {
updatePkmAttributes();
autoUpdateStatsStateChangeHanler(); // update stats etc...
autoUpdateStatsStateChangeHandler(); // update stats etc...
updateAbilityList();
u32 maxExperience = Pokemon::calculateExpFromLevel(nameIndexToPkmSpeciesIndex((size_t)speciesFld->currentIndex()), 100);
experienceFld->setUnsignedRange(0, maxExperience);
@@ -817,7 +825,7 @@ void PokemonUI::flagsStateChangeHandler(void) {
updatePkmAttributes();
}
void PokemonUI::autoUpdateStatsStateChangeHanler(void) {
void PokemonUI::autoUpdateStatsStateChangeHandler(void) {
bool checked = autoUpdateMainStatsCheckBox->isChecked();
if (checked) updateMainStats();
currentHPFld->setDisabled(checked);

View File

@@ -216,7 +216,7 @@ public slots:
void updateFlags(void);
void flagsStateChangeHandler(void);
void autoUpdateStatsStateChangeHanler(void);
void autoUpdateStatsStateChangeHandler(void);
void versionChangeHandler(void);

View File

@@ -10,9 +10,6 @@
#include <QApplication>
#include <QDir>
const QString appName = QString("PkmGCSaveEditor v%1.%2").arg(PKMGCSAVEEDITOR_VERSION_MAJOR).arg(PKMGCSAVEEDITOR_VERSION_MINOR);
using namespace GCUIs;
using namespace XDUIs;
using namespace LibPkmGC;
@@ -105,7 +102,9 @@ MainWindow::MainWindow() : QMainWindow(), centralWidget(new MWCentralWidget) {
ignoreDataCorruptionAction = new QAction(this);
ignoreDataCorruptionAction->setCheckable(true);
optionsMenu->addAction(ignoreDataCorruptionAction);
bugFixesSubMenu = optionsMenu->addMenu(tr("&Bug fixes"));
colosseumBugsAffectingPokemonAction = new QAction(this);
bugFixesSubMenu->addAction(colosseumBugsAffectingPokemonAction);
setCentralWidget(centralWidget);
@@ -121,11 +120,13 @@ MainWindow::MainWindow() : QMainWindow(), centralWidget(new MWCentralWidget) {
saveFileAction->setDisabled(true);
saveFileAsAction->setDisabled(true);
colosseumBugsAffectingPokemonAction->setDisabled(true);
connect(openFileAction, SIGNAL(triggered()), this, SLOT(openSaveFile()));
connect(saveFileAction, SIGNAL(triggered()), this, SLOT(saveSaveFile()));
connect(saveFileAsAction, SIGNAL(triggered()), this, SLOT(saveSaveFileAs()));
connect(exitAction, SIGNAL(triggered()), this, SLOT(close()));
connect(colosseumBugsAffectingPokemonAction, SIGNAL(triggered()), this, SLOT(fixColosseumBugsAffectingPokemon()));
connect(ignoreDataCorruptionAction, SIGNAL(triggered()), this, SLOT(changeIgnoreDataCorruptionStatus()));
}
@@ -216,7 +217,9 @@ void MainWindow::updateText(void) {
for (QList<QAction*>::iterator it = actions2.begin() + 1; it != actions2.end(); ++it)
(*it)->setText(VersionInfoLayout::languageNames()[(*it)->data().toInt()]);
ignoreDataCorruptionAction->setText(tr("Ignore data corruption"));
bugFixesSubMenu->setTitle(tr("&Bug fixes"));
colosseumBugsAffectingPokemonAction->setText(tr("Bugs affecting &Pok\xc3\xa9mon (Colosseum, PkmGCSaveEditor \xe2\x89\xa4 1.1.0)"));
ignoreDataCorruptionAction->setText(tr("&Ignore data corruption"));
}
@@ -269,6 +272,11 @@ void MainWindow::changeIgnoreDataCorruptionStatus(void) {
ignoreDataCorruption = ignoreDataCorruptionAction->isChecked();
}
void MainWindow::fixColosseumBugsAffectingPokemon(void) {
if (currentSave != NULL) static_cast<Colosseum::SaveEditing::Save*>(currentSave)->fixBugsAffectingPokemon();
else if(currentSaveSlot != NULL) static_cast<Colosseum::SaveEditing::SaveSlot*>(currentSaveSlot)->fixBugsAffectingPokemon();
}
void MainWindow::changeEvent(QEvent* ev) {
if (ev == NULL) return;
switch (ev->type()) {
@@ -388,11 +396,13 @@ void MainWindow::openSaveFile(void) {
this->setWindowTitle(appName);
saveFileAction->setDisabled(true);
saveFileAsAction->setDisabled(true);
colosseumBugsAffectingPokemonAction->setDisabled(true);
}
else {
this->setWindowTitle(appName + " - " + currentSaveFileName);
saveFileAction->setDisabled(false);
saveFileAsAction->setDisabled(false);
colosseumBugsAffectingPokemonAction->setDisabled(!LIBPKMGC_IS_COLOSSEUM(SaveEditing::SaveSlot, currentSaveSlot));
}
centralWidget->currentSaveSlotChangeHandler();
@@ -467,6 +477,13 @@ void MainWindow::loadSettings(void) {
if (interfaceLanguage.isEmpty()) interfaceLanguage = "auto";
if (dumpedNamesLanguage > Spanish) dumpedNamesLanguage = NoLanguage;
if (settings->value("LibPkmGCVersion").toInt() < 1001001 || settings->value("Version").toInt() < 1001001) {
QMessageBox::warning(this, tr("Warning"), tr("You have used a version of PkmGCSaveEditor older than 1.1.1.<br/>Please consider the following points:<ul>"
"<li>If and <b>only</b> if you have modified a <b>Colosseum</b> save file with that previous version, please load this save file again, and click \"Bugs affecting Pok\xc3\xa9mon...\""
"(in \"Options\", \"Bug fixes\"). <b>Do it only once and only once</b> (for each concerned save file).</li>"
"<li>If you have imported or exported a Pok\xc3\xa9mon in the GBA format, please check its status alteration, its EVs, and its game of origin.</li></ul>"));
}
}
void MainWindow::saveSettings(void) {

View File

@@ -75,6 +75,8 @@ public slots:
void changeIgnoreDataCorruptionStatus(void);
void fixColosseumBugsAffectingPokemon(void);
protected:
void closeEvent(QCloseEvent* ev);
@@ -97,6 +99,8 @@ private:
QActionGroup *interfaceLangGroup;
QMenu* dumpedNamesLangSubMenu;
QActionGroup *dumpedNamesLangGroup;
QMenu* bugFixesSubMenu;
QAction* colosseumBugsAffectingPokemonAction;
QAction* ignoreDataCorruptionAction;
QSettings *settings;

View File

@@ -757,49 +757,49 @@
<translation>Ribbons</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="611"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="614"/>
<source>Genderless</source>
<translation>Genderless</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="627"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="630"/>
<source>Unown form: </source>
<translation>Unown form: </translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="632"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="635"/>
<source>will evolve into: </source>
<translation>will evolve into: </translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="644"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="668"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="647"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="671"/>
<source>Invalid version info</source>
<translation>Invalid version info</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="647"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="671"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="650"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="674"/>
<source>&quot;Invalid Pokémon&quot; flag set</source>
<translation>&quot;Invalid Pokémon&quot; flag set</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="832"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="840"/>
<source>Location caught (see &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(Generation_III)&apos;&gt;here&lt;/a&gt;)</source>
<translation>Location caught (see &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(Generation_III)&apos;&gt;here&lt;/a&gt;)</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="834"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="842"/>
<source>Location caught (see &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(GCN)&apos;&gt;here&lt;/a&gt;)</source>
<translation>Location caught (see &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(GCN)&apos;&gt;here&lt;/a&gt;)</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="839"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="847"/>
<source>Warning</source>
<translation>Warning</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="839"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="847"/>
<source>The version info you specified is invalid. The game will therefore consider this Pokémon invalid.</source>
<translation>The version info you specified is invalid. The game will therefore consider this Pokémon invalid.</translation>
</message>
@@ -894,32 +894,32 @@
<context>
<name>MWCentralWidget</name>
<message>
<location filename="../src/MainWindow.cpp" line="47"/>
<location filename="../src/MainWindow.cpp" line="44"/>
<source>Game configuration</source>
<translation>Game configuration</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="48"/>
<location filename="../src/MainWindow.cpp" line="45"/>
<source>Trainer info, Party and Bag</source>
<translation>Trainer info, Party and Bag</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="49"/>
<location filename="../src/MainWindow.cpp" line="46"/>
<source>PC</source>
<translation>PC</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="50"/>
<location filename="../src/MainWindow.cpp" line="47"/>
<source>Daycare</source>
<translation>Daycare</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="51"/>
<location filename="../src/MainWindow.cpp" line="48"/>
<source>Strategy memo</source>
<translation>Strategy memo</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="52"/>
<location filename="../src/MainWindow.cpp" line="49"/>
<source>Purifier</source>
<translation>Purifier</translation>
</message>
@@ -927,147 +927,159 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../src/MainWindow.cpp" line="85"/>
<location filename="../src/MainWindow.cpp" line="197"/>
<location filename="../src/MainWindow.cpp" line="82"/>
<location filename="../src/MainWindow.cpp" line="198"/>
<source>&amp;File</source>
<translation>&amp;File</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="102"/>
<location filename="../src/MainWindow.cpp" line="204"/>
<location filename="../src/MainWindow.cpp" line="99"/>
<location filename="../src/MainWindow.cpp" line="205"/>
<source>&amp;Options</source>
<translation>&amp;Options</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="103"/>
<location filename="../src/MainWindow.cpp" line="205"/>
<location filename="../src/MainWindow.cpp" line="100"/>
<location filename="../src/MainWindow.cpp" line="206"/>
<source>&amp;Interface language</source>
<translation>&amp;Interface language</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="104"/>
<location filename="../src/MainWindow.cpp" line="206"/>
<location filename="../src/MainWindow.cpp" line="101"/>
<location filename="../src/MainWindow.cpp" line="207"/>
<source>&amp;Dumped names language</source>
<translation>&amp;Dumped names language</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="199"/>
<location filename="../src/MainWindow.cpp" line="105"/>
<location filename="../src/MainWindow.cpp" line="220"/>
<source>&amp;Bug fixes</source>
<translation>&amp;Bug fixes</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="200"/>
<source>&amp;Open...</source>
<translation>&amp;Open...</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="200"/>
<location filename="../src/MainWindow.cpp" line="201"/>
<source>&amp;Save</source>
<translation>&amp;Save</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="201"/>
<location filename="../src/MainWindow.cpp" line="202"/>
<source>Save &amp;as...</source>
<translation>Save &amp;as...</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="202"/>
<location filename="../src/MainWindow.cpp" line="203"/>
<source>&amp;Exit</source>
<translation>&amp;Exit</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="210"/>
<location filename="../src/MainWindow.cpp" line="211"/>
<location filename="../src/MainWindow.cpp" line="212"/>
<source>Select &amp;automatically</source>
<translation>Select &amp;automatically</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="219"/>
<source>Ignore data corruption</source>
<translation>Ignore data corruption</translation>
<location filename="../src/MainWindow.cpp" line="221"/>
<source>Bugs affecting &amp;Pokémon (Colosseum, PkmGCSaveEditor 1.1.0)</source>
<translation>Bugs affecting &amp;Pokémon (Colosseum, PkmGCSaveEditor 1.1.0)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="298"/>
<location filename="../src/MainWindow.cpp" line="324"/>
<location filename="../src/MainWindow.cpp" line="441"/>
<location filename="../src/MainWindow.cpp" line="222"/>
<source>&amp;Ignore data corruption</source>
<translation>&amp;Ignore data corruption</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="306"/>
<location filename="../src/MainWindow.cpp" line="332"/>
<location filename="../src/MainWindow.cpp" line="451"/>
<source>GCI save files (*.gci)</source>
<translation>GCI save files (*.gci)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="299"/>
<location filename="../src/MainWindow.cpp" line="325"/>
<location filename="../src/MainWindow.cpp" line="442"/>
<location filename="../src/MainWindow.cpp" line="307"/>
<location filename="../src/MainWindow.cpp" line="333"/>
<location filename="../src/MainWindow.cpp" line="452"/>
<source>Raw save files (*.bin)</source>
<translation>Raw save files (*.bin)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="301"/>
<location filename="../src/MainWindow.cpp" line="309"/>
<source>The save file has been modified.</source>
<translation>The save file has been modified.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="302"/>
<location filename="../src/MainWindow.cpp" line="310"/>
<source>Do you want to save your changes?</source>
<translation>Do you want to save your changes?</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="327"/>
<location filename="../src/MainWindow.cpp" line="335"/>
<source>Could not open file.</source>
<translation>Could not open file.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="328"/>
<location filename="../src/MainWindow.cpp" line="336"/>
<source>An error occured while reading the specified save file.</source>
<translation>An error occured while reading the specified save file.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="331"/>
<location filename="../src/MainWindow.cpp" line="339"/>
<source>Open save file</source>
<translation>Open save file</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="331"/>
<location filename="../src/MainWindow.cpp" line="339"/>
<source>All Files (*)</source>
<translation>All Files (*)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="347"/>
<location filename="../src/MainWindow.cpp" line="353"/>
<location filename="../src/MainWindow.cpp" line="358"/>
<location filename="../src/MainWindow.cpp" line="382"/>
<location filename="../src/MainWindow.cpp" line="421"/>
<location filename="../src/MainWindow.cpp" line="432"/>
<location filename="../src/MainWindow.cpp" line="355"/>
<location filename="../src/MainWindow.cpp" line="361"/>
<location filename="../src/MainWindow.cpp" line="366"/>
<location filename="../src/MainWindow.cpp" line="390"/>
<location filename="../src/MainWindow.cpp" line="431"/>
<location filename="../src/MainWindow.cpp" line="442"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="347"/>
<location filename="../src/MainWindow.cpp" line="355"/>
<source>Invalid file size.</source>
<translation>Invalid file size.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="377"/>
<location filename="../src/MainWindow.cpp" line="379"/>
<location filename="../src/MainWindow.cpp" line="385"/>
<location filename="../src/MainWindow.cpp" line="387"/>
<location filename="../src/MainWindow.cpp" line="481"/>
<source>Warning</source>
<translation>Warning</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="377"/>
<location filename="../src/MainWindow.cpp" line="385"/>
<source>The backup save slot was loaded because the most recent save slot is corrupt.</source>
<translation>The backup save slot was loaded because the most recent save slot is corrupt.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="379"/>
<location filename="../src/MainWindow.cpp" line="387"/>
<source>The second backup save slot was loaded because the other ones are corrupt.</source>
<translation>The second backup save slot was loaded because the other ones are corrupt.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="382"/>
<location filename="../src/MainWindow.cpp" line="390"/>
<source>All save slots are corrupt.</source>
<translation>All save slots are corrupt.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="404"/>
<location filename="../src/MainWindow.cpp" line="414"/>
<source>No save file loaded</source>
<translation>No save file loaded</translation>
</message>
<message numerus="yes">
<location filename="../src/MainWindow.cpp" line="407"/>
<location filename="../src/MainWindow.cpp" line="417"/>
<source>%1, %n save(s)</source>
<translation>
<numerusform>%1, %n save</numerusform>
@@ -1075,35 +1087,40 @@
</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="408"/>
<location filename="../src/MainWindow.cpp" line="418"/>
<source>Colosseum</source>
<translation>Colosseum</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="408"/>
<location filename="../src/MainWindow.cpp" line="418"/>
<source>XD</source>
<translation>XD</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="413"/>
<location filename="../src/MainWindow.cpp" line="423"/>
<source>Could not write to file.</source>
<translation>Could not write to file.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="414"/>
<location filename="../src/MainWindow.cpp" line="424"/>
<source>An error occured while writing to the specified save file.</source>
<translation>An error occured while writing to the specified save file.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="445"/>
<location filename="../src/MainWindow.cpp" line="455"/>
<source>All files (*)</source>
<translation>All files (*)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="446"/>
<location filename="../src/MainWindow.cpp" line="456"/>
<source>Save save file</source>
<translation>Save save file</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="481"/>
<source>You have used a version of PkmGCSaveEditor older than 1.1.1.&lt;br/&gt;Please consider the following points:&lt;ul&gt;&lt;li&gt;If and &lt;b&gt;only&lt;/b&gt; if you have modified a &lt;b&gt;Colosseum&lt;/b&gt; save file with that previous version, please load this save file again, and click &quot;Bugs affecting Pokémon...&quot;(in &quot;Options&quot;, &quot;Bug fixes&quot;). &lt;b&gt;Do it only once and only once&lt;/b&gt; (for each concerned save file).&lt;/li&gt;&lt;li&gt;If you have imported or exported a Pokémon in the GBA format, please check its status alteration, its EVs, and its game of origin.&lt;/li&gt;&lt;/ul&gt;</source>
<translation>You have used a version of PkmGCSaveEditor older than 1.1.1.&lt;br/&gt;Please consider the following points:&lt;ul&gt;&lt;li&gt;If and &lt;b&gt;only&lt;/b&gt; if you have modified a &lt;b&gt;Colosseum&lt;/b&gt; save file with that previous version, please load this save file again, and click &quot;Bugs affecting Pokémon...&quot;(in &quot;Options&quot;, &quot;Bug fixes&quot;). &lt;b&gt;Do it only once and only once&lt;/b&gt; (for each concerned save file).&lt;/li&gt;&lt;li&gt;If you have imported or exported a Pokémon in the GBA format, please check its status alteration, its EVs, and its game of origin.&lt;/li&gt;&lt;/ul&gt;</translation>
</message>
</context>
<context>
<name>TrainerInfoLayout</name>

View File

@@ -757,49 +757,49 @@
<translation>Rubans</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="611"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="614"/>
<source>Genderless</source>
<translation>Asexué</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="627"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="630"/>
<source>Unown form: </source>
<translation>Forme Zarbi : </translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="632"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="635"/>
<source>will evolve into: </source>
<translation>évoluera en : </translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="644"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="668"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="647"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="671"/>
<source>Invalid version info</source>
<translation>Infos de version invalides</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="647"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="671"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="650"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="674"/>
<source>&quot;Invalid Pokémon&quot; flag set</source>
<translation>Drapeau &quot;Pokémon invalide&quot; activé</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="832"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="840"/>
<source>Location caught (see &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(Generation_III)&apos;&gt;here&lt;/a&gt;)</source>
<translation>Lieu de capture (cf. &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(Generation_III)&apos;&gt;Bulbapedia&lt;/a&gt;)</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="834"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="842"/>
<source>Location caught (see &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(GCN)&apos;&gt;here&lt;/a&gt;)</source>
<translation>Lieu de capture (cf. &lt;a href=&apos;http://bulbapedia.bulbagarden.net/wiki/List_of_locations_by_index_number_(GCN)&apos;&gt;Bulbapedia&lt;/a&gt;)</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="839"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="847"/>
<source>Warning</source>
<translation>Avertissement</translation>
</message>
<message>
<location filename="../src/GCUIs/PokemonUI.cpp" line="839"/>
<location filename="../src/GCUIs/PokemonUI.cpp" line="847"/>
<source>The version info you specified is invalid. The game will therefore consider this Pokémon invalid.</source>
<translation>Les informations sur la version du jeu que vous avez entrées sont invalides. Le jeu considérera de ce fait ce Pokémon invalide.</translation>
</message>
@@ -894,32 +894,32 @@
<context>
<name>MWCentralWidget</name>
<message>
<location filename="../src/MainWindow.cpp" line="47"/>
<location filename="../src/MainWindow.cpp" line="44"/>
<source>Game configuration</source>
<translation>Configuration du jeu</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="48"/>
<location filename="../src/MainWindow.cpp" line="45"/>
<source>Trainer info, Party and Bag</source>
<translation>Infos dresseur, Equipe et Sac</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="49"/>
<location filename="../src/MainWindow.cpp" line="46"/>
<source>PC</source>
<translation>PC</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="50"/>
<location filename="../src/MainWindow.cpp" line="47"/>
<source>Daycare</source>
<translation>Pension</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="51"/>
<location filename="../src/MainWindow.cpp" line="48"/>
<source>Strategy memo</source>
<translation>Mémo</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="52"/>
<location filename="../src/MainWindow.cpp" line="49"/>
<source>Purifier</source>
<translation>Purificateur</translation>
</message>
@@ -927,147 +927,159 @@
<context>
<name>MainWindow</name>
<message>
<location filename="../src/MainWindow.cpp" line="85"/>
<location filename="../src/MainWindow.cpp" line="197"/>
<location filename="../src/MainWindow.cpp" line="82"/>
<location filename="../src/MainWindow.cpp" line="198"/>
<source>&amp;File</source>
<translation>&amp;Fichier</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="102"/>
<location filename="../src/MainWindow.cpp" line="204"/>
<location filename="../src/MainWindow.cpp" line="99"/>
<location filename="../src/MainWindow.cpp" line="205"/>
<source>&amp;Options</source>
<translation>&amp;Options</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="103"/>
<location filename="../src/MainWindow.cpp" line="205"/>
<location filename="../src/MainWindow.cpp" line="100"/>
<location filename="../src/MainWindow.cpp" line="206"/>
<source>&amp;Interface language</source>
<translation>Langue de l&apos;&amp;interface</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="104"/>
<location filename="../src/MainWindow.cpp" line="206"/>
<location filename="../src/MainWindow.cpp" line="101"/>
<location filename="../src/MainWindow.cpp" line="207"/>
<source>&amp;Dumped names language</source>
<translation>Langue des noms &amp;extraits</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="199"/>
<location filename="../src/MainWindow.cpp" line="105"/>
<location filename="../src/MainWindow.cpp" line="220"/>
<source>&amp;Bug fixes</source>
<translation>&amp;Correctifs de bugs</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="200"/>
<source>&amp;Open...</source>
<translation>&amp;Ouvrir...</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="200"/>
<location filename="../src/MainWindow.cpp" line="201"/>
<source>&amp;Save</source>
<translation>&amp;Enregistrer</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="201"/>
<location filename="../src/MainWindow.cpp" line="202"/>
<source>Save &amp;as...</source>
<translation>Enregistrer &amp;sous...</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="202"/>
<location filename="../src/MainWindow.cpp" line="203"/>
<source>&amp;Exit</source>
<translation>&amp;Quitter</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="210"/>
<location filename="../src/MainWindow.cpp" line="211"/>
<location filename="../src/MainWindow.cpp" line="212"/>
<source>Select &amp;automatically</source>
<translation>Sélectionner &amp;automatiquement</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="219"/>
<source>Ignore data corruption</source>
<translation>Ignorer la corruption des données</translation>
<location filename="../src/MainWindow.cpp" line="221"/>
<source>Bugs affecting &amp;Pokémon (Colosseum, PkmGCSaveEditor 1.1.0)</source>
<translation>Bugs affectant les &amp;Pokémon (Colosseum, PkmGCSaveEditor 1.1.0)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="298"/>
<location filename="../src/MainWindow.cpp" line="324"/>
<location filename="../src/MainWindow.cpp" line="441"/>
<location filename="../src/MainWindow.cpp" line="222"/>
<source>&amp;Ignore data corruption</source>
<translation>&amp;Ignorer la corruption des données</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="306"/>
<location filename="../src/MainWindow.cpp" line="332"/>
<location filename="../src/MainWindow.cpp" line="451"/>
<source>GCI save files (*.gci)</source>
<translation>Fichiers de sauvegarde GCI (*.gci)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="299"/>
<location filename="../src/MainWindow.cpp" line="325"/>
<location filename="../src/MainWindow.cpp" line="442"/>
<location filename="../src/MainWindow.cpp" line="307"/>
<location filename="../src/MainWindow.cpp" line="333"/>
<location filename="../src/MainWindow.cpp" line="452"/>
<source>Raw save files (*.bin)</source>
<translation>Fichiers de sauvegarde bruts (*.bin)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="301"/>
<location filename="../src/MainWindow.cpp" line="309"/>
<source>The save file has been modified.</source>
<translation>Le fichier de sauvegarde a é modifié.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="302"/>
<location filename="../src/MainWindow.cpp" line="310"/>
<source>Do you want to save your changes?</source>
<translation>Voulez-vous enregistrer vos modifications ?</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="327"/>
<location filename="../src/MainWindow.cpp" line="335"/>
<source>Could not open file.</source>
<translation>Impossible d&apos;ouvrir le fichier.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="328"/>
<location filename="../src/MainWindow.cpp" line="336"/>
<source>An error occured while reading the specified save file.</source>
<translation>Une erreur s&apos;est produite durant la lecture du fichier de sauvegarde.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="331"/>
<location filename="../src/MainWindow.cpp" line="339"/>
<source>Open save file</source>
<translation>Ouvrir fichier de sauvegarde</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="331"/>
<location filename="../src/MainWindow.cpp" line="339"/>
<source>All Files (*)</source>
<translation>Tous les fichiers (*)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="347"/>
<location filename="../src/MainWindow.cpp" line="353"/>
<location filename="../src/MainWindow.cpp" line="358"/>
<location filename="../src/MainWindow.cpp" line="382"/>
<location filename="../src/MainWindow.cpp" line="421"/>
<location filename="../src/MainWindow.cpp" line="432"/>
<location filename="../src/MainWindow.cpp" line="355"/>
<location filename="../src/MainWindow.cpp" line="361"/>
<location filename="../src/MainWindow.cpp" line="366"/>
<location filename="../src/MainWindow.cpp" line="390"/>
<location filename="../src/MainWindow.cpp" line="431"/>
<location filename="../src/MainWindow.cpp" line="442"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="347"/>
<location filename="../src/MainWindow.cpp" line="355"/>
<source>Invalid file size.</source>
<translation>Taille de fichier invalide</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="377"/>
<location filename="../src/MainWindow.cpp" line="379"/>
<location filename="../src/MainWindow.cpp" line="385"/>
<location filename="../src/MainWindow.cpp" line="387"/>
<location filename="../src/MainWindow.cpp" line="481"/>
<source>Warning</source>
<translation>Avertissement</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="377"/>
<location filename="../src/MainWindow.cpp" line="385"/>
<source>The backup save slot was loaded because the most recent save slot is corrupt.</source>
<translation>L&apos;emplacement de sauvegarde de secours a é chargé car l&apos;emplacement le plus récent est corrompu</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="379"/>
<location filename="../src/MainWindow.cpp" line="387"/>
<source>The second backup save slot was loaded because the other ones are corrupt.</source>
<translation>Le deuxième emplacement de sauvegarde de secours a é chargé car l&apos;emplacement le plus récent est corrompu</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="382"/>
<location filename="../src/MainWindow.cpp" line="390"/>
<source>All save slots are corrupt.</source>
<translation>Tous les emplacements de sauvegarde sont corrompus.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="404"/>
<location filename="../src/MainWindow.cpp" line="414"/>
<source>No save file loaded</source>
<translation>Aucune sauvegarde chargée</translation>
</message>
<message numerus="yes">
<location filename="../src/MainWindow.cpp" line="407"/>
<location filename="../src/MainWindow.cpp" line="417"/>
<source>%1, %n save(s)</source>
<translation>
<numerusform>%1, %n sauvegarde</numerusform>
@@ -1075,35 +1087,40 @@
</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="408"/>
<location filename="../src/MainWindow.cpp" line="418"/>
<source>Colosseum</source>
<translation>Colosseum</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="408"/>
<location filename="../src/MainWindow.cpp" line="418"/>
<source>XD</source>
<translation>XD</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="413"/>
<location filename="../src/MainWindow.cpp" line="423"/>
<source>Could not write to file.</source>
<translation>Impossible d&apos;écrire dans le fichier.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="414"/>
<location filename="../src/MainWindow.cpp" line="424"/>
<source>An error occured while writing to the specified save file.</source>
<translation>Une erreur s&apos;est produite pendant l&apos;écriture des données sur le fichier de sauvegarde.</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="445"/>
<location filename="../src/MainWindow.cpp" line="455"/>
<source>All files (*)</source>
<translation>Tous les fichiers (*)</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="446"/>
<location filename="../src/MainWindow.cpp" line="456"/>
<source>Save save file</source>
<translation>Sauvegarder fichier de sauvegarde</translation>
</message>
<message>
<location filename="../src/MainWindow.cpp" line="481"/>
<source>You have used a version of PkmGCSaveEditor older than 1.1.1.&lt;br/&gt;Please consider the following points:&lt;ul&gt;&lt;li&gt;If and &lt;b&gt;only&lt;/b&gt; if you have modified a &lt;b&gt;Colosseum&lt;/b&gt; save file with that previous version, please load this save file again, and click &quot;Bugs affecting Pokémon...&quot;(in &quot;Options&quot;, &quot;Bug fixes&quot;). &lt;b&gt;Do it only once and only once&lt;/b&gt; (for each concerned save file).&lt;/li&gt;&lt;li&gt;If you have imported or exported a Pokémon in the GBA format, please check its status alteration, its EVs, and its game of origin.&lt;/li&gt;&lt;/ul&gt;</source>
<translation>Vous avez utilisé une version de PkmGCSaveEditor plus vielle que la version 1.1.1.&lt;br/&gt;Veuillez considérer les points suivants : &lt;ul&gt;&lt;li&gt;Si et &lt;b&gt;seulement&lt;/b&gt; si vous avez modifié une sauvegarde de &lt;b&gt;Colosseum&lt;/b&gt; avec cette version-là, veuillez charger cette sauvegarde à nouveau, et cliquer sur &quot;Bug affectant les Pokémon ...&quot; (dans &quot;Options&quot;, &quot;Correctifs de bugs&quot;). &lt;b&gt;Ne le faites qu&apos;une et une seule fois&lt;/b&gt; (pour chaque sauvegarde concernée).&lt;&lt;/li&gt;&lt;li&gt;Si vous avez importé ou exporté un Pokémon au format GBA, veulliez vérifier son altération de statut, ses EVs et son jeu d&apos;origine.&lt;/li&gt;&lt;/ul&gt;</translation>
</message>
</context>
<context>
<name>TrainerInfoLayout</name>