From 44e9dcf7d7c2018bdb46e1876fa051678e68abd8 Mon Sep 17 00:00:00 2001 From: Cyberarm Date: Fri, 11 Oct 2019 13:17:59 -0500 Subject: [PATCH] Added initial support for Tiled maps --- Gemfile | 3 + assets/maps/test_map.tmx | 167 ++++++++++++++++++------------------ assets/tilesets/default.png | Bin 4746 -> 4892 bytes assets/tilesets/default.tsx | 22 ++++- assets/tilesets/ore.png | Bin 0 -> 4720 bytes assets/tilesets/ore.tsx | 6 ++ i-mic-rts.rb | 3 + lib/map.rb | 64 ++++++++++---- lib/states/game.rb | 2 +- lib/tiled_map.rb | 125 +++++++++++++++++++++++++++ lib/zorder.rb | 1 + 11 files changed, 292 insertions(+), 101 deletions(-) create mode 100644 Gemfile create mode 100644 assets/tilesets/ore.png create mode 100644 assets/tilesets/ore.tsx create mode 100644 lib/tiled_map.rb diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..909ba48 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +source "https://rubygems.org" +gem "cyberarm_engine" +gem "nokogiri" \ No newline at end of file diff --git a/assets/maps/test_map.tmx b/assets/maps/test_map.tmx index 46404e5..796dea9 100644 --- a/assets/maps/test_map.tmx +++ b/assets/maps/test_map.tmx @@ -1,86 +1,86 @@ - + - + + -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,3,3,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -3,3,3,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,2,2,2,2,2,2,2,2,2,2,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,2,2,2,2,2,2,2,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,2,2,2,2,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,4,4,3,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,1,1,1, +1,1,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1, +3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1, +4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,1,1, +4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,1,1,1, +4,4,4,4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1, +4,4,4,4,4,3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1, +4,4,4,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +3,3,3,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,4,4,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,4,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,4,4,4,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,4,4,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,5,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,5,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,5,5,6,5,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,5,5,6,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,6,5,6,5,6,6,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,5,5,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,6,6,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -122,15 +122,16 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,4,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,4,4,4,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,6,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,5,5,6,6,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,6,5,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,6,5,5,5,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,5,6,6,6,6,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,6,6,5,5,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,5,6,5,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/assets/tilesets/default.png b/assets/tilesets/default.png index aaddf19be0c20f0dfcfde75864dafc8f130c2804..85397f6eec83ad2fee75bf7ac0a97d775c7a8c47 100644 GIT binary patch literal 4892 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 KXZ^|&o%SEeLrVkz literal 4746 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 b1eG5DX$njcGL^Xa=+hYAH@#P>2aEVGPUl#x diff --git a/assets/tilesets/default.tsx b/assets/tilesets/default.tsx index 55a7ece..217c793 100644 --- a/assets/tilesets/default.tsx +++ b/assets/tilesets/default.tsx @@ -1,4 +1,24 @@ - + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/tilesets/ore.png b/assets/tilesets/ore.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5decf14a7405d1d6dbdaed0106a5fbc8b6e4a1 GIT binary patch literal 4720 zcmV-$5|8bPP)EX>4Tx04R}tkv&MmKpe$iTcuJf9qb_DkfAzR5EbdDRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRjWHa-`QDULg#c~(3vY`@B6UP))qkMnP zWrgz=XSG^q?R)YUh6~!tGS_L2AcaLNL4*JqbyQG=g*dGmDJC+spY-q#JARQ|GPx>X zjjYy%h99ZlW?E_Z;TCtWfmM+(sN7mL9A8GTb87`z2SYi@7teVjf3S?Vf%0~{Oz zVK?wPt2S_-Z;7r#T#w0<=InsO;!~1LpXCH*+^L z`PaYyYrJ##*eNQsQ^yNv&!|7ApYAd9j8sFf2|pW5Yg9YpMLE?%Ee7K|BxM{dY3=yE z(yC{Susl@e9b_^&1)MWTSG>=p?0L5TJ2Rtq1Xn2w^hJol(i&{m6MAE~+@n@d(=i^F z&C(E3&ZKq0H_sdrQ6h0LIHQE9v}1=3W$9oF>ngAb-8GbstA!=~=*YL9N4ob!7 zWdVroGz}Q%F$gU;+~kO2SjvW0Inj;5hKU>l(Lh=)Rufxy)LL1bAtyna zA@>Tv>x+}Tyq*`0v8Ho19poAJFGK)s4rSwz7i!7WT)1B|^oqEVXjX;`q#5+Mtdz760@PDe zL%_B=SO=7hYl(EK1n&qAHi6uQ!%f!7I8w1lY<&A+_}R_89Pi}a`Gb7C+v)Z3 z>E@b-8UrQ>*LUY%_k6kAJskp%4V~HdA4C7$na2G{O&z1=>-u+}&z`COsQ`wMhRRxvllmswz3%6M!A86dcoSsR&by0EKHSX;@Zo0Q+fPql z!kgtvt!doc?o`xMPMNe>&UYsno#>alfzP)SH^&`AG)NQX@yU-6oz~iTeQ_&&TX3_* zcl7#xK-II~4Gb>w_9{Ko2jpM=?ze<6Qc}WsueMd3s?_e;T4wN~sT+(aO$wI4uru^x z5K~YUw0fau#C1{^e78u9^i9dBDh}KLzI0Ly(jPPa+#_AMy?44M%exm(Ir_tw5$~Ng zESejw6pS-Or&2{#yOE{^D}iA)^lA`OQG%jEsw=JwNrjz{q_$x+N=_B5;0EQ*{_srx zj}gH2fKc$kv85!rt1QWADl1skqJmgqoVth%xHxfo+&CPvU<0Wr3aG6tMd_=cp_5Om zqN_Fb0;O9y|RkgvB5rWSQdSV!6jt`aKE8R58sUZbk zT|9~;#S9jJtNlUFrw55G(=v#uQcRaxn%q22S}_`IKzilocF8OuL^%z^Vl@)b{ppGRU8G~m@mG`f+K<4&t_k$mWU?%zx>4|3%{4@e! z4ORuT6R$j?E2jt5roypXN_RL_IX{b39gp2DW14{OkumYI*wG-wvu3Oh2(T!3>dimq$@+sJZC(_j_Ky+T`0W zJ8~KLbeK^Qwcb8g0)I^aIUOm^;$r6hp&&hxw?;a6T!_FXYhKk(d+l50c!F-BOQE*P z@tA0fk`icX8hk_5QE;TG+IHI!?JVno-KKNSl&6F_cp90&api?C@ihUrLMwbzSK?@wNbh;jOU)4 z!(N9lGMvq9Tj6|uka3)Odwwfqp=#s(Rl^UFU@aGu$2LPz$fZ**a|))*UVEJdJ4s{)80p(Z{a_L^41U%pxRa69nf^ZZO7 zkPrX#H>9;7xiVZim95gcC9MWG6`@-EUJz^8ZaQ|f+SMX$WeAQULOYz;oX2Y>PCHpn zoxwFwqgB9|Cbc!4_A~h)Sf{d-2do?LJe7m*4p*u!u|0GdE*z2?S-griwzXoMMJj06 zuyqnUSh^adZ4A*mtbgbC(j`NUB*4@ssiKW+t(jZ1JJt-0! zR>Lnk)k@P+Bd_--34Y@*ULNJs=Yh8u2kF_-bJ7oYJNlLwtkTVlICy*Yl;72PdiOj$ zCZ?g2C9~T(HVnNkTQ4W{Z`m(L;GuTr#xaHEfN%ReZ=4*`aD^bw!O*HbbxOC(e94UFq$5snL%NL3uo0 zsq0T7dHrhRyH7iiF8VZrpjk!5R9b5~%u&BQp7HTI>dqk3$3*TYTyD5sBrhUnC{R@UQYdDUVJvKm zvX4gFxMM4e#OmoWW0TiR!K;-eC+yHM`eR%6)BT{mH5v}@0-9GO3K%OrSB#wyTW~Ux z+k&ed+@Pw4EicTwf#Z@uER(m;p57`~FV?RuQm_AVZk?pil)IlpG zS7@cF7SS+8Y;DjydCh1=?6jBVC}M|%?Vgsp)Oi#mqP@*(2i4>w(h@;MH_h6YhK_>Z zs8KY;3EEF1z{Wt%o&Zl>z|qr-iWVV^5!)Jc54P%d>iXhpLyaT1%zhRw$9wTAm{v%~ zg~}pH;bA%F_OJ(_Zw-yY=lkcu5CBt}u%(Pui)e+=8FZ&rJVuq2D>8Vj6Z}xATR=3S zW}|E5beB;FQB-@cvYn3f6sYy-5AGZ|ZPJ`!JyvlpL$#FNh~~#Bt?R>HZRuFCUz1klyt>+0PZj6t zGkw5l%Sa6vZ}8RQoYy5C83rMhCX@5vI<+CSHVH$bSiyNiTQcFy5W3Ojh_s>_rPpAb|Yy-~Nti za3Dg;1yek_vucW=_YEVERx7(9!5|d1EO(8#3rs=CO$pM;t!mQ=L#6eCsFMP^^CC$b zwFmaLlWQY&h-24YRIYDlwbqapWf(0lFHUm(aIT~#I$2D$ph=&mj)YPwV~n&?d3AOA zO7Zu%vwE#KC(?Al(0F}u;QQN|w^yfMJp6ZGX5PO%{r`>tleZXeaKmOV>(6 z$ysDP5A+x*L{hQr&mB1%w$kX;a>`9b9MVqIS~1ay8Z@|y+Q<|vqpeia>7fv%({iLs z;O$kCSLdtX0xvI~fJTROD+J@{T6ukWl2?}}i5RT2G!b51o#e~ikK^7^oD6%1hy|zm z`r^R#afiyU-}Gqua|%esa(Vz&r5nW!hV;0C&x|t?Fla60)uN}$5S5^Yv!RfCrT2xN zklvwnCHhe)9$Tt38AMFerlV?Wk0Q-jZEL~#AWkZE>!=apd8cjzy>#5<*mAWPN4mKH2lrgk?(IN-o9A=%Ln_-%Rjyko}xi1 zPkwxV=P)9?zBoP82h0*Jr`*^N1Hl;-n8%$MGZFj@-O!~YD%9R^!%EI@xLHVMAs++X zKUMjh1Dc~}@D^&V?88KEO-dE2IF7fgn69`v(oXhQ9sBRV|0VmY*O}ZJrRp>MKaBvs z306F66lVkK8!HC8WK^D7ys-_K>8a==O>jQbO=Kc+S{JY&(Nl}yeMP+Cw1D*kTdDNc yIe&>PTjl(lNV>ID119|MHf7$NKTibzx&1q5h83E`mi1Qv0000 + + + + + diff --git a/i-mic-rts.rb b/i-mic-rts.rb index 1593c61..45ad04e 100755 --- a/i-mic-rts.rb +++ b/i-mic-rts.rb @@ -6,6 +6,8 @@ rescue LoadError require "cyberarm_engine" end +require "nokogiri" + require_relative "lib/version" require_relative "lib/errors" require_relative "lib/window" @@ -26,6 +28,7 @@ require_relative "lib/zorder" require_relative "lib/entity" # require_relative "lib/entities/" require_relative "lib/map" +require_relative "lib/tiled_map" require_relative "lib/order" require_relative "lib/friendly_hash" diff --git a/lib/map.rb b/lib/map.rb index 5e80914..c758f87 100644 --- a/lib/map.rb +++ b/lib/map.rb @@ -1,30 +1,54 @@ class IMICRTS class Map - Tile = Struct.new(:position, :color, :image, :state) + Tile = Struct.new(:position, :color, :image, :state, :type) - def initialize(width:, height:, tile_size: 32) - @width, @height = width, height - @tile_size = tile_size + def initialize(map_file:) + @tiled_map = TiledMap.new(map_file) - @tileset = Gosu::Image.load_tiles("#{ASSETS_PATH}/tilesets/default.png", tile_size, tile_size, retro: true) + @width, @height = @tiled_map.width, @tiled_map.height + @tile_size = @tiled_map.tile_size @tiles = [] + @ores = [] - height.times do |y| - width.times do |x| - @tiles.push( - Tile.new( - CyberarmEngine::Vector.new(x * @tile_size, y * @tile_size, ZOrder::TILE), - Gosu::Color.rgb(rand(25), rand(150..200), rand(25)), - @tileset.sample, - # :unexplored - :visible - ) - ) + @tiled_map.layers.each do |layer| + layer.height.times do |y| + layer.width.times do |x| + add_terrain(x, y, layer.data(x, y)) if layer.name.downcase == "terrain" + add_ore(x, y, layer.data(x, y)) if layer.name.downcase == "ore" + end end end end + def add_terrain(x, y, tile_id) + if tile = @tiled_map.get_tile(tile_id - 1) + @tiles << Tile.new( + CyberarmEngine::Vector.new(x * @tile_size, y * @tile_size, ZOrder::TILE), + nil, + tile.image, + :yes, + tile.data.type + ) + else + raise "No such tile!" + end + end + + def add_ore(x, y, tile_id) + if tile = @tiled_map.get_tile(tile_id - 1) + @ores << Tile.new( + CyberarmEngine::Vector.new(x * @tile_size, y * @tile_size, ZOrder::ORE), + nil, + tile.image, + :yes, + nil + ) + else + @ores << nil + end + end + def draw(camera) visible_tiles(camera).each do |tile| tile.image.draw(tile.position.x, tile.position.y, tile.position.z) @@ -54,6 +78,10 @@ class IMICRTS if tile = tile_at(_x, _y) _tiles.push(tile) if tile.state != :unexplored end + + if ore = ore_at(_x, _y) + _tiles.push(ore) if ore.state != :unexplored + end end end @@ -63,5 +91,9 @@ class IMICRTS def tile_at(x, y) @tiles[x + y * @width] end + + def ore_at(x, y) + @ores[x + y * @width] + end end end \ No newline at end of file diff --git a/lib/states/game.rb b/lib/states/game.rb index 922f2e5..1ef3dea 100644 --- a/lib/states/game.rb +++ b/lib/states/game.rb @@ -4,7 +4,7 @@ class IMICRTS window.show_cursor = true @player = Player.new(id: 0) - @director = Director.new(map: Map.new(width: 256, height: 256), players: [@player]) + @director = Director.new(map: Map.new(map_file: "maps/test_map.tmx"), players: [@player]) @selected_entities = [] diff --git a/lib/tiled_map.rb b/lib/tiled_map.rb new file mode 100644 index 0000000..53ba852 --- /dev/null +++ b/lib/tiled_map.rb @@ -0,0 +1,125 @@ +class IMICRTS + class TiledMap + attr_reader :width, :height, :tile_size + attr_reader :layers, :tilesets + def initialize(map_file) + @xml = Nokogiri::XML(File.read("#{IMICRTS::ASSETS_PATH}/#{map_file}")) + + @width, @height = 0, 0 + @tile_size = 32 + + @layers = [] + @tilesets = [] + + @tiles = [] + + parse + + terrain = @layers.find { |layer| layer.name.downcase == "terrain" } + @width, @height = terrain.width, terrain.height + + @tilesets.each do |tileset| + @tiles.push(*tileset.tiles) + end + + @xml = nil + end + + def parse + @xml.search("//tileset").each do |tileset| + @tilesets << TileSet.new(tileset) + end + + @xml.search("//layer").each do |layer| + @layers << Layer.new(layer) + end + end + + def get_tile(tile_id) + return nil if tile_id < 0 + + @tiles.dig(tile_id) + end + + + + class Layer + attr_reader :name, :width, :height + def initialize(xml_layer) + @name = xml_layer["name"] + @width, @height = Integer(xml_layer["width"]), Integer(xml_layer["height"]) + @data = [] + + xml_layer.css("data").inner_html.each_line do |line| + @data.push(*line.strip.split(",").map { |id| Integer(id) }) + end + end + + def data(x, y) + @data[x + y * @width] + end + end + + + + + class TileSet + attr_reader :first_gid, :name, :tile_width, :tile_height, :tile_count, :columns, :rows + attr_reader :tiles + Tile = Struct.new(:image, :data) + def initialize(xml_tileset) + @first_gid = nil + @tiles = [] + + xml_tileset.attributes.each do |name, attrib| + case name + when "firstgid" + @first_gid = Integer(attrib.value) + when "source" + parse(attrib.value) + end + end + end + + def parse(file) + xml = Nokogiri::XML(File.read("#{IMICRTS::ASSETS_PATH}/#{file.sub("../", "")}")) + tileset = xml.search("//tileset").first + + data = {} + tileset.attributes.each { |attrib, value| data[attrib] = value.value } + + data.each do |key, value| + case key + when "name" + @name = value + when "tilewidth" + @tile_width = Integer(value) + when "tileheight" + @tile_height = Integer(value) + when "tilecount" + @tile_count = Integer(value) + when "columns" + @columns = Integer(value) + when "rows" + @rows = Integer(value) + end + end + + path = tileset.search("//image").first.attributes.detect { |a, v| a == "source" }.last.value + images = Gosu::Image.load_tiles("#{IMICRTS::ASSETS_PATH}/tilesets/#{path}", @tile_width, @tile_height, retro: true) + + tileset.search("//tile").each_with_index do |xml, index| + tile = Tile.new + tile.image = images[index] + tile.data = FriendlyHash.new + + xml.attributes.each do |name, data| + tile.data[name.to_sym] = data.value if name == "type" + end + + @tiles << tile + end + end + end + end +end \ No newline at end of file diff --git a/lib/zorder.rb b/lib/zorder.rb index 71066e2..7c6932b 100644 --- a/lib/zorder.rb +++ b/lib/zorder.rb @@ -3,6 +3,7 @@ class IMICRTS base_z = 5 enum = [ :TILE, + :ORE, :DECORATION, :GROUND_VEHICLE, :BUILDING,