aboutsummaryrefslogtreecommitdiff
path: root/calculette_aoo/js/main.ml
blob: 9a63d123d3710446be12c7e249be85f4fb6d2ffb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
open Brr

let ( let=? ) : 'a option -> ('a -> unit) -> unit =
 fun f opt -> Option.iter opt f

let get_int_value element =
  let value = El.prop El.Prop.value element in
  match Jstr.to_int value with
  | Some v -> v
  | None -> 0

let cout_a = (800, 200, 100)
let cout_m = (110, 55, 35)
let cout_rm = (50, 40, 20)
let cout_pm = (5, 3, 1)
let cout_fm = (100, 50, 30)

let get_element_by_id id =
  Jstr.of_string id |> Brr.Document.find_el_by_id Brr.G.document

let get_int_element id =
  Jstr.of_string id
  |> Brr.Document.find_el_by_id Brr.G.document
  |> Option.map get_int_value |> Option.value ~default:0

let eval _ =
  let a_element = get_int_element "a" in
  let m_element = get_int_element "m" in
  let rm_element = get_int_element "rm" in
  let fm_element = get_int_element "fm" in
  let pm_element = get_int_element "pm" in

  let a_bonus = get_int_element "a_bonus" in
  let m_bonus = get_int_element "m_bonus" in
  let rm_bonus = get_int_element "rm_bonus" in
  let fm_bonus = get_int_element "fm_bonus" in
  let pm_bonus = get_int_element "pm_bonus" in

  let a = Aoo.Carac.create ~bonus:a_bonus a_element cout_a in
  let m = Aoo.Carac.create ~bonus:m_bonus m_element cout_m in
  let rm = Aoo.Carac.create ~bonus:rm_bonus rm_element cout_rm in
  let fm = Aoo.Carac.create ~bonus:fm_bonus fm_element cout_fm in
  let pm = Aoo.Carac.create ~bonus:pm_bonus pm_element cout_pm in

  let build = Aoo.Build.{ a; m; rm; fm; pm } in

  (* Evaluate the cost for the given upgrades *)
  let cost = Aoo.Build.cost build in

  let fm_oponent = get_int_element "fm_oponent" in
  let env : Aoo.Build.env =
    {
      cost_max = get_int_element "xp" + cost
    ; max_tours = float (get_int_element "tours")
    ; cout_sort = get_int_element "cost"
    ; degat_sort = get_int_element "dammage"
    ; fm_oponent
    ; frequencies = Aoo.Build.buil_freq_table fm_element fm_oponent
    }
  in
  let upgrades =
    match Aoo.Build.upgrade env build with
    | [] ->
        (* If there is no upgrade available, return the current build as a
           solution instead of nothing. *)
        [ build ]
    | upgrades -> upgrades
  in
  let build =
    Aoo.Build.traverse env
      (Aoo.Build.cost build, Aoo.Build.score env build)
      upgrades
  in

  let () = Aoo.Build.repr env Format.str_formatter build in
  let result = Format.flush_str_formatter () in
  let=? result_element = get_element_by_id "result" in

  El.set_children result_element [ El.txt' result ];
  ()

let main () =
  let=? btn = get_element_by_id "form" in
  let _ =
    Ev.listen Brr_io.Form.Ev.submit
      (fun ev ->
        Ev.prevent_default ev;
        eval ev)
      (El.as_target btn)
  in

  eval ()

let () =
  let open Jv in
  let main = obj [| ("run", repr main) |] in
  set global "lib" main