gbtiles 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +48 -0
  4. data/bin/gbm +27 -0
  5. data/bin/gbr +27 -0
  6. data/lib/gbtiles/data_type.rb +73 -0
  7. data/lib/gbtiles/gbm/cli/convert.rb +56 -0
  8. data/lib/gbtiles/gbm/export/asm/asm.h.erb +19 -0
  9. data/lib/gbtiles/gbm/export/asm/asm.rb +52 -0
  10. data/lib/gbtiles/gbm/export/asm/asm.s.erb +30 -0
  11. data/lib/gbtiles/gbm/import/gbm_file.rb +82 -0
  12. data/lib/gbtiles/gbm/map/map_set.rb +55 -0
  13. data/lib/gbtiles/gbm/map/object.rb +21 -0
  14. data/lib/gbtiles/gbm/map/object_type.rb +14 -0
  15. data/lib/gbtiles/gbm/map/objects/map.rb +49 -0
  16. data/lib/gbtiles/gbm/map/objects/map_export_settings.rb +77 -0
  17. data/lib/gbtiles/gbm/map/objects/map_settings.rb +73 -0
  18. data/lib/gbtiles/gbm/map/objects/map_tile_data.rb +40 -0
  19. data/lib/gbtiles/gbm/map/objects/map_tile_data_record.rb +40 -0
  20. data/lib/gbtiles/gbm/map/objects/producer.rb +33 -0
  21. data/lib/gbtiles/gbm/map/objects/unknown.rb +14 -0
  22. data/lib/gbtiles/gbr/cli/convert.rb +58 -0
  23. data/lib/gbtiles/gbr/export/asm/asm.h.erb +15 -0
  24. data/lib/gbtiles/gbr/export/asm/asm.rb +52 -0
  25. data/lib/gbtiles/gbr/export/asm/asm.s.erb +17 -0
  26. data/lib/gbtiles/gbr/import/gbr_file.rb +70 -0
  27. data/lib/gbtiles/gbr/tile_set/color_set.rb +12 -0
  28. data/lib/gbtiles/gbr/tile_set/export_type.rb +13 -0
  29. data/lib/gbtiles/gbr/tile_set/object.rb +18 -0
  30. data/lib/gbtiles/gbr/tile_set/object_type.rb +16 -0
  31. data/lib/gbtiles/gbr/tile_set/objects/palettes.rb +41 -0
  32. data/lib/gbtiles/gbr/tile_set/objects/producer.rb +33 -0
  33. data/lib/gbtiles/gbr/tile_set/objects/tile_data.rb +82 -0
  34. data/lib/gbtiles/gbr/tile_set/objects/tile_export.rb +105 -0
  35. data/lib/gbtiles/gbr/tile_set/objects/tile_import.rb +57 -0
  36. data/lib/gbtiles/gbr/tile_set/objects/tile_pal.rb +41 -0
  37. data/lib/gbtiles/gbr/tile_set/objects/tile_settings.rb +65 -0
  38. data/lib/gbtiles/gbr/tile_set/objects/unknown.rb +14 -0
  39. data/lib/gbtiles/gbr/tile_set/sgb_palettes.rb +13 -0
  40. data/lib/gbtiles/gbr/tile_set/split_order.rb +13 -0
  41. data/lib/gbtiles/gbr/tile_set/tile_set.rb +57 -0
  42. data/lib/gbtiles/helpers/fixnum.rb +6 -0
  43. data/lib/gbtiles/version.rb +3 -0
  44. metadata +104 -0
@@ -0,0 +1,15 @@
1
+ <% tile_export = tile_set.tile_export.first -%>
2
+ /**
3
+ * .H created with
4
+ * GBTiles Ruby Gem (v<%= GBTiles::VERSION %>) - GBR
5
+ *
6
+ * .GBR created with
7
+ * <%= tile_set.producers.first.name %> (v<%= tile_set.producers.first.version %>)
8
+ * <%= tile_set.producers.first.info %>
9
+ */
10
+
11
+ // Helper: The bank the tiles were saved as
12
+ #define <%= tile_export.label_name %>Bank <%= tile_export.bank %>
13
+
14
+ // Extern: A placeholder for the data
15
+ extern unsigned char <%= tile_export.label_name %>[];
@@ -0,0 +1,52 @@
1
+ require "erb"
2
+
3
+ module GBTiles
4
+ module GBR
5
+ module Export
6
+ module ASM
7
+ class ASM
8
+ include ERB::Util
9
+
10
+ attr_accessor :tile_set
11
+ @tile_set
12
+
13
+ def initialize
14
+ end
15
+
16
+ def prerender
17
+ if @tile_set.nil? then
18
+ raise "Missing required tile set"
19
+ end
20
+ end
21
+
22
+ def render_s
23
+ prerender
24
+
25
+ template = File.open(File.join(__dir__, "asm.s.erb"), "r").read
26
+
27
+ ERB.new(template, nil, "-").result(binding)
28
+ end
29
+
30
+ def render_h
31
+ prerender
32
+
33
+ template = File.open(File.join(__dir__, "asm.h.erb"), "r").read
34
+
35
+ ERB.new(template, nil, "-").result(binding)
36
+ end
37
+
38
+ def write output_stream
39
+ output_stream.write(render_s)
40
+
41
+ if output_stream.is_a? File then
42
+ header_path = "#{File.basename(output_stream.path, ".s")}.h"
43
+ header_stream = File.open(header_path, "w")
44
+ header_stream.write(render_h)
45
+ header_stream.close
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ <% tile_export = tile_set.tile_export.first -%>
2
+ ; .S created with
3
+ ; GBTiles Ruby Gem (v<%= GBTiles::VERSION %>) - GBR
4
+ ;
5
+ ; .GBR created with
6
+ ; <%= tile_set.producers.first.name %> (v<%= tile_set.producers.first.version %>)
7
+ ; <%= tile_set.producers.first.info %>
8
+
9
+ .area _CODE_<%= tile_export.bank %>
10
+
11
+ .globl _<%= tile_export.label_name %>
12
+ .dw _<%= tile_export.label_name %>
13
+
14
+ _<%= tile_export.label_name %>:
15
+ <% (tile_export.from..tile_export.upto).each do |i| -%>
16
+ .db <%= tile_set.tile_data.first.render_tile(i) %>
17
+ <% end %>
@@ -0,0 +1,70 @@
1
+ module GBTiles
2
+ module GBR
3
+ module Import
4
+ class GBRFile
5
+ attr_accessor :version, :tile_set
6
+
7
+ @version
8
+ @tile_set
9
+
10
+ def initialize()
11
+ @tile_set = GBTiles::GBR::TileSet::TileSet.new
12
+ end
13
+
14
+ def self.open(file)
15
+ import = GBTiles::GBR::Import::GBRFile.new
16
+
17
+ # Check to see if this is a valid file type
18
+ if (file.read(3) != "GBO") then
19
+ raise "Invalid file, header does not start with GBO"
20
+ end
21
+
22
+ # Version number
23
+ import.version = file.read(1)
24
+
25
+ # For each object
26
+ while !file.eof?
27
+ object_type = GBTiles::DataType.word(file.read(2))
28
+ object_id = GBTiles::DataType.word(file.read(2))
29
+ object_len = GBTiles::DataType.long(file.read(4))
30
+ object_data = file.read(object_len)
31
+
32
+ case object_type
33
+ when GBTiles::GBR::TileSet::ObjectType::PRODUCER
34
+ object = GBTiles::GBR::TileSet::Objects::Producer.initFromBitString object_data
35
+
36
+ when GBTiles::GBR::TileSet::ObjectType::TILE_DATA
37
+ object = GBTiles::GBR::TileSet::Objects::TileData.initFromBitString object_data
38
+
39
+ when GBTiles::GBR::TileSet::ObjectType::TILE_SETTINGS
40
+ object = GBTiles::GBR::TileSet::Objects::TileSettings.initFromBitString object_data
41
+
42
+ when GBTiles::GBR::TileSet::ObjectType::TILE_EXPORT
43
+ object = GBTiles::GBR::TileSet::Objects::TileExport.initFromBitString object_data
44
+
45
+ when GBTiles::GBR::TileSet::ObjectType::TILE_IMPORT
46
+ object = GBTiles::GBR::TileSet::Objects::TileImport.initFromBitString object_data
47
+
48
+ when GBTiles::GBR::TileSet::ObjectType::PALETTES
49
+ object = GBTiles::GBR::TileSet::Objects::Palettes.initFromBitString object_data
50
+
51
+ when GBTiles::GBR::TileSet::ObjectType::TILE_PAL
52
+ object = GBTiles::GBR::TileSet::Objects::TilePal.initFromBitString object_data
53
+
54
+ else
55
+ object = GBTiles::GBR::TileSet::Objects::Unknown.new object_type
56
+ object.object_data = object_data
57
+
58
+ end
59
+
60
+ object.object_id = object_id
61
+
62
+ import.tile_set.objects.push object
63
+ end
64
+
65
+ import
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,12 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module ColorSet
5
+ POCKET = 0
6
+ GAME_BOY = 1
7
+ GBC = 2
8
+ SGB = 3
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,13 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module ExportType
5
+ RGBDS_ASSEMBLY = 0x00
6
+ RGBDS_OBJECT = 0x01
7
+ TASM_ASSEMBLY = 0x02
8
+ GBDK_C = 0x03
9
+ BINARY = 0x04
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ class Object
5
+
6
+ attr_accessor :object_id
7
+ @object_id
8
+
9
+ attr_accessor :object_type
10
+ @object_type
11
+
12
+ def initialize object_type
13
+ @object_type = object_type
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,16 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module ObjectType
5
+ PRODUCER = 0x01
6
+ TILE_DATA = 0x02
7
+ TILE_SETTINGS = 0x03
8
+ TILE_EXPORT = 0x04
9
+ TILE_IMPORT = 0x05
10
+ PALETTES = 0x0D
11
+ TILE_PAL = 0x0E
12
+ DELETED = 0xFF
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,41 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module Objects
5
+ class Palettes < GBTiles::GBR::TileSet::Object
6
+
7
+ attr_accessor :id
8
+ @id
9
+
10
+ attr_accessor :count
11
+ @count
12
+
13
+ attr_accessor :colors
14
+ @colors
15
+
16
+ attr_accessor :sgb_count
17
+ @sgb_count
18
+
19
+ attr_accessor :sgb_colors
20
+ @sgb_colors
21
+
22
+ def initialize
23
+ super GBTiles::GBR::TileSet::ObjectType::PALETTES
24
+ end
25
+
26
+ def self.initFromBitString src
27
+ object = GBTiles::GBR::TileSet::Objects::Palettes.new
28
+
29
+ object.id = GBTiles::DataType.word!(src)
30
+ object.count = GBTiles::DataType.word!(src)
31
+ object.colors = src.slice!(0, object.count)
32
+ object.sgb_count = GBTiles::DataType.word!(src)
33
+ object.sgb_colors = src.slice!(0, object.sgb_count)
34
+
35
+ object
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,33 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module Objects
5
+ class Producer < GBTiles::GBR::TileSet::Object
6
+
7
+ attr_accessor :name
8
+ @name
9
+
10
+ attr_accessor :version
11
+ @version
12
+
13
+ attr_accessor :info
14
+ @info
15
+
16
+ def initialize
17
+ super GBTiles::GBR::TileSet::ObjectType::PRODUCER
18
+ end
19
+
20
+ def self.initFromBitString src
21
+ object = GBTiles::GBR::TileSet::Objects::Producer.new
22
+
23
+ object.name = GBTiles::DataType.string!(src, 30)
24
+ object.version = GBTiles::DataType.string!(src, 10)
25
+ object.info = GBTiles::DataType.string!(src, 80)
26
+
27
+ object
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,82 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module Objects
5
+ class TileData < GBTiles::GBR::TileSet::Object
6
+
7
+ attr_accessor :name
8
+ @name
9
+
10
+ attr_accessor :width
11
+ @width
12
+
13
+ attr_accessor :height
14
+ @height
15
+
16
+ attr_accessor :count
17
+ @count
18
+
19
+ attr_accessor :color_set
20
+ @color_set
21
+
22
+ attr_accessor :data
23
+ @data
24
+
25
+ def initialize
26
+ super GBTiles::GBR::TileSet::ObjectType::TILE_DATA
27
+ end
28
+
29
+ def self.initFromBitString src
30
+ object = GBTiles::GBR::TileSet::Objects::TileData.new
31
+
32
+ object.name = GBTiles::DataType.string!(src, 30)
33
+ object.width = GBTiles::DataType.word!(src)
34
+ object.height = GBTiles::DataType.word!(src)
35
+ object.count = GBTiles::DataType.word!(src)
36
+ object.color_set = src.slice!(0, 4)
37
+ object.data = src
38
+
39
+ object
40
+ end
41
+
42
+ def render_tile(tile_index)
43
+ tile = []
44
+
45
+ tile_data = @data.slice(
46
+ tile_index * @width * @height,
47
+ @width * @height
48
+ )
49
+
50
+ (1..@height).each do |row|
51
+ byte_0 = 0x00
52
+ byte_1 = 0x00
53
+
54
+ bitmask = 0x80
55
+
56
+ (1..@width).each do |col|
57
+ pixel = tile_data[(row - 1) * @height + col - 1]
58
+
59
+ case pixel.unpack("C")[0]
60
+ when 0 # Black
61
+ when 1 # Dark Grey
62
+ byte_0 |= bitmask
63
+ when 2 # Light Grey
64
+ byte_1 |= bitmask
65
+ when 3 # White
66
+ byte_0 |= bitmask
67
+ byte_1 |= bitmask
68
+ end
69
+
70
+ bitmask >>= 1
71
+ end
72
+
73
+ tile.push(sprintf("0x%02x,0x%02x", byte_0, byte_1))
74
+ end
75
+
76
+ tile.join(",")
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,105 @@
1
+ module GBTiles
2
+ module GBR
3
+ module TileSet
4
+ module Objects
5
+ class TileExport < GBTiles::GBR::TileSet::Object
6
+
7
+ attr_accessor :tile_id
8
+ @tile_id
9
+
10
+ attr_accessor :file_name
11
+ @file_name
12
+
13
+ attr_accessor :file_type
14
+ @file_type
15
+
16
+ attr_accessor :section_name
17
+ @section_name
18
+
19
+ attr_accessor :label_name
20
+ @label_name
21
+
22
+ attr_accessor :bank
23
+ @bank
24
+
25
+ attr_accessor :tile_array
26
+ @tile_array
27
+
28
+ attr_accessor :format
29
+ @format
30
+
31
+ attr_accessor :counter
32
+ @counter
33
+
34
+ attr_accessor :from
35
+ @from
36
+
37
+ attr_accessor :upto
38
+ @upto
39
+
40
+ attr_accessor :compression
41
+ @compression
42
+
43
+ attr_accessor :include_colors
44
+ @include_colors
45
+
46
+ attr_accessor :sgb_palettes
47
+ @sgb_palettes
48
+
49
+ attr_accessor :gbc_palettes
50
+ @gbc_palettes
51
+
52
+ attr_accessor :make_meta_tiles
53
+ @make_meta_tiles
54
+
55
+ attr_accessor :meta_offset
56
+ @meta_offset
57
+
58
+ attr_accessor :meta_counter
59
+ @meta_counter
60
+
61
+ attr_accessor :split
62
+ @split
63
+
64
+ attr_accessor :block_size
65
+ @block_size
66
+
67
+ attr_accessor :sel_tab
68
+ @sel_tab
69
+
70
+ def initialize
71
+ super GBTiles::GBR::TileSet::ObjectType::TILE_EXPORT
72
+ end
73
+
74
+ def self.initFromBitString src
75
+ object = GBTiles::GBR::TileSet::Objects::TileExport.new
76
+
77
+ object.tile_id = GBTiles::DataType.word!(src)
78
+ object.file_name = GBTiles::DataType.string!(src, 128)
79
+ object.file_type = GBTiles::DataType.byte!(src)
80
+ object.section_name = GBTiles::DataType.string!(src, 20)
81
+ object.label_name = GBTiles::DataType.string!(src, 20)
82
+ object.bank = GBTiles::DataType.byte!(src)
83
+ object.tile_array = GBTiles::DataType.byte!(src)
84
+ object.format = GBTiles::DataType.byte!(src)
85
+ object.counter = GBTiles::DataType.byte!(src)
86
+ object.from = GBTiles::DataType.word!(src)
87
+ object.upto = GBTiles::DataType.word!(src)
88
+ object.compression = GBTiles::DataType.byte!(src)
89
+ object.include_colors = GBTiles::DataType.boolean!(src)
90
+ object.sgb_palettes = GBTiles::DataType.byte!(src)
91
+ object.gbc_palettes = GBTiles::DataType.byte!(src)
92
+ object.make_meta_tiles = GBTiles::DataType.boolean!(src)
93
+ object.meta_offset = GBTiles::DataType.long!(src)
94
+ object.meta_counter = GBTiles::DataType.byte!(src)
95
+ object.split = GBTiles::DataType.boolean!(src)
96
+ object.block_size = GBTiles::DataType.long!(src)
97
+ object.sel_tab = GBTiles::DataType.byte!(src)
98
+
99
+ object
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end