program CardGame;
const
SDL_WINDOW_SHOWN = 4;
SDL_RENDERER_ACCELLERATED = 2;
SDL_QUIT_EVENT = 256;
SDL_KEYDOWN = 768;
SDLK_ESCAPE = 27;
SDLK_1 = 49;
SDLK_2 = 50;
SDLK_3 = 51;
SDLK_RETURN = 13;
WIDTH = 1280;
HEIGHT = 720;
SCALE_W = 1280;
SCALE_H = 720;
MAX_CARDS = 10;
EXIT_FAILURE = 1;
title = 'Intuition Builder';
fontfile = 'font.ttf';
var
running: boolean;
event_type_result: integer;
window_id, renderer, target_id: integer;
font_id: integer;
key: integer;
deck: array[0..9] of integer;
deck_index: integer;
game_over: boolean;
next_input: boolean;
correct: integer;
draw_card: integer;
game_string: string;
psychic_string: string;
card_back, card1, card2, card3: integer;
delay_timer: integer;
delay_active: boolean;
procedure init_deck();
var
i: integer;
begin
for i := 0 to MAX_CARDS - 1 do
deck[i] := (rand() mod 3) + 1;
deck_index := 0;
end;
function cur_card(): integer;
begin
if deck_index < MAX_CARDS then
cur_card := deck[deck_index]
else
cur_card := 0;
end;
function gen_rating(): string;
begin
if correct = 0 then
gen_rating := 'You either have bad luck or things just are not going your way to score zero.'
else if correct <= 3 then
gen_rating := 'You are an average player with little psychic abilities.'
else if correct <= 6 then
gen_rating := 'You are above average with some mild psychic abilities.'
else if correct <= 8 then
gen_rating := 'You are experienced and know what you are doing.'
else
gen_rating := 'You are Psychic.';
end;
procedure advance_card();
begin
draw_card := 0;
next_input := true;
deck_index := deck_index + 1;
if deck_index > MAX_CARDS - 1 then
begin
game_string := 'Game Over Your Score: ' + inttostr(correct) + '/' + inttostr(MAX_CARDS) + ' - [Press Enter for New Game]';
game_over := true;
psychic_string := gen_rating();
end
else
game_string := 'Guess 1-3 by pressing 1-3 keys ' + inttostr(deck_index + 1) + '/' + inttostr(MAX_CARDS);
end;
procedure handle_guess(guess: integer);
var
card: integer;
begin
card := cur_card();
if card = guess then
begin
correct := correct + 1;
game_string := 'Correct! Your Mental Intuition was correct.';
end
else
game_string := 'Incorrect! Your Mental Intuition was incorrect.';
draw_card := card;
next_input := false;
delay_active := true;
delay_timer := sdl_get_ticks();
end;
procedure handle_key(k: integer);
begin
if next_input = false then exit;
if game_over = true then
begin
if k = SDLK_RETURN then
begin
game_over := false;
init_deck();
correct := 0;
draw_card := 0;
psychic_string := '';
game_string := 'Guess 1-3 by pressing 1-3 keys ' + inttostr(deck_index + 1) + '/' + inttostr(MAX_CARDS);
end;
end
else
begin
if k = SDLK_1 then handle_guess(1)
else if k = SDLK_2 then handle_guess(2)
else if k = SDLK_3 then handle_guess(3);
end;
end;
procedure draw_background();
var
row, col: integer;
shade: integer;
begin
{ Dark green felt base }
sdl_set_draw_color(renderer, 20, 70, 35, 255);
sdl_fill_rect(renderer, 0, 0, SCALE_W, SCALE_H);
{ Subtle diamond pattern }
sdl_set_draw_color(renderer, 25, 80, 40, 255);
row := 0;
while row < SCALE_H do
begin
col := 0;
if (row mod 64) = 32 then col := 32;
while col < SCALE_W do
begin
sdl_fill_rect(renderer, col, row, 30, 30);
col := col + 64;
end;
row := row + 32;
end;
{ Top bar }
sdl_set_draw_color(renderer, 40, 25, 15, 255);
sdl_fill_rect(renderer, 0, 0, SCALE_W, 55);
{ Bottom bar }
sdl_set_draw_color(renderer, 40, 25, 15, 255);
sdl_fill_rect(renderer, 0, SCALE_H - 30, SCALE_W, 30);
{ Gold trim lines }
sdl_set_draw_color(renderer, 180, 140, 60, 255);
sdl_fill_rect(renderer, 0, 55, SCALE_W, 2);
sdl_fill_rect(renderer, 0, SCALE_H - 30, SCALE_W, 2);
end;
procedure render();
var
i, x_pos: integer;
card_tex: integer;
card_w, card_h: integer;
begin
card_w := 160;
card_h := 240;
sdl_set_render_target(renderer, target_id);
draw_background();
sdl_draw_text(renderer, font_id, 'Intuition Builder', 25, 15, 220, 190, 120, 255);
sdl_draw_text(renderer, font_id, game_string, 280, 15, 255, 255, 255, 255);
{ Draw deck stack }
x_pos := 80;
for i := 0 to (MAX_CARDS - deck_index) - 1 do
begin
sdl_render_texture(renderer, card_back, -1, -1, -1, -1, x_pos, 100, card_w, card_h);
x_pos := x_pos + 18;
end;
{ Draw revealed card }
if draw_card <> 0 then
begin
if draw_card = 1 then card_tex := card1
else if draw_card = 2 then card_tex := card2
else card_tex := card3;
sdl_render_texture(renderer, card_tex, -1, -1, -1, -1, 800, 100, card_w, card_h);
end;
{ Game over rating }
if game_over = true then
begin
sdl_set_draw_color(renderer, 0, 0, 0, 160);
sdl_fill_rect(renderer, 100, 400, SCALE_W - 200, 60);
sdl_draw_text(renderer, font_id, psychic_string, 130, 415, 255, 80, 80, 255);
end;
end;
procedure setup();
var
result: integer;
begin
result := sdl_init();
if result <> 0 then
begin
writeln('failed to init SDL');
halt(EXIT_FAILURE);
end;
window_id := sdl_create_window(title, 100, 100, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if window_id = -1 then
begin
writeln('Could not create window');
sdl_quit();
halt(EXIT_FAILURE);
end;
renderer := sdl_create_renderer(window_id, -1, SDL_RENDERER_ACCELLERATED);
if renderer = -1 then
begin
writeln('could not create renderer');
sdl_destroy_window(window_id);
sdl_quit();
halt(EXIT_FAILURE);
end;
target_id := sdl_create_render_target(renderer, SCALE_W, SCALE_H);
if target_id = -1 then
begin
writeln('could not create render target');
sdl_destroy_renderer(renderer);
sdl_destroy_window(window_id);
sdl_quit();
halt(EXIT_FAILURE);
end;
if sdl_init_text() <> 1 then
begin
writeln('Font subsystem failed to load');
halt(EXIT_FAILURE);
end;
font_id := sdl_load_font(fontfile, 24);
if font_id = -1 then
begin
writeln('failed to open: ', fontfile);
halt(EXIT_FAILURE);
end;
card_back := sdl_load_texture(renderer, 'cardback.bmp');
card1 := sdl_load_texture(renderer, 'card1.bmp');
card2 := sdl_load_texture(renderer, 'card2.bmp');
card3 := sdl_load_texture(renderer, 'card3.bmp');
if (card_back = -1) or (card1 = -1) or (card2 = -1) or (card3 = -1) then
begin
writeln('failed to load card textures');
halt(EXIT_FAILURE);
end;
seed_random();
init_deck();
correct := 0;
draw_card := 0;
next_input := true;
game_over := false;
delay_active := false;
psychic_string := '';
game_string := 'Guess 1-3 by pressing 1-3 keys ' + inttostr(deck_index + 1) + '/' + inttostr(MAX_CARDS);
end;
procedure cleanup();
begin
sdl_destroy_texture(card_back);
sdl_destroy_texture(card1);
sdl_destroy_texture(card2);
sdl_destroy_texture(card3);
sdl_destroy_render_target(target_id);
sdl_destroy_renderer(renderer);
sdl_destroy_window(window_id);
sdl_quit_text();
sdl_quit();
end;
begin
setup();
running := true;
while running = true do
begin
while sdl_poll_event() <> 0 do
begin
event_type_result := sdl_get_event_type();
if event_type_result = SDL_QUIT_EVENT then running := false;
if event_type_result = SDL_KEYDOWN then
begin
key := sdl_get_key_code();
if key = SDLK_ESCAPE then running := false
else handle_key(key);
end;
end;
if delay_active = true then
begin
if (sdl_get_ticks() - delay_timer) >= 3000 then
begin
delay_active := false;
advance_card();
end;
end;
render();
sdl_present_scaled(renderer, target_id, WIDTH, HEIGHT);
sdl_delay(16);
end;
cleanup();
end.