2018-11-01 13:29:41 +01:00
|
|
|
|
|
2018-11-03 16:32:03 +01:00
|
|
|
|
require "json"
|
|
|
|
|
|
|
|
|
|
require "./naka.cr"
|
|
|
|
|
|
2018-11-01 13:29:41 +01:00
|
|
|
|
Naka.init
|
|
|
|
|
|
2018-11-03 16:32:03 +01:00
|
|
|
|
window = Naka::Window.new "Test", 16*128, 16*128, flags: LibSDL::WindowFlags::RESIZABLE | LibSDL::WindowFlags::SHOWN | LibSDL::WindowFlags::OPENGL
|
|
|
|
|
|
2018-11-03 16:58:44 +01:00
|
|
|
|
connection_font = window.newFont "assets/connection.otf", 30.5
|
2018-11-03 16:32:03 +01:00
|
|
|
|
window.set_font connection_font
|
|
|
|
|
|
2018-11-04 00:49:40 +01:00
|
|
|
|
def simple_tile_drawer(window : Naka::Window, tile_path : String)
|
|
|
|
|
texture = window.newImage tile_path
|
|
|
|
|
|
2018-11-04 16:21:56 +01:00
|
|
|
|
texture_height = texture.height
|
|
|
|
|
|
2018-11-04 00:49:40 +01:00
|
|
|
|
->(map : Naka::Map, x : Int32, y : Int32, z : Int32, tile : Naka::Map::Tile, object : Naka::Map::Object, draw_x : Int32, draw_y : Int32, zoom : Float64){
|
2018-11-04 16:21:56 +01:00
|
|
|
|
window.draw texture, draw_x, (draw_y + (16 - texture_height) * zoom).to_i, scale_x: zoom, scale_y: zoom
|
2018-11-04 00:49:40 +01:00
|
|
|
|
nil
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def bordered_tile_drawer(window : Naka::Window, base_tile_path : String)
|
|
|
|
|
mod = [
|
|
|
|
|
"trbl",
|
|
|
|
|
"-rbl",
|
|
|
|
|
"t-bl",
|
|
|
|
|
"tr-l",
|
|
|
|
|
"trb-",
|
|
|
|
|
"t-b-",
|
|
|
|
|
"-r-l",
|
|
|
|
|
"tr--",
|
|
|
|
|
"-rb-",
|
|
|
|
|
"--bl",
|
|
|
|
|
"t--l",
|
|
|
|
|
"t---",
|
|
|
|
|
"-r--",
|
|
|
|
|
"--b-",
|
|
|
|
|
"---l",
|
|
|
|
|
"----"
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
textures = Hash(String, SDL::Texture).new
|
|
|
|
|
|
|
|
|
|
mod.each do |s|
|
|
|
|
|
begin
|
|
|
|
|
textures[s] = window.newImage base_tile_path.sub /{}/, "-" + s
|
|
|
|
|
rescue
|
|
|
|
|
# Not even sure we should be doing something here…
|
|
|
|
|
# Maybe in the future, in debug mode?
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
->(map : Naka::Map, x : Int32, y : Int32, z : Int32, tile : Naka::Map::Tile, object : Naka::Map::Object, draw_x : Int32, draw_y : Int32, zoom : Float64){
|
|
|
|
|
neighbours = [
|
|
|
|
|
{x, y-1, "t"},
|
|
|
|
|
{x+1, y, "r"},
|
|
|
|
|
{x, y+1, "b"},
|
|
|
|
|
{x-1, y, "l"}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
neighbours = neighbours.map do |x, y|
|
|
|
|
|
map.get(x, y)[z]?.try &.reference.== object.reference
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
t, r, b, l = neighbours
|
|
|
|
|
t = t ? 't' : '-'
|
|
|
|
|
r = r ? 'r' : '-'
|
|
|
|
|
b = b ? 'b' : '-'
|
|
|
|
|
l = l ? 'l' : '-'
|
|
|
|
|
|
|
|
|
|
neighbours = [t, r, b, l].reduce "" { |a, c| a + c }
|
|
|
|
|
|
|
|
|
|
window.draw (textures[neighbours]? || textures["trbl"]), draw_x, draw_y, scale_x: zoom, scale_y: zoom
|
|
|
|
|
|
|
|
|
|
nil
|
|
|
|
|
}
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
stone = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Stone",
|
|
|
|
|
walkable: true,
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/stone.png"
|
|
|
|
|
)
|
|
|
|
|
grass = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Grass",
|
|
|
|
|
walkable: true,
|
|
|
|
|
drawer: bordered_tile_drawer window, "assets/grass{}.png"
|
|
|
|
|
)
|
|
|
|
|
dirt = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Dirt",
|
|
|
|
|
walkable: true,
|
|
|
|
|
drawer: bordered_tile_drawer window, "assets/dirt{}.png"
|
|
|
|
|
)
|
|
|
|
|
sand = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Sand",
|
2018-11-04 16:21:56 +01:00
|
|
|
|
walkable: true,
|
|
|
|
|
drawer: bordered_tile_drawer window, "assets/sand{}.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
water = Naka::Map::ObjectReference.new(
|
2018-11-04 16:21:56 +01:00
|
|
|
|
name: "Water",
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/water.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
flowers = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Flowers",
|
2018-11-04 16:21:56 +01:00
|
|
|
|
walkable: true,
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/flowers.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
haunted = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Haunted",
|
2018-11-04 16:21:56 +01:00
|
|
|
|
walkable: true,
|
|
|
|
|
drawer: bordered_tile_drawer window, "assets/haunted{}.png"
|
|
|
|
|
)
|
|
|
|
|
haunted_tree = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Tree (Haunted)",
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/haunted-tree.png"
|
|
|
|
|
)
|
|
|
|
|
tree_cut = Naka::Map::ObjectReference.new(
|
|
|
|
|
name: "Tree (Cut)",
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/tree-cut.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
tree = Naka::Map::ObjectReference.new(
|
2018-11-04 16:21:56 +01:00
|
|
|
|
name: "Tree",
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/tree.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
pine = Naka::Map::ObjectReference.new(
|
2018-11-04 16:21:56 +01:00
|
|
|
|
name: "Pine Tree",
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/tree_pine.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
rocks = Naka::Map::ObjectReference.new(
|
2018-11-04 16:21:56 +01:00
|
|
|
|
name: "Rocks",
|
|
|
|
|
drawer: simple_tile_drawer window, "assets/rocks.png"
|
2018-11-04 00:49:40 +01:00
|
|
|
|
)
|
|
|
|
|
|
2018-11-03 16:57:20 +01:00
|
|
|
|
altitude_noise = Naka::Noise2D.new.tap do |a|
|
2018-11-03 16:47:55 +01:00
|
|
|
|
a.add_octave(32, 1)
|
|
|
|
|
a.add_octave(16, 0.5)
|
|
|
|
|
a.add_octave(8, 0.25)
|
|
|
|
|
a.add_octave(4, 0.125)
|
|
|
|
|
a.add_octave(2, 1/16) # wtf, too smol
|
|
|
|
|
end
|
|
|
|
|
|
2018-11-03 16:57:20 +01:00
|
|
|
|
humidity_noise = Naka::Noise2D.new.tap do |a|
|
2018-11-03 16:47:55 +01:00
|
|
|
|
a.add_octave(64, 1)
|
|
|
|
|
a.add_octave(32, 0.5)
|
|
|
|
|
a.add_octave(16, 0.25)
|
|
|
|
|
a.add_octave(8, 0.20)
|
|
|
|
|
a.add_octave(4, 0.15)
|
|
|
|
|
a.add_octave(2, 0.10)
|
|
|
|
|
end
|
|
|
|
|
|
2018-11-03 16:57:20 +01:00
|
|
|
|
evil_noise = Naka::Noise2D.new.tap do |a|
|
2018-11-03 16:47:55 +01:00
|
|
|
|
a.add_octave(48, 0.6)
|
|
|
|
|
a.add_octave(32, 0.6)
|
|
|
|
|
a.add_octave(16, 0.3)
|
|
|
|
|
end
|
|
|
|
|
|
2018-11-04 00:49:40 +01:00
|
|
|
|
map = Naka::Map.new stone, "map-test-01" do |tile, x, y|
|
2018-11-03 16:57:20 +01:00
|
|
|
|
altitude = altitude_noise.get(x, y) + 0.5
|
2018-11-03 16:47:55 +01:00
|
|
|
|
|
2018-11-03 16:57:20 +01:00
|
|
|
|
humidity = humidity_noise.get(x, y) + 0.5
|
2018-11-03 16:47:55 +01:00
|
|
|
|
|
2018-11-03 16:57:20 +01:00
|
|
|
|
evil = evil_noise.get(x, y)
|
2018-11-03 16:47:55 +01:00
|
|
|
|
|
2018-11-04 00:49:40 +01:00
|
|
|
|
if altitude < 0.35
|
|
|
|
|
tile << Naka::Map::Object.new water
|
|
|
|
|
else
|
|
|
|
|
tile << Naka::Map::Object.new stone
|
|
|
|
|
end
|
2018-11-03 16:47:55 +01:00
|
|
|
|
|
2018-11-04 16:21:56 +01:00
|
|
|
|
if altitude < 0.75
|
|
|
|
|
if altitude < 0.175
|
|
|
|
|
next
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
tile << Naka::Map::Object.new sand
|
|
|
|
|
|
|
|
|
|
if humidity < 0.225
|
|
|
|
|
next
|
2018-11-03 16:47:55 +01:00
|
|
|
|
end
|
2018-11-04 16:21:56 +01:00
|
|
|
|
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new dirt
|
2018-11-03 16:47:55 +01:00
|
|
|
|
|
2018-11-04 16:21:56 +01:00
|
|
|
|
if altitude < 0.275
|
|
|
|
|
next
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if evil > 0.4
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new haunted
|
2018-11-03 16:47:55 +01:00
|
|
|
|
else
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new grass
|
2018-11-03 16:47:55 +01:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if altitude > 0.35 && altitude < 0.65
|
|
|
|
|
if humidity > 0.4
|
2018-11-04 16:21:56 +01:00
|
|
|
|
if evil > 0.4
|
|
|
|
|
tile << Naka::Map::Object.new haunted_tree
|
|
|
|
|
elsif humidity > 0.8
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new tree
|
2018-11-03 16:47:55 +01:00
|
|
|
|
elsif humidity < 0.6
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new pine
|
2018-11-03 16:47:55 +01:00
|
|
|
|
else
|
|
|
|
|
if Random.rand(2) == 0
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new tree
|
2018-11-03 16:47:55 +01:00
|
|
|
|
else
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new pine
|
2018-11-03 16:47:55 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
if Random.rand(10) == 0
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile << Naka::Map::Object.new flowers
|
2018-11-03 16:47:55 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
2018-11-04 00:49:40 +01:00
|
|
|
|
else
|
|
|
|
|
tile << Naka::Map::Object.new stone
|
|
|
|
|
|
|
|
|
|
if altitude > 0.85
|
|
|
|
|
tile << Naka::Map::Object.new rocks
|
|
|
|
|
end
|
2018-11-03 16:47:55 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
2018-11-01 13:29:41 +01:00
|
|
|
|
|
|
|
|
|
Naka::Event.loop window do |event|
|
|
|
|
|
case event
|
|
|
|
|
when Naka::Event::Quit
|
|
|
|
|
next Naka::Event::Quit
|
|
|
|
|
when Naka::Event::Update
|
2018-11-04 16:21:56 +01:00
|
|
|
|
p "FPS: #{(1000f64 / event.dt)}"
|
2018-11-01 13:29:41 +01:00
|
|
|
|
when Naka::Event::Draw
|
2018-11-04 00:49:40 +01:00
|
|
|
|
zoom_level = 4.0
|
2018-11-03 16:32:03 +01:00
|
|
|
|
|
2018-11-04 16:21:56 +01:00
|
|
|
|
64.times do |x|
|
|
|
|
|
32.times do |y|
|
2018-11-03 16:32:03 +01:00
|
|
|
|
tile = map.get x, y
|
|
|
|
|
|
|
|
|
|
# FIXME:
|
|
|
|
|
# - Please don’t draw more than one layer of ground…
|
|
|
|
|
# - Transitions. (eg. between dirt and grass)
|
2018-11-04 00:49:40 +01:00
|
|
|
|
tile.each_with_index do |object, z|
|
|
|
|
|
draw_x = (x * 16 * zoom_level).to_i
|
2018-11-04 16:21:56 +01:00
|
|
|
|
draw_y = (y * 16 * zoom_level).to_i
|
2018-11-04 00:49:40 +01:00
|
|
|
|
|
|
|
|
|
drawer = object.reference.drawer
|
|
|
|
|
|
2018-11-04 16:21:56 +01:00
|
|
|
|
next if drawer.nil? # FIXME: Maybe print a warning.
|
2018-11-04 00:49:40 +01:00
|
|
|
|
|
|
|
|
|
drawer.call map, x, y, z, tile, object, draw_x, draw_y, zoom_level
|
2018-11-03 16:32:03 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# Urgh. This shit eats CPU. Fonts need goddamn fixing.
|
|
|
|
|
#window.print "The quick brown fox jumps over the lazy dog.", 50, 50
|
2018-11-02 13:17:05 +01:00
|
|
|
|
when Naka::Event::KeyUp, Naka::Event::KeyDown
|
|
|
|
|
pp! event
|
2018-11-01 13:29:41 +01:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|