summaryrefslogtreecommitdiffhomepage
path: root/samples/99_genre_rpg_topdown/topdown_casino/app/main.rb
blob: eccf7442094bb94692f50ae14163f9e39285e0f5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
$gtk.reset

def coinflip
  rand < 0.5
end

class Game
  attr_accessor :args

  def text_font
    return nil #"rpg.ttf"
  end

  def text_color
    [ 255, 255, 255, 255 ]
  end

  def set_gem_values
    @args.state.gem0 = ((coinflip) ?  100 : 20)
    @args.state.gem1 = ((coinflip) ? -10 : -50)
    @args.state.gem2 = ((coinflip) ? -10 : -30)
    if coinflip
      tmp = @args.state.gem0
      @args.state.gem0 = @args.state.gem1
      @args.state.gem1 = tmp
    end
    if coinflip
      tmp = @args.state.gem1
      @args.state.gem1 = @args.state.gem2
      @args.state.gem2 = tmp
    end
    if coinflip
      tmp = @args.state.gem0
      @args.state.gem0 = @args.state.gem2
      @args.state.gem2 = tmp
    end
  end

  def initialize args
    @args = args
    @args.state.animticks = 0
    @args.state.score = 0
    @args.state.gem_chosen = false
    @args.state.round_finished = false
    @args.state.gem0_x = 197
    @args.state.gem0_y = 720-274
    @args.state.gem1_x = 623
    @args.state.gem1_y = 720-274
    @args.state.gem2_x = 1049
    @args.state.gem2_y = 720-274
    @args.state.hero_sprite = "sprites/herodown100.png"
    @args.state.hero_x = 608
    @args.state.hero_y = 720-656
    set_gem_values
  end

  def render_gem_value x, y, gem
    if @args.state.gem_chosen
      @args.outputs.labels << [ x, y + 96, gem.to_s, 1, 1, *text_color, text_font ]
    end
  end

  def render
    gemsprite = ((@args.state.animticks % 400) < 200) ? 'sprites/gem200.png' : 'sprites/gem400.png'
    @args.outputs.background_color = [ 0, 0, 0, 255 ]
    @args.outputs.sprites << [608, 720-150, 64, 64, 'sprites/oldman.png']
    @args.outputs.sprites << [300, 720-150, 64, 64, 'sprites/fire.png']
    @args.outputs.sprites << [900, 720-150, 64, 64, 'sprites/fire.png']
    @args.outputs.sprites << [@args.state.gem0_x, @args.state.gem0_y, 32, 64, gemsprite]
    @args.outputs.sprites << [@args.state.gem1_x, @args.state.gem1_y, 32, 64, gemsprite]
    @args.outputs.sprites << [@args.state.gem2_x, @args.state.gem2_y, 32, 64, gemsprite]
    @args.outputs.sprites << [@args.state.hero_x, @args.state.hero_y, 64, 64, @args.state.hero_sprite]

    @args.outputs.labels << [ 630, 720-30, "IT'S A SECRET TO EVERYONE.", 1, 1, *text_color, text_font ]
    @args.outputs.labels << [ 50, 720-85, @args.state.score.to_s, 1, 1, *text_color, text_font ]
    render_gem_value @args.state.gem0_x, @args.state.gem0_y, @args.state.gem0
    render_gem_value @args.state.gem1_x, @args.state.gem1_y, @args.state.gem1
    render_gem_value @args.state.gem2_x, @args.state.gem2_y, @args.state.gem2
  end

  def calc
    @args.state.animticks += 16

    return unless @args.state.gem_chosen
    @args.state.round_finished_debounce ||= 60 * 3
    @args.state.round_finished_debounce -= 1
    return if @args.state.round_finished_debounce > 0

    @args.state.gem_chosen = false
    @args.state.hero.sprite[0] = 'sprites/herodown100.png'
    @args.state.hero.sprite[1] = 608
    @args.state.hero.sprite[2] = 656
    @args.state.round_finished_debounce = nil
    set_gem_values
  end

  def walk xdir, ydir, anim
    @args.state.hero_sprite = "sprites/#{anim}#{(((@args.state.animticks % 200) < 100) ? '100' : '200')}.png"
    @args.state.hero_x += 5 * xdir
    @args.state.hero_y += 5 * ydir
  end

  def check_gem_touching gem_x, gem_y, gem
    return if @args.state.gem_chosen
    herorect = [ @args.state.hero_x, @args.state.hero_y, 64, 64 ]
    return if !herorect.intersect_rect?([gem_x, gem_y, 32, 64])
    @args.state.gem_chosen = true
    @args.state.score += gem
    @args.outputs.sounds << ((gem < 0) ? 'sounds/lose.wav' : 'sounds/win.wav')
  end

  def input
    if @args.inputs.keyboard.key_held.left
      walk(-1.0, 0.0, 'heroleft')
    elsif @args.inputs.keyboard.key_held.right
      walk(1.0, 0.0, 'heroright')
    elsif @args.inputs.keyboard.key_held.up
      walk(0.0, 1.0, 'heroup')
    elsif @args.inputs.keyboard.key_held.down
      walk(0.0, -1.0, 'herodown')
    end

    check_gem_touching(@args.state.gem0_x, @args.state.gem0_y, @args.state.gem0)
    check_gem_touching(@args.state.gem1_x, @args.state.gem1_y, @args.state.gem1)
    check_gem_touching(@args.state.gem2_x, @args.state.gem2_y, @args.state.gem2)
  end

  def tick
    input
    calc
    render
  end
end

def tick args
    args.state.game ||= Game.new args
    args.state.game.args = args
    args.state.game.tick
end