1 Intro: 1:01
2 Importing assets and why pool?: 1:57
3 Setting up Billiard Table and import settings: 12:07
4 Reorganizing FileSystem structure: 2:55
5 Basic lighting and explaining 3D axes: 9:35
6 Setting up the Ball scene: 7:59
7 Auto-generating collision shapes versus making one manually: 10:58
8 Assigning material textures in the Inspector: 5:54
9 Assigning texture in the code: 12:35
10 Creating a unique material to fix shared references: 5:03
11 Deciding on how we should approach our gameplay system: 6:08
12 Setting up the play system and deciding on what script hits the ball: 6:05
13 Starting play system code with shooting the ball: 8:59
14 Aiming and stick system nodes 1 - fixing import orientation: 10:01
15 Aiming and stick system nodes 2 - positioning camera and stick: 2:34
16 Aiming and stick system nodes 3 - rotating around the ball: 6:39
17 Rotating around ball in code and understanding light versus heavy decisions 10:54
18 Organizing code with subroutines and hiding and fixing the mouse: 4:39
19 Aiming and stick system nodes 4 - manipulating nodes to optimize local space: 13:22
20 Moving stick within clamped positions in code: 9:49
21 Strongly typing, static typing, and the walrus operator: 5:29
22 Understanding basis to shoot the ball in the aim direction: 14:37
23 Using AnimationPlayer to tween stick shooting animation: 9:00
24 Hitting ball at the end of the animation: 7:16
25 Having variable starting animation key: 4:52
26 Communicating between different systems using custom signals: 14:29
27 Creating wall colliders for the playing surface: 13:27
28 Correcting bounce and deceleration with PhysicsMaterial and damping: 8:00
29 Implementing variable shot power using lerp: 20:30
30 Preventing wall clipping with physics step vs continuous collision detection: 9:22
31 Global values as class constants vs static variables vs object references: 21:39
32 Spawning balls and assigning respective textures in the code: 21:33
33 Procedurally spawning the balls in a triangular ball rack: 20:36
34 Using enumerators to establish ball types: 14:15
35 Setting a maximum y velocity to keep balls on the table surface: 5:13
36 Starting the gameplay finite state machine, booleans vs enums vs state pattern: 15:04
37 Deciding on way to check if all balls have stopped, for readability and scalability: 21:03
38 Establishing a readable, scalable system for processing the game rules: 9:44
39 Completing a player's turn with signals: 7:00
40 Considering which systems should set the play state: 6:36
41 Creating dynamic resources for sharing state instead of a global singleton: 8:27
42 Implementing the new game state resource to share state between systems: 9:29
43 Setting up the scene for table pockets: 6:37
44 Handling what happens when a ball has been potted by checking object identity: 17:14
45 Devising a cheat mode to make testing ball pocket rule test mechanics easier: 9:23
46 Working with physics engine quirky properties to stop a ball: 4:23
47 Setting up the HUD label nodes system and shared saved TextSettings: 9:06
48 Using a setter to emit whenever the play state has changed, and updating text: 15:01
49 Nested classes and subclasses to store what happened during a shot: 14:36
50 Setting up processing if a solid or stripes ball was potted during a shot: 6:55
51 Devising how to communicate which player is solids and which is stripes: 6:23
52 Forcing Godot to update to recognize new enum values 1:08
53 Checking and setting player suits while using some programming tricks: 16:35
54 Making rules process only under the correct state and with fresh occurrences: 6:07
55 Showing player suit in HUD by extracting the string names of the BallType enum: 9:19
56 Allowing player to keep their turn if they hit in a ball of their suit: 7:22
57 Setting up fouls and a placeholder for ball-in-hand mode, with basic debugging: 11:56
58 Tracking down and fixing a race condition by deferring a function call: 9:17
59 Using lambda functions to handle irregular cases of code execution: 5:05
60 Making ball hittable after going back on table, and forcing turn change on foul: 6:14
61 Devising simple and flexible way to keep track of balls remaining per player: 5:30
62 Setting up win condition by checking eight ball potting and balls remaining: 4:32
63 Handling game ended without bloating game state, and displaying result: 9:04
64 Fix bugs and wrap up game ran out of characters for timestamps: 13:52
65 Thank you!: