gbtiles 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ead8106729b3a84988e0fec3f04c932a1aa870df
4
+ data.tar.gz: a0e02dfa4cca73ae5253ede1e000ab12311efcd8
5
+ SHA512:
6
+ metadata.gz: fb813f183e1c213ff6b82991c49dd999c4179a5134a4a1e333f4e701a9bfc032decd53ea5fded7b17d023e027aa3693a76057b3575186fd78faaeda408fab8c9
7
+ data.tar.gz: 10b070b7f0ce28e32d00255517a1d1c1ac5e69385a2637930eefedf8382cfa127e919247dae4c04dde605743680c263eb76212b85633c7c0490cb8eb73d354a7
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2014 Bashkim Isai
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
@@ -0,0 +1,48 @@
1
+ # GBTiles
2
+
3
+ Version 0.0.1
4
+
5
+ Converts `.GBR` files created with
6
+ [Harry Mulder's Tile Designer (GBTD)](http://www.devrs.com/gb/hmgd/gbtd.html)
7
+ and `.GBM` files created with
8
+ [Harry Mulder's Map Builder (GBMB)](http://www.devrs.com/gb/hmgd/gbmb.html)
9
+ to different formats for use with the Game Boy and
10
+ [GBDK](http://gbdk.sourceforge.net/).
11
+
12
+ **N.B.: Not all of the functionality provided by Harry Mulder's GBR and GBM
13
+ file format specification have been implemented; however there is enough to
14
+ generate the basics for tiles and maps.**
15
+
16
+ ## Installation
17
+
18
+ gem install gbtiles
19
+
20
+ ## Usage
21
+
22
+ ### Help
23
+
24
+ To view help information for the GBR or GBM commands, simply type one of the
25
+ following:
26
+
27
+ gbr --help
28
+ gbm --help
29
+
30
+ ### GBR (GBTD files)
31
+
32
+ Converts a Tile Designer file `*.gbr` to an ASM file `*.s` and generates
33
+ a C file `*.h` for convenience.
34
+
35
+ gbr convert --output "sample.s" sample.gbr
36
+
37
+ ### GBM (GBMB files)
38
+
39
+ Converts a Map Builder file `*.gbm` to an ASM file `*.s` and generates
40
+ a C file `*.h` for convenience.
41
+
42
+ gbm convert --output "sample.s" sample.gbm
43
+
44
+ ## Contributors
45
+
46
+ * @bashaus -- [Bashkim Isai](http://www.bashkim.com.au/)
47
+
48
+ If you fork this project and create a pull request add your GitHub username, your full name and website to the end of list above.
data/bin/gbm ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ require "gli"
3
+
4
+ include GLI::App
5
+
6
+ require "gbtiles/version"
7
+ require "gbtiles/helpers/fixnum"
8
+
9
+ require "gbtiles/gbm/cli/convert"
10
+
11
+ program_desc "Converts .GBM files to different formats for the Game Boy"
12
+
13
+ version GBTiles::VERSION
14
+
15
+ pre do |global,command,options,args|
16
+ true
17
+ end
18
+
19
+ post do |global,command,options,args|
20
+ true
21
+ end
22
+
23
+ on_error do |exception|
24
+ true
25
+ end
26
+
27
+ exit run(ARGV)
data/bin/gbr ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ require "gli"
3
+
4
+ include GLI::App
5
+
6
+ require "gbtiles/version"
7
+ require "gbtiles/helpers/fixnum"
8
+
9
+ require "gbtiles/gbr/cli/convert"
10
+
11
+ program_desc "Converts .GBR files to different formats for the Game Boy"
12
+
13
+ version GBTiles::VERSION
14
+
15
+ pre do |global,command,options,args|
16
+ true
17
+ end
18
+
19
+ post do |global,command,options,args|
20
+ true
21
+ end
22
+
23
+ on_error do |exception|
24
+ true
25
+ end
26
+
27
+ exit run(ARGV)
@@ -0,0 +1,73 @@
1
+ module GBTiles
2
+ module DataType
3
+ def self.string(src, length = nil)
4
+ if !length.nil? then
5
+ string = src.slice(0, length)
6
+ else
7
+ string = src
8
+ end
9
+
10
+ if !string.nil? then
11
+ string = string.split(/\0/).first
12
+ end
13
+
14
+ if !string.nil?
15
+ string = string.unpack("A*")[0]
16
+ end
17
+
18
+ string
19
+ end
20
+
21
+ def self.string!(src, length = nil)
22
+ if !length.nil? then
23
+ string = src.slice!(0, length)
24
+ else
25
+ string = src
26
+ end
27
+
28
+ self.string(string, length)
29
+ end
30
+
31
+ # WORD
32
+ # LITTLE ENDIAN
33
+ # 2 BYTES
34
+ def self.word(src)
35
+ src.slice(0, 2).unpack("v*")[0]
36
+ end
37
+
38
+ def self.word!(src)
39
+ self.word(src.slice!(0, 2))
40
+ end
41
+
42
+ # BYTE
43
+ # 1 BYTE
44
+ def self.byte(src)
45
+ src.slice(0, 1).unpack("C*")[0]
46
+ end
47
+
48
+ def self.byte!(src)
49
+ self.byte(src.slice!(0, 1))
50
+ end
51
+
52
+ # BOOLEAN
53
+ # 1 BYTE
54
+ def self.boolean(src)
55
+ src.slice!(0, 1).unpack("C")[0].eql? 1
56
+ end
57
+
58
+ def self.boolean!(src)
59
+ self.boolean(src.slice!(0, 1))
60
+ end
61
+
62
+ # LITTLE ENDIAN
63
+ # 32 BIT INTEGER
64
+ # 4 BYTES
65
+ def self.long(src)
66
+ src.slice(0, 4).unpack("V*")[0]
67
+ end
68
+
69
+ def self.long!(src)
70
+ self.long(src.slice!(0, 4))
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,56 @@
1
+ require "gbtiles/data_type"
2
+
3
+ require "gbtiles/gbm/import/gbm_file"
4
+
5
+ require "gbtiles/gbm/map/map_set"
6
+
7
+ require "gbtiles/gbm/map/object"
8
+ require "gbtiles/gbm/map/object_type"
9
+
10
+ require "gbtiles/gbm/map/objects/producer"
11
+ require "gbtiles/gbm/map/objects/map"
12
+ require "gbtiles/gbm/map/objects/map_tile_data"
13
+ require "gbtiles/gbm/map/objects/map_tile_data_record"
14
+ require "gbtiles/gbm/map/objects/map_settings"
15
+ require "gbtiles/gbm/map/objects/map_export_settings"
16
+ require "gbtiles/gbm/map/objects/unknown"
17
+
18
+ require "gbtiles/gbm/export/asm/asm"
19
+
20
+ desc "Convert a file from GBM format"
21
+ arg_name "input"
22
+ command :convert do |c|
23
+
24
+ c.desc "Output filename (*.s)"
25
+ c.flag :output
26
+
27
+ c.action do |global_options,options,args|
28
+ # Prepare input file
29
+ if !args[0].nil? then
30
+ # Use file
31
+ input_file = File.open(args[0], "rb")
32
+ else
33
+ # Use STDIN
34
+ input_file = $stdin
35
+ end
36
+
37
+ # Prepare output file
38
+ if !options[:output].nil? then
39
+ # Use file
40
+ output_file = File.open(options[:output], "w")
41
+ else
42
+ # Use STDOUT
43
+ output_file = $stdout
44
+ end
45
+
46
+ # Do import
47
+ import = GBTiles::GBM::Import::GBMFile.open(input_file)
48
+ input_file.close
49
+
50
+ # Do export
51
+ export = GBTiles::GBM::Export::ASM::ASM.new
52
+ export.map_set = import.map_set
53
+ export.write(output_file)
54
+ output_file.close
55
+ end
56
+ end
@@ -0,0 +1,19 @@
1
+ <% map_export_settings = map_set.map_export_settings.first -%>
2
+ /**
3
+ * .H created with
4
+ * GBTiles Ruby Gem (v<%= GBTiles::VERSION %>) - GBM
5
+ *
6
+ * .GBM created with
7
+ * <%= map_set.producers.first.name %> (v<%= map_set.producers.first.version %>)
8
+ * <%= map_set.producers.first.info %>
9
+ */
10
+
11
+ <% map_set.maps.each do |map| -%>
12
+ // Helper: Map dimensions
13
+ #define <%= map_export_settings.label_name %>Width <%= map.width %>
14
+ #define <%= map_export_settings.label_name %>Height <%= map.height %>
15
+ #define <%= map_export_settings.label_name %>Bank <%= map_export_settings.bank %>
16
+
17
+ // Extern: <%= map_export_settings.label_name %>
18
+ extern unsigned char <%= map_export_settings.label_name %>[];
19
+ <% end %>
@@ -0,0 +1,52 @@
1
+ require "erb"
2
+
3
+ module GBTiles
4
+ module GBM
5
+ module Export
6
+ module ASM
7
+ class ASM
8
+ include ERB::Util
9
+
10
+ attr_accessor :map_set
11
+ @map_set
12
+
13
+ def initialize
14
+ end
15
+
16
+ def prerender
17
+ if @map_set.nil? then
18
+ raise "Missing required map"
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,30 @@
1
+ <% map_export_settings = map_set.map_export_settings.first -%>
2
+ ; .S created with
3
+ ; GBTiles Ruby Gem (v<%= GBTiles::VERSION %>) - GBM
4
+ ;
5
+ ; .GBM created with
6
+ ; <%= map_set.producers.first.name %> (v<%= map_set.producers.first.version %>)
7
+ ; <%= map_set.producers.first.info %>
8
+
9
+ .area _CODE_<%= map_export_settings.bank -%>
10
+
11
+ <% map_set.maps.each do |map| -%>
12
+ <% map_tile_data = map_set.map_tile_data(map.master_id).first -%>
13
+
14
+ ; Map <%= "(#{map.name})" unless map.name.nil? %>
15
+
16
+ .globl _<%= map_export_settings.label_name %>
17
+ .dw _<%= map_export_settings.label_name %>
18
+
19
+ _<%= map_export_settings.label_name %>:
20
+ <% (1..map.height).each do |row| -%>
21
+ <% row_tile_data = map_tile_data.row(map.width, row) -%>
22
+ <% if !row_tile_data.nil? -%>
23
+ .db <%= map_tile_data
24
+ .row(map.width, row)
25
+ .map {|x| sprintf("0x%02x", x.tile_number) }
26
+ .join(',')
27
+ %>
28
+ <% end -%>
29
+ <% end -%>
30
+ <% end %>
@@ -0,0 +1,82 @@
1
+ module GBTiles
2
+ module GBM
3
+ module Import
4
+ class GBMFile
5
+
6
+ OBJECT_MARKER = "HPJMTL"
7
+
8
+ attr_accessor :version
9
+ @version
10
+
11
+ attr_accessor :map_set
12
+ @map_set
13
+
14
+ def initialize()
15
+ @map_set = GBTiles::GBM::Map::MapSet.new
16
+ end
17
+
18
+ def self.open(file)
19
+ import = GBTiles::GBM::Import::GBMFile.new
20
+
21
+ # Check to see if this is a valid file type
22
+ if (file.read(3) != "GBO") then
23
+ raise "Invalid file, header does not start with GBO"
24
+ end
25
+
26
+ # Version number
27
+ import.version = file.read(1)
28
+
29
+ if import.version != "1" then
30
+ raise "Invalid file, can only import version number 1"
31
+ end
32
+
33
+ # For each object
34
+ while !file.eof?
35
+ # Check the marker
36
+ marker = GBTiles::DataType.string(file.read(6))
37
+
38
+ if !OBJECT_MARKER.eql? marker then
39
+ raise "Malformed file, expected marker #{OBJECT_MARKER}, got #{marker}"
40
+ end
41
+
42
+ object_type = GBTiles::DataType.word(file.read(2))
43
+ object_id = GBTiles::DataType.word(file.read(2))
44
+ master_id = GBTiles::DataType.word(file.read(2))
45
+ object_crc = GBTiles::DataType.long(file.read(4))
46
+ object_len = GBTiles::DataType.long(file.read(4))
47
+ object_data = file.read(object_len)
48
+
49
+ case object_type
50
+ when GBTiles::GBM::Map::ObjectType::PRODUCER
51
+ object = GBTiles::GBM::Map::Objects::Producer.initFromBitString object_data
52
+
53
+ when GBTiles::GBM::Map::ObjectType::MAP
54
+ object = GBTiles::GBM::Map::Objects::Map.initFromBitString object_data
55
+
56
+ when GBTiles::GBM::Map::ObjectType::MAP_TILE_DATA
57
+ object = GBTiles::GBM::Map::Objects::MapTileData.initFromBitString object_data
58
+
59
+ when GBTiles::GBM::Map::ObjectType::MAP_SETTINGS
60
+ object = GBTiles::GBM::Map::Objects::MapSettings.initFromBitString object_data
61
+
62
+ when GBTiles::GBM::Map::ObjectType::MAP_EXPORT_SETTINGS
63
+ object = GBTiles::GBM::Map::Objects::MapExportSettings.initFromBitString object_data
64
+
65
+ else
66
+ object = GBTiles::GBM::Map::Objects::Unknown.new object_type
67
+ object.object_data = object_data
68
+
69
+ end
70
+
71
+ object.object_id = object_id
72
+ object.master_id = master_id
73
+
74
+ import.map_set.objects.push object
75
+ end
76
+
77
+ import
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end