1size 680 460
2background #1d1530
3
4// `reveal … erase` : la carte se gratte VRAIMENT sous le doigt — le moteur efface le cache là où il a été
5// frotté, sans masque ni grille à dessiner. Un pinceau étroit et un grain fin (`brush`, `grain`) donnent
6// un bord net, celui d'une pièce qui gratte. `vu` dit la part grattée ; passé les quatre cinquièmes, les
7// derniers copeaux tombent d'un coup et le lot se met à briller.
8var vu = 0
9var fini = 0
10var tfin = -99
11
12scene {
13 layer "Fond" {
14 rect 0 0 680 460 fill radial(0.5, 0.4, 0.7, 0:#3a2a52, 1:#160f24)
15 rect 40 36 600 340 18 fill #00000040
16 }
17 layer "Prix" {
18 rect 40 36 600 340 18 fill linear(120, 0:#fff7e6, 1:#ffe0b0)
19 group "Rayons" at 0,0 clip 46 42 588 328 nohit { layer "c" {
20 repeat i from 0 to 11 { path "M340 206 L$(340 + 420 * cos(i * 0.5236 - 0.08)) $(206 + 420 * sin(i * 0.5236 - 0.08)) L$(340 + 420 * cos(i * 0.5236 + 0.08)) $(206 + 420 * sin(i * 0.5236 + 0.08)) Z" fill #ffcf4d opacity 0.22 }
21 } }
22 rect 40 36 600 340 18 nofill stroke #e8b55a 3
23 group "Medaille" at 340,170 pivot 0,0 {
24 layer "c" {
25 path "M-36 44 L-54 104 L-28 92 L-14 114 L2 56 Z" fill #d8483a
26 path "M36 44 L54 104 L28 92 L14 114 L-2 56 Z" fill #b8352a
27 circle 0 0 84 fill radial(0.42, 0.36, 0.7, 0:#fff3b0, 0.5:#ffcf4d, 1:#e08a1e)
28 circle 0 0 66 nofill stroke #c97a18 3 dash 4,6
29 text "GAGNÉ" at -84,-30 font "Geist, system-ui, sans-serif" size 34 bold align center line 1.15 color #6b3a0e box 168 60 valign middle
30 }
31 }
32 text "un voyage pour deux !" at 140,312 font "Geist, system-ui, sans-serif" size 28 bold align center line 1.2 color #7a3f12 box 400 36
33 }
34 layer "Cache" {
35 group "Cache" at 340,206 pivot 0,0 {
36 layer "c" {
37 rect -300 -170 600 340 18 fill linear(120, 0:#d3dae5, 0.5:#a9b2c2, 1:#8a93a6)
38 repeat i from 0 to 29 { circle $(-280 + mod(i * 97, 560)) $(-150 + mod(i * 61, 300)) $(1.5 + mod(i, 3)) fill #ffffff opacity 0.35 }
39 text "★ à gratter ★" at -300,-170 font "Geist, system-ui, sans-serif" size 34 bold align center line 1.15 color #5a6172 box 600 340 valign middle
40 }
41 }
42 }
43 layer "Indice" {
44 text "gratte avec le doigt : {} %" as "Indice" at 140,406 font "Geist, system-ui, sans-serif" size 22 align center line 1.2 color #b9aed8 box 400 30 bind "round(vu * 100)"
45 }
46}
47
48object "Cache" {
49 reveal vu {
50 brush 34
51 grain 4
52 erase
53 }
54 opacity = fini ? 1 - clamp((clock - tfin) * 4, 0, 1) : 1
55}
56object "Medaille" {
57 rotationDeg = fini ? 6 * sin((clock - tfin) * 5) * max(0, 1 - (clock - tfin) * 0.4) : 0
58 scaleX = 1 + fini * 0.12 * pulse(tfin, 1)
59 scaleY = 1 + fini * 0.12 * pulse(tfin, 1)
60}
61
62every frame {
63 if vu >= 0.8 {
64 if fini == 0 {
65 fini = 1
66 tfin = clock
67 send "gratte"
68 }
69 }
70}