diff --git a/src/Audio.c b/src/Audio.c index c03169900..1fcba7845 100644 --- a/src/Audio.c +++ b/src/Audio.c @@ -886,9 +886,9 @@ static cc_result Sound_ReadWaveData(struct Stream* stream, struct Sound* snd) { if ((res = Stream_Read(stream, tmp, 12))) return res; fourCC = Stream_GetU32_BE(tmp + 0); - if (fourCC == WAV_FourCC('I', 'D', '3', 2)) return AUDIO_ERR_MP3_SIG; /* ID3 v2.2 tags header */ - if (fourCC == WAV_FourCC('I', 'D', '3', 3)) return AUDIO_ERR_MP3_SIG; /* ID3 v2.3 tags header */ - if (fourCC != WAV_FourCC('R','I','F','F')) return WAV_ERR_STREAM_HDR; + if (fourCC == WAV_FourCC('I','D','3', 2)) return AUDIO_ERR_MP3_SIG; /* ID3 v2.2 tags header */ + if (fourCC == WAV_FourCC('I','D','3', 3)) return AUDIO_ERR_MP3_SIG; /* ID3 v2.3 tags header */ + if (fourCC != WAV_FourCC('R','I','F','F')) return WAV_ERR_STREAM_HDR; /* tmp[4] (4) file size */ fourCC = Stream_GetU32_BE(tmp + 8); diff --git a/src/Screens.c b/src/Screens.c index 5d42b0936..55d1a181f 100644 --- a/src/Screens.c +++ b/src/Screens.c @@ -1396,9 +1396,40 @@ static struct InventoryScreen { Screen_Body struct FontDesc font; struct TableWidget table; + struct TextWidget desc; cc_bool releasedInv, deferredSelect; } InventoryScreen_Instance; + +static void InventoryScreen_MakeBlockDesc(cc_string* desc, BlockID block) { + cc_string name; + int block_ = block; + if (Game_PureClassic) { String_AppendConst(desc, "Select block"); return; } + if (block == BLOCK_AIR) return; + + name = Block_UNSAFE_GetName(block); + String_AppendString(desc, &name); + if (Game_ClassicMode) return; + + String_Format1(desc, " (ID %i&f", &block_); + if (!Blocks.CanPlace[block]) { String_AppendConst(desc, ", place &cNo&f"); } + if (!Blocks.CanDelete[block]) { String_AppendConst(desc, ", delete &cNo&f"); } + String_Append(desc, ')'); +} + +static void InventoryScreen_UpdateDesc(struct InventoryScreen* s, BlockID block) { + cc_string desc; char descBuffer[STRING_SIZE * 2]; + + String_InitArray(desc, descBuffer); + InventoryScreen_MakeBlockDesc(&desc, block); + TextWidget_Set(&s->desc, &desc, &s->font); +} + +static void InventoryScreen_OnUpdateDesc(BlockID block) { + InventoryScreen_UpdateDesc(&InventoryScreen_Instance, block); +} + + static void InventoryScreen_OnBlockChanged(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; TableWidget_OnInventoryChanged(&s->table); @@ -1408,6 +1439,7 @@ static void InventoryScreen_ContextLost(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; Font_Free(&s->font); Elem_Free(&s->table); + Elem_Free(&s->desc); } static void InventoryScreen_ContextRecreated(void* screen) { @@ -1426,16 +1458,17 @@ static void InventoryScreen_MoveToSelected(struct InventoryScreen* s) { s->deferredSelect = false; /* User is holding invalid block */ if (table->selectedIndex == -1) { - TableWidget_MakeDescTex(table, Inventory_SelectedBlock); + InventoryScreen_UpdateDesc(s, Inventory_SelectedBlock); } } static void InventoryScreen_Init(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; + TextWidget_Init(&s->desc); TableWidget_Create(&s->table); - s->table.font = &s->font; s->table.blocksPerRow = Inventory.BlocksPerRow; + s->table.UpdateDesc = InventoryScreen_OnUpdateDesc; TableWidget_RecreateBlocks(&s->table); /* Can't immediately move to selected here, because cursor grabbed */ @@ -1451,12 +1484,17 @@ static void InventoryScreen_Render(void* screen, double delta) { struct InventoryScreen* s = (struct InventoryScreen*)screen; if (s->deferredSelect) InventoryScreen_MoveToSelected(s); Elem_Render(&s->table, delta); + Elem_Render(&s->desc, delta); } static void InventoryScreen_Layout(void* screen) { struct InventoryScreen* s = (struct InventoryScreen*)screen; s->table.scale = Gui_GetInventoryScale(); Widget_Layout(&s->table); + + Widget_SetLocation(&s->desc, ANCHOR_CENTRE, ANCHOR_MIN, 0, 0); + s->desc.yOffset = s->table.y - s->desc.height - 3; + Widget_Layout(&s->desc); } static void InventoryScreen_Free(void* screen) { diff --git a/src/Widgets.c b/src/Widgets.c index be937987d..e2519b1d0 100644 --- a/src/Widgets.c +++ b/src/Widgets.c @@ -664,27 +664,6 @@ static void TableWidget_MoveCursorToSelected(struct TableWidget* w) { Cursor_SetPosition(x, y); } -static void TableWidget_MakeBlockDesc(struct TableWidget* w, cc_string* desc, BlockID block) { - cc_string name; - int block_ = block; - if (Game_PureClassic) { String_AppendConst(desc, "Select block"); return; } - if (block == BLOCK_AIR) return; - - name = Block_UNSAFE_GetName(block); - String_AppendString(desc, &name); - if (Game_ClassicMode) return; - - String_Format1(desc, " (ID %i&f", &block_); - if (!Blocks.CanPlace[block]) { String_AppendConst(desc, ", place &cNo&f"); } - if (!Blocks.CanDelete[block]) { String_AppendConst(desc, ", delete &cNo&f"); } - String_Append(desc, ')'); -} - -static void TableWidget_UpdateDescTexPos(struct TableWidget* w) { - w->descTex.X = w->x + w->width / 2 - w->descTex.Width / 2; - w->descTex.Y = w->y - w->descTex.Height - 5; -} - static void TableWidget_RecreateDescTex(struct TableWidget* w) { BlockID block; if (w->selectedIndex == w->lastCreatedIndex) return; @@ -692,21 +671,7 @@ static void TableWidget_RecreateDescTex(struct TableWidget* w) { w->lastCreatedIndex = w->selectedIndex; block = w->selectedIndex == -1 ? BLOCK_AIR : w->blocks[w->selectedIndex]; - TableWidget_MakeDescTex(w, block); -} - -void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block) { - cc_string desc; char descBuffer[STRING_SIZE * 2]; - struct DrawTextArgs args; - - Gfx_DeleteTexture(&w->descTex.ID); - String_InitArray(desc, descBuffer); - TableWidget_MakeBlockDesc(w, &desc, block); - if (!desc.length) return; - - DrawTextArgs_Make(&args, &desc, w->font, true); - Drawer2D_MakeTextTexture(&w->descTex, &args); - TableWidget_UpdateDescTexPos(w); + w->UpdateDesc(block); } void TableWidget_RecreateBlocks(struct TableWidget* w) { @@ -791,14 +756,11 @@ static void TableWidget_Render(void* widget, double delta) { x + cellSizeX / 2, y + cellSizeY / 2); } IsometricDrawer_EndBatch(); - - if (w->descTex.ID) { Texture_Render(&w->descTex); } } static void TableWidget_Free(void* widget) { struct TableWidget* w = (struct TableWidget*)widget; Gfx_DeleteDynamicVb(&w->vb); - Gfx_DeleteTexture(&w->descTex.ID); w->lastCreatedIndex = -1000; } @@ -824,7 +786,6 @@ static void TableWidget_Reposition(void* widget) { w->width = w->cellSizeX * w->blocksPerRow; w->height = w->cellSizeY * w->rowsVisible; Widget_CalcPosition(w); - TableWidget_UpdateDescTexPos(w); /* Does the table fit on screen? */ if (Game_ClassicMode || Table_Y(w) >= 0) break; diff --git a/src/Widgets.h b/src/Widgets.h index 0cd8ae903..de8c7acca 100644 --- a/src/Widgets.h +++ b/src/Widgets.h @@ -87,7 +87,6 @@ struct TableWidget { int blocksCount, blocksPerRow; int rowsTotal, rowsVisible; int lastCreatedIndex; - struct FontDesc* font; int selectedIndex, cellSizeX, cellSizeY; float selBlockExpand; GfxResourceID vb; @@ -96,9 +95,9 @@ struct TableWidget { BlockID blocks[BLOCK_COUNT]; struct ScrollbarWidget scroll; - struct Texture descTex; int lastX, lastY, paddingX; int paddingTopY, paddingMaxY; + void (*UpdateDesc)(BlockID block); }; CC_NOINLINE void TableWidget_Create(struct TableWidget* w); @@ -107,7 +106,6 @@ CC_NOINLINE void TableWidget_Create(struct TableWidget* w); CC_NOINLINE void TableWidget_SetBlockTo(struct TableWidget* w, BlockID block); CC_NOINLINE void TableWidget_RecreateBlocks(struct TableWidget* w); CC_NOINLINE void TableWidget_OnInventoryChanged(struct TableWidget* w); -CC_NOINLINE void TableWidget_MakeDescTex(struct TableWidget* w, BlockID block); CC_NOINLINE void TableWidget_Recreate(struct TableWidget* w);