diff options
Diffstat (limited to 'src')
45 files changed, 16712 insertions, 125 deletions
diff --git a/src/bard_music.c b/src/bard_music.c index a5514e3f7..a31568475 100644 --- a/src/bard_music.c +++ b/src/bard_music.c @@ -1,4 +1,5 @@ #include "global.h" +#include "easy_chat.h" struct BardSound { @@ -44,12 +45,25 @@ static s16 sub_814A2B8(u32 arg0, u32 arg1) return gUnknown_08417068[arg0][arg1]; } +#if ENGLISH struct BardSound *sub_814A2D0(u16 arg0, u16 arg1) { struct BardSound *sounds = gBardMusicTable[arg0]; return &sounds[arg1]; } +#elif GERMAN +struct BardSound *sub_814A2D0(u16 arg0, u16 arg1) +{ + u32 index; + struct BardSound *sounds; + + sounds = gBardMusicTable[arg0]; + index = de_sub_80EB748(arg0, arg1); + + return &sounds[index]; +} +#endif s32 sub_814A2EC(struct UnkBard2 *dest, struct UnkBard *src, u16 arg2) { diff --git a/src/battle_6.c b/src/battle_6.c index df2419f70..9ea3f240a 100644 --- a/src/battle_6.c +++ b/src/battle_6.c @@ -1,8 +1,27 @@ #include "global.h" #include "battle.h" +#include "battle_interface.h" #include "battle_message.h" +#include "data2.h" #include "menu_cursor.h" +#include "palette.h" +#include "pokemon.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" #include "text.h" +#include "util.h" + +//Possibly PokemonSubstruct1 +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; extern u16 gUnknown_030042A4; extern u16 gUnknown_030042A0; @@ -14,16 +33,42 @@ extern void (*gBattleBankFunc[])(void); extern u8 gActiveBank; extern u8 gActionSelectionCursor[]; extern u8 gDisplayedStringBattle[]; - -extern u16 gUnknown_030042C0; -extern u16 gUnknown_030041B4; -extern u16 gUnknown_03004288; -extern u16 gUnknown_03004280; +extern u8 gMoveSelectionCursor[]; +extern u8 gBattleBufferA[][0x200]; +extern u8 gBankInMenu; +extern u16 gBattlePartyID[]; +extern u8 gHealthboxIDs[]; +extern u8 gDoingBattleAnim; +extern u8 gObjectBankIDs[]; +extern u16 gBattleTypeFlags; +extern u8 gBattleOutcome; +extern void (*gAnimScriptCallback)(void); +extern bool8 gAnimScriptActive; +extern u16 gMovePowerMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 *gDisableStructMoveAnim; +extern u32 gPID_perBank[]; +extern u8 gBattleMonForms[]; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_0202F7C4; +extern u8 gUnknown_02038470[]; extern u16 gUnknown_030041B0; +extern u16 gUnknown_030041B4; extern u16 gUnknown_030041B8; +extern u16 gUnknown_03004280; +extern u16 gUnknown_03004288; +extern u16 gUnknown_030042A4; +extern u16 gUnknown_030042C0; +extern u8 gUnknown_03004344; +extern u8 gUnknown_0300434C[]; extern const u8 gUnknown_08400CA8[]; extern const u8 gUnknown_08400CF3[]; +extern const u8 gUnknown_08400D38[]; #if ENGLISH #define SUB_803037C_TILE_DATA_OFFSET 440 @@ -31,7 +76,952 @@ extern const u8 gUnknown_08400CF3[]; #define SUB_803037C_TILE_DATA_OFFSET 444 #endif -void sub_803037C(void) { +extern void sub_802C68C(void); +extern void sub_802E1B0(void); +extern void sub_802E3B4(); +extern void sub_802E220(); +extern void sub_802E2D4(); +extern void sub_802E004(void); +extern void sub_802DF30(void); +extern void sub_80325B8(void); +extern void PlayerBufferExecCompleted(void); +extern void bx_t1_healthbar_update(void); +extern void nullsub_91(void); +extern void sub_802D924(u8); +extern void sub_802E434(void); +extern bool8 mplay_80342A4(u8); +extern void move_anim_start_t2_for_situation(); +extern void bx_blink_t1(void); +extern void sub_8047858(); +extern u8 GetBankSide(u8); +extern void sub_80E43C0(); +extern void oamt_add_pos2_onto_pos1(); +extern void sub_8078B34(struct Sprite *); +extern void oamt_set_x3A_32(); +extern void sub_80318FC(); +extern bool8 IsDoubleBattle(void); +extern void sub_802D500(void); +extern void dp11b_obj_free(); +extern bool8 sub_8078874(u8); +extern bool8 move_anim_start_t3(); +extern void sub_802E460(void); +extern void b_link_standby_message(void); +extern void sub_802D18C(void); +extern void sub_802DF18(void); +extern void BufferStringBattle(); +extern void sub_80326EC(); +extern void ExecuteMoveAnim(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern u8 sub_8031720(); +extern void bx_wait_t1(void); +extern u8 GetBankByPlayerAI(u8); +extern void sub_802DE10(void); +extern void sub_80105EC(struct Sprite *); +extern void sub_802D274(void); +extern void sub_802D23C(void); +extern u8 GetBankIdentity(u8); +extern void sub_8031AF4(); +extern void sub_80313A0(struct Sprite *); +extern void sub_802D204(void); +extern u8 sub_8079E90(); +extern void sub_802DEAC(void); +extern void sub_80312F0(struct Sprite *); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8046400(); +extern void sub_802D798(void); +extern void bx_0802E404(void); + +u32 dp01_getattr_by_ch1_for_player_pokemon_(u8, u8 *); +void dp01_setattr_by_ch1_for_player_pokemon(u8); +void sub_802F934(u8, u8); +void sub_802FB2C(void); +void sub_8030190(void); +void sub_80304A8(void); +void sub_8030E38(struct Sprite *); +void task05_08033660(u8); +void sub_8031064(void); + +void PlayerHandleGetAttributes(void) +{ + u8 unkData[0x100]; + u32 offset = 0; + u8 r4; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + offset += dp01_getattr_by_ch1_for_player_pokemon_(gBattlePartyID[gActiveBank], unkData); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + offset += dp01_getattr_by_ch1_for_player_pokemon_(i, unkData + offset); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, offset, unkData); + PlayerBufferExecCompleted(); +} + +// Duplicate of dp01_getattr_by_ch1_for_player_pokemon +u32 dp01_getattr_by_ch1_for_player_pokemon_(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void sub_802ECF0(void) +{ + struct BattlePokemon battleMon; // I think this is a BattlePokemon + u8 *src = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 *dst = (u8 *)&battleMon + gBattleBufferA[gActiveBank][1]; + u8 i; + + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = src[i]; + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, gBattleBufferA[gActiveBank][2], dst); + PlayerBufferExecCompleted(); +} + +void PlayerHandleSetAttributes(void) +{ + u8 r4; + u8 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + dp01_setattr_by_ch1_for_player_pokemon(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + dp01_setattr_by_ch1_for_player_pokemon(i); + r4 >>= 1; + } + } + PlayerBufferExecCompleted(); +} + +// Duplicate of sub_811EC68 +void dp01_setattr_by_ch1_for_player_pokemon(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +} + +void sub_802F7CC(void) +{ + u8 *dst = (u8 *)&gPlayerParty[gBattlePartyID[gActiveBank]] + gBattleBufferA[gActiveBank][1]; + u8 i; + + for (i = 0; i < gBattleBufferA[gActiveBank][2]; i++) + dst[i] = gBattleBufferA[gActiveBank][3 + i]; + PlayerBufferExecCompleted(); +} + +void PlayerHandleLoadPokeSprite(void) +{ + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gBattleBankFunc[gActiveBank] = bx_0802E404; +} + +void PlayerHandleSendOutPoke(void) +{ + sub_8032AA8(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattlePartyID[gActiveBank] = gBattleBufferA[gActiveBank][1]; + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + gActionSelectionCursor[gActiveBank] = 0; + gMoveSelectionCursor[gActiveBank] = 0; + sub_802F934(gActiveBank, gBattleBufferA[gActiveBank][2]); + gBattleBankFunc[gActiveBank] = sub_802D798; +} + +void sub_802F934(u8 bank, u8 b) +{ + u16 species; + + sub_8032AA8(bank, b); + gBattlePartyID[bank] = gBattleBufferA[bank][1]; + species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); + gObjectBankIDs[bank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(bank, 2), + sub_8077F68(bank), + sub_8079E90(bank)); + gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; + gSprites[gObjectBankIDs[bank]].data0 = bank; + gSprites[gObjectBankIDs[bank]].data2 = species; + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + gSprites[gObjectBankIDs[bank]].invisible = TRUE; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); +} + +void PlayerHandleReturnPokeToBall(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_802FB2C; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + PlayerBufferExecCompleted(); + } +} + +void sub_802FB2C(void) +{ + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (!ewram17810[gActiveBank].unk0_6) + { + ewram17810[gActiveBank].unk4 = 0; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); + gBattleBankFunc[gActiveBank] = sub_802DEAC; + } + } +} + +void PlayerHandleTrainerThrow(void) +{ + s16 r7; + + if (gBattleTypeFlags & BATTLE_TYPE_MULTI) + { + if (GetBankIdentity(gActiveBank) & 2) + r7 = 16; + else + r7 = -16; + } + else + { + r7 = 0; + } + sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); + GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + r7 + 80, + (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, + sub_8079E90(gActiveBank)); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_802D204; +} + +void PlayerHandleTrainerSlide(void) +{ + sub_8031AF4(gSaveBlock2.playerGender, gActiveBank); + GetMonSpriteTemplate_803C5A0(gSaveBlock2.playerGender, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80, + (8 - gTrainerBackPicCoords[gSaveBlock2.playerGender].coords) * 4 + 80, + 30); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; + gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_802D23C; +} + +void PlayerHandleTrainerSlideBack(void) +{ + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], SpriteCallbackDummy); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + gBattleBankFunc[gActiveBank] = sub_802D274; +} + +void sub_802FE7C(void) +{ + if (ewram17810[gActiveBank].unk4 == 0) + { + if (ewram17800[gActiveBank].unk0_2) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4++; + } + else + { + if (ewram17810[gActiveBank].unk0_6 == 0) + { + ewram17810[gActiveBank].unk4 = 0; + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + PlaySE12WithPanning(SE_POKE_DEAD, -64); + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + gSprites[gObjectBankIDs[gActiveBank]].data2 = 5; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80105EC; + gBattleBankFunc[gActiveBank] = sub_802DE10; + } + } +} + +void sub_802FF60(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); + PlayerBufferExecCompleted(); +} + +void sub_802FF80(void) +{ + ewram17840.unk8 = 4; + gDoingBattleAnim = 1; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + gBattleBankFunc[gActiveBank] = bx_wait_t1; +} + +void PlayerHandleBallThrow(void) +{ + u8 var = gBattleBufferA[gActiveBank][1]; + + ewram17840.unk8 = var; + gDoingBattleAnim = 1; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 3); + gBattleBankFunc[gActiveBank] = bx_wait_t1; +} + +void PlayerHandlePuase(void) +{ + u8 var = gBattleBufferA[gActiveBank][1]; + + // WTF is this?? + while (var != 0) + var--; + + PlayerBufferExecCompleted(); +} + +void PlayerHandleMoveAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + { + // Dead code. sub_8031720 always returns 0. + PlayerBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_8030190; + } + } +} + +void sub_8030190(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + u8 r7 = gBattleBufferA[gActiveBank][11]; + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 == 1 && ewram17800[gActiveBank].unk0_3 == 0) + { + ewram17800[gActiveBank].unk0_3 = 1; + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + } + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if (ewram17800[gActiveBank].unk0_2 == 1 && r7 < 2) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17800[gActiveBank].unk0_3 = 0; + } + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_8031F24(); + sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + PlayerBufferExecCompleted(); + } + break; + } +} + +void PlayerHandlePrintString(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + BufferStringBattle(*(u16 *)&gBattleBufferA[gActiveBank][2]); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); + gBattleBankFunc[gActiveBank] = sub_802DF18; +} + +void PlayerHandlePrintStringPlayerOnly(void) +{ + if (GetBankSide(gActiveBank) == 0) + PlayerHandlePrintString(); + else + PlayerBufferExecCompleted(); +} + +void sub_803037C(void) +{ int r4; gUnknown_030042A4 = 0; @@ -46,9 +1036,7 @@ void sub_803037C(void) { sub_814A5C0(0, 0xFFFF, 12, 11679, 0); for (r4 = 0; r4 < 4; r4++) - { nullsub_8(r4); - } sub_802E3E4(gActionSelectionCursor[gActiveBank], 0); @@ -56,3 +1044,464 @@ void sub_803037C(void) { InitWindow(&gUnknown_03004210, gDisplayedStringBattle, SUB_803037C_TILE_DATA_OFFSET, 2, 35); sub_8002F44(&gUnknown_03004210); } + +void nullsub_42() +{ +} + +void sub_8030468(void) +{ + sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); + sub_80304A8(); + gBattleBankFunc[gActiveBank] = sub_802C68C; +} + +void sub_80304A8(void) +{ + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 320; + sub_802E1B0(); + gUnknown_03004344 = 0xFF; + sub_802E3B4(gMoveSelectionCursor[gActiveBank], 0); + if (gBattleBufferA[gActiveBank][2] != 1) + { + InitWindow(&gUnknown_03004210, gUnknown_08400D38, 656, 23, 55); + sub_8002F44(&gUnknown_03004210); + } + sub_802E220(); + sub_802E2D4(); +} + +void PlayerHandleOpenBag(void) +{ + s32 i; + + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleBankFunc[gActiveBank] = sub_802E004; + gBankInMenu = gActiveBank; + for (i = 0; i < 3; i++) + gUnknown_02038470[i] = gBattleBufferA[gActiveBank][1 + i]; +} + +void sub_8030594(void) +{ + s32 i; + + gUnknown_0300434C[gActiveBank] = CreateTask(TaskDummy, 0xFF); + gTasks[gUnknown_0300434C[gActiveBank]].data[0] = gBattleBufferA[gActiveBank][1] & 0xF; + ewram[0x16054] = gBattleBufferA[gActiveBank][1] >> 4; + ewram[0x1609D] = gBattleBufferA[gActiveBank][2]; + ewram[0x160C0] = gBattleBufferA[gActiveBank][3]; + for (i = 0; i < 3; i++) + gUnknown_02038470[i] = gBattleBufferA[gActiveBank][4 + i]; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleBankFunc[gActiveBank] = sub_802DF30; + gBankInMenu = gActiveBank; +} + +void sub_8030674(void) +{ + sub_80325B8(); + BeginNormalPaletteFade(0xFFFFFFFF, 2, 0, 16, 0); + PlayerBufferExecCompleted(); +} + +void PlayerHandleHealthBarUpdate(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); + } + else + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); + } + gBattleBankFunc[gActiveBank] = bx_t1_healthbar_update; +} + +void PlayerHandleExpBarUpdate(void) +{ + u8 r7 = gBattleBufferA[gActiveBank][1]; + + if (GetMonData(&gPlayerParty[r7], MON_DATA_LEVEL) >= 100) + { + PlayerBufferExecCompleted(); + } + else + { + u16 r4; + u8 taskId; + + load_gfxc_health_bar(1); + GetMonData(&gPlayerParty[r7], MON_DATA_SPECIES); // unused return value + r4 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + taskId = CreateTask(sub_802D924, 10); + gTasks[taskId].data[0] = r7; + gTasks[taskId].data[1] = r4; + gTasks[taskId].data[2] = gActiveBank; + gBattleBankFunc[gActiveBank] = nullsub_91; + } +} + +void PlayerHandleStatusIconUpdate(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 9); + ewram17810[gActiveBank].unk0_4 = 0; + gBattleBankFunc[gActiveBank] = sub_802E434; + } +} + +void PlayerHandleStatusAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + move_anim_start_t2_for_situation( + gBattleBufferA[gActiveBank][1], + gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8) | (gBattleBufferA[gActiveBank][4] << 16) | (gBattleBufferA[gActiveBank][5] << 24)); + gBattleBankFunc[gActiveBank] = sub_802E434; + } +} + +void PlayerHandleStatusXor(void) +{ + u8 val = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS) ^ gBattleBufferA[gActiveBank][1]; + + SetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_STATUS, &val); + PlayerBufferExecCompleted(); +} + +void sub_803097C(void) +{ + PlayerBufferExecCompleted(); +} + +void PlayerHandleDMATransfer(void) +{ + u32 val1 = gBattleBufferA[gActiveBank][1] + | (gBattleBufferA[gActiveBank][2] << 8) + | (gBattleBufferA[gActiveBank][3] << 16) + | (gBattleBufferA[gActiveBank][4] << 24); + u16 val2 = gBattleBufferA[gActiveBank][5] | (gBattleBufferA[gActiveBank][6] << 8); + + const u8 *src = &gBattleBufferA[gActiveBank][7]; + u8 *dst = (u8 *)val1; + u32 size = val2; + + while (1) + { + if (size <= 0x1000) + { + DmaCopy16(3, src, dst, size); + break; + } + DmaCopy16(3, src, dst, 0x1000); + src += 0x1000; + dst += 0x1000; + size -= 0x1000; + } + PlayerBufferExecCompleted(); +} + +void sub_8030A3C(void) +{ + PlayBGM(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + PlayerBufferExecCompleted(); +} + +void sub_8030A6C(void) +{ + PlayerBufferExecCompleted(); +} + +void sub_8030A78(void) +{ + dp01_build_cmdbuf_x21_a_bb(1, 0, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030A8C(void) +{ + dp01_build_cmdbuf_x22_a_three_bytes(1, 0, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030AA0(void) +{ + dp01_build_cmdbuf_x23_aa_0(1, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030AB4(void) +{ + dp01_build_cmdbuf_x24_aa_0(1, 0); + PlayerBufferExecCompleted(); +} + +void sub_8030AC8(void) +{ + gUnknown_020238C8.unk0_0 = 0; + PlayerBufferExecCompleted(); +} + +void sub_8030AE4(void) +{ + gUnknown_020238C8.unk0_0 = gBattleBufferA[gActiveBank][1]; + PlayerBufferExecCompleted(); +} + +void sub_8030B1C(void) +{ + gUnknown_020238C8.unk0_7 = 0; + PlayerBufferExecCompleted(); +} + +void sub_8030B34(void) +{ + gUnknown_020238C8.unk0_7 ^= 1; + PlayerBufferExecCompleted(); +} + +void PlayerHandleHitAnimation(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + PlayerBufferExecCompleted(); + } + else + { + gDoingBattleAnim = 1; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = bx_blink_t1; + } +} + +void sub_8030BCC(void) +{ + PlayerBufferExecCompleted(); +} + +void PlayerHandleEffectivenessSound(void) +{ + s8 pan; + + if (GetBankSide(gActiveBank) == 0) + pan = -64; + else + pan = 63; + PlaySE12WithPanning(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8), pan); + PlayerBufferExecCompleted(); +} + +void sub_8030C1C(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + PlayerBufferExecCompleted(); +} + +void PlayerHandleFaintingCry(void) +{ + u16 species = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES); + + PlayCry3(species, -25, 5); + PlayerBufferExecCompleted(); +} + +void PlayerHandleIntroSlide(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + PlayerBufferExecCompleted(); +} + +void PlayerHandleTrainerBallThrow(void) +{ + u8 paletteNum; + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + paletteNum = AllocSpritePalette(0xD6F8); + LoadCompressedPalette(gTrainerBackPicPaletteTable[gSaveBlock2.playerGender].data, 0x100 + paletteNum * 16, 32); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; + taskId = CreateTask(task05_08033660, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17810[4].unk9 |= 1; + gBattleBankFunc[gActiveBank] = nullsub_91; +} + +void sub_8030E38(struct Sprite *sprite) +{ + u8 r4 = sprite->data5; + + FreeSpriteOamMatrix(sprite); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + DestroySprite(sprite); + sub_80318FC(&gPlayerParty[gBattlePartyID[r4]], r4); + StartSpriteAnim(&gSprites[gObjectBankIDs[r4]], 0); +} + +void task05_08033660(u8 taskId) +{ + if (gTasks[taskId].data[1] < 31) + { + gTasks[taskId].data[1]++; + } + else + { + u8 savedActiveBank = gActiveBank; + + gActiveBank = gTasks[taskId].data[0]; + if (!IsDoubleBattle() || (gBattleTypeFlags & 0x40)) + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_802F934(gActiveBank, 0); + } + else + { + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_802F934(gActiveBank, 0); + gActiveBank ^= 2; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_80318FC(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + sub_802F934(gActiveBank, 0); + gActiveBank ^= 2; + } + gBattleBankFunc[gActiveBank] = sub_802D500; + gActiveBank = savedActiveBank; + DestroyTask(taskId); + } +} + +void sub_8030FAC(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + PlayerBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk0_0 = 1; + gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); + ewram17810[gActiveBank].unk5 = 0; + if (gBattleBufferA[gActiveBank][2] != 0) + ewram17810[gActiveBank].unk5 = 0x5D; + gBattleBankFunc[gActiveBank] = sub_8031064; + } +} + +void sub_8031064(void) +{ + if (ewram17810[gActiveBank].unk5++ > 0x5C) + { + ewram17810[gActiveBank].unk5 = 0; + PlayerBufferExecCompleted(); + } +} + +void sub_80310A4(void) +{ + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + PlayerBufferExecCompleted(); +} + +void sub_80310F0(void) +{ + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + PlayerBufferExecCompleted(); +} + +void PlayerHandleSpriteInvisibility(void) +{ + if (sub_8078874(gActiveBank)) + { + gSprites[gObjectBankIDs[gActiveBank]].invisible = gBattleBufferA[gActiveBank][1]; + sub_8031F88(gActiveBank); + } + PlayerBufferExecCompleted(); +} + +void PlayerHandleBattleAnimation(void) +{ + if (!mplay_80342A4(gActiveBank)) + { + u8 val2 = gBattleBufferA[gActiveBank][1]; + u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) + PlayerBufferExecCompleted(); + else + gBattleBankFunc[gActiveBank] = sub_802E460; + } +} + +void PlayerHandleLinkStandbyMsg(void) +{ + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + b_link_standby_message(); + // fall through + case 1: + dp11b_obj_free(gActiveBank, 1); + dp11b_obj_free(gActiveBank, 0); + break; + case 2: + b_link_standby_message(); + break; + } + PlayerBufferExecCompleted(); +} + +void PlayerHandleResetActionMoveSelection(void) +{ + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + gActionSelectionCursor[gActiveBank] = 0; + gMoveSelectionCursor[gActiveBank] = 0; + break; + case 1: + gActionSelectionCursor[gActiveBank] = 0; + break; + case 2: + gMoveSelectionCursor[gActiveBank] = 0; + break; + } + PlayerBufferExecCompleted(); +} + +void sub_80312A0(void) +{ + gBattleOutcome = gBattleBufferA[gActiveBank][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + PlayerBufferExecCompleted(); + gBattleBankFunc[gActiveBank] = sub_802D18C; +} + +void nullsub_43(void) +{ +} diff --git a/src/battle_811DA74.c b/src/battle_811DA74.c index 743dd2554..42c700844 100644 --- a/src/battle_811DA74.c +++ b/src/battle_811DA74.c @@ -35,15 +35,7 @@ struct UnknownStruct3 u8 ppBonuses; }; -struct UnknownStruct5 -{ - u8 unk0_0:7; - u8 unk0_7:1; -}; - extern u16 gBattleTypeFlags; - -extern struct UnknownStruct5 gUnknown_020238C8; extern u8 gDisplayedStringBattle[]; extern u8 gBattleBufferA[][0x200]; extern u8 gActiveBank; @@ -433,6 +425,7 @@ void LinkPartnerHandleGetAttributes(void) LinkPartnerBufferExecCompleted(); } +// Duplicate of dp01_getattr_by_ch1_for_player_pokemon_ u32 dp01_getattr_by_ch1_for_player_pokemon(u8 a, u8 *buffer) { struct BattlePokemon battlePokemon; @@ -765,6 +758,7 @@ void LinkPartnerHandleSetAttributes(void) LinkPartnerBufferExecCompleted(); } +// Duplicate of dp01_setattr_by_ch1_for_player_pokemon void sub_811EC68(u8 a) { struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; diff --git a/src/battle_anim_8137220.c b/src/battle_anim_8137220.c new file mode 100644 index 000000000..42d6cb8da --- /dev/null +++ b/src/battle_anim_8137220.c @@ -0,0 +1,1486 @@ +#include "global.h" +#include "battle.h" +#include "battle_interface.h" +#include "battle_message.h" +#include "data2.h" +#include "link.h" +#include "main.h" +#include "menu_cursor.h" +#include "palette.h" +#include "pokemon.h" +#include "rom3.h" +#include "songs.h" +#include "sound.h" +#include "sprite.h" +#include "string_util.h" +#include "task.h" +#include "text.h" +#include "util.h" + +//Possibly PokemonSubstruct1 +struct UnknownStruct3 +{ + u16 moves[4]; + u8 pp[4]; + u8 ppBonuses; +}; + +extern u8 gActiveBank; +extern void (*gBattleBankFunc[])(void); +extern u32 gBattleExecBuffer; +extern void (*gWallyBufferCommands[])(void); +extern u8 gBattleBufferA[][0x200]; +extern u8 gObjectBankIDs[]; +extern MainCallback gPreBattleCallback1; +extern bool8 gDoingBattleAnim; +extern u16 gScriptItemId; +extern u16 gBattlePartyID[]; +extern u8 gHealthboxIDs[]; +extern u16 gBattleTypeFlags; +extern u16 gMovePowerMoveAnim; +extern u32 gMoveDmgMoveAnim; +extern u8 gHappinessMoveAnim; +extern u16 gWeatherMoveAnim; +extern u32 *gDisableStructMoveAnim; +extern u32 gPID_perBank[]; +extern void (*gAnimScriptCallback)(void); +extern bool8 gAnimScriptActive; +extern u8 gDisplayedStringBattle[]; +extern u8 gBankInMenu; +extern u8 gBattleMonForms[]; +extern u8 gBattleOutcome; +extern u16 gUnknown_02024DE8; +extern u8 gUnknown_02024E68[]; +extern struct SpriteTemplate gUnknown_02024E8C; +extern u8 gUnknown_0202F7C4; +extern struct Window gUnknown_03004210; +extern u16 gUnknown_030042A0; +extern u16 gUnknown_030042A4; +extern u8 gUnknown_0300434C[]; +extern const u8 gUnknown_08400CCC[]; +extern const u8 gUnknown_08400CF3[]; + +// TODO: include rom3.h when my other PR gets merged +extern void dp01_build_cmdbuf_x21_a_bb(u8, u8, u16); +extern void dp01_build_cmdbuf_x23_aa_0(u8, u16); + +extern void nullsub_14(void); +extern void PrepareBagForWallyTutorial(void); +extern void sub_8141828(); +extern void sub_8045A5C(); +extern void sub_804777C(); +extern void sub_8043DFC(); +extern bool8 IsDoubleBattle(void); +extern void c3_0802FDF4(u8); +extern void sub_802ECF0(void); +extern void sub_8031AF4(); +extern u8 GetBankIdentity(u8); +extern void sub_80313A0(struct Sprite *); +extern u8 GetBankByPlayerAI(u8); +extern u8 sub_8031720(); +extern void ExecuteMoveAnim(); +extern void sub_80326EC(); +extern void sub_8031F24(void); +extern void sub_80324BC(); +extern void BufferStringBattle(); +extern u8 GetBankSide(u8); +extern void sub_80304A8(void); +extern void sub_8047858(); +extern void sub_80E43C0(); +extern void oamt_add_pos2_onto_pos1(); +extern void sub_8078B34(struct Sprite *); +extern void sub_8030E38(struct Sprite *); +extern void oamt_set_x3A_32(); +extern u8 sub_8046400(); +extern u8 sub_8077ABC(); +extern u8 sub_8077F68(); +extern u8 sub_8079E90(); +extern void sub_80312F0(struct Sprite *); +extern bool8 move_anim_start_t3(); + +void WallyBufferRunCommand(void); +void sub_81374FC(void); +void sub_81376B8(void); +void WallyBufferExecCompleted(void); +u32 sub_8137A84(u8, u8 *); +void sub_8138294(u8); +void sub_81390D0(void); +void sub_8139A2C(u8); + +void unref_sub_8137220(void) +{ +} + +void SetBankFuncToWallyBufferRunCommand(void) +{ + gBattleBankFunc[gActiveBank] = WallyBufferRunCommand; + ewram[0x160A8] = 0; + ewram[0x160A9] = 0; + ewram[0x160AA] = 0; + ewram[0x160AB] = 0; +} + +void WallyBufferRunCommand(void) +{ + if (gBattleExecBuffer & gBitTable[gActiveBank]) + { + if (gBattleBufferA[gActiveBank][0] < 0x39) + gWallyBufferCommands[gBattleBufferA[gActiveBank][0]](); + else + WallyBufferExecCompleted(); + } +} + +void sub_81372BC(void) +{ + u8 r4; + + switch (ewram[0x160A8]) + { + case 0: + ewram[0x160AA] = 64; + ewram[0x160A8]++; + // fall through + case 1: + r4 = --ewram[0x160AA]; + if (r4 == 0) + { + PlaySE(SE_SELECT); + dp01_build_cmdbuf_x21_a_bb(1, 0, 0); + WallyBufferExecCompleted(); + ewram[0x160A8]++; + ewram[0x160A9] = r4; + ewram[0x160AA] = 64; + } + break; + case 2: + r4 = --ewram[0x160AA]; + if (r4 == 0) + { + PlaySE(SE_SELECT); + dp01_build_cmdbuf_x21_a_bb(1, 0, 0); + WallyBufferExecCompleted(); + ewram[0x160A8]++; + ewram[0x160A9] = r4; + ewram[0x160AA] = 64; + } + break; + case 3: + r4 = --ewram[0x160AA]; + if (r4 == 0) + { + dp01_build_cmdbuf_x21_a_bb(1, 9, 0); + WallyBufferExecCompleted(); + ewram[0x160A8]++; + ewram[0x160A9] = r4; + ewram[0x160AA] = 64; + } + break; + case 4: + if (--ewram[0x160AA] == 0) + { + PlaySE(SE_SELECT); + nullsub_8(0); + sub_802E3E4(1, 0); + ewram[0x160AA] = 64; + ewram[0x160A8]++; + } + break; + case 5: + if (--ewram[0x160AA] == 0) + { + PlaySE(SE_SELECT); + DestroyMenuCursor(); + dp01_build_cmdbuf_x21_a_bb(1, 1, 0); + WallyBufferExecCompleted(); + } + break; + } +} + +void sub_813741C(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + WallyBufferExecCompleted(); +} + +void sub_8137454(void) +{ + if (gUnknown_03004210.state == 0) + WallyBufferExecCompleted(); +} + +void sub_813746C(void) +{ + if (!gPaletteFade.active) + { + gMain.inBattle = FALSE; + gMain.callback1 = gPreBattleCallback1; + SetMainCallback2(gMain.savedCallback); + } +} + +void bx_wait_t5(void) +{ + if (!gDoingBattleAnim) + WallyBufferExecCompleted(); +} + +void sub_81374C4(void) +{ + if (!gPaletteFade.active) + { + gBattleBankFunc[gActiveBank] = sub_81374FC; + nullsub_14(); + PrepareBagForWallyTutorial(); + } +} + +void sub_81374FC(void) +{ + if (gMain.callback2 == sub_800F808 + && !gPaletteFade.active) + { + dp01_build_cmdbuf_x23_aa_0(1, gScriptItemId); + WallyBufferExecCompleted(); + } +} + +void sub_8137538(void) +{ + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank].unk0_7) + sub_8141828(gActiveBank, &gPlayerParty[gBattlePartyID[gActiveBank]]); + + if (!ewram17810[gActiveBank ^ 2].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_7) + sub_8141828(gActiveBank ^ 2, &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]]); + + if (!ewram17810[gActiveBank].unk0_3 && !ewram17810[gActiveBank ^ 2].unk0_3) + { + if (IsDoubleBattle() && !(gBattleTypeFlags & BATTLE_TYPE_MULTI)) + { + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank ^ 2]]); + sub_8045A5C(gHealthboxIDs[gActiveBank ^ 2], &gPlayerParty[gBattlePartyID[gActiveBank ^ 2]], 0); + sub_804777C(gActiveBank ^ 2); + sub_8043DFC(gHealthboxIDs[gActiveBank ^ 2]); + } + DestroySprite(&gSprites[gUnknown_0300434C[gActiveBank]]); + sub_8045A5C(gHealthboxIDs[gActiveBank], &gPlayerParty[gBattlePartyID[gActiveBank]], 0); + sub_804777C(gActiveBank); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + ewram17840.unk9_0 = 0; + gBattleBankFunc[gActiveBank] = sub_81376B8; + } +} + +void sub_81376B8(void) +{ + bool8 r4 = FALSE; + + if (gSprites[gHealthboxIDs[gActiveBank]].callback == SpriteCallbackDummy) + r4 = TRUE; + if (r4 && ewram17810[gActiveBank].unk1_0 && ewram17810[gActiveBank ^ 2].unk1_0) + { + ewram17810[gActiveBank].unk0_7 = 0; + ewram17810[gActiveBank].unk1_0 = 0; + ewram17810[gActiveBank ^ 2].unk0_7 = 0; + ewram17810[gActiveBank ^ 2].unk1_0 = 0; + FreeSpriteTilesByTag(0x27F9); + FreeSpritePaletteByTag(0x27F9); + CreateTask(c3_0802FDF4, 10); + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + WallyBufferExecCompleted(); + } +} + +void sub_81377B0(void) +{ + s16 r4; + + r4 = sub_8045C78(gActiveBank, gHealthboxIDs[gActiveBank], 0, 0); + sub_8043DFC(gHealthboxIDs[gActiveBank]); + if (r4 != -1) + { + sub_80440EC(gHealthboxIDs[gActiveBank], r4, 0); + } + else + { + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); + WallyBufferExecCompleted(); + } +} + +void bx_blink_t5(void) +{ + u8 spriteId = gObjectBankIDs[gActiveBank]; + + if (gSprites[spriteId].data1 == 32) + { + gSprites[spriteId].data1 = 0; + gSprites[spriteId].invisible = FALSE; + gDoingBattleAnim = FALSE; + WallyBufferExecCompleted(); + } + else + { + if (((u16)gSprites[spriteId].data1 % 4) == 0) + gSprites[spriteId].invisible ^= 1; + gSprites[spriteId].data1++; + } +} + +void sub_813789C(void) +{ + if (!ewram17810[gActiveBank].unk0_6) + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + WallyBufferExecCompleted(); + } +} + +// Duplicate of sub_813741C +void sub_8137908(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].callback == SpriteCallbackDummy) + WallyBufferExecCompleted(); +} + +void sub_8137940(void) +{ + if (!ewram17810[gActiveBank].unk0_5) + WallyBufferExecCompleted(); +} + +void WallyBufferExecCompleted(void) +{ + gBattleBankFunc[gActiveBank] = WallyBufferRunCommand; + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + u8 multiplayerId = GetMultiplayerId(); + + dp01_prepare_buffer_wireless_probably(2, 4, &multiplayerId); + gBattleBufferA[gActiveBank][0] = 0x38; + } + else + { + gBattleExecBuffer &= ~gBitTable[gActiveBank]; + } +} + +void unref_sub_81379E4(void) +{ + if (!ewram17810[gActiveBank].unk0_4) + WallyBufferExecCompleted(); +} + +void dp01t_00_5_getattr(void) +{ + u8 arr[0x100]; + u32 r6 = 0; + u8 r4; + s32 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + r6 = sub_8137A84(gBattlePartyID[gActiveBank], arr); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + r6 += sub_8137A84(i, arr + r6); + r4 >>= 1; + } + } + dp01_build_cmdbuf_x1D_1D_numargs_varargs(1, r6, arr); + WallyBufferExecCompleted(); +} + +u32 sub_8137A84(u8 a, u8 *buffer) +{ + struct BattlePokemon battlePokemon; + struct UnknownStruct3 moveData; + u8 nickname[20]; + u8 *src; + s16 data16; + u32 data32; + s32 size = 0; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + battlePokemon.species = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + battlePokemon.item = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + for (size = 0; size < 4; size++) + { + battlePokemon.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + battlePokemon.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + battlePokemon.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + battlePokemon.friendship = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + battlePokemon.experience = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + battlePokemon.hpIV = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + battlePokemon.attackIV = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + battlePokemon.defenseIV = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + battlePokemon.speedIV = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + battlePokemon.spAttackIV = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + battlePokemon.spDefenseIV = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + battlePokemon.personality = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + battlePokemon.status1 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + battlePokemon.level = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + battlePokemon.hp = GetMonData(&gPlayerParty[a], MON_DATA_HP); + battlePokemon.maxHP = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + battlePokemon.attack = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + battlePokemon.defense = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + battlePokemon.speed = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + battlePokemon.spAttack = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + battlePokemon.spDefense = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + battlePokemon.isEgg = GetMonData(&gPlayerParty[a], MON_DATA_IS_EGG); + battlePokemon.altAbility = GetMonData(&gPlayerParty[a], MON_DATA_ALT_ABILITY); + battlePokemon.otId = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + GetMonData(&gPlayerParty[a], MON_DATA_NICKNAME, nickname); + StringCopy10(battlePokemon.nickname, nickname); + GetMonData(&gPlayerParty[a], MON_DATA_OT_NAME, battlePokemon.otName); + src = (u8 *)&battlePokemon; + for (size = 0; size < sizeof(battlePokemon); size++) + buffer[size] = src[size]; + break; + case 1: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPECIES); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 2: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 3: + for (size = 0; size < 4; size++) + { + moveData.moves[size] = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + size); + moveData.pp[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + } + moveData.ppBonuses = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + src = (u8 *)&moveData; + for (size = 0; size < sizeof(moveData); size++) + buffer[size] = src[size]; + break; + case 4: + case 5: + case 6: + case 7: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 8: + for (size = 0; size < 4; size++) + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + size); + buffer[size] = GetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES); + size++; + break; + case 9: + case 10: + case 11: + case 12: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9); + size = 1; + break; + case 17: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_OT_ID); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 18: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_EXP); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + size = 3; + break; + case 19: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_EV); + size = 1; + break; + case 20: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_EV); + size = 1; + break; + case 21: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_EV); + size = 1; + break; + case 22: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_EV); + size = 1; + break; + case 23: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV); + size = 1; + break; + case 24: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV); + size = 1; + break; + case 25: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP); + size = 1; + break; + case 26: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKERUS); + size = 1; + break; + case 27: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION); + size = 1; + break; + case 28: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL); + size = 1; + break; + case 29: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_MET_GAME); + size = 1; + break; + case 30: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_POKEBALL); + size = 1; + break; + case 31: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + buffer[1] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + buffer[2] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + buffer[3] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + buffer[4] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + buffer[5] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 6; + break; + case 32: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_HP_IV); + size = 1; + break; + case 33: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_ATK_IV); + size = 1; + break; + case 34: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_DEF_IV); + size = 1; + break; + case 35: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPD_IV); + size = 1; + break; + case 36: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV); + size = 1; + break; + case 37: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV); + size = 1; + break; + case 38: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 39: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 40: + data32 = GetMonData(&gPlayerParty[a], MON_DATA_STATUS); + buffer[0] = (data32 & 0x000000FF); + buffer[1] = (data32 & 0x0000FF00) >> 8; + buffer[2] = (data32 & 0x00FF0000) >> 16; + buffer[3] = (data32 & 0xFF000000) >> 24; + size = 4; + break; + case 41: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_LEVEL); + size = 1; + break; + case 42: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 43: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_MAX_HP); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 44: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_ATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 45: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_DEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 46: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPD); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 47: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPATK); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 48: + data16 = GetMonData(&gPlayerParty[a], MON_DATA_SPDEF); + buffer[0] = data16; + buffer[1] = data16 >> 8; + size = 2; + break; + case 49: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL); + size = 1; + break; + case 50: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY); + size = 1; + break; + case 51: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE); + size = 1; + break; + case 52: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART); + size = 1; + break; + case 53: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH); + size = 1; + break; + case 54: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SHEEN); + size = 1; + break; + case 55: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON); + size = 1; + break; + case 56: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON); + size = 1; + break; + case 57: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON); + size = 1; + break; + case 58: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON); + size = 1; + break; + case 59: + buffer[0] = GetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON); + size = 1; + break; + } + return size; +} + +void sub_8138230(void) +{ + sub_802ECF0(); +} + +void sub_813823C(void) +{ + u8 r4; + u8 i; + + if (gBattleBufferA[gActiveBank][2] == 0) + { + sub_8138294(gBattlePartyID[gActiveBank]); + } + else + { + r4 = gBattleBufferA[gActiveBank][2]; + for (i = 0; i < 6; i++) + { + if (r4 & 1) + sub_8138294(i); + r4 >>= 1; + } + } + WallyBufferExecCompleted(); +} + +void sub_8138294(u8 a) +{ + struct BattlePokemon *battlePokemon = (struct BattlePokemon *)&gBattleBufferA[gActiveBank][3]; + struct UnknownStruct3 *moveData = (struct UnknownStruct3 *)&gBattleBufferA[gActiveBank][3]; + s32 i; + + switch (gBattleBufferA[gActiveBank][1]) + { + case 0: + { + u8 iv; + + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, (u8 *)&battlePokemon->species); + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, (u8 *)&battlePokemon->item); + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&battlePokemon->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&battlePokemon->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, (u8 *)&battlePokemon->ppBonuses); + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, (u8 *)&battlePokemon->friendship); + SetMonData(&gPlayerParty[a], MON_DATA_EXP, (u8 *)&battlePokemon->experience); + iv = battlePokemon->hpIV; + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, (u8 *)&iv); + iv = battlePokemon->attackIV; + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, (u8 *)&iv); + iv = battlePokemon->defenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, (u8 *)&iv); + iv = battlePokemon->speedIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, (u8 *)&iv); + iv = battlePokemon->spAttackIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, (u8 *)&iv); + iv = battlePokemon->spDefenseIV; + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, (u8 *)&iv); + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, (u8 *)&battlePokemon->personality); + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, (u8 *)&battlePokemon->status1); + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, (u8 *)&battlePokemon->level); + SetMonData(&gPlayerParty[a], MON_DATA_HP, (u8 *)&battlePokemon->hp); + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, (u8 *)&battlePokemon->maxHP); + SetMonData(&gPlayerParty[a], MON_DATA_ATK, (u8 *)&battlePokemon->attack); + SetMonData(&gPlayerParty[a], MON_DATA_DEF, (u8 *)&battlePokemon->defense); + SetMonData(&gPlayerParty[a], MON_DATA_SPD, (u8 *)&battlePokemon->speed); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, (u8 *)&battlePokemon->spAttack); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, (u8 *)&battlePokemon->spDefense); + } + break; + case 1: + SetMonData(&gPlayerParty[a], MON_DATA_SPECIES, &gBattleBufferA[gActiveBank][3]); + break; + case 2: + SetMonData(&gPlayerParty[a], MON_DATA_HELD_ITEM, &gBattleBufferA[gActiveBank][3]); + break; + case 3: + for (i = 0; i < 4; i++) + { + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + i, (u8 *)&moveData->moves[i]); + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + i, (u8 *)&moveData->pp[i]); + } + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &moveData->ppBonuses); + break; + case 4: + case 5: + case 6: + case 7: + SetMonData(&gPlayerParty[a], MON_DATA_MOVE1 + gBattleBufferA[gActiveBank][1] - 4, &gBattleBufferA[gActiveBank][3]); + break; + case 8: + SetMonData(&gPlayerParty[a], MON_DATA_PP1, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_PP2, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_PP3, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_PP4, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_PP_BONUSES, &gBattleBufferA[gActiveBank][7]); + break; + case 9: + case 10: + case 11: + case 12: + SetMonData(&gPlayerParty[a], MON_DATA_PP1 + gBattleBufferA[gActiveBank][1] - 9, &gBattleBufferA[gActiveBank][3]); + break; + case 17: + SetMonData(&gPlayerParty[a], MON_DATA_OT_ID, &gBattleBufferA[gActiveBank][3]); + break; + case 18: + SetMonData(&gPlayerParty[a], MON_DATA_EXP, &gBattleBufferA[gActiveBank][3]); + break; + case 19: + SetMonData(&gPlayerParty[a], MON_DATA_HP_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 20: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 21: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 22: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 23: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 24: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_EV, &gBattleBufferA[gActiveBank][3]); + break; + case 25: + SetMonData(&gPlayerParty[a], MON_DATA_FRIENDSHIP, &gBattleBufferA[gActiveBank][3]); + break; + case 26: + SetMonData(&gPlayerParty[a], MON_DATA_POKERUS, &gBattleBufferA[gActiveBank][3]); + break; + case 27: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LOCATION, &gBattleBufferA[gActiveBank][3]); + break; + case 28: + SetMonData(&gPlayerParty[a], MON_DATA_MET_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 29: + SetMonData(&gPlayerParty[a], MON_DATA_MET_GAME, &gBattleBufferA[gActiveBank][3]); + break; + case 30: + SetMonData(&gPlayerParty[a], MON_DATA_POKEBALL, &gBattleBufferA[gActiveBank][3]); + break; + case 31: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][4]); + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][5]); + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][6]); + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][7]); + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][8]); + break; + case 32: + SetMonData(&gPlayerParty[a], MON_DATA_HP_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 33: + SetMonData(&gPlayerParty[a], MON_DATA_ATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 34: + SetMonData(&gPlayerParty[a], MON_DATA_DEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 35: + SetMonData(&gPlayerParty[a], MON_DATA_SPD_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 36: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 37: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF_IV, &gBattleBufferA[gActiveBank][3]); + break; + case 38: + SetMonData(&gPlayerParty[a], MON_DATA_PERSONALITY, &gBattleBufferA[gActiveBank][3]); + break; + case 39: + SetMonData(&gPlayerParty[a], MON_DATA_CHECKSUM, &gBattleBufferA[gActiveBank][3]); + break; + case 40: + SetMonData(&gPlayerParty[a], MON_DATA_STATUS, &gBattleBufferA[gActiveBank][3]); + break; + case 41: + SetMonData(&gPlayerParty[a], MON_DATA_LEVEL, &gBattleBufferA[gActiveBank][3]); + break; + case 42: + SetMonData(&gPlayerParty[a], MON_DATA_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 43: + SetMonData(&gPlayerParty[a], MON_DATA_MAX_HP, &gBattleBufferA[gActiveBank][3]); + break; + case 44: + SetMonData(&gPlayerParty[a], MON_DATA_ATK, &gBattleBufferA[gActiveBank][3]); + break; + case 45: + SetMonData(&gPlayerParty[a], MON_DATA_DEF, &gBattleBufferA[gActiveBank][3]); + break; + case 46: + SetMonData(&gPlayerParty[a], MON_DATA_SPD, &gBattleBufferA[gActiveBank][3]); + break; + case 47: + SetMonData(&gPlayerParty[a], MON_DATA_SPATK, &gBattleBufferA[gActiveBank][3]); + break; + case 48: + SetMonData(&gPlayerParty[a], MON_DATA_SPDEF, &gBattleBufferA[gActiveBank][3]); + break; + case 49: + SetMonData(&gPlayerParty[a], MON_DATA_COOL, &gBattleBufferA[gActiveBank][3]); + break; + case 50: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY, &gBattleBufferA[gActiveBank][3]); + break; + case 51: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE, &gBattleBufferA[gActiveBank][3]); + break; + case 52: + SetMonData(&gPlayerParty[a], MON_DATA_SMART, &gBattleBufferA[gActiveBank][3]); + break; + case 53: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH, &gBattleBufferA[gActiveBank][3]); + break; + case 54: + SetMonData(&gPlayerParty[a], MON_DATA_SHEEN, &gBattleBufferA[gActiveBank][3]); + break; + case 55: + SetMonData(&gPlayerParty[a], MON_DATA_COOL_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 56: + SetMonData(&gPlayerParty[a], MON_DATA_BEAUTY_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 57: + SetMonData(&gPlayerParty[a], MON_DATA_CUTE_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 58: + SetMonData(&gPlayerParty[a], MON_DATA_SMART_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + case 59: + SetMonData(&gPlayerParty[a], MON_DATA_TOUGH_RIBBON, &gBattleBufferA[gActiveBank][3]); + break; + } + sub_80324F8(&gPlayerParty[gBattlePartyID[gActiveBank]], gActiveBank); +} + +void sub_8138C90(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138C9C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138CA8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138CB4(void) +{ + if (gBattleBufferA[gActiveBank][1] == 0) + { + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 1); + gBattleBankFunc[gActiveBank] = sub_813789C; + } + else + { + FreeSpriteOamMatrix(&gSprites[gObjectBankIDs[gActiveBank]]); + DestroySprite(&gSprites[gObjectBankIDs[gActiveBank]]); + sub_8043DB0(gHealthboxIDs[gActiveBank]); + WallyBufferExecCompleted(); + } +} + +void sub_8138D38(void) +{ + sub_8031AF4(2, gActiveBank); + GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), + 30); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = 240; + gSprites[gObjectBankIDs[gActiveBank]].data0 = -2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_813741C; +} + +void sub_8138E04(void) +{ + sub_8031AF4(2, gActiveBank); + GetMonSpriteTemplate_803C5A0(2, GetBankIdentity(gActiveBank)); + gObjectBankIDs[gActiveBank] = CreateSprite( + &gUnknown_02024E8C, + 80, 80 + 4 * (8 - gTrainerBackPicCoords[2].coords), + 30); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = gActiveBank; + gSprites[gObjectBankIDs[gActiveBank]].pos2.x = -96; + gSprites[gObjectBankIDs[gActiveBank]].data0 = 2; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_80313A0; + gBattleBankFunc[gActiveBank] = sub_8137908; +} + +void sub_8138ED0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138EDC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138EE8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138EF4(void) +{ + ewram17840.unk8 = 4; + gDoingBattleAnim = TRUE; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + gBattleBankFunc[gActiveBank] = bx_wait_t5; +} + +void sub_8138F44(void) +{ + u8 val = gBattleBufferA[gActiveBank][1]; + + ewram17840.unk8 = val; + gDoingBattleAnim = TRUE; + move_anim_start_t4(gActiveBank, gActiveBank, GetBankByPlayerAI(1), 4); + gBattleBankFunc[gActiveBank] = bx_wait_t5; +} + +void sub_8138FA0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8138FAC(void) +{ + u16 r0 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + + gUnknown_0202F7C4 = gBattleBufferA[gActiveBank][3]; + gMovePowerMoveAnim = gBattleBufferA[gActiveBank][4] | (gBattleBufferA[gActiveBank][5] << 8); + gMoveDmgMoveAnim = gBattleBufferA[gActiveBank][6] | (gBattleBufferA[gActiveBank][7] << 8) | (gBattleBufferA[gActiveBank][8] << 16) | (gBattleBufferA[gActiveBank][9] << 24); + gHappinessMoveAnim = gBattleBufferA[gActiveBank][10]; + gWeatherMoveAnim = gBattleBufferA[gActiveBank][12] | (gBattleBufferA[gActiveBank][13] << 8); + gDisableStructMoveAnim = (u32 *)&gBattleBufferA[gActiveBank][16]; + gPID_perBank[gActiveBank] = *gDisableStructMoveAnim; + if (sub_8031720(r0, gUnknown_0202F7C4) != 0) + { + // Dead code. sub_8031720 always returns 0. + WallyBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk4 = 0; + gBattleBankFunc[gActiveBank] = sub_81390D0; + } +} + +void sub_81390D0(void) +{ + u16 r4 = gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8); + +#ifndef NONMATCHING + asm("":::"r6"); +#endif + + switch (ewram17810[gActiveBank].unk4) + { + case 0: + if (ewram17800[gActiveBank].unk0_2 == 1) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 5); + ewram17810[gActiveBank].unk4 = 1; + break; + case 1: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_80326EC(0); + ExecuteMoveAnim(r4); + ewram17810[gActiveBank].unk4 = 2; + } + break; + case 2: + gAnimScriptCallback(); + if (!gAnimScriptActive) + { + sub_80326EC(1); + if (ewram17800[gActiveBank].unk0_2 == 1) + move_anim_start_t4(gActiveBank, gActiveBank, gActiveBank, 6); + ewram17810[gActiveBank].unk4 = 3; + } + break; + case 3: + if (ewram17810[gActiveBank].unk0_6 == 0) + { + sub_8031F24(); + sub_80324BC(gActiveBank, gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + ewram17810[gActiveBank].unk4 = 0; + WallyBufferExecCompleted(); + } + break; + } +} + +void sub_8139208(void) +{ + u16 *ptr; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 0; + ptr = (u16 *)&gBattleBufferA[gActiveBank][2]; + if (*ptr == 2) + DestroyMenuCursor(); + BufferStringBattle(*ptr); + sub_8002EB0(&gUnknown_03004210, gDisplayedStringBattle, 0x90, 2, 15); + gBattleBankFunc[gActiveBank] = sub_8137454; +} + +void dp01t_11_5_message_for_player_only(void) +{ + if (GetBankSide(gActiveBank) == 0) + sub_8139208(); + else + WallyBufferExecCompleted(); +} + +void sub_8139298(void) +{ + s32 i; + + gUnknown_030042A4 = 0; + gUnknown_030042A0 = 160; + gUnknown_03004210.paletteNum = 0; + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 15, 27, 18); + FillWindowRect_DefaultPalette(&gUnknown_03004210, 10, 2, 35, 16, 36); + gBattleBankFunc[gActiveBank] = sub_81372BC; + InitWindow(&gUnknown_03004210, gUnknown_08400CF3, 400, 18, 35); + sub_8002F44(&gUnknown_03004210); + sub_814A5C0(0, 0xFFFF, 12, 0x2D9F, 0); + for (i = 0; i < 4; i++) + nullsub_8(i); + sub_802E3E4(0, 0); + StrCpyDecodeToDisplayedStringBattle(gUnknown_08400CCC); +#ifdef ENGLISH + InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 440, 2, 35); +#else + InitWindow(&gUnknown_03004210, gDisplayedStringBattle, 444, 2, 35); +#endif + sub_8002F44(&gUnknown_03004210); +} + +void sub_8139378(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139384(void) +{ + switch (ewram[0x160A9]) + { + case 0: + sub_80304A8(); + ewram[0x160A9]++; + ewram[0x160AB] = 80; + // fall through + case 1: + ewram[0x160AB]--; + if (ewram[0x160AB] == 0) + { + DestroyMenuCursor(); + PlaySE(SE_SELECT); + dp01_build_cmdbuf_x21_a_bb(1, 10, 256); + WallyBufferExecCompleted(); + } + break; + } +} + +void sub_81393EC(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gBattleBankFunc[gActiveBank] = sub_81374C4; + gBankInMenu = gActiveBank; +} + +void sub_813942C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139438(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139444(void) +{ + s16 r7; + + load_gfxc_health_bar(0); + r7 = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + if (r7 != 0x7FFF) + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + u32 curHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, curHP, r7); + } + else + { + u32 maxHP = GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_MAX_HP); + + sub_8043D84(gActiveBank, gHealthboxIDs[gActiveBank], maxHP, 0, r7); + sub_80440EC(gHealthboxIDs[gActiveBank], 0, 0); + } + gBattleBankFunc[gActiveBank] = sub_81377B0; +} + +void sub_8139544(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139550(void) +{ + WallyBufferExecCompleted(); +} + +void sub_813955C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139568(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139574(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139580(void) +{ + WallyBufferExecCompleted(); +} + +void sub_813958C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139598(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395A4(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395B0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395BC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395C8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395D4(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395E0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395EC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_81395F8(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139604(void) +{ + if (gSprites[gObjectBankIDs[gActiveBank]].invisible == TRUE) + { + WallyBufferExecCompleted(); + } + else + { + gDoingBattleAnim = 1; + gSprites[gObjectBankIDs[gActiveBank]].data1 = 0; + sub_8047858(gActiveBank); + gBattleBankFunc[gActiveBank] = bx_blink_t5; + } +} + +void sub_8139674(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139680(void) +{ + PlaySE(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + WallyBufferExecCompleted(); +} + +void sub_81396B0(void) +{ + PlayFanfare(gBattleBufferA[gActiveBank][1] | (gBattleBufferA[gActiveBank][2] << 8)); + WallyBufferExecCompleted(); +} + +void sub_81396E0(void) +{ + PlayCry1(GetMonData(&gPlayerParty[gBattlePartyID[gActiveBank]], MON_DATA_SPECIES), 25); + WallyBufferExecCompleted(); +} + +void dp01t_2E_5_battle_intro(void) +{ + sub_80E43C0(gBattleBufferA[gActiveBank][1]); + gUnknown_02024DE8 |= 1; + WallyBufferExecCompleted(); +} + +void sub_8139750(void) +{ + u8 paletteNum; + u8 taskId; + + oamt_add_pos2_onto_pos1(&gSprites[gObjectBankIDs[gActiveBank]]); + gSprites[gObjectBankIDs[gActiveBank]].data0 = 50; + gSprites[gObjectBankIDs[gActiveBank]].data2 = -40; + gSprites[gObjectBankIDs[gActiveBank]].data4 = gSprites[gObjectBankIDs[gActiveBank]].pos1.y; + gSprites[gObjectBankIDs[gActiveBank]].callback = sub_8078B34; + gSprites[gObjectBankIDs[gActiveBank]].data5 = gActiveBank; + oamt_set_x3A_32(&gSprites[gObjectBankIDs[gActiveBank]], sub_8030E38); + StartSpriteAnim(&gSprites[gObjectBankIDs[gActiveBank]], 1); + paletteNum = AllocSpritePalette(0xD6F8); + LoadCompressedPalette(gTrainerBackPicPaletteTable[2].data, 0x100 + paletteNum * 16, 32); + gSprites[gObjectBankIDs[gActiveBank]].oam.paletteNum = paletteNum; + taskId = CreateTask(sub_8139A2C, 5); + gTasks[taskId].data[0] = gActiveBank; + if (ewram17810[gActiveBank].unk0_0) + gTasks[gUnknown_02024E68[gActiveBank]].func = sub_8044CA0; + ewram17810[4].unk9 |= 1; + gBattleBankFunc[gActiveBank] = nullsub_91; +} + +void sub_81398BC(u8 bank) +{ + u16 species; + + ewram17800[bank].unk2 = 0; + gBattlePartyID[bank] = gBattleBufferA[bank][1]; + species = GetMonData(&gPlayerParty[gBattlePartyID[bank]], MON_DATA_SPECIES); + gUnknown_0300434C[bank] = CreateInvisibleSpriteWithCallback(sub_80312F0); + GetMonSpriteTemplate_803C56C(species, GetBankIdentity(bank)); + gObjectBankIDs[bank] = CreateSprite( + &gUnknown_02024E8C, + sub_8077ABC(bank, 2), + sub_8077F68(bank), + sub_8079E90(bank)); + gSprites[gUnknown_0300434C[bank]].data1 = gObjectBankIDs[bank]; + gSprites[gObjectBankIDs[bank]].data0 = bank; + gSprites[gObjectBankIDs[bank]].data2 = species; + gSprites[gObjectBankIDs[bank]].oam.paletteNum = bank; + StartSpriteAnim(&gSprites[gObjectBankIDs[bank]], gBattleMonForms[bank]); + gSprites[gObjectBankIDs[bank]].invisible = TRUE; + gSprites[gObjectBankIDs[bank]].callback = SpriteCallbackDummy; + gSprites[gUnknown_0300434C[bank]].data0 = sub_8046400(0, 0xFF); +} + +void sub_8139A2C(u8 taskId) +{ + if (gTasks[taskId].data[1] < 31) + { + gTasks[taskId].data[1]++; + } + else + { + u8 savedActiveBank = gActiveBank; + + gActiveBank = gTasks[taskId].data[0]; + gBattleBufferA[gActiveBank][1] = gBattlePartyID[gActiveBank]; + sub_81398BC(gActiveBank); + gBattleBankFunc[gActiveBank] = sub_8137538; + gActiveBank = savedActiveBank; + DestroyTask(taskId); + } +} + +void sub_8139AA0(void) +{ + if (gBattleBufferA[gActiveBank][1] != 0 && GetBankSide(gActiveBank) == 0) + { + WallyBufferExecCompleted(); + } + else + { + ewram17810[gActiveBank].unk0_0 = 1; + gUnknown_02024E68[gActiveBank] = sub_8044804(gActiveBank, (struct BattleInterfaceStruct2 *)&gBattleBufferA[gActiveBank][4], gBattleBufferA[gActiveBank][1], gBattleBufferA[gActiveBank][2]); + WallyBufferExecCompleted(); + } +} + +void sub_8139B20(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139B2C(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139B38(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139B44(void) +{ + u8 val2 = gBattleBufferA[gActiveBank][1]; + u16 val = gBattleBufferA[gActiveBank][2] | (gBattleBufferA[gActiveBank][3] << 8); + + if (move_anim_start_t3(gActiveBank, gActiveBank, gActiveBank, val2, val)) + WallyBufferExecCompleted(); + else + gBattleBankFunc[gActiveBank] = sub_8137940; +} + +void sub_8139BA0(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139BAC(void) +{ + WallyBufferExecCompleted(); +} + +void sub_8139BB8(void) +{ + gBattleOutcome = gBattleBufferA[gActiveBank][1]; + FadeOutMapMusic(5); + BeginFastPaletteFade(3); + WallyBufferExecCompleted(); + if ((gBattleTypeFlags & BATTLE_TYPE_LINK) && !(gBattleTypeFlags & BATTLE_TYPE_WILD)) + gBattleBankFunc[gActiveBank] = sub_813746C; +} + +void nullsub_80(void) +{ +} diff --git a/src/battle_party_menu.c b/src/battle_party_menu.c index 96b68adba..cf572642e 100644 --- a/src/battle_party_menu.c +++ b/src/battle_party_menu.c @@ -18,30 +18,43 @@ #include "task.h" #include "text.h" -#define DATA_COUNT (6) - extern u8 ewram[]; - -struct Unk201B000 -{ - //u8 filler0[0x260]; - struct Pokemon unk0[6]; - u8 filler258[1]; - u8 unk259; - u8 filler25A[6]; - u8 unk260; - u8 unk261; - u8 filler262[2]; - s16 unk264[DATA_COUNT * 2]; // This may be a union - u8 filler27C[2]; - s16 unk27E; - s16 unk280; - s16 unk282; -}; - -#define ewram1B000 (*(struct Unk201B000 *)(ewram + 0x1B000)) #define UNK_201606C_ARRAY (ewram + 0x1606C) // lazy define but whatever. +extern u8 IsLinkDoubleBattle(void); +extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); +extern void LoadHeldItemIconGraphics(void); +extern void CreateHeldItemIcons_806DC34(); +extern u8 sub_806BD58(u8, u8); +extern void PartyMenuPrintMonsLevelOrStatus(void); +extern void PrintPartyMenuMonNicknames(void); +extern void PartyMenuTryPrintMonsHP(void); +extern void nullsub_13(void); +extern void PartyMenuDrawHPBars(void); +extern u8 sub_806B58C(u8); +extern u8 GetItemEffectType(); +extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); +extern u16 sub_806BD80(); +extern u8 sub_806CA38(); +extern void sub_806D5A4(void); +extern void sub_802E414(void); +extern void sub_80A6DCC(void); +extern void sub_806AF4C(); +extern u8 sub_80F9344(void); +extern u8 sub_806B124(void); +extern void sub_806C994(); +extern void sub_806BF74(); +extern void sub_806AEDC(void); +extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); +extern void sub_806E7D0(u8, const struct PartyPopupMenu *); +extern u8 *sub_8040D08(); +extern void sub_8040B8C(void); +extern void sub_806E6F0(); +extern void sub_806D538(); +extern void nullsub_14(); +extern void OpenPartyMenu(); +extern u8 sub_803FBBC(void); + extern u16 gScriptItemId; extern u8 gPlayerPartyCount; extern u8 gNoOfAllBanks; @@ -562,7 +575,7 @@ static void Task_8095330(u8 taskId) } } -static void Task_809535C(u8 taskId) +static void Task_809535C(void) { gPaletteFade.bufferTransferDisabled = TRUE; sub_806AF4C(1, 0xFF, SetUpBattlePokemonMenu, 5); diff --git a/src/cable_club.c b/src/cable_club.c index 13ae65322..70b372205 100644 --- a/src/cable_club.c +++ b/src/cable_club.c @@ -13,6 +13,7 @@ extern u16 gScriptResult; extern struct TrainerCard gTrainerCards[4]; +extern struct LinkPlayer gLinkPlayers[]; extern u8 gUnknown_03004860; extern u8 gFieldLinkPlayerCount; @@ -46,6 +47,7 @@ void sub_808303C(u8 taskId) { return; } +#if ENGLISH if (linkPlayerCount < taskData[1]) { return; @@ -56,6 +58,17 @@ void sub_808303C(u8 taskId) { ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5 ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975); gTasks[taskId].func = sub_80830E4; +#elif GERMAN + if ((gLinkType == 0x2255 && (u32) linkPlayerCount > 1) || + (gLinkType != 0x2255 && taskData[1] <= linkPlayerCount)) + { + sub_80081C8(linkPlayerCount); + sub_8082D4C(); + ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1); // r5 + ShowFieldAutoScrollMessage((u8 *) gUnknown_081A4975); + gTasks[taskId].func = sub_80830E4; + } +#endif } #ifdef NONMATCHING @@ -280,9 +293,21 @@ static void sub_8083314(u8 taskId) { if (gScriptResult == 1) { +#if ENGLISH u16 linkType; linkType = gLinkType; + // FIXME: sub_8082D4C doesn't take any arguments sub_8082D4C(0x00004411, linkType); +#elif GERMAN + if (gLinkType != 0x4411) + { + if (gLinkType == 0x6601) + { + deUnkValue2 = 1; + } + } + sub_8082D4C(); +#endif EnableBothScriptContexts(); DestroyTask(taskId); return; diff --git a/src/choose_party.c b/src/choose_party.c new file mode 100644 index 000000000..63e9c8477 --- /dev/null +++ b/src/choose_party.c @@ -0,0 +1,1071 @@ +#include "global.h" +#include "decoration.h" +#include "field_fadetransition.h" +#include "main.h" +#include "menu.h" +#include "name_string_util.h" +#include "palette.h" +#include "party_menu.h" +#include "pokemon.h" +#include "pokemon_summary_screen.h" +#include "rom4.h" +#include "script.h" +#include "songs.h" +#include "sound.h" +#include "strings.h" +#include "string_util.h" +#include "task.h" +#include "text.h" + +struct UnknownPokemonStruct2 +{ + /*0x00*/ u16 species; + /*0x02*/ u16 heldItem; + /*0x04*/ u8 nickname[11]; + /*0x0F*/ u8 level; + /*0x10*/ u16 hp; + /*0x12*/ u16 maxhp; + /*0x14*/ u32 status; + /*0x18*/ u32 personality; + /*0x1C*/ u8 gender; + /*0x1D*/ u8 language; +}; + +extern u8 gSelectedOrderFromParty[]; +extern u8 gPlayerPartyCount; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gUnknown_020384F0; +extern struct UnknownPokemonStruct2 gUnknown_02023A00[]; +extern u8 gUnknown_0202E8F6; +extern struct Pokemon gUnknown_030042FC[]; +extern const u16 gBattleTowerBanlist[]; + +extern void OpenPartyMenu(); +extern void TryCreatePartyMenuMonIcon(u8, u8, struct Pokemon *); +extern void LoadHeldItemIconGraphics(void); +extern void CreateHeldItemIcons_806DC34(); +extern u8 sub_806BD58(u8, u8); +extern void PartyMenuPrintMonsLevelOrStatus(void); +extern void PrintPartyMenuMonNicknames(void); +extern void sub_806BC3C(u8, u8); +extern u8 sub_806B58C(u8); +extern void sub_806D538(); +extern u16 sub_806BE38(); +extern u8 sub_806CA38(); +extern void sub_808B5B4(); +extern TaskFunc PartyMenuGetPopupMenuFunc(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, u8); +extern u8 sub_806B124(); +extern void sub_806C994(); +extern void sub_806C658(); +extern void sub_806AEDC(void); +extern void sub_806AF4C(); +extern void ShowPokemonSummaryScreen(struct Pokemon *, u8, u8, void (*)(void), int); +extern void sub_806C890(); +extern void sub_806D5A4(); +extern void sub_806B908(void); +extern void CreateMonIcon_806D99C(int, u8, int, struct UnknownPokemonStruct2 *); +extern void sub_806D50C(int, u8); +extern void CreatePartyMenuMonIcon(); +extern void CreateHeldItemIcon_806DCD4(int, u8, int); +extern u8 GetMonStatusAndPokerus(); +extern void PartyMenuPrintHP(); +extern void PartyMenuPutStatusTilemap(u8, int, u8); +extern void PartyMenuPrintLevel(); +extern void PartyMenuPutNicknameTilemap(); +extern void PrintPartyMenuMonNickname(); +extern void PartyMenuDrawHPBar(); +extern bool8 sub_80F9344(void); +extern void sub_806D4AC(); +extern void sub_806D3B4(); +extern void PartyMenuDoPrintLevel(u8, u8, u8); +extern void PartyMenuDoDrawHPBar(u8, u8, u16, u16); +extern void PartyMenuDoPutNicknameTilemap(u16, u8, u8, u8, const u8 *); +extern void box_print(u8, int, const u8 *); +extern void sub_806BCE8(void); +extern void sub_806E750(u8, const struct PartyPopupMenu *, const struct PartyMenuItem *, int); +extern u16 sub_806BD80(); +extern void sub_806BF74(); + +static void ClearPartySelection(void); +static bool8 IsMonAllowedInBattleTower(struct Pokemon *); +static void sub_812238C(u8); +static void sub_8122450(u8); +static void sub_81224A8(u8); +static void sub_8122728(u8); +static void BattleTowerEntryMenuCallback_Exit(u8); +static void sub_81228E8(u8); +static void sub_8122950(u8); +static void sub_81229B8(void); +static void sub_8122AB8(u8); +static void sub_8122B10(u8); +static void sub_8122C18(u8); +static void Task_DaycareStorageMenu8122EAC(u8); +void sub_8123138(u8); +static void sub_8123170(u8); +static void sub_81231AC(void); + +void sub_8121E10(void) +{ + ClearPartySelection(); + ewram1B000.unk263 = 0; + OpenPartyMenu(4, 0); +} + +void sub_8121E34(void) +{ + ClearPartySelection(); + ewram1B000.unk263 = 1; + OpenPartyMenu(4, 0); +} + +static void ClearPartySelection(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + gSelectedOrderFromParty[i] = 0; +} + +bool8 sub_8121E78(void) +{ + u8 i; + + switch (ewram1B000_alt.unk264) + { + case 0: + if (ewram1B000_alt.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); + ewram1B000_alt.unk266++; + } + else + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + else + { + ewram1B000_alt.unk266++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.unk264++; + break; + case 6: + for (i = 0; i < gPlayerPartyCount; i++) + { + u8 j; + + for (j = 0; j < 3; j++) + { + if (gSelectedOrderFromParty[j] == i + 1) + { + sub_806BC3C(i, j * 14 + 0x1C); + break; + } + } + if (j == 3) + { + if (IsMonAllowedInBattleTower(&gPlayerParty[i]) == TRUE) + sub_806BC3C(i, 0x70); + else + sub_806BC3C(i, 0x7E); + } + } + ewram1B000_alt.unk264++; + break; + case 7: + if (sub_806B58C(ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264 = 0; + return TRUE; + } + else + { + ewram1B000_alt.unk266++; + } + break; + } + return FALSE; +} + +#ifdef NONMATCHING +static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) +{ + u16 r3; + s32 i; + + if (GetMonData(pkmn, MON_DATA_IS_EGG)) + return FALSE; + + if (ewram1B000.unk263 == 0) + { + if (GetMonData(pkmn, MON_DATA_HP) == 0) + return FALSE; + else + return TRUE; + } + + if ((gSaveBlock2.filler_A8.var_4AC & 1) == 0 + && GetMonData(pkmn, MON_DATA_LEVEL) > 50) + return FALSE; + + r3 = GetMonData(pkmn, MON_DATA_SPECIES); + // Can't stop the compiler from optimizing out the first index + for (i = 0; gBattleTowerBanlist[i] != 0xFFFF; i++) + { + if (gBattleTowerBanlist[i] == r3) + return FALSE; + } + return TRUE; +} +#else +__attribute__((naked)) +static bool8 IsMonAllowedInBattleTower(struct Pokemon *pkmn) +{ + asm_unified( + "push {r4,lr}\n\ + adds r4, r0, 0\n\ + movs r1, 0x2D\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + bne _0812207C\n\ + ldr r0, _08122058 @ =0x0201b000\n\ + ldr r1, _0812205C @ =0x00000263\n\ + adds r0, r1\n\ + ldrb r0, [r0]\n\ + cmp r0, 0\n\ + bne _08122060\n\ + adds r0, r4, 0\n\ + movs r1, 0x39\n\ + bl GetMonData\n\ + cmp r0, 0\n\ + beq _0812207C\n\ + b _081220B6\n\ + .align 2, 0\n\ +_08122058: .4byte 0x0201b000\n\ +_0812205C: .4byte 0x00000263\n\ +_08122060:\n\ + ldr r0, _08122080 @ =gSaveBlock2\n\ + ldr r1, _08122084 @ =0x00000554\n\ + adds r0, r1\n\ + ldrb r1, [r0]\n\ + movs r0, 0x1\n\ + ands r0, r1\n\ + cmp r0, 0\n\ + bne _08122088\n\ + adds r0, r4, 0\n\ + movs r1, 0x38\n\ + bl GetMonData\n\ + cmp r0, 0x32\n\ + bls _08122088\n\ +_0812207C:\n\ + movs r0, 0\n\ + b _081220B8\n\ + .align 2, 0\n\ +_08122080: .4byte gSaveBlock2\n\ +_08122084: .4byte 0x00000554\n\ +_08122088:\n\ + adds r0, r4, 0\n\ + movs r1, 0xB\n\ + bl GetMonData\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + ldr r1, _081220C0 @ =gBattleTowerBanlist\n\ + movs r0, 0\n\ + lsls r0, 1\n\ + adds r2, r0, r1\n\ + ldrh r0, [r2]\n\ + ldr r1, _081220C4 @ =0x0000ffff\n\ + cmp r0, r1\n\ + beq _081220B6\n\ + adds r4, r1, 0\n\ + adds r1, r2, 0\n\ +_081220A8:\n\ + ldrh r0, [r1]\n\ + cmp r0, r3\n\ + beq _0812207C\n\ + adds r1, 0x2\n\ + ldrh r0, [r1]\n\ + cmp r0, r4\n\ + bne _081220A8\n\ +_081220B6:\n\ + movs r0, 0x1\n\ +_081220B8:\n\ + pop {r4}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_081220C0: .4byte gBattleTowerBanlist\n\ +_081220C4: .4byte 0x0000ffff\n" + ); +} +#endif + +static u8 sub_81220C8(void) +{ + u8 i; + + if (ewram1B000.unk263 == 0) + return 0xFF; + if (gSelectedOrderFromParty[2] == 0) + return 0x11; + for (i = 0; i < 2; i++) + { + u8 j; + + ewram1B000.unk282 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_SPECIES); + ewram1B000.unk280 = GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[i]], MON_DATA_HELD_ITEM); + for (j = i + 1; j < 3; j++) + { + if (ewram1B000.unk282 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_SPECIES)) + return 0x12; + if (ewram1B000.unk280 != 0 && ewram1B000.unk280 == GetMonData(&gUnknown_030042FC[gSelectedOrderFromParty[j]], MON_DATA_HELD_ITEM)) + return 0x13; + } + } + return 0xFF; +} + +//------------------------------------------------------------------------------ +// Battle Tower Entry Menu +//------------------------------------------------------------------------------ + +static void BattleTowerEntryMenuCallback_Summary(u8); +static void BattleTowerEntryMenuCallback_Enter(u8); +static void BattleTowerEntryMenuCallback_NoEntry(u8); +static void BattleTowerEntryMenuCallback_Exit(u8); + +static const struct PartyMenuItem sBattleTowerEntryMenuItems[] = +{ + {OtherText_Summary, BattleTowerEntryMenuCallback_Summary}, + {OtherText_Enter2, BattleTowerEntryMenuCallback_Enter}, + {OtherText_NoEntry, BattleTowerEntryMenuCallback_NoEntry}, + {gUnknownText_Exit, BattleTowerEntryMenuCallback_Exit}, +}; + +static const u8 gUnknown_084017D0[] = {1, 0, 3}; +static const u8 gUnknown_084017D3[] = {2, 0, 3}; +static const u8 gUnknown_084017D6[] = {0, 3}; + +static const struct PartyPopupMenu sBattleTowerEntryMenu[] = +{ + {ARRAY_COUNT(gUnknown_084017D0), 9, gUnknown_084017D0}, + {ARRAY_COUNT(gUnknown_084017D3), 9, gUnknown_084017D3}, + {ARRAY_COUNT(gUnknown_084017D6), 9, gUnknown_084017D6}, +}; + + +static bool8 IsPartyMemberAlreadySelected(u8 partyMember) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == partyMember) + return TRUE; + } + return FALSE; +} + +static void sub_81221F8(u8 taskId) +{ + sub_806D538(5, 1); + if (IsMonAllowedInBattleTower(&gPlayerParty[gLastFieldPokeMenuOpened]) == TRUE) + { + if (IsPartyMemberAlreadySelected(gLastFieldPokeMenuOpened + 1) == TRUE) + { + gTasks[taskId].data[4] = 1; + sub_806E750(1, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } + else + { + gTasks[taskId].data[4] = 0; + sub_806E750(0, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } + } + else + { + gTasks[taskId].data[4] = 2; + sub_806E750(2, sBattleTowerEntryMenu, sBattleTowerEntryMenuItems, 0); + } +} + +void sub_81222B0(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (sub_806BE38(taskId)) + { + case 1: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskId); + if (gLastFieldPokeMenuOpened != 6) + { + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_81221F8(taskId); + gTasks[taskId].func = sub_812238C; + } + else + { + gTasks[taskId].func = sub_81224A8; + } + sub_808B5B4(taskId); + break; + case 2: + PlaySE(SE_SELECT); + ClearPartySelection(); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + break; + } + } +} + +// Handle input +static void sub_812238C(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & 0x40) + { + if (GetMenuCursorPos() != 0) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + return; + } + if (gMain.newAndRepeatedKeys & 0x80) + { + if (GetMenuCursorPos() != 3) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + return; + } + if (gMain.newKeys & A_BUTTON) + { + TaskFunc popupMenuFunc; + + PlaySE(SE_SELECT); + popupMenuFunc = PartyMenuGetPopupMenuFunc( + gTasks[taskId].data[4], + sBattleTowerEntryMenu, + sBattleTowerEntryMenuItems, + GetMenuCursorPos()); + popupMenuFunc(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + BattleTowerEntryMenuCallback_Exit(taskId); + return; + } + } +} + +// Return from menu? +static void sub_8122450(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(gMain.savedCallback); + DestroyTask(taskId); + } +} + +// Wait for A or B press +static void sub_8122480(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + BattleTowerEntryMenuCallback_Exit(taskId); +} + +static void sub_81224A8(u8 taskId) +{ + u8 val = sub_81220C8(); + + if (val != 0xFF) + { + sub_806D538(val, 0); + gTasks[taskId].func = sub_8122480; + } + else + { + if (gSelectedOrderFromParty[0] != 0) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + } + else + { + PlaySE(SE_HAZURE); + sub_806D538(14, 0); + gTasks[taskId].func = sub_8122480; + } + } +} + +// CB2 for menu? +static void sub_8122530(void) +{ + while (1) + { + if (sub_806B124() == 1) + { + sub_806C994(ewram1B000.unk260, gUnknown_020384F0); + sub_806C658(ewram1B000.unk260, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_81221F8(ewram1B000.unk260); + SetMainCallback2(sub_806AEDC); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_81225A4(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + sub_806AF4C(4, 0xFF, sub_812238C, 5); + SetMainCallback2(sub_8122530); +} + +// Wait for fade, then show summary screen +static void sub_81225D4(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0; + + DestroyTask(taskId); + ewram1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_81225A4, 0); + } +} + +// Summary callback? +static void BattleTowerEntryMenuCallback_Summary(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_81225D4; +} + +static void BattleTowerEntryMenuCallback_Enter(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == 0) + { + gSelectedOrderFromParty[i] = gLastFieldPokeMenuOpened + 1; + sub_806BC3C(gLastFieldPokeMenuOpened, i * 14 + 0x1C); + if (i == 2) + sub_806C890(taskId); + BattleTowerEntryMenuCallback_Exit(taskId); + return; + } + } + PlaySE(SE_HAZURE); + MenuZeroFillWindowRect(20, 10, 29, 19); + HandleDestroyMenuCursors(); + sub_806D5A4(); + sub_806E834(gOtherText_NoMoreThreePoke, 1); + gTasks[taskId].func = sub_8122728; +} + +static void sub_8122728(u8 taskId) +{ + if (gUnknown_0202E8F6 == 1) + return; + + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + MenuZeroFillWindowRect(0, 14, 29, 19); + HandleDestroyMenuCursors(); + BattleTowerEntryMenuCallback_Exit(taskId); + } +} + +static void BattleTowerEntryMenuCallback_NoEntry(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gSelectedOrderFromParty[i] == gLastFieldPokeMenuOpened + 1) + { + gSelectedOrderFromParty[i] = 0; + switch (i) + { + case 0: + gSelectedOrderFromParty[0] = gSelectedOrderFromParty[1]; + gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; + gSelectedOrderFromParty[2] = 0; + break; + case 1: + gSelectedOrderFromParty[1] = gSelectedOrderFromParty[2]; + gSelectedOrderFromParty[2] = 0; + break; + } + break; // exit loop + } + } + sub_806BC3C(gLastFieldPokeMenuOpened, 0x70); + if (gSelectedOrderFromParty[0] != 0) + sub_806BC3C(gSelectedOrderFromParty[0] - 1, 0x1C); + if (gSelectedOrderFromParty[1] != 0) + sub_806BC3C(gSelectedOrderFromParty[1] - 1, 0x2A); + BattleTowerEntryMenuCallback_Exit(taskId); +} + +static void sub_81227FC(u8 taskId) +{ + MenuZeroFillWindowRect(20, 10, 29, 19); + HandleDestroyMenuCursors(); + sub_806D538(0, 0); + gTasks[taskId].func = sub_81222B0; +} + +static void BattleTowerEntryMenuCallback_Exit(u8 taskId) +{ + PlaySE(SE_SELECT); + sub_81227FC(taskId); +} + +bool8 sub_8122854(void) +{ + switch (ewram1B000_alt.unk264) + { + case 0: + sub_81228E8(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.unk264++; + break; + case 2: + sub_8122950(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 3: + sub_81229B8(); + ewram1B000_alt.unk264++; + break; + case 4: + sub_806B908(); + return TRUE; + } + return FALSE; +} + +static void sub_81228E8(u8 a) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + CreatePartyMenuMonIcon(a, i, 3, &gPlayerParty[i]); + if (gUnknown_02023A00[i].species != 0) + { + CreateMonIcon_806D99C(a, i + 3, 3, &gUnknown_02023A00[i]); + sub_806D50C(a, i + 3); + } + } +} + +static void sub_8122950(u8 a) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + { + u16 item = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); + + CreateHeldItemIcon_806DCD4(a, i, item); + } + if (gUnknown_02023A00[i].species != 0) + CreateHeldItemIcon_806DCD4(a, i + 3, gUnknown_02023A00[i].heldItem); + } +} + +static void sub_81229B8(void) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0) + { + u8 status; + + PartyMenuPrintHP(i, 3, &gPlayerParty[i]); + status = GetMonStatusAndPokerus(&gPlayerParty[i]); + if (status != 0 && status != 6) + PartyMenuPutStatusTilemap(i, 3, status - 1); + else + PartyMenuPrintLevel(i, 3, &gPlayerParty[i]); + PartyMenuPutNicknameTilemap(i, 3, &gPlayerParty[i]); + PrintPartyMenuMonNickname(i, 3, &gPlayerParty[i]); + PartyMenuDrawHPBar(i, 3, &gPlayerParty[i]); + } + } +} + +void sub_8122A48(u8 taskId) +{ + if (!gPaletteFade.active) + { + gTasks[taskId].data[0] = 30; + sub_806D4AC(taskId, gUnknown_02023A00[0].species, 0); + sub_806D4AC(taskId, gUnknown_02023A00[1].species, 1); + sub_806D4AC(taskId, gUnknown_02023A00[2].species, 2); + gTasks[taskId].func = sub_8122AB8; + ewram1B000.unk261 = 1; + } +} + +static void sub_8122AB8(u8 taskId) +{ + sub_806D3B4(taskId, gUnknown_02023A00[1].species, gUnknown_02023A00[2].species); + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].func = sub_8122B10; + ewram1B000.unk261 = 2; + PlaySE(SE_W231); + } +} + +static void sub_8122B10(u8 taskId) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + if (gUnknown_02023A00[i].species != 0) + { + u8 r2; + + PartyMenuDoPrintHP(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); + if (gUnknown_02023A00[i].hp == 0) + r2 = 7; + else + r2 = pokemon_ailments_get_primary(gUnknown_02023A00[i].status); + if (r2 != 0) + PartyMenuPutStatusTilemap(i + 3, 3, r2 - 1); + else + PartyMenuDoPrintLevel(i + 3, 3, gUnknown_02023A00[i].level); + PartyMenuDoPutNicknameTilemap(gUnknown_02023A00[i].species, gUnknown_02023A00[i].gender, 3, i + 3, gUnknown_02023A00[i].nickname); + StringCopy(gStringVar1, gUnknown_02023A00[i].nickname); + StringGetEnd10(gStringVar1); + SanitizeNameString(gStringVar1); + box_print(i + 3, 3, gStringVar1); + PartyMenuDoDrawHPBar(i + 3, 3, gUnknown_02023A00[i].hp, gUnknown_02023A00[i].maxhp); + } + } + gTasks[taskId].func = sub_8122C18; + gTasks[taskId].data[0] = 0; +} + +static void sub_8122C18(u8 taskId) +{ + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] == 256) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8122450; + } +} + +// Exactly the same as sub_8121E78 except for case 6 +bool8 unref_sub_8122C60(void) +{ + switch (ewram1B000_alt.unk264) + { + case 0: + if (ewram1B000_alt.unk266 < gPlayerPartyCount) + { + TryCreatePartyMenuMonIcon(ewram1B000_alt.unk260, ewram1B000_alt.unk266, &gPlayerParty[ewram1B000_alt.unk266]); + ewram1B000_alt.unk266++; + } + else + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + break; + case 1: + LoadHeldItemIconGraphics(); + ewram1B000_alt.unk264++; + break; + case 2: + CreateHeldItemIcons_806DC34(ewram1B000_alt.unk260); + ewram1B000_alt.unk264++; + break; + case 3: + if (sub_806BD58(ewram1B000_alt.unk260, ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264++; + } + else + { + ewram1B000_alt.unk266++; + } + break; + case 4: + PartyMenuPrintMonsLevelOrStatus(); + ewram1B000_alt.unk264++; + break; + case 5: + PrintPartyMenuMonNicknames(); + ewram1B000_alt.unk264++; + break; + case 6: + sub_806BCE8(); + ewram1B000_alt.unk264++; + break; + case 7: + if (sub_806B58C(ewram1B000_alt.unk266) == 1) + { + ewram1B000_alt.unk266 = 0; + ewram1B000_alt.unk264 = 0; + return TRUE; + } + else + { + ewram1B000_alt.unk266++; + } + break; + } + return FALSE; +} + +//------------------------------------------------------------------------------ +// Daycare Pokemon Storage Menu +//------------------------------------------------------------------------------ + +static void DaycareStorageMenuCallback_Store(u8); +static void DaycareStorageMenuCallback_Summary(u8); +static void DaycareStorageMenuCallback_Exit(u8); + +static const struct PartyMenuItem sDaycareStorageMenuItems[] = +{ + {OtherText_Store, DaycareStorageMenuCallback_Store}, + {OtherText_Summary, DaycareStorageMenuCallback_Summary}, + {gUnknownText_Exit, DaycareStorageMenuCallback_Exit}, +}; + +static const u8 gUnknown_08401808[] = {0, 1, 2}; +static const u8 gUnknown_0840180B[] = {1, 2}; + +static const struct PartyPopupMenu sDaycareStorageMenus[] = +{ + {ARRAY_COUNT(gUnknown_08401808), 9, gUnknown_08401808}, + {ARRAY_COUNT(gUnknown_0840180B), 9, gUnknown_0840180B}, +}; + +static void sub_8122D94(u8 taskId) +{ + if (!GetMonData(&gPlayerParty[gLastFieldPokeMenuOpened], MON_DATA_IS_EGG)) + { + gTasks[taskId].data[4] = 0; + sub_806E750(0, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + } + else + { + gTasks[taskId].data[4] = 1; + sub_806E750(1, sDaycareStorageMenus, sDaycareStorageMenuItems, 0); + } +} + +void sub_8122E0C(u8 taskId) +{ + if (!gPaletteFade.active) + { + switch (sub_806BD80(taskId)) + { + case 1: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = sub_806CA38(taskId); + GetMonNickname(&gPlayerParty[gLastFieldPokeMenuOpened], gStringVar1); + sub_8122D94(taskId); + gTasks[taskId].func = Task_DaycareStorageMenu8122EAC; + break; + case 2: + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = 0xFF; + gSpecialVar_0x8004 = 0xFF; + sub_8123138(taskId); + break; + } + } +} + +static void Task_DaycareStorageMenu8122EAC(u8 taskId) +{ + if (!gPaletteFade.active) + { + if (gMain.newAndRepeatedKeys & 0x40) + { + if (GetMenuCursorPos() != 0) + { + PlaySE(SE_SELECT); + MoveMenuCursor(-1); + } + return; + } + if (gMain.newAndRepeatedKeys & 0x80) + { + if (GetMenuCursorPos() != 3) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } + return; + } + if (gMain.newKeys & A_BUTTON) + { + TaskFunc popupMenuFunc; + + PlaySE(SE_SELECT); + popupMenuFunc = PartyMenuGetPopupMenuFunc( + gTasks[taskId].data[4], + sDaycareStorageMenus, + sDaycareStorageMenuItems, + GetMenuCursorPos()); + popupMenuFunc(taskId); + return; + } + if (gMain.newKeys & B_BUTTON) + { + DaycareStorageMenuCallback_Exit(taskId); + return; + } + } +} + +static void DaycareStorageMenuCallback_Store(u8 taskId) +{ + gSpecialVar_0x8004 = gLastFieldPokeMenuOpened; + sub_8123138(taskId); +} + +static void sub_8122F90(void) +{ + while (1) + { + if (sub_806B124() == 1) + { + sub_806C994(ewram1B000.unk260, gUnknown_020384F0); + sub_806BF74(ewram1B000.unk260, 0); + GetMonNickname(&gPlayerParty[gUnknown_020384F0], gStringVar1); + gLastFieldPokeMenuOpened = gUnknown_020384F0; + sub_8122D94(ewram1B000.unk260); + SetMainCallback2(sub_806AEDC); + break; + } + if (sub_80F9344() == 1) + break; + } +} + +static void sub_8123004(void) +{ + gPaletteFade.bufferTransferDisabled = TRUE; + sub_806AF4C(6, 0xFF, Task_DaycareStorageMenu8122EAC, 5); + SetMainCallback2(sub_8122F90); +} + +static void sub_8123034(u8 taskId) +{ + if (!gPaletteFade.active) + { + u8 r4 = gSprites[gTasks[taskId].data[3] >> 8].data0; + + DestroyTask(taskId); + ewram1B000.unk262 = 1; + ShowPokemonSummaryScreen(gPlayerParty, r4, gPlayerPartyCount - 1, sub_8123004, 0); + } +} + +static void DaycareStorageMenuCallback_Summary(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8123034; +} + +static void DaycareStorageMenuCallback_Exit(u8 taskId) +{ + PlaySE(SE_SELECT); + MenuZeroFillWindowRect(20, 10, 29, 19); + HandleDestroyMenuCursors(); + sub_806D538(15, 0); + gTasks[taskId].func = sub_8122E0C; +} + +void sub_8123138(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gTasks[taskId].func = sub_8123170; +} + +static void sub_8123170(u8 taskId) +{ + if (!gPaletteFade.active) + { + gFieldCallback = sub_81231AC; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + } +} + +// Do these last two functions really belong in here? + +static void sub_81231C4(u8); + +void sub_81231AC(void) +{ + pal_fill_black(); + CreateTask(sub_81231C4, 10); +} + +static void sub_81231C4(u8 taskId) +{ + if (sub_807D770() == TRUE) + { + DestroyTask(taskId); + ScriptContext2_Disable(); + EnableBothScriptContexts(); + } +} diff --git a/src/contest_link_80C857C.c b/src/contest_link_80C857C.c new file mode 100644 index 000000000..0ae98af09 --- /dev/null +++ b/src/contest_link_80C857C.c @@ -0,0 +1,55 @@ +#include "global.h" +#include "link.h" + +#if GERMAN + +void de_sub_80C9274(bool32 arg0) { + if (deUnkValue2 != 1) + { + return; + } + + if (arg0) + { + deUnkValue2 = 3; + } + else + { + deUnkValue2 = 2; + } +} + +void de_sub_80C9294(bool32 arg0) { + if (deUnkValue2 == 1) + { + if (arg0) + { + deUnkValue2 = 3; + } + else + { + deUnkValue2 = 2; + } + + return; + } + + + if (deUnkValue2 == 2) + { + SendBlock(0, sBlockRequestLookupTable[deUnkValue1].address, sBlockRequestLookupTable[deUnkValue1].size); + + if (arg0) + { + deUnkValue2 = 0; + } + else + { + deUnkValue2 = 1; + } + + return; + } +} + +#endif diff --git a/src/contest_painting.c b/src/contest_painting.c index eddcc87c1..d75947e05 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -263,15 +263,23 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) { ptr = StringCopy(ptr, gUnknown_083F60AC[type]); ptr = StringCopy(ptr, gContestText_ContestWinner); +#if ENGLISH ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); +#elif GERMAN + ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); +#endif - // {ENG} + // {LATIN} ptr[0] = 0xFC; ptr[1] = 0x16; ptr += 2; ptr = StringCopy(ptr, gOtherText_Unknown1); +#if ENGLISH ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); +#elif GERMAN + ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); +#endif xPos = 6; yPos = 14; diff --git a/src/data/.clang-format b/src/data/.clang-format new file mode 100644 index 000000000..036aa7d76 --- /dev/null +++ b/src/data/.clang-format @@ -0,0 +1,22 @@ +BasedOnStyle: LLVM +AllowShortFunctionsOnASingleLine: None +BreakBeforeBraces: Allman +ColumnLimit: 0 +UseTab: Never +IndentWidth: 4 +TabWidth: 4 +AlignAfterOpenBracket: DontAlign +Cpp11BracedListStyle: false +BreakStringLiterals: false +IndentCaseLabels: false +IncludeCategories: + - Regex: '^"gba/types\.h"$' + Priority: -4 + - Regex: '^"global\.h"$' + Priority: -3 + - Regex: '^"gba/gba\.h"$' + Priority: -2 + - Regex: '^"gba/' + Priority: -1 + - Regex: '.\*' + Priority: 1 diff --git a/src/data/decoration/decorations.h b/src/data/decoration/decorations.h new file mode 100644 index 000000000..a25f3408f --- /dev/null +++ b/src/data/decoration/decorations.h @@ -0,0 +1,1212 @@ +const struct Decoration gDecorations[] = { + { + .id = DECOR_NONE, + .name = DECORNAME_SMALL_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DESK, + .price = 0, + .description = DecorDesc_SMALL_DESK, + .tiles = DecorGfx_SMALL_DESK, + }, + { + .id = DECOR_SMALL_DESK, + .name = DECORNAME_SMALL_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DESK, + .price = 3000, + .description = DecorDesc_SMALL_DESK, + .tiles = DecorGfx_SMALL_DESK, + }, + { + .id = DECOR_POKEMON_DESK, + .name = DECORNAME_POKEMON_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DESK, + .price = 3000, + .description = DecorDesc_POKEMON_DESK, + .tiles = DecorGfx_POKEMON_DESK, + }, + { + .id = DECOR_HEAVY_DESK, + .name = DECORNAME_HEAVY_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x2, + .category = DECORCAT_DESK, + .price = 6000, + .description = DecorDesc_HEAVY_DESK, + .tiles = DecorGfx_HEAVY_DESK, + }, + { + .id = DECOR_RAGGED_DESK, + .name = DECORNAME_RAGGED_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x2, + .category = DECORCAT_DESK, + .price = 6000, + .description = DecorDesc_RAGGED_DESK, + .tiles = DecorGfx_RAGGED_DESK, + }, + { + .id = DECOR_COMFORT_DESK, + .name = DECORNAME_COMFORT_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x2, + .category = DECORCAT_DESK, + .price = 6000, + .description = DecorDesc_COMFORT_DESK, + .tiles = DecorGfx_COMFORT_DESK, + }, + { + .id = DECOR_PRETTY_DESK, + .name = DECORNAME_PRETTY_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_PRETTY_DESK, + .tiles = DecorGfx_PRETTY_DESK, + }, + { + .id = DECOR_BRICK_DESK, + .name = DECORNAME_BRICK_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_BRICK_DESK, + .tiles = DecorGfx_BRICK_DESK, + }, + { + .id = DECOR_CAMP_DESK, + .name = DECORNAME_CAMP_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_CAMP_DESK, + .tiles = DecorGfx_CAMP_DESK, + }, + { + .id = DECOR_HARD_DESK, + .name = DECORNAME_HARD_DESK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_DESK, + .price = 9000, + .description = DecorDesc_HARD_DESK, + .tiles = DecorGfx_HARD_DESK, + }, + { + .id = DECOR_SMALL_CHAIR, + .name = DECORNAME_SMALL_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_SMALL_CHAIR, + .tiles = DecorGfx_SMALL_CHAIR, + }, + { + .id = DECOR_POKEMON_CHAIR, + .name = DECORNAME_POKEMON_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_POKEMON_CHAIR, + .tiles = DecorGfx_POKEMON_CHAIR, + }, + { + .id = DECOR_HEAVY_CHAIR, + .name = DECORNAME_HEAVY_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_HEAVY_CHAIR, + .tiles = DecorGfx_HEAVY_CHAIR, + }, + { + .id = DECOR_PRETTY_CHAIR, + .name = DECORNAME_PRETTY_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_PRETTY_CHAIR, + .tiles = DecorGfx_PRETTY_CHAIR, + }, + { + .id = DECOR_COMFORT_CHAIR, + .name = DECORNAME_COMFORT_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_COMFORT_CHAIR, + .tiles = DecorGfx_COMFORT_CHAIR, + }, + { + .id = DECOR_RAGGED_CHAIR, + .name = DECORNAME_RAGGED_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_RAGGED_CHAIR, + .tiles = DecorGfx_RAGGED_CHAIR, + }, + { + .id = DECOR_BRICK_CHAIR, + .name = DECORNAME_BRICK_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_BRICK_CHAIR, + .tiles = DecorGfx_BRICK_CHAIR, + }, + { + .id = DECOR_CAMP_CHAIR, + .name = DECORNAME_CAMP_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_CAMP_CHAIR, + .tiles = DecorGfx_CAMP_CHAIR, + }, + { + .id = DECOR_HARD_CHAIR, + .name = DECORNAME_HARD_CHAIR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CHAIR, + .price = 2000, + .description = DecorDesc_HARD_CHAIR, + .tiles = DecorGfx_HARD_CHAIR, + }, + { + .id = DECOR_RED_PLANT, + .name = DECORNAME_RED_PLANT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_PLANT, + .price = 3000, + .description = DecorDesc_RED_PLANT, + .tiles = DecorGfx_RED_PLANT, + }, + { + .id = DECOR_TROPICAL_PLANT, + .name = DECORNAME_TROPICAL_PLANT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_PLANT, + .price = 3000, + .description = DecorDesc_TROPICAL_PLANT, + .tiles = DecorGfx_TROPICAL_PLANT, + }, + { + .id = DECOR_PRETTY_FLOWERS, + .name = DECORNAME_PRETTY_FLOWERS, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_PLANT, + .price = 3000, + .description = DecorDesc_PRETTY_FLOWERS, + .tiles = DecorGfx_PRETTY_FLOWERS, + }, + { + .id = DECOR_COLORFUL_PLANT, + .name = DECORNAME_COLORFUL_PLANT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_PLANT, + .price = 5000, + .description = DecorDesc_COLORFUL_PLANT, + .tiles = DecorGfx_COLORFUL_PLANT, + }, + { + .id = DECOR_BIG_PLANT, + .name = DECORNAME_BIG_PLANT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_PLANT, + .price = 5000, + .description = DecorDesc_BIG_PLANT, + .tiles = DecorGfx_BIG_PLANT, + }, + { + .id = DECOR_GORGEOUS_PLANT, + .name = DECORNAME_GORGEOUS_PLANT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_PLANT, + .price = 5000, + .description = DecorDesc_GORGEOUS_PLANT, + .tiles = DecorGfx_GORGEOUS_PLANT, + }, + { + .id = DECOR_RED_BRICK, + .name = DECORNAME_RED_BRICK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_RED_BRICK, + .tiles = DecorGfx_RED_BRICK, + }, + { + .id = DECOR_YELLOW_BRICK, + .name = DECORNAME_YELLOW_BRICK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_YELLOW_BRICK, + .tiles = DecorGfx_YELLOW_BRICK, + }, + { + .id = DECOR_BLUE_BRICK, + .name = DECORNAME_BLUE_BRICK, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_BLUE_BRICK, + .tiles = DecorGfx_BLUE_BRICK, + }, + { + .id = DECOR_RED_BALLOON, + .name = DECORNAME_RED_BALLOON, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_RED_BALLOON, + .tiles = DecorGfx_RED_BALLOON, + }, + { + .id = DECOR_BLUE_BALLOON, + .name = DECORNAME_BLUE_BALLOON, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_BLUE_BALLOON, + .tiles = DecorGfx_BLUE_BALLOON, + }, + { + .id = DECOR_YELLOW_BALLOON, + .name = DECORNAME_YELLOW_BALLOON, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_YELLOW_BALLOON, + .tiles = DecorGfx_YELLOW_BALLOON, + }, + { + .id = DECOR_RED_TENT, + .name = DECORNAME_RED_TENT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_ORNAMENT, + .price = 10000, + .description = DecorDesc_RED_TENT, + .tiles = DecorGfx_RED_TENT, + }, + { + .id = DECOR_BLUE_TENT, + .name = DECORNAME_BLUE_TENT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_ORNAMENT, + .price = 10000, + .description = DecorDesc_BLUE_TENT, + .tiles = DecorGfx_BLUE_TENT, + }, + { + .id = DECOR_SOLID_BOARD, + .name = DECORNAME_SOLID_BOARD, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_SOLID_BOARD, + .tiles = DecorGfx_SOLID_BOARD, + }, + { + .id = DECOR_SLIDE, + .name = DECORNAME_SLIDE, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_2x4, + .category = DECORCAT_ORNAMENT, + .price = 8000, + .description = DecorDesc_SLIDE, + .tiles = DecorGfx_SLIDE, + }, + { + .id = DECOR_FENCE_LENGTH, + .name = DECORNAME_FENCE_LENGTH, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_FENCE_LENGTH, + .tiles = DecorGfx_FENCE_LENGTH, + }, + { + .id = DECOR_FENCE_WIDTH, + .name = DECORNAME_FENCE_WIDTH, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 500, + .description = DecorDesc_FENCE_WIDTH, + .tiles = DecorGfx_FENCE_WIDTH, + }, + { + .id = DECOR_TIRE, + .name = DECORNAME_TIRE, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_2x2, + .category = DECORCAT_ORNAMENT, + .price = 800, + .description = DecorDesc_TIRE, + .tiles = DecorGfx_TIRE, + }, + { + .id = DECOR_STAND, + .name = DECORNAME_STAND, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_4x2, + .category = DECORCAT_ORNAMENT, + .price = 7000, + .description = DecorDesc_STAND, + .tiles = DecorGfx_STAND, + }, + { + .id = DECOR_MUD_BALL, + .name = DECORNAME_MUD_BALL, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 200, + .description = DecorDesc_MUD_BALL, + .tiles = DecorGfx_MUD_BALL, + }, + { + .id = DECOR_BREAKABLE_DOOR, + .name = DECORNAME_BREAKABLE_DOOR, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_BREAKABLE_DOOR, + .tiles = DecorGfx_BREAKABLE_DOOR, + }, + { + .id = DECOR_SAND_ORNAMENT, + .name = DECORNAME_SAND_ORNAMENT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_SAND_ORNAMENT, + .tiles = DecorGfx_SAND_ORNAMENT, + }, + { + .id = DECOR_SILVER_SHIELD, + .name = DECORNAME_SILVER_SHIELD, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 0, + .description = DecorDesc_SILVER_SHIELD, + .tiles = DecorGfx_SILVER_SHIELD, + }, + { + .id = DECOR_GOLD_SHIELD, + .name = DECORNAME_GOLD_SHIELD, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 0, + .description = DecorDesc_GOLD_SHIELD, + .tiles = DecorGfx_GOLD_SHIELD, + }, + { + .id = DECOR_GLASS_ORNAMENT, + .name = DECORNAME_GLASS_ORNAMENT, + .permission = DECORPERM_BEHIND_FLOOR, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_ORNAMENT, + .price = 0, + .description = DecorDesc_GLASS_ORNAMENT, + .tiles = DecorGfx_GLASS_ORNAMENT, + }, + { + .id = DECOR_TV, + .name = DECORNAME_TV, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 3000, + .description = DecorDesc_TV, + .tiles = DecorGfx_TV, + }, + { + .id = DECOR_ROUND_TV, + .name = DECORNAME_ROUND_TV, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 4000, + .description = DecorDesc_ROUND_TV, + .tiles = DecorGfx_ROUND_TV, + }, + { + .id = DECOR_CUTE_TV, + .name = DECORNAME_CUTE_TV, + .permission = DECORPERM_SOLID_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_ORNAMENT, + .price = 4000, + .description = DecorDesc_CUTE_TV, + .tiles = DecorGfx_CUTE_TV, + }, + { + .id = DECOR_GLITTER_MAT, + .name = DECORNAME_GLITTER_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 2000, + .description = DecorDesc_GLITTER_MAT, + .tiles = DecorGfx_GLITTER_MAT, + }, + { + .id = DECOR_JUMP_MAT, + .name = DECORNAME_JUMP_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 2000, + .description = DecorDesc_JUMP_MAT, + .tiles = DecorGfx_JUMP_MAT, + }, + { + .id = DECOR_SPIN_MAT, + .name = DECORNAME_SPIN_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 2000, + .description = DecorDesc_SPIN_MAT, + .tiles = DecorGfx_SPIN_MAT, + }, + { + .id = DECOR_C_LOW_NOTE_MAT, + .name = DECORNAME_C_LOW_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_C_LOW_NOTE_MAT, + .tiles = DecorGfx_C_LOW_NOTE_MAT, + }, + { + .id = DECOR_D_NOTE_MAT, + .name = DECORNAME_D_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_D_NOTE_MAT, + .tiles = DecorGfx_D_NOTE_MAT, + }, + { + .id = DECOR_E_NOTE_MAT, + .name = DECORNAME_E_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_E_NOTE_MAT, + .tiles = DecorGfx_E_NOTE_MAT, + }, + { + .id = DECOR_F_NOTE_MAT, + .name = DECORNAME_F_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_F_NOTE_MAT, + .tiles = DecorGfx_F_NOTE_MAT, + }, + { + .id = DECOR_G_NOTE_MAT, + .name = DECORNAME_G_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_G_NOTE_MAT, + .tiles = DecorGfx_G_NOTE_MAT, + }, + { + .id = DECOR_A_NOTE_MAT, + .name = DECORNAME_A_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_A_NOTE_MAT, + .tiles = DecorGfx_A_NOTE_MAT, + }, + { + .id = DECOR_B_NOTE_MAT, + .name = DECORNAME_B_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_B_NOTE_MAT, + .tiles = DecorGfx_B_NOTE_MAT, + }, + { + .id = DECOR_C_HIGH_NOTE_MAT, + .name = DECORNAME_C_HIGH_NOTE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_MAT, + .price = 500, + .description = DecorDesc_C_HIGH_NOTE_MAT, + .tiles = DecorGfx_C_HIGH_NOTE_MAT, + }, + { + .id = DECOR_SURF_MAT, + .name = DECORNAME_SURF_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_SURF_MAT, + .tiles = DecorGfx_SURF_MAT, + }, + { + .id = DECOR_THUNDER_MAT, + .name = DECORNAME_THUNDER_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_THUNDER_MAT, + .tiles = DecorGfx_THUNDER_MAT, + }, + { + .id = DECOR_FIRE_BLAST_MAT, + .name = DECORNAME_FIRE_BLAST_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_FIRE_BLAST_MAT, + .tiles = DecorGfx_FIRE_BLAST_MAT, + }, + { + .id = DECOR_POWDER_SNOW_MAT, + .name = DECORNAME_POWDER_SNOW_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_POWDER_SNOW_MAT, + .tiles = DecorGfx_POWDER_SNOW_MAT, + }, + { + .id = DECOR_ATTRACT_MAT, + .name = DECORNAME_ATTRACT_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_ATTRACT_MAT, + .tiles = DecorGfx_ATTRACT_MAT, + }, + { + .id = DECOR_FISSURE_MAT, + .name = DECORNAME_FISSURE_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_FISSURE_MAT, + .tiles = DecorGfx_FISSURE_MAT, + }, + { + .id = DECOR_SPIKES_MAT, + .name = DECORNAME_SPIKES_MAT, + .permission = DECORPERM_PASS_FLOOR, + .shape = DECORSHAPE_3x3, + .category = DECORCAT_MAT, + .price = 4000, + .description = DecorDesc_SPIKES_MAT, + .tiles = DecorGfx_SPIKES_MAT, + }, + { + .id = DECOR_BALL_POSTER, + .name = DECORNAME_BALL_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_BALL_POSTER, + .tiles = DecorGfx_BALL_POSTER, + }, + { + .id = DECOR_GREEN_POSTER, + .name = DECORNAME_GREEN_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_GREEN_POSTER, + .tiles = DecorGfx_GREEN_POSTER, + }, + { + .id = DECOR_RED_POSTER, + .name = DECORNAME_RED_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_RED_POSTER, + .tiles = DecorGfx_RED_POSTER, + }, + { + .id = DECOR_BLUE_POSTER, + .name = DECORNAME_BLUE_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_BLUE_POSTER, + .tiles = DecorGfx_BLUE_POSTER, + }, + { + .id = DECOR_CUTE_POSTER, + .name = DECORNAME_CUTE_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_POSTER, + .price = 1000, + .description = DecorDesc_CUTE_POSTER, + .tiles = DecorGfx_CUTE_POSTER, + }, + { + .id = DECOR_PIKA_POSTER, + .name = DECORNAME_PIKA_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_PIKA_POSTER, + .tiles = DecorGfx_PIKA_POSTER, + }, + { + .id = DECOR_LONG_POSTER, + .name = DECORNAME_LONG_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_LONG_POSTER, + .tiles = DecorGfx_LONG_POSTER, + }, + { + .id = DECOR_SEA_POSTER, + .name = DECORNAME_SEA_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_SEA_POSTER, + .tiles = DecorGfx_SEA_POSTER, + }, + { + .id = DECOR_SKY_POSTER, + .name = DECORNAME_SKY_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_SKY_POSTER, + .tiles = DecorGfx_SKY_POSTER, + }, + { + .id = DECOR_KISS_POSTER, + .name = DECORNAME_KISS_POSTER, + .permission = DECORPERM_NA_WALL, + .shape = DECORSHAPE_2x1, + .category = DECORCAT_POSTER, + .price = 1500, + .description = DecorDesc_KISS_POSTER, + .tiles = DecorGfx_KISS_POSTER, + }, + { + .id = DECOR_PICHU_DOLL, + .name = DECORNAME_PICHU_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_PICHU_DOLL, + .tiles = DecorGfx_PICHU_DOLL, + }, + { + .id = DECOR_PIKACHU_DOLL, + .name = DECORNAME_PIKACHU_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_PIKACHU_DOLL, + .tiles = DecorGfx_PIKACHU_DOLL, + }, + { + .id = DECOR_MARILL_DOLL, + .name = DECORNAME_MARILL_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_MARILL_DOLL, + .tiles = DecorGfx_MARILL_DOLL, + }, + { + .id = DECOR_TOGEPI_DOLL, + .name = DECORNAME_TOGEPI_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TOGEPI_DOLL, + .tiles = DecorGfx_TOGEPI_DOLL, + }, + { + .id = DECOR_CYNDAQUIL_DOLL, + .name = DECORNAME_CYNDAQUIL_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_CYNDAQUIL_DOLL, + .tiles = DecorGfx_CYNDAQUIL_DOLL, + }, + { + .id = DECOR_CHIKORITA_DOLL, + .name = DECORNAME_CHIKORITA_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_CHIKORITA_DOLL, + .tiles = DecorGfx_CHIKORITA_DOLL, + }, + { + .id = DECOR_TOTODILE_DOLL, + .name = DECORNAME_TOTODILE_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TOTODILE_DOLL, + .tiles = DecorGfx_TOTODILE_DOLL, + }, + { + .id = DECOR_JIGGLYPUFF_DOLL, + .name = DECORNAME_JIGGLYPUFF_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_JIGGLYPUFF_DOLL, + .tiles = DecorGfx_JIGGLYPUFF_DOLL, + }, + { + .id = DECOR_MEOWTH_DOLL, + .name = DECORNAME_MEOWTH_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_MEOWTH_DOLL, + .tiles = DecorGfx_MEOWTH_DOLL, + }, + { + .id = DECOR_CLEFAIRY_DOLL, + .name = DECORNAME_CLEFAIRY_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_CLEFAIRY_DOLL, + .tiles = DecorGfx_CLEFAIRY_DOLL, + }, + { + .id = DECOR_DITTO_DOLL, + .name = DECORNAME_DITTO_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_DITTO_DOLL, + .tiles = DecorGfx_DITTO_DOLL, + }, + { + .id = DECOR_SMOOCHUM_DOLL, + .name = DECORNAME_SMOOCHUM_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SMOOCHUM_DOLL, + .tiles = DecorGfx_SMOOCHUM_DOLL, + }, + { + .id = DECOR_TREECKO_DOLL, + .name = DECORNAME_TREECKO_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TREECKO_DOLL, + .tiles = DecorGfx_TREECKO_DOLL, + }, + { + .id = DECOR_TORCHIC_DOLL, + .name = DECORNAME_TORCHIC_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_TORCHIC_DOLL, + .tiles = DecorGfx_TORCHIC_DOLL, + }, + { + .id = DECOR_MUDKIP_DOLL, + .name = DECORNAME_MUDKIP_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_MUDKIP_DOLL, + .tiles = DecorGfx_MUDKIP_DOLL, + }, + { + .id = DECOR_DUSKULL_DOLL, + .name = DECORNAME_DUSKULL_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_DUSKULL_DOLL, + .tiles = DecorGfx_DUSKULL_DOLL, + }, + { + .id = DECOR_WYNAUT_DOLL, + .name = DECORNAME_WYNAUT_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_WYNAUT_DOLL, + .tiles = DecorGfx_WYNAUT_DOLL, + }, + { + .id = DECOR_BALTOY_DOLL, + .name = DECORNAME_BALTOY_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_BALTOY_DOLL, + .tiles = DecorGfx_BALTOY_DOLL, + }, + { + .id = DECOR_KECLEON_DOLL, + .name = DECORNAME_KECLEON_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_KECLEON_DOLL, + .tiles = DecorGfx_KECLEON_DOLL, + }, + { + .id = DECOR_AZURILL_DOLL, + .name = DECORNAME_AZURILL_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_AZURILL_DOLL, + .tiles = DecorGfx_AZURILL_DOLL, + }, + { + .id = DECOR_SKITTY_DOLL, + .name = DECORNAME_SKITTY_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SKITTY_DOLL, + .tiles = DecorGfx_SKITTY_DOLL, + }, + { + .id = DECOR_SWABLU_DOLL, + .name = DECORNAME_SWABLU_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SWABLU_DOLL, + .tiles = DecorGfx_SWABLU_DOLL, + }, + { + .id = DECOR_GULPIN_DOLL, + .name = DECORNAME_GULPIN_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_GULPIN_DOLL, + .tiles = DecorGfx_GULPIN_DOLL, + }, + { + .id = DECOR_LOTAD_DOLL, + .name = DECORNAME_LOTAD_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_LOTAD_DOLL, + .tiles = DecorGfx_LOTAD_DOLL, + }, + { + .id = DECOR_SEEDOT_DOLL, + .name = DECORNAME_SEEDOT_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_DOLL, + .price = 3000, + .description = DecorDesc_SEEDOT_DOLL, + .tiles = DecorGfx_SEEDOT_DOLL, + }, + { + .id = DECOR_PIKA_CUSHION, + .name = DECORNAME_PIKA_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_PIKA_CUSHION, + .tiles = DecorGfx_PIKA_CUSHION, + }, + { + .id = DECOR_ROUND_CUSHION, + .name = DECORNAME_ROUND_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_ROUND_CUSHION, + .tiles = DecorGfx_ROUND_CUSHION, + }, + { + .id = DECOR_KISS_CUSHION, + .name = DECORNAME_KISS_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_KISS_CUSHION, + .tiles = DecorGfx_KISS_CUSHION, + }, + { + .id = DECOR_ZIGZAG_CUSHION, + .name = DECORNAME_ZIGZAG_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_ZIGZAG_CUSHION, + .tiles = DecorGfx_ZIGZAG_CUSHION, + }, + { + .id = DECOR_SPIN_CUSHION, + .name = DECORNAME_SPIN_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_SPIN_CUSHION, + .tiles = DecorGfx_SPIN_CUSHION, + }, + { + .id = DECOR_DIAMOND_CUSHION, + .name = DECORNAME_DIAMOND_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_DIAMOND_CUSHION, + .tiles = DecorGfx_DIAMOND_CUSHION, + }, + { + .id = DECOR_BALL_CUSHION, + .name = DECORNAME_BALL_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_BALL_CUSHION, + .tiles = DecorGfx_BALL_CUSHION, + }, + { + .id = DECOR_GRASS_CUSHION, + .name = DECORNAME_GRASS_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_GRASS_CUSHION, + .tiles = DecorGfx_GRASS_CUSHION, + }, + { + .id = DECOR_FIRE_CUSHION, + .name = DECORNAME_FIRE_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_FIRE_CUSHION, + .tiles = DecorGfx_FIRE_CUSHION, + }, + { + .id = DECOR_WATER_CUSHION, + .name = DECORNAME_WATER_CUSHION, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x1, + .category = DECORCAT_CUSHION, + .price = 2000, + .description = DecorDesc_WATER_CUSHION, + .tiles = DecorGfx_WATER_CUSHION, + }, + { + .id = DECOR_SNORLAX_DOLL, + .name = DECORNAME_SNORLAX_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_SNORLAX_DOLL, + .tiles = DecorGfx_SNORLAX_DOLL, + }, + { + .id = DECOR_RHYDON_DOLL, + .name = DECORNAME_RHYDON_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_RHYDON_DOLL, + .tiles = DecorGfx_RHYDON_DOLL, + }, + { + .id = DECOR_LAPRAS_DOLL, + .name = DECORNAME_LAPRAS_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_LAPRAS_DOLL, + .tiles = DecorGfx_LAPRAS_DOLL, + }, + { + .id = DECOR_VENUSAUR_DOLL, + .name = DECORNAME_VENUSAUR_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_VENUSAUR_DOLL, + .tiles = DecorGfx_VENUSAUR_DOLL, + }, + { + .id = DECOR_CHARIZARD_DOLL, + .name = DECORNAME_CHARIZARD_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_CHARIZARD_DOLL, + .tiles = DecorGfx_CHARIZARD_DOLL, + }, + { + .id = DECOR_BLASTOISE_DOLL, + .name = DECORNAME_BLASTOISE_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_BLASTOISE_DOLL, + .tiles = DecorGfx_BLASTOISE_DOLL, + }, + { + .id = DECOR_WAILMER_DOLL, + .name = DECORNAME_WAILMER_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_WAILMER_DOLL, + .tiles = DecorGfx_WAILMER_DOLL, + }, + { + .id = DECOR_REGIROCK_DOLL, + .name = DECORNAME_REGIROCK_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_REGIROCK_DOLL, + .tiles = DecorGfx_REGIROCK_DOLL, + }, + { + .id = DECOR_REGICE_DOLL, + .name = DECORNAME_REGICE_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_REGICE_DOLL, + .tiles = DecorGfx_REGICE_DOLL, + }, + { + .id = DECOR_REGISTEEL_DOLL, + .name = DECORNAME_REGISTEEL_DOLL, + .permission = DECORPERM_SOLID_MAT, + .shape = DECORSHAPE_1x2, + .category = DECORCAT_DOLL, + .price = 10000, + .description = DecorDesc_REGISTEEL_DOLL, + .tiles = DecorGfx_REGISTEEL_DOLL, + } +}; diff --git a/src/data/decoration/descriptions_de.h b/src/data/decoration/descriptions_de.h new file mode 100644 index 000000000..4c5559044 --- /dev/null +++ b/src/data/decoration/descriptions_de.h @@ -0,0 +1,699 @@ +const u8 DecorDesc_SMALL_DESK[] = _( + "Ein kleiner Tisch\n" + "für eine Person."); + +const u8 DecorDesc_POKEMON_DESK[] = _( + "Ein kleiner Tisch,\n" + "geformt wie ein\n" + "POKéBALL."); + +const u8 DecorDesc_HEAVY_DESK[] = _( + "Ein großer Tisch\n" + "aus Stahl. Für\n" + "Dekorationen."); + +const u8 DecorDesc_RAGGED_DESK[] = _( + "Ein großer Tisch\n" + "aus Holz. Für\n" + "Dekorationen."); + +const u8 DecorDesc_COMFORT_DESK[] = _( + "Ein riesiger Tisch\n" + "aus Blättern. Für\n" + "Dekorationen."); + +const u8 DecorDesc_PRETTY_DESK[] = _( + "Ein riesiger Tisch\n" + "aus Glas. Trägt\n" + "viele Dekorationen."); + +const u8 DecorDesc_BRICK_DESK[] = _( + "Ein riesiger Tisch\n" + "aus Backstein. Für\n" + "viele Dekorationen."); + +const u8 DecorDesc_CAMP_DESK[] = _( + "Ein riesiger Tisch\n" + "aus Baumstämmen.\n" + "Für Dekorationen."); + +const u8 DecorDesc_HARD_DESK[] = _( + "Ein riesiger Tisch\n" + "aus Stein. Trägt\n" + "viele Dekorationen."); + +const u8 DecorDesc_SMALL_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "für eine Person."); + +const u8 DecorDesc_POKEMON_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "in der Form eines\n" + "POKéBALLS."); + +const u8 DecorDesc_HEAVY_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Stahl."); + +const u8 DecorDesc_PRETTY_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Glas."); + +const u8 DecorDesc_COMFORT_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Blättern."); + +const u8 DecorDesc_RAGGED_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Holz."); + +const u8 DecorDesc_BRICK_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Backstein."); + +const u8 DecorDesc_CAMP_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Baumstämmen."); + +const u8 DecorDesc_HARD_CHAIR[] = _( + "Ein kleiner Stuhl\n" + "aus Stein."); + +const u8 DecorDesc_RED_PLANT[] = _( + "Eine leuchtend\n" + "rote Pflanze."); + +const u8 DecorDesc_TROPICAL_PLANT[] = _( + "Eine blühende,\n" + "tropische Pflanze\n" + "in einem Übertopf."); + +const u8 DecorDesc_PRETTY_FLOWERS[] = _( + "Ein Topf mit\n" + "hübschen Blumen."); + +const u8 DecorDesc_COLORFUL_PLANT[] = _( + "Ein großer Topf mit\n" + "vielen, farben-\n" + "prächtigen Blumen."); + +const u8 DecorDesc_BIG_PLANT[] = _( + "Eine große, schirm-\n" + "förmige Pflanze in\n" + "einem großen Topf."); + +const u8 DecorDesc_GORGEOUS_PLANT[] = _( + "Eine beeindruckend\n" + "große Pflanze in\n" + "einem großen Topf."); + +const u8 DecorDesc_RED_BRICK[] = _( + "Ein roter Back-\n" + "stein. Stelle Deko-\n" + "rationen darauf."); + +const u8 DecorDesc_YELLOW_BRICK[] = _( + "Ein gelber Back-\n" + "stein. Stelle Deko-\n" + "rationen darauf."); + +const u8 DecorDesc_BLUE_BRICK[] = _( + "Ein blauer Back-\n" + "stein. Stelle Deko-\n" + "rationen darauf."); + +const u8 DecorDesc_RED_BALLOON[] = _( + "Ein roter Ballon mit\n" + "Wasser. Platzt beim\n" + "Drauftreten."); + +const u8 DecorDesc_BLUE_BALLOON[] = _( + "Ein blauer Ballon\n" + "mit Wasser. Platzt\n" + "beim Drauftreten."); + +const u8 DecorDesc_YELLOW_BALLOON[] = _( + "Ein gelber Ballon\n" + "mit Wasser. Platzt\n" + "beim Drauftreten."); + +const u8 DecorDesc_RED_TENT[] = _( + "Ein großes, rotes\n" + "Zelt. Darin kann man\n" + "sich verstecken."); + +const u8 DecorDesc_BLUE_TENT[] = _( + "Ein großes, blaues\n" + "Zelt. Darin kann man\n" + "sich verstecken."); + +const u8 DecorDesc_SOLID_BOARD[] = _( + "Leg es über ein\n" + "Loch, um die andere\n" + "Seite zu erreichen."); + +const u8 DecorDesc_SLIDE[] = _( + "Nützlich, um von der\n" + "Plattform hinab-\n" + "gleiten zu können."); + +const u8 DecorDesc_FENCE_LENGTH[] = _( + "Ein kleiner Zaun,\n" + "der den Durchgang\n" + "versperrt."); + +const u8 DecorDesc_FENCE_WIDTH[] = _( + "Ein kleiner Zaun,\n" + "der den Durchgang\n" + "versperrt."); + +const u8 DecorDesc_TIRE[] = _( + "Ein großer, alter\n" + "Reifen. Für\n" + "Dekorationen."); + +const u8 DecorDesc_STAND[] = _( + "Ein Podest mit\n" + "Stufen."); + +const u8 DecorDesc_MUD_BALL[] = _( + "Ein großer Ball aus\n" + "Lehm. Geht kaputt\n" + "beim Drauftreten."); + +const u8 DecorDesc_BREAKABLE_DOOR[] = _( + "Eine verrückte Tür,\n" + "durch die man hin-\n" + "durchlaufen kann."); + +const u8 DecorDesc_SAND_ORNAMENT[] = _( + "Ein Ornament aus\n" + "Sand. Fällt bei\n" + "Kontakt zusammen."); + +const u8 DecorDesc_SILVER_SHIELD[] = _( + "Belohnung für\n" + "50 Siege in Folge im\n" + "DUELLTURM."); + +const u8 DecorDesc_GOLD_SHIELD[] = _( + "Belohnung für\n" + "100 Siege in Folge\n" + "im DUELLTURM."); + +const u8 DecorDesc_GLASS_ORNAMENT[] = _( + "Das Replikat einer\n" + "berühmten Skulptur\n" + "des KUNSTMUSEUMS."); + +const u8 DecorDesc_TV[] = _( + "Ein kleiner, grauer\n" + "Spielzeug-\n" + "Fernseher."); + +const u8 DecorDesc_ROUND_TV[] = _( + "Ein Spielzeug-\n" + "Fernseher in der\n" + "Form von SAMURZEL."); + +const u8 DecorDesc_CUTE_TV[] = _( + "Ein Spielzeug-\n" + "Fernseher in der\n" + "Form eines ENECO."); + +const u8 DecorDesc_GLITTER_MAT[] = _( + "Eine seltsame\n" + "Matte. Glitzert\n" + "beim Drauftreten."); + +const u8 DecorDesc_JUMP_MAT[] = _( + "Eine Trick-Matte,\n" + "die hüpft, wenn man\n" + "drauftritt."); + +const u8 DecorDesc_SPIN_MAT[] = _( + "Eine Trick-Matte,\n" + "die sich beim\n" + "Drauftreten dreht."); + +const u8 DecorDesc_C_LOW_NOTE_MAT[] = _( + "Eine Matte, die das\n" + "tiefe C spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_D_NOTE_MAT[] = _( + "Eine Matte, die\n" + "ein D spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_E_NOTE_MAT[] = _( + "Eine Matte, die\n" + "ein E spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_F_NOTE_MAT[] = _( + "Eine Matte, die\n" + "ein F spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_G_NOTE_MAT[] = _( + "Eine Matte, die\n" + "ein G spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_A_NOTE_MAT[] = _( + "Eine Matte, die\n" + "ein A spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_B_NOTE_MAT[] = _( + "Eine Matte, die\n" + "ein H spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_C_HIGH_NOTE_MAT[] = _( + "Eine Matte, die das\n" + "hohe C spielt, wenn\n" + "man drauftritt."); + +const u8 DecorDesc_SURF_MAT[] = _( + "Eine Matte mit\n" + "einem SURFER-\n" + "Muster. Für Items."); + +const u8 DecorDesc_THUNDER_MAT[] = _( + "Eine Matte mit\n" + "einem DONNER-\n" + "Muster. Für Items."); + +const u8 DecorDesc_FIRE_BLAST_MAT[] = _( + "Eine Matte mit\n" + "FEUERSTURM-\n" + "Muster. Für Items."); + +const u8 DecorDesc_POWDER_SNOW_MAT[] = _( + "Eine Matte mit\n" + "PULVERSCHNEE-\n" + "Muster. Für Items."); + +const u8 DecorDesc_ATTRACT_MAT[] = _( + "Eine Matte mit\n" + "ANZIEHUNG-\n" + "Muster. Für Items."); + +const u8 DecorDesc_FISSURE_MAT[] = _( + "Eine Matte mit\n" + "GEOFISSUR-\n" + "Muster. Für Items."); + +const u8 DecorDesc_SPIKES_MAT[] = _( + "Eine Matte mit\n" + "STACHLER-\n" + "Muster. Für Items."); + +const u8 DecorDesc_BALL_POSTER[] = _( + "Ein kleines Poster\n" + "von POKéBÄLLEN."); + +const u8 DecorDesc_GREEN_POSTER[] = _( + "Ein kleines Poster\n" + "von GECKARBOR."); + +const u8 DecorDesc_RED_POSTER[] = _( + "Ein kleines Poster\n" + "von FLEMMLI."); + +const u8 DecorDesc_BLUE_POSTER[] = _( + "Ein kleines Poster\n" + "von HYDROPI."); + +const u8 DecorDesc_CUTE_POSTER[] = _( + "Ein kleines Poster\n" + "von AZURILL."); + +const u8 DecorDesc_PIKA_POSTER[] = _( + "Ein großes Poster\n" + "von PIKACHU und\n" + "PICHU."); + +const u8 DecorDesc_LONG_POSTER[] = _( + "Ein großes Poster\n" + "von VIPITIS."); + +const u8 DecorDesc_SEA_POSTER[] = _( + "Ein großes Poster\n" + "von RELICANTH."); + +const u8 DecorDesc_SKY_POSTER[] = _( + "Ein großes Poster\n" + "von WINGULL."); + +const u8 DecorDesc_KISS_POSTER[] = _( + "Ein großes Poster\n" + "von KUSSILLA."); + +const u8 DecorDesc_PICHU_DOLL[] = _( + "PICHU-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_PIKACHU_DOLL[] = _( + "PIKACHU-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_MARILL_DOLL[] = _( + "MARILL-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_TOGEPI_DOLL[] = _( + "TOGEPI-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_CYNDAQUIL_DOLL[] = _( + "FEURIGEL-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_CHIKORITA_DOLL[] = _( + "ENDIVIE-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_TOTODILE_DOLL[] = _( + "KARNIMANI-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_JIGGLYPUFF_DOLL[] = _( + "PUMMELUFF-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_MEOWTH_DOLL[] = _( + "MAUZI-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_CLEFAIRY_DOLL[] = _( + "PIEPI-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_DITTO_DOLL[] = _( + "DITTO-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_SMOOCHUM_DOLL[] = _( + "KUSSILLA-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_TREECKO_DOLL[] = _( + "GECKARBOR-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_TORCHIC_DOLL[] = _( + "FLEMMLI-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_MUDKIP_DOLL[] = _( + "HYDROPI-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_DUSKULL_DOLL[] = _( + "ZWIRRLICHT-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_WYNAUT_DOLL[] = _( + "ISSO-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_BALTOY_DOLL[] = _( + "PUPPANCE-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_KECLEON_DOLL[] = _( + "KECLEON-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_AZURILL_DOLL[] = _( + "AZURILL-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_SKITTY_DOLL[] = _( + "ENECO-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_SWABLU_DOLL[] = _( + "WABLU-Puppe. Leg\n" + "sie auf eine Matte\n" + "oder einen Tisch."); + +const u8 DecorDesc_GULPIN_DOLL[] = _( + "SCHLUPPUCK-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_LOTAD_DOLL[] = _( + "LOTURZEL-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_SEEDOT_DOLL[] = _( + "SAMURZEL-Puppe.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_PIKA_CUSHION[] = _( + "PIKACHU-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_ROUND_CUSHION[] = _( + "MARILL-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_KISS_CUSHION[] = _( + "KUSSILLA-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_ZIGZAG_CUSHION[] = _( + "ZIGZACHS-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_SPIN_CUSHION[] = _( + "PANDIR-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_DIAMOND_CUSHION[] = _( + "ZOBIRIS-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_BALL_CUSHION[] = _( + "BALL-Kissen.\n" + "Für eine Matte oder\n" + "den Tisch."); + +const u8 DecorDesc_GRASS_CUSHION[] = _( + "Kissen mit Gras-\n" + "muster. Für\n" + "Matte oder Tisch."); + +const u8 DecorDesc_FIRE_CUSHION[] = _( + "Kissen mit Feuer-\n" + "muster. Für\n" + "Matte oder Tisch."); + +const u8 DecorDesc_WATER_CUSHION[] = _( + "Kissen mit Wasser-\n" + "muster. Für\n" + "Matte oder Tisch."); + +const u8 DecorDesc_SNORLAX_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_RHYDON_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_LAPRAS_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_VENUSAUR_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_CHARIZARD_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_BLASTOISE_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_WAILMER_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_REGIROCK_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_REGICE_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +const u8 DecorDesc_REGISTEEL_DOLL[] = _( + "Große Puppe. Leg\n" + "sie auf eine Matte\n" + "oder den Tisch."); + +#define DECORNAME_SMALL_DESK _("KLEINER TISCH") +#define DECORNAME_POKEMON_DESK _("POKéMONTISCH") +#define DECORNAME_HEAVY_DESK _("SCHWERER TISCH") +#define DECORNAME_RAGGED_DESK _("INTARSIENTISCH") +#define DECORNAME_COMFORT_DESK _("NATURTISCH") +#define DECORNAME_PRETTY_DESK _("EDLER TISCH") +#define DECORNAME_BRICK_DESK _("BACKSTEINTISCH") +#define DECORNAME_CAMP_DESK _("CAMPINGTISCH") +#define DECORNAME_HARD_DESK _("MASSIVER TISCH") +#define DECORNAME_SMALL_CHAIR _("KLEINER STUHL") +#define DECORNAME_POKEMON_CHAIR _("POKéMON STUHL") +#define DECORNAME_HEAVY_CHAIR _("SCHWERER STUHL") +#define DECORNAME_PRETTY_CHAIR _("EDLER STUHL") +#define DECORNAME_COMFORT_CHAIR _("NATURSTUHL") +#define DECORNAME_RAGGED_CHAIR _("INTARSIENSTUHL") +#define DECORNAME_BRICK_CHAIR _("BACKSTEINSTUHL") +#define DECORNAME_CAMP_CHAIR _("CAMPINGSTUHL") +#define DECORNAME_HARD_CHAIR _("MASSIVER STUHL") +#define DECORNAME_RED_PLANT _("ROTE PFLANZE") +#define DECORNAME_TROPICAL_PLANT _("TROPENPFLANZE") +#define DECORNAME_PRETTY_FLOWERS _("HÜBSCHE BLUMEN") +#define DECORNAME_COLORFUL_PLANT _("BUNTE PFLANZE") +#define DECORNAME_BIG_PLANT _("GROSSE PFLANZE") +#define DECORNAME_GORGEOUS_PLANT _("ZIERPFLANZE") +#define DECORNAME_RED_BRICK _("ROTER STEIN") +#define DECORNAME_YELLOW_BRICK _("GELBER STEIN") +#define DECORNAME_BLUE_BRICK _("BLAUER STEIN") +#define DECORNAME_RED_BALLOON _("ROTER BALLON") +#define DECORNAME_BLUE_BALLOON _("BLAUER BALLON") +#define DECORNAME_YELLOW_BALLOON _("GELBER BALLON") +#define DECORNAME_RED_TENT _("ROTES ZELT") +#define DECORNAME_BLUE_TENT _("BLAUES ZELT") +#define DECORNAME_SOLID_BOARD _("SOLIDES BRETT") +#define DECORNAME_SLIDE _("RUTSCHE") +#define DECORNAME_FENCE_LENGTH _("ZAUN VERTIKAL") +#define DECORNAME_FENCE_WIDTH _("ZAUN HORIZONTAL") +#define DECORNAME_TIRE _("REIFEN") +#define DECORNAME_STAND _("PODEST") +#define DECORNAME_MUD_BALL _("LEHMBALL") +#define DECORNAME_BREAKABLE_DOOR _("BRECHBARE TÜR") +#define DECORNAME_SAND_ORNAMENT _("SANDORNAMENT") +#define DECORNAME_SILVER_SHIELD _("SILBERSCHILD") +#define DECORNAME_GOLD_SHIELD _("GOLDSCHILD") +#define DECORNAME_GLASS_ORNAMENT _("GLASORNAMENT") +#define DECORNAME_TV _("FERNSEHER") +#define DECORNAME_ROUND_TV _("RUNDER TV") +#define DECORNAME_CUTE_TV _("HÜBSCHER TV") +#define DECORNAME_GLITTER_MAT _("GLITZER-MATTE") +#define DECORNAME_JUMP_MAT _("SPRUNG-MATTE") +#define DECORNAME_SPIN_MAT _("DREH-MATTE") +#define DECORNAME_C_LOW_NOTE_MAT _("Tiefes C-MATTE") +#define DECORNAME_D_NOTE_MAT _("D-MATTE") +#define DECORNAME_E_NOTE_MAT _("E-MATTE") +#define DECORNAME_F_NOTE_MAT _("F-MATTE") +#define DECORNAME_G_NOTE_MAT _("G-MATTE") +#define DECORNAME_A_NOTE_MAT _("A-MATTE") +#define DECORNAME_B_NOTE_MAT _("H-MATTE") +#define DECORNAME_C_HIGH_NOTE_MAT _("Hohes C-MATTE") +#define DECORNAME_SURF_MAT _("SURFER-MATTE") +#define DECORNAME_THUNDER_MAT _("DONNER-MATTE") +#define DECORNAME_FIRE_BLAST_MAT _("FEUER-MATTE") +#define DECORNAME_POWDER_SNOW_MAT _("SCHNEE-MATTE") +#define DECORNAME_ATTRACT_MAT _("ANZIEHUNG-MAT.") +#define DECORNAME_FISSURE_MAT _("GEOFISSUR-MAT.") +#define DECORNAME_SPIKES_MAT _("STACHLER-MATTE") +#define DECORNAME_BALL_POSTER _("BALLPOSTER") +#define DECORNAME_GREEN_POSTER _("GRÜNES POSTER") +#define DECORNAME_RED_POSTER _("ROTES POSTER") +#define DECORNAME_BLUE_POSTER _("BLAUES POSTER") +#define DECORNAME_CUTE_POSTER _("HÜBSCHES POSTER") +#define DECORNAME_PIKA_POSTER _("PICHUKA-POSTER") +#define DECORNAME_LONG_POSTER _("SCHLANG-POSTER") +#define DECORNAME_SEA_POSTER _("MEER-POSTER") +#define DECORNAME_SKY_POSTER _("HIMMEL-POSTER") +#define DECORNAME_KISS_POSTER _("KUSS-POSTER") +#define DECORNAME_PICHU_DOLL _("PICHU-PUPPE") +#define DECORNAME_PIKACHU_DOLL _("PIKACHU-PUPPE") +#define DECORNAME_MARILL_DOLL _("MARILL-PUPPE") +#define DECORNAME_TOGEPI_DOLL _("TOGEPI-PUPPE") +#define DECORNAME_CYNDAQUIL_DOLL _("FEURIGEL-PUPPE") +#define DECORNAME_CHIKORITA_DOLL _("ENDIVIE-PUPPE") +#define DECORNAME_TOTODILE_DOLL _("KARNIMANIPUPPE") +#define DECORNAME_JIGGLYPUFF_DOLL _("PUMMELUFFPUPPE") +#define DECORNAME_MEOWTH_DOLL _("MAUZI-PUPPE") +#define DECORNAME_CLEFAIRY_DOLL _("PIEPI-PUPPE") +#define DECORNAME_DITTO_DOLL _("DITTO-PUPPE") +#define DECORNAME_SMOOCHUM_DOLL _("KUSSILLA-PUPPE") +#define DECORNAME_TREECKO_DOLL _("GECKARBOR-PUPP.") +#define DECORNAME_TORCHIC_DOLL _("FLEMMLI-PUPPE") +#define DECORNAME_MUDKIP_DOLL _("HYDROPI-PUPPE") +#define DECORNAME_DUSKULL_DOLL _("ZWIRRLICHTPUP.") +#define DECORNAME_WYNAUT_DOLL _("ISSO-PUPPE") +#define DECORNAME_BALTOY_DOLL _("PUPPANCE-PUPPE") +#define DECORNAME_KECLEON_DOLL _("KECLEON-PUPPE") +#define DECORNAME_AZURILL_DOLL _("AZURILL-PUPPE") +#define DECORNAME_SKITTY_DOLL _("ENECO-PUPPE") +#define DECORNAME_SWABLU_DOLL _("WABLU-PUPPE") +#define DECORNAME_GULPIN_DOLL _("SCHLUPPUCKPUP.") +#define DECORNAME_LOTAD_DOLL _("LOTURZEL-PUPPE") +#define DECORNAME_SEEDOT_DOLL _("SAMURZEL-PUPPE") +#define DECORNAME_PIKA_CUSHION _("PIKA-KISSEN") +#define DECORNAME_ROUND_CUSHION _("RUNDES KISSEN") +#define DECORNAME_KISS_CUSHION _("KUSS-KISSEN") +#define DECORNAME_ZIGZAG_CUSHION _("ZIGZACHS-KISS.") +#define DECORNAME_SPIN_CUSHION _("KREISEL-KISSEN") +#define DECORNAME_DIAMOND_CUSHION _("DIAMANT-KISSEN") +#define DECORNAME_BALL_CUSHION _("BALL-KISSEN") +#define DECORNAME_GRASS_CUSHION _("PFLANZEN-KISS.") +#define DECORNAME_FIRE_CUSHION _("FEUER-KISSEN") +#define DECORNAME_WATER_CUSHION _("WASSER-KISSEN") +#define DECORNAME_SNORLAX_DOLL _("RELAXO-PUPPE") +#define DECORNAME_RHYDON_DOLL _("RIZEROS-PUPPE") +#define DECORNAME_LAPRAS_DOLL _("LAPRAS-PUPPE") +#define DECORNAME_VENUSAUR_DOLL _("BISAFLOR-PUPPE") +#define DECORNAME_CHARIZARD_DOLL _("GLURAK-PUPPE") +#define DECORNAME_BLASTOISE_DOLL _("TURTOK-PUPPE") +#define DECORNAME_WAILMER_DOLL _("WAILMER-PUPPE") +#define DECORNAME_REGIROCK_DOLL _("REGIROCK-PUPPE") +#define DECORNAME_REGICE_DOLL _("REGICE-PUPPE") +#define DECORNAME_REGISTEEL_DOLL _("REGISTEEL-PUPP.") diff --git a/src/data/pokedex_entries_de.h b/src/data/pokedex_entries_de.h new file mode 100644 index 000000000..38263ec6e --- /dev/null +++ b/src/data/pokedex_entries_de.h @@ -0,0 +1,7955 @@ +static const u8 DexDescription_Dummy_1[] = _( + "Dieses POKéMON wurde erst vor kurzem \n" + "entdeckt und wird noch erforscht."); +static const u8 DexDescription_Dummy_2[] = _( + "Zur Zeit sind keine genauen\n" + "Informationen über dieses\n" + "POKéMON vorhanden."); + +static const u8 DexDescription_Bisasam_1[] = _( + "BISASAM macht gern einmal ein\n" + "Nickerchen im Sonnenschein.\n" + "Auf seinem Rücken trägt es einen Samen."); +static const u8 DexDescription_Bisasam_2[] = _( + "Indem es Sonnenstrahlen aufsaugt,\n" + "wird der Samen zunehmend größer."); + +static const u8 DexDescription_Bisaknosp_1[] = _( + "BISAKNOSP hat eine Knospe auf seinem\n" + "Rücken. Beine und Rumpf sind kräftig\n" + "genug, um sein Gewicht zu tragen."); +static const u8 DexDescription_Bisaknosp_2[] = _( + "Wenn es lange in der Sonne liegt, ist das\n" + "ein Anzeichen dafür, dass die Knospe\n" + "bald blüht."); + +static const u8 DexDescription_Bisaflor_1[] = _( + "BISAFLOR hat eine Blume auf seinem\n" + "Rücken. Wenn sie viel Nahrung und Sonne\n" + "aufnimmt, verfärbt sie sich bunt."); +static const u8 DexDescription_Bisaflor_2[] = _( + "Der Duft der Blume mildert die Emotionen\n" + "der Menschen."); + +static const u8 DexDescription_Glumanda_1[] = _( + "Die Flamme auf seiner Schweifspitze\n" + "zeigt seine Gefühlslage an. Sie\n" + "flackert, wenn GLUMANDA zufrieden ist."); +static const u8 DexDescription_Glumanda_2[] = _( + "Wenn dieses POKéMON wütend wird, lodert\n" + "die Flamme gewaltig."); + +static const u8 DexDescription_Glutexo_1[] = _( + "Gnadenlos besiegt GLUTEXO seine Geg-\n" + "ner mit seinen scharfen Klauen. Wenn es \n" + "auf starke Gegner trifft, wird es"); +static const u8 DexDescription_Glutexo_2[] = _( + "wütend und die Flamme auf seiner\n" + "Schweifspitze flackert in einem\n" + "bläulichen Ton."); + +static const u8 DexDescription_Glurak_1[] = _( + "GLURAK fliegt durch die Lüfte, um\n" + "starke Gegner aufzuspüren. Sein heißer\n" + "Feueratem bringt alles zum Schmelzen."); +static const u8 DexDescription_Glurak_2[] = _( + "Aber es richtet seinen Feueratem nie\n" + "auf schwächere Gegner."); + +static const u8 DexDescription_Schiggy_1[] = _( + "SCHIGGYs Panzer dient nicht nur zum\n" + "Schutz. Die runde Form und die Furchen\n" + "auf der Oberfläche verringern den"); +static const u8 DexDescription_Schiggy_2[] = _( + "Widerstand im Wasser, so dass dieses\n" + "POKéMON sehr schnell schwimmen kann."); + +static const u8 DexDescription_Schillok_1[] = _( + "SCHILLOK hat einen langen, buschigen\n" + "Schweif, dessen Farbe intensiver wird,\n" + "wenn es altert."); +static const u8 DexDescription_Schillok_2[] = _( + "Die Kratzer auf seinem Panzer zeugen\n" + "von seiner Kampfkraft."); + +static const u8 DexDescription_Turtok_1[] = _( + "TURTOK besitzt Wasserdüsen, die aus\n" + "seinem Panzer herausragen. Diese sind\n" + "sehr präzise."); +static const u8 DexDescription_Turtok_2[] = _( + "Es kann Wassergeschosse so genau\n" + "verschießen, dass es damit aus fast\n" + "50 Metern leere Dosen trifft."); + +static const u8 DexDescription_Raupy_1[] = _( + "RAUPY ist sehr gefräßig, es kann\n" + "Blätter verschlingen, die größer sind\n" + "als es selbst."); +static const u8 DexDescription_Raupy_2[] = _( + "Seine Antennen sondern einen\n" + "übel riechenden Gestank ab."); + +static const u8 DexDescription_Safcon_1[] = _( + "Der Panzer dieses POKéMON ist hart wie\n" + "Stahl. SAFCON bewegt sich kaum,"); +static const u8 DexDescription_Safcon_2[] = _( + "da es das weiche Innere unter seiner\n" + "harten Schale auf seine Entwicklung \n" + "vorbereitet."); + +static const u8 DexDescription_Smettbo_1[] = _( + "SMETTBOs größte Fähigkeit ist das Auf-\n" + "spüren köstlichen Blütenhonigs."); +static const u8 DexDescription_Smettbo_2[] = _( + "Es findet sogar Honig in Blumen, die\n" + "fast 10 km von seinem Nest entfernt\n" + "blühen."); + +static const u8 DexDescription_Hornliu_1[] = _( + "HORNLIU verfügt über einen ausge-\n" + "zeichneten Geruchssinn. So kann es\n" + "seine Lieblingsblätter von denen"); +static const u8 DexDescription_Hornliu_2[] = _( + "unterscheiden, die es nicht mag, indem\n" + "es mit seiner großen roten Nase daran\n" + "schnuppert."); + +static const u8 DexDescription_Kokuna_1[] = _( + "KOKUNA bewegt sich kaum, wenn es an\n" + "einem Baum haftet. In seinem Inneren\n" + "jedoch regt sich einiges, da es sich auf"); +static const u8 DexDescription_Kokuna_2[] = _( + "seine bevorstehende Entwicklung vor-\n" + "bereitet. Dabei wird seine Schale sehr\n" + "heiß."); + +static const u8 DexDescription_Bibor_1[] = _( + "BIBOR sind sehr wehrhaft. Es sollte sich\n" + "besser niemand ihrem Nest nähern."); +static const u8 DexDescription_Bibor_2[] = _( + "Wenn man sie ärgert, greifen sie in\n" + "Schwärmen an."); + +static const u8 DexDescription_Taubsi_1[] = _( + "TAUBSI verfügt über einen sehr ge-\n" + "schulten Orientierungssinn. Es kehrt \n" + "zielsicher zu seinem Nest zurück,"); +static const u8 DexDescription_Taubsi_2[] = _( + "egal, wie weit es sich von seiner\n" + "gewohnten Umgebung entfernt hat."); + +static const u8 DexDescription_Tauboga_1[] = _( + "TAUBOGA nennt ein großes Gebiet sein\n" + "Eigen. Es fliegt umher und kontrolliert\n" + "seinen Lebensraum."); +static const u8 DexDescription_Tauboga_2[] = _( + "Wenn jemand sein Gebiet betritt, zeigt\n" + "es keine Gnade und greift seine Gegner\n" + "mit seinen scharfen Krallen an."); + +static const u8 DexDescription_Tauboss_1[] = _( + "Dieses POKéMON hat ein wunderschönes, \n" + "glänzendes Gefieder.\n" + "Viele TRAINER sind von der auffälligen"); +static const u8 DexDescription_Tauboss_2[] = _( + "Schönheit seines Federkleids begeis-\n" + "tert, so dass sie TAUBOSS als ihr\n" + "POKéMON wählen."); + +static const u8 DexDescription_Rattfratz_1[] = _( + "RATTFRATZ ist extrem vorsichtig. Sogar\n" + "im Schlaf nimmt es alles wahr, indem es\n" + "seine Ohren bewegt."); +static const u8 DexDescription_Rattfratz_2[] = _( + "Es stellt keine großen Ansprüche an\n" + "seinen Lebensraum und richtet sein\n" + "Nest überall ein."); + +static const u8 DexDescription_Rattikarl_1[] = _( + "RATTIKARLs kräftige Zähne wachsen\n" + "ständig. Deshalb nagt es unablässig\n" + "Steine und Baumstämme an,"); +static const u8 DexDescription_Rattikarl_2[] = _( + "um sie abzuwetzen. Manchmal knabbert\n" + "es sogar Hauswände an."); + +static const u8 DexDescription_Habitak_1[] = _( + "HABITAK kann einen sehr lauten Schrei\n" + "ausstoßen, den man über die Entfernung\n" + "von 1 km vernehmen kann."); +static const u8 DexDescription_Habitak_2[] = _( + "Durch das Echo seiner hohen, wehklagen-\n" + "den Schreie warnt dieses POKéMON seine\n" + "Artgenossen vor drohender Gefahr."); + +static const u8 DexDescription_Ibitak_1[] = _( + "IBITAK erkennt man an seinem langen \n" + "Hals und Schnabel. \n" + "Er ist hervorragend dafür geeignet,"); +static const u8 DexDescription_Ibitak_2[] = _( + "im Erdreich oder im Wasser Beute zu\n" + "jagen. Es setzt seinen langen, dünnen\n" + "Schnabel dabei sehr geschickt ein."); + +static const u8 DexDescription_Rettan_1[] = _( + "RETTAN rollt sich zu einer Spirale zu-\n" + "sammen, wenn es sich ausruht.\n" + "Aus dieser Haltung kann es blitzschnell"); +static const u8 DexDescription_Rettan_2[] = _( + "auf Bedrohungen aus allen Richtungen\n" + "reagieren, indem es seinen Kopf hebt."); + +static const u8 DexDescription_Arbok_1[] = _( + "Dieses POKéMON ist unheimlich stark. Es\n" + "kann seine Beute mit seinem Körper um-\n" + "wickeln und sogar Ölfässer zerdrücken."); +static const u8 DexDescription_Arbok_2[] = _( + "Wenn ARBOK einen Gegner umwickelt, ist\n" + "es unmöglich, seinem Würgegriff zu ent-\n" + "kommen."); + +static const u8 DexDescription_Pikachu_1[] = _( + "Immer wenn PIKACHU auf etwas Neues\n" + "stößt, jagt es einen Elektroschock \n" + "hindurch."); +static const u8 DexDescription_Pikachu_2[] = _( + "Wenn du eine verkohlte Beere findest,\n" + "hat dieses POKéMON seine elektrische\n" + "Ladung falsch eingeschätzt."); + +static const u8 DexDescription_Raichu_1[] = _( + "Wenn seine elektrische Ladung zu groß\n" + "wird, entlädt RAICHU seine Energie ins\n" + "Erdreich."); +static const u8 DexDescription_Raichu_2[] = _( + "Neben dem Nest dieses POKéMON findet\n" + "man häufig versengtes Erdreich."); + +static const u8 DexDescription_Sandan_1[] = _( + "SANDANs Körper kann sehr viel Wasser\n" + "aufnehmen, so dass es auch in der\n" + "Wüste überleben kann."); +static const u8 DexDescription_Sandan_2[] = _( + "Dieses POKéMON rollt sich zusammen, um\n" + "sich vor Feinden zu schützen."); + +static const u8 DexDescription_Sandamer_1[] = _( + "SANDAMERs Körper ist übersät\n" + "mit spitzen Stacheln, die eigentlich\n" + "Hauthärtungen darstellen."); +static const u8 DexDescription_Sandamer_2[] = _( + "Einmal im Jahr fallen die alten Stacheln\n" + "aus und werden durch neue ersetzt."); + +static const u8 DexDescription_NidoranF_1[] = _( + "NIDORAN besitzt Widerhaken, die ein\n" + "starkes Gift ausstoßen. Sie sind ver-\n" + "mutlich zum Schutz dieses"); +static const u8 DexDescription_NidoranF_2[] = _( + "schmächtigen POKéMON entstanden.\n" + "Wenn es wütend wird, stößt es ein\n" + "gefährliches Gift aus seinem Horn aus."); + +static const u8 DexDescription_Nidorina_1[] = _( + "Wenn NIDORINA mit seinen Freunden oder\n" + "seiner Familie zusammen ist, zieht\n" + "es seine Widerhaken ein, damit es"); +static const u8 DexDescription_Nidorina_2[] = _( + "niemanden verletzt. Dieses\n" + "POKéMON wird nervös, wenn man es\n" + "von seinen Artgenossen trennt."); + +static const u8 DexDescription_Nidoqueen_1[] = _( + "NIDOQUEENs Körper ist mit sehr harten\n" + "Schuppen bedeckt. Es ist sehr ge-\n" + "schickt darin, Gegner mit starken"); +static const u8 DexDescription_Nidoqueen_2[] = _( + "Attacken wegzuschleudern.\n" + "Dieses POKéMON entwickelt am meisten\n" + "Kraft, wenn es seine Jungen verteidigt."); + +static const u8 DexDescription_NidoranM_1[] = _( + "Das männliche NIDORAN hat Muskeln ent-\n" + "wickelt, um seine Ohren bewegen zu kön-\n" + "nen. Dadurch kann es sie in jede beliebi-"); +static const u8 DexDescription_NidoranM_2[] = _( + "ge Richtung drehen. Diesem POKéMON \n" + "entgeht nicht einmal das leiseste Ge-\n" + "räusch."); + +static const u8 DexDescription_Nidorino_1[] = _( + "NIDORINO besitzt ein Horn, das sogar\n" + "härter ist als ein Diamant. Wenn es\n" + "einen Feind wahrnimmt, stellen sich"); +static const u8 DexDescription_Nidorino_2[] = _( + "all die Widerhaken auf seinem Rücken\n" + "auf und es schlägt den Gegner mit aller\n" + "Kraft in die Flucht."); + +static const u8 DexDescription_Nidoking_1[] = _( + "NIDOKINGs Schweif ist enorm stark. Mit\n" + "einer Bewegung kann es einen metalle-\n" + "nen Sendemast zum Einsturz bringen."); +static const u8 DexDescription_Nidoking_2[] = _( + "Wenn es in Rage gerät, ist es nur schwer\n" + "aufzuhalten."); + +static const u8 DexDescription_Piepi_1[] = _( + "In Vollmondnächten sammeln sich einige\n" + "dieser POKéMON, um zu spielen. Wird es \n" + "Tag, kehrt PIEPI zu seinem Zufluchts-"); +static const u8 DexDescription_Piepi_2[] = _( + "ort in den Bergen zurück und\n" + "schläft eingekuschelt neben\n" + "seinen Artgenossen ein."); + +static const u8 DexDescription_Pixi_1[] = _( + "PIXI bewegt sich fort, indem es leicht\n" + "mit den Flügeln schlägt. Durch seinen\n" + "federnden Gang kann es sogar über"); +static const u8 DexDescription_Pixi_2[] = _( + "Wasser gehen. Bei Mondschein \n" + "unternimmt es Spaziergänge auf Seen."); + +static const u8 DexDescription_Vulpix_1[] = _( + "VULPIX kommt mit einem weißen Schweif\n" + "zur Welt. Dieser teilt sich sechsfach, \n" + "wenn das POKéMON von seinem TRAINER"); +static const u8 DexDescription_Vulpix_2[] = _( + "viel Zuneigung bekommt.\n" + "Seine sechs Schweife kräuseln sich\n" + "schließlich."); + +static const u8 DexDescription_Vulnona_1[] = _( + "VULNONA sendet einen unheimlichen\n" + "Lichtstrahl aus seinen hellroten Augen\n" + "aus, um totale Kontrolle über die"); +static const u8 DexDescription_Vulnona_2[] = _( + "Gedanken seines Gegners zu erlangen.\n" + "Man sagt, dieses POKéMON könne 1000\n" + "Jahre leben."); + +static const u8 DexDescription_Pummeluff_1[] = _( + "PUMMELUFFs Stimmbänder können die\n" + "Tonlage seiner Stimme beliebig vari-\n" + "ieren. Dieses POKéMON benutzt diese"); +static const u8 DexDescription_Pummeluff_2[] = _( + "Fähigkeit, um seine Gegner mit monoto-\n" + "nem Gesang in Tiefschlaf zu versetzen."); + +static const u8 DexDescription_Knuddeluff_1[] = _( + "KNUDDELUFF hat handtellergroße Augen,\n" + "die immer mit Tränenflüssigkeit bedeckt\n" + "sind. Gerät Staub in die Augen dieses"); +static const u8 DexDescription_Knuddeluff_2[] = _( + "POKéMON, so wird dieser sofort ausge-\n" + "spült."); + +static const u8 DexDescription_Zubat_1[] = _( + "Tagsüber bleibt ZUBAT an einem dunklen\n" + "Ort und bewegt sich kaum. Wenn es dem \n" + "Sonnenlicht längere Zeit ausgesetzt"); +static const u8 DexDescription_Zubat_2[] = _( + "wird, zieht es sich Verbrennungen an\n" + "seinem Körper zu."); + +static const u8 DexDescription_Golbat_1[] = _( + "GOLBAT hat es auf das Blut von Lebe-\n" + "wesen abgesehen. Im Schutze der Nacht\n" + "wird es besonders aktiv."); +static const u8 DexDescription_Golbat_2[] = _( + "Dieses POKéMON fliegt durch die\n" + "Nacht, um nach frischem Blut zu\n" + "suchen."); + +static const u8 DexDescription_Myrapla_1[] = _( + "Am Tage vergräbt sich MYRAPLA im Boden,\n" + "um mit seinem ganzen Körper Nahrung\n" + "aufzunehmen."); +static const u8 DexDescription_Myrapla_2[] = _( + "Je fruchtbarer der Boden ist, desto\n" + "glänzender werden seine Blätter."); + +static const u8 DexDescription_Duflor_1[] = _( + "DUFLOR produziert einen Ekel\n" + "erregenden Gestank aus dem Stempel\n" + "seiner Blume. Wenn es in Gefahr gerät,"); +static const u8 DexDescription_Duflor_2[] = _( + "wird der Gestank noch unerträglicher. \n" + "Wenn sich dieses POKéMON in Sicherheit\n" + "befindet, stößt es keinen Gestank aus."); + +static const u8 DexDescription_Giflor_1[] = _( + "GIFLORs giftige Pollen rufen böse\n" + "allergische Anfälle hervor. Deshalb ist\n" + "es ratsam, sich keiner schönen Blume im"); +static const u8 DexDescription_Giflor_2[] = _( + "Dschungel zu nähern, so anziehend sie\n" + "auch sein mag."); + +static const u8 DexDescription_Paras_1[] = _( + "Auf PARAS’ Rücken wachsen parasitäre\n" + "Pilze, die Tochukaso genannt werden.\n" + "Sie wachsen, indem sie dem"); +static const u8 DexDescription_Paras_2[] = _( + "KÄFER/PFLANZEN-PKMN Nährstoffe\n" + "entziehen. Sie sind sehr wertvoll als\n" + "lebensverlängernde Medizin."); + +static const u8 DexDescription_Parasek_1[] = _( + "PARASEK sucht große Bäume heim und\n" + "entzieht Nährstoffe aus Stamm und \n" + "Wurzeln."); +static const u8 DexDescription_Parasek_2[] = _( + "Wenn ein befallener Baum stirbt, sucht\n" + "es sich zusammen mit seinen Artge-\n" + "nossen einen neuen Wirt."); + +static const u8 DexDescription_Bluzuk_1[] = _( + "BLUZUK hat einen Pelz aus dünnen\n" + "Borsten entwickelt, der dem Schutz\n" + "seines Körpers dient."); +static const u8 DexDescription_Bluzuk_2[] = _( + "Es hat große Augen, denen auch winzig\n" + "kleine Beute nicht entgeht."); + +static const u8 DexDescription_Omot_1[] = _( + "OMOT ist ein nachtaktives POKéMON.\n" + "Kleine Insekten, die vom Licht in der\n" + "Dunkelheit angezogen Straßenlaternen"); +static const u8 DexDescription_Omot_2[] = _( + "umschwärmen, sind seine bevorzugte\n" + "Beute."); + +static const u8 DexDescription_Digda_1[] = _( + "DIGDA wird zumeist auf Farmen\n" + "gezüchtet. Denn wo auch immer dieses\n" + "POKéMON zu graben beginnt, hinterlässt"); +static const u8 DexDescription_Digda_2[] = _( + "es Erde, die für das Anpflanzen von\n" + "Feldfrüchten perfekt geeignet und für\n" + "den Anbau köstlichen Gemüses ideal ist."); + +static const u8 DexDescription_Digdri_1[] = _( + "DIGDRI sind Drillinge, die aus einem\n" + "Körper entstanden sind. Daher denken\n" + "alle Köpfe gleich."); +static const u8 DexDescription_Digdri_2[] = _( + "Sie arbeiten so gut zusammen, dass sie \n" + "endlos graben können."); + +static const u8 DexDescription_Mauzi_1[] = _( + "MAUZI zieht seine scharfen Krallen ein,\n" + "um umherschleichen zu können, ohne\n" + "verräterische Spuren zu hinterlassen."); +static const u8 DexDescription_Mauzi_2[] = _( + "Dieses POKéMON hat eine Vorliebe für\n" + "Münzen, die im Licht glitzern."); + +static const u8 DexDescription_Snobilikat_1[] = _( + "SNOBILIKAT hat sechs dicke Schnurr-\n" + "haare, wodurch es Furcht einflößend\n" + "wirkt. Durch diese nimmt es wahr, wenn"); +static const u8 DexDescription_Snobilikat_2[] = _( + "sich etwas in seiner Nähe bewegt. Es\n" + "wird sehr zutraulich, wenn man es an den\n" + "Schnurrhaaren berührt."); + +static const u8 DexDescription_Enton_1[] = _( + "ENTON verwendet eine geheimnisvolle\n" + "Kraft. Dabei erzeugt es Gehirnströme,\n" + "die man sonst nur von Schlafenden"); +static const u8 DexDescription_Enton_2[] = _( + "kennt. Diese Entdeckung führte zu \n" + "einer umstrittenen Diskussion unter\n" + "Wissenschaftlern."); + +static const u8 DexDescription_Entoron_1[] = _( + "Die schwimmhäutigen Flossen an seinen\n" + "Vorder- und Hinterbeinen und der \n" + "stromlinienförmige Körper machen"); +static const u8 DexDescription_Entoron_2[] = _( + "ENTORON unheimlich schnell. Dieses\n" + "POKéMON ist auf jeden Fall schneller als\n" + "die meisten Hochleistungsschwimmer."); + +static const u8 DexDescription_Menki_1[] = _( + "Wenn MENKI sich schüttelt und schwer\n" + "durch die Nase atmet, dann ist es \n" + "wütend. Da es blitzartig in Raserei"); +static const u8 DexDescription_Menki_2[] = _( + "gerät, ist es unmöglich seinem Zorn\n" + "zu entkommen."); + +static const u8 DexDescription_Rasaff_1[] = _( + "Wenn RASAFF wütend ist, wird seine Blut-\n" + "zirkulation gesteigert und seine Mus-\n" + "keln werden noch stärker."); +static const u8 DexDescription_Rasaff_2[] = _( + "Allerdings mindert das auch die \n" + "Fähigkeit zum logischen Denken."); + +static const u8 DexDescription_Fukano_1[] = _( + "FUKANO hat einen ausgezeichneten Ge-\n" + "ruchssinn. Wenn dieses POKéMON ein-\n" + "mal einen Geruch wahrgenommen hat,"); +static const u8 DexDescription_Fukano_2[] = _( + "vergisst es ihn nicht mehr. Es benutzt\n" + "diese Fähigkeit dazu, die Gefühlslage\n" + "von Lebewesen auszuloten."); + +static const u8 DexDescription_Arkani_1[] = _( + "ARKANI ist sehr schnell. Es kann an\n" + "einem Tag fast 10.000 km zurücklegen.\n" + "Das Feuer, das im Innern dieses POKéMON"); +static const u8 DexDescription_Arkani_2[] = _( + "lodert, dient ihm als Energiequelle."); + +static const u8 DexDescription_Quapsel_1[] = _( + "QUAPSEL hat eine sehr dünne Haut.\n" + "Durch sie hindurch kann man sogar sein\n" + "spiralförmiges Inneres sehen."); +static const u8 DexDescription_Quapsel_2[] = _( + "Obwohl seine Haut so dünn ist, ist sie\n" + "sehr elastisch. Selbst scharfe Reiß-\n" + "zähne können sie nicht durchdringen."); + +static const u8 DexDescription_Quaputzi_1[] = _( + "QUAPUTZIs Körper ist immer feucht und\n" + "glitschig. Dadurch kann es während\n" + "eines Kampfes leicht der Umklammerung"); +static const u8 DexDescription_Quaputzi_2[] = _( + "eines Gegners entkommen."); + +static const u8 DexDescription_Quappo_1[] = _( + "QUAPPO besitzt hochentwickelte, starke\n" + "Muskeln, die niemals ermüden, egal, wie\n" + "sehr es sie auch beansprucht."); +static const u8 DexDescription_Quappo_2[] = _( + "Es ist so kräftig, dass es mühelos den\n" + "Pazifik durchschwimmen kann."); + +static const u8 DexDescription_Abra_1[] = _( + "ABRA schläft 18 Stunden am Tag.\n" + "Es nimmt die Gegenwart von Feinden\n" + "aber auch im Schlaf wahr."); +static const u8 DexDescription_Abra_2[] = _( + "In einer solchen Situation bringt es\n" + "sich umgehend mit TELEPORT in\n" + "Sicherheit."); + +static const u8 DexDescription_Kadabra_1[] = _( + "KADABRA sendet Alphawellen aus, wenn es\n" + "Kopfschmerzen hat. Nur wer eine beson-\n" + "ders starke Psyche hat, kann"); +static const u8 DexDescription_Kadabra_2[] = _( + "dieses POKéMON unter seine Fittiche\n" + "nehmen."); + +static const u8 DexDescription_Simsala_1[] = _( + "SIMSALAs Gehirn hört nicht auf zu\n" + "wachsen, so dass sein Kopf zu schwer\n" + "für seine Nackenmuskulatur wird."); +static const u8 DexDescription_Simsala_2[] = _( + "Dieses POKéMON hält seinen Kopf mit\n" + "psychokinetischer Energie aufrecht."); + +static const u8 DexDescription_Machollo_1[] = _( + "MACHOLLOs Muskeln sind etwas Beson-\n" + "deres. Sie schmerzen nie, egal, wie sehr\n" + "sie beansprucht werden."); +static const u8 DexDescription_Machollo_2[] = _( + "Dieses POKéMON hat genug Kraft, um 100\n" + "Erwachsene umherzuwerfen."); + +static const u8 DexDescription_Maschock_1[] = _( + "MASCHOCKs starke Muskeln sind so hart\n" + "wie Stahl. Dieses POKéMON hat so viel\n" + "Kraft, dass es mit nur einem Finger"); +static const u8 DexDescription_Maschock_2[] = _( + "einen Sumo-Ringer in der Luft halten\n" + "kann."); + +static const u8 DexDescription_Machomei_1[] = _( + "MACHOMEI hat genug Kraft, um alles \n" + "Mögliche zu stemmen. Bei Tätigkeiten,\n" + "die Geschick und Sorgfalt erfordern,"); +static const u8 DexDescription_Machomei_2[] = _( + "machen es ihm seine Arme jedoch nicht\n" + "leicht. Dieses POKéMON neigt dazu,\n" + "zuerst zu handeln und dann zu denken."); + +static const u8 DexDescription_Knofensa_1[] = _( + "KNOFENSAs schlanker und elastischer\n" + "Körper ermöglicht es ihm, jedem\n" + "Angriff auszuweichen, so heftig dieser"); +static const u8 DexDescription_Knofensa_2[] = _( + "auch sein mag. Dieses POKéMON spuckt\n" + "eine ätzende Flüssigkeit aus, die sogar\n" + "Eisen zersetzen kann."); + +static const u8 DexDescription_Ultrigaria_1[] = _( + "ULTRIGARIA hat einen großen Haken\n" + "an seinem Hinterteil. Nachts hängt\n" + "sich dieses POKéMON zum Schlafen an"); +static const u8 DexDescription_Ultrigaria_2[] = _( + "einen Ast. Wenn es sich im Schlaf be-\n" + "wegt, kann es passieren, dass es auf\n" + "dem Boden wieder aufwacht."); + +static const u8 DexDescription_Sarzenia_1[] = _( + "Aus SARZENIAs Kopf ragt eine lange\n" + "Ranke hervor. Diese schwingt hin und \n" + "her, als ob sie etwas fangen"); +static const u8 DexDescription_Sarzenia_2[] = _( + "möchte. Wenn sich ahnungslose Beute \n" + "nähert, wird sie von diesem POKéMON\n" + "im Ganzen verschlungen."); + +static const u8 DexDescription_Tentacha_1[] = _( + "TENTACHAs Körper setzt sich zum größ-\n" + "ten Teil aus Wasser zusammen. Wenn es\n" + "das Meer verlässt, vertrocknet es."); +static const u8 DexDescription_Tentacha_2[] = _( + "Wenn dieses POKéMON auszutrocknen be-\n" + "ginnt, sollte man es schnell wieder ins\n" + "Wasser zurückbringen."); + +static const u8 DexDescription_Tentoxa_1[] = _( + "TENTOXA hat große, rote Kugeln auf \n" + "seinem Kopf. Sie glühen auf, bevor sie \n" + "seine Gegner mit Ultraschall"); +static const u8 DexDescription_Tentoxa_2[] = _( + "erschüttern. Ein Ausbruch dieses \n" + "POKéMON erzeugt starke Wellen \n" + "in seiner Umgebung."); + +static const u8 DexDescription_Kleinstein_1[] = _( + "Je länger ein KLEINSTEIN lebt, desto\n" + "mehr wird seine raue Oberfläche ab-\n" + "geschliffen, so dass es runder wird."); +static const u8 DexDescription_Kleinstein_2[] = _( + "Das Herz dieses POKéMON bleibt aber\n" + "für immer versteinert, hart und rau."); + +static const u8 DexDescription_Georok_1[] = _( + "GEOROK wächst, indem es sich von Stei-\n" + "nen ernährt. Am liebsten mag es Steine,\n" + "die mit Moos überzogen sind."); +static const u8 DexDescription_Georok_2[] = _( + "Dieses POKéMON frisst sich täglich\n" + "durch eine riesige Menge von Steinen."); + +static const u8 DexDescription_Geowaz_1[] = _( + "GEOWAZ lebt hoch in den Bergen. Gibt es \n" + "ein starkes Erdbeben, rollt dieses\n" + "POKéMON so lange den Berg hinunter,"); +static const u8 DexDescription_Geowaz_2[] = _( + "bis es schließlich unten angekommen ist."); + +static const u8 DexDescription_Ponita_1[] = _( + "Nach seiner Geburt ist PONITA so\n" + "schwach, dass es kaum von alleine\n" + "aufstehen kann. Dieses POKéMON wird"); +static const u8 DexDescription_Ponita_2[] = _( + "dadurch schnell stärker, dass es sich\n" + "beim Versuch, mit seinen Eltern Schritt\n" + "zu halten, immer wieder aufrappeln muss."); + +static const u8 DexDescription_Gallopa_1[] = _( + "Man kann GALLOPA dabei beobachten, \n" + "wie es lässig über Felder und Wiesen\n" + "galoppiert. Wenn dieses POKéMON"); +static const u8 DexDescription_Gallopa_2[] = _( + "jedoch Ernst macht, erreicht es bis zu\n" + "240 km/h. Dann beginnt seine Mähne\n" + "zu lodern."); + +static const u8 DexDescription_Flegmon_1[] = _( + "FLEGMON benutzt seinen Schweif, um \n" + "Beute zu fangen, indem es ihn an einem \n" + "Flussufer ins Wasser taucht."); +static const u8 DexDescription_Flegmon_2[] = _( + "Dieses POKéMON vergisst häufig, was es\n" + "gerade tun wollte, und verbringt ganze \n" + "Tage damit, am Ufer herumzutrödeln."); + +static const u8 DexDescription_Lahmus_1[] = _( + "An LAHMUS’ Rute hat sich ein MUSCHAS\n" + "festgebissen. Daher kann es ihn nicht\n" + "mehr zum Angeln benutzen"); +static const u8 DexDescription_Lahmus_2[] = _( + "und es ist dazu gezwungen, umherzu-\n" + "schwimmen und nach Beute Ausschau\n" + "zu halten."); + +static const u8 DexDescription_Magnetilo_1[] = _( + "MAGNETILO ernährt sich von Elektri-\n" + "zität aus Stromleitungen. Dieses\n" + "POKéMON hängt sich gern an"); +static const u8 DexDescription_Magnetilo_2[] = _( + "Sicherungskästen. Wenn es in deinem\n" + "Haus zu einem Stromausfall kommt,\n" + "solltest du die Sicherungen überprüfen."); + +static const u8 DexDescription_Magneton_1[] = _( + "MAGNETON erzeugt ein sehr starkes Mag-\n" + "netfeld, das Maschinen zerstören kann.\n" + "Deshalb hört man in großen Städten oft"); +static const u8 DexDescription_Magneton_2[] = _( + "Sirenen, die die Bürger vor Scharen\n" + "dieses POKéMON warnen sollen."); + +static const u8 DexDescription_Porenta_1[] = _( + "PORENTA trifft man immer mit einer\n" + "Lauchstange an. Es gibt gute und\n" + "schlechte Stangen."); +static const u8 DexDescription_Porenta_2[] = _( + "Dieses POKéMON kämpft mit Hilfe seiner\n" + "Stange gegen seine Gegner."); + +static const u8 DexDescription_Dodu_1[] = _( + "DODU hat zwei Köpfe, die nie zur \n" + "selben Zeit, sondern abwechselnd\n" + "schlafen. Während ein Kopf schläft,"); +static const u8 DexDescription_Dodu_2[] = _( + "hält der andere Ausschau nach Feinden."); + +static const u8 DexDescription_Dodri_1[] = _( + "DODRIs drei Köpfe blicken in drei ver-\n" + "schiedene Richtungen. Es ist immer auf\n" + "der Hut."); +static const u8 DexDescription_Dodri_2[] = _( + "Du solltest dich diesem POKéMON nicht\n" + "nähern, wenn es bereits misstrauisch \n" + "ist. Es könnte nach dir hacken."); + +static const u8 DexDescription_Jurob_1[] = _( + "JUROB jagt unter der eisigen Ober-\n" + "fläche des Eismeeres nach Beute. Zum\n" + "Luft holen schlägt es mit dem"); +static const u8 DexDescription_Jurob_2[] = _( + "vorstehenden Teil seines Kopfes ein \n" + "Loch ins Eis."); + +static const u8 DexDescription_Jugong_1[] = _( + "JUGONG liebt es, auf bitterkalten Eis-\n" + "schollen ein Nickerchen zu machen.\n" + "Ein Seemann, der einmal ein solches"); +static const u8 DexDescription_Jugong_2[] = _( + "POKéMON schlafend auf einem\n" + "Eisberg sah, hielt es irrtümlicherweise\n" + "für eine Meerjungfrau."); + +static const u8 DexDescription_Sleima_1[] = _( + "SLEIMAs glitschiger, gummiartiger\n" + "Körper passt durch jede noch so kleine\n" + "Öffnung. Dieses POKéMON steigt in die"); +static const u8 DexDescription_Sleima_2[] = _( + "Kanalisation hinab, um fauliges\n" + "Abwasser zu trinken."); + +static const u8 DexDescription_Sleimok_1[] = _( + "SLEIMOK scheidet eine widerlich\n" + "stinkende Substanz aus. Ein einziger\n" + "Tropfen seiner Körpersubstanz reicht"); +static const u8 DexDescription_Sleimok_2[] = _( + "aus, um ein Gewässer zu verseuchen."); + +static const u8 DexDescription_Muschas_1[] = _( + "Nachts benutzt dieses POKéMON seine\n" + "breite Zunge, um ein Loch in den \n" + "Meeresboden zu graben."); +static const u8 DexDescription_Muschas_2[] = _( + "Darin schläft es. Dabei schließt es\n" + "seine Schale, aber die Zunge hängt\n" + "heraus."); + +static const u8 DexDescription_Austos_1[] = _( + "AUSTOS kann im Meerwasser schwimmen,\n" + "indem es Wasser schluckt und wieder\n" + "herausspritzt."); +static const u8 DexDescription_Austos_2[] = _( + "Dieses POKéMON kann sich auch ver- \n" + "teidigen, indem es spitze Stacheln mit\n" + "Hilfe des Wasserdrucks verschießt."); + +static const u8 DexDescription_Nebulak_1[] = _( + "NEBULAK hat einen gasförmigen Körper.\n" + "Wenn es starkem Wind ausgesetzt wird,\n" + "kann es davongeweht werden."); +static const u8 DexDescription_Nebulak_2[] = _( + "Scharen dieses POKéMON sammeln sich\n" + "unter Dachrinnen, um sich vor dem\n" + "gefährlichen Wind zu schützen."); + +static const u8 DexDescription_Alpollo_1[] = _( + "ALPOLLO ist ein gefährliches POKéMON.\n" + "Wenn es dich zu sich lockt, während es\n" + "durch die Dunkelheit schwebt, darfst"); +static const u8 DexDescription_Alpollo_2[] = _( + "du ihm keinesfalls zu nahe kommen.\n" + "Dieses POKéMON wird versuchen, an dir\n" + "zu lecken und dein Leben zu stehlen."); + +static const u8 DexDescription_Gengar_1[] = _( + "Nachts kann es passieren, dass dich\n" + "dein Schatten im Licht einer\n" + "Straßenlaterne plötzlich überholt."); +static const u8 DexDescription_Gengar_2[] = _( + "Dann ist es ein GENGAR, das an dir\n" + "vorbeiläuft und sich als dein Schatten\n" + "ausgibt."); + +static const u8 DexDescription_Onix_1[] = _( + "ONIX hat einen Magneten in seinem\n" + "Gehirn. Er dient ihm als Kompass,\n" + "so dass es beim Graben von Tunneln"); +static const u8 DexDescription_Onix_2[] = _( + "nicht die Orientierung verliert. Wenn es\n" + "älter wird, wird sein Körper immer\n" + "runder und glatter."); + +static const u8 DexDescription_Traumato_1[] = _( + "Wenn dir im Schlaf die Nase juckt, ist\n" + "das ein sicheres Zeichen dafür, dass\n" + "eines dieser POKéMON auf deinem"); +static const u8 DexDescription_Traumato_2[] = _( + "Kissen sitzt, um deinen Traum durch\n" + "deine Nasenlöcher hindurch zu\n" + "verspeisen."); + +static const u8 DexDescription_Hypno_1[] = _( + "HYPNO hält ein Pendel in der Hand. Das\n" + "Schwingen und Glitzern des Pendels \n" + "versetzt seine Feinde in eine tiefe"); +static const u8 DexDescription_Hypno_2[] = _( + "Hypnose. Während dieses POKéMON auf \n" + "der Suche nach Beute ist, poliert es \n" + "sein Pendel."); + +static const u8 DexDescription_Krabby_1[] = _( + "KRABBY lebt an Stränden, in Löchern im \n" + "Sand. An Sandstränden, an denen es\n" + "wenig Nahrung findet, sieht man dieses"); +static const u8 DexDescription_Krabby_2[] = _( + "POKéMON mit Artgenossen um sein\n" + "Revier streiten."); + +static const u8 DexDescription_Kingler_1[] = _( + "KINGLER hat eine riesige Schere. Es\n" + "winkt damit, um mit anderen zu \n" + "kommunizieren."); +static const u8 DexDescription_Kingler_2[] = _( + "Da seine Schere aber so schwer ist, wird\n" + "dieses POKéMON schnell müde."); + +static const u8 DexDescription_Voltobal_1[] = _( + "VOLTOBAL wurde zuerst bei einer Firma\n" + "beobachtet, die POKéBÄLLE herstellt.\n" + "Der Zusammenhang zwischen dieser"); +static const u8 DexDescription_Voltobal_2[] = _( + "Beobachtung und der Tatsache, dass\n" + "dieses POKéMON wie ein POKéBALL\n" + "aussieht, ist noch ungeklärt."); + +static const u8 DexDescription_Lektrobal_1[] = _( + "LEKTROBAL ernährt sich von\n" + "Elektrizität aus der Atmosphäre. An\n" + "Tagen, an denen es blitzt, explodiert"); +static const u8 DexDescription_Lektrobal_2[] = _( + "dieses POKéMON dauernd, da es zu viel\n" + "Elektrizität zu sich nimmt."); + +static const u8 DexDescription_Owei_1[] = _( + "Dieses POKéMON besteht aus sechs\n" + "Eiern, die ein engmaschiges Netz\n" + "bilden. Die sechs Eier ziehen sich"); +static const u8 DexDescription_Owei_2[] = _( + "gegenseitig an und drehen sich. Wenn\n" + "die Eier Risse bekommen, steht OWEI\n" + "kurz vor seiner Entwicklung."); + +static const u8 DexDescription_Kokowei_1[] = _( + "KOKOWEI stammt ursprünglich aus den\n" + "Tropen. Seine Köpfe wachsen stetig,\n" + "wenn es starkem Sonnenlicht"); +static const u8 DexDescription_Kokowei_2[] = _( + "ausgesetzt ist. Wenn seine Köpfe\n" + "abfallen, bilden sie zusammen ein OWEI."); + +static const u8 DexDescription_Tragosso_1[] = _( + "TRAGOSSO sehnt sich nach seiner\n" + "Mutter, die nicht mehr da ist. Wenn es\n" + "im Vollmond das Ebenbild seiner Mutter"); +static const u8 DexDescription_Tragosso_2[] = _( + "erblickt, muss es weinen. Die Flecken\n" + "auf dem Totenkopf, den es trägt,\n" + "stammen von vergossenen Tränen."); + +static const u8 DexDescription_Knogga_1[] = _( + "KNOGGA ist eine entwickelte Form von\n" + "TRAGOSSO, die den Verlust der Mutter\n" + "überwunden hat und stärker geworden"); +static const u8 DexDescription_Knogga_2[] = _( + "ist. Die temperamentvolle und\n" + "gestärkte Seele dieses POKéMON ist\n" + "nur schwer zu brechen."); + +static const u8 DexDescription_Kicklee_1[] = _( + "KICKLEE kann seine Beine ausfahren\n" + "und einziehen. Es verblüfft seine\n" + "Gegner mit brutalen Tritten."); +static const u8 DexDescription_Kicklee_2[] = _( + "Nach einem Kampf massiert es seine\n" + "Beine und lockert die Muskeln, um der\n" + "Erschöpfung vorzubeugen."); + +static const u8 DexDescription_Nockchan_1[] = _( + "NOCKCHAN besitzt das Herz eines\n" + "Boxers, der sich auf eine\n" + "Weltmeisterschaft vorbereitet."); +static const u8 DexDescription_Nockchan_2[] = _( + "Dieses POKéMON hat einen unbeugsamen\n" + "Willen und gibt niemals auf."); + +static const u8 DexDescription_Schlurp_1[] = _( + "Wenn SCHLURP etwas Neues entdeckt,\n" + "leckt es daran. Es merkt sich \n" + "Gegenstände anhand der Struktur und"); +static const u8 DexDescription_Schlurp_2[] = _( + "des Geschmacks.\n" + "Saure Sachen schrecken es eher ab."); + +static const u8 DexDescription_Smogon_1[] = _( + "Wenn SMOGON sich aufregt, lässt es\n" + "das giftige Gas in seinem Inneren\n" + "entweichen. Wenn es sich zu sehr"); +static const u8 DexDescription_Smogon_2[] = _( + "aufbläht, explodiert dieses POKéMON."); + +static const u8 DexDescription_Smogmog_1[] = _( + "SMOGMOG liebt die Gase verrottender,\n" + "fauler Küchenabfälle. Dieses POKéMON\n" + "sucht sich ein vernachlässigtes,"); +static const u8 DexDescription_Smogmog_2[] = _( + "schmutziges Gebäude und richtet sich\n" + "dort häuslich ein. Nachts, wenn die\n" + "Menschen schlafen, wühlt es im Müll."); + +static const u8 DexDescription_Rihorn_1[] = _( + "RIHORN läuft immer geradeaus und\n" + "zerstampft alles, was ihm in die Quere\n" + "kommt. Es macht ihm auch nichts aus,"); +static const u8 DexDescription_Rihorn_2[] = _( + "wenn es mit dem Kopf voran gegen einen\n" + "Stahlklotz rennt. Am nächsten Tag\n" + "allerdings könnte es Schmerzen haben."); + +static const u8 DexDescription_Rizeros_1[] = _( + "Mit seinem Horn kann RIZEROS selbst\n" + "Diamanten zerbrechen. Ein einziger\n" + "Hieb mit seinem Schweif kann ein Haus"); +static const u8 DexDescription_Rizeros_2[] = _( + "zum Einsturz bringen. Die Haut dieses\n" + "POKéMON ist so hart, dass nicht einmal\n" + "Kanonenkugeln Kratzer hinterlassen."); + +static const u8 DexDescription_Chaneira_1[] = _( + "CHANEIRA legt täglich ausgesprochen\n" + "nahrhafte Eier. Sie sind so köstlich,\n" + "dass sie sogar von Menschen verspeist"); +static const u8 DexDescription_Chaneira_2[] = _( + "werden, die gar keinen Appetit haben."); + +static const u8 DexDescription_Tangela_1[] = _( + "Wenn man TANGELAs Ranken berührt, \n" + "fallen diese sofort ab. Das tut ihm\n" + "aber nicht weh und es kann"); +static const u8 DexDescription_Tangela_2[] = _( + "sich schnell in Sicherheit bringen. \n" + "Verliert es Ranken, werden diese am\n" + "nächsten Tag durch neue ersetzt."); + +static const u8 DexDescription_Kangama_1[] = _( + "Wenn du auf ein spielendes KANGAMA\n" + "stößt, solltest du es nicht stören oder\n" + "versuchen, es einzufangen."); +static const u8 DexDescription_Kangama_2[] = _( + "Die Mutter dieses Baby-POKéMON ist\n" + "bestimmt in Reichweite und könnte\n" + "sehr wütend auf dich werden."); + +static const u8 DexDescription_Seeper_1[] = _( + "SEEPER ernährt sich von kleinen\n" + "Insekten und dem Moos auf Steinen.\n" + "Bei unruhiger See verankert sich"); +static const u8 DexDescription_Seeper_2[] = _( + "dieses POKéMON mit seinem Schweif an\n" + "Steinen oder Korallen, damit es nicht\n" + "weggespült wird."); + +static const u8 DexDescription_Seemon_1[] = _( + "Sobald sich SEEMON um eine Koralle\n" + "gewickelt hat, schläft es. Von Zeit zu\n" + "Zeit werden Menschen durch die"); +static const u8 DexDescription_Seemon_2[] = _( + "Widerhaken dieses POKéMON verletzt, \n" + "wenn sie versuchen, Korallen zu ernten\n" + "und es dabei nicht bemerken."); + +static const u8 DexDescription_Goldini_1[] = _( + "GOLDINI ist ein wunderschönes POKéMON,\n" + "dessen Flossen sich elegant im Wasser\n" + "wiegen. Aber man muss auf dieses"); +static const u8 DexDescription_Goldini_2[] = _( + "POKéMON Acht geben. Es könnte einen\n" + "sonst heftig mit seinem Horn rammen."); + +static const u8 DexDescription_Golking_1[] = _( + "Im Herbst kann man männliche GOLKING\n" + "dabei beobachten, wie sie Balztänze in \n" + "Flussbetten aufführen, um die"); +static const u8 DexDescription_Golking_2[] = _( + "weiblichen Exemplare zu beeindrucken.\n" + "Während dieser Zeit ist die Farbe\n" + "dieser POKéMON am schönsten."); + +static const u8 DexDescription_Sterndu_1[] = _( + "In STERNDUs Körpermitte befindet sich\n" + "ein hellrot leuchtendes Organ - \n" + "sein Kern. Wenn du im Spätsommer"); +static const u8 DexDescription_Sterndu_2[] = _( + "an einen Strand gehst, sehen die\n" + "leuchtenden Kerne dieser POKéMON aus\n" + "wie Sterne."); + +static const u8 DexDescription_Starmie_1[] = _( + "STARMIEs Mittelteil, sein Kern, leuchtet\n" + "in sieben Farben. Aufgrund dieser\n" + "Eigenschaft wird es auch"); +static const u8 DexDescription_Starmie_2[] = _( + "“Juwel des Meeres” genannt."); + +static const u8 DexDescription_Pantimos_1[] = _( + "PANTIMOS ist ein Meister der Pantomime.\n" + "Seine Gesten und Bewegungen machen\n" + "den Zuschauer glauben, dass etwas"); +static const u8 DexDescription_Pantimos_2[] = _( + "Unsichtbares tatsächlich existiert.\n" + "Wenn ein Objekt für real gehalten wird,\n" + "beginnt es wirklich zu existieren."); + +static const u8 DexDescription_Sichlor_1[] = _( + "SICHLOR ist unheimlich schnell. Dadurch\n" + "werden die beiden Sensen an seinen\n" + "Unterarmen noch effektiver."); +static const u8 DexDescription_Sichlor_2[] = _( + "Dieses POKéMON kann mit seinen Sensen\n" + "in Sekundenschnelle Baumstämme\n" + "zerteilen."); + +static const u8 DexDescription_Rossana_1[] = _( + "ROSSANA bewegt sich rhythmisch fort.\n" + "Es wiegt und schwingt seine Hüften, als\n" + "würde es tanzen. Seine Bewegungen"); +static const u8 DexDescription_Rossana_2[] = _( + "wirken so anziehend auf Menschen, dass\n" + "diese beginnen, mit den Hüften zu\n" + "schwingen, ohne darüber nachzudenken."); + +static const u8 DexDescription_Elektek_1[] = _( + "Bei Gewitter konkurrieren diese\n" + "POKéMON darum, wie viele\n" + "Spannungseinheiten sie erreichen,"); +static const u8 DexDescription_Elektek_2[] = _( + "wenn sie vom Blitz getroffen werden.\n" + "Einige Ortschaften benutzen ELEKTEK\n" + "an Stelle von Blitzableitern."); + +static const u8 DexDescription_Magmar_1[] = _( + "Im Kampf stößt MAGMAR glühend heiße\n" + "Flammen aus, um seinen Gegner\n" + "einzuschüchtern."); +static const u8 DexDescription_Magmar_2[] = _( + "Diese Feuersalven erzeugen Hitzewellen,\n" + "die das Gras und die Bäume der Umgebung\n" + "in Brand setzen."); + +static const u8 DexDescription_Pinsir_1[] = _( + "PINSIR ist erstaunlich stark. Es kann\n" + "einen Feind, der doppelt so viel wiegt\n" + "wie es selbst, mit seinen Hörnern"); +static const u8 DexDescription_Pinsir_2[] = _( + "packen und hochheben. Bei niedrigen\n" + "Temperaturen werden die Bewegungen\n" + "dieses POKéMON schwerfällig."); + +static const u8 DexDescription_Tauros_1[] = _( + "Dieses POKéMON ist nur zufrieden, wenn\n" + "es kämpfen kann. Wenn TAUROS keinen\n" + "Gegner findet, sucht es sich starke"); +static const u8 DexDescription_Tauros_2[] = _( + "Bäume und lässt sich an ihnen aus,\n" + "um sich abzureagieren."); + +static const u8 DexDescription_Karpador_1[] = _( + "KARPADOR ist ein armseliges POKéMON,\n" + "das nur platschen kann. Sein\n" + "merkwürdiges Verhalten hat so manchen"); +static const u8 DexDescription_Karpador_2[] = _( + "Wissenschaftler zum Forschen\n" + "angeregt."); + +static const u8 DexDescription_Garados_1[] = _( + "Wenn sich KARPADOR zu GARADOS\n" + "entwickelt, durchlaufen seine\n" + "Gehirnzellen eine strukturelle"); +static const u8 DexDescription_Garados_2[] = _( + "Veränderung, was wohl der Grund für die\n" + "zügellose, gewalttätige Natur dieses\n" + "POKéMON ist."); + +static const u8 DexDescription_Lapras_1[] = _( + "Die Menschen sind dafür verantwortlich,\n" + "dass LAPRAS fast ausgestorben wäre.\n" + "Abends singt es traurige Klagelieder,"); +static const u8 DexDescription_Lapras_2[] = _( + "da nur noch wenige seiner Artgenossen\n" + "übrig sind."); + +static const u8 DexDescription_Ditto_1[] = _( + "DITTO verändert seine Zellstruktur, um\n" + "sich in eine andere Form zu verwandeln.\n" + "Wenn es sich dabei jedoch auf sein"); +static const u8 DexDescription_Ditto_2[] = _( + "Gedächtnis verlässt, unterlaufen \n" + "diesem POKéMON schon mal Fehler."); + +static const u8 DexDescription_Evoli_1[] = _( + "EVOLIs genetisches Erbmaterial ist so\n" + "instabil, dass die Umgebung plötzliche\n" + "Mutationen auslösen kann."); +static const u8 DexDescription_Evoli_2[] = _( + "Die Wirkung verschiedener \n" + "STEINE führt zur Entwicklung dieses \n" + "POKéMON."); + +static const u8 DexDescription_Aquana_1[] = _( + "AQUANA hat eine spontane Mutation\n" + "durchgemacht und ihm sind Flossen und \n" + "Kiemen gewachsen. Dadurch kann es"); +static const u8 DexDescription_Aquana_2[] = _( + "unter Wasser leben.\n" + "Dieses POKéMON kann Wasser nach\n" + "Belieben manipulieren."); + +static const u8 DexDescription_Blitza_1[] = _( + "BLITZAs Zellen erzeugen schwache\n" + "Elektrizität. Diese wird aber durch die\n" + "statische Aufladung seines Fells"); +static const u8 DexDescription_Blitza_2[] = _( + "verstärkt, so dass es Blitzschläge\n" + "erzeugen kann. Sein Fell besteht aus \n" + "elektrisch geladenen Nadeln."); + +static const u8 DexDescription_Flamara_1[] = _( + "FLAMARAs flauschiges Fell dient einem\n" + "besonderen Zweck. Es gibt Hitze an die\n" + "Luft ab, damit sein Körper nicht"); +static const u8 DexDescription_Flamara_2[] = _( + "zu heiß wird. Die Körpertemperatur \n" + "dieses POKéMON kann bis auf 900 Grad\n" + "ansteigen."); + +static const u8 DexDescription_Porygon_1[] = _( + "PORYGON ist in der Lage, sich in Daten\n" + "zurückzuverwandeln und in den\n" + "Cyberspace zu gelangen."); +static const u8 DexDescription_Porygon_2[] = _( + "Dieses POKéMON ist kopiergeschützt, so\n" + "dass es durch Kopieren nicht\n" + "vervielfältigt werden kann."); + +static const u8 DexDescription_Amonitas_1[] = _( + "AMONITAS ist ein POKéMON, das seit\n" + "langer Zeit ausgestorben war, aber\n" + "von den Menschen aus Fossilien"); +static const u8 DexDescription_Amonitas_2[] = _( + "reproduziert wurde. Wenn es von einem\n" + "Feind angegriffen wird, zieht es sich in\n" + "sein hartes Gehäuse zurück."); + +static const u8 DexDescription_Amoroso_1[] = _( + "AMOROSO benutzt seine Tentakel, um\n" + "Beute einzufangen. Man nimmt an,\n" + "dass es ausgestorben ist, weil seine"); +static const u8 DexDescription_Amoroso_2[] = _( + "Schale zu groß und zu schwer geworden\n" + "war, so dass seine Bewegungen immer\n" + "langsamer und schwerfälliger wurden."); + +static const u8 DexDescription_Kabuto_1[] = _( + "KABUTO ist ein POKéMON, das aus einem\n" + "Fossil reproduziert wurde. Höchst\n" + "selten wurden lebende Exemplare dieser"); +static const u8 DexDescription_Kabuto_2[] = _( + "Art entdeckt.\n" + "Dieses POKéMON hat sich seit 300 Mio.\n" + "Jahren überhaupt nicht verändert."); + +static const u8 DexDescription_Kabutops_1[] = _( + "In der Antike jagte KABUTOPS unter\n" + "Wasser nach Beute. Es hat sich von\n" + "einem Meeresbewohner zu einem Land-"); +static const u8 DexDescription_Kabutops_2[] = _( + "bewohner entwickelt, was man an den\n" + "Veränderungen seiner Kiemen und\n" + "Beine sehen kann."); + +static const u8 DexDescription_Aerodactyl_1[] = _( + "AERODACTYL ist ein POKéMON aus dem\n" + "Zeitalter der Dinosaurier. Es wurde aus\n" + "genetischem Material reproduziert, das"); +static const u8 DexDescription_Aerodactyl_2[] = _( + "aus Bernstein gewonnen wurde.\n" + "Man geht davon aus, dass es in der\n" + "Antike der König der Lüfte war."); + +static const u8 DexDescription_Relaxo_1[] = _( + "Der typische Tagesablauf von RELAXO\n" + "besteht lediglich aus Essen und\n" + "Schlafen. Es ist so zutraulich, dass"); +static const u8 DexDescription_Relaxo_2[] = _( + "Kinder seinen dicken Bauch als Platz\n" + "zum Spielen nutzen."); + +static const u8 DexDescription_Arktos_1[] = _( + "ARKTOS ist ein sagenumwobenes\n" + "Vogel-POKéMON, das Eis manipulieren\n" + "kann. Das Schlagen seiner Flügel"); +static const u8 DexDescription_Arktos_2[] = _( + "bringt die Luft zum Gefrieren. Es wird\n" + "behauptet, dass es zu schneien\n" + "beginnt, wenn dieses POKéMON fliegt."); + +static const u8 DexDescription_Zapdos_1[] = _( + "ZAPDOS ist ein legendäres\n" + "Vogel-POKéMON, das die Fähigkeit\n" + "besitzt, Elektrizität zu manipulieren."); +static const u8 DexDescription_Zapdos_2[] = _( + "Es lebt in Gewitterwolken.\n" + "Dieses POKéMON nimmt Energie auf,\n" + "wenn es vom Blitz getroffen wird."); + +static const u8 DexDescription_Lavados_1[] = _( + "LAVADOS ist ein legendäres\n" + "Vogel-POKéMON, das Feuer manipulieren\n" + "kann. Wenn es verletzt wird, taucht es"); +static const u8 DexDescription_Lavados_2[] = _( + "seinen Körper in das Magma eines\n" + "Vulkans, um sich zu verbrennen\n" + "und selbst zu heilen."); + +static const u8 DexDescription_Dratini_1[] = _( + "DRATINI häutet sich ständig und\n" + "entledigt sich so seiner Haut, da die\n" + "Lebensenergie in seinem Körper"); +static const u8 DexDescription_Dratini_2[] = _( + "stetig und unkontrollierbar ansteigt."); + +static const u8 DexDescription_Dragonir_1[] = _( + "DRAGONIR speichert eine enorme Menge\n" + "an Energie in seinem Körper. Es kann die\n" + "Witterung in seiner Umgebung ändern,"); +static const u8 DexDescription_Dragonir_2[] = _( + "indem es Energie aus den Kristallen an\n" + "seinem Nacken und an seinem Schweif\n" + "entlädt."); + +static const u8 DexDescription_Dragoran_1[] = _( + "DRAGORAN kann die Welt innerhalb\n" + "von 16 Stunden umkreisen.\n" + "Es ist ein gutherziges POKéMON, das"); +static const u8 DexDescription_Dragoran_2[] = _( + "vermisste und sinkende Schiffe bei\n" + "Unwetter sicher an Land zurückbringt."); + +static const u8 DexDescription_Mewtu_1[] = _( + "MEWTU ist ein POKéMON, das durch\n" + "Genmanipulation entstanden ist. Die\n" + "Menschen haben es zwar mit ihrem"); +static const u8 DexDescription_Mewtu_2[] = _( + "wissenschaftlichen Sachverstand\n" + "erzeugt, aber nicht mit einem\n" + "mitfühlenden Herzen ausgestattet."); + +static const u8 DexDescription_Mew_1[] = _( + "MEW soll die genetische\n" + "Zusammensetzung aller POKéMON\n" + "besitzen. Es kann sich unsichtbar"); +static const u8 DexDescription_Mew_2[] = _( + "machen, so dass es sich auch Menschen\n" + "nähern kann, ohne bemerkt zu werden."); + +static const u8 DexDescription_Endivie_1[] = _( + "Im Kampf wedelt ENDIVIE mit seinem\n" + "Blatt, um den Feind fern zu halten. Von\n" + "dem Blatt geht auch ein süßlicher Duft"); +static const u8 DexDescription_Endivie_2[] = _( + "aus, der die kämpfenden POKéMON\n" + "beruhigt und eine gemütliche,\n" + "freundliche Atmosphäre schafft."); + +static const u8 DexDescription_Lorblatt_1[] = _( + "LORBLATTs Nacken ist mit\n" + "zusammengerollten Blättern behangen.\n" + "In jedem Blatt befindet sich ein kleiner"); +static const u8 DexDescription_Lorblatt_2[] = _( + "Trieb eines Baumes.\n" + "Der Duft dieses Triebes bringt\n" + "Menschen auf Trab."); + +static const u8 DexDescription_Meganie_1[] = _( + "Der Duft von MEGANIEs Blume besänftigt\n" + "Gemüter. Im Kampf gibt dieses POKéMON\n" + "mehr von seinem beruhigenden"); +static const u8 DexDescription_Meganie_2[] = _( + "Duftstoff ab, um den Kampfgeist des\n" + "Gegners zu schwächen."); + +static const u8 DexDescription_Feurigel_1[] = _( + "FEURIGEL lässt Flammen aus seinem\n" + "Rücken lodern, wenn es sich schützen\n" + "muss. Die Flammen sind sehr verzehrend,"); +static const u8 DexDescription_Feurigel_2[] = _( + "wenn dieses POKéMON wütend ist. Ist es\n" + "aber müde, flackern die Flammen nur\n" + "unregelmäßig und schwach."); + +static const u8 DexDescription_Igelavar_1[] = _( + "IGELAVAR hält seine Gegner mit Flammen\n" + "und Böen heißer Luft auf Distanz.\n" + "Dieses POKéMON nutzt seine"); +static const u8 DexDescription_Igelavar_2[] = _( + "außergewöhnliche Gewandtheit dazu,\n" + "Angriffen auszuweichen und seinen\n" + "Gegner gleichzeitig zu versengen."); + +static const u8 DexDescription_Tornupto_1[] = _( + "TORNUPTO versteckt sich hinter einem\n" + "flimmernden Hitzeschild, den es mit\n" + "Hilfe seiner heißen Flammen erzeugt."); +static const u8 DexDescription_Tornupto_2[] = _( + "Dieses POKéMON erzeugt Explosionen,\n" + "die alles in Schutt und Asche\n" + "legen."); + +static const u8 DexDescription_Karnimani_1[] = _( + "KARNIMANI ist zwar sehr klein, aber\n" + "seine Kiefer sind sehr stark. Wenn\n" + "die POKéMON denken, dass es nur"); +static const u8 DexDescription_Karnimani_2[] = _( + "spielerisch an ihnen knabbert, sollten\n" + "sie vorsichtig sein, denn sein Biss \n" + "kann zu schweren Verletzungen führen."); + +static const u8 DexDescription_Tyracroc_1[] = _( + "Wenn TYRACROC einen Feind mit seinen\n" + "Kiefern eingeklemmt hat, lässt es ihn\n" + "nicht mehr los. Da seine Zahnspitzen"); +static const u8 DexDescription_Tyracroc_2[] = _( + "wie Angelhaken gebogen sind, kann man\n" + "sie nicht mehr entfernen, wenn sie\n" + "sich verfangen haben."); + +static const u8 DexDescription_Impergator_1[] = _( + "IMPERGATOR schüchtert seine Feinde\n" + "dadurch ein, dass es sein riesiges Maul\n" + "aufreißt. Im Kampf erschüttert es den"); +static const u8 DexDescription_Impergator_2[] = _( + "Boden mit seinen kräftigen Hinterbei-\n" + "nen, wenn es mit unglaublicher Geschwin-\n" + "digkeit auf seinen Gegner losrennt."); + +static const u8 DexDescription_Wiesor_1[] = _( + "Wenn WIESOR schläft, hält immer jemand\n" + "Wache. Beim ersten Anflug von Gefahr\n" + "weckt die Wache die anderen auf."); +static const u8 DexDescription_Wiesor_2[] = _( + "Wenn dieses POKéMON von seinen\n" + "Artgenossen getrennt wird, kann es\n" + "vor Angst nicht mehr schlafen."); + +static const u8 DexDescription_Wiesenior_1[] = _( + "WIESENIOR ist sehr schlank. Wenn es\n" + "angegriffen wird, kann es sich durch\n" + "enge Zwischenräume schlängeln und"); +static const u8 DexDescription_Wiesenior_2[] = _( + "entkommen. Trotz seiner kurzen\n" + "Gliedmaßen ist dieses POKéMON sehr\n" + "wendig und flink."); + +static const u8 DexDescription_Hoothoot_1[] = _( + "HOOTHOOT besitzt ein inneres Organ, das\n" + "die Erdumdrehung wahrnimmt. Dieses\n" + "besondere Organ ermöglicht es diesem"); +static const u8 DexDescription_Hoothoot_2[] = _( + "POKéMON, jeden Tag zur selben Zeit zu\n" + "schreien."); + +static const u8 DexDescription_Noctuh_1[] = _( + "Dank seines hervorragenden\n" + "Sehvermögens, mit dem es auch bei\n" + "geringer Beleuchtung sehen kann, und"); +static const u8 DexDescription_Noctuh_2[] = _( + "dank seiner geschmeidigen Flügel,\n" + "mit denen es geräuschlos fliegt,\n" + "entgeht NOCTUH keine Beute."); + +static const u8 DexDescription_Ledyba_1[] = _( + "LEDYBA sondert eine duftende\n" + "Flüssigkeit ab. Darüber kommuniziert\n" + "es mit anderen. Dieses POKéMON"); +static const u8 DexDescription_Ledyba_2[] = _( + "übermittelt seine Gefühle, indem es die\n" + "Duftnote des Sekrets verändert."); + +static const u8 DexDescription_Ledian_1[] = _( + "In Ländern mit frischer Luft und\n" + "Sternen am Himmel leben unzählig viele\n" + "LEDIAN."); +static const u8 DexDescription_Ledian_2[] = _( + "Dafür gibt es einen guten Grund:\n" + "Dieses POKéMON nutzt das Licht der\n" + "Sterne als Energie."); + +static const u8 DexDescription_Webarak_1[] = _( + "Das von WEBARAK gesponnene Netz ist\n" + "sein zweites Nervensystem. Dieses\n" + "POKéMON kann anhand der feinen"); +static const u8 DexDescription_Webarak_2[] = _( + "Vibrationen der Netzfäden bestimmen,\n" + "welche Art Beute sich darauf befindet."); + +static const u8 DexDescription_Ariados_1[] = _( + "ARIADOS hat kleine hakenförmige Krallen\n" + "an seinen Füßen. Damit kann es an\n" + "Decken und Wänden entlang flitzen."); +static const u8 DexDescription_Ariados_2[] = _( + "Dieses POKéMON erdrückt seine Gegner\n" + "mit starkem, dünnem Seidenfaden."); + +static const u8 DexDescription_Iksbat_1[] = _( + "Wenn IKSBAT fliegt, indem es nur ein \n" + "Paar Flügel, entweder an seinen Vorder-\n" + "oder Hinterbeinen bewegt, ist dies ein"); +static const u8 DexDescription_Iksbat_2[] = _( + "Anzeichen dafür, dass dieses POKéMON \n" + "bereits eine lange Strecke hinter sich\n" + "hat. Dann wechselt es die Flügel häufig."); + +static const u8 DexDescription_Lampi_1[] = _( + "LAMPI gibt positive und negative\n" + "elektrische Ladungen durch seine\n" + "Antennen ab, um seine Beute zu lähmen."); +static const u8 DexDescription_Lampi_2[] = _( + "Dieses POKéMON lässt seine Lichter\n" + "aufflackern und tauscht Signale mit\n" + "seinen Artgenossen aus."); + +static const u8 DexDescription_Lanturn_1[] = _( + "LANTURN wird auch “Tiefseestern”\n" + "genannt, da es leuchtende Antennen\n" + "besitzt. Dieses POKéMON erzeugt Licht,"); +static const u8 DexDescription_Lanturn_2[] = _( + "indem es in den Antennen eine chemische\n" + "Reaktion zwischen Bakterien und seinen\n" + "Körperflüssigkeiten erzeugt."); + +static const u8 DexDescription_Pichu_1[] = _( + "An Gewittertagen oder Tagen, an denen\n" + "die Luft sehr trocken ist, kann sich\n" + "PICHU leichter mit Elektrizität"); +static const u8 DexDescription_Pichu_2[] = _( + "aufladen. Dann kann man das Knistern\n" + "statischer Aufladung hören."); + +static const u8 DexDescription_Pii_1[] = _( + "In Nächten mit vielen Sternschnuppen,\n" + "kann man PII im Kreis tanzen sehen. Es\n" + "tanzt die ganze Nacht hindurch und"); +static const u8 DexDescription_Pii_2[] = _( + "hört erst bei Sonnenaufgang auf, um\n" + "seinen Durst mit Morgentau zu stillen."); + +static const u8 DexDescription_Fluffeluff_1[] = _( + "FLUFFELUFFs Stimmbänder sind noch\n" + "nicht voll entwickelt. Wenn es zu viel\n" + "singt, schmerzt ihm die Kehle."); +static const u8 DexDescription_Fluffeluff_2[] = _( + "Dieses POKéMON gurgelt mit Süßwasser\n" + "aus einem sauberen Fluss."); + +static const u8 DexDescription_Togepi_1[] = _( + "TOGEPI nutzt die positiven Emotionen,\n" + "wie Freude und Mitgefühl, von Menschen\n" + "und POKéMON als Energie."); +static const u8 DexDescription_Togepi_2[] = _( + "Dieses POKéMON speichert Glücksgefühle\n" + "in seiner Schale und teilt sie mit\n" + "anderen."); + +static const u8 DexDescription_Togetic_1[] = _( + "TOGETIC ist ein POKéMON, das Glück\n" + "bringt. Wenn es jemanden trifft, der\n" + "reinen Herzens ist, zeigt es sich und"); +static const u8 DexDescription_Togetic_2[] = _( + "teilt sein Glück mit dieser Person."); + +static const u8 DexDescription_Natu_1[] = _( + "NATU kann nicht fliegen, da seine Flügel\n" + "noch nicht ausgewachsen sind. Wenn du\n" + "diesem POKéMON in die Augen schaust,"); +static const u8 DexDescription_Natu_2[] = _( + "starrt es dich konzentriert an. Wenn du\n" + "dich aber bewegst, hüpft es weg, um sich\n" + "in Sicherheit zu bringen."); + +static const u8 DexDescription_Xatu_1[] = _( + "XATU bleibt den ganzen Tag an ein und\n" + "demselben Ort wie angewurzelt stehen. \n" + "Die Menschen glauben, dass es dies aus"); +static const u8 DexDescription_Xatu_2[] = _( + "Angst vor den Dingen tut, die es für die\n" + "Zukunft vorausgesehen hat."); + +static const u8 DexDescription_Voltilamm_1[] = _( + "VOLTILAMMs flauschiges, wollenes Fell\n" + "erzeugt Reibung und statische\n" + "Aufladung. Je höher die elektrische"); +static const u8 DexDescription_Voltilamm_2[] = _( + "Ladung wird, desto heller leuchtet die\n" + "Glühbirne an seinem Schweif."); + +static const u8 DexDescription_Waaty_1[] = _( + "Die Qualität von WAATYs Wolle verändert\n" + "sich, so dass es mit nur wenig Wolle eine\n" + "große statische Aufladung erzeugen"); +static const u8 DexDescription_Waaty_2[] = _( + "kann. Die kahlen Stellen in seinem Fell\n" + "sind gegen Elektrizität abgeschirmt."); + +static const u8 DexDescription_Ampharos_1[] = _( + "AMPHAROS strahlt so viel Licht aus,\n" + "dass es sogar aus dem Weltraum noch \n" + "gesehen werden kann. In der Antike"); +static const u8 DexDescription_Ampharos_2[] = _( + "benutzten die Menschen das Licht\n" + "dieses POKéMON dazu, Signale über\n" + "weite Entfernungen auszutauschen."); + +static const u8 DexDescription_Blubella_1[] = _( + "Wenn BLUBELLA starkem Sonnenlicht\n" + "ausgesetzt ist, beginnen sich die Blät-\n" + "ter an seinem Körper zu drehen."); +static const u8 DexDescription_Blubella_2[] = _( + "Der Tanz dieses POKéMON ist in\n" + "südlichen Ländern sehr bekannt."); + +static const u8 DexDescription_Marill_1[] = _( + "MARILLs Schweif ist mit Öl gefüllt und\n" + "dient ihm als eine Art Rettungsring.\n" + "Wenn nur sein Schweif an der"); +static const u8 DexDescription_Marill_2[] = _( + "Wasseroberfläche zu sehen ist, taucht\n" + "dieses POKéMON gerade, um sich von\n" + "Wasserpflanzen zu ernähren."); + +static const u8 DexDescription_Azumarill_1[] = _( + "AZUMARILLs lange Ohren dienen ihm\n" + "als unentbehrliche Sensoren. Wenn es\n" + "sein Gehör fokussiert, kann dieses"); +static const u8 DexDescription_Azumarill_2[] = _( + "POKéMON auch in reißenden Flüssen\n" + "identifizieren, welche Art von Beute\n" + "sich in seiner Nähe befindet."); + +static const u8 DexDescription_Mogelbaum_1[] = _( + "MOGELBAUM tarnt sich als Baum, um\n" + "Angriffen von Feinden aus dem Weg\n" + "zu gehen. Da seine Vorderbeine aber"); +static const u8 DexDescription_Mogelbaum_2[] = _( + "das ganze Jahr über grün bleiben, fällt\n" + "seine Tarnung im Winter leicht auf."); + +static const u8 DexDescription_Quaxo_1[] = _( + "QUAXO hat gelocktes Haar, das ihm den\n" + "Status eines Königs bescheinigt. Je\n" + "länger und lockiger sein Haar ist, desto"); +static const u8 DexDescription_Quaxo_2[] = _( + "mehr Respekt erntet dieses POKéMON\n" + "von seinen Artgenossen."); + +static const u8 DexDescription_Hoppspross_1[] = _( + "HOPPSPROSS lässt sich vom Wind\n" + "treiben. Wenn es bemerkt, dass ein\n" + "Sturm aufkommt, verbindet es seine"); +static const u8 DexDescription_Hoppspross_2[] = _( + "Blätter mit anderen HOPPSPROSS,\n" + "damit es nicht davongeweht wird."); + +static const u8 DexDescription_Hubelupf_1[] = _( + "HUBELUPFs Blume beginnt zu blühen, wenn\n" + "die Temperatur über 18 Grad steigt. Wie\n" + "weit sich die Blüte öffnet, hängt von"); +static const u8 DexDescription_Hubelupf_2[] = _( + "der Höhe der Temperatur ab. Daher wird\n" + "dieses POKéMON manchmal als\n" + "Thermometer eingesetzt."); + +static const u8 DexDescription_Papungha_1[] = _( + "PAPUNGHA nutzt den Südwind, um das\n" + "Meer zu überqueren und in ferne\n" + "Länder zu fliegen. Dieses POKéMON"); +static const u8 DexDescription_Papungha_2[] = _( + "sinkt zu Boden, wenn es während seines\n" + "Fluges auf kalte Luftschichten stößt."); + +static const u8 DexDescription_Griffel_1[] = _( + "An GRIFFELs Schweif befindet sich ein\n" + "handähnliches Anhängsel, mit dem es\n" + "geschickt zu Werke gehen kann."); +static const u8 DexDescription_Griffel_2[] = _( + "Da dieses POKéMON sehr häufig seinen\n" + "Schweif einsetzt, wirken seine Hände\n" + "eher plump."); + +static const u8 DexDescription_Sonnkern_1[] = _( + "SONNKERN versucht, sich so wenig wie\n" + "möglich zu bewegen, um alle\n" + "gespeicherten Nährstoffe für seine"); +static const u8 DexDescription_Sonnkern_2[] = _( + "Entwicklung aufzusparen. Außer\n" + "Morgentau nimmt es nichts weiter zu\n" + "sich."); + +static const u8 DexDescription_Sonnflora_1[] = _( + "SONNFLORA verwandelt Solarenergie in\n" + "Nährstoffe. Tagsüber, wenn es warm ist,\n" + "ist es sehr aktiv."); +static const u8 DexDescription_Sonnflora_2[] = _( + "Wenn aber die Sonne untergegangen ist,\n" + "hört es auf sich zu bewegen."); + +static const u8 DexDescription_Yanma_1[] = _( + "YANMA hat einen Blickwinkel von 360\n" + "Grad, ohne die Augen bewegen zu müssen.\n" + "Es ist ein großartiger Flieger und geübt"); +static const u8 DexDescription_Yanma_2[] = _( + "darin, plötzlich anzuhalten oder\n" + "Wendemanöver vorzunehmen. So kann es\n" + "sich blitzschnell auf Beute stürzen."); + +static const u8 DexDescription_Felino_1[] = _( + "FELINO lebt eigentlich im Wasser.\n" + "Manchmal kommt es jedoch an Land, um \n" + "nach Nahrung zu suchen."); +static const u8 DexDescription_Felino_2[] = _( + "An Land bedeckt es seinen Körper mit\n" + "einem schleimigen Giftfilm."); + +static const u8 DexDescription_Morlord_1[] = _( + "MORLORD jagt seine Nahrung, indem es im\n" + "Wasser sein Maul weit aufmacht und\n" + "auf unvorsichtige Beute wartet."); +static const u8 DexDescription_Morlord_2[] = _( + "Da sich dieses POKéMON nicht bewegt,\n" + "wird es auch nicht besonders hungrig."); + +static const u8 DexDescription_Psiana_1[] = _( + "PSIANA ist jedem TRAINER treu, dem es\n" + "zugetan ist. Dieses POKéMON hat die\n" + "Fähigkeit der Prophezeiung entwickelt,"); +static const u8 DexDescription_Psiana_2[] = _( + "um seine TRAINER vor Unheil zu\n" + "bewahren."); + +static const u8 DexDescription_Nachtara_1[] = _( + "NACHTARA hat sich dadurch entwickelt,\n" + "dass es den Mondwellen ausgesetzt war.\n" + "Es versteckt sich im Schutze der"); +static const u8 DexDescription_Nachtara_2[] = _( + "Dunkelheit und wartet darauf, dass sich\n" + "ein Feind bewegt. Die Ringe an seinem\n" + "Körper leuchten auf, wenn es angreift."); + +static const u8 DexDescription_Kramurx_1[] = _( + "KRAMURX wurde als vermeintlicher\n" + "Überbringer des Unheils verabscheut\n" + "und gefürchtet. Dieses POKéMON hat"); +static const u8 DexDescription_Kramurx_2[] = _( + "ein großes Interesse an allem, was\n" + "funkelt und glitzert. Es stiehlt auch\n" + "Ringe von Frauen."); + +static const u8 DexDescription_Laschoking_1[] = _( + "LASCHOKING betreibt jeden Tag \n" + "Forschung, um die Geheimnisse der Welt\n" + "zu lüften. Dieses POKéMON vergisst aber"); +static const u8 DexDescription_Laschoking_2[] = _( + "alles, was es bereits herausgefunden\n" + "hat, wenn das MUSCHAS auf seinem\n" + "Kopf abfällt."); + +static const u8 DexDescription_Traunfugil_1[] = _( + "TRAUNFUGIL erschreckt Menschen mit\n" + "einem markerschütternden Schrei.\n" + "Dieses POKéMON verwendet seine roten"); +static const u8 DexDescription_Traunfugil_2[] = _( + "Kraftfelder dazu, die Ängste seiner\n" + "Feinde aufzunehmen und sie in\n" + "Nahrung umzuwandeln."); + +static const u8 DexDescription_Icognito_1[] = _( + "ICOGNITO hat die Form antiker\n" + "Schriftzeichen. Bis heute ist unklar,\n" + "was zuerst da war: Die antiken"); +static const u8 DexDescription_Icognito_2[] = _( + "Schriftzeichen oder die vielen unter-\n" + "schiedlichen ICOGNITO. Trotz umfang-\n" + "reicher Forschung bleiben Fragen offen."); + +static const u8 DexDescription_Woingenau_1[] = _( + "Wenn zwei oder mehr WOINGENAU \n" + "aufeinander treffen, versuchen sie,\n" + "gegenseitig ihre Geduld zu übertreffen."); +static const u8 DexDescription_Woingenau_2[] = _( + "Sie möchten herausfinden, welches\n" + "POKéMON es am längsten ohne Nahrung\n" + "aushält. Darauf müssen Trainer achten."); + +static const u8 DexDescription_Girafarig_1[] = _( + "Der Kopf an GIRAFARIGs Hinterteil hat\n" + "ein eigenes Gehirn. Er reagiert mit\n" + "Angriffen auf Gerüche und Geräusche."); +static const u8 DexDescription_Girafarig_2[] = _( + "Wenn man sich diesem POKéMON von\n" + "hinten nähert, könnte der hintere Kopf\n" + "plötzlich vorschnellen und zubeißen."); + +static const u8 DexDescription_Tannza_1[] = _( + "TANNZA hängt an Ästen und wartet auf\n" + "Beute. Wenn man dieses POKéMON bei\n" + "einer Mahlzeit stört, indem man den"); +static const u8 DexDescription_Tannza_2[] = _( + "Baum, auf dem es sich befindet,\n" + "schüttelt, fällt es herunter und\n" + "explodiert ohne Vorwarnung."); + +static const u8 DexDescription_Forstellka_1[] = _( + "FORSTELLKA versteckt sich in seiner\n" + "stahlharten Schale. Die Schale öffnet\n" + "sich, wenn es nach Beute schnappt."); +static const u8 DexDescription_Forstellka_2[] = _( + "Dies geht jedoch so schnell, dass man\n" + "das Innere der Schale nicht zu Gesicht\n" + "bekommt."); + +static const u8 DexDescription_Dummisel_1[] = _( + "DUMMISEL hat einen Bohrer als Schweif.\n" + "Diesen benutzt es, um sich rückwärts in\n" + "den Boden einzugraben."); +static const u8 DexDescription_Dummisel_2[] = _( + "Dieses POKéMON baut seinen \n" + "Nestkomplex tief unter der\n" + "Erdoberfläche auf."); + +static const u8 DexDescription_Skorgla_1[] = _( + "SKORGLA segelt lautlos durch die Lüfte.\n" + "Es verankert sich mit Hilfe der Krallen\n" + "an seinen Hinterbeinen und der riesigen"); +static const u8 DexDescription_Skorgla_2[] = _( + "Scheren an seinen Vorderbeinen am\n" + "Gesicht eines Feindes fest und\n" + "vergiftet ihn mit seinem Giftstachel."); + +static const u8 DexDescription_Stahlos_1[] = _( + "STAHLOS lebt noch tiefer unter der Erde\n" + "als ONIX. Dieses POKéMON gräbt immer\n" + "in Richtung des Erdkerns."); +static const u8 DexDescription_Stahlos_2[] = _( + "Nachweislich hat dieses POKéMON\n" + "bereits Tiefen von einem Kilometer\n" + "erreicht."); + +static const u8 DexDescription_Snubbull_1[] = _( + "Indem es seine Zähne fletscht und\n" + "ein Furcht erregendes Gesicht macht,\n" + "schlägt SNUBBULL kleinere POKéMON"); +static const u8 DexDescription_Snubbull_2[] = _( + "in die Flucht. Es scheint darüber jedoch\n" + "etwas traurig zu sein."); + +static const u8 DexDescription_Granbull_1[] = _( + "GRANBULL besitzt einen besonders\n" + "ausgeprägten Unterkiefer. Wegen seiner\n" + "schweren Zähne wackelt es mit dem Kopf."); +static const u8 DexDescription_Granbull_2[] = _( + "Es beißt nur zu, wenn es erschreckt\n" + "wird."); + +static const u8 DexDescription_Baldorfish_1[] = _( + "BALDORFISH saugt Wasser ein, um sich\n" + "aufzublasen. Dieses POKéMON nutzt den\n" + "Druck des Wassers dazu, giftige"); +static const u8 DexDescription_Baldorfish_2[] = _( + "Stacheln aus seinem Körper zu\n" + "verschießen. Es betrachtet Schwimmen\n" + "als eine echte Herausforderung."); + +static const u8 DexDescription_Scherox_1[] = _( + "SCHEROX’ Körper ist hart wie Stahl.\n" + "Gewöhnliche Angriffe jagen ihm keine\n" + "Angst ein. Dieses POKéMON schlägt"); +static const u8 DexDescription_Scherox_2[] = _( + "mit den Flügeln, um seine\n" + "Körpertemperatur zu regulieren."); + +static const u8 DexDescription_Pottrott_1[] = _( + "POTTROTT versteckt sich leise unter\n" + "Steinen und verbirgt seinen Körper in\n" + "seiner harten Schale, wenn es"); +static const u8 DexDescription_Pottrott_2[] = _( + "gesammelte Beeren zu sich nimmt. Die\n" + "Beeren vermischen sich mit seinen\n" + "Körperflüssigkeiten zu einem Saft."); + +static const u8 DexDescription_Skaraborn_1[] = _( + "SKARABORN geht direkt auf seinen\n" + "Gegner los, rutscht auf ihn zu, um ihn\n" + "auszuhebeln und mit seinem mächtigen"); +static const u8 DexDescription_Skaraborn_2[] = _( + "Horn wegzuschleudern. Dieses POKéMON\n" + "hat genug Kraft, um einen massigen\n" + "Baum umzustoßen."); + +static const u8 DexDescription_Sniebel_1[] = _( + "SNIEBEL klettert an Bäumen hoch, indem\n" + "es seine hakenförmigen Krallen in die\n" + "Rinde schlägt. Dieses POKéMON sucht"); +static const u8 DexDescription_Sniebel_2[] = _( + "nach unbewachten Nestern und stiehlt\n" + "die Eier, wenn die Eltern auf Nahrungs-\n" + "suche sind. Davon ernährt es sich."); + +static const u8 DexDescription_Teddiursa_1[] = _( + "TEDDIURSA leckt gern seine mit Honig\n" + "bedeckten Pranken ab. Dieses POKéMON\n" + "bereitet seinen eigenen Honig zu, indem"); +static const u8 DexDescription_Teddiursa_2[] = _( + "es die von BIBOR gesammelten Früchte\n" + "und Pollen miteinander vermengt."); + +static const u8 DexDescription_Ursaring_1[] = _( + "In den von URSARING bewohnten Wäldern\n" + "gibt es viele Flüsse und hohe Bäume, in\n" + "denen es Nahrung findet. Dieses"); +static const u8 DexDescription_Ursaring_2[] = _( + "POKéMON läuft täglich durch den Wald,\n" + "um nach Essbarem zu suchen."); + +static const u8 DexDescription_Schneckmag_1[] = _( + "Durch SCHNECKMAGs Kreislaufsystem\n" + "fließt Magma. Wenn dieses POKéMON\n" + "erkältet ist, kühlt das Magma"); +static const u8 DexDescription_Schneckmag_2[] = _( + "aus und erhärtet. Sein Körper wird\n" + "spröde und es brechen Stücke heraus,\n" + "so dass es kleiner wird."); + +static const u8 DexDescription_Magcargo_1[] = _( + "MAGCARGOs Schale ist eigentlich seine\n" + "Haut, die erhärtet ist, als es auskühlte.\n" + "Seine Schale ist sehr spröde und"); +static const u8 DexDescription_Magcargo_2[] = _( + "zerbrechlich. Schon bei einer leichten\n" + "Berührung bricht sie auseinander. Dann\n" + "muss es ein Bad in Magma nehmen."); + +static const u8 DexDescription_Quiekel_1[] = _( + "Auf Nahrungssuche schnüffelt QUIEKEL\n" + "am Boden entlang. Seine \n" + "Lieblingsspeise ist ein Pilz, der unter"); +static const u8 DexDescription_Quiekel_2[] = _( + "verwesendem Gras wächst. \n" + "Manchmal spürt dieses POKéMON heiße\n" + "Quellen auf."); + +static const u8 DexDescription_Keifel_1[] = _( + "KEIFEL hat ein dichtes Fell aus langen\n" + "Haaren. Dadurch ist es gegen eisige\n" + "Kälte gewappnet."); +static const u8 DexDescription_Keifel_2[] = _( + "Dieses POKéMON benutzt seine\n" + "Hauer, um an Nahrung zu gelangen, die\n" + "unter dem Eis eingeschlossen ist."); + +static const u8 DexDescription_Corasonn_1[] = _( + "Wenn CORASONNs Arme Sonnenlicht\n" + "abbekommen, glitzern sie wunderschön\n" + "in sieben Farben. Wenn ein Arm"); +static const u8 DexDescription_Corasonn_2[] = _( + "abbricht, wächst über Nacht ein neuer\n" + "nach."); + +static const u8 DexDescription_Remoraid_1[] = _( + "REMORAID saugt Wasser ein und spritzt\n" + "es unter Einsatz seiner Bauchmuskeln\n" + "mit Hochdruck wieder heraus. So schießt"); +static const u8 DexDescription_Remoraid_2[] = _( + "es fliegende Beute ab. Wenn seine\n" + "Entwicklung näher rückt, wandert\n" + "dieses POKéMON flussabwärts."); + +static const u8 DexDescription_Octillery_1[] = _( + "OCTILLERY saugt sich mit seinen\n" + "Tentakeln an einem Feind fest. Dieses\n" + "POKéMON betäubt seinen Gegner,"); +static const u8 DexDescription_Octillery_2[] = _( + "bevor es ihm den Rest gibt.\n" + "Wenn ein Feind zu stark ist, speit es\n" + "Tinte aus und flüchtet."); + +static const u8 DexDescription_Botogel_1[] = _( + "BOTOGEL sammelt seine Nahrung in\n" + "seinem Schweif. Es gab einmal einen\n" + "berühmten Entdecker, der es dank eines"); +static const u8 DexDescription_Botogel_2[] = _( + "BOTOGELs geschafft hat, einen der\n" + "höchsten Berge der Welt zu besteigen.\n" + "Es hatte seine Nahrung mit ihm geteilt."); + +static const u8 DexDescription_Mantax_1[] = _( + "An schönen Tagen sieht man Schwärme\n" + "von MANTAX elegant über die Wellen des\n" + "Ozeans springen."); +static const u8 DexDescription_Mantax_2[] = _( + "Durch REMORAID, die an ihm haften\n" + "und ihn begleiten, fühlt sich dieses\n" + "POKéMON nicht belästigt."); + +static const u8 DexDescription_Panzaeron_1[] = _( + "PANZAERON ist komplett in einen harten,\n" + "schützenden Panzer eingehüllt. Dieses\n" + "POKéMON fliegt 300 km/h."); +static const u8 DexDescription_Panzaeron_2[] = _( + "Es greift seine Feinde mit seinen\n" + "messerscharfen Flügeln an."); + +static const u8 DexDescription_Hunduster_1[] = _( + "HUNDUSTER jagen in Gruppen. Sie\n" + "kommunizieren miteinander über\n" + "verschiedene Arten von Geheul und"); +static const u8 DexDescription_Hunduster_2[] = _( + "treiben ihre Feinde in die Enge.\n" + "Die Zusammenarbeit dieser POKéMON\n" + "ist einzigartig."); + +static const u8 DexDescription_Hundemon_1[] = _( + "In einer Gruppe von HUNDEMON ist\n" + "dasjenige mit den nach hinten\n" + "gebogenen Hörnern der Anführer."); +static const u8 DexDescription_Hundemon_2[] = _( + "Diese POKéMON bestimmen ihren Anführer\n" + "durch das Ausfechten von Kämpfen\n" + "untereinander."); + +static const u8 DexDescription_Seedraking_1[] = _( + "SEEDRAKING lebt in den Tiefen des\n" + "Ozeans, die ansonsten verwaist sind.\n" + "Lange hat man geglaubt, dass das"); +static const u8 DexDescription_Seedraking_2[] = _( + "Gähnen dieses POKéMON Strudel auslöst."); + +static const u8 DexDescription_Phanpy_1[] = _( + "Um sich ein Nest zu bauen, gräbt\n" + "PHANPY am Flussufer ein Loch ins\n" + "Erdreich. Es markiert die Umgebung"); +static const u8 DexDescription_Phanpy_2[] = _( + "seines Nests mit Hilfe seines Rüssels,\n" + "damit seine Artgenossen wissen, dass\n" + "dieses Gebiet vergeben ist."); + +static const u8 DexDescription_Donphan_1[] = _( + "DONPHANs Lieblingsattacke ist es, als\n" + "Ball zusammengerollt mit voller Wucht\n" + "gegen seine Gegner zu krachen."); +static const u8 DexDescription_Donphan_2[] = _( + "Wenn es erst einmal rollt, ist dieses\n" + "POKéMON nur schwer aufzuhalten."); + +static const u8 DexDescription_Porygon2_1[] = _( + "PORYGON2 wurde in einem\n" + "wissenschaftlichen Experiment von\n" + "Menschen erzeugt. Es verfügt über"); +static const u8 DexDescription_Porygon2_2[] = _( + "künstliche Intelligenz, wodurch es \n" + "selbstständig neue Gesten und Gefühle\n" + "erlernen kann."); + +static const u8 DexDescription_Damhirplex_1[] = _( + "DAMHIRPLEX hat ein prächtiges Geweih,\n" + "für das hohe Preise gezahlt werden, da\n" + "sie als Kunstwerke gelten."); +static const u8 DexDescription_Damhirplex_2[] = _( + "Daher wurde dieses POKéMON gejagt und\n" + "wäre beinahe ausgestorben."); + +static const u8 DexDescription_Farbeagle_1[] = _( + "FARBEAGLE markiert sein Revier mit\n" + "einer Flüssigkeit, die aus seiner\n" + "Schweifspitze austritt."); +static const u8 DexDescription_Farbeagle_2[] = _( + "Es wurden über 5000 unterschiedliche\n" + "Markierungen entdeckt, die dieses\n" + "POKéMON hinterlassen hat."); + +static const u8 DexDescription_Rabauz_1[] = _( + "RABAUZ muss jeden Tag trainieren,\n" + "sonst ist es nicht ausgelastet und\n" + "reagiert gestresst. Wenn man dieses"); +static const u8 DexDescription_Rabauz_2[] = _( + "POKéMON trainiert, muss man\n" + "zahlreiche Trainingsmethoden\n" + "einsetzen und sie ständig ausbauen."); + +static const u8 DexDescription_Kapoera_1[] = _( + "KAPOERA dreht sich auf dem Kopf\n" + "stehend um die eigene Achse und teilt\n" + "Tritte aus. Seine Technik ist eine"); +static const u8 DexDescription_Kapoera_2[] = _( + "bemerkenswerte Mischung aus Angriff \n" + "und Verteidigung. Es bewegt sich \n" + "drehend schneller voran als laufend."); + +static const u8 DexDescription_Kussilla_1[] = _( + "KUSSILLA läuft hektisch umher, fällt\n" + "aber auch ziemlich oft hin. Es lässt\n" + "keine Möglichkeit aus sein Spiegelbild"); +static const u8 DexDescription_Kussilla_2[] = _( + "zu betrachten, um sicherzustellen,\n" + "dass sein Gesicht nicht schmutzig\n" + "geworden ist."); + +static const u8 DexDescription_Elekid_1[] = _( + "ELEKID speichert Elektrizität in seinem\n" + "Körper. Wenn es Metall berührt und\n" + "versehentlich die aufgestaute Energie"); +static const u8 DexDescription_Elekid_2[] = _( + "entlädt, rotiert es mit den Armen, um\n" + "sich wieder aufzuladen."); + +static const u8 DexDescription_Magby_1[] = _( + "MAGBYs Gesundheitszustand kann man\n" + "am Feuer erkennen, das es ausatmet.\n" + "Wenn es gelbe Flammen ausstößt, ist es"); +static const u8 DexDescription_Magby_2[] = _( + "in guter Verfassung. Ist es erschöpft,\n" + "vermischen sich die Flammen mit\n" + "schwarzem Rauch."); + +static const u8 DexDescription_Miltank_1[] = _( + "MILTANK gibt täglich 20 Liter Milch.\n" + "Sie ist süßlich und wird von Kindern und\n" + "Erwachsenen gleichermaßen genossen."); +static const u8 DexDescription_Miltank_2[] = _( + "Menschen, die keine Milch trinken,\n" + "essen sie stattdessen als Joghurt."); + +static const u8 DexDescription_Heiteira_1[] = _( + "HEITEIRA nimmt mit seinem flauschigen\n" + "Fell Traurigkeit wahr. Es hastet zu\n" + "einer traurigen Person, egal, wie weit"); +static const u8 DexDescription_Heiteira_2[] = _( + "diese entfernt ist und teilt ein \n" + "GLÜCKS-EI mit ihr, um sie zum Lächeln\n" + "zu bringen."); + +static const u8 DexDescription_Raikou_1[] = _( + "RAIKOU ist so schnell wie der Blitz. Das\n" + "Gebrüll dieses POKéMON sendet\n" + "Schockwellen aus, die wie Donnerschläge"); +static const u8 DexDescription_Raikou_2[] = _( + "durch die Luft beben und den Boden\n" + "erschüttern."); + +static const u8 DexDescription_Entei_1[] = _( + "ENTEI verfügt über die Leidenschaft\n" + "von Magma. Dieses POKéMON wurde\n" + "bei einem Vulkanausbruch geboren"); +static const u8 DexDescription_Entei_2[] = _( + "und bringt Feuersbrünste hervor, die\n" + "alles auslöschen, was mit ihnen in\n" + "Kontakt kommt."); + +static const u8 DexDescription_Suicune_1[] = _( + "SUICUNE wohnt die Reinheit einer\n" + "Quelle inne. Es bewegt sich graziös und \n" + "hat die Macht, schmutziges Wasser zu"); +static const u8 DexDescription_Suicune_2[] = _( + "reinigen."); + +static const u8 DexDescription_Larvitar_1[] = _( + "LARVITAR wurde tief unter der Erde\n" + "geboren. Um an die Oberfläche zu\n" + "gelangen, muss es sich durch das"); +static const u8 DexDescription_Larvitar_2[] = _( + "Erdreich fressen. Erst dann bekommt es\n" + "seine Eltern zu Gesicht."); + +static const u8 DexDescription_Pupitar_1[] = _( + "PUPITAR erzeugt in seinem Körper ein\n" + "Gas, das es komprimiert und kraftvoll\n" + "ausstößt, um sich wie ein"); +static const u8 DexDescription_Pupitar_2[] = _( + "Düsenflugzeug anzutreiben. Sein\n" + "Körper ist sehr robust und er hält\n" + "auch massivem Stahl stand."); + +static const u8 DexDescription_Despotar_1[] = _( + "DESPOTAR ist erstaunlich stark. Es\n" + "kann einen ganzen Berg vernichten, um\n" + "sein Nest zu bauen. Dieses POKéMON"); +static const u8 DexDescription_Despotar_2[] = _( + "wandert in den Bergen umher und sucht\n" + "nach Gegnern für einen Kampf."); + +static const u8 DexDescription_Lugia_1[] = _( + "LUGIAs Flügel haben eine\n" + "zerstörerische Kraft. Bereits ein\n" + "leichtes Flattern kann Häuser"); +static const u8 DexDescription_Lugia_2[] = _( + "hinfortwehen. Daher hat sich dieses\n" + "POKéMON dafür entschieden, tief unter\n" + "dem Meer zu leben, wo es niemand sieht."); + +static const u8 DexDescription_HoOh_1[] = _( + "HO-OHs Federn leuchten in sieben\n" + "Farben, je nachdem aus welchem Winkel\n" + "das Licht auf sie fällt."); +static const u8 DexDescription_HoOh_2[] = _( + "Die Federn sollen ihrem Besitzer Glück\n" + "bringen. Dieses POKéMON lebt am Fuße\n" + "eines Regenbogens."); + +static const u8 DexDescription_Celebi_1[] = _( + "Dieses POKéMON kommt aus der Zukunft\n" + "und ist durch die Zeit gereist. Solange\n" + "CELEBI auftaucht,"); +static const u8 DexDescription_Celebi_2[] = _( + "ist der Menschheit angeblich eine\n" + "rosige Zukunft beschieden."); + +static const u8 DexDescription_Geckarbor_1[] = _( + "Mit den kleinen Haken unter seinen\n" + "Füßen kann GECKARBOR an Wänden\n" + "hochklettern. Dieses POKéMON greift"); +static const u8 DexDescription_Geckarbor_2[] = _( + "Feinde an, indem es mit seinem\n" + "mächtigen Schweif zuschlägt."); + +static const u8 DexDescription_Reptain_1[] = _( + "REPTAIN kann sich mit den Blättern, die\n" + "aus seinem Körper herauswachsen, im\n" + "Wald hervorragend tarnen."); +static const u8 DexDescription_Reptain_2[] = _( + "Dieses POKéMON ist ein wahrer Meister\n" + "darin, auf die Bäume des Dschungels zu\n" + "klettern."); + +static const u8 DexDescription_Gewaldro_1[] = _( + "Die Blätter, die auf GEWALDROs Körper\n" + "wachsen, sind sehr scharfkantig. Dieses\n" + "POKéMON ist sehr agil. Es hüpft von"); +static const u8 DexDescription_Gewaldro_2[] = _( + "Ast zu Ast und springt seine Feinde\n" + "von oben oder hinten an."); + +static const u8 DexDescription_Flemmli_1[] = _( + "FLEMMLI hängt an seinem Trainer wie\n" + "eine Klette. Es schlurft immer hinter ihm\n" + "her. Dieses POKéMON spuckt 1000 Grad"); +static const u8 DexDescription_Flemmli_2[] = _( + "heißes Feuer, das seinen Feinden\n" + "ordentlich einheizt."); + +static const u8 DexDescription_Jungglut_1[] = _( + "JUNGGLUT trainiert seine Beine und\n" + "Oberschenkel, indem es über Felder und\n" + "Berge läuft. Die Beine dieses POKéMON"); +static const u8 DexDescription_Jungglut_2[] = _( + "sind sowohl schnell als auch kräftig,\n" + "so dass es 10 Tritte pro Sekunde\n" + "ausführen kann."); + +static const u8 DexDescription_Lohgock_1[] = _( + "LOHGOCK stößt heftige Flammen aus\n" + "seinen Handgelenken aus und greift\n" + "seine Feinde mutig an. Je stärker ein"); +static const u8 DexDescription_Lohgock_2[] = _( + "Feind ist, desto stärker lodern die\n" + "Handgelenke dieses POKéMON."); + +static const u8 DexDescription_Hydropi_1[] = _( + "Die Flosse an HYDROPIs Kopf dient als\n" + "hochempfindliches Radar. Damit kann es\n" + "Bewegungen im Wasser und in der Luft"); +static const u8 DexDescription_Hydropi_2[] = _( + "wahrnehmen. So weiß es jederzeit, was\n" + "in seiner Umgebung passiert, ohne\n" + "dabei seine Augen zu benutzen."); + +static const u8 DexDescription_Moorabbel_1[] = _( + "MOORABBELs Körper ist mit einem\n" + "klebrigen Film überzogen, durch den es\n" + "an Land überleben kann. Dieses POKéMON"); +static const u8 DexDescription_Moorabbel_2[] = _( + "spielt bei Ebbe in den Schlammpfützen\n" + "am Strand."); + +static const u8 DexDescription_Sumpex_1[] = _( + "SUMPEX ist sehr stark. Es kann mit\n" + "Leichtigkeit einen Felsblock bewegen,\n" + "der über eine Tonne wiegt."); +static const u8 DexDescription_Sumpex_2[] = _( + "Weiterhin ist es mit einem exzellenten\n" + "Sehvermögen ausgestattet, wodurch es\n" + "auch in trüben Gewässern sehen kann."); + +static const u8 DexDescription_Fiffyen_1[] = _( + "Sobald FIFFYEN eine Bewegung wahr-\n" + "nimmt, schnappt es zu. Es jagt seine\n" + "Beute so lange, bis sie vollkommen"); +static const u8 DexDescription_Fiffyen_2[] = _( + "erschöpft ist. Wenn sich die Beute\n" + "allerdings wehrt, kann es passieren, \n" + "dass FIFFYEN klein beigibt und flieht."); + +static const u8 DexDescription_Magnayen_1[] = _( + "MAGNAYEN sendet deutliche Signale\n" + "aus, wenn es sich auf einen Angriff\n" + "vorbereitet. Es knurrt heftig und macht"); +static const u8 DexDescription_Magnayen_2[] = _( + "sich flach. Dieses POKéMON kann mit\n" + "seinen spitzen Zähnen brutal zubeißen."); + +static const u8 DexDescription_Zigzachs_1[] = _( + "ZIGZACHS ist ein rastloser Wanderer.\n" + "Dieses POKéMON ist nämlich sehr\n" + "neugierig und es inspiziert alles,"); +static const u8 DexDescription_Zigzachs_2[] = _( + "was ihm zufällig begegnet."); + +static const u8 DexDescription_Geradaks_1[] = _( + "GERADAKS rennt immer mit vollem Tempo\n" + "und nie im Zickzack, sondern nur gerade.\n" + "Wenn ihm ein Hindernis im Weg ist,"); +static const u8 DexDescription_Geradaks_2[] = _( + "läuft es rechtwinklig daran vorbei. Für\n" + "dieses POKéMON stellen leichte Kurven\n" + "eine große Herausforderung dar."); + +static const u8 DexDescription_Waumpel_1[] = _( + "WAUMPEL kann mit den Stacheln an\n" + "seinem Hinterteil die Rinde von Bäumen\n" + "entfernen und ernährt sich von dem"); +static const u8 DexDescription_Waumpel_2[] = _( + "austretenden Saft. An den Füßen dieses\n" + "POKéMON befinden sich Saugnäpfe, mit\n" + "denen es auch an Glas nicht abrutscht."); + +static const u8 DexDescription_Schaloko_1[] = _( + "SCHALOKO bindet sich mit einem\n" + "Seidenfaden an einen Ast. Es baumelt\n" + "dort und wartet auf seine Entwicklung."); +static const u8 DexDescription_Schaloko_2[] = _( + "Durch ein kleines Loch in seinem\n" + "Seidenkokon lugt es heraus."); + +static const u8 DexDescription_Papinella_1[] = _( + "PAPINELLAs Lieblingsspeise ist\n" + "Blütenstaub. Wenn du dieses POKéMON\n" + "beobachten möchtest, musst du bloß"); +static const u8 DexDescription_Papinella_2[] = _( + "einen Blumentopf vor ein geöffnetes\n" + "Fenster stellen. PAPINELLA wird sich\n" + "diese Leckerei nicht entgehen lassen."); + +static const u8 DexDescription_Panekon_1[] = _( + "PANEKON baut seinen schützenden\n" + "Kokon, indem es seinen Körper mit\n" + "feiner Seide einwickelt, die aus seinem"); +static const u8 DexDescription_Panekon_2[] = _( + "Mund austritt. Wenn sein Körper mit\n" + "Seide bedeckt ist, wird diese hart. Im\n" + "Kokon wartet es auf seine Entwicklung."); + +static const u8 DexDescription_Pudox_1[] = _( + "PUDOX wird instinktiv vom Licht\n" + "angezogen. In hell erleuchteten \n" + "Städten kann man Scharen dieses"); +static const u8 DexDescription_Pudox_2[] = _( + "POKéMON dabei beobachten, die\n" + "großen Schaden anrichten, indem sie die\n" + "Blätter von Bäumen abfressen."); + +static const u8 DexDescription_Loturzel_1[] = _( + "LOTURZEL lebt auf der Wasseroberfläche\n" + "von Teichen oder Seen. Es wird\n" + "schwächer, wenn sein breites Blatt"); +static const u8 DexDescription_Loturzel_2[] = _( + "abstirbt. Nur selten geht dieses\n" + "POKéMON an Land, um nach sauberem\n" + "Wasser Ausschau zu halten."); + +static const u8 DexDescription_Lombrero_1[] = _( + "LOMBRERO liebt die Nacht und wird mit\n" + "Einbruch der Dunkelheit aktiv. Es spielt\n" + "auch gerne Streiche."); +static const u8 DexDescription_Lombrero_2[] = _( + "Wenn es Angler sieht, zieht es unter\n" + "Wasser an ihren Angelschnüren und\n" + "erfreut sich an ihrer Entrüstung."); + +static const u8 DexDescription_Kappalores_1[] = _( + "KAPPALORES fängt sofort zu tanzen an,\n" + "wenn es stimmungsvolle, feierliche Musik\n" + "vernimmt. Dieses POKéMON erscheint"); +static const u8 DexDescription_Kappalores_2[] = _( + "angeblich, wenn es Kinder auf \n" + "Wanderausflügen singen hört."); + +static const u8 DexDescription_Samurzel_1[] = _( + "SAMURZEL hängt sich mit dem Kopf an\n" + "einen Ast. Dabei entzieht es dem Baum\n" + "Feuchtigkeit. Je mehr Wasser es trinkt,"); +static const u8 DexDescription_Samurzel_2[] = _( + "desto glänzender wird der Körper dieses\n" + "POKéMON."); + +static const u8 DexDescription_Blanas_1[] = _( + "BLANAS lebt in dichten Wäldern.\n" + "Manchmal wagt es sich aus dem Wald\n" + "heraus, um Menschen zu erschrecken."); +static const u8 DexDescription_Blanas_2[] = _( + "Dieses POKéMON mag es überhaupt nicht,\n" + "wenn man seine lange Nase zwickt."); + +static const u8 DexDescription_Tengulist_1[] = _( + "TENGULIST ist ein geheimnisvolles\n" + "POKéMON, das angeblich auf hohen\n" + "Bäumen lebt, die tausende von Jahren"); +static const u8 DexDescription_Tengulist_2[] = _( + "alt sind. Mit den Blätterventilatoren an\n" + "seinen Händen kann es heftige Stürme\n" + "erzeugen."); + +static const u8 DexDescription_Schwalbini_1[] = _( + "Mutig behauptet SCHWALBINI sein\n" + "Territorium gegen Eindringlinge, so\n" + "stark diese auch sein mögen."); +static const u8 DexDescription_Schwalbini_2[] = _( + "Dieses unerschrockene POKéMON bleibt\n" + "trotz einer Niederlage angriffslustig,\n" + "heult aber laut, wenn es Hunger hat."); + +static const u8 DexDescription_Schwalboss_1[] = _( + "Dieses POKéMON taucht in einem steilen\n" + "Winkel ab, sobald es Beute wahrgenommen\n" + "hat. Es packt seine Beute mit"); +static const u8 DexDescription_Schwalboss_2[] = _( + "seinen Krallen und lässt sie\n" + "nicht mehr entkommen."); + +static const u8 DexDescription_Wingull_1[] = _( + "Man sieht WINGULL oft mit seiner\n" + "Beute oder seinen Besitztümern im\n" + "Schnabel herumfliegen auf der Suche"); +static const u8 DexDescription_Wingull_2[] = _( + "nach geeigneten Verstecken. Dieses\n" + "POKéMON fliegt durch die Lüfte, als\n" + "würde es gleiten."); + +static const u8 DexDescription_Pelipper_1[] = _( + "PELIPPER transportiert kleine POKéMON\n" + "und Eier in seinem riesigen Schnabel\n" + "durch die Lüfte. Dieses POKéMON baut"); +static const u8 DexDescription_Pelipper_2[] = _( + "sein Nest auf steilen Klippen am Meer."); + +static const u8 DexDescription_Trasla_1[] = _( + "TRASLA nimmt mit den Hörnern an seinem\n" + "Kopf die Gefühle von Menschen wahr.\n" + "Menschen bekommen dieses POKéMON"); +static const u8 DexDescription_Trasla_2[] = _( + "nur selten zu Gesicht. Wenn es bemerkt,\n" + "dass eine Person gut gelaunt ist, traut\n" + "es sich näher an sie heran."); + +static const u8 DexDescription_Kirlia_1[] = _( + "Man sagt, dass ein KIRLIA, das häufig\n" + "positive Emotionen seines TRAINERs\n" + "wahrnimmt, sehr schön wird."); +static const u8 DexDescription_Kirlia_2[] = _( + "Dieses POKéMON kontrolliert\n" + "psychokinetische Energie mit seinem\n" + "hochentwickelten Gehirn."); + +static const u8 DexDescription_Guardevoir_1[] = _( + "GUARDEVOIR kann in die Zukunft\n" + "schauen. Wenn es eine Gefahr für seinen\n" + "TRAINER voraussieht, entlädt es seine"); +static const u8 DexDescription_Guardevoir_2[] = _( + "psychokinetische Energie mit voller\n" + "Kraft."); + +static const u8 DexDescription_Gehweiher_1[] = _( + "GEHWEIHER scheidet aus seinen Zehen\n" + "ein Öl aus, das es ihm ermöglicht, über\n" + "Wasser zu gleiten. Dieses POKéMON"); +static const u8 DexDescription_Gehweiher_2[] = _( + "ernährt sich von Mikroorganismen aus\n" + "Teichen und Seen."); + +static const u8 DexDescription_Maskeregen_1[] = _( + "MASKEREGEN schüchtert seine Feinde\n" + "mit den augenähnlichen Mustern auf\n" + "seinen Antennen ein. Dieses POKéMON"); +static const u8 DexDescription_Maskeregen_2[] = _( + "kann mit seinen vier Flügeln wie ein\n" + "Hubschrauber in jede Richtung fliegen,\n" + "sogar seitwärts und rückwärts."); + +static const u8 DexDescription_Knilz_1[] = _( + "KNILZ lebt im feuchten Erdboden\n" + "finsterer Wälder. Es wird oft reglos\n" + "unter herabgefallenen Blättern"); +static const u8 DexDescription_Knilz_2[] = _( + "gefunden. Dieses POKéMON ernährt sich\n" + "von Kompost aus verrotteten Blättern."); + +static const u8 DexDescription_Kapilz_1[] = _( + "Mit leichtfüßiger Beinarbeit nähert \n" + "sich KAPILZ seinen Feinden und\n" + "schlägt dann mit seinen dehnbaren"); +static const u8 DexDescription_Kapilz_2[] = _( + "Armen um sich. Die Kampftechnik dieses\n" + "POKéMON treibt Profiboxern die\n" + "Schamesröte ins Gesicht."); + +static const u8 DexDescription_Bummelz_1[] = _( + "BUMMELZ geht zwanzig Stunden pro Tag\n" + "müßig. Da es sich sehr wenig bewegt,\n" + "braucht es auch nicht viel Nahrung."); +static const u8 DexDescription_Bummelz_2[] = _( + "Seine Tagesration besteht lediglich aus\n" + "drei Blättern."); + +static const u8 DexDescription_Muntier_1[] = _( + "MUNTIER brennt darauf, sich\n" + "auszutoben. Es kann nicht einmal für\n" + "eine Minute stillsitzen. Es gerät in"); +static const u8 DexDescription_Muntier_2[] = _( + "Stress, wenn es sich nicht andauernd\n" + "bewegen kann."); + +static const u8 DexDescription_Letarking_1[] = _( + "LETARKING verbringt den Tag damit,\n" + "herumzuliegen und nichts zu tun. Es \n" + "ernährt sich von Gras, das in seiner"); +static const u8 DexDescription_Letarking_2[] = _( + "Reichweite wächst. Hat es alles\n" + "aufgefressen, so sucht es sich\n" + "widerwillig ein anderes Plätzchen."); + +static const u8 DexDescription_Nincada_1[] = _( + "NINCADA lebt viele Jahre in absoluter\n" + "Dunkelheit unter der Erde. Dieses\n" + "POKéMON nimmt Nährstoffe aus"); +static const u8 DexDescription_Nincada_2[] = _( + "Baumwurzeln auf. Es rührt sich nicht,\n" + "da es auf seine Entwicklung wartet."); + +static const u8 DexDescription_Ninjask_1[] = _( + "NINJASK bewegt sich so schnell, dass\n" + "man es nicht sehen kann. Seine Schreie\n" + "sind aber laut und deutlich zu hören."); +static const u8 DexDescription_Ninjask_2[] = _( + "Deshalb hielt man dieses POKéMON lange\n" + "für unsichtbar."); + +static const u8 DexDescription_Ninjatom_1[] = _( + "NINJATOMs harter Körper bewegt sich\n" + "überhaupt nicht. Er scheint bloß eine\n" + "hohle Schale zu sein. Dieses POKéMON"); +static const u8 DexDescription_Ninjatom_2[] = _( + "soll angeblich die Seele eines jeden\n" + "stehlen, der hinterrücks einen Blick in\n" + "seinen hohlen Körper riskiert."); + +static const u8 DexDescription_Flurmel_1[] = _( + "Normalerweise ist FLURMELs Stimme sehr\n" + "leise, selbst mit größter Anstrengung\n" + "ist sie kaum hörbar. Wenn dieses"); +static const u8 DexDescription_Flurmel_2[] = _( + "POKéMON jedoch eine Gefahr wittert,\n" + "stößt es ohrenbetäubende Schreie aus."); + +static const u8 DexDescription_Krakeelo_1[] = _( + "KRAKEELOs Brüllen kann ein Holzhaus zum\n" + "Einsturz bringen. Es setzt seine Stimme\n" + "ein, um seine Gegner anzugreifen."); +static const u8 DexDescription_Krakeelo_2[] = _( + "Die runden Ohren dieses POKéMON dienen\n" + "als Lautsprecher."); + +static const u8 DexDescription_Krawumms_1[] = _( + "KRAWUMMS kann durch sein Brüllen\n" + "Erdbeben auslösen. Wenn dieses\n" + "POKéMON durch seine Körperöffnungen"); +static const u8 DexDescription_Krawumms_2[] = _( + "kräftig einatmet, ist es kurz davor,\n" + "ein mächtiges Brüllen von sich zu geben."); + +static const u8 DexDescription_Makuhita_1[] = _( + "MAKUHITA ist sehr zäh. Selbst wenn es im\n" + "Kampf mehrfach niedergeschlagen\n" + "wurde, steht es immer wieder auf und"); +static const u8 DexDescription_Makuhita_2[] = _( + "greift seinen Gegner an. Bei jedem Mal\n" + "speichert es mehr Energie in seinem\n" + "Körper für seine Entwicklung."); + +static const u8 DexDescription_Hariyama_1[] = _( + "HARIYAMA führt seinen berüchtigten\n" + "Streckarm-Schlag überall aus. Ein Schlag\n" + "von diesem POKéMON reicht aus,"); +static const u8 DexDescription_Hariyama_2[] = _( + "um einen Strommast zu zerlegen."); + +static const u8 DexDescription_Azurill_1[] = _( + "AZURILL schleudert seinen Schweif wie\n" + "ein Lasso weit aus und fliegt dann \n" + "selbst hinterher. Ein AZURILL"); +static const u8 DexDescription_Azurill_2[] = _( + "hat es auf diese Weise geschafft, die\n" + "Rekordweite von 10 Metern\n" + "zurückzulegen."); + +static const u8 DexDescription_Nasgnet_1[] = _( + "NASGNET besitzt eine magnetische\n" + "Nase, die immer nach Norden zeigt. Wenn\n" + "sich zwei NASGNET treffen, können sie"); +static const u8 DexDescription_Nasgnet_2[] = _( + "sich einander nicht zuwenden, da ihre\n" + "magnetischen Nasen sich gegenseitig\n" + "abstoßen."); + +static const u8 DexDescription_Eneco_1[] = _( + "ENECO ist davon fasziniert,\n" + "Gegenstände zu bewegen und sie zu\n" + "jagen. Dieses POKéMON jagt häufig"); +static const u8 DexDescription_Eneco_2[] = _( + "seinen eigenen Schweif, so dass ihm\n" + "schwindlig wird."); + +static const u8 DexDescription_Enekoro_1[] = _( + "ENEKORO liebt seine Eigenständigkeit.\n" + "So kann es das tun, was es möchte, und\n" + "kann selbst das Tempo bestimmen."); +static const u8 DexDescription_Enekoro_2[] = _( + "Da dieses POKéMON schläft und isst,\n" + "wenn es Lust dazu hat, ist sein\n" + "Tagesablauf eher zufälliger Natur."); + +static const u8 DexDescription_Zobiris_1[] = _( + "ZOBIRIS führt ein ruhiges, \n" + "zurückgezogenes Leben tief im Innern\n" + "einer Höhle. Es ist aber trotzdem sehr"); +static const u8 DexDescription_Zobiris_2[] = _( + "gefürchtet, da man sagt, es stehle die\n" + "Seelen der Menschen, wenn seine Augen\n" + "im Dunkeln Furcht erregend funkeln."); + +static const u8 DexDescription_Flunkifer_1[] = _( + "FLUNKIFERs sagenhafte Kiefer sind\n" + "eigentlich umgewandelte Stahlhörner.\n" + "Sein unterwürfiger Gesichtsausdruck"); +static const u8 DexDescription_Flunkifer_2[] = _( + "dient dazu, seinen Gegner in Sicherheit\n" + "zu wiegen, so dass er unaufmerksam\n" + "wird. Dann schnappt es zu!"); + +static const u8 DexDescription_Stollunior_1[] = _( + "Dieses POKéMON hat einen Körper aus\n" + "Stahl. STOLLUNIOR ernährt sich von\n" + "Eisenerz aus den Bergen. Zuweilen"); +static const u8 DexDescription_Stollunior_2[] = _( + "richtet es großen Schaden an, weil es\n" + "Brücken und Bahngleise auffrisst."); + +static const u8 DexDescription_Stollrak_1[] = _( + "STOLLRAK temperiert seinen Körper,\n" + "indem es ausgesprochen nahrhaftes \n" + "Quellwasser trinkt, bis es völlig"); +static const u8 DexDescription_Stollrak_2[] = _( + "aufgebläht ist. Dieses POKéMON baut\n" + "sein Nest in der Nähe von Quellen, aus\n" + "denen köstliches Wasser sprudelt."); + +static const u8 DexDescription_Stolloss_1[] = _( + "STOLLOSS nennt einen ganzen Berg sein\n" + "Territorium. Gnadenlos schlägt es jeden\n" + "in die Flucht, der sein Reich betritt."); +static const u8 DexDescription_Stolloss_2[] = _( + "Dieses POKéMON behält sein Territorium\n" + "jederzeit im Auge."); + +static const u8 DexDescription_Meditie_1[] = _( + "MEDITIE unterzieht sich einem\n" + "strikten mentalen Training tief in den\n" + "Bergen. Wenn es meditiert, verliert es"); +static const u8 DexDescription_Meditie_2[] = _( + "jedoch immer seine Konzentration.\n" + "Deshalb wird sein Training niemals\n" + "ein Ende haben."); + +static const u8 DexDescription_Meditalis_1[] = _( + "Mittels Meditation erhöht MEDITALIS\n" + "seine Körperenergie und schärft seinen\n" + "sechsten Sinn. Dieses POKéMON"); +static const u8 DexDescription_Meditalis_2[] = _( + "verbirgt sich, indem es eins mit den\n" + "Feldern und Bergen wird."); + +static const u8 DexDescription_Frizelbliz_1[] = _( + "FRIZELBLIZ speichert Elektrizität in\n" + "seiner langen Körperbehaarung. Dieses\n" + "POKéMON stimuliert seine"); +static const u8 DexDescription_Frizelbliz_2[] = _( + "Beinmuskulatur durch Stromstöße.\n" + "Dadurch ist es in der Lage, explosiv\n" + "zu beschleunigen."); + +static const u8 DexDescription_Voltenso_1[] = _( + "VOLTENSO entlädt ständig Elektrizität\n" + "aus seiner Mähne. Es fliegen dabei\n" + "Funken, die zuweilen zu Waldbränden"); +static const u8 DexDescription_Voltenso_2[] = _( + "führen. In einem Kampf erzeugt dieses\n" + "POKéMON Gewitterwolken."); + +static const u8 DexDescription_Plusle_1[] = _( + "PLUSLE dient seinen Artgenossen als\n" + "Cheerleader. Wenn ein Teamkamerad\n" + "im Kampf erfolgreich ist, erzeugt es"); +static const u8 DexDescription_Plusle_2[] = _( + "das prasselnde Geräusch von Funken, um\n" + "so seine Freude zu zeigen."); + +static const u8 DexDescription_Minun_1[] = _( + "MINUN kümmert sich mehr um das\n" + "Anfeuern seiner Partner als um seine\n" + "eigene Sicherheit. Es nutzt die"); +static const u8 DexDescription_Minun_2[] = _( + "Elektrizität in seinem Körper dazu,\n" + "einen Funkenregen zu erzeugen und\n" + "seine Teamkameraden anzufeuern."); + +static const u8 DexDescription_Volbeat_1[] = _( + "Wenn es Nacht wird, beginnt VOLBEATs\n" + "Schweif zu leuchten. Es kommuniziert\n" + "mit anderen, indem es die Helligkeit"); +static const u8 DexDescription_Volbeat_2[] = _( + "und das Blinken dieses Lichts reguliert.\n" + "Dieses POKéMON wird vom süßen Duft\n" + "der ILLUMISE angezogen."); + +static const u8 DexDescription_Illumise_1[] = _( + "ILLUMISE zieht ganze VOLBEAT-Scharen\n" + "mit seinem süßlichen Duft an. Dann\n" + "führt es diesen hell leuchtenden"); +static const u8 DexDescription_Illumise_2[] = _( + "Schwarm an, indem es geometrische\n" + "Figuren an den Nachthimmel malt."); + +static const u8 DexDescription_Roselia_1[] = _( + "ROSELIA verschießt scharfe Stacheln\n" + "auf jeden Feind, der versucht, die\n" + "Blumen an seinen Armen zu stehlen."); +static const u8 DexDescription_Roselia_2[] = _( + "Der Duft dieses POKéMON beruhigt\n" + "Lebewesen."); + +static const u8 DexDescription_Schluppuck_1[] = _( + "Eigentlich besteht SCHLUPPUCKs Körper\n" + "nur aus einem Magen. Daher kann es\n" + "etwas verschlingen, das beinahe seine"); +static const u8 DexDescription_Schluppuck_2[] = _( + "Größe hat. Sein Magen enthält eine\n" + "spezielle Flüssigkeit, die wirklich alles\n" + "verdauen kann."); + +static const u8 DexDescription_Schlukwech_1[] = _( + "Wenn SCHLUKWECH Beute sichtet,\n" + "verspritzt es eine höchst giftige\n" + "Substanz aus seinen Poren und"); +static const u8 DexDescription_Schlukwech_2[] = _( + "besprüht damit sein Ziel. Wenn die Beute\n" + "geschwächt ist, schluckt es sie mit\n" + "seinem riesigen Maul im Ganzen herunter."); + +static const u8 DexDescription_Kanivanha_1[] = _( + "KANIVANHAs starke Kiefer und seine\n" + "spitzen Zähne verfügen über die \n" + "zerstörerische Kraft, Bootsrümpfe"); +static const u8 DexDescription_Kanivanha_2[] = _( + "verschlingen zu können. Dieses POKéMON\n" + "hat schon viele Boote versenkt."); + +static const u8 DexDescription_Tohaido_1[] = _( + "TOHAIDO trägt den Spitznamen\n" + "“Tyrann des Meeres” und ist\n" + "sehr gefürchtet. Seine grausamen Zähne"); +static const u8 DexDescription_Tohaido_2[] = _( + "wachsen sofort nach, wenn sie\n" + "ausgebrochen sind. Es kann sogar einen\n" + "Öltanker zerreißen."); + +static const u8 DexDescription_Wailmer_1[] = _( + "WAILMERs Nasenlöcher liegen über\n" + "seinen Augen. Dieses verspielte\n" + "POKéMON erschreckt gern Menschen,"); +static const u8 DexDescription_Wailmer_2[] = _( + "indem es das Meerwasser, das es in\n" + "seinem Körper speichert, mit aller Kraft\n" + "herausprustet."); + +static const u8 DexDescription_Wailord_1[] = _( + "WAILORD ist bisher das größte aller\n" + "identifizierten POKéMON. Es schwimmt\n" + "reglos auf dem offenen Meer und nimmt"); +static const u8 DexDescription_Wailord_2[] = _( + "mit seinem enormen Maul riesige Mengen\n" + "an Nahrung auf."); + +static const u8 DexDescription_Camaub_1[] = _( + "CAMAUB ist nicht besonders helle. Es\n" + "nimmt nicht einmal wahr, wenn es\n" + "getroffen wurde. Ein Hungergefühl"); +static const u8 DexDescription_Camaub_2[] = _( + "allerdings kann es nicht einmal eine\n" + "Sekunde lang aushalten. In seinem\n" + "Körper brodelt glühend heißes Magma."); + +static const u8 DexDescription_Camerupt_1[] = _( + "CAMERUPT trägt einen Vulkan in seinem\n" + "Körper. 10.000 Grad heißes Magma fließt\n" + "in ihm. Manchmal brechen die Höcker auf"); +static const u8 DexDescription_Camerupt_2[] = _( + "seinem Rücken aus und verspucken \n" + "glühend heißes Magma."); + +static const u8 DexDescription_Qurtel_1[] = _( + "QURTEL schaufelt sich auf der Suche\n" + "nach Kohle durch die Berge. Wenn es\n" + "welche findet, füllt es die Hohlräume"); +static const u8 DexDescription_Qurtel_2[] = _( + "seines Panzers mit Kohle und verbrennt\n" + "diese. Wenn es angegriffen wird, stößt\n" + "es dicken schwarzen Rauch aus."); + +static const u8 DexDescription_Spoink_1[] = _( + "SPOINK hüpft auf seinem Schweif durch\n" + "die Gegend. Die Erschütterung des\n" + "Hüpfens bringt sein Herz zum Schlagen."); +static const u8 DexDescription_Spoink_2[] = _( + "Deshalb kann dieses POKéMON das Hüpfen\n" + "nicht sein lassen, ansonsten würde sein\n" + "Herz aufhören zu schlagen."); + +static const u8 DexDescription_Groink_1[] = _( + "GROINK benutzt die schwarzen Perlen\n" + "an seinem Körper dazu, die\n" + "psychischen Kraftwellen zu verstärken."); +static const u8 DexDescription_Groink_2[] = _( + "Wenn es diese spezielle Fähigkeit nutzt,\n" + "wird sein schnaubender Atem\n" + "schwerfällig."); + +static const u8 DexDescription_Pandir_1[] = _( + "Jedes PANDIR auf der Welt soll ein\n" + "einzigartiges Fleckenmuster haben. Der\n" + "schwankende Gang dieses POKéMON"); +static const u8 DexDescription_Pandir_2[] = _( + "erweckt den Eindruck, es würde tanzen."); + +static const u8 DexDescription_Knacklion_1[] = _( + "KNACKLIONs Bau ist eine Art in den Sand\n" + "gegrabener Kessel. Dieses POKéMON\n" + "wartet geduldig auf Beute, um sie in"); +static const u8 DexDescription_Knacklion_2[] = _( + "seinen Bau zu werfen. Seine gigan-\n" + "tischen Kiefer verfügen über genügend\n" + "Kraft, um einen Felsen zu zerquetschen."); + +static const u8 DexDescription_Vibrava_1[] = _( + "Um seine Beute zu schwächen, erzeugt\n" + "VIBRAVA Ultraschallwellen, indem es\n" + "seine Flügel vibrieren lässt."); +static const u8 DexDescription_Vibrava_2[] = _( + "Die Ultraschallwellen dieses POKéMON \n" + "sind so stark, dass sie bei Menschen\n" + "Kopfschmerzen verursachen können."); + +static const u8 DexDescription_Libelldra_1[] = _( + "LIBELLDRA wird auch “Geist der\n" + "Wüste” genannt. Da seine flatternden\n" + "Flügel eine Sandwolke aufwirbeln, ist"); +static const u8 DexDescription_Libelldra_2[] = _( + "dieses POKéMON beim Fliegen immer\n" + "von einem Sandsturm umgeben."); + +static const u8 DexDescription_Tuska_1[] = _( + "TUSKA lebt an trockenen Orten, z. B. in\n" + "Wüsten. Es versprüht einen starken\n" + "Duft aus seiner Blume, um Beute"); +static const u8 DexDescription_Tuska_2[] = _( + "anzuziehen. Wenn sich Beute nähert,\n" + "verschießt es scharfe Stacheln, um\n" + "seinen Gegner zu überwältigen."); + +static const u8 DexDescription_Noktuska_1[] = _( + "Am Tage bleibt NOKTUSKA reglos, damit es\n" + "in der brennenden Wüstenhitze keine\n" + "Feuchtigkeit verliert."); +static const u8 DexDescription_Noktuska_2[] = _( + "Dieses POKéMON wird bei Nacht aktiv,\n" + "wenn die Temperatur sinkt."); + +static const u8 DexDescription_Wablu_1[] = _( + "WABLU hat leichte, flauschige Flügel,\n" + "die wie Schäfchenwolken aussehen.\n" + "Dieses POKéMON hat keine Angst vor"); +static const u8 DexDescription_Wablu_2[] = _( + "Menschen. Es landet auf ihren Köpfen \n" + "und bleibt dort sitzen wie ein \n" + "wattierter Hut."); + +static const u8 DexDescription_Altaria_1[] = _( + "ALTARIA tanzt und dreht sich in der\n" + "Luft durch viele Schäfchenwolken.\n" + "Indem es mit seiner kristallklaren"); +static const u8 DexDescription_Altaria_2[] = _( + "Stimme Melodien singt, versetzt es\n" + "seine Zuhörer in verträumtes\n" + "Erstaunen."); + +static const u8 DexDescription_Sengo_1[] = _( + "Die Erinnerungen an den Kampf mit\n" + "seinem Erzrivalen VIPITIS haben sich in\n" + "jede Zelle von SENGOs Körper"); +static const u8 DexDescription_Sengo_2[] = _( + "eingebrannt. Dieses POKéMON weicht\n" + "feindlichen Angriffen unheimlich\n" + "raffiniert und geschickt aus."); + +static const u8 DexDescription_Vipitis_1[] = _( + "VIPITIS lebt seit Generationen in\n" + "Fehde mit SENGO. Die Narben auf\n" + "seinem Körper sind Zeugen grausamer"); +static const u8 DexDescription_Vipitis_2[] = _( + "Kämpfe. Dieses POKéMON greift seine\n" + "Gegner mit seinem scharfkantigen\n" + "Schweif an."); + +static const u8 DexDescription_Lunastein_1[] = _( + "LUNASTEIN wurde in der Nähe eines\n" + "Meteoritenkraters entdeckt. Daher\n" + "nehmen einige Menschen an, dass"); +static const u8 DexDescription_Lunastein_2[] = _( + "dieses POKéMON aus dem Weltall stammt.\n" + "Diese Theorie konnte allerdings bisher\n" + "noch nicht belegt werden."); + +static const u8 DexDescription_Sonnfel_1[] = _( + "SONNFEL ist eine neue POKéMON-Spezies,\n" + "die angeblich aus dem Weltall\n" + "kam. Es gleitet durch die"); +static const u8 DexDescription_Sonnfel_2[] = _( + "Luft und bewegt sich leise. Im Kampf\n" + "setzt dieses POKéMON sehr helles Licht\n" + "ein."); + +static const u8 DexDescription_Schmerbe_1[] = _( + "SCHMERBEs empfindliche Barthaare\n" + "dienen ihm als hervorragendes\n" + "Radarsystem. Dieses POKéMON versteckt"); +static const u8 DexDescription_Schmerbe_2[] = _( + "sich im Schlamm, so dass nur noch seine\n" + "Barthaare herausgucken, und wartet\n" + "auf Beute."); + +static const u8 DexDescription_Welsar_1[] = _( + "WELSAR legt viel Wert auf sein\n" + "Territorium. Ein einzelnes POKéMON\n" + "dieser Art nennt einen Teich sein Eigen."); +static const u8 DexDescription_Welsar_2[] = _( + "Wenn sich ein Feind nähert, schlägt es\n" + "um sich und verursacht ein gewaltiges\n" + "Erdbeben."); + +static const u8 DexDescription_Krebscorps_1[] = _( + "KREBSCORPS ist kein heimisches\n" + "POKéMON, sondern wurde als Haustier\n" + "importiert. Schließlich verwilderte es."); +static const u8 DexDescription_Krebscorps_2[] = _( + "Dieses POKéMON ist mittlerweile sehr\n" + "robust und hat seine Population\n" + "vergrößert."); + +static const u8 DexDescription_Krebutack_1[] = _( + "KREBUTACK ist von Natur aus sehr\n" + "gewalttätig, so dass es dauernd andere\n" + "Lebewesen zum Kampf herausfordern"); +static const u8 DexDescription_Krebutack_2[] = _( + "muss. Andere Lebensformen lehnen es ab,\n" + "mit diesem POKéMON in ein und demselben\n" + "Teich zu leben."); + +static const u8 DexDescription_Puppance_1[] = _( + "PUPPANCE bewegt sich, indem es sich auf\n" + "seinem Fuß im Kreis dreht. In sehr alten\n" + "Ruinen wurden primitive Wandmalereien"); +static const u8 DexDescription_Puppance_2[] = _( + "entdeckt, die dieses POKéMON in\n" + "Begleitung von Menschen zeigen."); + +static const u8 DexDescription_Lepumentas_1[] = _( + "LEPUMENTAS sind aus Schlamm gefertigte\n" + "Puppen, die von primitiven Menschen\n" + "hergestellt und durch mysteriöse"); +static const u8 DexDescription_Lepumentas_2[] = _( + "Strahlen zum Leben erweckt wurden.\n" + "Diese POKéMON bewegen sich\n" + "schwebend fort."); + +static const u8 DexDescription_Liliep_1[] = _( + "Von LILIEP nahm man an, es sei seit\n" + "etwa hundert Millionen Jahren\n" + "ausgestorben. Mit seinen wie"); +static const u8 DexDescription_Liliep_2[] = _( + "Blütenblätter geformten Tentakeln\n" + "heftet es sich an einen Felsen auf dem\n" + "Meeresboden und fängt Beute."); + +static const u8 DexDescription_Wielie_1[] = _( + "WIELIE durchforstet den Meeresboden\n" + "nach Beute. Dieses POKéMON fährt\n" + "seinen baumstammartigen Nacken aus"); +static const u8 DexDescription_Wielie_2[] = _( + "und fängt mit seinen acht Tentakeln\n" + "Beute."); + +static const u8 DexDescription_Anorith_1[] = _( + "ANORITH wurde aus einem\n" + "prähistorischen Fossil erzeugt. Dieses\n" + "primitive POKéMON lebte einst in warmen"); +static const u8 DexDescription_Anorith_2[] = _( + "Gewässern. Es klemmt seine Beute\n" + "fest zwischen seine beiden riesigen\n" + "Klauen ein."); + +static const u8 DexDescription_Armaldo_1[] = _( + "Von ARMALDOs hartem Panzer prallen\n" + "alle Angriffe ab. Dieses POKéMON\n" + "hat zwei mächtige Klauen, die es"); +static const u8 DexDescription_Armaldo_2[] = _( + "ausfahren oder einziehen kann. Es hat\n" + "so viel Kraft, dass es damit eine\n" + "Stahlplatte pulverisieren kann."); + +static const u8 DexDescription_Barschwa_1[] = _( + "BARSCHWAs Flossen waren schon immer\n" + "zerfetzt. Wegen seines merkwürdigen\n" + "Aussehens wird dieses POKéMON"); +static const u8 DexDescription_Barschwa_2[] = _( + "weitgehend ignoriert. Es kann sowohl im\n" + "Meer als auch in Flüssen leben."); + +static const u8 DexDescription_Milotic_1[] = _( + "MILOTIC soll das Schönste aller\n" + "POKéMON sein. Es hat die Macht,\n" + "Emotionen wie Wut und Feindseligkeit zu"); +static const u8 DexDescription_Milotic_2[] = _( + "besänftigen und somit erbitterten\n" + "Streit zu vermeiden."); + +static const u8 DexDescription_Formeo_1[] = _( + "FORMEOs Erscheinung ändert sich\n" + "mit dem Wetter. Dieses POKéMON hat\n" + "die Fähigkeit erworben, die mächtige"); +static const u8 DexDescription_Formeo_2[] = _( + "Kraft der Natur zu nutzen, um seinen\n" + "winzigen Körper zu schützen."); + +static const u8 DexDescription_Kecleon_1[] = _( + "KECLEON kann die Farbe seines Körpers\n" + "bei Bedarf verändern, um sich seiner\n" + "Umgebung anzupassen. Es gibt allerdings"); +static const u8 DexDescription_Kecleon_2[] = _( + "eine Ausnahme: Das Zickzackmuster auf\n" + "seinem Bauch kann es nicht verändern."); + +static const u8 DexDescription_Shuppet_1[] = _( + "SHUPPET wird durch Gefühle wie Neid und\n" + "Rachsucht angezogen. Wenn jemand\n" + "starke Rachegelüste entwickelt,"); +static const u8 DexDescription_Shuppet_2[] = _( + "erscheint dieses POKéMON in Scharen\n" + "und reiht sich unter der Dachrinne der\n" + "Person auf."); + +static const u8 DexDescription_Banette_1[] = _( + "BANETTE belegt andere mit Flüchen,\n" + "indem es Nadeln in seinen eigenen\n" + "Körper sticht. Dieses POKéMON war"); +static const u8 DexDescription_Banette_2[] = _( + "ursprünglich eine Mitleid erregende\n" + "Plüschpuppe, die weggeworfen wurde."); + +static const u8 DexDescription_Zwirrlicht_1[] = _( + "ZWIRRLICHT kann durch jede Wand gehen,\n" + "egal, wie dick diese ist. Wenn dieses\n" + "POKéMON sich ein Ziel gesucht hat,"); +static const u8 DexDescription_Zwirrlicht_2[] = _( + "verfolgt es seinen Feind unnachgiebig\n" + "bis zum Sonnenaufgang."); + +static const u8 DexDescription_Zwirrklop_1[] = _( + "ZWIRRKLOPs Körper ist komplett hohl. Es\n" + "wird auch mit einem Schwarzen Loch\n" + "verglichen. Dieses POKéMON nimmt alles"); +static const u8 DexDescription_Zwirrklop_2[] = _( + "in seinem Körper auf, es kommt jedoch\n" + "nichts wieder heraus."); + +static const u8 DexDescription_Tropius_1[] = _( + "Die Früchte am Nacken von TROPIUS\n" + "sind bei Kindern sehr beliebt. Dieses\n" + "POKéMON liebt Früchte und isst sie"); +static const u8 DexDescription_Tropius_2[] = _( + "ständig. Offensichtlich sind ihm wegen\n" + "dieser Vorliebe selber Früchte\n" + "gewachsen."); + +static const u8 DexDescription_Palimpalim_1[] = _( + "PALIMPALIMs Schreie hallen durch\n" + "seinen hohlen Körper. Wenn dieses\n" + "POKéMON wütend wird, erzeugen"); +static const u8 DexDescription_Palimpalim_2[] = _( + "seine Schreie Ultraschallwellen, die\n" + "seine Feinde buchstäblich wegfegen\n" + "können."); + +static const u8 DexDescription_Absol_1[] = _( + "Jedes Mal, wenn ABSOL sich den Menschen\n" + "zeigt, endet dies in einer Katastrophe\n" + "wie Erdbeben oder Sturmflut."); +static const u8 DexDescription_Absol_2[] = _( + "Deswegen ist es auch als das\n" + "Katastrophen-POKéMON bekannt."); + +static const u8 DexDescription_Isso_1[] = _( + "ISSO hat immer ein breites, fröhliches\n" + "Lächeln auf seinem Gesicht. Um \n" + "festzustellen, ob es wütend ist, muss"); +static const u8 DexDescription_Isso_2[] = _( + "man seinen Schweif betrachten. Wenn es\n" + "wütend ist, schlägt es damit auf den\n" + "Boden."); + +static const u8 DexDescription_Schneppke_1[] = _( + "SCHNEPPKE lebt in Gebieten mit heftigem\n" + "Schneefall. In Jahreszeiten, in denen es\n" + "nicht schneit, wie im Frühling oder im"); +static const u8 DexDescription_Schneppke_2[] = _( + "Sommer, nimmt das POKéMON Reißaus, um\n" + "in einer Höhle ein ruhiges Leben unter\n" + "Stalaktiten und Stalagmiten zu führen."); + +static const u8 DexDescription_Firnontor_1[] = _( + "FIRNONTOR hat einen Körper aus Stein,\n" + "den es mit einem Panzer aus Eis noch\n" + "verstärkt. Dieses POKéMON kann"); +static const u8 DexDescription_Firnontor_2[] = _( + "die Luftfeuchtigkeit der Atmosphäre\n" + "einfrieren und in jegliche Form\n" + "verwandeln."); + +static const u8 DexDescription_Seemops_1[] = _( + "SEEMOPS kann schneller rollen als laufen.\n" + "Wenn Gruppen dieses POKéMON \n" + "zusammen essen, klatschen sie"); +static const u8 DexDescription_Seemops_2[] = _( + "gleichzeitig, um ihre Freude zu zeigen.\n" + "Deswegen sind ihre Mahlzeiten sehr\n" + "laut."); + +static const u8 DexDescription_Seejong_1[] = _( + "SEEJONG hat die Angewohnheit, alles,\n" + "was es zum ersten Mal sieht, auf seiner \n" + "Nasenspitze zu jonglieren. Dieses"); +static const u8 DexDescription_Seejong_2[] = _( + "POKéMON hält sich bei Laune, indem es\n" + "manchmal ein SEEMOPS auf seiner Nase\n" + "balanciert und hin- und herrollt."); + +static const u8 DexDescription_Walraisa_1[] = _( + "WALRAISA hat zwei massive Stoßzähne,\n" + "die mit einem Hieb Eisblöcke\n" + "zertrümmern können, die bis zu"); +static const u8 DexDescription_Walraisa_2[] = _( + "10 Tonnen wiegen. Es besitzt eine dicke\n" + "Speckschicht, die es vor eisigen\n" + "Temperaturen schützt."); + +static const u8 DexDescription_Perlu_1[] = _( + "PERLUs kräftige Schale dient nicht\n" + "nur dem Schutz, es nutzt sie auch zum\n" + "Fangen von Beute. Die ausgewachsene"); +static const u8 DexDescription_Perlu_2[] = _( + "Schale eines PERLU weist viele\n" + "Kerben und Kratzer auf."); + +static const u8 DexDescription_Aalabyss_1[] = _( + "AALABYSS entging lange der\n" + "Aufmerksamkeit des Menschen, da es in\n" + "extremen Tiefen des Meeres lebt."); +static const u8 DexDescription_Aalabyss_2[] = _( + "Die Augen dieses POKéMON können\n" + "selbst in den dunklen und trüben Tiefen\n" + "des Meeres einwandfrei sehen."); + +static const u8 DexDescription_Saganabyss_1[] = _( + "SAGANABYSS lebt in extremen Tiefen des\n" + "Südmeeres. Sein Körper ist so angelegt,\n" + "dass er dem enormen Wasserdruck dieser"); +static const u8 DexDescription_Saganabyss_2[] = _( + "unglaublichen Tiefe standhalten kann.\n" + "Daher übersteht dieses POKéMON\n" + "gewöhnliche Attacken unbeschadet."); + +static const u8 DexDescription_Relicanth_1[] = _( + "RELICANTH ist eine POKéMON-Spezies,\n" + "die vor hundert Millionen Jahren\n" + "existierte, ohne jemals ihre Form zu"); +static const u8 DexDescription_Relicanth_2[] = _( + "verändern. Dieses antike POKéMON\n" + "hat ein zahnloses Maul und ernährt sich\n" + "von Mikroorganismen."); + +static const u8 DexDescription_Liebiskus_1[] = _( + "LIEBISKUS lebt in den seichten\n" + "Gewässern der Tropen. Dieses herz-\n" + "förmige POKéMON verdankt seinen Namen"); +static const u8 DexDescription_Liebiskus_2[] = _( + "der Tatsache, dass es hinter Liebes-\n" + "paaren herschwamm, die es in den Wellen\n" + "des Ozeans beobachtet hatte."); + +static const u8 DexDescription_Kindwurm_1[] = _( + "KINDWURM hat den Traum, fliegen zu\n" + "können. In zahlreichen vergeblichen\n" + "Versuchen stürzte es sich die Klippen"); +static const u8 DexDescription_Kindwurm_2[] = _( + "herunter. Daher ist sein Kopf sehr\n" + "robust und so hart wie Stahl geworden."); + +static const u8 DexDescription_Draschel_1[] = _( + "In DRASCHELs panzerartiger Schale\n" + "vollziehen seine Zellen eine\n" + "Transformation, um einen völlig neuen"); +static const u8 DexDescription_Draschel_2[] = _( + "Körper zu bilden. Die Schale dieses\n" + "POKéMON ist ausgesprochen schwer, so\n" + "dass seine Bewegungen träge wirken."); + +static const u8 DexDescription_Brutalanda_1[] = _( + "BRUTALANDA träumte sehr lange davon,\n" + "dass ihm Flügel wachsen mögen. Dieser\n" + "sehnliche Wunsch hat wohl eine"); +static const u8 DexDescription_Brutalanda_2[] = _( + "plötzliche Mutation in den Zellen dieses\n" + "POKéMON hervorgerufen, so dass ihm\n" + "plötzlich prächtige Flügel wuchsen."); + +static const u8 DexDescription_Tanhel_1[] = _( + "Anstelle von Blut fließt eine starke\n" + "magnetische Energie durch TANHELs\n" + "Körper. Dieses POKéMON kommuniziert"); +static const u8 DexDescription_Tanhel_2[] = _( + "mit anderen, indem es kontrollierte\n" + "magnetische Impulse aussendet."); + +static const u8 DexDescription_Metang_1[] = _( + "Wenn zwei TANHEL miteinander\n" + "verschmelzen, entsteht daraus METANG.\n" + "Die Gehirne der TANHEL werden mit"); +static const u8 DexDescription_Metang_2[] = _( + "einem magnetischen Nervensystem\n" + "verbunden. Dadurch erzeugt es starke\n" + "psychokinetische Energie."); + +static const u8 DexDescription_Metagross_1[] = _( + "METAGROSS hat insgesamt vier Gehirne.\n" + "Diese können schwierige Berechnungen\n" + "schneller lösen als ein Supercomputer."); +static const u8 DexDescription_Metagross_2[] = _( + "Dieses POKéMON kann durch die Lüfte\n" + "schweben, indem es seine vier Beine\n" + "einklappt."); + +static const u8 DexDescription_Regirock_1[] = _( + "REGIROCK wurde vor langer Zeit von\n" + "Menschen weggeschlossen. Wenn der\n" + "Körper dieses POKéMON im Kampf"); +static const u8 DexDescription_Regirock_2[] = _( + "Schaden nimmt, sucht es nach\n" + "passenden Steinen, um sich selber zu\n" + "reparieren."); + +static const u8 DexDescription_Regice_1[] = _( + "REGICEs tiefgefrorener Körper\n" + "entstand während der Eiszeit. Es kann\n" + "nicht einmal durch Feuer geschmolzen"); +static const u8 DexDescription_Regice_2[] = _( + "werden. Dieses POKéMON kontrolliert\n" + "eisige Luft von minus 200 Grad."); + +static const u8 DexDescription_Registeel_1[] = _( + "REGISTEEL hat einen Körper, der härter\n" + "ist als jede Art von Metall. Sein Körper\n" + "scheint hohl zu sein."); +static const u8 DexDescription_Registeel_2[] = _( + "Niemand hat eine Ahnung, was dieses\n" + "POKéMON wohl frisst."); + +static const u8 DexDescription_Latias_1[] = _( + "LATIAS ist in höchstem Maße empfindlich\n" + "gegenüber den Emotionen der Menschen.\n" + "Wenn es den Anflug von Feindseligkeit"); +static const u8 DexDescription_Latias_2[] = _( + "wahrnimmt, werden seine Federn\n" + "zerzaust und es stößt schrille Schreie\n" + "aus, um seinen Gegner einzuschüchtern."); + +static const u8 DexDescription_Latios_1[] = _( + "LATIOS kann seinem Feind ein Bild\n" + "von etwas, das dieser einmal gesehen\n" + "hat, in den Kopf projizieren. Dieses"); +static const u8 DexDescription_Latios_2[] = _( + "POKéMON ist intelligent und es versteht\n" + "die menschliche Sprache."); + +static const u8 DexDescription_Kyogre_1[] = _( + "KYOGRE kann riesige Regenwolken\n" + "erzeugen, die den gesamten Himmel\n" + "bedecken, und wolkenbruchartige"); +static const u8 DexDescription_Kyogre_2[] = _( + "Niederschläge hervorrufen. Dieses\n" + "POKéMON hat vielen Menschen das Leben\n" + "gerettet, die unter einer Dürre litten."); + +static const u8 DexDescription_Groudon_1[] = _( + "GROUDON wurde lange Zeit in der\n" + "Mythologie als ein POKéMON\n" + "beschrieben, das Land erschaffen und"); +static const u8 DexDescription_Groudon_2[] = _( + "Kontinente vergrößern kann. Dieses\n" + "POKéMON fiel nach einem erbitterten\n" + "Kampf mit KYOGRE in den Schlaf."); + +static const u8 DexDescription_Rayquaza_1[] = _( + "RAYQUAZA lebte für hunderte Millionen\n" + "Jahre in der Ozonschicht und stieg nie\n" + "zur Erde hinab. Dieses POKéMON"); +static const u8 DexDescription_Rayquaza_2[] = _( + "lebt von Wasser und Partikeln aus der\n" + "Atmosphäre."); + +static const u8 DexDescription_Jirachi_1[] = _( + "Einer Legende nach erfüllt JIRACHI\n" + "jeden Wunsch, der auf einen Notizzettel\n" + "an seinem Kopf geschrieben wird. Wenn"); +static const u8 DexDescription_Jirachi_2[] = _( + "dieses POKéMON Gefahr wittert, kämpft\n" + "es bereits, bevor es überhaupt\n" + "aufgewacht ist."); + +static const u8 DexDescription_Deoxys_1[] = _( + "Die DNS eines Weltraumvirus hat eine\n" + "spontane Mutation erfahren, da sie\n" + "einem Laserstrahl ausgesetzt wurde."); +static const u8 DexDescription_Deoxys_2[] = _( + "Daraus entstand DEOXYS. \n" + "Das kristallartige Organ auf der Brust\n" + "dieses POKéMON ist sein Gehirn."); + +static const struct PokedexEntry gPokedexEntries[] = { + { + // Dummy + .categoryName = _("UNBEKANNT"), + .height = 0, + .weight = 0, + .descriptionPage1 = DexDescription_Dummy_1, + .descriptionPage2 = DexDescription_Dummy_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Bisasam + .categoryName = _("SAMEN"), + .height = 7, + .weight = 69, + .descriptionPage1 = DexDescription_Bisasam_1, + .descriptionPage2 = DexDescription_Bisasam_2, + .pokemonScale = 356, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Bisaknosp + .categoryName = _("SAMEN"), + .height = 10, + .weight = 130, + .descriptionPage1 = DexDescription_Bisaknosp_1, + .descriptionPage2 = DexDescription_Bisaknosp_2, + .pokemonScale = 335, + .pokemonOffset = 13, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Bisaflor + .categoryName = _("SAMEN"), + .height = 20, + .weight = 1000, + .descriptionPage1 = DexDescription_Bisaflor_1, + .descriptionPage2 = DexDescription_Bisaflor_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 388, + .trainerOffset = 6, + }, + { + // Glumanda + .categoryName = _("ECHSE"), + .height = 6, + .weight = 85, + .descriptionPage1 = DexDescription_Glumanda_1, + .descriptionPage2 = DexDescription_Glumanda_2, + .pokemonScale = 444, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Glutexo + .categoryName = _("FLAMME"), + .height = 11, + .weight = 190, + .descriptionPage1 = DexDescription_Glutexo_1, + .descriptionPage2 = DexDescription_Glutexo_2, + .pokemonScale = 302, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Glurak + .categoryName = _("FLAMME"), + .height = 17, + .weight = 905, + .descriptionPage1 = DexDescription_Glurak_1, + .descriptionPage2 = DexDescription_Glurak_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 302, + .trainerOffset = 3, + }, + { + // Schiggy + .categoryName = _("MINIKRÖTE"), + .height = 5, + .weight = 90, + .descriptionPage1 = DexDescription_Schiggy_1, + .descriptionPage2 = DexDescription_Schiggy_2, + .pokemonScale = 412, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schillok + .categoryName = _("KRÖTE"), + .height = 10, + .weight = 225, + .descriptionPage1 = DexDescription_Schillok_1, + .descriptionPage2 = DexDescription_Schillok_2, + .pokemonScale = 332, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Turtok + .categoryName = _("PANZERTIER"), + .height = 16, + .weight = 855, + .descriptionPage1 = DexDescription_Turtok_1, + .descriptionPage2 = DexDescription_Turtok_2, + .pokemonScale = 256, + .pokemonOffset = 65535, + .trainerScale = 293, + .trainerOffset = 2, + }, + { + // Raupy + .categoryName = _("WURM"), + .height = 3, + .weight = 29, + .descriptionPage1 = DexDescription_Raupy_1, + .descriptionPage2 = DexDescription_Raupy_2, + .pokemonScale = 549, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Safcon + .categoryName = _("KOKON"), + .height = 7, + .weight = 99, + .descriptionPage1 = DexDescription_Safcon_1, + .descriptionPage2 = DexDescription_Safcon_2, + .pokemonScale = 350, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Smettbo + .categoryName = _("FALTER"), + .height = 11, + .weight = 320, + .descriptionPage1 = DexDescription_Smettbo_1, + .descriptionPage2 = DexDescription_Smettbo_2, + .pokemonScale = 312, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hornliu + .categoryName = _("RAUPE"), + .height = 3, + .weight = 32, + .descriptionPage1 = DexDescription_Hornliu_1, + .descriptionPage2 = DexDescription_Hornliu_2, + .pokemonScale = 455, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kokuna + .categoryName = _("KOKON"), + .height = 6, + .weight = 100, + .descriptionPage1 = DexDescription_Kokuna_1, + .descriptionPage2 = DexDescription_Kokuna_2, + .pokemonScale = 424, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Bibor + .categoryName = _("GIFTBIENE"), + .height = 10, + .weight = 295, + .descriptionPage1 = DexDescription_Bibor_1, + .descriptionPage2 = DexDescription_Bibor_2, + .pokemonScale = 366, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Taubsi + .categoryName = _("KLEINVOGEL"), + .height = 3, + .weight = 18, + .descriptionPage1 = DexDescription_Taubsi_1, + .descriptionPage2 = DexDescription_Taubsi_2, + .pokemonScale = 508, + .pokemonOffset = 65533, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tauboga + .categoryName = _("VOGEL"), + .height = 11, + .weight = 300, + .descriptionPage1 = DexDescription_Tauboga_1, + .descriptionPage2 = DexDescription_Tauboga_2, + .pokemonScale = 331, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tauboss + .categoryName = _("VOGEL"), + .height = 15, + .weight = 395, + .descriptionPage1 = DexDescription_Tauboss_1, + .descriptionPage2 = DexDescription_Tauboss_2, + .pokemonScale = 269, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rattfratz + .categoryName = _("MAUS"), + .height = 3, + .weight = 35, + .descriptionPage1 = DexDescription_Rattfratz_1, + .descriptionPage2 = DexDescription_Rattfratz_2, + .pokemonScale = 481, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rattikarl + .categoryName = _("MAUS"), + .height = 7, + .weight = 185, + .descriptionPage1 = DexDescription_Rattikarl_1, + .descriptionPage2 = DexDescription_Rattikarl_2, + .pokemonScale = 459, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Habitak + .categoryName = _("KLEINVOGEL"), + .height = 3, + .weight = 20, + .descriptionPage1 = DexDescription_Habitak_1, + .descriptionPage2 = DexDescription_Habitak_2, + .pokemonScale = 571, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ibitak + .categoryName = _("PICKVOGEL"), + .height = 12, + .weight = 380, + .descriptionPage1 = DexDescription_Ibitak_1, + .descriptionPage2 = DexDescription_Ibitak_2, + .pokemonScale = 278, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rettan + .categoryName = _("SCHLANGE"), + .height = 20, + .weight = 69, + .descriptionPage1 = DexDescription_Rettan_1, + .descriptionPage2 = DexDescription_Rettan_2, + .pokemonScale = 298, + .pokemonOffset = 12, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Arbok + .categoryName = _("KOBRA"), + .height = 35, + .weight = 650, + .descriptionPage1 = DexDescription_Arbok_1, + .descriptionPage2 = DexDescription_Arbok_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 296, + .trainerOffset = 2, + }, + { + // Pikachu + .categoryName = _("MAUS"), + .height = 4, + .weight = 60, + .descriptionPage1 = DexDescription_Pikachu_1, + .descriptionPage2 = DexDescription_Pikachu_2, + .pokemonScale = 479, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Raichu + .categoryName = _("MAUS"), + .height = 8, + .weight = 300, + .descriptionPage1 = DexDescription_Raichu_1, + .descriptionPage2 = DexDescription_Raichu_2, + .pokemonScale = 426, + .pokemonOffset = 13, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sandan + .categoryName = _("MAUS"), + .height = 6, + .weight = 120, + .descriptionPage1 = DexDescription_Sandan_1, + .descriptionPage2 = DexDescription_Sandan_2, + .pokemonScale = 365, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sandamer + .categoryName = _("MAUS"), + .height = 10, + .weight = 295, + .descriptionPage1 = DexDescription_Sandamer_1, + .descriptionPage2 = DexDescription_Sandamer_2, + .pokemonScale = 341, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nidoran♀ + .categoryName = _("GIFTDORN"), + .height = 4, + .weight = 70, + .descriptionPage1 = DexDescription_NidoranF_1, + .descriptionPage2 = DexDescription_NidoranF_2, + .pokemonScale = 488, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nidorina + .categoryName = _("GIFTDORN"), + .height = 8, + .weight = 200, + .descriptionPage1 = DexDescription_Nidorina_1, + .descriptionPage2 = DexDescription_Nidorina_2, + .pokemonScale = 381, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nidoqueen + .categoryName = _("BOHRER"), + .height = 13, + .weight = 600, + .descriptionPage1 = DexDescription_Nidoqueen_1, + .descriptionPage2 = DexDescription_Nidoqueen_2, + .pokemonScale = 293, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nidoran♂ + .categoryName = _("GIFTDORN"), + .height = 5, + .weight = 90, + .descriptionPage1 = DexDescription_NidoranM_1, + .descriptionPage2 = DexDescription_NidoranM_2, + .pokemonScale = 511, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nidorino + .categoryName = _("GIFTDORN"), + .height = 9, + .weight = 195, + .descriptionPage1 = DexDescription_Nidorino_1, + .descriptionPage2 = DexDescription_Nidorino_2, + .pokemonScale = 408, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nidoking + .categoryName = _("BOHRER"), + .height = 14, + .weight = 620, + .descriptionPage1 = DexDescription_Nidoking_1, + .descriptionPage2 = DexDescription_Nidoking_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Piepi + .categoryName = _("FEE"), + .height = 6, + .weight = 75, + .descriptionPage1 = DexDescription_Piepi_1, + .descriptionPage2 = DexDescription_Piepi_2, + .pokemonScale = 441, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pixi + .categoryName = _("FEE"), + .height = 13, + .weight = 400, + .descriptionPage1 = DexDescription_Pixi_1, + .descriptionPage2 = DexDescription_Pixi_2, + .pokemonScale = 256, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Vulpix + .categoryName = _("FUCHS"), + .height = 6, + .weight = 99, + .descriptionPage1 = DexDescription_Vulpix_1, + .descriptionPage2 = DexDescription_Vulpix_2, + .pokemonScale = 542, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Vulnona + .categoryName = _("FUCHS"), + .height = 11, + .weight = 199, + .descriptionPage1 = DexDescription_Vulnona_1, + .descriptionPage2 = DexDescription_Vulnona_2, + .pokemonScale = 339, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pummeluff + .categoryName = _("BALLON"), + .height = 5, + .weight = 55, + .descriptionPage1 = DexDescription_Pummeluff_1, + .descriptionPage2 = DexDescription_Pummeluff_2, + .pokemonScale = 433, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Knuddeluff + .categoryName = _("BALLON"), + .height = 10, + .weight = 120, + .descriptionPage1 = DexDescription_Knuddeluff_1, + .descriptionPage2 = DexDescription_Knuddeluff_2, + .pokemonScale = 328, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Zubat + .categoryName = _("FLEDERMAUS"), + .height = 8, + .weight = 75, + .descriptionPage1 = DexDescription_Zubat_1, + .descriptionPage2 = DexDescription_Zubat_2, + .pokemonScale = 362, + .pokemonOffset = 65531, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Golbat + .categoryName = _("FLEDERMAUS"), + .height = 16, + .weight = 550, + .descriptionPage1 = DexDescription_Golbat_1, + .descriptionPage2 = DexDescription_Golbat_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Myrapla + .categoryName = _("UNKRAUT"), + .height = 5, + .weight = 54, + .descriptionPage1 = DexDescription_Myrapla_1, + .descriptionPage2 = DexDescription_Myrapla_2, + .pokemonScale = 423, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Duflor + .categoryName = _("UNKRAUT"), + .height = 8, + .weight = 86, + .descriptionPage1 = DexDescription_Duflor_1, + .descriptionPage2 = DexDescription_Duflor_2, + .pokemonScale = 329, + .pokemonOffset = 13, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Giflor + .categoryName = _("BLUME"), + .height = 12, + .weight = 186, + .descriptionPage1 = DexDescription_Giflor_1, + .descriptionPage2 = DexDescription_Giflor_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Paras + .categoryName = _("PILZ"), + .height = 3, + .weight = 54, + .descriptionPage1 = DexDescription_Paras_1, + .descriptionPage2 = DexDescription_Paras_2, + .pokemonScale = 593, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Parasek + .categoryName = _("PILZ"), + .height = 10, + .weight = 295, + .descriptionPage1 = DexDescription_Parasek_1, + .descriptionPage2 = DexDescription_Parasek_2, + .pokemonScale = 307, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Bluzuk + .categoryName = _("INSEKT"), + .height = 10, + .weight = 300, + .descriptionPage1 = DexDescription_Bluzuk_1, + .descriptionPage2 = DexDescription_Bluzuk_2, + .pokemonScale = 360, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 65535, + }, + { + // Omot + .categoryName = _("GIFTMOTTE"), + .height = 15, + .weight = 125, + .descriptionPage1 = DexDescription_Omot_1, + .descriptionPage2 = DexDescription_Omot_2, + .pokemonScale = 285, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 1, + }, + { + // Digda + .categoryName = _("MAULWURF"), + .height = 2, + .weight = 8, + .descriptionPage1 = DexDescription_Digda_1, + .descriptionPage2 = DexDescription_Digda_2, + .pokemonScale = 833, + .pokemonOffset = 25, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Digdri + .categoryName = _("MAULWURF"), + .height = 7, + .weight = 333, + .descriptionPage1 = DexDescription_Digdri_1, + .descriptionPage2 = DexDescription_Digdri_2, + .pokemonScale = 406, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Mauzi + .categoryName = _("KATZE"), + .height = 4, + .weight = 42, + .descriptionPage1 = DexDescription_Mauzi_1, + .descriptionPage2 = DexDescription_Mauzi_2, + .pokemonScale = 480, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Snobilikat + .categoryName = _("RASSEKATZE"), + .height = 10, + .weight = 320, + .descriptionPage1 = DexDescription_Snobilikat_1, + .descriptionPage2 = DexDescription_Snobilikat_2, + .pokemonScale = 320, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Enton + .categoryName = _("ENTE"), + .height = 8, + .weight = 196, + .descriptionPage1 = DexDescription_Enton_1, + .descriptionPage2 = DexDescription_Enton_2, + .pokemonScale = 369, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Entoron + .categoryName = _("ENTE"), + .height = 17, + .weight = 766, + .descriptionPage1 = DexDescription_Entoron_1, + .descriptionPage2 = DexDescription_Entoron_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 273, + .trainerOffset = 1, + }, + { + // Menki + .categoryName = _("SCHW./ AFFE"), + .height = 5, + .weight = 280, + .descriptionPage1 = DexDescription_Menki_1, + .descriptionPage2 = DexDescription_Menki_2, + .pokemonScale = 404, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rasaff + .categoryName = _("SCHW./ AFFE"), + .height = 10, + .weight = 320, + .descriptionPage1 = DexDescription_Rasaff_1, + .descriptionPage2 = DexDescription_Rasaff_2, + .pokemonScale = 326, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Fukano + .categoryName = _("HUND"), + .height = 7, + .weight = 190, + .descriptionPage1 = DexDescription_Fukano_1, + .descriptionPage2 = DexDescription_Fukano_2, + .pokemonScale = 346, + .pokemonOffset = 14, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Arkani + .categoryName = _("LEGENDÄR"), + .height = 19, + .weight = 1550, + .descriptionPage1 = DexDescription_Arkani_1, + .descriptionPage2 = DexDescription_Arkani_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 312, + .trainerOffset = 4, + }, + { + // Quapsel + .categoryName = _("KAULQUAPPE"), + .height = 6, + .weight = 124, + .descriptionPage1 = DexDescription_Quapsel_1, + .descriptionPage2 = DexDescription_Quapsel_2, + .pokemonScale = 369, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Quaputzi + .categoryName = _("KAULQUAPPE"), + .height = 10, + .weight = 200, + .descriptionPage1 = DexDescription_Quaputzi_1, + .descriptionPage2 = DexDescription_Quaputzi_2, + .pokemonScale = 288, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Quappo + .categoryName = _("KAULQUAPPE"), + .height = 13, + .weight = 540, + .descriptionPage1 = DexDescription_Quappo_1, + .descriptionPage2 = DexDescription_Quappo_2, + .pokemonScale = 256, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Abra + .categoryName = _("PSI"), + .height = 9, + .weight = 195, + .descriptionPage1 = DexDescription_Abra_1, + .descriptionPage2 = DexDescription_Abra_2, + .pokemonScale = 363, + .pokemonOffset = 14, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kadabra + .categoryName = _("PSI"), + .height = 13, + .weight = 565, + .descriptionPage1 = DexDescription_Kadabra_1, + .descriptionPage2 = DexDescription_Kadabra_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Simsala + .categoryName = _("PSI"), + .height = 15, + .weight = 480, + .descriptionPage1 = DexDescription_Simsala_1, + .descriptionPage2 = DexDescription_Simsala_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Machollo + .categoryName = _("KRAFTPROTZ"), + .height = 8, + .weight = 195, + .descriptionPage1 = DexDescription_Machollo_1, + .descriptionPage2 = DexDescription_Machollo_2, + .pokemonScale = 342, + .pokemonOffset = 14, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Maschock + .categoryName = _("KRAFTPROTZ"), + .height = 15, + .weight = 705, + .descriptionPage1 = DexDescription_Maschock_1, + .descriptionPage2 = DexDescription_Maschock_2, + .pokemonScale = 323, + .pokemonOffset = 9, + .trainerScale = 257, + .trainerOffset = 0, + }, + { + // Machomei + .categoryName = _("KRAFTPROTZ"), + .height = 16, + .weight = 1300, + .descriptionPage1 = DexDescription_Machomei_1, + .descriptionPage2 = DexDescription_Machomei_2, + .pokemonScale = 280, + .pokemonOffset = 1, + .trainerScale = 269, + .trainerOffset = 65535, + }, + { + // Knofensa + .categoryName = _("BLUME"), + .height = 7, + .weight = 40, + .descriptionPage1 = DexDescription_Knofensa_1, + .descriptionPage2 = DexDescription_Knofensa_2, + .pokemonScale = 354, + .pokemonOffset = 16, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ultrigaria + .categoryName = _("FLIEGENTOT"), + .height = 10, + .weight = 64, + .descriptionPage1 = DexDescription_Ultrigaria_1, + .descriptionPage2 = DexDescription_Ultrigaria_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sarzenia + .categoryName = _("FLIEGENTOT"), + .height = 17, + .weight = 155, + .descriptionPage1 = DexDescription_Sarzenia_1, + .descriptionPage2 = DexDescription_Sarzenia_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 312, + .trainerOffset = 3, + }, + { + // Tentacha + .categoryName = _("QUALLE"), + .height = 9, + .weight = 455, + .descriptionPage1 = DexDescription_Tentacha_1, + .descriptionPage2 = DexDescription_Tentacha_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tentoxa + .categoryName = _("QUALLE"), + .height = 16, + .weight = 550, + .descriptionPage1 = DexDescription_Tentoxa_1, + .descriptionPage2 = DexDescription_Tentoxa_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 312, + .trainerOffset = 1, + }, + { + // Kleinstein + .categoryName = _("GESTEIN"), + .height = 4, + .weight = 200, + .descriptionPage1 = DexDescription_Kleinstein_1, + .descriptionPage2 = DexDescription_Kleinstein_2, + .pokemonScale = 347, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Georok + .categoryName = _("GESTEIN"), + .height = 10, + .weight = 1050, + .descriptionPage1 = DexDescription_Georok_1, + .descriptionPage2 = DexDescription_Georok_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Geowaz + .categoryName = _("URGESTEIN"), + .height = 14, + .weight = 3000, + .descriptionPage1 = DexDescription_Geowaz_1, + .descriptionPage2 = DexDescription_Geowaz_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 296, + .trainerOffset = 2, + }, + { + // Ponita + .categoryName = _("FEUERPFERD"), + .height = 10, + .weight = 300, + .descriptionPage1 = DexDescription_Ponita_1, + .descriptionPage2 = DexDescription_Ponita_2, + .pokemonScale = 283, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Gallopa + .categoryName = _("FEUERPFERD"), + .height = 17, + .weight = 950, + .descriptionPage1 = DexDescription_Gallopa_1, + .descriptionPage2 = DexDescription_Gallopa_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 289, + .trainerOffset = 1, + }, + { + // Flegmon + .categoryName = _("SCHNARCHER"), + .height = 12, + .weight = 360, + .descriptionPage1 = DexDescription_Flegmon_1, + .descriptionPage2 = DexDescription_Flegmon_2, + .pokemonScale = 256, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lahmus + .categoryName = _("SYMBIOSE"), + .height = 16, + .weight = 785, + .descriptionPage1 = DexDescription_Lahmus_1, + .descriptionPage2 = DexDescription_Lahmus_2, + .pokemonScale = 256, + .pokemonOffset = 6, + .trainerScale = 296, + .trainerOffset = 2, + }, + { + // Magnetilo + .categoryName = _("MAGNET"), + .height = 3, + .weight = 60, + .descriptionPage1 = DexDescription_Magnetilo_1, + .descriptionPage2 = DexDescription_Magnetilo_2, + .pokemonScale = 288, + .pokemonOffset = 65527, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Magneton + .categoryName = _("MAGNET"), + .height = 10, + .weight = 600, + .descriptionPage1 = DexDescription_Magneton_1, + .descriptionPage2 = DexDescription_Magneton_2, + .pokemonScale = 292, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Porenta + .categoryName = _("WILDENTE"), + .height = 8, + .weight = 150, + .descriptionPage1 = DexDescription_Porenta_1, + .descriptionPage2 = DexDescription_Porenta_2, + .pokemonScale = 330, + .pokemonOffset = 2, + .trainerScale = 293, + .trainerOffset = 2, + }, + { + // Dodu + .categoryName = _("DUOVOGEL"), + .height = 14, + .weight = 392, + .descriptionPage1 = DexDescription_Dodu_1, + .descriptionPage2 = DexDescription_Dodu_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 257, + .trainerOffset = 65535, + }, + { + // Dodri + .categoryName = _("TRIVOGEL"), + .height = 18, + .weight = 852, + .descriptionPage1 = DexDescription_Dodri_1, + .descriptionPage2 = DexDescription_Dodri_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 268, + .trainerOffset = 0, + }, + { + // Jurob + .categoryName = _("SEEHUND"), + .height = 11, + .weight = 900, + .descriptionPage1 = DexDescription_Jurob_1, + .descriptionPage2 = DexDescription_Jurob_2, + .pokemonScale = 297, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Jugong + .categoryName = _("SEEHUND"), + .height = 17, + .weight = 1200, + .descriptionPage1 = DexDescription_Jugong_1, + .descriptionPage2 = DexDescription_Jugong_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 275, + .trainerOffset = 0, + }, + { + // Sleima + .categoryName = _("SCHLAMM"), + .height = 9, + .weight = 300, + .descriptionPage1 = DexDescription_Sleima_1, + .descriptionPage2 = DexDescription_Sleima_2, + .pokemonScale = 258, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sleimok + .categoryName = _("SCHLAMM"), + .height = 12, + .weight = 300, + .descriptionPage1 = DexDescription_Sleimok_1, + .descriptionPage2 = DexDescription_Sleimok_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Muschas + .categoryName = _("MUSCHEL"), + .height = 3, + .weight = 40, + .descriptionPage1 = DexDescription_Muschas_1, + .descriptionPage2 = DexDescription_Muschas_2, + .pokemonScale = 675, + .pokemonOffset = 24, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Austos + .categoryName = _("MUSCHEL"), + .height = 15, + .weight = 1325, + .descriptionPage1 = DexDescription_Austos_1, + .descriptionPage2 = DexDescription_Austos_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 269, + .trainerOffset = 1, + }, + { + // Nebulak + .categoryName = _("GAS"), + .height = 13, + .weight = 1, + .descriptionPage1 = DexDescription_Nebulak_1, + .descriptionPage2 = DexDescription_Nebulak_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Alpollo + .categoryName = _("GAS"), + .height = 16, + .weight = 1, + .descriptionPage1 = DexDescription_Alpollo_1, + .descriptionPage2 = DexDescription_Alpollo_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 293, + .trainerOffset = 2, + }, + { + // Gengar + .categoryName = _("SCHATTEN"), + .height = 15, + .weight = 405, + .descriptionPage1 = DexDescription_Gengar_1, + .descriptionPage2 = DexDescription_Gengar_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 302, + .trainerOffset = 2, + }, + { + // Onix + .categoryName = _("FELSNATTER"), + .height = 88, + .weight = 2100, + .descriptionPage1 = DexDescription_Onix_1, + .descriptionPage2 = DexDescription_Onix_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 515, + .trainerOffset = 14, + }, + { + // Traumato + .categoryName = _("HYPNOSE"), + .height = 10, + .weight = 324, + .descriptionPage1 = DexDescription_Traumato_1, + .descriptionPage2 = DexDescription_Traumato_2, + .pokemonScale = 274, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hypno + .categoryName = _("HYPNOSE"), + .height = 16, + .weight = 756, + .descriptionPage1 = DexDescription_Hypno_1, + .descriptionPage2 = DexDescription_Hypno_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 257, + .trainerOffset = 0, + }, + { + // Krabby + .categoryName = _("KRABBE"), + .height = 4, + .weight = 65, + .descriptionPage1 = DexDescription_Krabby_1, + .descriptionPage2 = DexDescription_Krabby_2, + .pokemonScale = 469, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kingler + .categoryName = _("KNEIFER"), + .height = 13, + .weight = 600, + .descriptionPage1 = DexDescription_Kingler_1, + .descriptionPage2 = DexDescription_Kingler_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Voltobal + .categoryName = _("BALL"), + .height = 5, + .weight = 104, + .descriptionPage1 = DexDescription_Voltobal_1, + .descriptionPage2 = DexDescription_Voltobal_2, + .pokemonScale = 364, + .pokemonOffset = 65528, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lektrobal + .categoryName = _("BALL"), + .height = 12, + .weight = 666, + .descriptionPage1 = DexDescription_Lektrobal_1, + .descriptionPage2 = DexDescription_Lektrobal_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Owei + .categoryName = _("EI"), + .height = 4, + .weight = 25, + .descriptionPage1 = DexDescription_Owei_1, + .descriptionPage2 = DexDescription_Owei_2, + .pokemonScale = 489, + .pokemonOffset = 65532, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kokowei + .categoryName = _("PALMFRUCHT"), + .height = 20, + .weight = 1200, + .descriptionPage1 = DexDescription_Kokowei_1, + .descriptionPage2 = DexDescription_Kokowei_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 309, + .trainerOffset = 5, + }, + { + // Tragosso + .categoryName = _("EINSAM"), + .height = 4, + .weight = 65, + .descriptionPage1 = DexDescription_Tragosso_1, + .descriptionPage2 = DexDescription_Tragosso_2, + .pokemonScale = 545, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Knogga + .categoryName = _("KNOCHENFAN"), + .height = 10, + .weight = 450, + .descriptionPage1 = DexDescription_Knogga_1, + .descriptionPage2 = DexDescription_Knogga_2, + .pokemonScale = 293, + .pokemonOffset = 12, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kicklee + .categoryName = _("KICKER"), + .height = 15, + .weight = 498, + .descriptionPage1 = DexDescription_Kicklee_1, + .descriptionPage2 = DexDescription_Kicklee_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 259, + .trainerOffset = 1, + }, + { + // Nockchan + .categoryName = _("PUNCHER"), + .height = 14, + .weight = 502, + .descriptionPage1 = DexDescription_Nockchan_1, + .descriptionPage2 = DexDescription_Nockchan_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 277, + .trainerOffset = 2, + }, + { + // Schlurp + .categoryName = _("SCHLECKER"), + .height = 12, + .weight = 655, + .descriptionPage1 = DexDescription_Schlurp_1, + .descriptionPage2 = DexDescription_Schlurp_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Smogon + .categoryName = _("GIFTWOLKE"), + .height = 6, + .weight = 10, + .descriptionPage1 = DexDescription_Smogon_1, + .descriptionPage2 = DexDescription_Smogon_2, + .pokemonScale = 369, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Smogmog + .categoryName = _("GIFTWOLKE"), + .height = 12, + .weight = 95, + .descriptionPage1 = DexDescription_Smogmog_1, + .descriptionPage2 = DexDescription_Smogmog_2, + .pokemonScale = 305, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rihorn + .categoryName = _("STACHLER"), + .height = 10, + .weight = 1150, + .descriptionPage1 = DexDescription_Rihorn_1, + .descriptionPage2 = DexDescription_Rihorn_2, + .pokemonScale = 267, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rizeros + .categoryName = _("BOHRER"), + .height = 19, + .weight = 1200, + .descriptionPage1 = DexDescription_Rizeros_1, + .descriptionPage2 = DexDescription_Rizeros_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 299, + .trainerOffset = 2, + }, + { + // Chaneira + .categoryName = _("EI"), + .height = 11, + .weight = 346, + .descriptionPage1 = DexDescription_Chaneira_1, + .descriptionPage2 = DexDescription_Chaneira_2, + .pokemonScale = 257, + .pokemonOffset = 7, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tangela + .categoryName = _("RANKE"), + .height = 10, + .weight = 350, + .descriptionPage1 = DexDescription_Tangela_1, + .descriptionPage2 = DexDescription_Tangela_2, + .pokemonScale = 304, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kangama + .categoryName = _("MUTTERTIER"), + .height = 22, + .weight = 800, + .descriptionPage1 = DexDescription_Kangama_1, + .descriptionPage2 = DexDescription_Kangama_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 387, + .trainerOffset = 8, + }, + { + // Seeper + .categoryName = _("DRACHE"), + .height = 4, + .weight = 80, + .descriptionPage1 = DexDescription_Seeper_1, + .descriptionPage2 = DexDescription_Seeper_2, + .pokemonScale = 399, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Seemon + .categoryName = _("DRACHE"), + .height = 12, + .weight = 250, + .descriptionPage1 = DexDescription_Seemon_1, + .descriptionPage2 = DexDescription_Seemon_2, + .pokemonScale = 299, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Goldini + .categoryName = _("GOLDFISCH"), + .height = 6, + .weight = 150, + .descriptionPage1 = DexDescription_Goldini_1, + .descriptionPage2 = DexDescription_Goldini_2, + .pokemonScale = 379, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Golking + .categoryName = _("GOLDFISCH"), + .height = 13, + .weight = 390, + .descriptionPage1 = DexDescription_Golking_1, + .descriptionPage2 = DexDescription_Golking_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sterndu + .categoryName = _("STERNFORM"), + .height = 8, + .weight = 345, + .descriptionPage1 = DexDescription_Sterndu_1, + .descriptionPage2 = DexDescription_Sterndu_2, + .pokemonScale = 326, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Starmie + .categoryName = _("MYSTERIÖS"), + .height = 11, + .weight = 800, + .descriptionPage1 = DexDescription_Starmie_1, + .descriptionPage2 = DexDescription_Starmie_2, + .pokemonScale = 301, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pantimos + .categoryName = _("SPERRE"), + .height = 13, + .weight = 545, + .descriptionPage1 = DexDescription_Pantimos_1, + .descriptionPage2 = DexDescription_Pantimos_2, + .pokemonScale = 258, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sichlor + .categoryName = _("MANTIS"), + .height = 15, + .weight = 560, + .descriptionPage1 = DexDescription_Sichlor_1, + .descriptionPage2 = DexDescription_Sichlor_2, + .pokemonScale = 256, + .pokemonOffset = 1, + .trainerScale = 293, + .trainerOffset = 2, + }, + { + // Rossana + .categoryName = _("HUMANOTYP"), + .height = 14, + .weight = 406, + .descriptionPage1 = DexDescription_Rossana_1, + .descriptionPage2 = DexDescription_Rossana_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 300, + .trainerOffset = 1, + }, + { + // Elektek + .categoryName = _("ELEKTRO"), + .height = 11, + .weight = 300, + .descriptionPage1 = DexDescription_Elektek_1, + .descriptionPage2 = DexDescription_Elektek_2, + .pokemonScale = 351, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Magmar + .categoryName = _("BRENNER"), + .height = 13, + .weight = 445, + .descriptionPage1 = DexDescription_Magmar_1, + .descriptionPage2 = DexDescription_Magmar_2, + .pokemonScale = 277, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pinsir + .categoryName = _("KNEIFKÄFER"), + .height = 15, + .weight = 550, + .descriptionPage1 = DexDescription_Pinsir_1, + .descriptionPage2 = DexDescription_Pinsir_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 257, + .trainerOffset = 0, + }, + { + // Tauros + .categoryName = _("WILDBULLE"), + .height = 14, + .weight = 884, + .descriptionPage1 = DexDescription_Tauros_1, + .descriptionPage2 = DexDescription_Tauros_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Karpador + .categoryName = _("FISCH"), + .height = 9, + .weight = 100, + .descriptionPage1 = DexDescription_Karpador_1, + .descriptionPage2 = DexDescription_Karpador_2, + .pokemonScale = 310, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Garados + .categoryName = _("GRAUSAM"), + .height = 65, + .weight = 2350, + .descriptionPage1 = DexDescription_Garados_1, + .descriptionPage2 = DexDescription_Garados_2, + .pokemonScale = 256, + .pokemonOffset = 6, + .trainerScale = 481, + .trainerOffset = 13, + }, + { + // Lapras + .categoryName = _("TRANSPORT"), + .height = 25, + .weight = 2200, + .descriptionPage1 = DexDescription_Lapras_1, + .descriptionPage2 = DexDescription_Lapras_2, + .pokemonScale = 257, + .pokemonOffset = 10, + .trainerScale = 423, + .trainerOffset = 8, + }, + { + // Ditto + .categoryName = _("TRANSFORM"), + .height = 3, + .weight = 40, + .descriptionPage1 = DexDescription_Ditto_1, + .descriptionPage2 = DexDescription_Ditto_2, + .pokemonScale = 633, + .pokemonOffset = 23, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Evoli + .categoryName = _("EVOLUTION"), + .height = 3, + .weight = 65, + .descriptionPage1 = DexDescription_Evoli_1, + .descriptionPage2 = DexDescription_Evoli_2, + .pokemonScale = 476, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Aquana + .categoryName = _("BLUBBLASE"), + .height = 10, + .weight = 290, + .descriptionPage1 = DexDescription_Aquana_1, + .descriptionPage2 = DexDescription_Aquana_2, + .pokemonScale = 316, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Blitza + .categoryName = _("BLITZ"), + .height = 8, + .weight = 245, + .descriptionPage1 = DexDescription_Blitza_1, + .descriptionPage2 = DexDescription_Blitza_2, + .pokemonScale = 283, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Flamara + .categoryName = _("FEUER"), + .height = 9, + .weight = 250, + .descriptionPage1 = DexDescription_Flamara_1, + .descriptionPage2 = DexDescription_Flamara_2, + .pokemonScale = 306, + .pokemonOffset = 12, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Porygon + .categoryName = _("VIRTUELL"), + .height = 8, + .weight = 365, + .descriptionPage1 = DexDescription_Porygon_1, + .descriptionPage2 = DexDescription_Porygon_2, + .pokemonScale = 328, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Amonitas + .categoryName = _("SPIRALE"), + .height = 4, + .weight = 75, + .descriptionPage1 = DexDescription_Amonitas_1, + .descriptionPage2 = DexDescription_Amonitas_2, + .pokemonScale = 521, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Amoroso + .categoryName = _("SPIRALE"), + .height = 10, + .weight = 350, + .descriptionPage1 = DexDescription_Amoroso_1, + .descriptionPage2 = DexDescription_Amoroso_2, + .pokemonScale = 307, + .pokemonOffset = 7, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kabuto + .categoryName = _("PANZERTIER"), + .height = 5, + .weight = 115, + .descriptionPage1 = DexDescription_Kabuto_1, + .descriptionPage2 = DexDescription_Kabuto_2, + .pokemonScale = 454, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kabutops + .categoryName = _("PANZERTIER"), + .height = 13, + .weight = 405, + .descriptionPage1 = DexDescription_Kabutops_1, + .descriptionPage2 = DexDescription_Kabutops_2, + .pokemonScale = 271, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Aerodactyl + .categoryName = _("FOSSIL"), + .height = 18, + .weight = 590, + .descriptionPage1 = DexDescription_Aerodactyl_1, + .descriptionPage2 = DexDescription_Aerodactyl_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 302, + .trainerOffset = 4, + }, + { + // Relaxo + .categoryName = _("TAGTRÄUMER"), + .height = 21, + .weight = 4600, + .descriptionPage1 = DexDescription_Relaxo_1, + .descriptionPage2 = DexDescription_Relaxo_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 423, + .trainerOffset = 11, + }, + { + // Arktos + .categoryName = _("EIS"), + .height = 17, + .weight = 554, + .descriptionPage1 = DexDescription_Arktos_1, + .descriptionPage2 = DexDescription_Arktos_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 309, + .trainerOffset = 2, + }, + { + // Zapdos + .categoryName = _("ELEKTRO"), + .height = 16, + .weight = 526, + .descriptionPage1 = DexDescription_Zapdos_1, + .descriptionPage2 = DexDescription_Zapdos_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 318, + .trainerOffset = 3, + }, + { + // Lavados + .categoryName = _("FLAMME"), + .height = 20, + .weight = 600, + .descriptionPage1 = DexDescription_Lavados_1, + .descriptionPage2 = DexDescription_Lavados_2, + .pokemonScale = 270, + .pokemonOffset = 0, + .trainerScale = 387, + .trainerOffset = 8, + }, + { + // Dratini + .categoryName = _("DRACHE"), + .height = 18, + .weight = 33, + .descriptionPage1 = DexDescription_Dratini_1, + .descriptionPage2 = DexDescription_Dratini_2, + .pokemonScale = 256, + .pokemonOffset = 8, + .trainerScale = 386, + .trainerOffset = 6, + }, + { + // Dragonir + .categoryName = _("DRACHE"), + .height = 40, + .weight = 165, + .descriptionPage1 = DexDescription_Dragonir_1, + .descriptionPage2 = DexDescription_Dragonir_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 411, + .trainerOffset = 5, + }, + { + // Dragoran + .categoryName = _("DRACHE"), + .height = 22, + .weight = 2100, + .descriptionPage1 = DexDescription_Dragoran_1, + .descriptionPage2 = DexDescription_Dragoran_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 309, + .trainerOffset = 4, + }, + { + // Mewtu + .categoryName = _("GENMUTANT"), + .height = 20, + .weight = 1220, + .descriptionPage1 = DexDescription_Mewtu_1, + .descriptionPage2 = DexDescription_Mewtu_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 309, + .trainerOffset = 4, + }, + { + // Mew + .categoryName = _("NEUE ART"), + .height = 4, + .weight = 40, + .descriptionPage1 = DexDescription_Mew_1, + .descriptionPage2 = DexDescription_Mew_2, + .pokemonScale = 457, + .pokemonOffset = 65534, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Endivie + .categoryName = _("LAUB"), + .height = 9, + .weight = 64, + .descriptionPage1 = DexDescription_Endivie_1, + .descriptionPage2 = DexDescription_Endivie_2, + .pokemonScale = 512, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lorblatt + .categoryName = _("LAUB"), + .height = 12, + .weight = 158, + .descriptionPage1 = DexDescription_Lorblatt_1, + .descriptionPage2 = DexDescription_Lorblatt_2, + .pokemonScale = 296, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Meganie + .categoryName = _("KRÄUTER"), + .height = 18, + .weight = 1005, + .descriptionPage1 = DexDescription_Meganie_1, + .descriptionPage2 = DexDescription_Meganie_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 277, + .trainerOffset = 1, + }, + { + // Feurigel + .categoryName = _("FEUERMAUS"), + .height = 5, + .weight = 79, + .descriptionPage1 = DexDescription_Feurigel_1, + .descriptionPage2 = DexDescription_Feurigel_2, + .pokemonScale = 539, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Igelavar + .categoryName = _("VULKAN"), + .height = 9, + .weight = 190, + .descriptionPage1 = DexDescription_Igelavar_1, + .descriptionPage2 = DexDescription_Igelavar_2, + .pokemonScale = 329, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tornupto + .categoryName = _("VULKAN"), + .height = 17, + .weight = 795, + .descriptionPage1 = DexDescription_Tornupto_1, + .descriptionPage2 = DexDescription_Tornupto_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 268, + .trainerOffset = 1, + }, + { + // Karnimani + .categoryName = _("GROSSMAUL"), + .height = 6, + .weight = 95, + .descriptionPage1 = DexDescription_Karnimani_1, + .descriptionPage2 = DexDescription_Karnimani_2, + .pokemonScale = 487, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tyracroc + .categoryName = _("GROSSMAUL"), + .height = 11, + .weight = 250, + .descriptionPage1 = DexDescription_Tyracroc_1, + .descriptionPage2 = DexDescription_Tyracroc_2, + .pokemonScale = 378, + .pokemonOffset = 13, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Impergator + .categoryName = _("GROSSMAUL"), + .height = 23, + .weight = 888, + .descriptionPage1 = DexDescription_Impergator_1, + .descriptionPage2 = DexDescription_Impergator_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 342, + .trainerOffset = 7, + }, + { + // Wiesor + .categoryName = _("SPÄHER"), + .height = 8, + .weight = 60, + .descriptionPage1 = DexDescription_Wiesor_1, + .descriptionPage2 = DexDescription_Wiesor_2, + .pokemonScale = 439, + .pokemonOffset = 12, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Wiesenior + .categoryName = _("LANGLEIB"), + .height = 18, + .weight = 325, + .descriptionPage1 = DexDescription_Wiesenior_1, + .descriptionPage2 = DexDescription_Wiesenior_2, + .pokemonScale = 346, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hoothoot + .categoryName = _("EULE"), + .height = 7, + .weight = 212, + .descriptionPage1 = DexDescription_Hoothoot_1, + .descriptionPage2 = DexDescription_Hoothoot_2, + .pokemonScale = 380, + .pokemonOffset = 65534, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Noctuh + .categoryName = _("EULE"), + .height = 16, + .weight = 408, + .descriptionPage1 = DexDescription_Noctuh_1, + .descriptionPage2 = DexDescription_Noctuh_2, + .pokemonScale = 278, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ledyba + .categoryName = _("FÜNF-PUNKT"), + .height = 10, + .weight = 108, + .descriptionPage1 = DexDescription_Ledyba_1, + .descriptionPage2 = DexDescription_Ledyba_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ledian + .categoryName = _("FÜNF-PUNKT"), + .height = 14, + .weight = 356, + .descriptionPage1 = DexDescription_Ledian_1, + .descriptionPage2 = DexDescription_Ledian_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Webarak + .categoryName = _("FADENWURF"), + .height = 5, + .weight = 85, + .descriptionPage1 = DexDescription_Webarak_1, + .descriptionPage2 = DexDescription_Webarak_2, + .pokemonScale = 414, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ariados + .categoryName = _("LANGBEIN"), + .height = 11, + .weight = 335, + .descriptionPage1 = DexDescription_Ariados_1, + .descriptionPage2 = DexDescription_Ariados_2, + .pokemonScale = 316, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Iksbat + .categoryName = _("FLEDERMAUS"), + .height = 18, + .weight = 750, + .descriptionPage1 = DexDescription_Iksbat_1, + .descriptionPage2 = DexDescription_Iksbat_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 281, + .trainerOffset = 1, + }, + { + // Lampi + .categoryName = _("ANGLER"), + .height = 5, + .weight = 120, + .descriptionPage1 = DexDescription_Lampi_1, + .descriptionPage2 = DexDescription_Lampi_2, + .pokemonScale = 424, + .pokemonOffset = 65534, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lanturn + .categoryName = _("LEUCHTE"), + .height = 12, + .weight = 225, + .descriptionPage1 = DexDescription_Lanturn_1, + .descriptionPage2 = DexDescription_Lanturn_2, + .pokemonScale = 269, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pichu + .categoryName = _("BABYMAUS"), + .height = 3, + .weight = 20, + .descriptionPage1 = DexDescription_Pichu_1, + .descriptionPage2 = DexDescription_Pichu_2, + .pokemonScale = 508, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pii + .categoryName = _("STERNFORM"), + .height = 3, + .weight = 30, + .descriptionPage1 = DexDescription_Pii_1, + .descriptionPage2 = DexDescription_Pii_2, + .pokemonScale = 462, + .pokemonOffset = 23, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Fluffeluff + .categoryName = _("BALLON"), + .height = 3, + .weight = 10, + .descriptionPage1 = DexDescription_Fluffeluff_1, + .descriptionPage2 = DexDescription_Fluffeluff_2, + .pokemonScale = 457, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Togepi + .categoryName = _("ZACKENBALL"), + .height = 3, + .weight = 15, + .descriptionPage1 = DexDescription_Togepi_1, + .descriptionPage2 = DexDescription_Togepi_2, + .pokemonScale = 507, + .pokemonOffset = 23, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Togetic + .categoryName = _("FREUDE"), + .height = 6, + .weight = 32, + .descriptionPage1 = DexDescription_Togetic_1, + .descriptionPage2 = DexDescription_Togetic_2, + .pokemonScale = 424, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Natu + .categoryName = _("KLEINVOGEL"), + .height = 2, + .weight = 20, + .descriptionPage1 = DexDescription_Natu_1, + .descriptionPage2 = DexDescription_Natu_2, + .pokemonScale = 610, + .pokemonOffset = 25, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Xatu + .categoryName = _("MYSTIK"), + .height = 15, + .weight = 150, + .descriptionPage1 = DexDescription_Xatu_1, + .descriptionPage2 = DexDescription_Xatu_2, + .pokemonScale = 256, + .pokemonOffset = 6, + .trainerScale = 318, + .trainerOffset = 4, + }, + { + // Voltilamm + .categoryName = _("WOLLE"), + .height = 6, + .weight = 78, + .descriptionPage1 = DexDescription_Voltilamm_1, + .descriptionPage2 = DexDescription_Voltilamm_2, + .pokemonScale = 379, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Waaty + .categoryName = _("WOLLE"), + .height = 8, + .weight = 133, + .descriptionPage1 = DexDescription_Waaty_1, + .descriptionPage2 = DexDescription_Waaty_2, + .pokemonScale = 372, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ampharos + .categoryName = _("LEUCHTE"), + .height = 14, + .weight = 615, + .descriptionPage1 = DexDescription_Ampharos_1, + .descriptionPage2 = DexDescription_Ampharos_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Blubella + .categoryName = _("BLUME"), + .height = 4, + .weight = 58, + .descriptionPage1 = DexDescription_Blubella_1, + .descriptionPage2 = DexDescription_Blubella_2, + .pokemonScale = 472, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Marill + .categoryName = _("AQUAMAUS"), + .height = 4, + .weight = 85, + .descriptionPage1 = DexDescription_Marill_1, + .descriptionPage2 = DexDescription_Marill_2, + .pokemonScale = 476, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Azumarill + .categoryName = _("AQUAHASE"), + .height = 8, + .weight = 285, + .descriptionPage1 = DexDescription_Azumarill_1, + .descriptionPage2 = DexDescription_Azumarill_2, + .pokemonScale = 448, + .pokemonOffset = 16, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Mogelbaum + .categoryName = _("IMITATION"), + .height = 12, + .weight = 380, + .descriptionPage1 = DexDescription_Mogelbaum_1, + .descriptionPage2 = DexDescription_Mogelbaum_2, + .pokemonScale = 305, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Quaxo + .categoryName = _("FROSCH"), + .height = 11, + .weight = 339, + .descriptionPage1 = DexDescription_Quaxo_1, + .descriptionPage2 = DexDescription_Quaxo_2, + .pokemonScale = 289, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hoppspross + .categoryName = _("LÖWENZAHN"), + .height = 4, + .weight = 5, + .descriptionPage1 = DexDescription_Hoppspross_1, + .descriptionPage2 = DexDescription_Hoppspross_2, + .pokemonScale = 562, + .pokemonOffset = 65529, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hubelupf + .categoryName = _("LÖWENZAHN"), + .height = 6, + .weight = 10, + .descriptionPage1 = DexDescription_Hubelupf_1, + .descriptionPage2 = DexDescription_Hubelupf_2, + .pokemonScale = 387, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Papungha + .categoryName = _("LÖWENZAHN"), + .height = 8, + .weight = 30, + .descriptionPage1 = DexDescription_Papungha_1, + .descriptionPage2 = DexDescription_Papungha_2, + .pokemonScale = 418, + .pokemonOffset = 65532, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Griffel + .categoryName = _("LANGSCHWEIF"), + .height = 8, + .weight = 115, + .descriptionPage1 = DexDescription_Griffel_1, + .descriptionPage2 = DexDescription_Griffel_2, + .pokemonScale = 363, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sonnkern + .categoryName = _("SAMEN"), + .height = 3, + .weight = 18, + .descriptionPage1 = DexDescription_Sonnkern_1, + .descriptionPage2 = DexDescription_Sonnkern_2, + .pokemonScale = 541, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sonnflora + .categoryName = _("SONNE"), + .height = 8, + .weight = 85, + .descriptionPage1 = DexDescription_Sonnflora_1, + .descriptionPage2 = DexDescription_Sonnflora_2, + .pokemonScale = 444, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Yanma + .categoryName = _("LIBELLE"), + .height = 12, + .weight = 380, + .descriptionPage1 = DexDescription_Yanma_1, + .descriptionPage2 = DexDescription_Yanma_2, + .pokemonScale = 274, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Felino + .categoryName = _("FISCH"), + .height = 4, + .weight = 85, + .descriptionPage1 = DexDescription_Felino_1, + .descriptionPage2 = DexDescription_Felino_2, + .pokemonScale = 479, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Morlord + .categoryName = _("FISCH"), + .height = 14, + .weight = 750, + .descriptionPage1 = DexDescription_Morlord_1, + .descriptionPage2 = DexDescription_Morlord_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Psiana + .categoryName = _("SONNE"), + .height = 9, + .weight = 265, + .descriptionPage1 = DexDescription_Psiana_1, + .descriptionPage2 = DexDescription_Psiana_2, + .pokemonScale = 363, + .pokemonOffset = 14, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nachtara + .categoryName = _("MONDSCHEIN"), + .height = 10, + .weight = 270, + .descriptionPage1 = DexDescription_Nachtara_1, + .descriptionPage2 = DexDescription_Nachtara_2, + .pokemonScale = 317, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kramurx + .categoryName = _("FINSTERNIS"), + .height = 5, + .weight = 21, + .descriptionPage1 = DexDescription_Kramurx_1, + .descriptionPage2 = DexDescription_Kramurx_2, + .pokemonScale = 401, + .pokemonOffset = 65528, + .trainerScale = 256, + .trainerOffset = 1, + }, + { + // Laschoking + .categoryName = _("MONARCH"), + .height = 20, + .weight = 795, + .descriptionPage1 = DexDescription_Laschoking_1, + .descriptionPage2 = DexDescription_Laschoking_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 309, + .trainerOffset = 5, + }, + { + // Traunfugil + .categoryName = _("KREISCHER"), + .height = 7, + .weight = 10, + .descriptionPage1 = DexDescription_Traunfugil_1, + .descriptionPage2 = DexDescription_Traunfugil_2, + .pokemonScale = 407, + .pokemonOffset = 65528, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Icognito + .categoryName = _("SYMBOL"), + .height = 5, + .weight = 50, + .descriptionPage1 = DexDescription_Icognito_1, + .descriptionPage2 = DexDescription_Icognito_2, + .pokemonScale = 411, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Woingenau + .categoryName = _("GEDULD"), + .height = 13, + .weight = 285, + .descriptionPage1 = DexDescription_Woingenau_1, + .descriptionPage2 = DexDescription_Woingenau_2, + .pokemonScale = 274, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Girafarig + .categoryName = _("LANGHALS"), + .height = 15, + .weight = 415, + .descriptionPage1 = DexDescription_Girafarig_1, + .descriptionPage2 = DexDescription_Girafarig_2, + .pokemonScale = 281, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tannza + .categoryName = _("BEUTELWURM"), + .height = 6, + .weight = 72, + .descriptionPage1 = DexDescription_Tannza_1, + .descriptionPage2 = DexDescription_Tannza_2, + .pokemonScale = 445, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Forstellka + .categoryName = _("BEUTELWURM"), + .height = 12, + .weight = 1258, + .descriptionPage1 = DexDescription_Forstellka_1, + .descriptionPage2 = DexDescription_Forstellka_2, + .pokemonScale = 293, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Dummisel + .categoryName = _("SCHLANGE"), + .height = 15, + .weight = 140, + .descriptionPage1 = DexDescription_Dummisel_1, + .descriptionPage2 = DexDescription_Dummisel_2, + .pokemonScale = 316, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Skorgla + .categoryName = _("FLUGSKORPI"), + .height = 11, + .weight = 648, + .descriptionPage1 = DexDescription_Skorgla_1, + .descriptionPage2 = DexDescription_Skorgla_2, + .pokemonScale = 350, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Stahlos + .categoryName = _("STAHLBOA"), + .height = 92, + .weight = 4000, + .descriptionPage1 = DexDescription_Stahlos_1, + .descriptionPage2 = DexDescription_Stahlos_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 516, + .trainerOffset = 13, + }, + { + // Snubbull + .categoryName = _("FEE"), + .height = 6, + .weight = 78, + .descriptionPage1 = DexDescription_Snubbull_1, + .descriptionPage2 = DexDescription_Snubbull_2, + .pokemonScale = 465, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Granbull + .categoryName = _("FEE"), + .height = 14, + .weight = 487, + .descriptionPage1 = DexDescription_Granbull_1, + .descriptionPage2 = DexDescription_Granbull_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Baldorfish + .categoryName = _("BALLON"), + .height = 5, + .weight = 39, + .descriptionPage1 = DexDescription_Baldorfish_1, + .descriptionPage2 = DexDescription_Baldorfish_2, + .pokemonScale = 430, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Scherox + .categoryName = _("KNEIFER"), + .height = 18, + .weight = 1180, + .descriptionPage1 = DexDescription_Scherox_1, + .descriptionPage2 = DexDescription_Scherox_2, + .pokemonScale = 278, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pottrott + .categoryName = _("SCHIMMEL"), + .height = 6, + .weight = 205, + .descriptionPage1 = DexDescription_Pottrott_1, + .descriptionPage2 = DexDescription_Pottrott_2, + .pokemonScale = 485, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Skaraborn + .categoryName = _("EINZELHORN"), + .height = 15, + .weight = 540, + .descriptionPage1 = DexDescription_Skaraborn_1, + .descriptionPage2 = DexDescription_Skaraborn_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sniebel + .categoryName = _("STICHKLAUE"), + .height = 9, + .weight = 280, + .descriptionPage1 = DexDescription_Sniebel_1, + .descriptionPage2 = DexDescription_Sniebel_2, + .pokemonScale = 413, + .pokemonOffset = 65533, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Teddiursa + .categoryName = _("KLEINBÄR"), + .height = 6, + .weight = 88, + .descriptionPage1 = DexDescription_Teddiursa_1, + .descriptionPage2 = DexDescription_Teddiursa_2, + .pokemonScale = 455, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ursaring + .categoryName = _("SCHLÄFER"), + .height = 18, + .weight = 1258, + .descriptionPage1 = DexDescription_Ursaring_1, + .descriptionPage2 = DexDescription_Ursaring_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schneckmag + .categoryName = _("LAVA"), + .height = 7, + .weight = 350, + .descriptionPage1 = DexDescription_Schneckmag_1, + .descriptionPage2 = DexDescription_Schneckmag_2, + .pokemonScale = 329, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Magcargo + .categoryName = _("LAVA"), + .height = 8, + .weight = 550, + .descriptionPage1 = DexDescription_Magcargo_1, + .descriptionPage2 = DexDescription_Magcargo_2, + .pokemonScale = 332, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Quiekel + .categoryName = _("FERKEL"), + .height = 4, + .weight = 65, + .descriptionPage1 = DexDescription_Quiekel_1, + .descriptionPage2 = DexDescription_Quiekel_2, + .pokemonScale = 324, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Keifel + .categoryName = _("SCHWEIN"), + .height = 11, + .weight = 558, + .descriptionPage1 = DexDescription_Keifel_1, + .descriptionPage2 = DexDescription_Keifel_2, + .pokemonScale = 306, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Corasonn + .categoryName = _("KORALLE"), + .height = 6, + .weight = 50, + .descriptionPage1 = DexDescription_Corasonn_1, + .descriptionPage2 = DexDescription_Corasonn_2, + .pokemonScale = 410, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Remoraid + .categoryName = _("HOCHDRUCK"), + .height = 6, + .weight = 120, + .descriptionPage1 = DexDescription_Remoraid_1, + .descriptionPage2 = DexDescription_Remoraid_2, + .pokemonScale = 316, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Octillery + .categoryName = _("HOCHDRUCK"), + .height = 9, + .weight = 285, + .descriptionPage1 = DexDescription_Octillery_1, + .descriptionPage2 = DexDescription_Octillery_2, + .pokemonScale = 296, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Botogel + .categoryName = _("LIEFERANT"), + .height = 9, + .weight = 160, + .descriptionPage1 = DexDescription_Botogel_1, + .descriptionPage2 = DexDescription_Botogel_2, + .pokemonScale = 293, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Mantax + .categoryName = _("FLUGROCHEN"), + .height = 21, + .weight = 2200, + .descriptionPage1 = DexDescription_Mantax_1, + .descriptionPage2 = DexDescription_Mantax_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 342, + .trainerOffset = 7, + }, + { + // Panzaeron + .categoryName = _("FLUGSTAHL"), + .height = 17, + .weight = 505, + .descriptionPage1 = DexDescription_Panzaeron_1, + .descriptionPage2 = DexDescription_Panzaeron_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 271, + .trainerOffset = 1, + }, + { + // Hunduster + .categoryName = _("HADES"), + .height = 6, + .weight = 108, + .descriptionPage1 = DexDescription_Hunduster_1, + .descriptionPage2 = DexDescription_Hunduster_2, + .pokemonScale = 393, + .pokemonOffset = 16, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hundemon + .categoryName = _("HADES"), + .height = 14, + .weight = 350, + .descriptionPage1 = DexDescription_Hundemon_1, + .descriptionPage2 = DexDescription_Hundemon_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Seedraking + .categoryName = _("DRACHE"), + .height = 18, + .weight = 1520, + .descriptionPage1 = DexDescription_Seedraking_1, + .descriptionPage2 = DexDescription_Seedraking_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 287, + .trainerOffset = 0, + }, + { + // Phanpy + .categoryName = _("LANGRÜSSEL"), + .height = 5, + .weight = 335, + .descriptionPage1 = DexDescription_Phanpy_1, + .descriptionPage2 = DexDescription_Phanpy_2, + .pokemonScale = 465, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Donphan + .categoryName = _("PANZERTIER"), + .height = 11, + .weight = 1200, + .descriptionPage1 = DexDescription_Donphan_1, + .descriptionPage2 = DexDescription_Donphan_2, + .pokemonScale = 313, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Porygon2 + .categoryName = _("VIRTUELL"), + .height = 6, + .weight = 325, + .descriptionPage1 = DexDescription_Porygon2_1, + .descriptionPage2 = DexDescription_Porygon2_2, + .pokemonScale = 320, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Damhirplex + .categoryName = _("VIELENDER"), + .height = 14, + .weight = 712, + .descriptionPage1 = DexDescription_Damhirplex_1, + .descriptionPage2 = DexDescription_Damhirplex_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Farbeagle + .categoryName = _("MALER"), + .height = 12, + .weight = 580, + .descriptionPage1 = DexDescription_Farbeagle_1, + .descriptionPage2 = DexDescription_Farbeagle_2, + .pokemonScale = 287, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Rabauz + .categoryName = _("RACKER"), + .height = 7, + .weight = 210, + .descriptionPage1 = DexDescription_Rabauz_1, + .descriptionPage2 = DexDescription_Rabauz_2, + .pokemonScale = 292, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kapoera + .categoryName = _("KOPFSTAND"), + .height = 14, + .weight = 480, + .descriptionPage1 = DexDescription_Kapoera_1, + .descriptionPage2 = DexDescription_Kapoera_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 257, + .trainerOffset = 0, + }, + { + // Kussilla + .categoryName = _("KUSS"), + .height = 4, + .weight = 60, + .descriptionPage1 = DexDescription_Kussilla_1, + .descriptionPage2 = DexDescription_Kussilla_2, + .pokemonScale = 440, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Elekid + .categoryName = _("ELEKTRO"), + .height = 6, + .weight = 235, + .descriptionPage1 = DexDescription_Elekid_1, + .descriptionPage2 = DexDescription_Elekid_2, + .pokemonScale = 363, + .pokemonOffset = 14, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Magby + .categoryName = _("GLUTHERD"), + .height = 7, + .weight = 214, + .descriptionPage1 = DexDescription_Magby_1, + .descriptionPage2 = DexDescription_Magby_2, + .pokemonScale = 284, + .pokemonOffset = 13, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Miltank + .categoryName = _("MILCHKUH"), + .height = 12, + .weight = 755, + .descriptionPage1 = DexDescription_Miltank_1, + .descriptionPage2 = DexDescription_Miltank_2, + .pokemonScale = 280, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Heiteira + .categoryName = _("FREUDE"), + .height = 15, + .weight = 468, + .descriptionPage1 = DexDescription_Heiteira_1, + .descriptionPage2 = DexDescription_Heiteira_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 310, + .trainerOffset = 3, + }, + { + // Raikou + .categoryName = _("DONNER"), + .height = 19, + .weight = 1780, + .descriptionPage1 = DexDescription_Raikou_1, + .descriptionPage2 = DexDescription_Raikou_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 345, + .trainerOffset = 7, + }, + { + // Entei + .categoryName = _("VULKAN"), + .height = 21, + .weight = 1980, + .descriptionPage1 = DexDescription_Entei_1, + .descriptionPage2 = DexDescription_Entei_2, + .pokemonScale = 259, + .pokemonOffset = 0, + .trainerScale = 345, + .trainerOffset = 7, + }, + { + // Suicune + .categoryName = _("POLARLICHT"), + .height = 20, + .weight = 1870, + .descriptionPage1 = DexDescription_Suicune_1, + .descriptionPage2 = DexDescription_Suicune_2, + .pokemonScale = 269, + .pokemonOffset = 0, + .trainerScale = 345, + .trainerOffset = 7, + }, + { + // Larvitar + .categoryName = _("FELSHAUT"), + .height = 6, + .weight = 720, + .descriptionPage1 = DexDescription_Larvitar_1, + .descriptionPage2 = DexDescription_Larvitar_2, + .pokemonScale = 472, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pupitar + .categoryName = _("HARTSCHALE"), + .height = 12, + .weight = 1520, + .descriptionPage1 = DexDescription_Pupitar_1, + .descriptionPage2 = DexDescription_Pupitar_2, + .pokemonScale = 292, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Despotar + .categoryName = _("PANZERTIER"), + .height = 20, + .weight = 2020, + .descriptionPage1 = DexDescription_Despotar_1, + .descriptionPage2 = DexDescription_Despotar_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 345, + .trainerOffset = 7, + }, + { + // Lugia + .categoryName = _("TAUCHER"), + .height = 52, + .weight = 2160, + .descriptionPage1 = DexDescription_Lugia_1, + .descriptionPage2 = DexDescription_Lugia_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 721, + .trainerOffset = 19, + }, + { + // Ho-oh + .categoryName = _("REGENBOGEN"), + .height = 38, + .weight = 1990, + .descriptionPage1 = DexDescription_HoOh_1, + .descriptionPage2 = DexDescription_HoOh_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 610, + .trainerOffset = 17, + }, + { + // Celebi + .categoryName = _("ZEITREISE"), + .height = 6, + .weight = 50, + .descriptionPage1 = DexDescription_Celebi_1, + .descriptionPage2 = DexDescription_Celebi_2, + .pokemonScale = 393, + .pokemonOffset = 65526, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Geckarbor + .categoryName = _("WALDGECKO"), + .height = 5, + .weight = 50, + .descriptionPage1 = DexDescription_Geckarbor_1, + .descriptionPage2 = DexDescription_Geckarbor_2, + .pokemonScale = 541, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Reptain + .categoryName = _("WALDGECKO"), + .height = 9, + .weight = 216, + .descriptionPage1 = DexDescription_Reptain_1, + .descriptionPage2 = DexDescription_Reptain_2, + .pokemonScale = 360, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Gewaldro + .categoryName = _("DSCHUNGEL"), + .height = 17, + .weight = 522, + .descriptionPage1 = DexDescription_Gewaldro_1, + .descriptionPage2 = DexDescription_Gewaldro_2, + .pokemonScale = 256, + .pokemonOffset = 65535, + .trainerScale = 275, + .trainerOffset = 2, + }, + { + // Flemmli + .categoryName = _("KÜKEN"), + .height = 4, + .weight = 25, + .descriptionPage1 = DexDescription_Flemmli_1, + .descriptionPage2 = DexDescription_Flemmli_2, + .pokemonScale = 566, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Jungglut + .categoryName = _("KLEINHAHN"), + .height = 9, + .weight = 195, + .descriptionPage1 = DexDescription_Jungglut_1, + .descriptionPage2 = DexDescription_Jungglut_2, + .pokemonScale = 343, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lohgock + .categoryName = _("GROSSBRAND"), + .height = 19, + .weight = 520, + .descriptionPage1 = DexDescription_Lohgock_1, + .descriptionPage2 = DexDescription_Lohgock_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 301, + .trainerOffset = 4, + }, + { + // Hydropi + .categoryName = _("LEHMHÜPFER"), + .height = 4, + .weight = 76, + .descriptionPage1 = DexDescription_Hydropi_1, + .descriptionPage2 = DexDescription_Hydropi_2, + .pokemonScale = 535, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Moorabbel + .categoryName = _("LEHMHÜPFER"), + .height = 7, + .weight = 280, + .descriptionPage1 = DexDescription_Moorabbel_1, + .descriptionPage2 = DexDescription_Moorabbel_2, + .pokemonScale = 340, + .pokemonOffset = 7, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sumpex + .categoryName = _("LEHMHÜPFER"), + .height = 15, + .weight = 819, + .descriptionPage1 = DexDescription_Sumpex_1, + .descriptionPage2 = DexDescription_Sumpex_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Fiffyen + .categoryName = _("BISS"), + .height = 5, + .weight = 136, + .descriptionPage1 = DexDescription_Fiffyen_1, + .descriptionPage2 = DexDescription_Fiffyen_2, + .pokemonScale = 481, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Magnayen + .categoryName = _("BISS"), + .height = 10, + .weight = 370, + .descriptionPage1 = DexDescription_Magnayen_1, + .descriptionPage2 = DexDescription_Magnayen_2, + .pokemonScale = 362, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Zigzachs + .categoryName = _("KLEINDACHS"), + .height = 4, + .weight = 175, + .descriptionPage1 = DexDescription_Zigzachs_1, + .descriptionPage2 = DexDescription_Zigzachs_2, + .pokemonScale = 560, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Geradaks + .categoryName = _("SPRINTER"), + .height = 5, + .weight = 325, + .descriptionPage1 = DexDescription_Geradaks_1, + .descriptionPage2 = DexDescription_Geradaks_2, + .pokemonScale = 321, + .pokemonOffset = 7, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Waumpel + .categoryName = _("WURM"), + .height = 3, + .weight = 36, + .descriptionPage1 = DexDescription_Waumpel_1, + .descriptionPage2 = DexDescription_Waumpel_2, + .pokemonScale = 711, + .pokemonOffset = 24, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schaloko + .categoryName = _("KOKON"), + .height = 6, + .weight = 100, + .descriptionPage1 = DexDescription_Schaloko_1, + .descriptionPage2 = DexDescription_Schaloko_2, + .pokemonScale = 431, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Papinella + .categoryName = _("FALTER"), + .height = 10, + .weight = 284, + .descriptionPage1 = DexDescription_Papinella_1, + .descriptionPage2 = DexDescription_Papinella_2, + .pokemonScale = 298, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Panekon + .categoryName = _("KOKON"), + .height = 7, + .weight = 115, + .descriptionPage1 = DexDescription_Panekon_1, + .descriptionPage2 = DexDescription_Panekon_2, + .pokemonScale = 391, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pudox + .categoryName = _("GIFTMOTTE"), + .height = 12, + .weight = 316, + .descriptionPage1 = DexDescription_Pudox_1, + .descriptionPage2 = DexDescription_Pudox_2, + .pokemonScale = 269, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Loturzel + .categoryName = _("WASSERLINSE"), + .height = 5, + .weight = 26, + .descriptionPage1 = DexDescription_Loturzel_1, + .descriptionPage2 = DexDescription_Loturzel_2, + .pokemonScale = 406, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lombrero + .categoryName = _("FROHMUT"), + .height = 12, + .weight = 325, + .descriptionPage1 = DexDescription_Lombrero_1, + .descriptionPage2 = DexDescription_Lombrero_2, + .pokemonScale = 277, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kappalores + .categoryName = _("SORGLOS"), + .height = 15, + .weight = 550, + .descriptionPage1 = DexDescription_Kappalores_1, + .descriptionPage2 = DexDescription_Kappalores_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 268, + .trainerOffset = 65535, + }, + { + // Samurzel + .categoryName = _("EICHELNUSS"), + .height = 5, + .weight = 40, + .descriptionPage1 = DexDescription_Samurzel_1, + .descriptionPage2 = DexDescription_Samurzel_2, + .pokemonScale = 472, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Blanas + .categoryName = _("HINTERLIST"), + .height = 10, + .weight = 280, + .descriptionPage1 = DexDescription_Blanas_1, + .descriptionPage2 = DexDescription_Blanas_2, + .pokemonScale = 299, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tengulist + .categoryName = _("VERSCHLAGEN"), + .height = 13, + .weight = 596, + .descriptionPage1 = DexDescription_Tengulist_1, + .descriptionPage2 = DexDescription_Tengulist_2, + .pokemonScale = 290, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schwalbini + .categoryName = _("SCHWÄLBLEIN"), + .height = 3, + .weight = 23, + .descriptionPage1 = DexDescription_Schwalbini_1, + .descriptionPage2 = DexDescription_Schwalbini_2, + .pokemonScale = 465, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schwalboss + .categoryName = _("SCHWALBE"), + .height = 7, + .weight = 198, + .descriptionPage1 = DexDescription_Schwalboss_1, + .descriptionPage2 = DexDescription_Schwalboss_2, + .pokemonScale = 428, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Wingull + .categoryName = _("SEEMÖWE"), + .height = 6, + .weight = 95, + .descriptionPage1 = DexDescription_Wingull_1, + .descriptionPage2 = DexDescription_Wingull_2, + .pokemonScale = 295, + .pokemonOffset = 65534, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pelipper + .categoryName = _("WASSERVOGEL"), + .height = 12, + .weight = 280, + .descriptionPage1 = DexDescription_Pelipper_1, + .descriptionPage2 = DexDescription_Pelipper_2, + .pokemonScale = 288, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Trasla + .categoryName = _("GEFÜHL"), + .height = 4, + .weight = 66, + .descriptionPage1 = DexDescription_Trasla_1, + .descriptionPage2 = DexDescription_Trasla_2, + .pokemonScale = 457, + .pokemonOffset = 65533, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kirlia + .categoryName = _("EMOTION"), + .height = 8, + .weight = 202, + .descriptionPage1 = DexDescription_Kirlia_1, + .descriptionPage2 = DexDescription_Kirlia_2, + .pokemonScale = 354, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Guardevoir + .categoryName = _("UMARMUNG"), + .height = 16, + .weight = 484, + .descriptionPage1 = DexDescription_Guardevoir_1, + .descriptionPage2 = DexDescription_Guardevoir_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Gehweiher + .categoryName = _("WASSERGEHER"), + .height = 5, + .weight = 17, + .descriptionPage1 = DexDescription_Gehweiher_1, + .descriptionPage2 = DexDescription_Gehweiher_2, + .pokemonScale = 375, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Maskeregen + .categoryName = _("AUGE"), + .height = 8, + .weight = 36, + .descriptionPage1 = DexDescription_Maskeregen_1, + .descriptionPage2 = DexDescription_Maskeregen_2, + .pokemonScale = 378, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Knilz + .categoryName = _("PILZ"), + .height = 4, + .weight = 45, + .descriptionPage1 = DexDescription_Knilz_1, + .descriptionPage2 = DexDescription_Knilz_2, + .pokemonScale = 513, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kapilz + .categoryName = _("PILZ"), + .height = 12, + .weight = 392, + .descriptionPage1 = DexDescription_Kapilz_1, + .descriptionPage2 = DexDescription_Kapilz_2, + .pokemonScale = 324, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Bummelz + .categoryName = _("FAULPELZ"), + .height = 8, + .weight = 240, + .descriptionPage1 = DexDescription_Bummelz_1, + .descriptionPage2 = DexDescription_Bummelz_2, + .pokemonScale = 291, + .pokemonOffset = 16, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Muntier + .categoryName = _("WILDAFFE"), + .height = 14, + .weight = 465, + .descriptionPage1 = DexDescription_Muntier_1, + .descriptionPage2 = DexDescription_Muntier_2, + .pokemonScale = 301, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Letarking + .categoryName = _("MÜSSIG"), + .height = 20, + .weight = 1305, + .descriptionPage1 = DexDescription_Letarking_1, + .descriptionPage2 = DexDescription_Letarking_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 300, + .trainerOffset = 1, + }, + { + // Nincada + .categoryName = _("VORBEREITER"), + .height = 5, + .weight = 55, + .descriptionPage1 = DexDescription_Nincada_1, + .descriptionPage2 = DexDescription_Nincada_2, + .pokemonScale = 405, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ninjask + .categoryName = _("NINJA"), + .height = 8, + .weight = 120, + .descriptionPage1 = DexDescription_Ninjask_1, + .descriptionPage2 = DexDescription_Ninjask_2, + .pokemonScale = 383, + .pokemonOffset = 65527, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Ninjatom + .categoryName = _("HÄUTUNG"), + .height = 8, + .weight = 12, + .descriptionPage1 = DexDescription_Ninjatom_1, + .descriptionPage2 = DexDescription_Ninjatom_2, + .pokemonScale = 372, + .pokemonOffset = 65528, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Flurmel + .categoryName = _("FLÜSTER"), + .height = 6, + .weight = 163, + .descriptionPage1 = DexDescription_Flurmel_1, + .descriptionPage2 = DexDescription_Flurmel_2, + .pokemonScale = 373, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Krakeelo + .categoryName = _("LAUTHALS"), + .height = 10, + .weight = 405, + .descriptionPage1 = DexDescription_Krakeelo_1, + .descriptionPage2 = DexDescription_Krakeelo_2, + .pokemonScale = 356, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Krawumms + .categoryName = _("KRACH"), + .height = 15, + .weight = 840, + .descriptionPage1 = DexDescription_Krawumms_1, + .descriptionPage2 = DexDescription_Krawumms_2, + .pokemonScale = 284, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Makuhita + .categoryName = _("COURAGE"), + .height = 10, + .weight = 864, + .descriptionPage1 = DexDescription_Makuhita_1, + .descriptionPage2 = DexDescription_Makuhita_2, + .pokemonScale = 256, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Hariyama + .categoryName = _("ARMWURF"), + .height = 23, + .weight = 2538, + .descriptionPage1 = DexDescription_Hariyama_1, + .descriptionPage2 = DexDescription_Hariyama_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 343, + .trainerOffset = 7, + }, + { + // Azurill + .categoryName = _("GEPUNKTET"), + .height = 2, + .weight = 20, + .descriptionPage1 = DexDescription_Azurill_1, + .descriptionPage2 = DexDescription_Azurill_2, + .pokemonScale = 603, + .pokemonOffset = 23, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Nasgnet + .categoryName = _("KOMPASS"), + .height = 10, + .weight = 970, + .descriptionPage1 = DexDescription_Nasgnet_1, + .descriptionPage2 = DexDescription_Nasgnet_2, + .pokemonScale = 256, + .pokemonOffset = 9, + .trainerScale = 289, + .trainerOffset = 3, + }, + { + // Eneco + .categoryName = _("KÄTZCHEN"), + .height = 6, + .weight = 110, + .descriptionPage1 = DexDescription_Eneco_1, + .descriptionPage2 = DexDescription_Eneco_2, + .pokemonScale = 492, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Enekoro + .categoryName = _("EINGEBILDET"), + .height = 11, + .weight = 326, + .descriptionPage1 = DexDescription_Enekoro_1, + .descriptionPage2 = DexDescription_Enekoro_2, + .pokemonScale = 322, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Zobiris + .categoryName = _("FINSTERNIS"), + .height = 5, + .weight = 110, + .descriptionPage1 = DexDescription_Zobiris_1, + .descriptionPage2 = DexDescription_Zobiris_2, + .pokemonScale = 451, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Flunkifer + .categoryName = _("SCHWINDLER"), + .height = 6, + .weight = 115, + .descriptionPage1 = DexDescription_Flunkifer_1, + .descriptionPage2 = DexDescription_Flunkifer_2, + .pokemonScale = 466, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Stollunior + .categoryName = _("EISENPANZER"), + .height = 4, + .weight = 600, + .descriptionPage1 = DexDescription_Stollunior_1, + .descriptionPage2 = DexDescription_Stollunior_2, + .pokemonScale = 419, + .pokemonOffset = 23, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Stollrak + .categoryName = _("EISENPANZER"), + .height = 9, + .weight = 1200, + .descriptionPage1 = DexDescription_Stollrak_1, + .descriptionPage2 = DexDescription_Stollrak_2, + .pokemonScale = 275, + .pokemonOffset = 12, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Stolloss + .categoryName = _("EISENPANZER"), + .height = 21, + .weight = 3600, + .descriptionPage1 = DexDescription_Stolloss_1, + .descriptionPage2 = DexDescription_Stolloss_2, + .pokemonScale = 256, + .pokemonOffset = 65535, + .trainerScale = 350, + .trainerOffset = 6, + }, + { + // Meditie + .categoryName = _("MEDITATION"), + .height = 6, + .weight = 112, + .descriptionPage1 = DexDescription_Meditie_1, + .descriptionPage2 = DexDescription_Meditie_2, + .pokemonScale = 465, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Meditalis + .categoryName = _("MEDITATION"), + .height = 13, + .weight = 315, + .descriptionPage1 = DexDescription_Meditalis_1, + .descriptionPage2 = DexDescription_Meditalis_2, + .pokemonScale = 298, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Frizelbliz + .categoryName = _("GEWITTER"), + .height = 6, + .weight = 152, + .descriptionPage1 = DexDescription_Frizelbliz_1, + .descriptionPage2 = DexDescription_Frizelbliz_2, + .pokemonScale = 290, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Voltenso + .categoryName = _("ENTLADUNG"), + .height = 15, + .weight = 402, + .descriptionPage1 = DexDescription_Voltenso_1, + .descriptionPage2 = DexDescription_Voltenso_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 257, + .trainerOffset = 0, + }, + { + // Plusle + .categoryName = _("JUBEL"), + .height = 4, + .weight = 42, + .descriptionPage1 = DexDescription_Plusle_1, + .descriptionPage2 = DexDescription_Plusle_2, + .pokemonScale = 515, + .pokemonOffset = 65527, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Minun + .categoryName = _("JUBEL"), + .height = 4, + .weight = 42, + .descriptionPage1 = DexDescription_Minun_1, + .descriptionPage2 = DexDescription_Minun_2, + .pokemonScale = 512, + .pokemonOffset = 65529, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Volbeat + .categoryName = _("LIBELLE"), + .height = 7, + .weight = 177, + .descriptionPage1 = DexDescription_Volbeat_1, + .descriptionPage2 = DexDescription_Volbeat_2, + .pokemonScale = 442, + .pokemonOffset = 16, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Illumise + .categoryName = _("LIBELLE"), + .height = 6, + .weight = 177, + .descriptionPage1 = DexDescription_Illumise_1, + .descriptionPage2 = DexDescription_Illumise_2, + .pokemonScale = 572, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Roselia + .categoryName = _("DORN"), + .height = 3, + .weight = 20, + .descriptionPage1 = DexDescription_Roselia_1, + .descriptionPage2 = DexDescription_Roselia_2, + .pokemonScale = 677, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schluppuck + .categoryName = _("MAGEN"), + .height = 4, + .weight = 103, + .descriptionPage1 = DexDescription_Schluppuck_1, + .descriptionPage2 = DexDescription_Schluppuck_2, + .pokemonScale = 593, + .pokemonOffset = 23, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schlukwech + .categoryName = _("GIFTBEUTEL"), + .height = 17, + .weight = 800, + .descriptionPage1 = DexDescription_Schlukwech_1, + .descriptionPage2 = DexDescription_Schlukwech_2, + .pokemonScale = 256, + .pokemonOffset = 6, + .trainerScale = 345, + .trainerOffset = 3, + }, + { + // Kanivanha + .categoryName = _("GNADENLOS"), + .height = 8, + .weight = 208, + .descriptionPage1 = DexDescription_Kanivanha_1, + .descriptionPage2 = DexDescription_Kanivanha_2, + .pokemonScale = 362, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tohaido + .categoryName = _("BRUTAL"), + .height = 18, + .weight = 888, + .descriptionPage1 = DexDescription_Tohaido_1, + .descriptionPage2 = DexDescription_Tohaido_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 317, + .trainerOffset = 3, + }, + { + // Wailmer + .categoryName = _("KUGELWAL"), + .height = 20, + .weight = 1300, + .descriptionPage1 = DexDescription_Wailmer_1, + .descriptionPage2 = DexDescription_Wailmer_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 493, + .trainerOffset = 0, + }, + { + // Wailord + .categoryName = _("FLUTWAL"), + .height = 145, + .weight = 3980, + .descriptionPage1 = DexDescription_Wailord_1, + .descriptionPage2 = DexDescription_Wailord_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 1352, + .trainerOffset = 18, + }, + { + // Camaub + .categoryName = _("TAUBHEIT"), + .height = 7, + .weight = 240, + .descriptionPage1 = DexDescription_Camaub_1, + .descriptionPage2 = DexDescription_Camaub_2, + .pokemonScale = 342, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Camerupt + .categoryName = _("AUSBRUCH"), + .height = 19, + .weight = 2200, + .descriptionPage1 = DexDescription_Camerupt_1, + .descriptionPage2 = DexDescription_Camerupt_2, + .pokemonScale = 256, + .pokemonOffset = 7, + .trainerScale = 345, + .trainerOffset = 6, + }, + { + // Qurtel + .categoryName = _("KOHLE"), + .height = 5, + .weight = 804, + .descriptionPage1 = DexDescription_Qurtel_1, + .descriptionPage2 = DexDescription_Qurtel_2, + .pokemonScale = 390, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Spoink + .categoryName = _("SPRUNGFEDER"), + .height = 7, + .weight = 306, + .descriptionPage1 = DexDescription_Spoink_1, + .descriptionPage2 = DexDescription_Spoink_2, + .pokemonScale = 423, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Groink + .categoryName = _("MANIPULATOR"), + .height = 9, + .weight = 715, + .descriptionPage1 = DexDescription_Groink_1, + .descriptionPage2 = DexDescription_Groink_2, + .pokemonScale = 358, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Pandir + .categoryName = _("PUNKT-PANDA"), + .height = 11, + .weight = 50, + .descriptionPage1 = DexDescription_Pandir_1, + .descriptionPage2 = DexDescription_Pandir_2, + .pokemonScale = 321, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Knacklion + .categoryName = _("AMEISENLÖWE"), + .height = 7, + .weight = 150, + .descriptionPage1 = DexDescription_Knacklion_1, + .descriptionPage2 = DexDescription_Knacklion_2, + .pokemonScale = 298, + .pokemonOffset = 17, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Vibrava + .categoryName = _("VIBRATION"), + .height = 11, + .weight = 153, + .descriptionPage1 = DexDescription_Vibrava_1, + .descriptionPage2 = DexDescription_Vibrava_2, + .pokemonScale = 370, + .pokemonOffset = 11, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Libelldra + .categoryName = _("MYSTIK"), + .height = 20, + .weight = 820, + .descriptionPage1 = DexDescription_Libelldra_1, + .descriptionPage2 = DexDescription_Libelldra_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 268, + .trainerOffset = 1, + }, + { + // Tuska + .categoryName = _("KAKTUS"), + .height = 4, + .weight = 513, + .descriptionPage1 = DexDescription_Tuska_1, + .descriptionPage2 = DexDescription_Tuska_2, + .pokemonScale = 455, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Noktuska + .categoryName = _("VOGELSCHOCK"), + .height = 13, + .weight = 774, + .descriptionPage1 = DexDescription_Noktuska_1, + .descriptionPage2 = DexDescription_Noktuska_2, + .pokemonScale = 327, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Wablu + .categoryName = _("WOLLVOGEL"), + .height = 4, + .weight = 12, + .descriptionPage1 = DexDescription_Wablu_1, + .descriptionPage2 = DexDescription_Wablu_2, + .pokemonScale = 422, + .pokemonOffset = 65528, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Altaria + .categoryName = _("SUMMSEL"), + .height = 11, + .weight = 206, + .descriptionPage1 = DexDescription_Altaria_1, + .descriptionPage2 = DexDescription_Altaria_2, + .pokemonScale = 327, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sengo + .categoryName = _("FRETTKATZ"), + .height = 13, + .weight = 403, + .descriptionPage1 = DexDescription_Sengo_1, + .descriptionPage2 = DexDescription_Sengo_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Vipitis + .categoryName = _("REISSZAHN"), + .height = 27, + .weight = 525, + .descriptionPage1 = DexDescription_Vipitis_1, + .descriptionPage2 = DexDescription_Vipitis_2, + .pokemonScale = 275, + .pokemonOffset = 7, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lunastein + .categoryName = _("METEORIT"), + .height = 10, + .weight = 1680, + .descriptionPage1 = DexDescription_Lunastein_1, + .descriptionPage2 = DexDescription_Lunastein_2, + .pokemonScale = 300, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Sonnfel + .categoryName = _("METEORIT"), + .height = 12, + .weight = 1540, + .descriptionPage1 = DexDescription_Sonnfel_1, + .descriptionPage2 = DexDescription_Sonnfel_2, + .pokemonScale = 328, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schmerbe + .categoryName = _("BARTHAAR"), + .height = 4, + .weight = 19, + .descriptionPage1 = DexDescription_Schmerbe_1, + .descriptionPage2 = DexDescription_Schmerbe_2, + .pokemonScale = 581, + .pokemonOffset = 65533, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Welsar + .categoryName = _("BARTHAAR"), + .height = 9, + .weight = 236, + .descriptionPage1 = DexDescription_Welsar_1, + .descriptionPage2 = DexDescription_Welsar_2, + .pokemonScale = 317, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Krebscorps + .categoryName = _("GROBIAN"), + .height = 6, + .weight = 115, + .descriptionPage1 = DexDescription_Krebscorps_1, + .descriptionPage2 = DexDescription_Krebscorps_2, + .pokemonScale = 484, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Krebutack + .categoryName = _("SCHLINGEL"), + .height = 11, + .weight = 328, + .descriptionPage1 = DexDescription_Krebutack_1, + .descriptionPage2 = DexDescription_Krebutack_2, + .pokemonScale = 365, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Puppance + .categoryName = _("LEHMPUPPE"), + .height = 5, + .weight = 215, + .descriptionPage1 = DexDescription_Puppance_1, + .descriptionPage2 = DexDescription_Puppance_2, + .pokemonScale = 457, + .pokemonOffset = 21, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Lepumentas + .categoryName = _("LEHMPUPPE"), + .height = 15, + .weight = 1080, + .descriptionPage1 = DexDescription_Lepumentas_1, + .descriptionPage2 = DexDescription_Lepumentas_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 280, + .trainerOffset = 1, + }, + { + // Liliep + .categoryName = _("SEEANEMONE"), + .height = 10, + .weight = 238, + .descriptionPage1 = DexDescription_Liliep_1, + .descriptionPage2 = DexDescription_Liliep_2, + .pokemonScale = 305, + .pokemonOffset = 8, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Wielie + .categoryName = _("RANKFÜSSER"), + .height = 15, + .weight = 604, + .descriptionPage1 = DexDescription_Wielie_1, + .descriptionPage2 = DexDescription_Wielie_2, + .pokemonScale = 267, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Anorith + .categoryName = _("KREBSSENIOR"), + .height = 7, + .weight = 125, + .descriptionPage1 = DexDescription_Anorith_1, + .descriptionPage2 = DexDescription_Anorith_2, + .pokemonScale = 296, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Armaldo + .categoryName = _("SCHILD"), + .height = 15, + .weight = 682, + .descriptionPage1 = DexDescription_Armaldo_1, + .descriptionPage2 = DexDescription_Armaldo_2, + .pokemonScale = 312, + .pokemonOffset = 3, + .trainerScale = 271, + .trainerOffset = 0, + }, + { + // Barschwa + .categoryName = _("FISCH"), + .height = 6, + .weight = 74, + .descriptionPage1 = DexDescription_Barschwa_1, + .descriptionPage2 = DexDescription_Barschwa_2, + .pokemonScale = 423, + .pokemonOffset = 65532, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Milotic + .categoryName = _("ZARTHEIT"), + .height = 62, + .weight = 1620, + .descriptionPage1 = DexDescription_Milotic_1, + .descriptionPage2 = DexDescription_Milotic_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 360, + .trainerOffset = 7, + }, + { + // Formeo + .categoryName = _("WETTER"), + .height = 3, + .weight = 8, + .descriptionPage1 = DexDescription_Formeo_1, + .descriptionPage2 = DexDescription_Formeo_2, + .pokemonScale = 435, + .pokemonOffset = 65531, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kecleon + .categoryName = _("FARBENSPIEL"), + .height = 10, + .weight = 220, + .descriptionPage1 = DexDescription_Kecleon_1, + .descriptionPage2 = DexDescription_Kecleon_2, + .pokemonScale = 316, + .pokemonOffset = 10, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Shuppet + .categoryName = _("PUPPE"), + .height = 6, + .weight = 23, + .descriptionPage1 = DexDescription_Shuppet_1, + .descriptionPage2 = DexDescription_Shuppet_2, + .pokemonScale = 440, + .pokemonOffset = 20, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Banette + .categoryName = _("MARIONETTE"), + .height = 11, + .weight = 125, + .descriptionPage1 = DexDescription_Banette_1, + .descriptionPage2 = DexDescription_Banette_2, + .pokemonScale = 262, + .pokemonOffset = 9, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Zwirrlicht + .categoryName = _("REQUIEM"), + .height = 8, + .weight = 150, + .descriptionPage1 = DexDescription_Zwirrlicht_1, + .descriptionPage2 = DexDescription_Zwirrlicht_2, + .pokemonScale = 406, + .pokemonOffset = 65532, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Zwirrklop + .categoryName = _("WINK"), + .height = 16, + .weight = 306, + .descriptionPage1 = DexDescription_Zwirrklop_1, + .descriptionPage2 = DexDescription_Zwirrklop_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 299, + .trainerOffset = 1, + }, + { + // Tropius + .categoryName = _("OBST"), + .height = 20, + .weight = 1000, + .descriptionPage1 = DexDescription_Tropius_1, + .descriptionPage2 = DexDescription_Tropius_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 344, + .trainerOffset = 7, + }, + { + // Palimpalim + .categoryName = _("WINDSPIEL"), + .height = 6, + .weight = 10, + .descriptionPage1 = DexDescription_Palimpalim_1, + .descriptionPage2 = DexDescription_Palimpalim_2, + .pokemonScale = 505, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Absol + .categoryName = _("DESASTER"), + .height = 12, + .weight = 470, + .descriptionPage1 = DexDescription_Absol_1, + .descriptionPage2 = DexDescription_Absol_2, + .pokemonScale = 301, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Isso + .categoryName = _("STRAHLEKIND"), + .height = 6, + .weight = 140, + .descriptionPage1 = DexDescription_Isso_1, + .descriptionPage2 = DexDescription_Isso_2, + .pokemonScale = 484, + .pokemonOffset = 19, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Schneppke + .categoryName = _("SCHNEEHUT"), + .height = 7, + .weight = 168, + .descriptionPage1 = DexDescription_Schneppke_1, + .descriptionPage2 = DexDescription_Schneppke_2, + .pokemonScale = 380, + .pokemonOffset = 15, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Firnontor + .categoryName = _("ANTLITZ"), + .height = 15, + .weight = 2565, + .descriptionPage1 = DexDescription_Firnontor_1, + .descriptionPage2 = DexDescription_Firnontor_2, + .pokemonScale = 256, + .pokemonOffset = 3, + .trainerScale = 344, + .trainerOffset = 0, + }, + { + // Seemops + .categoryName = _("APPLAUS"), + .height = 8, + .weight = 395, + .descriptionPage1 = DexDescription_Seemops_1, + .descriptionPage2 = DexDescription_Seemops_2, + .pokemonScale = 315, + .pokemonOffset = 16, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Seejong + .categoryName = _("SPIELBALL"), + .height = 11, + .weight = 876, + .descriptionPage1 = DexDescription_Seejong_1, + .descriptionPage2 = DexDescription_Seejong_2, + .pokemonScale = 338, + .pokemonOffset = 13, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Walraisa + .categoryName = _("EISBRECHER"), + .height = 14, + .weight = 1506, + .descriptionPage1 = DexDescription_Walraisa_1, + .descriptionPage2 = DexDescription_Walraisa_2, + .pokemonScale = 316, + .pokemonOffset = 4, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Perlu + .categoryName = _("MUSCHEL"), + .height = 4, + .weight = 525, + .descriptionPage1 = DexDescription_Perlu_1, + .descriptionPage2 = DexDescription_Perlu_2, + .pokemonScale = 691, + .pokemonOffset = 22, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Aalabyss + .categoryName = _("TIEFSEE"), + .height = 17, + .weight = 270, + .descriptionPage1 = DexDescription_Aalabyss_1, + .descriptionPage2 = DexDescription_Aalabyss_2, + .pokemonScale = 307, + .pokemonOffset = 1, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Saganabyss + .categoryName = _("SÜDSEE"), + .height = 18, + .weight = 226, + .descriptionPage1 = DexDescription_Saganabyss_1, + .descriptionPage2 = DexDescription_Saganabyss_2, + .pokemonScale = 278, + .pokemonOffset = 5, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Relicanth + .categoryName = _("BESTAND"), + .height = 10, + .weight = 234, + .descriptionPage1 = DexDescription_Relicanth_1, + .descriptionPage2 = DexDescription_Relicanth_2, + .pokemonScale = 316, + .pokemonOffset = 7, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Liebiskus + .categoryName = _("RENDEZVOUS"), + .height = 6, + .weight = 87, + .descriptionPage1 = DexDescription_Liebiskus_1, + .descriptionPage2 = DexDescription_Liebiskus_2, + .pokemonScale = 371, + .pokemonOffset = 2, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Kindwurm + .categoryName = _("STEINHAUPT"), + .height = 6, + .weight = 421, + .descriptionPage1 = DexDescription_Kindwurm_1, + .descriptionPage2 = DexDescription_Kindwurm_2, + .pokemonScale = 448, + .pokemonOffset = 18, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Draschel + .categoryName = _("DURCHSTEHER"), + .height = 11, + .weight = 1105, + .descriptionPage1 = DexDescription_Draschel_1, + .descriptionPage2 = DexDescription_Draschel_2, + .pokemonScale = 311, + .pokemonOffset = 12, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Brutalanda + .categoryName = _("DRACHE"), + .height = 15, + .weight = 1026, + .descriptionPage1 = DexDescription_Brutalanda_1, + .descriptionPage2 = DexDescription_Brutalanda_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Tanhel + .categoryName = _("EISENKUGEL"), + .height = 6, + .weight = 952, + .descriptionPage1 = DexDescription_Tanhel_1, + .descriptionPage2 = DexDescription_Tanhel_2, + .pokemonScale = 414, + .pokemonOffset = 65535, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Metang + .categoryName = _("EISENKLAUE"), + .height = 12, + .weight = 2025, + .descriptionPage1 = DexDescription_Metang_1, + .descriptionPage2 = DexDescription_Metang_2, + .pokemonScale = 256, + .pokemonOffset = 6, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Metagross + .categoryName = _("EISENFUSS"), + .height = 16, + .weight = 5500, + .descriptionPage1 = DexDescription_Metagross_1, + .descriptionPage2 = DexDescription_Metagross_2, + .pokemonScale = 256, + .pokemonOffset = 4, + .trainerScale = 447, + .trainerOffset = 9, + }, + { + // Regirock + .categoryName = _("STEINGIPFEL"), + .height = 17, + .weight = 2300, + .descriptionPage1 = DexDescription_Regirock_1, + .descriptionPage2 = DexDescription_Regirock_2, + .pokemonScale = 256, + .pokemonOffset = 2, + .trainerScale = 309, + .trainerOffset = 1, + }, + { + // Regice + .categoryName = _("EISBERG"), + .height = 18, + .weight = 1750, + .descriptionPage1 = DexDescription_Regice_1, + .descriptionPage2 = DexDescription_Regice_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 301, + .trainerOffset = 2, + }, + { + // Registeel + .categoryName = _("EISEN"), + .height = 19, + .weight = 2050, + .descriptionPage1 = DexDescription_Registeel_1, + .descriptionPage2 = DexDescription_Registeel_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 359, + .trainerOffset = 6, + }, + { + // Latias + .categoryName = _("ÄON"), + .height = 14, + .weight = 400, + .descriptionPage1 = DexDescription_Latias_1, + .descriptionPage2 = DexDescription_Latias_2, + .pokemonScale = 304, + .pokemonOffset = 3, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Latios + .categoryName = _("ÄON"), + .height = 20, + .weight = 600, + .descriptionPage1 = DexDescription_Latios_1, + .descriptionPage2 = DexDescription_Latios_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 294, + .trainerOffset = 3, + }, + { + // Kyogre + .categoryName = _("SEEGRÜNDLER"), + .height = 45, + .weight = 3520, + .descriptionPage1 = DexDescription_Kyogre_1, + .descriptionPage2 = DexDescription_Kyogre_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 614, + .trainerOffset = 13, + }, + { + // Groudon + .categoryName = _("KONTINENT"), + .height = 35, + .weight = 9500, + .descriptionPage1 = DexDescription_Groudon_1, + .descriptionPage2 = DexDescription_Groudon_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 515, + .trainerOffset = 14, + }, + { + // Rayquaza + .categoryName = _("HIMMELHOCH"), + .height = 70, + .weight = 2065, + .descriptionPage1 = DexDescription_Rayquaza_1, + .descriptionPage2 = DexDescription_Rayquaza_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 448, + .trainerOffset = 12, + }, + { + // Jirachi + .categoryName = _("WÜNSCHER"), + .height = 3, + .weight = 11, + .descriptionPage1 = DexDescription_Jirachi_1, + .descriptionPage2 = DexDescription_Jirachi_2, + .pokemonScale = 608, + .pokemonOffset = 65528, + .trainerScale = 256, + .trainerOffset = 0, + }, + { + // Deoxys + .categoryName = _("DNS"), + .height = 17, + .weight = 608, + .descriptionPage1 = DexDescription_Deoxys_1, + .descriptionPage2 = DexDescription_Deoxys_2, + .pokemonScale = 256, + .pokemonOffset = 0, + .trainerScale = 290, + .trainerOffset = 2, + }, +}; diff --git a/src/data/pokedex_orders.h b/src/data/pokedex_orders.h index 3577e6793..736c0df6a 100644 --- a/src/data/pokedex_orders.h +++ b/src/data/pokedex_orders.h @@ -1,3 +1,4 @@ +#if ENGLISH static const u16 gPokedexOrder_Alphabetical[] = { 387, @@ -117,7 +118,7 @@ static const u16 gPokedexOrder_Alphabetical[] = 102, // Exeggcute 103, // Exeggutor 295, // Exploud - 83, // Farfetchd + 83, // Farfetch'd 22, // Fearow 349, // Feebas 160, // Feraligatr @@ -412,6 +413,422 @@ static const u16 gPokedexOrder_Alphabetical[] = 263, // Zigzagoon 41, // Zubat }; +#elif GERMAN +static const u16 gPokedexOrder_Alphabetical[] = { + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 367, // Aalabyss + 63, // Abra + 359, // Absol + 142, // Aerodactyl + 93, // Alpollo + 334, // Altaria + 138, // Amonitas + 139, // Amoroso + 181, // Ampharos + 347, // Anorith + 134, // Aquana + 24, // Arbok + 168, // Ariados + 59, // Arkani + 144, // Arktos + 348, // Armaldo + 91, // Austos + 184, // Azumarill + 298, // Azurill + 211, // Baldorfish + 354, // Banette + 349, // Barschwa + 15, // Bibor + 3, // Bisaflor + 2, // Bisaknosp + 1, // Bisasam + 274, // Blanas + 135, // Blitza + 182, // Blubella + 48, // Bluzuk + 225, // Botogel + 373, // Brutalanda + 287, // Bummelz + 322, // Camaub + 323, // Camerupt + 251, // Celebi + 113, // Chaneira + 222, // Corasonn + 234, // Damhirplex + 386, // Deoxys + 248, // Despotar + 50, // Digda + 51, // Digdri + 132, // Ditto + 85, // Dodri + 84, // Dodu + 232, // Donphan + 148, // Dragonir + 149, // Dragoran + 372, // Draschel + 147, // Dratini + 44, // Duflor + 206, // Dummisel + 239, // Elekid + 125, // Elektek + 152, // Endivie + 300, // Eneco + 301, // Enekoro + 244, // Entei + 54, // Enton + 55, // Entoron + 133, // Evoli + 235, // Farbeagle + 194, // Felino + 155, // Feurigel + 261, // Fiffyen + 362, // Firnontor + 136, // Flamara + 79, // Flegmon + 255, // Flemmli + 174, // Fluffeluff + 303, // Flunkifer + 293, // Flurmel + 351, // Formeo + 205, // Forstellka + 309, // Frizelbliz + 58, // Fukano + 78, // Gallopa + 130, // Garados + 252, // Geckarbor + 283, // Gehweiher + 94, // Gengar + 75, // Georok + 76, // Geowaz + 264, // Geradaks + 254, // Gewaldro + 45, // Giflor + 203, // Girafarig + 4, // Glumanda + 6, // Glurak + 5, // Glutexo + 42, // Golbat + 118, // Goldini + 119, // Golking + 210, // Granbull + 190, // Griffel + 326, // Groink + 383, // Groudon + 282, // Guardevoir + 21, // Habitak + 297, // Hariyama + 242, // Heiteira + 250, // Ho-oh + 163, // Hoothoot + 187, // Hoppspross + 13, // Hornliu + 188, // Hubelupf + 229, // Hundemon + 228, // Hunduster + 258, // Hydropi + 97, // Hypno + 22, // Ibitak + 201, // Icognito + 156, // Igelavar + 169, // Iksbat + 314, // Illumise + 160, // Impergator + 360, // Isso + 385, // Jirachi + 87, // Jugong + 256, // Jungglut + 86, // Jurob + 140, // Kabuto + 141, // Kabutops + 64, // Kadabra + 115, // Kangama + 318, // Kanivanha + 286, // Kapilz + 237, // Kapoera + 272, // Kappalores + 158, // Karnimani + 129, // Karpador + 352, // Kecleon + 221, // Keifel + 106, // Kicklee + 371, // Kindwurm + 99, // Kingler + 281, // Kirlia + 74, // Kleinstein + 328, // Knacklion + 285, // Knilz + 69, // Knofensa + 105, // Knogga + 40, // Knuddeluff + 103, // Kokowei + 14, // Kokuna + 98, // Krabby + 294, // Krakeelo + 198, // Kramurx + 295, // Krawumms + 341, // Krebscorps + 342, // Krebutack + 238, // Kussilla + 382, // Kyogre + 80, // Lahmus + 170, // Lampi + 171, // Lanturn + 131, // Lapras + 246, // Larvitar + 199, // Laschoking + 380, // Latias + 381, // Latios + 146, // Lavados + 166, // Ledian + 165, // Ledyba + 101, // Lektrobal + 344, // Lepumentas + 289, // Letarking + 330, // Libelldra + 370, // Liebiskus + 345, // Liliep + 257, // Lohgock + 271, // Lombrero + 153, // Lorblatt + 270, // Loturzel + 249, // Lugia + 337, // Lunastein + 66, // Machollo + 68, // Machomei + 240, // Magby + 219, // Magcargo + 126, // Magmar + 262, // Magnayen + 81, // Magnetilo + 82, // Magneton + 296, // Makuhita + 226, // Mantax + 183, // Marill + 67, // Maschock + 284, // Maskeregen + 52, // Mauzi + 308, // Meditalis + 307, // Meditie + 154, // Meganie + 56, // Menki + 376, // Metagross + 375, // Metang + 151, // Mew + 150, // Mewtu + 350, // Milotic + 241, // Miltank + 312, // Minun + 185, // Mogelbaum + 259, // Moorabbel + 195, // Morlord + 288, // Muntier + 90, // Muschas + 43, // Myrapla + 197, // Nachtara + 299, // Nasgnet + 177, // Natu + 92, // Nebulak + 34, // Nidoking + 31, // Nidoqueen + 29, // Nidoran♀ + 32, // Nidoran♂ + 30, // Nidorina + 33, // Nidorino + 290, // Nincada + 291, // Ninjask + 292, // Ninjatom + 107, // Nockchan + 164, // Noctuh + 332, // Noktuska + 224, // Octillery + 49, // Omot + 95, // Onix + 102, // Owei + 358, // Palimpalim + 327, // Pandir + 268, // Panekon + 122, // Pantimos + 227, // Panzaeron + 267, // Papinella + 189, // Papungha + 46, // Paras + 47, // Parasek + 279, // Pelipper + 366, // Perlu + 231, // Phanpy + 172, // Pichu + 35, // Piepi + 173, // Pii + 25, // Pikachu + 127, // Pinsir + 36, // Pixi + 311, // Plusle + 77, // Ponita + 83, // Porenta + 137, // Porygon + 233, // Porygon2 + 213, // Pottrott + 196, // Psiana + 269, // Pudox + 39, // Pummeluff + 247, // Pupitar + 343, // Puppance + 62, // Quappo + 60, // Quapsel + 61, // Quaputzi + 186, // Quaxo + 220, // Quiekel + 324, // Qurtel + 236, // Rabauz + 26, // Raichu + 243, // Raikou + 57, // Rasaff + 19, // Rattfratz + 20, // Rattikarl + 10, // Raupy + 384, // Rayquaza + 378, // Regice + 377, // Regirock + 379, // Registeel + 143, // Relaxo + 369, // Relicanth + 223, // Remoraid + 253, // Reptain + 23, // Rettan + 111, // Rihorn + 112, // Rizeros + 315, // Roselia + 124, // Rossana + 11, // Safcon + 368, // Saganabyss + 273, // Samurzel + 28, // Sandamer + 27, // Sandan + 71, // Sarzenia + 266, // Schaloko + 212, // Scherox + 7, // Schiggy + 8, // Schillok + 317, // Schlukwech + 316, // Schluppuck + 108, // Schlurp + 339, // Schmerbe + 218, // Schneckmag + 361, // Schneppke + 276, // Schwalbini + 277, // Schwalboss + 230, // Seedraking + 364, // Seejong + 117, // Seemon + 363, // Seemops + 116, // Seeper + 335, // Sengo + 353, // Shuppet + 123, // Sichlor + 65, // Simsala + 214, // Skaraborn + 207, // Skorgla + 88, // Sleima + 89, // Sleimok + 12, // Smettbo + 110, // Smogmog + 109, // Smogon + 215, // Sniebel + 53, // Snobilikat + 209, // Snubbull + 338, // Sonnfel + 192, // Sonnflora + 191, // Sonnkern + 325, // Spoink + 208, // Stahlos + 121, // Starmie + 120, // Sterndu + 306, // Stolloss + 305, // Stollrak + 304, // Stollunior + 245, // Suicune + 260, // Sumpex + 114, // Tangela + 374, // Tanhel + 204, // Tannza + 17, // Tauboga + 18, // Tauboss + 16, // Taubsi + 128, // Tauros + 216, // Teddiursa + 275, // Tengulist + 72, // Tentacha + 73, // Tentoxa + 175, // Togepi + 176, // Togetic + 319, // Tohaido + 157, // Tornupto + 104, // Tragosso + 280, // Trasla + 96, // Traumato + 200, // Traunfugil + 357, // Tropius + 9, // Turtok + 331, // Tuska + 159, // Tyracroc + 70, // Ultrigaria + 217, // Ursaring + 329, // Vibrava + 336, // Vipitis + 313, // Volbeat + 310, // Voltenso + 179, // Voltilamm + 100, // Voltobal + 38, // Vulnona + 37, // Vulpix + 180, // Waaty + 333, // Wablu + 320, // Wailmer + 321, // Wailord + 365, // Walraisa + 265, // Waumpel + 167, // Webarak + 340, // Welsar + 346, // Wielie + 162, // Wiesenior + 161, // Wiesor + 278, // Wingull + 202, // Woingenau + 178, // Xatu + 193, // Yanma + 145, // Zapdos + 263, // Zigzachs + 302, // Zobiris + 41, // Zubat + 356, // Zwirrklop + 355, // Zwirrlicht +}; +#endif + static const u16 gPokedexOrder_Weight[] = { 92, // Gastly @@ -542,7 +959,7 @@ static const u16 gPokedexOrder_Weight[] = 206, // Dunsparce 178, // Xatu 355, // Duskull - 83, // Farfetchd + 83, // Farfetch'd 328, // Trapinch 118, // Goldeen 309, // Electrike @@ -956,7 +1373,7 @@ static const u16 gPokedexOrder_Height[] = 363, // Spheal 54, // Psyduck 219, // Magcargo - 83, // Farfetchd + 83, // Farfetch'd 41, // Zubat 137, // Porygon 161, // Sentret diff --git a/src/data/text/font0_widths.h b/src/data/text/font0_widths.h new file mode 100644 index 000000000..a461eea5b --- /dev/null +++ b/src/data/text/font0_widths.h @@ -0,0 +1,60 @@ +#if ENGLISH +#if REVISION >= 1 +static const u8 sFont0Widths[] = { + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 4, 8, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 8, + 8, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 4, 8, 8, 8, 7, 8, 8, 4, 6, 6, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 7, 7, 8, 8, 4, + 7, 8, 8, 8, 8, 8, 7, 8, 7, 7, 7, 7, 7, 7, 8, 7, + 7, 7, 7, 7, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3, 5, 3, + 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 5, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 3, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, +}; +#else +static const u8 sFont0Widths[] = { + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 5, 8, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, + 7, 7, 7, 8, 8, 8, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 3, 8, 8, 8, 7, 8, 8, 4, 6, 6, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 8, 7, 7, 8, 8, 6, + 7, 8, 8, 8, 8, 8, 7, 8, 7, 7, 7, 7, 7, 7, 8, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 6, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3, 5, 3, + 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 5, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 3, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, +}; +#endif +#elif GERMAN +static const u8 sFont0Widths[] = { + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, + 8, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 4, 8, + 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 8, 6, 6, 8, + 8, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 4, 8, 8, 8, 7, 8, 8, 4, 6, 6, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 7, 7, 8, 8, 4, + 7, 8, 8, 8, 8, 8, 7, 8, 7, 7, 7, 7, 7, 7, 8, 7, + 7, 7, 7, 7, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3, 5, 3, + 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 5, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 3, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, +}; +#endif diff --git a/src/data/text/font1_widths.h b/src/data/text/font1_widths.h new file mode 100644 index 000000000..7086628cb --- /dev/null +++ b/src/data/text/font1_widths.h @@ -0,0 +1,35 @@ +#if REVISION >= 1 || GERMAN +static const u8 sFont1Widths[] = { + 5, 3, 8, 8, 8, 8, 8, 8, 8, 4, 5, 4, 4, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 8, 8, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 5, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 8, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 8, 4, 5, 5, 5, 5, 4, 8, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 6, 6, + 8, 7, 3, 5, 3, 3, 5, 4, 3, 6, 6, 6, 7, 7, 8, 5, + 5, 5, 3, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 6, 7, 6, 6, 7, 6, + 7, 7, 7, 6, 7, 6, 7, 6, 7, 6, 6, 7, 6, 6, 3, 3, + 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, +}; +#else +static const u8 sFont1Widths[] = { + 5, 3, 8, 8, 8, 8, 8, 8, 8, 4, 5, 4, 4, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 8, 8, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 8, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 8, 4, 5, 5, 5, 5, 4, 8, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, + 8, 7, 6, 5, 3, 3, 5, 4, 3, 6, 6, 6, 7, 7, 8, 5, + 5, 5, 3, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 6, 7, 6, 6, 7, 6, + 7, 7, 7, 6, 7, 6, 7, 6, 7, 6, 6, 7, 6, 6, 3, 3, + 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, +}; +#endif diff --git a/src/data/text/font3_widths.h b/src/data/text/font3_widths.h new file mode 100644 index 000000000..2d088f136 --- /dev/null +++ b/src/data/text/font3_widths.h @@ -0,0 +1,60 @@ +#if ENGLISH +#if REVISION >= 1 +static const u8 sFont3Widths[] = { + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 4, 8, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 8, + 8, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 4, 8, 8, 8, 7, 8, 8, 4, 6, 6, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 7, 7, 8, 8, 4, + 7, 8, 8, 8, 8, 8, 7, 8, 7, 7, 7, 7, 7, 7, 8, 7, + 7, 7, 7, 7, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3, 5, 3, + 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 5, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 3, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, +}; +#else +static const u8 sFont3Widths[] = { + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 4, 8, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 4, 8, 8, 8, 7, 8, 8, 4, 6, 6, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 7, 7, 8, 8, 4, + 7, 8, 8, 8, 8, 8, 7, 8, 7, 7, 7, 7, 7, 7, 8, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3, 5, 3, + 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 5, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 3, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, +}; +#endif +#elif GERMAN +static const u8 sFont3Widths[] = { + 3, 6, 6, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, + 8, 6, 6, 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 4, 8, + 6, 6, 6, 6, 6, 8, 6, 6, 6, 6, 6, 6, 8, 6, 6, 8, + 8, 8, 8, 8, 8, 8, 3, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 7, 6, 4, 8, 8, 8, 7, 8, 8, 4, 6, 6, 4, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 6, 7, 8, 7, 7, 8, 8, 4, + 7, 8, 8, 8, 8, 8, 7, 8, 7, 7, 7, 7, 7, 7, 8, 7, + 7, 7, 7, 7, 5, 6, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 6, 3, 5, 3, + 6, 6, 6, 3, 3, 6, 6, 6, 3, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 5, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, + 3, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 1, 1, +}; +#endif diff --git a/src/data/text/font4_widths.h b/src/data/text/font4_widths.h new file mode 100644 index 000000000..4c8149b76 --- /dev/null +++ b/src/data/text/font4_widths.h @@ -0,0 +1,35 @@ +#if REVISION >= 1 || GERMAN +static const u8 sFont4Widths[] = { + 5, 3, 8, 8, 8, 8, 8, 8, 8, 4, 5, 4, 4, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 8, 8, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 5, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 8, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 8, 4, 5, 5, 5, 5, 4, 8, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 8, 5, 6, 6, + 8, 7, 3, 5, 3, 3, 5, 4, 3, 6, 6, 6, 7, 7, 8, 5, + 5, 5, 3, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 6, 7, 6, 6, 7, 6, + 7, 7, 7, 6, 7, 6, 7, 6, 7, 6, 6, 7, 6, 6, 3, 3, + 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, +}; +#else +static const u8 sFont4Widths[] = { + 5, 3, 8, 8, 8, 8, 8, 8, 8, 4, 5, 4, 4, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 5, 8, 8, 8, 8, 8, 4, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 6, 6, 6, 5, + 6, 5, 5, 5, 5, 5, 5, 5, 5, 4, 8, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 8, 4, 5, 5, 5, 5, 4, 8, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, + 8, 7, 6, 5, 3, 3, 5, 4, 3, 6, 6, 6, 7, 7, 8, 5, + 5, 5, 3, 5, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 4, 5, 5, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 4, 4, 5, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 6, 6, 7, 7, 7, 7, 6, 7, 6, 6, 7, 6, + 7, 7, 7, 6, 7, 6, 7, 6, 7, 6, 6, 7, 6, 6, 3, 3, + 5, 5, 5, 5, 3, 3, 5, 5, 5, 5, 5, 5, +}; +#endif diff --git a/src/data/text/type1_map.h b/src/data/text/type1_map.h new file mode 100644 index 000000000..ff22e560a --- /dev/null +++ b/src/data/text/type1_map.h @@ -0,0 +1,249 @@ +static const u8 sFontType1Map[] = { + 0xD4, 0xD4, + 0xD4, 0x31, + 0xD4, 0x32, + 0xD4, 0x33, + 0xD4, 0x34, + 0xD4, 0x35, + 0xD4, 0x36, + 0xD4, 0x37, + 0xD4, 0x38, + 0xD4, 0x39, + 0xD4, 0x3A, + 0xD4, 0x3B, + 0xD4, 0x3C, + 0xD4, 0x3D, + 0xD4, 0x3E, + 0xD4, 0x3F, + 0xD4, 0x40, + 0xD4, 0x41, + 0xD4, 0x42, + 0xD4, 0x43, + 0xD4, 0x44, + 0xD4, 0x45, + 0xD4, 0x46, + 0xD4, 0x47, + 0xD4, 0x48, + 0xD4, 0x49, + 0xD4, 0x4A, + 0xD4, 0x4B, + 0xD4, 0x4C, + 0xD4, 0x4D, + 0xD4, 0x4E, + 0xD4, 0x4F, + 0xD4, 0x50, + 0xD4, 0x51, + 0xD4, 0x52, + 0xD4, 0x53, + 0xD4, 0x54, + 0xD4, 0x55, + 0xD4, 0x56, + 0xD4, 0x57, + 0xD4, 0x58, + 0xD4, 0x59, + 0xD4, 0x5A, + 0xD4, 0x5B, + 0xD4, 0x5C, + 0xD4, 0x5D, + 0xD4, 0x5E, + 0xD4, 0x31, + 0xD4, 0x32, + 0xD4, 0x33, + 0xD4, 0x34, + 0xD4, 0x35, + 0xD4, 0x60, + 0xD4, 0x61, + 0xD4, 0x62, + 0x65, 0x36, + 0x65, 0x37, + 0x65, 0x38, + 0x65, 0x39, + 0x65, 0x3A, + 0x65, 0x3B, + 0x65, 0x3C, + 0x65, 0x3D, + 0x65, 0x3E, + 0x65, 0x3F, + 0x65, 0x40, + 0x65, 0x41, + 0x65, 0x42, + 0x65, 0x43, + 0x65, 0x44, + 0x65, 0x4A, + 0x65, 0x4B, + 0x65, 0x4C, + 0x65, 0x4D, + 0x65, 0x4E, + 0x64, 0x4A, + 0x64, 0x4B, + 0x64, 0x4C, + 0x64, 0x4D, + 0x64, 0x4E, + 0xD4, 0x5F, + 0xD4, 0x00, + 0xD4, 0x01, + 0xD4, 0x02, + 0xD4, 0x03, + 0xD4, 0x04, + 0xD4, 0x05, + 0xD4, 0x06, + 0xD4, 0x07, + 0xD4, 0x08, + 0xD4, 0x09, + 0xD4, 0x0A, + 0xD4, 0x0B, + 0xD4, 0x0C, + 0xD4, 0x0D, + 0xD4, 0x0E, + 0xD4, 0x0F, + 0xD4, 0x10, + 0xD4, 0x11, + 0xD4, 0x12, + 0xD4, 0x13, + 0xD4, 0x14, + 0xD4, 0x15, + 0xD4, 0x16, + 0xD4, 0x17, + 0xD4, 0x18, + 0xD4, 0x19, + 0xD4, 0x1A, + 0xD4, 0x1B, + 0xD4, 0x4D, + 0xD4, 0x1C, + 0xD4, 0x1D, + 0xD4, 0x1E, + 0xD4, 0x1F, + 0xD4, 0x20, + 0xD4, 0x21, + 0xD4, 0x22, + 0xD4, 0x23, + 0xD4, 0x24, + 0xD4, 0x25, + 0xD4, 0x58, + 0xD4, 0x26, + 0xD4, 0x27, + 0xD4, 0x28, + 0xD4, 0x29, + 0xD4, 0x2A, + 0xD4, 0x2B, + 0xD4, 0x69, + 0xD4, 0x30, + 0xD4, 0x6A, + 0xD4, 0x6B, + 0xD4, 0x74, + 0xD4, 0x2D, + 0xD4, 0x2E, + 0xD4, 0x2F, + 0x65, 0x05, + 0x65, 0x06, + 0x65, 0x07, + 0x65, 0x08, + 0x65, 0x09, + 0x65, 0x0A, + 0x65, 0x0B, + 0x65, 0x0C, + 0x65, 0x0D, + 0x65, 0x0E, + 0x65, 0x0F, + 0x65, 0x10, + 0x65, 0x11, + 0x65, 0x12, + 0x65, 0x13, + 0x65, 0x19, + 0x65, 0x1A, + 0x65, 0x1B, + 0x65, 0x4D, + 0x65, 0x1C, + 0x64, 0x19, + 0x64, 0x1A, + 0x64, 0x1B, + 0x64, 0x4D, + 0x64, 0x1C, + 0xD4, 0x2C, + 0xD4, 0x76, + 0xD4, 0x77, + 0xD4, 0x78, + 0xD4, 0x79, + 0xD4, 0x7A, + 0xD4, 0x7B, + 0xD4, 0x7C, + 0xD4, 0x7D, + 0xD4, 0x7E, + 0xD4, 0x7F, + 0xD4, 0x67, + 0xD4, 0x66, + 0xD4, 0x68, + 0xD4, 0x63, + 0xD4, 0xD2, + 0xD4, 0xD3, + 0xD4, 0xD0, + 0xD4, 0xD1, + 0xD4, 0xCE, + 0xD4, 0xCF, + 0xD4, 0x6F, + 0xD4, 0x75, + 0xD4, 0x70, + 0xD4, 0x72, + 0xD4, 0x71, + 0xD4, 0x73, + 0xD4, 0x80, + 0xD4, 0x81, + 0xD4, 0x82, + 0xD4, 0x83, + 0xD4, 0x84, + 0xD4, 0x85, + 0xD4, 0x86, + 0xD4, 0x87, + 0xD4, 0x88, + 0xD4, 0x89, + 0xD4, 0x8A, + 0xD4, 0x8B, + 0xD4, 0x8C, + 0xD4, 0x8D, + 0xD4, 0x8E, + 0xD4, 0x8F, + 0xD4, 0x90, + 0xD4, 0x91, + 0xD4, 0x92, + 0xD4, 0x93, + 0xD4, 0x94, + 0xD4, 0x95, + 0xD4, 0x96, + 0xD4, 0x97, + 0xD4, 0x98, + 0xD4, 0x99, + 0xD4, 0x9A, + 0xD4, 0x9B, + 0xD4, 0x9C, + 0xD4, 0x9D, + 0xD4, 0x9E, + 0xD4, 0x9F, + 0xD4, 0xA0, + 0xD4, 0xA1, + 0xD4, 0xA2, + 0xD4, 0xA3, + 0xD4, 0xA4, + 0xD4, 0xA5, + 0xD4, 0xA6, + 0xD4, 0xA7, + 0xD4, 0xA8, + 0xD4, 0xA9, + 0xD4, 0xAA, + 0xD4, 0xAB, + 0xD4, 0xAC, + 0xD4, 0xAD, + 0xD4, 0xAE, + 0xD4, 0xAF, + 0xD4, 0xB0, + 0xD4, 0xB1, + 0xD4, 0xB2, + 0xD4, 0xB3, + 0xD4, 0x6D, + 0xD4, 0xD5, + 0xD4, 0xD6, + 0xD4, 0xD7, + 0xD4, 0xD8, + 0xD4, 0xD9, + 0xD4, 0xDA, + 0xD4, 0xDB, +}; diff --git a/src/data/text/type3_map.h b/src/data/text/type3_map.h new file mode 100644 index 000000000..cb3694b39 --- /dev/null +++ b/src/data/text/type3_map.h @@ -0,0 +1,130 @@ +static const u8 sFontType3Map[] = { + 0x00, 0x10, + 0x01, 0x10, + 0x02, 0x10, + 0x03, 0x10, + 0x04, 0x11, + 0x05, 0x11, + 0x06, 0x11, + 0x07, 0x11, + 0x08, 0x12, + 0x09, 0x12, + 0x0A, 0x12, + 0x0B, 0x12, + 0x0C, 0x13, + 0x0D, 0x13, + 0x0E, 0x13, + 0x0F, 0x13, + 0x00, 0x14, + 0x01, 0x14, + 0x02, 0x14, + 0x03, 0x14, + 0x04, 0x15, + 0x05, 0x15, + 0x06, 0x15, + 0x07, 0x15, + 0x08, 0x16, + 0x09, 0x16, + 0x0A, 0x16, + 0x0B, 0x16, + 0x0C, 0x17, + 0x0D, 0x17, + 0x0E, 0x17, + 0x0F, 0x17, + 0x00, 0x18, + 0x01, 0x18, + 0x02, 0x18, + 0x03, 0x18, + 0x04, 0x19, + 0x05, 0x19, + 0x06, 0x19, + 0x07, 0x19, + 0x08, 0x1A, + 0x09, 0x1A, + 0x0A, 0x1A, + 0x0B, 0x1A, + 0x0C, 0x1B, + 0x0D, 0x1B, + 0x0E, 0x1B, + 0x0F, 0x1B, + 0x00, 0x1C, + 0x01, 0x1C, + 0x02, 0x1C, + 0x03, 0x1C, + 0x04, 0x1D, + 0x05, 0x1D, + 0x06, 0x1D, + 0x07, 0x1D, + 0x08, 0x1E, + 0x09, 0x1E, + 0x0A, 0x1E, + 0x0B, 0x1E, + 0x0C, 0x1F, + 0x0D, 0x1F, + 0x0E, 0x1F, + 0x0F, 0x1F, + 0x20, 0x24, + 0x20, 0x24, + 0x21, 0x24, + 0x21, 0x24, + 0x20, 0x24, + 0x20, 0x24, + 0x21, 0x24, + 0x21, 0x24, + 0x22, 0x25, + 0x22, 0x25, + 0x23, 0x25, + 0x23, 0x25, + 0x22, 0x25, + 0x22, 0x25, + 0x23, 0x25, + 0x23, 0x25, + 0x20, 0x24, + 0x20, 0x24, + 0x21, 0x24, + 0x21, 0x24, + 0x20, 0x24, + 0x20, 0x24, + 0x21, 0x24, + 0x21, 0x24, + 0x22, 0x25, + 0x22, 0x25, + 0x23, 0x25, + 0x23, 0x25, + 0x22, 0x25, + 0x22, 0x25, + 0x23, 0x25, + 0x23, 0x25, + 0x20, 0x26, + 0x20, 0x26, + 0x21, 0x26, + 0x21, 0x26, + 0x20, 0x26, + 0x20, 0x26, + 0x21, 0x26, + 0x21, 0x26, + 0x22, 0x27, + 0x22, 0x27, + 0x23, 0x27, + 0x23, 0x27, + 0x22, 0x27, + 0x22, 0x27, + 0x23, 0x27, + 0x23, 0x27, + 0x20, 0x26, + 0x20, 0x26, + 0x21, 0x26, + 0x21, 0x26, + 0x20, 0x26, + 0x20, 0x26, + 0x21, 0x26, + 0x21, 0x26, + 0x22, 0x27, + 0x22, 0x27, + 0x23, 0x27, + 0x23, 0x27, + 0x22, 0x27, + 0x22, 0x27, + 0x23, 0x27, + 0x23, 0x27, +}; diff --git a/src/de_rom_8040FE0.c b/src/de_rom_8040FE0.c new file mode 100644 index 000000000..c618ebdb2 --- /dev/null +++ b/src/de_rom_8040FE0.c @@ -0,0 +1,272 @@ +#include "global.h" +#include "battle.h" + +#if GERMAN + +enum { + TRAINER_CLASS_NAME_LEADER = 25, + TRAINER_CLASS_NAME_SCHOOL_KID = 26, + TRAINER_CLASS_NAME_EXPERT = 30, + TRAINER_CLASS_NAME_POKEMON_TRAINER_3 = 46, +}; + +enum { + TRAINER_CLASS_LEADER_F = 26, + TRAINER_CLASS_ELITE_FOUR_F = 25, + TRAINER_CLASS_SCHOOL_KID_F = 30, + TRAINER_CLASS_BIRD_KEEPER = 46, + TRAINER_CLASS_MAY_1 = 61, + TRAINER_CLASS_MAY_2 = 62, + TRAINER_CLASS_MAY_3 = 63, +}; + +extern struct SecretBaseRecord gSecretBaseRecord; + +extern u8 gTrainerClassNames[][13]; +extern struct Trainer gTrainers[]; + +u8 *de_sub_8040FE0(u8 gender) { + if (gender) + { + gender++; + + } + + gender = TRAINER_CLASS_NAME_SCHOOL_KID; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_8040FF4(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_POKEMON_TRAINER_3; + return gTrainerClassNames[gender]; +} + +u8 *de_sub_804100C(u8 gender) { + if (gender) { + gender++; + } + + gender = TRAINER_CLASS_NAME_LEADER; + return gTrainerClassNames[gender]; +} + +#ifdef NONMATCHING + +u8 de_sub_81364AC(void); +u8 get_trainer_class_name_index(void); +u8 de_sub_81364F8(void); +u8 sub_8135FD8(void); + +u8 *de_sub_8041024(s32 arg0, u32 arg1) { + u8 nameIndex, trainerClass, gender; + struct Trainer *trainer; + u8 local2; + + switch (arg0) + { + case 0x400: + nameIndex = GetSecretBaseTrainerNameIndex(); + gender = gSecretBaseRecord.gender; + if (nameIndex == TRAINER_CLASS_NAME_SCHOOL_KID) + { + return de_sub_8040FE0(gender); + } + + return gTrainerClassNames[nameIndex]; + + case 0x100: + trainerClass = de_sub_81364AC(); + nameIndex = get_trainer_class_name_index(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + case 0x800: + trainerClass = de_sub_81364F8(); + nameIndex = sub_8135FD8(); + if (trainerClass == TRAINER_CLASS_SCHOOL_KID_F) + { + return de_sub_8040FE0(FEMALE); + } + if (trainerClass == TRAINER_CLASS_MAY_1 || trainerClass == TRAINER_CLASS_MAY_2 || trainerClass == TRAINER_CLASS_MAY_3) + { + return de_sub_8040FF4(FEMALE); + } + + return gTrainerClassNames[nameIndex]; + + default: + trainer = &gTrainers[arg1]; + trainerClass = trainer->trainerClass; + local2 = sub_803FC58(arg1); + + if (trainerClass == TRAINER_CLASS_LEADER_F) + { + return de_sub_8040FE0(local2); + } + + if (trainerClass == TRAINER_CLASS_BIRD_KEEPER && local2 == FEMALE) + { + return de_sub_8040FF4(FEMALE); + } + + if (trainerClass == TRAINER_CLASS_ELITE_FOUR_F) + { + if (gTrainers[arg1].doubleBattle == TRUE) + { + return de_sub_804100C(FEMALE); + } + else + { + return de_sub_804100C(MALE); + } + } + + + return gTrainerClassNames[trainerClass]; + } +} +#else + +__attribute__((naked)) +void de_sub_8041024(void) { + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + adds r2, r0, 0\n\ + adds r6, r1, 0\n\ + movs r0, 0x80\n\ + lsls r0, 3\n\ + cmp r2, r0\n\ + beq _0804104A\n\ + cmp r2, r0\n\ + bgt _08041040\n\ + movs r0, 0x80\n\ + lsls r0, 1\n\ + cmp r2, r0\n\ + beq _08041064\n\ + b _0804109C\n\ +_08041040:\n\ + movs r0, 0x80\n\ + lsls r0, 4\n\ + cmp r2, r0\n\ + beq _08041086\n\ + b _0804109C\n\ +_0804104A:\n\ + bl GetSecretBaseTrainerNameIndex\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + ldr r0, _08041060 @ =0x02017000\n\ + ldrb r0, [r0, 0x1]\n\ + lsls r0, 27\n\ + lsrs r2, r0, 31\n\ + cmp r5, 0x1A\n\ + beq _080410B8\n\ + b _080410F8\n\ + .align 2, 0\n\ +_08041060: .4byte 0x02017000\n\ +_08041064:\n\ + bl de_sub_81364AC\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl get_trainer_class_name_index\n\ +_08041070:\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ + cmp r4, 0x1E\n\ + beq _08041094\n\ + adds r0, r4, 0\n\ + subs r0, 0x3D\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x2\n\ + bls _080410CC\n\ + b _080410F8\n\ +_08041086:\n\ + bl de_sub_81364F8\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + bl sub_8135FD8\n\ + b _08041070\n\ +_08041094:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ +_0804109C:\n\ + ldr r1, _080410C0 @ =gTrainers\n\ + lsls r4, r6, 2\n\ + adds r0, r4, r6\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrb r5, [r0, 0x1]\n\ + lsls r0, r6, 16\n\ + lsrs r0, 16\n\ + bl sub_803FC58\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + cmp r5, 0x1A\n\ + bne _080410C4\n\ +_080410B8:\n\ + adds r0, r2, 0\n\ + bl de_sub_8040FE0\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410C0: .4byte gTrainers\n\ +_080410C4:\n\ + cmp r5, 0x2E\n\ + bne _080410D4\n\ + cmp r2, 0x1\n\ + bne _080410D4\n\ +_080410CC:\n\ + movs r0, 0x1\n\ + bl de_sub_8040FF4\n\ + b _08041102\n\ +_080410D4:\n\ + cmp r5, 0x19\n\ + bne _080410F8\n\ + ldr r0, _080410F4 @ =gTrainers\n\ + adds r1, r4, r6\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrb r0, [r1, 0x18]\n\ + movs r2, 0\n\ + cmp r0, 0x1\n\ + bne _080410EA\n\ + movs r2, 0x1\n\ +_080410EA:\n\ + adds r0, r2, 0\n\ + bl de_sub_804100C\n\ + b _08041102\n\ + .align 2, 0\n\ +_080410F4: .4byte gTrainers\n\ +_080410F8:\n\ + movs r0, 0xD\n\ + adds r1, r5, 0\n\ + muls r1, r0\n\ + ldr r0, _08041108 @ =gTrainerClassNames\n\ + adds r0, r1, r0\n\ +_08041102:\n\ + pop {r4-r6}\n\ + pop {r1}\n\ + bx r1\n\ + .align 2, 0\n\ +_08041108: .4byte gTrainerClassNames\n\ + .syntax divided\n"); +} +#endif + +u32 de_sub_804110C(u32 arg0, u32 arg1) { + return arg1; +} + +#endif diff --git a/src/decoration.c b/src/decoration.c index a60870ab8..9eba54ad7 100644 --- a/src/decoration.c +++ b/src/decoration.c @@ -19,6 +19,7 @@ #include "field_weather.h" #include "decoration.h" +#if ENGLISH const u8 DecorDesc_SMALL_DESK[] = _( "A small desk built\n" "for one."); @@ -596,6 +597,9 @@ const u8 DecorDesc_REGISTEEL_DOLL[] = _( "A large doll.\n" "Place it on a mat\n" "or a desk."); +#elif GERMAN +#include "data/decoration/descriptions_de.h" +#endif const u16 DecorGfx_SMALL_DESK[] = { 0x87 @@ -1239,6 +1243,7 @@ const u16 DecorGfx_REGISTEEL_DOLL[] = { MAP_OBJ_GFX_BIG_REGISTEEL_DOLL }; +#if ENGLISH const struct Decoration gDecorations[] = { {DECOR_NONE, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 0, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, {DECOR_SMALL_DESK, _("SMALL DESK"), DECORPERM_SOLID_FLOOR, DECORSHAPE_1x1, DECORCAT_DESK, 3000, DecorDesc_SMALL_DESK, DecorGfx_SMALL_DESK}, @@ -1362,6 +1367,9 @@ const struct Decoration gDecorations[] = { {DECOR_REGICE_DOLL, _("REGICE DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGICE_DOLL, DecorGfx_REGICE_DOLL}, {DECOR_REGISTEEL_DOLL, _("REGISTEEL DOLL"), DECORPERM_SOLID_MAT, DECORSHAPE_1x2, DECORCAT_DOLL, 10000, DecorDesc_REGISTEEL_DOLL, DecorGfx_REGISTEEL_DOLL} }; +#elif GERMAN +#include "data/decoration/decorations.h" +#endif const u8 *const gUnknown_083EC5E4[] = { SecretBaseText_Desk, @@ -1784,7 +1792,14 @@ void sub_80FE7EC(u8 taskId) sub_80FEC94(taskId); sub_80FECB8(gUnknown_020388F6); +#if ENGLISH MenuDrawTextWindow(15, 12, 29, 19); +#elif GERMAN + if ((gUnknown_020388F2 + gUnknown_020388F4) != gUnknown_020388D5) + { + MenuDrawTextWindow(15, 12, 29, 19); + } +#endif sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); InitMenu(0, 1, 2, gUnknown_020388F3 + 1, gUnknown_020388F2, 13); @@ -1941,10 +1956,56 @@ void sub_80FECB8(u8 decoCat) sub_80FE470(decoCat, 16, 1, 0xff); } +#if ENGLISH void sub_80FECE0(u8 decoCat) { sub_8072AB0(gDecorations[gUnknown_020388D0[decoCat]].description, 0x80, 0x68, 0x68, 0x30, 0x1); } +#elif GERMAN +__attribute__((naked)) +void sub_80FECE0(u8 decoCat) +{ + asm(".syntax unified\n\ + push {lr}\n\ + sub sp, 0x8\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + ldr r0, _080FED18 @ =gUnknown_020388D5\n\ + ldrb r0, [r0]\n\ + cmp r2, r0\n\ + beq _080FED24\n\ + ldr r1, _080FED1C @ =gDecorations\n\ + ldr r0, _080FED20 @ =gUnknown_020388D0\n\ + ldr r0, [r0]\n\ + adds r0, r2\n\ + ldrb r0, [r0]\n\ + lsls r0, 5\n\ + adds r1, 0x18\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + movs r1, 0x30\n\ + str r1, [sp]\n\ + movs r1, 0x1\n\ + str r1, [sp, 0x4]\n\ + movs r1, 0x80\n\ + movs r2, 0x68\n\ + movs r3, 0x68\n\ + bl sub_8072AB0\n\ + movs r0, 0x1\n\ + b _080FED26\n\ + .align 2, 0\n\ +_080FED18: .4byte gUnknown_020388D5\n\ +_080FED1C: .4byte gDecorations\n\ +_080FED20: .4byte gUnknown_020388D0\n\ +_080FED24:\n\ + movs r0, 0\n\ +_080FED26:\n\ + add sp, 0x8\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif void sub_80FED1C(void) { diff --git a/src/intro.c b/src/intro.c index 396f5e5df..462a2134d 100644 --- a/src/intro.c +++ b/src/intro.c @@ -43,7 +43,11 @@ extern void *const gUnknown_0840B5A0[]; static const u16 Palette_406340[] = INCBIN_U16("graphics/intro/unknown1.gbapal"); static const u16 Palette_406360[] = INCBIN_U16("graphics/intro/unknown2.gbapal"); +#if ENGLISH static const u8 gIntroTiles[] = INCBIN_U8("graphics/intro/intro.4bpp.lz"); +#elif GERMAN +extern const u8 gIntroTiles[]; +#endif static const u16 gIntro1BGPals[][16] = { INCBIN_U16("graphics/intro/intro1_bgpal1.gbapal"), diff --git a/src/link.c b/src/link.c index 5f6c32370..363a8b494 100644 --- a/src/link.c +++ b/src/link.c @@ -178,13 +178,13 @@ static const u8 sDebugMessages[7][12] = static const u8 sColorCodes[] = _("{HIGHLIGHT TRANSPARENT}{COLOR WHITE2}"); -static const u32 sBlockRequestLookupTable[5 * 2] = +const struct BlockRequest sBlockRequestLookupTable[5] = { - (u32)gBlockSendBuffer, 200, - (u32)gBlockSendBuffer, 200, - (u32)gBlockSendBuffer, 100, - (u32)gBlockSendBuffer, 220, - (u32)gBlockSendBuffer, 40, + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 200}, + {gBlockSendBuffer, 100}, + {gBlockSendBuffer, 220}, + {gBlockSendBuffer, 40}, }; static const u8 sTestString[] = _("テストな"); @@ -560,7 +560,7 @@ static void ProcessRecvCmds(u8 unusedParam) break; case 0xCCCC: #if defined(ENGLISH) - SendBlock(0, (void *)(sBlockRequestLookupTable)[gRecvCmds[1][i] * 2], (sBlockRequestLookupTable + 1)[gRecvCmds[1][i] * 2]); + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); #elif defined(GERMAN) if (deUnkValue2 == 1) { @@ -569,7 +569,7 @@ static void ProcessRecvCmds(u8 unusedParam) } else if (deUnkValue2 == 2 || deUnkValue2 == 3) { - SendBlock(0, (void *)(sBlockRequestLookupTable)[gRecvCmds[1][i] * 2], (sBlockRequestLookupTable + 1)[gRecvCmds[1][i] * 2]); + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); if (deUnkValue2 == 2) deUnkValue2 = 1; @@ -578,7 +578,7 @@ static void ProcessRecvCmds(u8 unusedParam) } else { - SendBlock(0, (void *)(sBlockRequestLookupTable)[gRecvCmds[1][i] * 2], (sBlockRequestLookupTable + 1)[gRecvCmds[1][i] * 2]); + SendBlock(0, sBlockRequestLookupTable[gRecvCmds[1][i]].address, sBlockRequestLookupTable[gRecvCmds[1][i]].size); } #endif break; diff --git a/src/menu.c b/src/menu.c index d84a4c3c5..45cfbbc2f 100644 --- a/src/menu.c +++ b/src/menu.c @@ -9,6 +9,7 @@ #include "strings.h" #include "text.h" #include "text_window.h" +#include "string_util.h" struct Menu { @@ -611,6 +612,7 @@ u8 unref_sub_8072A5C(u8 *dest, u8 *src, u8 left, u16 top, u8 width, u32 a6) return sub_8004FD0(gMenuWindowPtr, dest, src, gMenuTextTileOffset, left, top, width, a6); } +#if ENGLISH int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) { u8 newlineCount = sub_8004FD0(gMenuWindowPtr, NULL, str, gMenuTextTileOffset, left, top, width, a6); @@ -623,6 +625,90 @@ int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) if (newlineCount < height) MenuFillWindowRectWithBlankTile(left, top + 2 * newlineCount, left + width - 1, height + top - 1); } +#elif GERMAN +__attribute__((naked)) +int sub_8072AB0(const u8 *str, u8 left, u16 top, u8 width, u8 height, u32 a6) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x10\n\ + mov r12, r0\n\ + ldr r0, [sp, 0x24]\n\ + ldr r4, [sp, 0x28]\n\ + str r4, [sp, 0xC]\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + lsls r2, 16\n\ + lsrs r4, r2, 16\n\ + lsls r3, 24\n\ + lsrs r6, r3, 24\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r0, _08072AF8 @ =gMenuWindowPtr\n\ + ldr r0, [r0]\n\ + ldr r1, _08072AFC @ =gMenuTextTileOffset\n\ + ldrh r3, [r1]\n\ + str r5, [sp]\n\ + str r4, [sp, 0x4]\n\ + str r6, [sp, 0x8]\n\ + movs r1, 0\n\ + mov r2, r12\n\ + bl sub_8004FD0\n\ + adds r1, r0, 0\n\ + lsls r1, 24\n\ + lsrs r2, r1, 24\n\ + movs r3, 0x7\n\ + ands r3, r5\n\ + cmp r3, 0\n\ + bne _08072B00\n\ + adds r1, r6, 0x7\n\ + asrs r1, 3\n\ + subs r1, 0x1\n\ + b _08072B0C\n\ + .align 2, 0\n\ +_08072AF8: .4byte gMenuWindowPtr\n\ +_08072AFC: .4byte gMenuTextTileOffset\n\ +_08072B00:\n\ + adds r3, r6, r3\n\ + subs r1, r3, 0x1\n\ + cmp r1, 0\n\ + bge _08072B0A\n\ + adds r1, r3, 0x6\n\ +_08072B0A:\n\ + asrs r1, 3\n\ +_08072B0C:\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r6, r1, 0\n\ + lsrs r5, 3\n\ + adds r1, r7, 0x7\n\ + asrs r1, 3\n\ + lsls r1, 24\n\ + lsrs r7, r1, 24\n\ + lsrs r4, 3\n\ + cmp r2, r7\n\ + bcs _08072B3E\n\ + lsls r1, r2, 1\n\ + adds r1, r4, r1\n\ + lsls r1, 24\n\ + lsrs r1, 24\n\ + adds r2, r5, r6\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r7, r4\n\ + subs r3, 0x1\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + adds r0, r5, 0\n\ + bl MenuFillWindowRectWithBlankTile\n\ +_08072B3E:\n\ + add sp, 0x10\n\ + pop {r4-r7}\n\ + pop {r1}\n\ + bx r1\n\ + .syntax divided\n"); +} +#endif void MenuPrint_RightAligned(u8 *str, u8 left, u8 top) { @@ -735,3 +821,51 @@ void HandleDestroyMenuCursors(void) { DestroyMenuCursor(); } + +#if GERMAN +void de_sub_8073110(u8 * buffer, u8 * name) { + u8 * ptr, *ptr2, *ptr3; + + ptr2 = buffer; + ptr = &gStringVar1[1 + StringLengthN(gStringVar1, 256)]; + ptr3 = ptr; + + for (;;) + { + if (*ptr2 == EOS) + break; + + if (*ptr2 == 0xFD) + { + + *ptr3 = EOS; + ptr2 += 2; + + StringAppend(ptr, name); + StringAppend(ptr, ptr2); + + buffer[0] = EOS; + StringAppend(buffer, ptr); + break; + } + + *ptr3 = *ptr2; + ptr2 += 1; + ptr3 += 1; + } +} + +u8 *de_sub_8073174(u8 *name, const u8 *format) { + u32 offset; + u8 *ptr; + + offset = StringLengthN(gStringVar2, 0x100); + ptr = &gStringVar2[1 + offset]; + + StringCopy(ptr, format); + + de_sub_8073110(ptr, name); + + return StringCopy(name, ptr); +} +#endif diff --git a/src/menu_cursor.c b/src/menu_cursor.c index cfb38ca47..2dc36cf32 100644 --- a/src/menu_cursor.c +++ b/src/menu_cursor.c @@ -253,7 +253,7 @@ void sub_814A958(u8 a1) SetSubspriteTables(&gSprites[gUnknown_0203A3D1], &gSubspriteTables_842F5C0[v8]); return; } -#else +#elif ENGLISH __attribute__((naked)) void sub_814A958(u8 a1) { @@ -435,6 +435,189 @@ _0814AAB4: .4byte gSubspriteTables_842F5C0\n\ _0814AAB8: .4byte gUnknown_0203A3D1\n\ .syntax divided\n"); } +#elif GERMAN +__attribute__((naked)) +void sub_814A958(u8 a1) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x4\n\ + lsls r0, 24\n\ + ldr r4, _0814A9C4 @ =gMenuCursorSubsprites\n\ + ldr r2, _0814A9C8 @ =0x0000ffff\n\ + lsrs r0, 24\n\ + str r0, [sp]\n\ + ldr r0, _0814A9CC @ =gUnknown_0842F780\n\ + ldr r1, [r0, 0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + adds r4, 0x8\n\ + movs r7, 0x1\n\ + movs r2, 0x1\n\ + ldr r1, [sp]\n\ + subs r0, r1, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + ble _0814AA3E\n\ + ldr r0, _0814A9D0 @ =gUnknown_0842F788\n\ + mov r12, r0\n\ + mov r8, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + mov r10, r1\n\ + ldr r5, _0814A9D4 @ =gUnknown_0842F790\n\ + mov r9, r5\n\ +_0814A99E:\n\ + lsls r0, r3, 16\n\ + asrs r3, r0, 16\n\ + cmp r3, 0x1F\n\ + ble _0814A9D8\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r1, 0x80\n\ + lsls r1, 14\n\ + adds r0, r1\n\ + lsrs r2, r0, 16\n\ + ldr r3, [sp]\n\ + lsls r5, r3, 16\n\ + b _0814AA24\n\ + .align 2, 0\n\ +_0814A9C4: .4byte gMenuCursorSubsprites\n\ +_0814A9C8: .4byte 0x0000ffff\n\ +_0814A9CC: .4byte gUnknown_0842F780\n\ +_0814A9D0: .4byte gUnknown_0842F788\n\ +_0814A9D4: .4byte gUnknown_0842F790\n\ +_0814A9D8:\n\ + ldr r6, [sp]\n\ + lsls r5, r6, 16\n\ + mov r0, r8\n\ + cmp r0, 0x27\n\ + ble _0814AA0E\n\ + cmp r3, 0x8\n\ + ble _0814AA0E\n\ + mov r6, r12\n\ + ldr r0, [r6]\n\ + ldr r1, [r6, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + adds r2, r1, 0\n\ + subs r2, 0x20\n\ + adds r0, r3, 0\n\ + mov r6, r10\n\ + ands r0, r6\n\ + adds r2, r0\n\ + strh r2, [r4]\n\ + movs r0, 0x18\n\ + ands r0, r3\n\ + adds r1, r0\n\ + lsls r1, 16\n\ + lsrs r2, r1, 16\n\ + b _0814AA24\n\ +_0814AA0E:\n\ + mov r3, r9\n\ + ldr r0, [r3]\n\ + ldr r1, [r3, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + strh r2, [r4]\n\ + lsls r0, r2, 16\n\ + movs r6, 0x80\n\ + lsls r6, 12\n\ + adds r0, r6\n\ + lsrs r2, r0, 16\n\ +_0814AA24:\n\ + adds r4, 0x8\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + asrs r1, r5, 16\n\ + lsls r0, r2, 16\n\ + asrs r0, 16\n\ + subs r1, r0\n\ + lsls r1, 16\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + cmp r1, 0x7\n\ + bgt _0814A99E\n\ +_0814AA3E:\n\ + ldr r5, _0814AAAC @ =0x0843d6d8\n\ + ldr r0, [r5]\n\ + ldr r1, [r5, 0x4]\n\ + str r0, [r4]\n\ + str r1, [r4, 0x4]\n\ + lsls r1, r2, 16\n\ + asrs r1, 16\n\ + subs r1, 0x7\n\ + lsls r0, r3, 16\n\ + asrs r0, 16\n\ + adds r0, r1\n\ + strh r0, [r4]\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r6, _0814AAB0 @ =gUnknown_0203A3D0\n\ + ldrb r0, [r6]\n\ + cmp r0, 0x40\n\ + beq _0814AA7C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA7C:\n\ + ldr r1, _0814AABC @ =gUnknown_0203A3D1\n\ + ldrb r0, [r1]\n\ + cmp r0, 0x40\n\ + beq _0814AA9C\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + ldr r1, _0814AAB4 @ =gSprites\n\ + adds r2, r0, r1\n\ + lsls r1, r7, 3\n\ + ldr r0, _0814AAB8 @ =gSubspriteTables_842F5C0\n\ + adds r1, r0\n\ + adds r0, r2, 0\n\ + bl SetSubspriteTables\n\ +_0814AA9C:\n\ + add sp, 0x4\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0814AAAC: .4byte 0x0843d6d8\n\ +_0814AAB0: .4byte gUnknown_0203A3D0\n\ +_0814AAB4: .4byte gSprites\n\ +_0814AAB8: .4byte gSubspriteTables_842F5C0\n\ +_0814AABC: .4byte gUnknown_0203A3D1\n\ + .syntax divided\n"); +} #endif void sub_814AABC(void (*callback)(struct Sprite *)) @@ -542,7 +725,11 @@ u8 CreateBlendedOutlineCursor(u8 a1, u16 a2, u8 a3, u16 a4, u8 a5) } LoadSpriteSheetDeferred(&gUnknown_0842F1C0[a3 & 0xF]); - gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 0xA0, a1); +#if ENGLISH + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 160, a1); +#elif GERMAN + gUnknown_0203A3D2 = CreateSprite(&gSpriteTemplate_842F298[v8], 0, 161, a1); +#endif if (gUnknown_0203A3D2 != 0x40) { @@ -604,3 +791,9 @@ void sub_814ADF4(u8 a1) SetSubspriteTables(&gSprites[gUnknown_0203A3D2], &gSubspriteTables_842F6C0[a1]); return; } + +#if GERMAN +void nullsub_814B200(void) +{ +} +#endif diff --git a/src/mystery_event_script.c b/src/mystery_event_script.c index e3d533d28..45ef719da 100644 --- a/src/mystery_event_script.c +++ b/src/mystery_event_script.c @@ -4,10 +4,16 @@ #include "string_util.h" #include "text.h" +#if ENGLISH +#define UNK_MASK_1 0x2 +#elif GERMAN +#define UNK_MASK_1 0x4 +#endif + #ifdef SAPPHIRE -#define UNK_MASK 0x100 +#define UNK_MASK_2 0x100 #else -#define UNK_MASK 0x80 +#define UNK_MASK_2 0x80 #endif extern struct ScriptContext gUnknown_02039288; @@ -19,16 +25,16 @@ extern u8 gOtherText_DataCannotUseVersion[]; bool32 sub_8126098(u16 a1, u32 a2, u16 a3, u32 a4) { - if (!(a1 & 0x2)) + if (!(a1 & UNK_MASK_1)) return FALSE; - if (!(a2 & 0x2)) + if (!(a2 & UNK_MASK_1)) return FALSE; if (!(a3 & 0x4)) return FALSE; - if (!(a4 & UNK_MASK)) + if (!(a4 & UNK_MASK_2)) return FALSE; return TRUE; diff --git a/src/naming_screen.c b/src/naming_screen.c index 88059e669..6c107f022 100644 --- a/src/naming_screen.c +++ b/src/naming_screen.c @@ -18,6 +18,12 @@ #include "trig.h" #include "util.h" +#ifdef ENGLISH +#define COLUMN_COUNT 9 +#elif GERMAN +#define COLUMN_COUNT 10 +#endif + extern u16 gKeyRepeatStartDelay; extern u8 unk_2000000[]; @@ -467,8 +473,13 @@ static bool8 MainState_WaitPageSwap(struct Task *task) sub_80B77F8(); SetInputState(INPUT_STATE_ENABLED); GetCursorPos(&cursorX, &cursorY); +#if ENGLISH if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) cursorX = 5; +#elif GERMAN + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 7 || cursorX == 8)) + cursorX = 6; +#endif SetCursorPos(cursorX, cursorY); sub_80B6888(0); } @@ -745,29 +756,33 @@ static void HandleDpadMovement(struct Task *task) //Wrap cursor position in the X direction if (cursorX < 0) - cursorX = 8; - if (cursorX > 8) + cursorX = COLUMN_COUNT - 1; + if (cursorX > COLUMN_COUNT - 1) cursorX = 0; //Handle cursor movement in X direction if (sDpadDeltaX[dpadDir] != 0) { //The "others" page only has 5 columns +#if ENGLISH if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7)) +#elif GERMAN + if (namingScreenData.currentPage == PAGE_OTHERS && (cursorX == 6 || cursorX == 7 || cursorX == 8)) +#endif { if (sDpadDeltaX[dpadDir] > 0) - cursorX = 8; + cursorX = COLUMN_COUNT - 1; else cursorX = 5; } - if (cursorX == 8) + if (cursorX == COLUMN_COUNT - 1) { //We are now on the last column task->tKbFunctionKey = cursorY; cursorY = s4RowTo3RowTableY[cursorY]; } - else if (prevCursorX == 8) + else if (prevCursorX == COLUMN_COUNT - 1) { if (cursorY == 1) cursorY = task->tKbFunctionKey; @@ -776,7 +791,7 @@ static void HandleDpadMovement(struct Task *task) } } - if (cursorX == 8) + if (cursorX == COLUMN_COUNT - 1) { //There are only 3 keys on the last column, unlike the others, //so wrap Y accordingly @@ -1003,11 +1018,16 @@ static void CursorInit(void) SetCursorPos(0, 0); } -static const u8 sKeyboardSymbolPositions[][9] = -{ +static const u8 sKeyboardSymbolPositions[][COLUMN_COUNT] = { +#if ENGLISH {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Upper page {1, 3, 5, 8, 10, 12, 14, 17, 19}, //Lower page {1, 4, 7, 10, 13, 16, 16, 16, 19}, //Others page +#elif GERMAN + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Upper page + {2, 3, 4, 5, 9, 10, 11, 12, 16, 19}, //Lower page + {1, 4, 7, 10, 13, 16, 16, 16, 16, 19}, //Others page +#endif }; static u8 CursorColToKeyboardCol(s16 x) @@ -1037,7 +1057,7 @@ static void GetCursorPos(s16 *x, s16 *y) static void MoveCursorToOKButton(void) { - SetCursorPos(8, 2); + SetCursorPos(COLUMN_COUNT - 1, 2); } static void sub_80B6888(u8 a) @@ -1070,7 +1090,7 @@ static u8 GetKeyRoleAtCursorPos(void) s16 cursorY; GetCursorPos(&cursorX, &cursorY); - if (cursorX < 8) + if (cursorX < COLUMN_COUNT - 1) return KEY_ROLE_CHAR; else return keyRoles[cursorY]; @@ -1081,7 +1101,7 @@ void sub_80B6998(struct Sprite *sprite) if (sprite->animEnded) StartSpriteAnim(sprite, 0); sprite->invisible = (sprite->data4 & 0xFF); - if (sprite->data0 == 8) + if (sprite->data0 == COLUMN_COUNT - 1) sprite->invisible = TRUE; if (sprite->invisible || (sprite->data4 & 0xFF00) == 0 || sprite->data0 != sprite->data2 || sprite->data1 != sprite->data3) @@ -1929,6 +1949,7 @@ static const struct NamingScreenTemplate *const sNamingScreenTemplates[] = static const u8 sKeyboardCharacters[][4][20] = { +#if ENGLISH { _(" A B C D E F . "), _(" G H I J K L , "), @@ -1941,6 +1962,20 @@ static const u8 sKeyboardCharacters[][4][20] = _(" m n o p q r s "), _(" t u v w x y z "), }, +#elif GERMAN + { + _(" ABCD EFGH . "), + _(" IJKL MNOP , "), + _(" QRST UVWX "), + _(" YZ ÄÖÜ "), + }, + { + _(" abcd efgh . "), + _(" ijkl mnop , "), + _(" qrst uvwx "), + _(" yz äöü "), + }, +#endif { _(" 0 1 2 3 4 "), _(" 5 6 7 8 9 "), diff --git a/src/option_menu.c b/src/option_menu.c index 878df16ba..2463b11c6 100644 --- a/src/option_menu.c +++ b/src/option_menu.c @@ -334,6 +334,17 @@ static u8 TextSpeed_ProcessInput(u8 selection) return selection; } +#if ENGLISH +#define TEXTSPEED_SLOW_LEFT (120) +#define TEXTSPEED_MIX_LEFT (155) +#define TEXTSPEED_FAST_LEFT (184) +#endif +#if GERMAN +#define TEXTSPEED_SLOW_LEFT (120) +#define TEXTSPEED_MIX_LEFT (161) +#define TEXTSPEED_FAST_LEFT (202) +#endif + static void TextSpeed_DrawChoices(u8 selection) { u8 styles[3]; @@ -343,9 +354,9 @@ static void TextSpeed_DrawChoices(u8 selection) styles[2] = 0xF; styles[selection] = 0x8; - DrawOptionMenuChoice(gSystemText_Slow, 120, 40, styles[0]); - DrawOptionMenuChoice(gSystemText_Mid, 155, 40, styles[1]); - DrawOptionMenuChoice(gSystemText_Fast, 184, 40, styles[2]); + DrawOptionMenuChoice(gSystemText_Slow, TEXTSPEED_SLOW_LEFT, 40, styles[0]); + DrawOptionMenuChoice(gSystemText_Mid, TEXTSPEED_MIX_LEFT, 40, styles[1]); + DrawOptionMenuChoice(gSystemText_Fast, TEXTSPEED_FAST_LEFT, 40, styles[2]); } static u8 BattleScene_ProcessInput(u8 selection) @@ -374,6 +385,14 @@ static u8 BattleStyle_ProcessInput(u8 selection) return selection; } +#if ENGLISH +#define BATTLESTYLE_SHIFT (120) +#define BATTLESTYLE_SET (190) +#elif GERMAN +#define BATTLESTYLE_SHIFT (120) +#define BATTLESTYLE_SET (178) +#endif + static void BattleStyle_DrawChoices(u8 selection) { u8 styles[2]; @@ -382,8 +401,8 @@ static void BattleStyle_DrawChoices(u8 selection) styles[1] = 0xF; styles[selection] = 0x8; - DrawOptionMenuChoice(gSystemText_Shift, 120, 72, styles[0]); - DrawOptionMenuChoice(gSystemText_Set, 190, 72, styles[1]); + DrawOptionMenuChoice(gSystemText_Shift, BATTLESTYLE_SHIFT, 72, styles[0]); + DrawOptionMenuChoice(gSystemText_Set, BATTLESTYLE_SET, 72, styles[1]); } static u8 Sound_ProcessInput(u8 selection) @@ -431,6 +450,7 @@ static u8 FrameType_ProcessInput(u8 selection) #define CHAR_0 0xA1 //Character code of '0' character +#if ENGLISH static void FrameType_DrawChoices(u8 selection) { u8 text[8]; @@ -460,6 +480,69 @@ static void FrameType_DrawChoices(u8 selection) MenuPrint(gSystemText_Type, 15, 15); MenuPrint(text, 18, 15); } +#elif GERMAN +__attribute__((naked)) +static void FrameType_DrawChoices(u8 selection) +{ + asm(".syntax unified\n\ + push {r4-r6,lr}\n\ + sub sp, 0x10\n\ + lsls r0, 24\n\ + movs r1, 0x80\n\ + lsls r1, 17\n\ + adds r0, r1\n\ + lsrs r5, r0, 24\n\ + ldr r1, _0808C368 @ =gSystemText_Type\n\ + mov r0, sp\n\ + bl StringCopy\n\ + ldr r1, _0808C36C @ =gSystemText_Terminator\n\ + mov r0, sp\n\ + bl StringAppend\n\ + adds r4, r0, 0\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __udivsi3\n\ + adds r1, r0, 0\n\ + lsls r0, r1, 24\n\ + lsrs r6, r0, 24\n\ + cmp r6, 0\n\ + beq _0808C370\n\ + adds r0, r1, 0\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r4, 0x1\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + b _0808C380\n\ + .align 2, 0\n\ +_0808C368: .4byte gSystemText_Type\n\ +_0808C36C: .4byte gSystemText_Terminator\n\ +_0808C370:\n\ + adds r0, r5, 0\n\ + movs r1, 0xA\n\ + bl __umodsi3\n\ + adds r0, 0xA1\n\ + strb r0, [r4]\n\ + adds r4, 0x1\n\ + strb r6, [r4]\n\ +_0808C380:\n\ + adds r4, 0x1\n\ + movs r0, 0xFF\n\ + strb r0, [r4]\n\ + mov r0, sp\n\ + movs r1, 0xF\n\ + movs r2, 0xF\n\ + bl MenuPrint\n\ + add sp, 0x10\n\ + pop {r4-r6}\n\ + pop {r0}\n\ + bx r0\n\ + .syntax divided\n"); +} +#endif static u8 ButtonMode_ProcessInput(u8 selection) { diff --git a/src/party_menu.c b/src/party_menu.c index be0db4dc4..99bbb5f83 100644 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -23,6 +23,14 @@ #include "string_util.h" #include "strings.h" #include "task.h" +#include "sprite.h" +#include "palette.h" +#include "event_data.h" +#include "main.h" +#include "item.h" +#include "battle_interface.h" +#include "species.h" +#include "party_menu.h" #define DATA_COUNT (6) @@ -33,19 +41,6 @@ struct Unk2001000 u8 unk2; }; -struct Unk201B000 -{ - u8 filler0[0x260]; - u8 unk260; - u8 unk261; - u8 filler262[2]; - s16 unk264[DATA_COUNT * 2]; // This may be a union - u8 filler27C[2]; - s16 unk27E; - s16 unk280; - s16 unk282; -}; - struct Unk201C000 { /*0x00*/ struct Pokemon *pokemon; @@ -74,7 +69,6 @@ struct UnknownStruct5 extern u8 ewram[]; #define ewram01000 (*(struct Unk2001000 *)(ewram + 0x01000)) -#define ewram1B000 (*(struct Unk201B000 *)(ewram + 0x1B000)) #define ewram1C000 (*(struct Unk201C000 *)(ewram + 0x1C000)) #define ewram1F000 (*(struct Unk201F000 *)(ewram + 0x1F000)) @@ -115,14 +109,22 @@ void sub_806AEDC(void) } */ +#if ENGLISH +#define WINDOW_LEFT (3) +#define WINDOW_RIGHT (26) +#elif GERMAN +#define WINDOW_LEFT (0) +#define WINDOW_RIGHT (29) +#endif + u8 sub_806E834(const u8 *message, u8 arg1) { u8 taskId; gUnknown_0202E8F6 = 1; - MenuDrawTextWindow(3, 14, 26, 19); - MenuPrintMessage(message, 4, 15); + MenuDrawTextWindow(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); + MenuPrintMessage(message, WINDOW_LEFT + 1, 15); taskId = CreateTask(sub_806E884, 1); gTasks[taskId].data[0] = arg1; @@ -136,7 +138,7 @@ static void sub_806E884(u8 taskId) { gUnknown_0202E8F6 = 0; if (gTasks[taskId].data[0] == 0) - MenuZeroFillWindowRect(3, 14, 26, 19); + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); DestroyTask(taskId); } } @@ -1106,7 +1108,7 @@ void sub_8070088(u8 taskId) else { gUnknown_0202E8F4 = 1; - MenuZeroFillWindowRect(3, 14, 26, 19); + MenuZeroFillWindowRect(WINDOW_LEFT, 14, WINDOW_RIGHT, 19); PlaySE(SE_KAIFUKU); PartyMenuUpdateLevelOrStatus(ewram1C000.pokemon, ewram1C000.unk5); task_pc_turn_off(&gUnknown_083769A8[IsDoubleBattle() * 12 + ewram1C000.unk5 * 2], 9); @@ -1344,6 +1346,7 @@ void Task_RareCandy2(u8 taskId) } } +#if ENGLISH void sub_8070848(u8 taskId) { u8 i; @@ -1380,3 +1383,123 @@ void sub_8070848(u8 taskId) MenuPrint_PixelCoords(gStringVar1, (x + 6) * 8 + 12, y * 8, 0); } } +#elif GERMAN +__attribute__((naked)) +void sub_8070848(u8 taskId) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + movs r0, 0xB\n\ + movs r1, 0\n\ + movs r2, 0x1D\n\ + movs r3, 0x7\n\ + bl MenuDrawTextWindow\n\ + movs r7, 0\n\ + ldr r0, _0807092C @ =gStringVar1\n\ + mov r10, r0\n\ + movs r1, 0xFC\n\ + mov r9, r1\n\ + movs r2, 0x13\n\ + mov r8, r2\n\ +_0807086C:\n\ + ldr r1, _08070930 @ =0x0201c000\n\ + ldr r0, [r1]\n\ + ldr r1, _08070934 @ =gUnknown_08376D1C\n\ + adds r1, r7, r1\n\ + ldrb r1, [r1]\n\ + bl GetMonData\n\ + adds r1, r7, 0x6\n\ + lsls r1, 1\n\ + ldr r2, _08070938 @ =0x0201b264\n\ + adds r1, r2, r1\n\ + strh r0, [r1]\n\ + lsls r6, r7, 1\n\ + adds r6, r2, r6\n\ + ldrh r1, [r6]\n\ + subs r0, r1\n\ + strh r0, [r6]\n\ + adds r0, r7, 0\n\ + movs r1, 0x3\n\ + bl __udivsi3\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 3\n\ + adds r4, r0\n\ + adds r4, 0xB\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + adds r0, r7, 0\n\ + movs r1, 0x3\n\ + bl __umodsi3\n\ + adds r5, r0, 0\n\ + lsls r5, 1\n\ + adds r5, 0x1\n\ + lsls r5, 24\n\ + lsrs r5, 24\n\ + ldr r1, _0807093C @ =gUnknown_08376D04\n\ + lsls r0, r7, 2\n\ + adds r0, r1\n\ + ldr r1, [r0]\n\ + mov r0, r10\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ + mov r0, r9\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + mov r1, r8\n\ + strb r1, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0x2E\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + adds r0, r2, 0\n\ + ldr r1, _08070940 @ =gOtherText_TallPlusAndRightArrow\n\ + bl StringCopy\n\ + adds r2, r0, 0\n\ + mov r0, r9\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + mov r1, r8\n\ + strb r1, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0x34\n\ + strb r0, [r2]\n\ + adds r2, 0x1\n\ + movs r0, 0\n\ + ldrsh r1, [r6, r0]\n\ + adds r0, r2, 0\n\ + movs r2, 0x1\n\ + movs r3, 0x2\n\ + bl ConvertIntToDecimalStringN\n\ + adds r4, 0x1\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + mov r0, r10\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + bl MenuPrint\n\ + adds r0, r7, 0x1\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + cmp r7, 0x5\n\ + bls _0807086C\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807092C: .4byte gStringVar1\n\ +_08070930: .4byte 0x0201c000\n\ +_08070934: .4byte gUnknown_08376D1C\n\ +_08070938: .4byte 0x0201b264\n\ +_0807093C: .4byte gUnknown_08376D04\n\ +_08070940: .4byte gOtherText_TallPlusAndRightArrow\n\ + .syntax divided\n"); +} +#endif diff --git a/src/pokedex.c b/src/pokedex.c index 17ae9a597..2ef91e472 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -178,7 +178,12 @@ static const u16 sNationalPokedexPalette[] = INCBIN_U16("graphics/pokedex/nation const u8 gEmptySpacce_839F7FC[0xA4] = {0}; static const u8 gUnknown_0839F8A0[] = INCBIN_U8("graphics/pokedex/pokedex_cry_layout.bin.lz"); static const u8 gUnknown_0839F988[] = INCBIN_U8("graphics/pokedex/pokedex_size_layout.bin.lz"); +#if ENGLISH static const u8 gUnknown_0839FA7C[] = INCBIN_U8("graphics/pokedex/noball.4bpp.lz"); +#elif GERMAN +extern const u8 gUnknown_0839FA7C[]; +#endif + #include "data/pokedex_orders.h" static const struct OamData gOamData_83A0404 = { @@ -507,8 +512,11 @@ static const u8 gUnknown_083A05EC[] = {2, 4, 8, 16, 32}; static const u8 gUnknown_083A05F1[] = {16, 8, 4, 2, 1}; const u8 gEmptySpacce_83A05F6[] = {0, 0}; // Padding, maybe? static const u8 gUnknown_083A05F8[] = _(""); -// TODO: include German entries +#if ENGLISH #include "data/pokedex_entries_en.h" +#elif GERMAN +#include "data/pokedex_entries_de.h" +#endif static const u16 gUnknown_083B4EC4[16] = {0}; static const u8 *const sMonFootprintTable[] = { @@ -2900,6 +2908,12 @@ static u8 sub_808F284(struct PokedexListItem *item, u8 b) return b; } +#if ENGLISH +#define CATEGORY_LEFT (11) +#elif GERMAN +#define CATEGORY_LEFT (16) +#endif + static void Task_InitPageScreenMultistep(u8 taskId) { switch (gMain.state) @@ -2946,12 +2960,12 @@ static void Task_InitPageScreenMultistep(u8 taskId) else sub_8091154(gUnknown_0202FFBC->dexNum, 0xD, 3); sub_80911C8(gUnknown_0202FFBC->dexNum, 0x10, 3); - MenuPrint(gDexText_UnknownPoke, 11, 5); + MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); MenuPrint(gDexText_UnknownHeight, 16, 7); MenuPrint(gDexText_UnknownWeight, 16, 9); if (gUnknown_0202FFBC->owned) { - sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, 11, 5); + sub_8091304(gPokedexEntries[gUnknown_0202FFBC->dexNum].categoryName, CATEGORY_LEFT, 5); sub_8091458(gPokedexEntries[gUnknown_0202FFBC->dexNum].height, 16, 7); sub_8091564(gPokedexEntries[gUnknown_0202FFBC->dexNum].weight, 16, 9); MenuPrint(gPokedexEntries[gUnknown_0202FFBC->dexNum].descriptionPage1, 2, 13); @@ -3838,10 +3852,10 @@ static void sub_8090750(u8 taskId) else sub_8091154(dexNum, 13, 3); sub_80911C8(dexNum, 16, 3); - MenuPrint(gDexText_UnknownPoke, 11, 5); + MenuPrint(gDexText_UnknownPoke, CATEGORY_LEFT, 5); MenuPrint(gDexText_UnknownHeight, 16, 7); MenuPrint(gDexText_UnknownWeight, 16, 9); - sub_8091304(gPokedexEntries[dexNum].categoryName, 11, 5); + sub_8091304(gPokedexEntries[dexNum].categoryName, CATEGORY_LEFT, 5); sub_8091458(gPokedexEntries[dexNum].height, 16, 7); sub_8091564(gPokedexEntries[dexNum].weight, 16, 9); MenuPrint(gPokedexEntries[dexNum].descriptionPage1, 2, 13); @@ -4247,6 +4261,7 @@ static void sub_8091304(const u8 *name, u8 left, u8 top) sub_8072B80(str, left, top, gDexText_UnknownPoke); } +#if ENGLISH void unref_sub_80913A4(u16 a, u8 left, u8 top) { u8 str[6]; @@ -4283,6 +4298,51 @@ void unref_sub_80913A4(u16 a, u8 left, u8 top) str[5] = EOS; MenuPrint(str, left, top); } +#elif GERMAN +void unref_sub_80913A4(u16 arg0, u8 left, u8 top) { + u8 buffer[8]; + int offset; + u8 result; + + u8 r6 = 0; + offset = 0; + + + buffer[r6++] = 0xFC; + buffer[r6++] = 0x13; + r6++; + + result = (arg0 / 1000); + if (result == 0) + { + offset = 6; + } + else + { + buffer[r6++] = result + CHAR_0; + } + + + result = (arg0 % 1000) / 100; + + if (result == 0 && offset != 0) + { + offset += 6; + } + else + { + buffer[r6++] = result + CHAR_0; + } + + buffer[r6++] = (((arg0 % 1000) % 100) / 10) + CHAR_0; + buffer[r6++] = CHAR_COMMA; + buffer[r6++] = (((arg0 % 1000) % 100) % 10) + CHAR_0; + + buffer[r6++] = EOS; + buffer[2] = offset; + MenuPrint(buffer, left, top); +} +#endif #ifdef UNITS_IMPERIAL #define CHAR_PRIME (0xB4) @@ -4664,9 +4724,15 @@ int sub_8091AF8(u8 a, u8 b, u8 abcGroup, u8 bodyColor, u8 type1, u8 type2) return resultsCount; } +#if ENGLISH +#define SUB_8091E20_WIDTH (208) +#elif GERMAN +#define SUB_8091E20_WIDTH (216) +#endif + void sub_8091E20(const u8 *str) { - sub_8072AB0(str, 9, 120, 208, 32, 1); + sub_8072AB0(str, 9, 120, SUB_8091E20_WIDTH, 32, 1); } u8 sub_8091E3C(void) diff --git a/src/pokemon_size_record.c b/src/pokemon_size_record.c index f293190e8..f2222bd3b 100644 --- a/src/pokemon_size_record.c +++ b/src/pokemon_size_record.c @@ -86,10 +86,17 @@ static u32 GetMonSize(u16 species, u16 b) static void FormatMonSizeRecord(u8 *string, u32 size) { +#if ENGLISH u8 decimalPoint[] = _("."); +#elif GERMAN + u8 decimalPoint[] = _(","); +#endif +#ifdef UNITS_IMPERIAL //Convert size from centimeters to inches size = (double)(size * 10) / (CM_PER_INCH * 10); +#endif + string = ConvertIntToDecimalStringN(string, size / 10, 0, 8); string = StringAppend(string, decimalPoint); ConvertIntToDecimalStringN(string, size % 10, 0, 1); diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index fb837f1f6..0cab07fc1 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -42,10 +42,13 @@ void sub_8098898(u8 index) { break; case 4: - // TODO: fix for German // {var} + " was released." ptr = StringCopy(gUnk2002694, gUnk20026e4); +#if ENGLISH ptr = StringCopy(ptr, gUnknown_083B6DF4[index].text); +#elif GERMAN + ptr = de_sub_8073174(gUnk2002694, gUnknown_083B6DF4[index].text); +#endif break; case 3: diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 61ae11438..00a0bea29 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -81,6 +81,7 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 u8 *ptr = gStringVar4; u8 nature = GetNature(pokemon); +#if ENGLISH ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); if (nature != NATURE_BOLD && nature != NATURE_GENTLE) @@ -89,6 +90,11 @@ void PokemonSummaryScreen_PrintTrainerMemo(struct Pokemon *pokemon, u8 left, u8 } ptr = StringCopy(ptr, gOtherText_Nature); +#elif GERMAN + ptr = StringCopy(gStringVar4, gOtherText_Nature); + ptr = sub_80A1E9C(ptr, gNatureNames[nature], 14); + ptr = StringCopy(ptr, gOtherText_Terminator4); +#endif if (PokemonSummaryScreen_CheckOT(pokemon) == TRUE) { diff --git a/src/pokenav.c b/src/pokenav.c index 24253e878..3a386d865 100644 --- a/src/pokenav.c +++ b/src/pokenav.c @@ -2,18 +2,28 @@ #include "pokenav.h" #include "battle.h" #include "data2.h" +#include "de_rom_8040FE0.h" #include "string_util.h" void sub_80F700C(u8 *arg0, u16 arg1) { struct Trainer *trainer; u8 *ptr; +#if ENGLISH trainer = (struct Trainer *) &gTrainers[gUnknown_083DFEC4->unkCEE8[arg1].unk0]; +#elif GERMAN + const u16 trainerIndex = gUnknown_083DFEC4->unkCEE8[arg1].unk0; + trainer = (struct Trainer *) &gTrainers[trainerIndex]; +#endif ptr = arg0; if (arg1 < gUnknown_083DFEC4->unkD158) { +#if ENGLISH ptr = StringCopy(ptr, gTrainerClassNames[trainer->trainerClass]); +#elif GERMAN + ptr = StringCopy(ptr, de_sub_8041024(0, trainerIndex)); +#endif ptr[0] = 0xFC; ptr[1] = 0x13; diff --git a/src/script_menu.c b/src/script_menu.c index 23e8bf2d9..e1ad3f467 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -863,6 +863,7 @@ bool8 TryCreatePCMenu(void) } } +#if ENGLISH void CreatePCMenu(void) { u16 playersPCWidth = GetStringWidthInTilesForScriptMenu(gPCText_PlayersPC); @@ -897,6 +898,170 @@ void CreatePCMenu(void) InitMenu(0, 1, 1, numChoices, 0, width + 1); sub_80B5230(0, 0, width + 2, 2 * numChoices + 1, 0, numChoices); } +#elif GERMAN +__attribute__((naked)) +void CreatePCMenu(void) { + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x18\n\ + ldr r0, _080B5748 @ =0x0000084b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5750\n\ + ldr r0, _080B574C @ =gPCText_LanettesPC\n\ + b _080B5752\n\ + .align 2, 0\n\ +_080B5748: .4byte 0x0000084b\n\ +_080B574C: .4byte gPCText_LanettesPC\n\ +_080B5750:\n\ + ldr r0, _080B57E8 @ =gPCText_SomeonesPC\n\ +_080B5752:\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + movs r4, 0x1\n\ + ldr r0, _080B57EC @ =gPCText_PlayersPC\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r1, r4, 2\n\ + add r1, sp\n\ + adds r1, 0x8\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [r1]\n\ + ldr r0, _080B57F0 @ =gPCText_LogOff\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x10]\n\ + movs r4, 0x3\n\ + ldr r0, _080B57F4 @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5798\n\ + ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ + bl GetStringWidthInTilesForScriptMenu\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x14]\n\ + movs r4, 0x4\n\ +_080B5798:\n\ + movs r5, 0\n\ + cmp r5, r4\n\ + bge _080B57B4\n\ + add r2, sp, 0x8\n\ + adds r1, r4, 0\n\ +_080B57A2:\n\ + ldr r0, [r2]\n\ + cmp r5, r0\n\ + bge _080B57AC\n\ + lsls r0, 24\n\ + lsrs r5, r0, 24\n\ +_080B57AC:\n\ + adds r2, 0x4\n\ + subs r1, 0x1\n\ + cmp r1, 0\n\ + bne _080B57A2\n\ +_080B57B4:\n\ + ldr r0, _080B57F4 @ =0x00000804\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B57FC\n\ + movs r7, 0x4\n\ + adds r4, r5, 0x2\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r3, 0x9\n\ + bl MenuDrawTextWindow\n\ + ldr r0, _080B57F8 @ =gPCText_HallOfFame\n\ + movs r1, 0x1\n\ + movs r2, 0x5\n\ + bl MenuPrint\n\ + ldr r0, _080B57F0 @ =gPCText_LogOff\n\ + movs r1, 0x1\n\ + movs r2, 0x7\n\ + bl MenuPrint\n\ + b _080B5818\n\ + .align 2, 0\n\ +_080B57E8: .4byte gPCText_SomeonesPC\n\ +_080B57EC: .4byte gPCText_PlayersPC\n\ +_080B57F0: .4byte gPCText_LogOff\n\ +_080B57F4: .4byte 0x00000804\n\ +_080B57F8: .4byte gPCText_HallOfFame\n\ +_080B57FC:\n\ + movs r7, 0x3\n\ + adds r4, r5, 0x2\n\ + lsls r2, r4, 24\n\ + lsrs r2, 24\n\ + movs r0, 0\n\ + movs r1, 0\n\ + movs r3, 0x7\n\ + bl MenuDrawTextWindow\n\ + ldr r0, _080B5834 @ =gPCText_LogOff\n\ + movs r1, 0x1\n\ + movs r2, 0x5\n\ + bl MenuPrint\n\ +_080B5818:\n\ + adds r6, r4, 0\n\ + ldr r0, _080B5838 @ =0x0000084b\n\ + bl FlagGet\n\ + lsls r0, 24\n\ + cmp r0, 0\n\ + beq _080B5840\n\ + ldr r0, _080B583C @ =gPCText_LanettesPC\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl MenuPrint\n\ + b _080B584A\n\ + .align 2, 0\n\ +_080B5834: .4byte gPCText_LogOff\n\ +_080B5838: .4byte 0x0000084b\n\ +_080B583C: .4byte gPCText_LanettesPC\n\ +_080B5840:\n\ + ldr r0, _080B5888 @ =gPCText_SomeonesPC\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + bl MenuPrint\n\ +_080B584A:\n\ + ldr r0, _080B588C @ =gPCText_PlayersPC\n\ + movs r1, 0x1\n\ + movs r2, 0x3\n\ + bl MenuPrint\n\ + movs r4, 0\n\ + str r4, [sp]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + movs r0, 0\n\ + movs r1, 0x1\n\ + movs r2, 0x1\n\ + adds r3, r7, 0\n\ + bl InitMenu\n\ + lsls r2, r6, 24\n\ + lsrs r2, 24\n\ + lsls r3, r7, 1\n\ + adds r3, 0x1\n\ + str r4, [sp]\n\ + str r7, [sp, 0x4]\n\ + movs r0, 0\n\ + movs r1, 0\n\ + bl sub_80B5230\n\ + add sp, 0x18\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080B5888: .4byte gPCText_SomeonesPC\n\ +_080B588C: .4byte gPCText_PlayersPC\n\ + .syntax divided\n"); +} +#endif void sub_80B5838(void) { diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index ecfd8111b..cbca07011 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -31,7 +31,7 @@ extern struct SpriteTemplate gUnknown_02024E8C; extern u8 gContestPlayerMonIndex; extern u8 gIsLinkContest; extern u8 gPlayerPartyCount; -extern u8 gBufferedMoves[]; +extern u8 gSelectedOrderFromParty[]; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; @@ -653,7 +653,7 @@ void sub_80C5568(void) void sub_80C5580(void) { - u8 var = gBufferedMoves[0]; + u8 var = gSelectedOrderFromParty[0]; switch(var) { @@ -676,7 +676,7 @@ void ChooseBattleTowerPlayerParty(void) void SetBattleTowerPlayerParty(void) { - u8 var = gBufferedMoves[0]; + u8 var = gSelectedOrderFromParty[0]; switch(var) { @@ -702,8 +702,8 @@ void ReducePlayerPartyToThree(void) // copy the selected pokemon according to the order. for(i = 0; i < 3; i++) - if(gBufferedMoves[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop - party[i] = gPlayerParty[gBufferedMoves[i] - 1]; // index is 0 based, not literal + if(gSelectedOrderFromParty[i]) // as long as the order keeps going (did the player select 1 mon? 2? 3?), do not stop + party[i] = gPlayerParty[gSelectedOrderFromParty[i] - 1]; // index is 0 based, not literal // delete the last 3 pokemon CpuFill32(0, gPlayerParty, sizeof gPlayerParty); diff --git a/src/script_pokemon_util_80F99CC.c b/src/script_pokemon_util_80F99CC.c index 606cd9dd4..2b48cc0d8 100644 --- a/src/script_pokemon_util_80F99CC.c +++ b/src/script_pokemon_util_80F99CC.c @@ -3,6 +3,7 @@ #include "choose_party.h" #include "contest.h" #include "data2.h" +#include "party_menu.h" #include "field_fadetransition.h" #include "palette.h" #include "party_menu.h" @@ -16,6 +17,8 @@ #include "task.h" #include "text.h" + + extern u8 gPlayerPartyCount; extern u16 gSpecialVar_0x8004; extern u16 gSpecialVar_0x8005; diff --git a/src/secret_base.c b/src/secret_base.c index 6291051a6..d88d2c66a 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -10,6 +10,7 @@ #include "main.h" #include "map_constants.h" #include "map_name_popup.h" +#include "menu.h" #include "metatile_behavior.h" #include "palette.h" #include "pokemon.h" @@ -835,7 +836,11 @@ u8 *sub_80BC190(u8 *dest, u8 arg1) { // 80bc190 str = StringCopyN(dest, gSaveBlock1.secretBases[arg1].sbr_field_2, local1); str[0] = EOS; +#if ENGLISH return StringAppend(dest, gOtherText_PlayersBase); +#elif GERMAN + return de_sub_8073174(dest, gOtherText_PlayersBase); +#endif } u8 *GetSecretBaseMapName(u8 *dest) { diff --git a/src/starter_choose.c b/src/starter_choose.c index c838f2dc0..2b28df4f0 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -465,7 +465,7 @@ static void Task_StarterChoose6(u8 taskId) gTasks[taskId].func = Task_StarterChoose1; } -static void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor) +void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadowColor) { *(string++) = EXT_CTRL_CODE_BEGIN; *(string++) = 4; @@ -480,6 +480,8 @@ static void AddTextColorCtrlCode(u8 *string, u8 bgColor, u8 textColor, u8 shadow *p = c; \ } + +#if ENGLISH static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) { u8 labelText[72]; @@ -545,6 +547,161 @@ static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) REG_WIN0H = WIN_RANGE(labelLeft, labelRight); REG_WIN0V = WIN_RANGE(labelTop, labelBottom); } +#elif GERMAN +__attribute__((naked)) +static void CreateStarterPokemonLabel(u8 prevSelection, u8 selection) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + sub sp, 0x48\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r1, 24\n\ + lsrs r5, r1, 24\n\ + cmp r0, 0xFF\n\ + beq _0810A872\n\ + ldr r1, _0810A960 @ =gStarterChoose_LabelCoords\n\ + lsls r2, r0, 1\n\ + adds r0, r2, r1\n\ + ldrb r0, [r0]\n\ + adds r1, 0x1\n\ + adds r2, r1\n\ + ldrb r1, [r2]\n\ + adds r2, r0, 0\n\ + adds r2, 0xD\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + adds r3, r1, 0x3\n\ + lsls r3, 24\n\ + lsrs r3, 24\n\ + bl MenuZeroFillWindowRect\n\ + ldr r0, _0810A964 @ =0x04000040\n\ + movs r1, 0\n\ + strh r1, [r0]\n\ + adds r0, 0x4\n\ + strh r1, [r0]\n\ +_0810A872:\n\ + adds r0, r5, 0\n\ + bl GetStarterPokemon\n\ + lsls r0, 16\n\ + lsrs r6, r0, 16\n\ + adds r0, r6, 0\n\ + bl SpeciesToNationalPokedexNum\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + bl GetPokemonCategory\n\ + adds r4, r0, 0\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x8\n\ + bl AddTextColorCtrlCode\n\ + movs r2, 0x8\n\ + movs r3, 0\n\ + ldrb r0, [r4]\n\ + lsls r5, 1\n\ + mov r7, sp\n\ + adds r7, 0x5\n\ + cmp r0, 0xFF\n\ + beq _0810A8CA\n\ +_0810A8A8:\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + adds r0, r4, r3\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 24\n\ + lsrs r3, r0, 24\n\ + adds r0, r2, 0x1\n\ + lsls r0, 24\n\ + lsrs r2, r0, 24\n\ + adds r0, r4, r3\n\ + ldrb r0, [r0]\n\ + cmp r0, 0xFF\n\ + beq _0810A8CA\n\ + cmp r3, 0xA\n\ + bls _0810A8A8\n\ +_0810A8CA:\n\ + mov r0, sp\n\ + adds r1, r0, r2\n\ + movs r0, 0xFF\n\ + strb r0, [r1]\n\ + mov r1, sp\n\ + movs r0, 0xFC\n\ + strb r0, [r1, 0x5]\n\ + movs r0, 0x11\n\ + strb r0, [r1, 0x6]\n\ + mov r2, sp\n\ + lsls r1, r3, 1\n\ + adds r1, r3\n\ + lsls r1, 1\n\ + movs r0, 0x70\n\ + subs r0, r1\n\ + asrs r0, 1\n\ + strb r0, [r2, 0x7]\n\ + ldr r0, _0810A960 @ =gStarterChoose_LabelCoords\n\ + adds r1, r5, r0\n\ + ldrb r4, [r1]\n\ + adds r0, 0x1\n\ + adds r0, r5, r0\n\ + ldrb r5, [r0]\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + adds r2, r5, 0\n\ + bl MenuPrint\n\ + mov r0, sp\n\ + movs r1, 0\n\ + movs r2, 0xF\n\ + movs r3, 0x8\n\ + bl AddTextColorCtrlCode\n\ + movs r0, 0xB\n\ + adds r1, r6, 0\n\ + muls r1, r0\n\ + ldr r0, _0810A968 @ =gSpeciesNames\n\ + adds r1, r0\n\ + adds r0, r7, 0\n\ + movs r2, 0x70\n\ + movs r3, 0x2\n\ + bl sub_8072C74\n\ + adds r2, r5, 0x2\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl MenuPrint\n\ + lsls r0, r4, 3\n\ + adds r0, 0x4\n\ + lsls r0, 24\n\ + adds r4, 0xD\n\ + lsls r4, 3\n\ + adds r4, 0x4\n\ + lsls r4, 24\n\ + lsrs r4, 24\n\ + lsls r1, r5, 27\n\ + adds r5, 0x4\n\ + lsls r5, 27\n\ + lsrs r5, 24\n\ + ldr r2, _0810A964 @ =0x04000040\n\ + lsrs r0, 16\n\ + orrs r0, r4\n\ + strh r0, [r2]\n\ + ldr r0, _0810A96C @ =0x04000044\n\ + lsrs r1, 16\n\ + orrs r1, r5\n\ + strh r1, [r0]\n\ + add sp, 0x48\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0810A960: .4byte gStarterChoose_LabelCoords\n\ +_0810A964: .4byte 0x04000040\n\ +_0810A968: .4byte gSpeciesNames\n\ +_0810A96C: .4byte 0x04000044\n\ + .syntax divided\n"); +} +#endif static void nullsub_72(struct Sprite *sprite) { diff --git a/src/text.c b/src/text.c index 02cafea48..b27084b86 100644 --- a/src/text.c +++ b/src/text.c @@ -218,12 +218,14 @@ static const u8 sFont1JapaneseGlyphs[] = INCBIN_U8("graphics/fonts/font1_jpn.1bp static const u8 sBrailleGlyphs[] = INCBIN_U8("graphics/fonts/font6_braille.1bpp"); static const u32 sDownArrowTiles[] = INCBIN_U32("graphics/fonts/down_arrow.4bpp"); -#include "fonts/type1_map.h" -#include "fonts/type3_map.h" -#include "fonts/font1_widths.h" -#include "fonts/font4_widths.h" -#include "fonts/font0_widths.h" -#include "fonts/font3_widths.h" +// clang-format off +#include "data/text/type1_map.h" +#include "data/text/type3_map.h" +#include "data/text/font1_widths.h" +#include "data/text/font4_widths.h" +#include "data/text/font0_widths.h" +#include "data/text/font3_widths.h" +// clang-format on const u16 gUnknownPalette_81E6692[] = INCBIN_U16("graphics/fonts/unknown_81E6692.gbapal"); const u16 gFontDefaultPalette[] = INCBIN_U16("graphics/fonts/default.gbapal"); diff --git a/src/title_screen.c b/src/title_screen.c index dd06956c3..664e07978 100644 --- a/src/title_screen.c +++ b/src/title_screen.c @@ -15,6 +15,26 @@ #include "task.h" #include "unknown_task.h" +#if ENGLISH +#define VERSION_BANNER_SHAPE 1 +#define VERSION_BANNER_RIGHT_TILEOFFSET 64 +#define VERSION_BANNER_BYTES 0x1000 +#define VERSION_BANNER_LEFT_X 98 +#define VERSION_BANNER_RIGHT_X 162 +#define VERSION_BANNER_Y 26 +#define VERSION_BANNER_Y_GOAL 66 +#define START_BANNER_X DISPLAY_WIDTH / 2 +#elif GERMAN +#define VERSION_BANNER_SHAPE 0 +#define VERSION_BANNER_RIGHT_TILEOFFSET 128 +#define VERSION_BANNER_BYTES 0x2000 +#define VERSION_BANNER_LEFT_X 108 +#define VERSION_BANNER_RIGHT_X 172 +#define VERSION_BANNER_Y 44 +#define VERSION_BANNER_Y_GOAL 84 +#define START_BANNER_X DISPLAY_WIDTH / 2 - 2 +#endif + extern u8 gReservedSpritePaletteCount; extern struct MusicPlayerInfo gMPlay_BGM; extern u8 gUnknown_0202F7E4; @@ -89,7 +109,7 @@ static const struct OamData sVersionBannerLeftOamData = .objMode = 0, .mosaic = 0, .bpp = 1, - .shape = 1, + .shape = VERSION_BANNER_SHAPE, .x = 0, .matrixNum = 0, .size = 3, @@ -105,7 +125,7 @@ static const struct OamData sVersionBannerRightOamData = .objMode = 0, .mosaic = 0, .bpp = 1, - .shape = 1, + .shape = VERSION_BANNER_SHAPE, .x = 0, .matrixNum = 0, .size = 3, @@ -121,7 +141,7 @@ static const union AnimCmd sVersionBannerLeftAnimSequence[] = }; static const union AnimCmd sVersionBannerRightAnimSequence[] = { - ANIMCMD_FRAME(64, 30), + ANIMCMD_FRAME(VERSION_BANNER_RIGHT_TILEOFFSET, 30), ANIMCMD_END, }; static const union AnimCmd *const sVersionBannerLeftAnimTable[] = @@ -154,7 +174,7 @@ static const struct SpriteTemplate sVersionBannerRightSpriteTemplate = }; static const struct CompressedSpriteSheet gUnknown_08393EFC[] = { - {gVersionTiles, 0x1000, 1000}, + {gVersionTiles, VERSION_BANNER_BYTES, 1000}, {NULL}, }; static const struct OamData gOamData_8393F0C = @@ -213,6 +233,18 @@ static const union AnimCmd gSpriteAnim_8393F4C[] = ANIMCMD_FRAME(28, 4), ANIMCMD_END, }; +#if GERMAN +static const union AnimCmd gSpriteAnim_839F73C[] = +{ + ANIMCMD_FRAME(32, 4), + ANIMCMD_END, +}; +static const union AnimCmd gSpriteAnim_839F744[] = +{ + ANIMCMD_FRAME(36, 4), + ANIMCMD_END, +}; +#endif static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = { gSpriteAnim_8393F14, @@ -223,6 +255,10 @@ static const union AnimCmd *const sStartCopyrightBannerAnimTable[] = gSpriteAnim_8393F3C, gSpriteAnim_8393F44, gSpriteAnim_8393F4C, +#if GERMAN + gSpriteAnim_839F73C, + gSpriteAnim_839F744, +#endif }; static const struct SpriteTemplate sStartCopyrightBannerSpriteTemplate = { @@ -322,7 +358,7 @@ void SpriteCallback_VersionBannerLeft(struct Sprite *sprite) if (task->data[1] != 0) { sprite->oam.objMode = 0; - sprite->pos1.y = 66; + sprite->pos1.y = VERSION_BANNER_Y_GOAL; sprite->invisible = FALSE; } else @@ -332,7 +368,7 @@ void SpriteCallback_VersionBannerLeft(struct Sprite *sprite) if (task->data[5] < 64) { sprite->invisible = FALSE; - if (sprite->pos1.y != 66) + if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) sprite->pos1.y++; REG_BLDALPHA = gUnknown_08393E64[task->data[5] / 2]; } @@ -346,7 +382,7 @@ void SpriteCallback_VersionBannerRight(struct Sprite *sprite) if (task->data[1] != 0) { sprite->oam.objMode = 0; - sprite->pos1.y = 66; + sprite->pos1.y = VERSION_BANNER_Y_GOAL; sprite->invisible = FALSE; } else @@ -354,7 +390,7 @@ void SpriteCallback_VersionBannerRight(struct Sprite *sprite) if (task->data[5] < 64) { sprite->invisible = FALSE; - if (sprite->pos1.y != 66) + if (sprite->pos1.y != VERSION_BANNER_Y_GOAL) sprite->pos1.y++; } } @@ -375,6 +411,7 @@ void SpriteCallback_PressStartCopyrightBanner(struct Sprite *sprite) sprite->invisible = FALSE; } +#if ENGLISH static void CreatePressStartBanner(s16 x, s16 y) { u8 i; @@ -388,6 +425,110 @@ static void CreatePressStartBanner(s16 x, s16 y) gSprites[spriteId].data0 = 1; } } +#elif GERMAN +__attribute__((naked)) +static void CreatePressStartBanner(s16 x, s16 y) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + lsls r0, 16\n\ + ldr r2, _0807C3AC @ =0xffe00000\n\ + adds r0, r2\n\ + lsrs r0, 16\n\ + movs r6, 0\n\ + lsls r1, 16\n\ + mov r10, r1\n\ + mov r8, r10\n\ +_0807C302:\n\ + lsls r5, r0, 16\n\ + asrs r5, 16\n\ + ldr r0, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ + adds r1, r5, 0\n\ + mov r3, r8\n\ + asrs r2, r3, 16\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + ldr r0, _0807C3B4 @ =gSprites\n\ + mov r9, r0\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + adds r1, r6, 0\n\ + bl StartSpriteAnim\n\ + movs r7, 0x1\n\ + strh r7, [r4, 0x2E]\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + adds r5, 0x20\n\ + lsls r5, 16\n\ + lsrs r0, r5, 16\n\ + cmp r6, 0x2\n\ + bls _0807C302\n\ + ldr r1, _0807C3B0 @ =sStartCopyrightBannerSpriteTemplate\n\ + mov r8, r1\n\ + lsls r5, r0, 16\n\ + asrs r5, 16\n\ + mov r2, r10\n\ + asrs r6, r2, 16\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + movs r1, 0x8\n\ + bl StartSpriteAnim\n\ + strh r7, [r4, 0x2E]\n\ + subs r5, 0x60\n\ + lsls r5, 16\n\ + asrs r5, 16\n\ + subs r6, 0x8\n\ + lsls r6, 16\n\ + asrs r6, 16\n\ + mov r0, r8\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + movs r3, 0\n\ + bl CreateSprite\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + lsls r4, r0, 4\n\ + adds r4, r0\n\ + lsls r4, 2\n\ + add r4, r9\n\ + adds r0, r4, 0\n\ + movs r1, 0x9\n\ + bl StartSpriteAnim\n\ + strh r7, [r4, 0x2E]\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_0807C3AC: .4byte 0xffe00000\n\ +_0807C3B0: .4byte sStartCopyrightBannerSpriteTemplate\n\ +_0807C3B4: .4byte gSprites\n\ + .syntax divided\n"); +} +#endif static void CreateCopyrightBanner(s16 x, s16 y) { @@ -608,12 +749,12 @@ static void Task_TitleScreenPhase1(u8 taskId) REG_BLDY = 0; //Create left side of version banner - spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, 0x62, 0x1A, 0); + spriteId = CreateSprite(&sVersionBannerLeftSpriteTemplate, VERSION_BANNER_LEFT_X, VERSION_BANNER_Y, 0); gSprites[spriteId].invisible = TRUE; gSprites[spriteId].data1 = taskId; //Create right side of version banner - spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, 0xA2, 0x1A, 0); + spriteId = CreateSprite(&sVersionBannerRightSpriteTemplate, VERSION_BANNER_RIGHT_X, VERSION_BANNER_Y, 0); gSprites[spriteId].invisible = TRUE; gSprites[spriteId].data1 = taskId; @@ -644,7 +785,7 @@ static void Task_TitleScreenPhase2(u8 taskId) | DISPCNT_BG1_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON; - CreatePressStartBanner(DISPLAY_WIDTH / 2, 108); + CreatePressStartBanner(START_BANNER_X, 108); CreateCopyrightBanner(DISPLAY_WIDTH / 2, 148); gTasks[taskId].data[4] = 0; gTasks[taskId].func = Task_TitleScreenPhase3; diff --git a/src/trade.c b/src/trade.c new file mode 100644 index 000000000..cb190d194 --- /dev/null +++ b/src/trade.c @@ -0,0 +1,88 @@ +#include "global.h" +#include "name_string_util.h" +#include "string_util.h" +#include "text.h" + +struct InGameTrade { + /*0x00*/ u8 name[11]; + /*0x0C*/ u16 species; + /*0x0E*/ u8 ivs[6]; + /*0x14*/ bool8 secondAbility; + /*0x18*/ u32 otId; + /*0x1C*/ u8 stats[5]; + /*0x24*/ u32 personality; + /*0x28*/ u16 heldItem; + /*0x2A*/ u8 mailNum; + /*0x2B*/ u8 otName[11]; + /*0x36*/ u8 otGender; + /*0x37*/ u8 sheen; + /*0x38*/ u16 playerSpecies; +}; + +struct UnkStructC { + /*0x00*/ u16 words[9]; + /*0x10*/ u8 string[8]; + /*0x1A*/ u8 otId[4]; + /*0x1E*/ u16 species; + /*0x20*/ u16 heldItem; +}; + +struct UnkStructD { + /*0x00*/ u8 pad00[0x10]; + /*0x10*/ u8 var10; + /*0x11*/ u8 pad11[1]; + /*0x12*/ u16 var12[1]; +}; + +extern const struct InGameTrade gIngameTrades[]; +extern const u16 gIngameTradeMail[][10]; + + +void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { + int y, x; + + for (y = 0; y < height; y++) + { + + for (x = 0; x < width; x++) + { + arg0->var12[(top * 32 + left) + y * 32 + x] = tilemap[width * y + x] | sp8; + } + } + +#if ENGLISH + arg0->var10 = 1; +#endif +} + +#if GERMAN +void sub_804A96C_alt(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { + sub_804A96C(arg0, left, top, tilemap, width, height, sp8); + + arg0->var10 = 1; +} +#endif + +asm(".section .text.sub_804DAD4"); + +void sub_804DAD4(struct UnkStructC *arg0, struct InGameTrade *trade) { + s32 i; + + for (i = 0; i < 9; i++) + { + arg0->words[i] = gIngameTradeMail[trade->mailNum][i]; + } + + StringCopy(arg0->string, trade->otName); + +#if GERMAN + PadNameString(arg0->string, CHAR_SPACE); +#endif + + arg0->otId[0] = trade->otId >> 24; + arg0->otId[1] = trade->otId >> 16; + arg0->otId[2] = trade->otId >> 8; + arg0->otId[3] = trade->otId; + arg0->species = trade->species; + arg0->heldItem = trade->heldItem; +} diff --git a/src/trainer_card.c b/src/trainer_card.c index b2a1ad71b..876a3b426 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -1667,7 +1667,11 @@ static void TrainerCard_Back_PrintName(void) StringCopy(str, ewram0.var_64.playerName); ConvertInternationalString(str, ewram0.language); +#if ENGLISH StringAppend(str, gOtherText_TrainersTrainerCard); +#elif GERMAN + de_sub_8073174(str, gOtherText_TrainersTrainerCard); +#endif MenuPrint_RightAligned(gStringVar1, 28, 2); } @@ -779,9 +779,13 @@ _080BE0A2:\n\ ldr r1, _080BE134 @ =gSaveBlock2\n\ bl StringCopy\n\ adds r0, r4, 0\n\ - bl sub_80BE138\n\ - movs r0, 2 @ GAME_LANGUAGE\n\ - strb r0, [r4, 0x2]\n\ + bl sub_80BE138\n"); +#if ENGLISH + asm("movs r0, 2 @ GAME_LANGUAGE\n"); +#elif GERMAN + asm("movs r0, 5 @ GAME_LANGUAGE\n"); +#endif + asm("strb r0, [r4, 0x2]\n\ _080BE112:\n\ pop {r4-r7}\n\ pop {r0}\n\ @@ -1716,6 +1720,7 @@ void sub_80BF4BC(void) } } +#if ENGLISH u8 sub_80BF4F4(u8 arg0) { u32 species; @@ -1731,6 +1736,31 @@ u8 sub_80BF4F4(u8 arg0) return TRUE; } +#elif GERMAN +u8 sub_80BF4F4(u8 arg0) +{ + u8 langData[4]; + u32 species; + + u8 *tmp; + + GetMonData(&gPlayerParty[arg0], MON_DATA_NICKNAME, &gStringVar1); + + tmp = langData; + tmp[0] = GetMonData(&gPlayerParty[arg0], MON_DATA_LANGUAGE, &langData); + if (tmp[0] != GAME_LANGUAGE) { + return TRUE; + } + + species = GetMonData(&gPlayerParty[arg0], MON_DATA_SPECIES, NULL); + + if (StringCompareWithoutExtCtrlCodes(gSpeciesNames[species], gStringVar1)) { + return TRUE; + } + + return FALSE; +} +#endif u8 sub_80BF544(void) { |