Under Construction
Skip to content

Goal ​

Goal on a phone

Pick your odds and take the shot.

Designer
player1
RTP
97.00%
State
polishing
Play Goal →

Opens 97 Plus in demo mode: virtual credits, no sign-up.

How it plays ​

Details to come.

Original Design document ​

Created 15 July 2026 · Last modified 26 September 2026

Game design may differ from the content below.

Let's call the game "Goal"

In this game a soccer goal is represented with a goalie in the main game play area. The player places a bet by kicking a ball. The goalie dives for the ball and catches it or misses. Round based like Mines: successive kicks climb a cash-out ladder; a save ends the round at 0.

RTP 97% (tile rtp "97.0"). Big win at bigWinMultiplier 2 (tiles.json). Scene bg GOAL_SCENE_BG, alt colour GOAL_ALT (aim dot + goal flash).

FIELD (GoalField.ts, a fixed 460×340 design space scaled into the play area): The goal is near the top centre ("assets/goal_assets/goal.png"), the goalie (multi-frame sprites) stands in front of it. Near the bottom are 5 small white circles, evenly spaced. Each is a toggle: circle (the ball may roam here) or cross (skipped). Circles can only be toggled in IDLE, and at least one circle must remain. The pattern is cosmetic - it is stored in the round's start config for history replay and does not affect the maths. The ball is hidden until a prompt begins.

IDLE: The playButton shows the bet and is enabled. The message reads "kick for <first-rung win>", the small message "goal odds: 7 in 10". The goalie sways a few px left/right.

GAME PLAY (two-step arm):

  1. Press play to arm. The play button disables, the message says "tap the goal to shoot". The prompt begins: the ball (200% scale) snaps between the active circles every 0.5 s and the goal flashes red twice every 2 s.
  2. Tap the goal mouth. A red dot appears on the touch point immediately and the ball stops. After the client-server exchange (requestPlay deducts the bet, then the kick) the ball flies on a curved path to the red dot, scaling down to mimic 3D. The goalie dives - a save lands its hands on the ball, a goal dives the wrong way. The aim point is sent with the kick but is cosmetic. Auto-Kick (Options switch, off by default, persisted): pressing play skips step 1's prompt and takes the first kick at a random aim point straight away. Later kicks in the round are still tapped. On a save: "SAVED!", round over. On a goal: "GOAL!". The playButton turns into the green CASH button showing the current cash-out value, and the prompt starts again. The player can tap the goal to kick again (no arm step mid-round) or press CASH. The small message shows "kick for <next-rung win>". The ladder has 15 rungs; scoring all 15 auto-wins ("MAX WIN!"). If the next rung would pay more than the max-win limit, the round is cashed out automatically ("max win limit reached").

Maths (GoalEngine.ts):

  • The player picks per-kick score odds in Options ("Score Odds": 1 in 10 ... 9 in 10, default 7 in 10; persisted).
  • Each kick is one uniform integer draw in [0, den); it scores when the draw < num, so P(score) = num/den exactly.
  • The ladder is derived from the odds so every cash-out rung pays 97%: rung k = 0.97 × (den/num)^k, stored to 4 dp (15 rungs). e.g. at 7 in 10: 1.3857x, 1.9796x, 2.8280x, ...
  • Score odds are validated server-side: num and den must be integers with 1 ≤ num < den ≤ 100, and a live round may only use an option from the offered SCORE_ODDS table - anything else throws "Goal: invalid score odds". (The sim accepts any well-formed odds.)
  • startRound draws nothing; a cash-out pays bet × the current rung. Selections: { aimX, aimY } kicks, { type: 'cashout' } cashes out.
  • The usual host rules apply: requestPlay is refused while a round is unresolved and changeBet mid-round; quitting mid-round cashes out.

Recovery: an unresolved round on load shows the "game in progress" popup and resumes at the goal prompt with the banked cash value. A failed kick or cash-out resumes the round the same way.

Autoplay: Number of Games, Turbo, Goals per Round (1-7, default 3), Stop on Win / Loss, On Win / On Loss bet step. Each round aims randomly and cashes out after the target goals.

Dev menu: Force Win / Force Loss toggles (cheat seed), Maths Sim (1mil, autoplay goal target at the current odds). Generic Force Win is excluded.

Sounds: kick, crowd cheer on a goal, groan on a save.

bg col: 2925ea