# # score.rb # class Score extend SingleTask def init @font=SDL::TTF.open("image/boxfont2.ttf", 40) end def reset @life = Consts::LIVES @score = 0 @max = 0 end attr_accessor :score attr_reader :max def value @score end def incr @score+=1 @max = @score if @max < @score end def miss if GameMain.mode==:endless @max = @score if @max < @score @score = 0 else @life -= 1 if @life < 0 GameMain.disable Gameover.enable @life = 0 end end end def draw(i) if GameMain.mode==:endless @font.drawBlendedUTF8(i.scr," LIFE: .. MAXCOMBO:#{'%3d' % @max}", 0,0 , 0,0,0) else lifemeter = '*'*@life + ' '*(Consts::LIVES-@life) @font.drawBlendedUTF8(i.scr," LIFE: #{lifemeter} SCORE:#{'%3d' % @score}", 0,0 , 0,0,0) end end end module Enumerable def stable_sort i = 0 self.sort_by{|v| [v, i += 1]} end end class Highscore extend SingleTask N = 5 FILE = "highscore.dat" def init @font = SDL::TTF.open("image/boxfont2.ttf", 25) @scores = read() || Hash.new ModeSelect::MODES.each do |mode| @scores[mode] ||= [] end @show = nil end attr_reader :scores attr_writer :show def high?(score) p score, @scores return false if score==0 mode = GameMain.mode @scores[mode].empty? || @scores[mode].size < N || @scores[mode].last[0] < score end def add(score,name) return unless high?(score) mode = GameMain.mode @scores[mode] << [score, name] @scores[mode] = @scores[mode].stable_sort.reverse[0,N] write end def read ret = nil if File.exist?(FILE) open(FILE,"rb") do |f| ret = Marshal.load(f) end end ret end def write open(FILE,"wb") do |f| Marshal.dump(@scores,f) end end def draw(i) @font.drawBlendedUTF8(i.scr, "* HighScore *", 380,38, 0,0,255) @scores[@show].each_with_index do |item,n| score,name = *item @font.drawBlendedUTF8(i.scr, "#{n+1}. #{score} (#{name})", 380,65+(20*n), 0,0,255) end end end