Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions apps_source_code/videopoker/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Changelog

## 1.4

- Add Up/Down press to double or halve the bet (replaces Up = all-in; all-in is still reachable by doubling past half the bank or wrapping Left at the minimum)
- Add Up/Down hold to bet half the bank
- Make Left/Right +/-$10 steps clamp cleanly when the bet is not a multiple of $10
- Fix the bet re-entering the betting screen below the table minimum after a low-bank win

## 1.3

- Version bump for catalog compatibility (no functional changes)

## 1.2

- Add all-in on Up press and bet wraparound on Left/Right
- Fix the game state mutex declaration

## 1.1

- Version bump for catalog compatibility (no functional changes)

## 1.0

- Initial release: Jacks or Better video poker with betting, hold selection and payouts
2 changes: 1 addition & 1 deletion apps_source_code/videopoker/application.fam
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ App(
fap_category="Games",
fap_author="@PixlEmly",
fap_weburl="https://github.com/PixlEmly",
fap_version="1.3",
fap_version="1.4",
fap_description="Video poker is a casino game based on five-card draw poker",
)
50 changes: 35 additions & 15 deletions apps_source_code/videopoker/poker.c
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ typedef struct {
int minbet;
} PokerPlayer;

/* GameState
/* GameState
0=Splash/help, OK button (later on up/down for rules or settings)
1=cards down, betting enabled, left/right to change bet, OK to confirm
1=cards down, betting enabled: left/right +/-10, up/down double/halve, hold up/down for half the bank, OK to confirm
2=first hand, holding enabled, left/right to pick card, OK to hold/unhold card, down to confirm
3=second hand, only confirm to claim rewards
4=game over/won
Expand Down Expand Up @@ -373,6 +373,12 @@ static int check_for_dupes(PokerPlayer* app) {
return 1;
}

/* Keep the bet between the table minimum and the player's bank (bank wins if it drops below the minimum) */
static void clamp_bet(PokerPlayer* app) {
if(app->bet < app->minbet) app->bet = app->minbet;
if(app->bet > app->score) app->bet = app->score;
}

/* Functions that recognize winning hands */

/*
Expand Down Expand Up @@ -585,7 +591,7 @@ void poker_draw_callback(Canvas* canvas, void* ctx) {
if(poker_player->GameState == 1) {
snprintf(buffer, sizeof(buffer), "Bet:%d", poker_player->bet);
canvas_draw_str_aligned(canvas, 0, 0, AlignLeft, AlignTop, buffer);
snprintf(buffer, sizeof(buffer), "<*> Place Bet");
snprintf(buffer, sizeof(buffer), "<^v*> Place Bet");
canvas_draw_str_aligned(canvas, 0, 9, AlignLeft, AlignTop, buffer);

for(int i = 0; i < 5; ++i) {
Expand Down Expand Up @@ -720,12 +726,6 @@ int32_t video_poker_app(void* p) {
if(status == FuriStatusOk) {
if(event.type == InputTypePress) {
switch(event.key) {
case InputKeyUp:
if(poker_player->GameState == 1) {
poker_player->bet = poker_player->score;
}
Shake();
break;
case InputKeyDown:
if(poker_player->GameState == 2) {
playcard(poker_player);
Expand All @@ -738,10 +738,12 @@ int32_t video_poker_app(void* p) {
break;
case InputKeyLeft:
if(poker_player->GameState == 1) {
if(poker_player->bet >= poker_player->minbet + 10) {
if(poker_player->bet - 10 >= poker_player->minbet) {
poker_player->bet -= 10;
} else if(poker_player->bet > poker_player->minbet) {
poker_player->bet = poker_player->minbet;
} else {
poker_player->bet = poker_player->score;
poker_player->bet = poker_player->score; /* wrap to all-in */
}
} else if(poker_player->selected > 0 && poker_player->GameState == 2) {
poker_player->selected--;
Expand All @@ -755,8 +757,9 @@ int32_t video_poker_app(void* p) {
if(poker_player->bet < poker_player->score) {
poker_player->bet += 10;
} else {
poker_player->bet = poker_player->minbet;
poker_player->bet = poker_player->minbet; /* wrap to minimum */
}
clamp_bet(poker_player);
}
if(poker_player->selected < 4 && poker_player->GameState == 2) {
poker_player->selected++;
Expand Down Expand Up @@ -787,9 +790,7 @@ int32_t video_poker_app(void* p) {
poker_player->bet * paytable[recognize(poker_player)];
}
poker_player->GameState = 1;
if(poker_player->bet > poker_player->score) {
poker_player->bet = poker_player->score;
}
clamp_bet(poker_player);
poker_player->held[0] = 0;
poker_player->held[1] = 0;
poker_player->held[2] = 0;
Expand Down Expand Up @@ -819,6 +820,25 @@ int32_t video_poker_app(void* p) {
default:
break;
}
} else if(event.type == InputTypeShort && poker_player->GameState == 1) {
/* Double or halve the bet */
if(event.key == InputKeyUp) {
if(poker_player->bet <= poker_player->score / 2) {
poker_player->bet *= 2;
} else {
poker_player->bet = poker_player->score;
}
} else if(event.key == InputKeyDown) {
poker_player->bet /= 2;
clamp_bet(poker_player);
}
} else if(event.type == InputTypeLong && poker_player->GameState == 1) {
/* Bet half the bank */
if(event.key == InputKeyUp || event.key == InputKeyDown) {
poker_player->bet = poker_player->score / 2;
clamp_bet(poker_player);
Shake();
}
}
}
furi_mutex_release(poker_player->model_mutex);
Expand Down
Loading