burn 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 88d0abe3fd9169eb51afc7b5d39254e849fef9a9
4
- data.tar.gz: 1acf007ed7181340caf2ba58396d1b436b2628b8
3
+ metadata.gz: 5f1690e662e1ea2a9b0aa3d6d53a250b62fc1dd4
4
+ data.tar.gz: c523a497a57c901f85b19d310f0931dbd229b049
5
5
  SHA512:
6
- metadata.gz: 1731a31e5c034f15c4f66470018a19ea6f21ff7799f175738e7f4a9037697aafa0e6e4f56643dde2241988d74f631f652772f2ff432df1e85738d15734958f26
7
- data.tar.gz: 216e80634e3251f48a9a4f803a3e3a7f74c9f654cfa04ffe7181e38a77e4d8ad4b87cba199b0b419de1682469a1e60ae23117b4121baaaa9ac6adadb4db97189
6
+ metadata.gz: 12f8621ccb6660118c32b17547ec67deb9be27b51f3565f3391285831bb0029426045c765f1e50c9c870dca797cb13a95ca1d820375e0ce81635b03397bcd7d2
7
+ data.tar.gz: c04a9bc398b1a8cfe58b3caf38c6d07896e9a06160eaf8b299bdeabb97722f40e00c9d8c35b5430834ec1552542e8855cc8868735b56df61e86d44d42fa10f16
@@ -4,13 +4,13 @@ module Burn
4
4
  class_option :debug, :type => :string, :aliases => '-d', :desc => "Debug mode"
5
5
  class_option :verbose, :type => :boolean, :desc => "Print logs as much as possible", :default => false
6
6
  default_task :fire
7
-
7
+
8
8
  def initialize(*args)
9
9
  super
10
10
  @workspace_root = Dir.getwd
11
11
  @os = Util::Os.new
12
12
  end
13
-
13
+
14
14
  desc "init", "Initialize environment"
15
15
  option :quick, :type=>:boolean, :desc=>"Make cc65 binaries available without gcc(however unstable. This option is not recommended.)"
16
16
  def init
@@ -31,7 +31,19 @@ successfully finished. you've got ready to burn.
31
31
 
32
32
  EOS
33
33
  end
34
-
34
+
35
+ desc "fuel", "Read a textfile from stdin and Convert it to fuel DSL"
36
+ option :file, :type=>:boolean, :aliases => '-f', :desc=>"Read textfile text from file instead of stdin"
37
+ option :width, :type=>:numeric, :aliases => '-w', :default=>73, :desc=>"Set screen width"
38
+ option :height, :type=>:numeric, :aliases => '-h', :default=>13, :desc=>"Set screen height"
39
+ option :separator, :type=>:string, :aliases => '-s', :default=>"^ *#", :desc=>"Set the delimiter string to split textfile into pages(e.g. '^ *#[^#]' or '---')"
40
+ option :rabbit_timer, :type=>:numeric, :aliases => '-t', :default=>0, :desc=>"Set estimated time[sec] to give your talk"
41
+ def fuel(filename=nil)
42
+ textfile = !filename.nil? ? File.read(filename) : $stdin.read
43
+ fuel = Util::Txt2Fuel.new(options[:width], options[:height], options[:separator], options[:rabbit_timer])
44
+ say fuel.convert(textfile)
45
+ end
46
+
35
47
  desc "fire", "Create your application and Run them instantly"
36
48
  option :chrome, :type => :boolean, :aliases => '-c', :desc => "[ROM mode only] Run emulator on chrome instead of firefox", :default => false
37
49
  option :preview, :type => :boolean, :aliases => '-p', :desc => "[ROM mode only] Preview mode. By this, you can skip burning fuel DSL and focus on playing rom.", :default => false
@@ -41,39 +53,39 @@ EOS
41
53
  load_conf_and_options(mainfile)
42
54
  if options[:rom_server] then
43
55
  server "#{@workspace_root}/tmp/burn/release/js/", mainfile
44
-
56
+
45
57
  else
46
58
  if @conf.app.target==:rom then
47
59
  make_and_play mainfile, options[:preview]
48
-
60
+
49
61
  elsif @conf.app.target==:telnet then
50
62
  say "starting telnet server #{@conf.server.ip_addr}:#{@conf.server.port}...."
51
63
  Server::Telnet.new(File.read("#{@workspace_root}/#{mainfile}"), @conf).start
52
64
  end
53
65
  end
54
-
66
+
55
67
  end
56
-
68
+
57
69
  desc "version", "Print version"
58
70
  map %w(-v --version) => :version
59
71
  def version
60
72
  say "burn #{Burn::VERSION}"
61
73
  end
62
-
74
+
63
75
  # desc "release", "To be designed"
64
-
76
+
65
77
  def self.source_root
66
78
  File.dirname(__FILE__) + "/.."
67
79
  end
68
-
80
+
69
81
  no_tasks do
70
-
82
+
71
83
  def make_and_play(mainfile=nil, preview=true)
72
84
  mainfile="main.rb" if mainfile.nil?
73
-
85
+
74
86
  if !File.exist?(mainfile) then
75
87
  help
76
-
88
+
77
89
  elsif !File.exist?("#{File.dirname(__FILE__)}/tools/#{@os.name}/cc65/bin/ld65#{".exe" if @os.is_win?}") then
78
90
  say <<-EOS
79
91
  [ERROR] you are not ready to burn, most probably you haven't execute burn init command yet.
@@ -82,29 +94,29 @@ to fix this, try the following command:
82
94
  #{"sudo " if !@os.is_win?}burn init
83
95
 
84
96
  EOS
85
-
97
+
86
98
  else
87
99
  _v = @conf.app.verbose
88
100
  if !preview then
89
101
  app_root = "#{@workspace_root}/tmp/burn"
90
-
102
+
91
103
  # init
92
104
  say "running burn v#{VERSION}..."
93
105
  remove_dir app_root, :verbose => _v
94
106
  empty_directory app_root, :verbose => _v
95
107
  Util::Unpack.new.unpack "#{File.dirname(__FILE__)}/tools/workspace_default.tar.gz", app_root
96
-
108
+
97
109
  # compile and build .nes
98
110
  say "."
99
111
  builder = Generator::RomBuilder.new(@workspace_root)
100
112
  builder.verbose _v
101
113
  builder.load File.read("#{@workspace_root}/#{mainfile}")
102
114
  builder.generate
103
-
115
+
104
116
  # Prepare compilers
105
117
  say ".."
106
118
  directory File.dirname(__FILE__) + "/tools/#{@os.name}", app_root, :verbose => _v
107
-
119
+
108
120
  # Finally compile
109
121
  say "..."
110
122
  redirect = ""
@@ -112,25 +124,25 @@ EOS
112
124
  command = ""
113
125
  ext = "bat"
114
126
  redirect = " > nul" if !_v
115
-
127
+
116
128
  else
117
129
  command = "/bin/bash "
118
130
  ext = "sh"
119
131
  redirect = " > /dev/null" if !_v
120
-
132
+
121
133
  # Set permissions to execute compilers
122
134
  Dir::glob("#{app_root}/cc65/bin/*65").each do |f|
123
135
  File.chmod(0777, f)
124
136
  end
125
-
137
+
126
138
  end
127
139
  run "#{command}#{app_root}/scripts/compile.#{ext} #{app_root} #{redirect}", :verbose => _v
128
-
140
+
129
141
  # prepare customized emulator
130
142
  say "...."
131
143
  require 'base64'
132
144
  File.write(
133
- "#{app_root}/release/js/emulator.html",
145
+ "#{app_root}/release/js/emulator.html",
134
146
  File.read("#{app_root}/release/js/emulator.html")
135
147
  .gsub(/__@__TITLE__@__/, mainfile)
136
148
  .gsub(/__@__AUTHOR__@__/, "anonymous")
@@ -143,7 +155,7 @@ EOS
143
155
  )
144
156
  )
145
157
  copy_file "#{app_root}/main.nes", "#{app_root}/release/js/main.nes", :verbose => _v
146
-
158
+
147
159
  say <<-EOS
148
160
 
149
161
 
@@ -154,9 +166,9 @@ The executable is available at:
154
166
  #{app_root}/main.nes
155
167
 
156
168
  EOS
157
-
169
+
158
170
  end
159
-
171
+
160
172
  # boot up webrick httpserver to download emulator script
161
173
  command = "ruby " + File.dirname(__FILE__) + "/../../bin/burn fire #{mainfile} --rom-server " + (options[:debug] ? "-d" : "")
162
174
  if @os.is_win? then
@@ -164,12 +176,12 @@ EOS
164
176
  else
165
177
  run "#{command} &", :verbose => _v
166
178
  end
167
-
179
+
168
180
  # wait for certain period of time to prevent browser from fetching game url too early
169
181
  # *DEFINITELY* TO BE REFACTORED
170
182
  # maybe better to use :StartCallback of WEBRICK?
171
183
  sleep 1
172
-
184
+
173
185
  # open up browser
174
186
  uri = "http://#{@conf.server.ip_addr}:#{@conf.server.port}/emulator.html"
175
187
  browser = options[:chrome] ? "chrome" : "firefox"
@@ -181,24 +193,23 @@ EOS
181
193
  else
182
194
  run "/usr/bin/#{browser} #{uri}", :verbose => _v
183
195
  end
184
-
196
+
185
197
  end
186
198
  end
187
-
199
+
188
200
  desc "server <document_root>", "Run simple http server for emulator. This is mainly used by burn rubygem itself, not by user."
189
201
  def server(document_root=nil, mainfile)
190
202
  raise Exception.new("document_root must be specified when you would like to run http server") if document_root.nil?
191
203
  server = Server::Rom.new(document_root,@conf)
192
204
  server.start
193
205
  end
194
-
206
+
195
207
  def load_conf_and_options(mainfile)
196
208
  @conf = Configuration::Loader.new(File.read("#{@workspace_root}/#{mainfile}"))
197
209
  @conf.app.debug options[:debug]
198
210
  @conf.app.verbose options[:verbose]
199
211
  end
200
-
212
+
201
213
  end
202
-
203
214
  end
204
- end
215
+ end
@@ -6,7 +6,7 @@ module Burn
6
6
  BG = 40 # background palette (0x00-0x0f)
7
7
  TEXT = 30 # background palette (0x00-0x0f)
8
8
  # SPRITE = 17 # sprite palette (0x10-0x1f)
9
-
9
+
10
10
  # Color Control
11
11
  WHITE = 7
12
12
  LIGHTBLUE = 4
@@ -23,7 +23,7 @@ module Burn
23
23
  BLUEGREEN = 6
24
24
  GRAY = 7
25
25
  BLACK = 0
26
-
26
+
27
27
  # Light Control
28
28
  DARKEST = 60
29
29
  DARKER = 60
@@ -33,23 +33,23 @@ module Burn
33
33
  def initialize(resource_name, context)
34
34
  super(resource_name, context)
35
35
  end
36
-
36
+
37
37
  def label(string, x=0, y=1)
38
- @context.instance_exec { @opcodes << "@screen.display[#{y}][#{x},#{string.length}] = \"#{string}\"" }
38
+ @context.instance_exec { @opcodes << "@screen.display[#{y}][#{x},#{string.length}] = \"#{string.gsub(/"/, '\"')}\"" }
39
39
  end
40
40
 
41
41
  def wait(interval)
42
42
  @context.instance_exec { @opcodes << "@wait = #{interval}" }
43
43
  end
44
-
44
+
45
45
  def method_missing(method_symbol, *args, &block)
46
46
  #TBD if needed
47
47
  end
48
-
48
+
49
49
  def goto(scene_name)
50
50
  @context.instance_exec { @opcodes << "@screen.flush_screen && @pc = @opcodes.index(\"##{scene_name}\")" }
51
51
  end
52
-
52
+
53
53
  def color(palette, color, lightness=:lighter)
54
54
  target = palette==:bg ? "bg" : "fg"
55
55
  palette=Scene.const_get(palette.upcase)
@@ -57,7 +57,7 @@ module Burn
57
57
  lightness=Scene.const_get(lightness.upcase)
58
58
  @context.instance_exec { @opcodes << "@screen.#{target}_color = #{palette+color+lightness}" }
59
59
  end
60
-
60
+
61
61
  def main_loop(rrb_source=nil)
62
62
  @context.instance_exec(@context,@resource_name) do |c, resource|
63
63
  p=Pxes::CrubyTranspiler.new(Ripper.sexp(rrb_source),c,resource)
@@ -68,11 +68,11 @@ module Burn
68
68
  @opcodes << "@pc = @opcodes.index(\"#{start_label}\")" #JUMP
69
69
  end
70
70
  end
71
-
71
+
72
72
  def sprite(resource)
73
73
  @context.instance_exec { @opcodes << "@screen.activated_sprite_objects << @___#{resource} if @screen.activated_sprite_objects.index(@___#{resource}).nil?" }
74
74
  end
75
-
75
+
76
76
  def inline(code)
77
77
  @context.instance_exec { @opcodes << code }
78
78
  end
@@ -85,31 +85,31 @@ module Burn
85
85
  # ].each {|p| @code_blocks.push p}
86
86
  # end
87
87
  # end
88
- #
88
+ #
89
89
  # def fade_out(sec=3)
90
90
  # @context.instance_exec {@code_blocks.push "screen_fade_out(#{sec.to_s});"}
91
91
  # end
92
92
  #
93
93
  # def show(string, x=0, y=0, *args)
94
94
  # end
95
- #
95
+ #
96
96
  # def inline(code)
97
97
  # end
98
- #
98
+ #
99
99
  # def screen(map, vars)
100
100
  # end
101
- #
101
+ #
102
102
  # def paint(dest, palette)
103
103
  # end
104
- #
104
+ #
105
105
  # def rand
106
106
  # @context.instance_exec {@code_blocks.push "rand8()"}
107
107
  # end
108
- #
108
+ #
109
109
  # # utility methods
110
110
  # def range(x_from, y_from, x_to, y_to)
111
111
  # end
112
-
112
+
113
113
  end
114
114
  end
115
115
  end
@@ -8,9 +8,9 @@ module Burn
8
8
  JUMPTOHOME = ESC + "[H"
9
9
  RESETALLATTR = ESC + "[0m"
10
10
  CRLF = 13.chr + 10.chr
11
-
11
+
12
12
  attr_accessor :display, :fg_color, :bg_color, :activated_sprite_objects
13
-
13
+
14
14
  def initialize(conf)
15
15
  @fg_color = 37
16
16
  @bg_color = 40
@@ -18,7 +18,7 @@ module Burn
18
18
  @conf = conf
19
19
  flush_screen
20
20
  end
21
-
21
+
22
22
  def to_terminal
23
23
  #CLEARSCREEN + escape_color(@fg_color) + escape_color(@bg_color) + @display.join("\r\n") + JUMPTOHOME + RESETALLATTR
24
24
  #JUMPTOHOME + RESETALLATTR + CLEARSCREEN + escape_color(@fg_color) + escape_color(@bg_color) + @display.join("\r\n") + ESC + "[#{@conf.app.height};2H" + RESETALLATTR
@@ -26,36 +26,38 @@ module Burn
26
26
  #JUMPTOHOME + crlf + crlf + crlf + crlf + crlf + crlf + @display.join(crlf)
27
27
  #JUMPTOHOME + crlf + crlf + crlf + crlf + crlf + crlf + @display.join(crlf) + crlf
28
28
  #JUMPTOHOME + @display.join(CRLF) + CRLF
29
-
29
+
30
30
  JUMPTOHOME + escape_color(@fg_color) + escape_color(@bg_color) + ppu_emulate + CRLF + RESETALLATTR
31
31
  #JUMPTOHOME + @display.join(CRLF) + CRLF
32
32
  end
33
-
33
+
34
34
  def flush_screen
35
35
  @display = Array.new
36
36
  @conf.app.height.times{ @display << Array.new(@conf.app.width){' '}.join }
37
37
  @activated_sprite_objects = []
38
38
  end
39
-
39
+
40
40
  def is_pressed(key, user_input)
41
41
  log " ** program is waiting for:" + key.to_s
42
42
  if !user_input.nil? then
43
43
  log " **** confiremd user input:" + user_input.class.to_s, user_input.chr, user_input.to_s
44
- if [*'0'..'9', *'a'..'z', *'A'..'Z'].include?(user_input.chr) && key.to_s == user_input.chr then
44
+ if [*'0'..'9', *'a'..'z', *'A'..'Z',10.chr,13.chr].include?(user_input.chr) && key.to_s == user_input.chr then
45
45
  log "****** is_pressed() returned true"
46
46
  return true
47
47
  end
48
48
  end
49
49
  false
50
50
  end
51
-
51
+
52
52
  private
53
-
53
+
54
54
  def escape_color(num)
55
- ESC + "[" + num.to_s + ";1m"
55
+ #ESC + "[" + num.to_s + ";1m"
56
+ ESC + "[" + num.to_s + ";0m"
56
57
  end
57
-
58
+
58
59
  def ppu_emulate
60
+ @display.map!{|line| line.rstrip.length > 0 ? line.rstrip : line} # rstrip for multibyte character display (without this, space character will be overflowed)
59
61
  if @activated_sprite_objects.count == 0 then
60
62
  @display.join(CRLF)
61
63
  else
@@ -64,7 +66,7 @@ module Burn
64
66
  obj.tile.split("\n").each_with_index do |line, i|
65
67
  canvas[(obj.y+ i) % @conf.app.height][obj.x % @conf.app.width,line.length] = line.chomp
66
68
  end
67
-
69
+
68
70
  # struct_var = "static sprite_schema #{key}={0, 0, {"
69
71
  # @pattern_table_index[key.to_sym] = @pattern_table_pointer
70
72
  # patternizer.patterns.each_with_index do |p, i|
@@ -74,12 +76,12 @@ module Burn
74
76
  # @pattern_table_pointer+=1
75
77
  # end
76
78
  # struct_var += "128}};"
77
-
79
+
78
80
  end
79
81
  canvas.join(CRLF)
80
82
  end
81
83
  end
82
-
84
+
83
85
  end
84
86
  end
85
87
  end
@@ -3,9 +3,9 @@ module Burn
3
3
  class TelnetVm
4
4
  include Generator::Telnet
5
5
  include Debug
6
- attr_reader :screen
6
+ attr_reader :screen, :time
7
7
  attr_accessor :wait
8
-
8
+
9
9
  def initialize(source, conf)
10
10
  @pc = 0 # Program Counter
11
11
  @screen = Screen.new(conf)
@@ -15,8 +15,9 @@ module Burn
15
15
  @user_input = UserInput.new(conf)
16
16
  @conf = conf
17
17
  @finish = false
18
+ @time = Time.now.to_i
18
19
  end
19
-
20
+
20
21
  def next_frame
21
22
  log @pc
22
23
  if @wait > 0 then
@@ -39,12 +40,12 @@ module Burn
39
40
  # do nothing
40
41
  end
41
42
  end
42
-
43
+
43
44
  def interrupt(signal)
44
45
  log "INTTERUPT_SETTING:" + @conf.app.user_input.to_s
45
46
  @user_input.receive_signal(signal)
46
47
  end
47
-
48
+
48
49
  end
49
50
  end
50
51
  end
@@ -1,11 +1,11 @@
1
1
  module Burn
2
2
  module Pxes
3
3
  class CrubyTranspiler < TranspilerBase
4
-
4
+
5
5
  def to_rb
6
6
  parse_sexp(@sexp)
7
7
  end
8
-
8
+
9
9
  private
10
10
  #def replace_vcall_to_symbol(sexp_array)
11
11
  # sexp_array.map do |a|
@@ -18,15 +18,15 @@ module Burn
18
18
  # end
19
19
  # end
20
20
  #end
21
-
21
+
22
22
  def invoke_dsl_processing(exp)
23
23
  generator = Generator::Telnet::JitCompiler.new
24
24
  # class(@@)|instance(@) variable inside exp need to be stringified before the #instance_eval.
25
- # Without this, variables will be evaluated immediately now (and will get disappered as a result of this) by #instance_eval
25
+ # Without this, variables will be evaluated immediately now (and will get disappered as a result of this) by #instance_eval
26
26
  Fuel::Telnet::Scene.new(@resource_name, generator).instance_eval exp.gsub(/(@[@\w]*)/, "\"\\1\"")
27
27
  generator.opcodes.join "\n"
28
28
  end
29
-
29
+
30
30
  def parse_sexp(s)
31
31
  if s.instance_of?(String) then
32
32
  s
@@ -36,7 +36,7 @@ module Burn
36
36
  case s[0]
37
37
  when :assign
38
38
  parse_sexp(s[1]) + "=" + parse_sexp(s[2])
39
-
39
+
40
40
  when :var_field, :var_ref
41
41
  if s[1][0] == :@ident then
42
42
  var_scope = "@___"
@@ -44,10 +44,10 @@ module Burn
44
44
  var_scope = ""
45
45
  end
46
46
  var_scope + s[1][1]
47
-
47
+
48
48
  when :void_stmt
49
49
  "" # this happens when rip "if true then # do nothing end" type of code
50
-
50
+
51
51
  when :binary
52
52
  case s[2]
53
53
  when :or
@@ -58,10 +58,10 @@ module Burn
58
58
  operator = s[2].to_s
59
59
  end
60
60
  parse_sexp(s[1]) + operator + parse_sexp(s[3])
61
-
61
+
62
62
  when :opassign
63
63
  parse_sexp(s[1]) + parse_sexp(s[2]) + parse_sexp(s[3])
64
-
64
+
65
65
  when :unary
66
66
  case s[1]
67
67
  when :not, :!
@@ -69,22 +69,22 @@ module Burn
69
69
  else
70
70
  parse_sexp(s[2])
71
71
  end
72
-
72
+
73
73
  when :paren
74
74
  "(" + parse_sexp(s[1][0]) + ")"
75
-
75
+
76
76
  when :symbol
77
77
  ':' + s[1][1]
78
-
78
+
79
79
  when :field, :call
80
80
  parse_sexp(s[1]) + "." + parse_sexp(s[3])
81
-
81
+
82
82
  when :@ident, :@int, :@kw, :@op
83
83
  s[1]
84
-
84
+
85
85
  when :@tstring_content
86
86
  '"' + s[1] + '"'
87
-
87
+
88
88
  # this is why you can't use pre-defined dsl name as a variable name. e.g) you are not allowed to declare variables like show or label or stop. these all are defined dsl.
89
89
  when :vcall
90
90
  if s[1][0] == :@ident then
@@ -94,7 +94,7 @@ module Burn
94
94
  end
95
95
  s[1][1] = var_scope + s[1][1]
96
96
  parse_sexp(s[1])
97
-
97
+
98
98
  # this is why you can't use pre-defined dsl name as a variable name. e.g) you are not allowed to declare variables like show or label or stop. these all are defined dsl.
99
99
  when :command
100
100
  if !Fuel::Telnet::Scene.new(@resource_name,@context).methods.index(s[1][1].to_sym).nil? then
@@ -103,7 +103,7 @@ module Burn
103
103
  else
104
104
  parse_sexp(s[1]) + "(" + parse_sexp(s[2]) + ")"
105
105
  end
106
-
106
+
107
107
  when :method_add_arg
108
108
  command = s[1][1][1]
109
109
  # check if it matches dsl.
@@ -115,10 +115,10 @@ module Burn
115
115
  else
116
116
  parse_sexp(s[1]) + "(" + parse_sexp(s[2]) + ")"
117
117
  end
118
-
118
+
119
119
  # Currently pssing block is not supported
120
120
  #when :method_add_block
121
-
121
+
122
122
  when :args_add_block
123
123
  a = Array.new
124
124
  s[1].each_with_index do |sexp,i|
@@ -127,10 +127,10 @@ module Burn
127
127
  a << parse_sexp(sexp)
128
128
  end
129
129
  a.join(",")
130
-
130
+
131
131
  when :while
132
132
  "while(" + parse_sexp(s[1]) + "){" + parse_sexp(s[2]) + "}"
133
-
133
+
134
134
  when :if, :if_mod, :elsif
135
135
  if s[0]==:elsif then
136
136
  keyword = "else if"
@@ -157,17 +157,17 @@ module Burn
157
157
  else
158
158
  "@pc = @opcodes.index(\"#{label}\") if !(" + parse_sexp(s[1]) + ")\n" + parse_sexp(s[2]) + "\n#{label}"
159
159
  end
160
-
161
-
160
+
161
+
162
162
  #when :def
163
163
  # is not supported for to_c as return data type cannot be defined
164
-
164
+
165
165
  when :else
166
166
  parse_sexp(s[1])
167
-
167
+
168
168
  else
169
169
  parse_sexp(s[1])
170
-
170
+
171
171
  end
172
172
  # Safety net
173
173
  elsif s.instance_of?(Array) && s[0].instance_of?(Array) then
@@ -1,4 +1,5 @@
1
1
  require 'burn/util/logo'
2
2
  require 'burn/util/os'
3
3
  require 'burn/util/patternizer'
4
- require 'burn/util/unpack'
4
+ require 'burn/util/unpack'
5
+ require 'burn/util/txt2fuel'
@@ -0,0 +1,77 @@
1
+ module Burn
2
+ module Util
3
+ class Txt2Fuel
4
+ attr_reader :width, :height, :separator, :rabbit_timer
5
+
6
+ def initialize(width=73, height=10, separator="^ *#", rabbit_timer=0)
7
+ @width = width
8
+ @height = height
9
+ @separator = separator
10
+ @rabbit_timer = rabbit_timer
11
+ end
12
+
13
+ def convert(textfile)
14
+ pages = []
15
+ pages.push []
16
+ textfile.encode!('UTF-8')
17
+ textfile.each_line do |line|
18
+ pages.push [] if line.match(Regexp.new(@separator)) && pages[pages.count-1].count>0
19
+ if line =~ /(?:\p{Hiragana}|\p{Katakana}|[一-龠々])/ then # if Multibyte character is contained
20
+ formatted_text = line.chomp.chars.each_slice((@width-2)/2).map{|a| a.join}
21
+ else
22
+ formatted_text = line.chomp.scan(/.{,#{@width-2}}/)
23
+ end
24
+ formatted_text.each do |words|
25
+ if words.length>0 || line==10.chr then
26
+ pages[pages.count-1].push words
27
+ end
28
+ if pages[pages.count-1].count >= @height-2 then
29
+ pages.push []
30
+ end
31
+ end
32
+ end
33
+
34
+ fuel = "
35
+ config :app do
36
+ target :telnet
37
+ user_input :enable
38
+ frame_rate :extreme
39
+ height #{@height}
40
+ width #{@width}
41
+ end
42
+
43
+ config :server do
44
+ ip_addr '0.0.0.0'
45
+ max_clients 1000
46
+ end
47
+ "
48
+ pages.each_with_index do |page, i|
49
+ fuel += ""
50
+ fuel += "scene 'page_#{i}' do\n"
51
+ page.each_with_index do |line, index|
52
+ fuel += " label '#{line.gsub("'", "\\\\'")}', 1, #{index}\n"
53
+ end
54
+ page_info_width = ("/"+(pages.count*2).to_s).length-1
55
+ fuel += " label '#{i+1}/#{pages.count}', #{@width-page_info_width-1}, #{@height-1}\n"
56
+ if @rabbit_timer>0 then
57
+ fuel += " label '|' + ('-'*#{@width-page_info_width-4}).to_s + '|', 1, #{@height-1}\n"
58
+ fuel += " label '@', #{((@width-page_info_width-2)*((i+1).to_f/pages.count.to_f)).to_i}, #{@height-1}\n"
59
+ end
60
+ fuel += " main_loop <<-EOH\n"
61
+ if @rabbit_timer>0 then
62
+ fuel += %[ inline "self.screen.display[#{@height-1}][(#{@width-page_info_width-1}*(Time.now.to_i - self.time).to_f/#{@rabbit_timer}.to_f).to_i < #{@width-page_info_width-1} ? (#{@width-page_info_width-1}*(Time.now.to_i - self.time).to_f/#{@rabbit_timer}.to_f).to_i + 2 : #{@width-page_info_width-1},1] = '>'"\n]
63
+ else
64
+ fuel += %[ inline "self.screen.display[#{@height-1}][1,5] = Time.at(Time.now.to_i - self.time).strftime('%M:%S')"\n]
65
+ end
66
+ fuel += %[ goto "page_#{i+1==pages.count ? 0 : i+1}" if is_pressed(10.chr)\n]
67
+ fuel += %[ goto "page_#{i+1==pages.count ? 0 : i+1}" if is_pressed(13.chr)\n]
68
+ fuel += %[ goto "page_#{i+1==pages.count ? 0 : i+1}" if is_pressed(:f)\n]
69
+ fuel += %[ goto "page_#{i-1<0 ? pages.count-1 : i-1}" if is_pressed(:b)\n]
70
+ fuel += " EOH\n"
71
+ fuel += "end\n"
72
+ end
73
+ fuel
74
+ end
75
+ end
76
+ end
77
+ end
@@ -1,3 +1,3 @@
1
1
  module Burn
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: burn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kei Sawada(@remore)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-21 00:00:00.000000000 Z
11
+ date: 2015-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -125,6 +125,7 @@ files:
125
125
  - lib/burn/util/logo.rb
126
126
  - lib/burn/util/os.rb
127
127
  - lib/burn/util/patternizer.rb
128
+ - lib/burn/util/txt2fuel.rb
128
129
  - lib/burn/util/unpack.rb
129
130
  - lib/burn/util.rb
130
131
  - lib/burn/version.rb