feat: added rerolling and dice clearing

This commit is contained in:
Sara Gerretsen 2025-10-28 12:31:24 +01:00
parent 7adf2d9528
commit aa10c821f1
4 changed files with 46 additions and 17 deletions

View file

@ -31,6 +31,10 @@ void Remove(size_t at) {
--numActiveDice;
}
void Clear() {
numActiveDice = 0;
}
Die Get(size_t at) {
if(at < numActiveDice) {
return activeDice[at].type;

View file

@ -42,6 +42,7 @@ static inline size_t DieToIndex(Die die) {
namespace active_dice {
void Add(Die die);
void Remove(size_t at);
void Clear();
Die Get(size_t at);
uint8_t GetValue(size_t at);
size_t Count();

View file

@ -5,6 +5,7 @@
#include "renderer/ui_data.h"
#include <ceramic/elements.h>
#include <ceramic/resources.h>
#include <ceramic/style.h>
#include <clay/clay.h>
#include <cstdint>
@ -60,22 +61,25 @@ static void LoadDieImagesIfNeeded() {
}
static void DieButton(Die die, int32_t showNumber, Clay_Sizing size, cera::OnHoveredFn onHover, intptr_t data) {
static void DieButton(Die die, int32_t showNumber, Clay_Sizing size, uint16_t fontSize, cera::OnHoveredFn onHover, intptr_t data) {
size_t const index{DieToIndex(die)};
char resultStr[6]="";
int32_t len = SDL_snprintf(resultStr, 6, "%d", showNumber);
Clay_String string = UiData_StoreString(resultStr, len);
CLAY_AUTO_ID({
.layout = {
.sizing = {CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)},
.sizing = size,
.childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}
},
.image = {.imageData = Clay_Hovered() ? hoveredDieImages[index] : dieImages[index]}
}) {
Clay_OnHover(onHover, data);
cera::Header(string, 2, {
.textColor = cera::color::white
});
CLAY_TEXT(string, CLAY_TEXT_CONFIG({
.textColor = cera::theme->textColor,
.fontId = cera::FONT_BOLD,
.fontSize = fontSize,
.textAlignment = CLAY_TEXT_ALIGN_CENTER,
}));
}
}
@ -91,10 +95,23 @@ static void ActiveDieButtonHovered(Clay_ElementId element, Clay_PointerData poin
}
}
static void ClearDiceButtonHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) {
if(pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) {
active_dice::Clear();
}
}
static void RollDiceButtonHovered(Clay_ElementId element, Clay_PointerData pointer, intptr_t data) {
if(pointer.state == CLAY_POINTER_DATA_PRESSED_THIS_FRAME) {
active_dice::ReRoll();
}
}
void DiceContainer() {
LoadDieImagesIfNeeded();
Clay_Sizing const addDieButtonSize{CLAY_SIZING_FIXED(100), CLAY_SIZING_FIXED(100)};
uint16_t const addDieButtonTextSize{30};
CLAY(CLAY_ID("DiceSelector"), cera::PanelContainer({
.layout={
.sizing={CLAY_SIZING_FIT(), CLAY_SIZING_GROW()},
@ -112,26 +129,29 @@ void DiceContainer() {
.childOffset = Clay_GetScrollOffset(),
}
}) {
DieButton(D4, D4, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D4);
DieButton(D6, D6, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D6);
DieButton(D8, D8, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D8);
DieButton(D10, D10, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D10);
DieButton(D12, D12, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D12);
DieButton(D20, D20, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D20);
DieButton(D100, D100, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D100);
DieButton(D_COIN, D_COIN, addDieButtonSize, &AddDieButtonHovered, (intptr_t)D_COIN);
DieButton(D4, D4, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D4);
DieButton(D6, D6, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D6);
DieButton(D8, D8, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D8);
DieButton(D10, D10, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D10);
DieButton(D12, D12, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D12);
DieButton(D20, D20, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D20);
DieButton(D100, D100, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D100);
DieButton(D_COIN, D_COIN, addDieButtonSize, addDieButtonTextSize, &AddDieButtonHovered, (intptr_t)D_COIN);
}
}
Clay_Sizing const activeDieButtonSize{CLAY_SIZING_FIXED(200), CLAY_SIZING_FIXED(200)};
uint16_t const activeDieButtonTextSize{60};
CLAY(CLAY_ID("DiceActive"), cera::PanelContainer({
.layout={
.sizing={CLAY_SIZING_GROW(), CLAY_SIZING_GROW()},
.childAlignment={CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}
.childAlignment={CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER},
.layoutDirection = CLAY_TOP_TO_BOTTOM,
}
})) {
CLAY_AUTO_ID({
.layout = {
.sizing = {CLAY_SIZING_FIT(), CLAY_SIZING_FIT()},
.sizing = {CLAY_SIZING_FIT(), CLAY_SIZING_FIXED(200)},
.childAlignment = {CLAY_ALIGN_X_CENTER, CLAY_ALIGN_Y_CENTER}
},
.clip = {
.horizontal = true,
@ -140,8 +160,12 @@ void DiceContainer() {
},
}) {
for(size_t i{0}; i < active_dice::Count(); ++i) {
DieButton(active_dice::Get(i), active_dice::GetValue(i), activeDieButtonSize, &ActiveDieButtonHovered, (intptr_t)i);
DieButton(active_dice::Get(i), active_dice::GetValue(i), activeDieButtonSize, activeDieButtonTextSize, &ActiveDieButtonHovered, (intptr_t)i);
}
}
CLAY_AUTO_ID({.layout={.childGap=16}}) {
cera::TextButton(CLAY_STRING("Clear"), cera::theme->warningButton, &ClearDiceButtonHovered, 0);
cera::TextButton(CLAY_STRING("Reroll"), cera::theme->actionButton, &RollDiceButtonHovered, 0);
}
}
}

2
vendor/ceramic vendored

@ -1 +1 @@
Subproject commit 2dcdcd394c5b0c7e4875f965dfe789d3c71ad217
Subproject commit 46caec815bba908ecc45ba7fae0bbaeecba692d9