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 *)