2025-02-26 20:05:31 -05:00
// Copyright 2025 Bill Rossi
//
// This file is part of Hanafuda Hachi-Hachi.
//
// Hanafuda Hachi-Hachi is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
//
// Hanafuda Hachi-Hachi is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with Hanafuda Hachi-Hachi. If not, see <https://www.gnu.org/licenses/>.
2025-02-23 21:26:22 -05:00
# include <stdio.h>
# include <stdlib.h>
2025-02-23 18:07:57 -05:00
# include "title.h"
2025-02-23 18:35:11 -05:00
void initialize_title ( Game * g ) {
g - > title = malloc ( sizeof ( Title ) ) ;
Image rules_qr_img = LoadImage ( " img/rules_qr.png " ) ;
g - > title - > rules_qr = LoadTextureFromImage ( rules_qr_img ) ;
UnloadImage ( rules_qr_img ) ;
}
2025-02-23 18:07:57 -05:00
void title_handle_click_start ( Game * g ) {
2025-02-25 05:29:50 -05:00
for ( int i = 0 ; i < 48 ; i + + ) {
g - > cards [ i ] . move . end_time = 0. ;
}
2025-02-23 18:07:57 -05:00
g - > state = GAME_STATE_INITIALIZING ;
}
void title_handle_click_options ( Game * g ) {
g - > state = GAME_STATE_OPTIONS ;
}
void title_handle_click_quit ( Game * g ) {
g - > should_close = true ;
}
Vector2 tmp ; // stands for "title mouse position"
void title_handle_input ( Game * g ) {
tmp = GetMousePosition ( ) ;
Title * t = g - > title ;
t - > hover_start = false ;
t - > hover_options = false ;
t - > hover_quit = false ;
t - > hover_credits = false ;
t - > hover_rules = false ;
int half_start_width = MeasureText ( " Start " , 60 ) / 2 ;
if ( tmp . x > 700 - half_start_width & & tmp . x < 700 + half_start_width & & tmp . y > 350 & & tmp . y < 410 ) {
t - > hover_start = true ;
if ( IsMouseButtonPressed ( 0 ) ) title_handle_click_start ( g ) ;
}
int half_options_width = MeasureText ( " Options " , 60 ) / 2 ;
if ( tmp . x > 700 - half_options_width & & tmp . x < 700 + half_options_width & & tmp . y > 500 & & tmp . y < 560 ) {
t - > hover_options = true ;
if ( IsMouseButtonPressed ( 0 ) ) title_handle_click_options ( g ) ;
}
int half_quit_width = MeasureText ( " Quit " , 60 ) / 2 ;
if ( tmp . x > 700 - half_quit_width & & tmp . x < 700 + half_quit_width & & tmp . y > 650 & & tmp . y < 710 ) {
t - > hover_quit = true ;
if ( IsMouseButtonPressed ( 0 ) ) title_handle_click_quit ( g ) ;
}
int half_credits_width = MeasureText ( " Credits " , 40 ) / 2 ;
if ( tmp . x > 1100 - half_credits_width & & tmp . x < 1100 + half_credits_width & & tmp . y > 600 & & tmp . y < 640 ) t - > hover_credits = true ;
int half_rules_width = MeasureText ( " Rules " , 40 ) / 2 ;
if ( tmp . x > 300 - half_rules_width & & tmp . x < 300 + half_rules_width & & tmp . y > 600 & & tmp . y < 640 ) t - > hover_rules = true ;
2025-02-23 21:26:22 -05:00
}
void title_fly_card ( Game * g , Card * card ) {
int x , y ;
switch ( ( int ) rand ( ) % 4 ) {
case 0 :
x = ( rand ( ) % 1600 ) - 100 ;
y = - 100 ;
break ;
case 1 :
x = ( rand ( ) % 1600 ) - 100 ;
y = 1000 ;
break ;
case 2 :
x = - 100 ;
y = ( rand ( ) % 1100 ) - 100 ; ;
break ;
case 3 :
x = 1500 ;
y = ( rand ( ) % 1100 ) - 100 ; ;
break ;
}
card - > position . x = x ;
card - > position . y = y ;
Move * move = & card - > move ;
move - > position - > x = x ;
move - > position - > y = y ;
move - > origin . x = x ;
move - > origin . y = y ;
2025-02-23 18:07:57 -05:00
2025-02-23 21:26:22 -05:00
switch ( ( int ) rand ( ) % 4 ) {
case 0 :
x = ( rand ( ) % 1600 ) - 100 ;
y = - 100 ;
break ;
case 1 :
x = ( rand ( ) % 1600 ) - 100 ;
y = 1000 ;
break ;
case 2 :
x = - 100 ;
y = ( rand ( ) % 1100 ) - 100 ; ;
break ;
case 3 :
x = 1500 ;
y = ( rand ( ) % 1100 ) - 100 ; ;
break ;
}
move - > destination . x = x ;
move - > destination . y = y ;
move - > curve = CURVE_LINEAR ;
move - > current_time = 0. ;
move - > end_time = ( rand ( ) % 5 ) + 1 ;
}
void run_frame_title ( Game * g ) {
if ( rand ( ) % 20 > 3 ) return ;
Card * card = NULL ;
for ( int i = 0 ; i < 48 ; i + + ) {
int index = rand ( ) % 48 ;
if ( g - > cards [ index ] . move . current_time > g - > cards [ index ] . move . end_time ) {
card = & g - > cards [ index ] ;
break ;
}
}
if ( ! card ) return ;
title_fly_card ( g , card ) ;
}
Texture * cards_texture_fun2 ( Game * g ) {
return g - > black_card_backs ? & g - > cards_texture_black : & g - > cards_texture_red ;
2025-02-23 18:07:57 -05:00
}
void title_draw ( Game * g ) {
2025-02-23 21:26:22 -05:00
for ( int i = 0 ; i < 48 ; i + + ) {
g - > cards [ i ] . visible = true ;
draw_card ( & g - > cards [ i ] , cards_texture_fun2 ( g ) , g - > black_card_backs ) ;
}
2025-02-23 18:07:57 -05:00
Title * t = g - > title ;
DrawTextCentered ( " Hanafuda Hachi-Hachi " , 700 , 100 , 90 , BLACK ) ;
DrawTextCentered ( " Start " , 700 , 350 , 60 , t - > hover_start ? RED : BLACK ) ;
DrawTextCentered ( " Options " , 700 , 500 , 60 , t - > hover_options ? RED : BLACK ) ;
DrawTextCentered ( " Quit " , 700 , 650 , 60 , t - > hover_quit ? RED : BLACK ) ;
2025-02-23 18:35:11 -05:00
DrawTextCentered ( " Credits " , 1100 , 600 , 40 , BLACK ) ;
DrawTextCentered ( " Rules " , 300 , 600 , 40 , BLACK ) ;
if ( t - > hover_rules ) DrawTextureEx ( t - > rules_qr , ( Vector2 ) { 135 , 250 } , 0. , 3. , WHITE ) ;
if ( t - > hover_credits ) {
DrawRectangle ( 870 , 200 , 460 , 380 , BLACK ) ;
DrawRectangle ( 873 , 203 , 454 , 374 , WHITE ) ;
DrawTextCentered ( " Programmed by bassguitarbill " , 1100 , 210 , 25 , BLACK ) ;
DrawTextCentered ( " https://bassguitarbill.rocks " , 1100 , 240 , 25 , BLACK ) ;
DrawTextCentered ( " Running on raylib " , 1100 , 310 , 25 , BLACK ) ;
DrawTextCentered ( " https://www.raylib.com " , 1100 , 340 , 25 , BLACK ) ;
DrawTextCentered ( " Drawn with Aseprite " , 1100 , 410 , 25 , BLACK ) ;
DrawTextCentered ( " https://www.aseprite.org " , 1100 , 440 , 25 , BLACK ) ;
DrawTextCentered ( " Art adapted from Louiemantia " , 1100 , 510 , 25 , BLACK ) ;
DrawTextCentered ( " https://commons.wikimedia.org/wiki/User:Louiemantia " , 1100 , 540 , 18 , BLACK ) ;
}
2025-02-23 18:07:57 -05:00
}