trueno/game/roule/roule.jai

126 lines
2.7 KiB
Plaintext

// #scope_file
random :: #import "Random";
Color :: enum {
RED;
BLACK;
GREEN;
};
RouleMode :: enum {
WAITING;
ANIMATING;
DONE;
};
Slot :: struct {
color : Color;
number : int;
};
RouleTable :: struct {
animStart : float = -1;
angle : float = 0;
slot : Slot = .{};
mode : RouleMode = .WAITING;
};
tableState : RouleTable;
rouleSlots : []Slot = .[
.{.GREEN, 0},
.{.RED, 32},
.{.BLACK, 15},
.{.RED, 19},
.{.BLACK, 4},
.{.RED, 21},
.{.BLACK, 2},
.{.RED, 25},
.{.BLACK, 17},
.{.RED, 34},
.{.BLACK, 6},
.{.RED, 27},
.{.BLACK, 13},
.{.RED, 36},
.{.BLACK, 11},
.{.RED, 30},
.{.BLACK, 8},
.{.RED, 23},
.{.BLACK, 10},
.{.RED, 5},
.{.BLACK, 24},
.{.RED, 16},
.{.BLACK, 33},
.{.RED, 1},
.{.BLACK, 20},
.{.RED, 14},
.{.BLACK, 31},
.{.RED, 9},
.{.BLACK, 22},
.{.RED, 18},
.{.BLACK, 29},
.{.RED, 7},
.{.BLACK, 28},
.{.RED, 12},
.{.BLACK, 35},
.{.RED, 3},
.{.BLACK, 26},
];
get_roll_result :: () -> (Slot, float) {
slot := random.random_get() % rouleSlots.count.(u64);
return rouleSlots[xx slot], slot.(float) / rouleSlots.count.(float);
}
wheel_tex : Ui_Texture;
base_tex : Ui_Texture;
ball_tex : Ui_Texture;
WHEEL_SIZE :: 3.5;
get_ball :: () -> (ball_size: float, ball_speed: float) {
if tableState.mode == .WAITING {
return 4.7, -20;
} else if tableState.mode == .ANIMATING {
return lerp(4.7, 3, min(1.0, get_time().(float) - tableState.animStart.(float))), -20;
}
}
#scope_export
table_roll :: () {
tableState.animStart = get_time().(float);
tableState.slot, tableState.angle = get_roll_result();
tableState.mode = .ANIMATING;
}
table_init :: () {
img := create_texture_from_pack("./game/resources/roule-spin.png");
wheel_tex.tex = img;
img = create_texture_from_pack("./game/resources/roule.png");
base_tex.tex = img;
img = create_texture_from_pack("./game/resources/roule-ball.png");
ball_tex.tex = img;
}
draw_table :: () {
w,h := get_window_size();
uw := ui_w(10,0);
ball_size, ball_speed := get_ball();
diff := ball_size * uw - WHEEL_SIZE * uw;
set_shader_for_images(*base_tex);
immediate_rect((5-(WHEEL_SIZE/2)) * uw, 50,WHEEL_SIZE*uw,WHEEL_SIZE*uw);
immediate_flush();
set_shader_for_images(*wheel_tex);
immediate_rect((5-(WHEEL_SIZE/2)) * uw, 50,WHEEL_SIZE*uw,WHEEL_SIZE*uw, cast(float) get_time());
immediate_flush();
set_shader_for_images(*ball_tex);
immediate_rect((5-(ball_size/2)) * uw, 50 - diff/2 ,ball_size*uw,ball_size*uw, cast(float) (ball_size * -1 * get_time()));
immediate_flush();
}