// -------------------------------------------------- void BoxViewer::drawPokemonScale(pkm_s* pkm, int16_t x, int16_t y, float scale) // -------------------------------------------------- { if (pkm->speciesID == 0) return; sf2d_texture* pkmIcons = PHBanku::texture->pkmIcons; if (pkm->isShiny) pkmIcons = PHBanku::texture->pkmShinyIcons; // Draw the shadow { sf2d_draw_texture_part_scale_blend(pkmIcons, x + 2 * scale, y + 2 * scale, (pkm->speciesID % 25) * 40, (pkm->speciesID / 25) * 30, 40, 30, scale, scale, RGBA8(0x00,0x00,0x00,0x55)); } if (pkm->isEggy) { // Draw the egg+Pokémon icon sf2d_draw_texture_part_scale(pkmIcons, x, y, (pkm->speciesID % 25) * 40, (pkm->speciesID / 25) * 30, 40, 30, scale, scale); sf2d_draw_texture_part(pkmIcons, x, y + 30 * (scale - 0.5f), (EGG_ID % 25) * 40, (EGG_ID / 25) * 30, 40, 30); } else { // Draw the Pokémon icon sf2d_draw_texture_part_scale(pkmIcons, x, y, (pkm->speciesID % 25) * 40, (pkm->speciesID / 25) * 30, 40, 30, scale, scale); // Draw the item if (pkm->itemID > 0) { // TODO: Draw item sf2d_draw_texture_part(PHBanku::texture->itemIcons, x + 5, y + 30 * (scale - 0.5f), (pkm->itemID % 34) * 30, (pkm->itemID / 34) * 30, 30, 30); } } }
// -------------------------------------------------- void BoxViewer::drawBox(box_s* box, int16_t x, int16_t y, bool cursor) // -------------------------------------------------- { // Draw the box background sf2d_draw_texture_part(PHBanku::texture->boxBackgrounds, x, y, ((box->background % 16) % 4) * BACKGROUND_WIDTH, ((box->background % 16) / 4) * BACKGROUND_HEIGHT, BACKGROUND_WIDTH, BACKGROUND_HEIGHT); if (cursor) { // Draw CursorType buttons (Red|Blue|Green) drawCursorButton(x, y); } // Draw the box header sf2d_draw_texture_part(PHBanku::texture->boxBackgrounds, x, y + 15, ((box->background % 16) % 4) * BOX_HEADER_WIDTH, 840 + ((box->background % 16) / 4) * BOX_HEADER_HEIGHT, BOX_HEADER_WIDTH, BOX_HEADER_HEIGHT); // Draw the box arrows sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 4, y + 18, 96, 32, 16, 24); sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 200, y + 18, 112, 32, 16, 24); // Draw the box title wchar_t boxTitle[0x1a]; // TODO: Remove that if statement when complete box->title. // TODO: Wait for sftd_get_wtext_wdith. if (box->title[0] != '\0') swprintf(boxTitle, 0x1a, (wchar_t*) box->title); else swprintf(boxTitle, 0x1a, L"Box %i", box->number+1); int boxTitleWidth = sftd_get_wtext_width(font, 12, boxTitle); sftd_draw_wtext(font, x + (BACKGROUND_WIDTH - boxTitleWidth) / 2, y + 21, RGBA8(0x22,0x22,0x22,0xFF), 12, boxTitle); // TODO: v DRY v // If there is a Pokémon currently selected if (sPkm) { // Draw Pokémon icons for (u8 i = 0; i < BOX_PKM_COUNT; i++) { // If the Pokémon isn't the selected Pokémon if (sPkm != &(box->slot[i])) { drawPokemon(&box->slot[i], x + (i % BOX_COL_PKM_COUNT) * PKM_WIDTH, y + PKM_BOX_MARGIN_TOP + (i / BOX_COL_PKM_COUNT) * PKM_HEIGHT, false); } } } // If there is no Pokémon currently selected else { // Draw Pokémon icons for (u8 i = 0; i < BOX_PKM_COUNT; i++) { drawPokemon(&box->slot[i], x + (i % BOX_COL_PKM_COUNT) * PKM_WIDTH, y + PKM_BOX_MARGIN_TOP + (i / BOX_COL_PKM_COUNT) * PKM_HEIGHT, false); } } }
int8_t fontDrawJPChar8(int16_t x, int16_t y, char8_t c) { // Do not draw the control characters. // if (c >= 0x48 && c <= 0x5F) return 0; sf2d_draw_texture_part(fontJPGB, x, y, (c % 0x10) * CHAR_SIZE, (c / 0x10) * CHAR_SIZE, CHAR_SIZE, CHAR_SIZE); return CHAR_SIZE; }
// -------------------------------------------------- void BoxViewer::drawCursorButton(int16_t x, int16_t y) // -------------------------------------------------- { if (!sPkm && sPkmCount == 0) { sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 21 + 0, y, 0, 0, 50, 32); sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 21 + 64, y, 64, 0, 50, 32); sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 21 + 128, y, 128, 0, 50, 32); } else { sf2d_draw_texture_part_blend(PHBanku::texture->boxTiles, x + 21 + 0, y, 0, 0, 50, 32, RGBA8(0xCC,0xCC,0xCC,0xAA)); sf2d_draw_texture_part_blend(PHBanku::texture->boxTiles, x + 21 + 64, y, 64, 0, 50, 32, RGBA8(0xCC,0xCC,0xCC,0xAA)); if (cursorType == CursorType::MultiSelect) sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 21 + 128, y, 128, 0, 64, 32); else sf2d_draw_texture_part_blend(PHBanku::texture->boxTiles, x + 21 + 128, y, 128, 0, 50, 32, RGBA8(0xCC,0xCC,0xCC,0xAA)); } }
// -------------------------------------------------- void BoxViewer::drawPokemon(pkm_s* pkm, int16_t x, int16_t y, bool shadow) // -------------------------------------------------- { if (pkm->speciesID == 0) return; // sf2d_draw_rectangle(x, y, PKM_WIDTH, PKM_HEIGHT, RGBA8(0x00,0x00,0x00,0x22)); sf2d_texture* pkmIcons = PHBanku::texture->pkmIcons; if (pkm->isShiny) pkmIcons = PHBanku::texture->pkmShinyIcons; // Draw the shadow if (shadow) { sf2d_draw_texture_part_blend(pkmIcons, x+4, y+4, (pkm->speciesID % 25) * 40, (pkm->speciesID / 25) * 30, 40, 30, RGBA8(0x00,0x00,0x00,0x55)); } if (pkm->isEggy) { // Draw the egg+Pokémon icon sf2d_draw_texture_part_blend(pkmIcons, x, y, (pkm->speciesID % 25) * 40, (pkm->speciesID / 25) * 30, 40, 30, RGBA8(0xFF,0xFF,0xFF,0xAA)); sf2d_draw_texture_part_blend(pkmIcons, x, y, (EGG_ID % 25) * 40, (EGG_ID / 25) * 30, 40, 30, RGBA8(0xFF,0xFF,0xFF,0x88)); } else { // Draw the Pokémon icon sf2d_draw_texture_part(pkmIcons, x, y, (pkm->speciesID % 25) * 40, (pkm->speciesID / 25) * 30, 40, 30); // Draw the item if (pkm->itemID > 0) { sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 23, y + 21, 48, 82, 12, 12); } } // Draw the checkbox if (pkm->checked) { // TODO: Draw a check mark sf2d_draw_texture_part(PHBanku::texture->boxTiles, x + 3, y + 22, 96, 56, 8, 8); } }
void TextureManager::drawLoadingBackball(int x, int y) { sf2d_draw_texture_part(this->ballLoadingScreen, x, y, 48, 0, 16, 16); }
// -------------------------------------------------- Result BoxViewer::drawBotScreen() // -------------------------------------------------- { if (hasRegularChild()) { if (this->child->drawBotScreen() == PARENT_STEP); else return CHILD_STEP; } { // Retrieve the current box, and the drawing offset. s16 boxShift = cursorBox.inBank ? BK_BOX_SHIFT_USED : PC_BOX_SHIFT_USED; s16 middleBoxShift = (cursorBox.inBank ? PC_BOX_SHIFT_UNUSED : PC_BOX_SHIFT_USED) + BACKGROUND_WIDTH; // Draw the current box: the background and the icons. drawBox((cursorBox.inBank ? vBKBox : vPCBox), boxShift, 0, true); // Draw the other box: the background and the icons. drawBox((cursorBox.inBank ? vPCBox : vBKBox), (cursorBox.inBank ? PC_BOX_SHIFT_UNUSED : BK_BOX_SHIFT_UNUSED), 0, false); // Draw bottom bar sf2d_draw_texture_part(PHBanku::texture->boxBackgrounds, (cursorBox.inBank ? PC_BOX_SHIFT_UNUSED : PC_BOX_SHIFT_USED), BACKGROUND_HEIGHT, 440, 968, 480, 30); sf2d_draw_texture_part(PHBanku::texture->boxBackgrounds, middleBoxShift, 0, 880, 758, 40, BACKGROUND_HEIGHT); // Draw SwapBox button sf2d_draw_texture_part(PHBanku::texture->boxTiles, middleBoxShift + 10, 215, 128, 32, 20, 20); // If a Pokémon is currently selected if (sPkm) { u16 pkm_x, pkm_y; // If the selected Pokémon is dragged if (isPkmDragged) { // Draw dragged Pokémon icon under the stylus pkm_x = touch.px - 20; // 40/2 pkm_y = touch.py - 15; // 30/2 } // If the selected Pokémon is held else // if (isPkmHeld) { if (cursorBox.inslot == SLOT_NO_SELECTION) { // Draw the Pokémon icon on the box title pkm_x = boxShift + (BACKGROUND_WIDTH - PKM_WIDTH) / 2; pkm_y = 10; } else { // Draw the Pokémon icon on the current slot a bit shifted pkm_x = boxShift + cursorBox.col * PKM_WIDTH; pkm_y = PKM_BOX_MARGIN_TOP - 12 + cursorBox.row * PKM_HEIGHT; } } drawPokemon(sPkm, pkm_x, pkm_y, true); if (!isPkmDragged) { sf2d_draw_texture_part(PHBanku::texture->boxTiles, pkm_x + 20, pkm_y - 11, (u8) cursorType * 32, 32, 32, 32); } } else { // Draw the cursor if (cursorBox.inslot == SLOT_NO_SELECTION) { // Draw the cursor icon on the box title sf2d_draw_texture_part(PHBanku::texture->boxTiles, boxShift + 105, 3 - cursorPositionOffY, (u8) cursorType * 32, 32, 32, 32); } else { // Draw the cursor icon on the current slot a bit shifted sf2d_draw_texture_part(PHBanku::texture->boxTiles, boxShift + 16 + (cursorBox.inslot % 6) * PKM_WIDTH + cursorPositionOffY / 2, PKM_BOX_MARGIN_TOP - 7 + (cursorBox.inslot / 6) * PKM_HEIGHT - cursorPositionOffY, (u8) cursorType * 32, 32, 32, 32); } } if (sPkmCount > 0) { // Draw the selected Pokémon for (u8 i = 0; i < 19 && i < sPkmCount; i++) { drawPokemon(sPkms[i], middleBoxShift, 10 * i, false); } } } if (hasOverlayChild()) { this->child->drawBotScreen(); } return SUCCESS_STEP; }
// -------------------------------------------------- Result BoxViewer::drawTopScreen() // -------------------------------------------------- { if (hasRegularChild()) { if (this->child->drawTopScreen() == PARENT_STEP); else return CHILD_STEP; } // Draw the resume background sf2d_draw_texture(PHBanku::texture->resumeBackground, 0, 0); sftd_draw_wtext_white(11, 40, data->text(BankText::GameTrainer)); sftd_draw_wtextf_white(91, 40, L"%S (%lu-%lu-%lu)", save->savedata.OTName, save->savedata.TID, save->savedata.SID, save->savedata.TSV); // If there is a current Pokémon if (vPkm.pkm && !vPkm.emptySlot) { { uint32_t x, y; sf2d_draw_texture_part(PHBanku::texture->ballIcons, 5, 5, (vPkm.ball % BALL_ROW_COUNT) * BALL_SIZE, (vPkm.ball / BALL_ROW_COUNT) * BALL_SIZE, BALL_SIZE, BALL_SIZE); x = 32; y = 16 - 2; // Is the Pokémon an egg? if (vPkm.pkm->isEggy) { sftd_draw_wtext_white(x, y, data->species(0)); } else { // Is the Pokémon nicknamed? if (Pokemon::isNicknamed(vPkm.pkm)) { sftd_draw_wtext_white(x, y, vPkm.NKName); } else { sftd_draw_wtext_white(x, y, vPkm.species); } } sftd_draw_wtextf_white(x + 168, y, L"%S%u", data->text(BankText::Level), vPkm.level); x = 11; y = 42 - 2; sftd_draw_wtext_white(x, (y += 15), data->text(BankText::DexNo)); sftd_draw_text_white(x+50, y, "%03u", vPkm.pkm->speciesID); sftd_draw_wtext_white(x+80, y, vPkm.species); sftd_draw_wtext_white(x, (y += 15), data->text(BankText::OriginalTrainer)); sftd_draw_wtext_white(x+50, y, vPkm.OTName); y += 15; // sftd_draw_text_white(x, (y += 15), "Stat"); sftd_draw_wtext_white(x+90, y, data->text(BankText::Value)); sftd_draw_wtext_white(x+128, y, data->text(BankText::IV)); sftd_draw_wtext_white(x+158, y, data->text(BankText::EV)); sftd_draw_wtext_white(x, (y+=15), data->text(BankText::HitPoint)); sftd_draw_text_white(x+98, y, "% 3u", vPkm.stats[Stat::HP]); sftd_draw_text_white(x+130, y, "% 2u", vPkm.ivs[Stat::HP]); sftd_draw_text_white(x+160, y, "% 3u", vPkm.evs[Stat::HP]); sftd_draw_wtext_white(x, (y+=15), data->text(BankText::Attack)); sftd_draw_text_white(x+98, y, "% 3u", vPkm.stats[Stat::ATK]); sftd_draw_text_white(x+130, y, "% 2u", vPkm.ivs[Stat::ATK]); sftd_draw_text_white(x+160, y, "% 3u", vPkm.evs[Stat::ATK]); sftd_draw_wtext_white(x, (y+=15), data->text(BankText::Defense)); sftd_draw_text_white(x+98, y, "% 3u", vPkm.stats[Stat::DEF]); sftd_draw_text_white(x+130, y, "% 2u", vPkm.ivs[Stat::DEF]); sftd_draw_text_white(x+160, y, "% 3u", vPkm.evs[Stat::DEF]); sftd_draw_wtext_white(x, (y+=15), data->text(BankText::SpAttack)); sftd_draw_text_white(x+98, y, "% 3u", vPkm.stats[Stat::SPA]); sftd_draw_text_white(x+130, y, "% 2u", vPkm.ivs[Stat::SPA]); sftd_draw_text_white(x+160, y, "% 3u", vPkm.evs[Stat::SPA]); sftd_draw_wtext_white(x, (y+=15), data->text(BankText::SpDefense)); sftd_draw_text_white(x+98, y, "% 3u", vPkm.stats[Stat::SPD]); sftd_draw_text_white(x+130, y, "% 2u", vPkm.ivs[Stat::SPD]); sftd_draw_text_white(x+160, y, "% 3u", vPkm.evs[Stat::SPD]); sftd_draw_wtext_white(x, (y+=15), data->text(BankText::Speed)); sftd_draw_text_white(x+98, y, "% 3u", vPkm.stats[Stat::SPE]); sftd_draw_text_white(x+130, y, "% 2u", vPkm.ivs[Stat::SPE]); sftd_draw_text_white(x+160, y, "% 3u", vPkm.evs[Stat::SPE]); sftd_draw_wtext_white(x, (y += 15), data->text(BankText::Nature)); sftd_draw_wtext_white(x+70, y, vPkm.nature); sftd_draw_wtext_white(x, (y += 15), data->text(BankText::Ability)); sftd_draw_wtext_white(x+70, y, vPkm.ability); sftd_draw_wtext_white(x, (y += 15), data->text(BankText::Item)); sftd_draw_wtext_white(x+70, y, vPkm.item); x = 246; y = 147 - 15 - 2; sftd_draw_wtextf_white(x, (y += 15), L"%S %S", data->text(BankText::HiddenPower), vPkm.hpType); sftd_draw_wtext_white(x, (y += 15), data->text(BankText::Moves)); sftd_draw_wtext_white(x+10, (y += 15), vPkm.moves[0]); sftd_draw_wtext_white(x+10, (y += 15), vPkm.moves[1]); sftd_draw_wtext_white(x+10, (y += 15), vPkm.moves[2]); sftd_draw_wtext_white(x+10, (y += 15), vPkm.moves[3]); drawPokemonScale(vPkm.pkm, 256, 36, 3.0f); if (vPkm.pkm->isShiny) { sf2d_draw_texture_part(PHBanku::texture->boxTiles, 240, 135, 54, 64, 9, 9); } if (vPkm.isCured) { sf2d_draw_texture_part(PHBanku::texture->boxTiles, 260, 135, 72, 64, 9, 9); } else if (vPkm.isInfected) { sf2d_draw_texture_part(PHBanku::texture->boxTiles, 260, 135, 81, 64, 27, 9); } if (vPkm.gen > 0) { if (vPkm.gen == 6) // Kalos Born (Gen VI) sf2d_draw_texture_part(PHBanku::texture->boxTiles, 250, 135, 63, 64, 9, 9); else if (vPkm.gen == 5) // Gen V sf2d_draw_texture_part(PHBanku::texture->boxTiles, 250, 135, 72, 73, 9, 9); else if (vPkm.gen == 4) // Gen IV sf2d_draw_texture_part(PHBanku::texture->boxTiles, 250, 135, 63, 73, 9, 9); else if (vPkm.gen == 3) // Gen III sf2d_draw_texture_part(PHBanku::texture->boxTiles, 250, 135, 54, 73, 9, 9); } sf2d_draw_texture_part(PHBanku::texture->boxTiles, 290 ,135, 9*0, 64 + 9*vPkm.circle, 9, 9); sf2d_draw_texture_part(PHBanku::texture->boxTiles, 300 ,135, 9*1, 64 + 9*vPkm.triangle, 9, 9); sf2d_draw_texture_part(PHBanku::texture->boxTiles, 310 ,135, 9*2, 64 + 9*vPkm.square, 9, 9); sf2d_draw_texture_part(PHBanku::texture->boxTiles, 320 ,135, 9*3, 64 + 9*vPkm.heart, 9, 9); sf2d_draw_texture_part(PHBanku::texture->boxTiles, 330 ,135, 9*4, 64 + 9*vPkm.star, 9, 9); sf2d_draw_texture_part(PHBanku::texture->boxTiles, 340 ,135, 9*5, 64 + 9*vPkm.diamond, 9, 9); } } if (hasOverlayChild()) { this->child->drawTopScreen(); } return SUCCESS_STEP; }
void renderTitle(int x, int y) { sf2d_draw_texture_part_scale(icons, (x - 26) << 1, y << 1, 0, 240, 104, 16, 2.0, 2.0); // MINICRAFT sf2d_draw_texture_part(icons, x + 48, y + 52, 104, 240, 152, 16); // 3DS HOMEBREW EDITION }
int8_t fontDrawSubchar8(int16_t x, int16_t y, char8_t c, FONT_Subchar8 i) { sf2d_draw_texture_part(fontGB, x, y, (c % 0x10) * CHAR_SIZE + (i % 4 % 2) * CHAR_SIZE / 2, (c / 0x10) * CHAR_SIZE + (i % 4 / 2) * CHAR_SIZE / 2, CHAR_SIZE / 2, CHAR_SIZE / 2); return CHAR_SIZE / 2; }