forked from zapashcanon/pellest
better map generation
This commit is contained in:
parent
e7fb6a70a0
commit
4e5a2121c1
82
src/map.ml
82
src/map.ml
@ -55,16 +55,6 @@ type t =
|
||||
; height : int
|
||||
}
|
||||
|
||||
let init () =
|
||||
let width = 100 in
|
||||
let height = 90 in
|
||||
let tiles =
|
||||
Array.init width (fun _x ->
|
||||
Array.init height (fun _y ->
|
||||
if Random.int 1000 <= 42 then Water else Grass ) )
|
||||
in
|
||||
{ tiles; width; height }
|
||||
|
||||
let get_tile_kind ~x ~y map =
|
||||
try map.tiles.(x).(y) with Invalid_argument _ -> Black
|
||||
|
||||
@ -93,3 +83,75 @@ let check_move map ({ x; y; _ } as pos) movement_dir =
|
||||
| (Black | Water) as bg ->
|
||||
Error (Format.asprintf "can't move on %a" pp_background bg)
|
||||
| Grass | Wheat -> Ok { pos with x; y }
|
||||
|
||||
let n = 50
|
||||
|
||||
let m = 50
|
||||
|
||||
let nb_water_spread = 4
|
||||
|
||||
let p_water_spread = 0.5
|
||||
|
||||
let p_water_init = 0.005
|
||||
|
||||
let nb_tree_spread = 6
|
||||
|
||||
let p_tree_spread = 0.5
|
||||
|
||||
let p_tree_init = 0.01
|
||||
|
||||
let () = Random.self_init ()
|
||||
|
||||
let count_something t map =
|
||||
let is_something t e = if e = t then 1 else 0 in
|
||||
let f = is_something t in
|
||||
Array.init n (fun i ->
|
||||
Array.init m (fun j ->
|
||||
if i = 0 || j = 0 || i = n - 1 || j = m - 1 then 0
|
||||
else
|
||||
f map.(i - 1).(j)
|
||||
+ f map.(i + 1).(j)
|
||||
+ f map.(i).(j + 1)
|
||||
+ f map.(i).(j - 1) ) )
|
||||
|
||||
let populate t map i p_init p_spread =
|
||||
let map =
|
||||
Array.map
|
||||
(fun ligne ->
|
||||
Array.map
|
||||
(fun e ->
|
||||
let random = Random.float 1.0 in
|
||||
if e = Grass && random < p_init then t else e )
|
||||
ligne )
|
||||
map
|
||||
in
|
||||
|
||||
let rec loop acc i =
|
||||
if i = 0 then acc
|
||||
else
|
||||
let tbl_count = count_something t acc in
|
||||
let acc =
|
||||
Array.mapi
|
||||
(fun i ligne ->
|
||||
Array.mapi
|
||||
(fun j e ->
|
||||
let random = Random.float 1.0 in
|
||||
if
|
||||
e = Grass
|
||||
&& random < p_spread *. Float.of_int tbl_count.(i).(j)
|
||||
then t
|
||||
else e )
|
||||
ligne )
|
||||
acc
|
||||
in
|
||||
loop acc (i - 1)
|
||||
in
|
||||
loop map i
|
||||
|
||||
let init () =
|
||||
let tiles = Array.init n (fun _i -> Array.init m (fun _j -> Grass)) in
|
||||
let tiles =
|
||||
populate Water tiles nb_water_spread p_water_init p_water_spread
|
||||
in
|
||||
(*let tiles = populate Tree map nb_tree_spread p_tree_init p_tree_spread in*)
|
||||
{ tiles; width = n; height = m }
|
||||
|
Loading…
x
Reference in New Issue
Block a user