open Graphics ;;
Random.self_init () ;;
(* use Ctrl+F with 'WALUIGI_TIME' to look for sections *)
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Types + Constants *)
exception ReturnBool of bool ;;
exception ReturnInt of int ;;
exception ReturnIntArr of int array * int ;;
let khqoaeuvur = 1200
and ydpmbgdtos = 800 ;;
let xxtvdauymf = " 1200x800" ;;
let hwwkinuyju = 0.003 ;;
type pt_2d = {
mutable x : float ;
mutable y : float ;
} ;;
type polygon = {
vertexes : pt_2d array ;
rgb : int ;
xmin : float ;
xmax : float ;
ymin : float ;
ymax : float ;
mutable restitution : float ;
score : int ;
} ;;
type sphere = {
center : pt_2d ;
radius : float ;
rgb : int ;
xmin : float ;
xmax : float ;
ymin : float ;
ymax : float ;
mutable restitution : float ;
score : int ;
} ;;
type flipper_side = Left | Right ;;
type flipper = {
side : flipper_side ;
xy : pt_2d ;
radius : float ;
length : float ;
mutable theta : float (* in degrees *) ;
mutable dtheta : float ;
agmin : float ;
agmax : float ;
vtxs : polygon
} ;;
type ball = {
mutable active : bool ;
radius : float ;
mass : float ;
rgb : int ;
xy : pt_2d ;
v : pt_2d ;
a : pt_2d ;
fres : pt_2d ;
} ;;
(* --- *)
let suvesniybj = {
vertexes = [||] ;
rgb = 0 ;
xmin = 1. ;
xmax = -. 1. ;
ymin = 1. ;
ymax = -. 1. ;
restitution = 0. ;
score = 0 ;
} ;;
let blnwpctihp = {
center = {x = 0. ; y = 0.} ;
rgb = 0 ;
radius = -. 1. ;
xmin = 1. ;
xmax = -. 1. ;
ymin = 1. ;
ymax = -. 1. ;
restitution = 0. ;
score = 0 ;
} ;;
let klqsywgkdl = {
side = Left ;
xy = {x = 0. ; y = 0.} ;
radius = 0. ;
length = 0. ;
theta = 0. (* in degrees *) ;
dtheta = 0. ;
agmin = 0. ;
agmax = 0. ;
vtxs = suvesniybj ;
} ;;
let dvtuhryvdi = 750.0 ;;
let ouisbgnena = 3.14159265358979343 ;;
let lvyxllvhpy = (1. /. 131072.) ;;
let atimibvjlv = {
x = 0. ;
y = 0. ;
} ;;
let gwibfgeoyo = {
x = 1200. ;
y = 800. ;
}
let rsmybvbsus = {
x = 750. ;
y = 500. ;
}
let mxlcxxplnb = {x = 0. ; y = -. dvtuhryvdi} ;;
let ufmnpkhbse = ref 8 ;;
let score = ref 0 ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Threads *)
let slhhdrhgid = 8 ;;
let pkuqrbeauq = Array.make slhhdrhgid false ;;
let rkgsirelms = ref 0 ;;
let ghutvewblg id =
while false do
if pkuqrbeauq.(id) then begin
ignore (Unix.system "./sound wah/scored_hit.wav") ;
pkuqrbeauq.(id) <- false ;
end;
Unix.sleepf hwwkinuyju ;
done;;
let apchekncnf = Array.init slhhdrhgid (fun k -> Thread.create ghutvewblg k) ;;
(**)
let sfpqqquwvd () =
while false do
ignore (Unix.system "./sound wah/wah_metal.wav") ;
ignore (Unix.system "./sound wah/wah_eurobeat.wav") ;
ignore (Unix.system "./sound wah/wah_hardcore.wav") ;
done;;
let rynmlxnnea = Thread.create sfpqqquwvd () ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Arithmetical operations *)
let rec pqouljlqnm x n = match n with
| 0 -> 1
| 1 -> x
| k when k mod 2 = 0 -> pqouljlqnm (x*x) (n/2)
| k -> x * (pqouljlqnm (x*x) (n/2)) ;;
let rec venfkchenr x n = match n with
| 0 -> 1.
| 1 -> x
| k when k mod 2 = 0 -> venfkchenr (x *. x) (n/2)
| k -> x *. (venfkchenr (x *. x) (n/2)) ;;
let rec ewmqlkcvwl n = match n with
| k when k < 0 -> failwith "Are you sure about that ?"
| k when k < 10 -> 0
| k -> 1 + ewmqlkcvwl (k/10) ;;
let hutnqtagjr x y theta =
(1.0 -. theta) *. x +. theta *. y ;;
let pmodmwkwvl = function
| x when x < 0.0 -> -. x 
| x -> x ;;
let rec jcgvonjvkf = function
| k when float_of_int (int_of_float k) = k -> int_of_float k
| k -> jcgvonjvkf (10.0 *. k) ;;
let fbjwjbsrbx = function
| k when k < 10 -> 0
| _ -> 1 ;;
let gvhsmpxpat x n =
float_of_int (int_of_float (x *. venfkchenr 10. n)) /. (venfkchenr 10. n);;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Dynamic Arrays *)
type 'a dynamic = {
mutable len : int ;
mutable memlen : int ;
mutable tab : 'a array
} ;;
let infhrfotum (elt : 'a) =
{
len = 0 ;
memlen = 16 ;
tab = Array.make 16 elt
} ;;
let vyvjbxvwlb (dyn : 'a dynamic) (elt : 'a) =
if dyn.len = dyn.memlen then begin
let nbpuggglmq = Array.make (2 * dyn.memlen) dyn.tab.(0) in
for i = 0 to dyn.memlen -1 do
nbpuggglmq.(i) <- dyn.tab.(i)
done;
dyn.tab <- nbpuggglmq ;
dyn.memlen <- dyn.memlen * 2 ;
end;
dyn.tab.(dyn.len) <- elt ;
dyn.len <- dyn.len +1 ;;
let ylxpvecdry (dyn : 'a dynamic) (elt : 'a) =
try
for i = 0 to dyn.len -1 do
if dyn.tab.(i) = elt then
raise (ReturnInt i)
done;
raise (ReturnInt (-1))
with
| ReturnInt (-1) -> ()
| ReturnInt k ->
for i = k to dyn.len -2 do
dyn.tab.(i) <- dyn.tab.(i+1)
done;
dyn.len <- dyn.len -1 ;
if (dyn.memlen >= 32) && (dyn.len * 4 <= dyn.memlen) then begin
let nbpuggglmq = Array.make (dyn.memlen/2) dyn.tab.(0) in
for i = 0 to dyn.len -1 do
nbpuggglmq.(i) <- dyn.tab.(i)
done;
dyn.tab <- nbpuggglmq ;
dyn.memlen <- dyn.memlen/2 ;
end ;;
let vevglnifxn (f : 'b -> 'a -> 'b) (acc0 : 'b) (dyn : 'a dynamic) =
let dnofdwvumy = ref acc0 in
for i = 0 to dyn.len -1 do
dnofdwvumy := f !dnofdwvumy dyn.tab.(i)
done;
!dnofdwvumy ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Arithmetical operations *)
let snohtmrgum (px : pt_2d) (py : pt_2d) theta =
{
x = hutnqtagjr px.x py.x theta ;
y = hutnqtagjr px.y py.y theta ;
} ;;
let bejecdgusu (p1 : pt_2d) (p2 : pt_2d) =
{
x = p1.x +. p2.x ;
y = p1.y +. p2.y ;
} ;;
let igjujhpadn (p1 : pt_2d) (p2 : pt_2d) =
{
x = p1.x -. p2.x ;
y = p1.y -. p2.y ;
} ;;
let pfjkjpqxed (p1 : pt_2d) (lambda : float) =
{
x = p1.x *. lambda ;
y = p1.y *. lambda ;
} ;;
let ucukbrjotn (p1 : pt_2d) (p2 : pt_2d) =
{
x = (p1.x +. p2.x) /. 2.0 ;
y = (p1.y +. p2.y) /. 2.0 ;
} ;;
let maapulttqm (p1 : pt_2d) (p2 : pt_2d) =
{
x = -. (p2.y -. p1.y) ;
y = (p2.x -. p1.x) ;
} ;;
let mmqdncmyvk (m : pt_2d) (spt : pt_2d) (ept : pt_2d) =
match (-. ((ept.x -. spt.x) *. (spt.x -. m.x) +. (ept.y -. spt.y) *. (spt.y -. m.y)) /. ((ept.x -. spt.x) *. (ept.x -. spt.x) +. (ept.y -. spt.y) *. (ept.y -. spt.y))) with
| k when k >= 0. && k <= 1. -> (snohtmrgum spt ept k)
| k when k < 0. -> spt
| k -> ept ;;
let dtbxywqphy (m : pt_2d) (spt : pt_2d) (ept : pt_2d) =
let theta = (-. ((ept.x -. spt.x) *. (spt.x -. m.x) +. (ept.y -. spt.y) *. (spt.y -. m.y)) /. ((ept.x -. spt.x) *. (ept.x -. spt.x) +. (ept.y -. spt.y) *. (ept.y -. spt.y))) in
(snohtmrgum spt ept theta) ;;
let quuxfwmgkd (p1 : pt_2d) (p2 : pt_2d) =
p1.x *. p2.x +. p1.y *. p2.y ;;
let yfvqjtmemd (p1 : pt_2d) =
Float.sqrt (quuxfwmgkd p1 p1) ;;
let uaqehictpv (p1 : pt_2d) (p2 : pt_2d) =
yfvqjtmemd (igjujhpadn p1 p2) ;;
let pbrftxxxjk (v1 : pt_2d) (v2 : pt_2d) =
pfjkjpqxed v1 ((yfvqjtmemd v2) /. (yfvqjtmemd v1)) ;;
let aerhhxwwcs (v1 : pt_2d) =
pfjkjpqxed v1 (1.0 /. (yfvqjtmemd v1)) ;;
let kyqufjbqgy (m : pt_2d) (p1 : pt_2d) (p2 : pt_2d) =
let cqvkfwkyhr = dtbxywqphy m p1 p2 in
let pladpdsips = igjujhpadn cqvkfwkyhr m in
bejecdgusu (bejecdgusu pladpdsips pladpdsips) m ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Physics functions *)
let acscetgpxy (b : ball) (dt : float) =
{
x = b.xy.x +. b.v.x *. dt ;
y = b.xy.y +. b.v.y *. dt ;
} ;;
let ocboipiffc (b : ball) (poly : polygon) =
(b.xy.x +. b.radius >= poly.xmin) && (b.xy.x -. b.radius <= poly.xmax) &&
(b.xy.y +. b.radius >= poly.ymin) && (b.xy.y -. b.radius <= poly.ymax) ;;
let sbemaxpbld (b : ball) (s : sphere) =
(b.xy.x +. b.radius >= s.xmin) && (b.xy.x -. b.radius <= s.xmax) &&
(b.xy.y +. b.radius >= s.ymin) && (b.xy.y -. b.radius <= s.ymax) ;;
let fllowoegnu (m : pt_2d) (spt : pt_2d) (ept : pt_2d) =
match (-. ((ept.x -. spt.x) *. (spt.x -. m.x) +. (ept.y -. spt.y) *. (spt.y -. m.y)) /. ((ept.x -. spt.x) *. (ept.x -. spt.x) +. (ept.y -. spt.y) *. (ept.y -. spt.y))) with
| k when k >= 0. && k <= 1. -> uaqehictpv (snohtmrgum spt ept k) m
| k when k < 0. -> uaqehictpv spt m
| k -> uaqehictpv ept m ;;
let cxmkmqyagv (m : pt_2d) (spt : pt_2d) (ept : pt_2d) =
let theta = (-. ((ept.x -. spt.x) *. (spt.x -. m.x) +. (ept.y -. spt.y) *. (spt.y -. m.y)) /. ((ept.x -. spt.x) *. (ept.x -. spt.x) +. (ept.y -. spt.y) *. (ept.y -. spt.y))) in
uaqehictpv (snohtmrgum spt ept theta) m ;;
let tbxypwjsph (b : ball) (poly : polygon) (dt : float) =
if not (ocboipiffc b poly) then
([||], 0)
else begin
try
let tprvaqtfxn = ref b.radius
and guqrrsswri = Array.make 3 (-1)
and qxcksafkpf = ref 0 in
for i = 0 to Array.length poly.vertexes - 1 do
let qxdpdgqebc = (fllowoegnu (acscetgpxy b dt) poly.vertexes.(i) poly.vertexes.((i+1) mod Array.length poly.vertexes)) in
if qxdpdgqebc <= !tprvaqtfxn -. lvyxllvhpy then begin
tprvaqtfxn := qxdpdgqebc ;
guqrrsswri.(0) <- i ;
guqrrsswri.(1) <- (-1) ;
guqrrsswri.(2) <- (-1) ;
qxcksafkpf := 1;
end
else if qxdpdgqebc <= !tprvaqtfxn then begin
guqrrsswri.(!qxcksafkpf) <- i ;
incr qxcksafkpf ;
end
done;
raise (ReturnIntArr (guqrrsswri, !qxcksafkpf))
with
| ReturnIntArr (a, b) -> (a, b) 
| Invalid_argument _ -> failwith "ok then"
end ;;
let ghutvewblg () = 
pkuqrbeauq.(!rkgsirelms) <- true ;
rkgsirelms := (!rkgsirelms+1) mod slhhdrhgid ;;
let aqvohvorvs (b : ball) (s : sphere) (dt : float) =
if not (sbemaxpbld b s) then
false
else
uaqehictpv (acscetgpxy b dt) (s.center) <= (s.radius +. b.radius) ;;
let ffmvmahtvp (b : ball) (polys : polygon array) (spheres : sphere array) (flips : flipper dynamic) (dt : float) =
b.fres.x <- 0. ;
b.fres.y <- 0. ;
for p = 0 to (Array.length polys -1) do
let (ompbdarwgo, hitlen) = (tbxypwjsph b polys.(p) dt) in
if hitlen > 0 then begin
for h = 0 to hitlen -1 do
let iggdpgyaxj = ompbdarwgo.(h) in
score := !score + polys.(p).score ;
if h = 0 && polys.(p).score > 0 then
ghutvewblg () ;
if polys.(p).restitution = 0. then begin
b.active <- false ;
decr ufmnpkhbse ;
end;
(* apply normal reaction force *)
let pxkgfflejm = (iggdpgyaxj +1) mod (Array.length polys.(p).vertexes) in
let cqvkfwkyhr = mmqdncmyvk b.xy polys.(p).vertexes.(iggdpgyaxj) polys.(p).vertexes.(pxkgfflejm) in
let xaqqcssgyu = aerhhxwwcs (igjujhpadn b.xy cqvkfwkyhr) in
let gxyowcywlc = (quuxfwmgkd (aerhhxwwcs mxlcxxplnb) xaqqcssgyu) in
if gxyowcywlc > 0. then begin
let kkoitxjucy = pfjkjpqxed xaqqcssgyu (dvtuhryvdi *. b.mass *. gxyowcywlc) in
b.fres.x <- b.fres.x +. kkoitxjucy.x *. polys.(p).restitution /. float_of_int hitlen ;
b.fres.y <- b.fres.y +. kkoitxjucy.y *. polys.(p).restitution /. float_of_int hitlen ;
end;
(* change velocity according to angle *)
if hitlen = 1 then begin
let rseawtwpni = igjujhpadn polys.(p).vertexes.(pxkgfflejm) polys.(p).vertexes.(iggdpgyaxj) in
let htlsypempr = kyqufjbqgy b.v {x = 0. ; y = 0.} rseawtwpni in
b.v.x <- htlsypempr.x ;
b.v.y <- htlsypempr.y ;
end
else begin
let oysqudbrnj = pfjkjpqxed (aerhhxwwcs (igjujhpadn b.xy cqvkfwkyhr)) (yfvqjtmemd b.v) in
b.v.x <- oysqudbrnj.x ;
b.v.y <- oysqudbrnj.y ;
end
done
end
done ;
for s = 0 to (Array.length spheres -1) do
if aqvohvorvs b spheres.(s) dt then begin
score := !score + spheres.(s).score ;
if spheres.(s).score > 0 then
ghutvewblg () ;
if spheres.(s).restitution = 0. then begin
b.active <- false ;
decr ufmnpkhbse ;
end;
(* apply normal reaction force *)
let xaqqcssgyu = aerhhxwwcs (igjujhpadn b.xy spheres.(s).center) in
let gxyowcywlc = (quuxfwmgkd (aerhhxwwcs mxlcxxplnb) xaqqcssgyu) in
if gxyowcywlc > 0. then begin
let kkoitxjucy = pfjkjpqxed xaqqcssgyu (dvtuhryvdi *. b.mass *. gxyowcywlc) in
b.fres.x <- b.fres.x +. kkoitxjucy.x *. spheres.(s).restitution *. 1.1 ;
b.fres.y <- b.fres.y +. kkoitxjucy.y *. spheres.(s).restitution *. 1.1 ;
end;
(* change velocity according to angle *)
let theta = b.radius /. (yfvqjtmemd (igjujhpadn b.xy spheres.(s).center)) in
let uvvfdexeuk = (snohtmrgum b.xy spheres.(s).center theta) in
let rseawtwpni = maapulttqm uvvfdexeuk (bejecdgusu uvvfdexeuk xaqqcssgyu) in
let htlsypempr = kyqufjbqgy b.v {x = 0. ; y = 0.} rseawtwpni in
b.v.x <- htlsypempr.x ;
b.v.y <- htlsypempr.y ;
end
done ;
for f = 0 to flips.len -1 do
let (ompbdarwgo, hitlen) = (tbxypwjsph b flips.tab.(f).vtxs dt) in
if hitlen > 0 then begin
for h = 0 to hitlen -1 do
let iggdpgyaxj = ompbdarwgo.(h) in
(* apply normal reaction force *)
let pxkgfflejm = (iggdpgyaxj +1) mod (Array.length flips.tab.(f).vtxs.vertexes) in
let cqvkfwkyhr = mmqdncmyvk b.xy flips.tab.(f).vtxs.vertexes.(iggdpgyaxj) flips.tab.(f).vtxs.vertexes.(pxkgfflejm) in
let xaqqcssgyu = aerhhxwwcs (igjujhpadn b.xy cqvkfwkyhr) in
let gxyowcywlc = (quuxfwmgkd (aerhhxwwcs mxlcxxplnb) xaqqcssgyu) in
if gxyowcywlc > 0. then begin
let kkoitxjucy = pfjkjpqxed xaqqcssgyu (dvtuhryvdi *. b.mass *. gxyowcywlc) in
b.fres.x <- b.fres.x +. kkoitxjucy.x *. flips.tab.(f).vtxs.restitution /. float_of_int hitlen ;
b.fres.y <- b.fres.y +. kkoitxjucy.y *. flips.tab.(f).vtxs.restitution /. float_of_int hitlen ;
end;
(* change velocity according to angle *)
if hitlen = 1 then begin
let rseawtwpni = igjujhpadn flips.tab.(f).vtxs.vertexes.(pxkgfflejm) flips.tab.(f).vtxs.vertexes.(iggdpgyaxj) in
let htlsypempr = kyqufjbqgy b.v {x = 0. ; y = 0.} rseawtwpni in
b.v.x <- htlsypempr.x ;
b.v.y <- htlsypempr.y ;
end
else begin
let oysqudbrnj = pfjkjpqxed (aerhhxwwcs (igjujhpadn b.xy cqvkfwkyhr)) (yfvqjtmemd b.v) in
b.v.x <- oysqudbrnj.x ;
b.v.y <- oysqudbrnj.y ;
end;
(* add relative velocity [disabled for physical reasons] *)
if false && ((flips.tab.(f).side = Left && flips.tab.(f).dtheta > 0.) || (flips.tab.(f).side = Right && flips.tab.(f).dtheta < 0.)) then begin
b.v.x <- 0.5 *. b.v.x +. flips.tab.(f).dtheta *. 3.14159 /. 180. *. (uaqehictpv flips.tab.(f).xy b.xy) *. (cos (flips.tab.(f).theta *. 3.14159 /. 180.));
b.v.y <- 0.5 *. b.v.y +. flips.tab.(f).dtheta *. 3.14159 /. 180. *. (uaqehictpv flips.tab.(f).xy b.xy) *. (sin (flips.tab.(f).theta *. 3.14159 /. 180.));
end
done
end
done;
(* P = mg *)
b.fres.y <- b.fres.y -. dvtuhryvdi *. b.mass ;
(* PFD : ma = sum(F) *)
b.a.x <- b.fres.x /. b.mass ;
b.a.y <- b.fres.y /. b.mass ;
b.v.x <- b.v.x +. b.a.x *. dt ;
b.v.y <- b.v.y +. b.a.y *. dt ;
b.xy.x <- b.xy.x +. b.v.x *. dt ;
b.xy.y <- b.xy.y +. b.v.y *. dt ;;
let xspdkspljw (bl : ball array) (polys : polygon array) (spheres : sphere array) (flips : flipper dynamic) (dt : float) =
for b = 0 to Array.length bl -1 do
if bl.(b).active then
ffmvmahtvp bl.(b) polys spheres flips dt
done ;;
let qgewwkqbap (flips : flipper dynamic) (dt : float) =
for fl = 0 to flips.len -1 do
if flips.tab.(fl).dtheta <> 0. then begin
let hxwgbulfmm = flips.tab.(fl).xy.x
and ijqcdxblfh = flips.tab.(fl).xy.y
and brumryeefp = flips.tab.(fl).radius
and len = flips.tab.(fl).length
and ortmvyuadt = flips.tab.(fl).theta in
match flips.tab.(fl).side with
| Left ->
let lfeiwkypud = flips.tab.(fl).theta +. flips.tab.(fl).dtheta *. dt in
if lfeiwkypud > flips.tab.(fl).agmax then
flips.tab.(fl).dtheta <- -.(flips.tab.(fl).dtheta) ;
if lfeiwkypud < flips.tab.(fl).agmin then
flips.tab.(fl).dtheta <- 0. ;
flips.tab.(fl).theta <- lfeiwkypud ;
flips.tab.(fl).vtxs.vertexes.(0) <- {
x = hxwgbulfmm +. len *. (cos (ortmvyuadt *. 3.14159 /. 180.));
y = ijqcdxblfh +. len *. (sin (ortmvyuadt *. 3.14159 /. 180.))
};
flips.tab.(fl).vtxs.vertexes.(1) <- {
x = hxwgbulfmm +. brumryeefp *. (cos ((ortmvyuadt +. 90.) *. 3.14159 /. 180.));
y = ijqcdxblfh +. brumryeefp *. (sin ((ortmvyuadt +. 90.) *. 3.14159 /. 180.))
};
flips.tab.(fl).vtxs.vertexes.(2) <- {
x = hxwgbulfmm +. brumryeefp *. (cos ((ortmvyuadt -. 90.) *. 3.14159 /. 180.));
y = ijqcdxblfh +. brumryeefp *. (sin ((ortmvyuadt -. 90.) *. 3.14159 /. 180.))
};
| Right ->
let lfeiwkypud = flips.tab.(fl).theta +. flips.tab.(fl).dtheta *. dt in
if lfeiwkypud > flips.tab.(fl).agmax then
flips.tab.(fl).dtheta <- 0. ;
if lfeiwkypud < flips.tab.(fl).agmin then
flips.tab.(fl).dtheta <- -.(flips.tab.(fl).dtheta) ;
flips.tab.(fl).theta <- lfeiwkypud ;
flips.tab.(fl).vtxs.vertexes.(0) <- {
x = hxwgbulfmm +. len *. (cos (ortmvyuadt *. 3.14159 /. 180.));
y = ijqcdxblfh +. len *. (sin (ortmvyuadt *. 3.14159 /. 180.))
};
flips.tab.(fl).vtxs.vertexes.(1) <- {
x = hxwgbulfmm +. brumryeefp *. (cos ((ortmvyuadt +. 90.) *. 3.14159 /. 180.));
y = ijqcdxblfh +. brumryeefp *. (sin ((ortmvyuadt +. 90.) *. 3.14159 /. 180.))
};
flips.tab.(fl).vtxs.vertexes.(2) <- {
x = hxwgbulfmm +. brumryeefp *. (cos ((ortmvyuadt -. 90.) *. 3.14159 /. 180.));
y = ijqcdxblfh +. brumryeefp *. (sin ((ortmvyuadt -. 90.) *. 3.14159 /. 180.))
};
end
done ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Graphics fcts *)
let akksmqshhj hxwgbulfmm y n0 r =
(* 7-seg display *)
let n = ref n0 in
let micgxbkxot = ewmqlkcvwl n0 in
let len = r/3 in
let gunvxnxkeu = micgxbkxot*(len*11/7)/2 in
for i = 0 to micgxbkxot do
let x = hxwgbulfmm + gunvxnxkeu - i*(len*11/7) in
if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then
draw_poly_line [|(x-len/2, y+len); (x-len/2, y)|];
if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 7; 8; 9|] then
draw_poly_line [|(x-len/2, y+len); (x+len/2, y+len)|];
if Array.mem (!n mod 10) [|0; 1; 2; 3; 4; 7; 8; 9|] then
draw_poly_line [|(x+len/2, y+len); (x+len/2, y)|];
if Array.mem (!n mod 10) [|2; 3; 4; 5; 6; 8; 9|] then
draw_poly_line [|(x-len/2, y); (x+len/2, y)|];
if Array.mem (!n mod 10) [|0; 1; 3; 4; 5; 6; 7; 8; 9|] then
draw_poly_line [|(x+len/2, y-len); (x+len/2, y)|];
if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 8; 9|] then
draw_poly_line [|(x-len/2, y-len); (x+len/2, y-len)|];
if Array.mem (!n mod 10) [|0; 2; 6; 8|] then
draw_poly_line [|(x-len/2, y-len); (x-len/2, y)|];
n := !n/10;
done ;;
let nkktxxoumg hxwgbulfmm y n0 len =
(* 7-seg display 2 *)
set_line_width (max 1 (len/4));
let n = ref n0 in
let micgxbkxot = ewmqlkcvwl (abs n0) in
let vvielwjcau = ref (hxwgbulfmm + micgxbkxot*(len*11/7)) in
if !n < 0 then begin
n := !n * (-1);
draw_poly_line [|(hxwgbulfmm, y); (hxwgbulfmm+len, y)|];
vvielwjcau := !vvielwjcau + (len*11/7)
end;
for i = 0 to micgxbkxot do
let x = !vvielwjcau in
if Array.mem (!n mod 10) [|0; 4; 5; 6; 7; 8; 9|] then
draw_poly_line [|(x, y+len); (x, y)|];
if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 7; 8; 9|] then
draw_poly_line [|(x, y+len); (x+len, y+len)|];
if Array.mem (!n mod 10) [|0; 1; 2; 3; 4; 7; 8; 9|] then
draw_poly_line [|(x+len, y+len); (x+len, y)|];
if Array.mem (!n mod 10) [|2; 3; 4; 5; 6; 8; 9|] then
draw_poly_line [|(x, y); (x+len, y)|];
if Array.mem (!n mod 10) [|0; 1; 3; 4; 5; 6; 7; 8; 9|] then
draw_poly_line [|(x+len, y-len); (x+len, y)|];
if Array.mem (!n mod 10) [|0; 2; 3; 5; 6; 8; 9|] then
draw_poly_line [|(x, y-len); (x+len, y-len)|];
if Array.mem (!n mod 10) [|0; 2; 6; 8|] then
draw_poly_line [|(x, y-len); (x, y)|];
n := !n/10;
vvielwjcau := !vvielwjcau - (len*11/7);
done ;;
let cedssxkuuc x y n0 r =
let n = pmodmwkwvl n0 in
let yaaxjbqqjx = int_of_float n in
let wkqbyygdvn = jcgvonjvkf (n -. float_of_int yaaxjbqqjx) in
nkktxxoumg x y yaaxjbqqjx r ;
fill_circle (x + (ewmqlkcvwl yaaxjbqqjx) * r * 11/7 + 3*r/2) (y - r) 3 ;
nkktxxoumg (x + 3*r/5 + (ewmqlkcvwl yaaxjbqqjx + 1)*r*11/7) y ((100 * wkqbyygdvn) / (pqouljlqnm 10 (1+ ewmqlkcvwl wkqbyygdvn))) r ;;
let eijhhwwbqm (poly : polygon) =
set_color (rgb (poly.rgb mod 256) ((poly.rgb / 256) mod 256) ((poly.rgb / (256*256)) mod 256)) ;
fill_poly (Array.init (Array.length poly.vertexes) (fun i -> (int_of_float poly.vertexes.(i).x, int_of_float poly.vertexes.(i).y))) ;;
let dwhfllwgax (s : sphere) =
set_color (rgb (s.rgb mod 256) ((s.rgb / 256) mod 256) ((s.rgb / (256*256)) mod 256)) ;
fill_circle (int_of_float s.center.x) (int_of_float s.center.y) (int_of_float s.radius) ;;
let uqvgbvmfqp (f : flipper) =
set_color (rgb 64 64 64) ;
fill_circle (int_of_float f.xy.x) (int_of_float f.xy.y) (int_of_float f.radius) ;
eijhhwwbqm f.vtxs ;;
let waisadxkmv (b : ball) =
set_color (rgb (b.rgb mod 256) ((b.rgb / 256) mod 256) ((b.rgb / (256*256)) mod 256)) ;
fill_circle (int_of_float b.xy.x) (int_of_float b.xy.y) (int_of_float b.radius) ;
set_line_width 4 ;
draw_circle (int_of_float b.xy.x) (int_of_float b.xy.y) (int_of_float b.radius) ;;
let aiiilcgctu (bs : ball array) =
for k = 0 to Array.length bs -1 do
if bs.(k).active then
waisadxkmv bs.(k)
done ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Misc fcts *)
let bkicytmgfd () =
if key_pressed () then
read_key ()
else
'@' ;;
let wgqkvaivry (flips : flipper dynamic) =
match bkicytmgfd () with
| 'q' -> 
for fl = 0 to flips.len -1 do
if flips.tab.(fl).side = Left && flips.tab.(fl).dtheta = 0. then
flips.tab.(fl).dtheta <- 600. ;
done
| 'd' -> 
for fl = 0 to flips.len -1 do
if flips.tab.(fl).side = Right && flips.tab.(fl).dtheta = 0. then
flips.tab.(fl).dtheta <- -. 600. ;
done
| _ -> () ;;
let lhbcpmtcyh (r : float) (hxwgbulfmm : int) (ijqcdxblfh : int) (m : float) (red : int) (green : int) (blue : int) = 
{
active = true ;
radius = r ;
rgb = red + 256 * green + 256 * 256 * blue ;
mass = m;
xy = {x = float_of_int hxwgbulfmm +. (Random.float 30.0 -. 15.0); y = float_of_int ijqcdxblfh +. (Random.float 30.0 -. 15.0)} ;
v = {x = 0. ; y = 0.} ;
a = {x = 0. ; y = 0.} ;
fres = {x = 0. ; y = 0.} ;
} ;;
let xmlrntccqv (arr : (int * int) array) (rest : float) (pts : int) (red : int) (green : int) (blue : int) =
{
vertexes = Array.init (Array.length arr) (fun k -> {x = float_of_int (fst arr.(k)); y = float_of_int (snd arr.(k))}) ;
rgb = red + 256 * green + 256 * 256 * blue ;
xmin = float_of_int (Array.fold_left (fun dnofdwvumy k -> min dnofdwvumy (fst k)) 99999 arr) ;
xmax = float_of_int (Array.fold_left (fun dnofdwvumy k -> max dnofdwvumy (fst k)) (-99999) arr) ;
ymin = float_of_int (Array.fold_left (fun dnofdwvumy k -> min dnofdwvumy (snd k)) 99999 arr) ;
ymax = float_of_int (Array.fold_left (fun dnofdwvumy k -> max dnofdwvumy (snd k)) (-99999) arr) ;
restitution = rest ;
score = pts ;
} ;;
let endykgqsgx (x00 : int) (y00 : int) (brumryeefp : float) (rest : float) (pts : int) (red : int) (green : int) (blue : int) =
let hxwgbulfmm = float_of_int x00 and ijqcdxblfh = float_of_int y00 in
{
center = {x = hxwgbulfmm ; y = ijqcdxblfh};
rgb = red + 256 * green + 256 * 256 * blue ;
radius = brumryeefp ;
xmin = hxwgbulfmm -. brumryeefp ;
xmax = hxwgbulfmm +. brumryeefp ;
ymin = ijqcdxblfh -. brumryeefp ;
ymax = ijqcdxblfh +. brumryeefp ;
restitution = rest ;
score = pts ;
} ;;
let jyyiilwnkr (side : flipper_side) (hxwgbulfmm : int) (ijqcdxblfh : int) (brumryeefp : float) (len : float) (ortmvyuadt : float) (thmin : float) (thmax : float) =
{
side = side ;
xy = {x = float_of_int hxwgbulfmm ; y = float_of_int ijqcdxblfh} ;
radius = brumryeefp ;
length = len ;
theta = ortmvyuadt (* in degrees *) ;
dtheta = 0. ;
agmin = thmin ;
agmax = thmax ;
vtxs = xmlrntccqv [|
(hxwgbulfmm + int_of_float (len *. (cos (ortmvyuadt *. 3.14159 /. 180.)))        , ijqcdxblfh + int_of_float (len *. (sin (ortmvyuadt *. 3.14159 /. 180.))));
(hxwgbulfmm + int_of_float (brumryeefp *. (cos ((ortmvyuadt -. 90.) *. 3.14159 /. 180.))), ijqcdxblfh + int_of_float (brumryeefp *. (sin ((ortmvyuadt -. 90.) *. 3.14159 /. 180.))));
(hxwgbulfmm + int_of_float (brumryeefp *. (cos ((ortmvyuadt +. 90.) *. 3.14159 /. 180.))), ijqcdxblfh + int_of_float (brumryeefp *. (sin ((ortmvyuadt +. 90.) *. 3.14159 /. 180.))))
|] 1. 0 128 128 128
} ;;
let qsmxalwtqk (count : int) (r : float) (hxwgbulfmm : int) (ijqcdxblfh : int) (m : float) (red : int) (green : int) (blue : int) =
Array.init count (fun k -> lhbcpmtcyh r hxwgbulfmm ijqcdxblfh m red green blue) ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Edition functions *)
let owrndhnbxi lvl_name =
open_graph xxtvdauymf ;
set_window_title "WAH" ;
let (onyoeqlwhk : polygon dynamic) = infhrfotum suvesniybj in
let vbemgygrbn = ref false in
let ajkuxrtmii = ref true in
let (vvuwhvgjnw : pt_2d dynamic) = infhrfotum {x = 0. ; y = 0.} in
while not !vbemgygrbn do
Unix.sleepf hwwkinuyju ;
if !ajkuxrtmii then begin
auto_synchronize false ;
clear_graph () ;
ajkuxrtmii := false ;
for p = 0 to onyoeqlwhk.len -1 do
eijhhwwbqm onyoeqlwhk.tab.(p)
done;
auto_synchronize true ;
end;
match (bkicytmgfd ()) with
| 'a' -> (* add current polygon *)
(*Printf.printf "+polygon\n" ;*)
if vvuwhvgjnw.len >= 2 then begin
ajkuxrtmii := true ;
let tmworeidqu = Array.init vvuwhvgjnw.len (fun k -> vvuwhvgjnw.tab.(k)) in 
vyvjbxvwlb onyoeqlwhk {
vertexes = tmworeidqu ;
rgb = 128 + 255*128 + 255*255*128 ;
xmin = Array.fold_left (fun dnofdwvumy k -> min dnofdwvumy k.x) (999999.) tmworeidqu ;
xmax = Array.fold_left (fun dnofdwvumy k -> max dnofdwvumy k.x) (-.999999.) tmworeidqu ;
ymin = Array.fold_left (fun dnofdwvumy k -> min dnofdwvumy k.y) (999999.) tmworeidqu ;
ymax = Array.fold_left (fun dnofdwvumy k -> max dnofdwvumy k.y) (-.999999.) tmworeidqu ;
restitution = 1. ;
score = 0 ;
} ;
vvuwhvgjnw.len <- 0 ;
end
| 'v' -> (* add a vertex *)
(*Printf.printf "+vertex\n" ;*)
let (pldswcamqr, my) = mouse_pos () in
vyvjbxvwlb vvuwhvgjnw {x = float_of_int pldswcamqr ; y = float_of_int my} ;
| 'c' -> (* clear current polygon *)
(*Printf.printf "cleared\n" ;*)
vvuwhvgjnw.len <- 0 ;
| 'h' ->
vbemgygrbn := true ;
| _ -> ()
done;
close_graph ();
onyoeqlwhk ;;
(* ------------------------------------------------------------------------------------- *)
(* ------------------------------------------------------------------------------------- *)
(* WALUIGI_TIME Main *)
let mxaxilfobj (data : polygon dynamic) (dats : sphere dynamic) (flips : flipper dynamic) =
open_graph xxtvdauymf ;
set_window_title "WAH" ;
let pctksfltxq = qsmxalwtqk 8 10.0 600 800 0.15 255 255 0 in
let fjekplgywk = Unix.gettimeofday () in
let jrtefovmxj = ref (Unix.gettimeofday ()) in
while true do
let omnpcmseyq = Unix.gettimeofday () in
auto_synchronize false ;
clear_graph () ;
set_line_width 4 ;
akksmqshhj 600 100 !ufmnpkhbse 40 ;
set_line_width 1 ;
for d = 0 to dats.len -1 do
dwhfllwgax dats.tab.(d)
done;
for d = 0 to data.len -1 do
eijhhwwbqm data.tab.(d)
done;
for d = 0 to flips.len -1 do
uqvgbvmfqp flips.tab.(d)
done;
aiiilcgctu pctksfltxq ;
set_color (rgb 128 128 32) ;
cedssxkuuc 25 770 (gvhsmpxpat (!jrtefovmxj -. fjekplgywk) 3) 25 ;
set_color black ;
set_line_width 4 ;
akksmqshhj 600 770 !score 50 ;
auto_synchronize true ;
wgqkvaivry flips ;
Unix.sleepf hwwkinuyju ;
let pumwckmhxf = Unix.gettimeofday () in
jrtefovmxj := !jrtefovmxj +. (pumwckmhxf -. omnpcmseyq) ;
xspdkspljw pctksfltxq data.tab dats.tab flips (pumwckmhxf -. omnpcmseyq) ;
qgewwkqbap flips (pumwckmhxf -. omnpcmseyq) ;
done;
close_graph () ;;
let ygjbohpamm = infhrfotum suvesniybj ;;
let spheres = infhrfotum blnwpctihp ;;
let tcodwswtai = infhrfotum klqsywgkdl ;;
(* |-------------------------------------------------------------------------------------------------------| *)
(* kill platform *)
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(700, -20); (500, -20); (500, 1); (700, 1)|] 0. 0 255 32 32) ;;
(* outer walls *)
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(0, 0); (500, 0); (500, 20); (0, 20)|] 1. 0 32 32 32) ;;
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(700, 0); (1200, 0); (1200, 20); (700, 20)|] 1. 0 32 32 32) ;;
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(0, 800); (500, 800); (500, 780); (0, 780)|] 1. 0 32 32 32) ;;
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(700, 800); (1200, 800); (1200, 780); (700, 780)|] 1. 0 32 32 32) ;;
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(1180, 0); (1200, 0); (1200, 800); (1180, 800)|] 1. 0 32 32 32) ;;
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(0, 0); (20, 0); (20, 800); (0, 800)|] 1. 0 32 32 32) ;;
(* side ramps *)
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(20, 20); (20, 300); (420, 150); (420, 20)|] 1. 0 32 32 32) ;;
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(1200, 20); (1200, 300); (780, 150); (780, 20)|] 1. 0 32 32 32) ;;
(* starting platform *)
vyvjbxvwlb ygjbohpamm (xmlrntccqv [|(600, 700); (400, 550); (800, 550)|] 1. 0 32 32 32) ;;
(* |-------------------------------------------------------------------------------------------------------| *)
(* corner scoring spots *)
vyvjbxvwlb spheres (endykgqsgx 20 780 30. 1. 50 128 128 32) ;;
vyvjbxvwlb spheres (endykgqsgx 1180 780 30. 1. 50 128 128 32) ;;
(* under the starting platform *)
vyvjbxvwlb spheres (endykgqsgx 440 550 20. 1. 5 32 128 32) ;;
vyvjbxvwlb spheres (endykgqsgx 520 550 20. 1. 5 32 192 32) ;;
vyvjbxvwlb spheres (endykgqsgx 600 550 20. 1. 5 32 255 32) ;;
vyvjbxvwlb spheres (endykgqsgx 680 550 20. 1. 5 32 192 32) ;;
vyvjbxvwlb spheres (endykgqsgx 760 550 20. 1. 5 32 128 32) ;;
vyvjbxvwlb spheres (endykgqsgx 480 450 20. 1. 3 32 156 32) ;;
vyvjbxvwlb spheres (endykgqsgx 560 450 20. 1. 3 32 220 32) ;;
vyvjbxvwlb spheres (endykgqsgx 640 450 20. 1. 3 32 220 32) ;;
vyvjbxvwlb spheres (endykgqsgx 720 450 20. 1. 3 32 156 32) ;;
vyvjbxvwlb spheres (endykgqsgx 520 350 20. 1. 1 32 192 32) ;;
vyvjbxvwlb spheres (endykgqsgx 600 350 20. 1. 1 32 255 32) ;;
vyvjbxvwlb spheres (endykgqsgx 680 350 20. 1. 1 32 192 32) ;;
(* left side *)
vyvjbxvwlb spheres (endykgqsgx 20 480 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 95 555 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 170 630 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 245 705 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 320 780 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 20 630 15. 1. 5 32 32 255) ;;
vyvjbxvwlb spheres (endykgqsgx 95 705 15. 1. 5 32 32 255) ;;
vyvjbxvwlb spheres (endykgqsgx 170 780 15. 1. 5 32 32 255) ;;
vyvjbxvwlb spheres (endykgqsgx 300 300 15. 1. 5 128 128 128) ;;
(* right side *)
vyvjbxvwlb spheres (endykgqsgx 1180 480 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 1105 555 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 1030 630 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 965 705 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 890 780 10. 1. 3 32 32 192) ;;
vyvjbxvwlb spheres (endykgqsgx 1180 630 15. 1. 5 32 32 255) ;;
vyvjbxvwlb spheres (endykgqsgx 1105 705 15. 1. 5 32 32 255) ;;
vyvjbxvwlb spheres (endykgqsgx 1030 780 15. 1. 5 32 32 255) ;;
vyvjbxvwlb spheres (endykgqsgx 900 300 15. 1. 5 128 128 128) ;;
(* on the ramps *)
vyvjbxvwlb spheres (endykgqsgx 20 300 20. 1. 7 128 128 128) ;;
vyvjbxvwlb spheres (endykgqsgx 1180 300 20. 1. 7 128 128 128) ;;
(* |-------------------------------------------------------------------------------------------------------| *)
vyvjbxvwlb tcodwswtai (jyyiilwnkr Left 420 125 20. 160. (-. 20.) (-. 20.) 20.) ;;
vyvjbxvwlb tcodwswtai (jyyiilwnkr Right 780 125 20. 160. 200. 160. 200.) ;;
(* |-------------------------------------------------------------------------------------------------------| *)
mxaxilfobj ygjbohpamm spheres tcodwswtai ;;
(* 
let xmlrntccqv (arr : (int * int) array) (rest : float) (pts : int) (red : int) (green : int) (blue : int) 
let endykgqsgx (x00 : int) (y00 : int) (radius : float) (rest : float) (pts : int) red green blue
let jyyiilwnkr (hxwgbulfmm : int) (ijqcdxblfh : int) (brumryeefp : float) (len : float) (ortmvyuadt : float) (thmin : float) (thmax : float)
*)
(* ocamlfind ocamlopt -linkpkg -package unix -linkpkg -package graphics -thread -package threads -linkpkg main.ml *)
