keep_calm_and_balance 0.3.1 → 0.4

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
  SHA256:
3
- metadata.gz: 5b1cf6c0ef25e6512d61ee5b7bd15b8ad59f18d65281584ebdc2f0e7b2f3b688
4
- data.tar.gz: be31cb72b8de471cd7ac05fc01e027c70670de785f60e61a73c07a44841a976c
3
+ metadata.gz: 72de35bfb0bdfdc35b79adc3dd6e3bd40e4bff42210bf8e6556dc2eade4ddc99
4
+ data.tar.gz: 01e0cb0378d78ed993fb0b309bbd6ff9bf12fe2a41cc5151979f0e6479ab496d
5
5
  SHA512:
6
- metadata.gz: 9f3d538772c525359c27f9e72773d7720615ca337ba716c9c33a857159ffa430980f71c44aeeb00f10dbea0181f7462b7b89d57b4207c7c13b59ea6a860fa2bd
7
- data.tar.gz: d1f94241fcc75c676f5007182cedc308c31be6b9e57cd8b07d19646ef7f97d1365ce4ee26efe886477e7c03fe009adf21c33440e83abeed4056020abb0a0bfd5
6
+ metadata.gz: b50ac0264d12a23d0baefd75008484a2b5b71e8a5f0c329ee2c772e9d2d96e7a7a9002b4ee53799d4a93b777ff412f11aa4e84a1f289d2f0a3e8e2e02fecb809
7
+ data.tar.gz: b6a9327ef6efc84174a744a8c07b740ed5314938bfbc8efd7d9b3c7454e3690be1e28a0c5f32056e00bc018a85eef3ac0437d55ba6a1cb04248e6d4d049d0ec5
data/lib/CHANGELOG.md CHANGED
@@ -9,7 +9,19 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
9
9
  ### Removed
10
10
 
11
11
 
12
- ## [v3](../../tags/v3) – 2021-10-21
12
+ ## [v4](../../tags/v4) – 2021-10-24
13
+ ### Added
14
+ - effect dealer
15
+ - wind effect
16
+ - show counter of effects
17
+ - show latest effect
18
+
19
+ ### Changed
20
+ - timer is now aligned to the centre
21
+ - effects moved to a separate folder
22
+
23
+
24
+ ## [v3.1](../../tags/v3.1) – 2021-10-21
13
25
  ### Added
14
26
  - timer
15
27
  - deceleration when on seasaw
@@ -2,8 +2,8 @@ require 'rake'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'keep_calm_and_balance'
5
- spec.version = '0.3.1'
6
- spec.date = '2021-10-21'
5
+ spec.version = '0.4'
6
+ spec.date = '2021-10-24'
7
7
  spec.license = 'CC-BY-SA-3.0'
8
8
 
9
9
  spec.summary = "An action balancing game"
@@ -5,6 +5,6 @@ require_relative './lib/user_interface/game_window'
5
5
 
6
6
  PROMPT = '> '
7
7
 
8
- version = '0.3.1'
8
+ version = '0.4'
9
9
  $window = GameWindow.new(version)
10
10
  $window.show
@@ -0,0 +1,89 @@
1
+ require_relative './wind_effect'
2
+
3
+ FIRST_EFFECT_TIME = 2 # seconds til the first effect
4
+ NEXT_EFFECT_TIME = 3 # seconds til the next effect
5
+ SHOW_LATEST_TIME = 1.0 # seconds to show the latest effect for (float needed!)
6
+
7
+ class EffectDealer
8
+ #attr_reader :active # TODO nothing?
9
+
10
+ def initialize(infopane, seasaw, barrel)
11
+ @infopane = infopane
12
+ @seasaw = seasaw
13
+ @barrel = barrel
14
+
15
+ @known = [WindEffect] # TODO not used
16
+ reset!
17
+ end
18
+
19
+ # Load default setup
20
+ def reset!
21
+ @available = [WindEffect]
22
+ @active = []
23
+ @latest = nil
24
+ @latest_at = nil
25
+ @next_at = FIRST_EFFECT_TIME
26
+ end
27
+
28
+ def update
29
+ @active.each { |ee| ee.update }
30
+
31
+ if time_for_next?
32
+ @latest = @available.sample.new(@infopane, @seasaw, @barrel) # pick random one
33
+ @active.push(@latest)
34
+ @latest_at = @infopane.time
35
+ end
36
+ end
37
+
38
+ def draw
39
+ @active.each { |ee| ee.draw }
40
+ draw_latest
41
+ draw_counter
42
+ end
43
+
44
+ def draw_latest
45
+ if @latest and @infopane.time < (@latest_at + SHOW_LATEST_TIME)
46
+ latest = Gosu::Image.from_text(
47
+ "+#{@latest.name.capitalize}", LINE_HEIGHT,
48
+ {:width => WINDOW_WIDTH, :align => :left}
49
+ )
50
+ latest.draw(0, 0, ZTEXT)
51
+ end
52
+ end
53
+
54
+ def draw_counter
55
+ counter_text = ""
56
+ counts_of_effects.each { | kk, vv | counter_text += "#{vv}x #{kk.capitalize}\n"}
57
+
58
+ counter = Gosu::Image.from_text(
59
+ counter_text, LINE_HEIGHT,
60
+ {:width => WINDOW_WIDTH, :align => :right}
61
+ )
62
+ counter.draw(0, 0, ZTEXT)
63
+ end
64
+
65
+ # Return count of each active variant of effect, sorted alphabetically
66
+ def counts_of_effects
67
+ counts = {}
68
+
69
+ @active.each { |ee|
70
+ if counts[ee.name]
71
+ counts[ee.name] += 1
72
+ else
73
+ counts[ee.name] = 1
74
+ end
75
+ }
76
+
77
+ return counts.sort.to_h
78
+ end
79
+
80
+ # Is it time to activate the next effect?
81
+ def time_for_next?
82
+ if @infopane.time > @next_at # equality is not safe enough as update() can just miss the mark
83
+ @next_at += NEXT_EFFECT_TIME
84
+ return true
85
+ else
86
+ return false
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,26 @@
1
+ WEST = 'west' # blowing to the right
2
+ EAST = 'east' # blowing to the left
3
+
4
+ class WindEffect
5
+ attr_reader :name
6
+
7
+ def initialize(infopane, seasaw, barrel)
8
+ @infopane = infopane
9
+ @seasaw = seasaw # not utilized
10
+ @barrel = barrel
11
+
12
+ @direction = [WEST, EAST].sample
13
+ @name = "#{@direction} wind"
14
+ end
15
+
16
+ def update
17
+ @strength = rand(5)
18
+ @speed = {WEST => 1, EAST => -1}[@direction] * @strength * ACCELERATION
19
+
20
+ @barrel.speed = (@barrel.speed + @speed).round(SPEED_PRECISION)
21
+ end
22
+
23
+ def draw
24
+ # TODO nothing?
25
+ end
26
+ end
@@ -6,6 +6,7 @@ FALLING_ACCELERATION = 9.8 # gravity-like
6
6
 
7
7
  class Barrel
8
8
  attr_reader :x, :y
9
+ attr_accessor :speed
9
10
 
10
11
  def initialize(seesaw)
11
12
  dir_path = File.dirname(__FILE__)
@@ -1,9 +1,11 @@
1
1
  require_relative './background'
2
- require_relative './timer'
2
+ require_relative './infopane'
3
3
 
4
4
  require_relative './../items/barrel'
5
5
  require_relative './../items/seesaw'
6
6
 
7
+ require_relative './../effects/effect_dealer'
8
+
7
9
  TILESIZE = 50
8
10
  MAPX = 10
9
11
  MAPY = MAPX
@@ -33,10 +35,12 @@ class GameWindow < Gosu::Window
33
35
  reset!
34
36
 
35
37
  @background = Background.new()
36
- @timer = Timer.new(self)
38
+ @infopane = Infopane.new(self)
37
39
 
38
40
  @seesaw = Seesaw.new()
39
41
  @barrel = Barrel.new(@seesaw)
42
+
43
+ @effect_dealer = EffectDealer.new(@infopane, @seesaw, @barrel)
40
44
  end
41
45
 
42
46
  # Start processing the pushed button
@@ -60,12 +64,13 @@ class GameWindow < Gosu::Window
60
64
 
61
65
  # Update game state
62
66
  def update
63
- @timer.update
67
+ @infopane.update
64
68
 
65
69
  unless @loss
66
70
  @seesaw.update(@button)
67
71
  @barrel.update # let seesaw update first
68
72
  check_loss
73
+ @effect_dealer.update
69
74
  end
70
75
  end
71
76
 
@@ -83,16 +88,18 @@ class GameWindow < Gosu::Window
83
88
  def draw
84
89
  @background.draw
85
90
  @barrel.draw
91
+ @effect_dealer.draw
92
+ @infopane.draw
86
93
  @seesaw.draw
87
- @timer.draw
88
94
  end
89
95
 
90
96
  # Reset scene
91
97
  def reset
92
98
  reset!
93
99
  @barrel.reset!
100
+ @effect_dealer.reset!
101
+ @infopane.reset!
94
102
  @seesaw.reset!
95
- @timer.reset!
96
103
  end
97
104
 
98
105
  # Load default setup
@@ -103,6 +110,5 @@ class GameWindow < Gosu::Window
103
110
  # Switch debug flag
104
111
  def switch_debug!
105
112
  $debug = !$debug
106
- puts $debug
107
113
  end
108
114
  end
@@ -0,0 +1,34 @@
1
+ class Infopane
2
+ attr_reader :time
3
+
4
+ def initialize(window)
5
+ @window = window
6
+ reset!
7
+ end
8
+
9
+ # Load default setup
10
+ def reset!
11
+ @starttime = Gosu.milliseconds
12
+ @time = 0
13
+ end
14
+
15
+ def update()
16
+ unless @window.loss
17
+ @time = (Gosu.milliseconds - @starttime) / 1000.0
18
+ end
19
+ end
20
+
21
+ def draw
22
+ text = "#{@time}s"
23
+
24
+ if @window.loss
25
+ text += "\nBackspace to restart"
26
+ end
27
+
28
+ text = Gosu::Image.from_text(
29
+ text, LINE_HEIGHT,
30
+ {:width => WINDOW_WIDTH, :align => :center}
31
+ )
32
+ text.draw(0, 0, ZTEXT)
33
+ end
34
+ end
Binary file
Binary file
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keep_calm_and_balance
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: '0.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Detros
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-21 00:00:00.000000000 Z
11
+ date: 2021-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -50,12 +50,16 @@ files:
50
50
  - lib/README.md
51
51
  - lib/keep_calm_and_balance.gemspec
52
52
  - lib/keep_calm_and_balance.rb
53
+ - lib/lib/effects/effect_dealer.rb
54
+ - lib/lib/effects/wind_effect.rb
53
55
  - lib/lib/items/barrel.rb
54
56
  - lib/lib/items/seesaw.rb
55
57
  - lib/lib/user_interface/background.rb
56
58
  - lib/lib/user_interface/game_window.rb
57
- - lib/lib/user_interface/timer.rb
59
+ - lib/lib/user_interface/infopane.rb
60
+ - lib/media/KCaB 0.3.1.png
58
61
  - lib/media/circle.png
62
+ - lib/media/logo.png
59
63
  - lib/media/square.png
60
64
  homepage: https://rasunadon.itch.io/keep-calm-and-balance
61
65
  licenses:
@@ -1,32 +0,0 @@
1
- class Timer
2
- def initialize(window)
3
- @window = window
4
- reset!
5
- end
6
-
7
- # Load default setup
8
- def reset!
9
- @starttime = Gosu.milliseconds
10
- @time = 0
11
- end
12
-
13
- def update()
14
- unless @window.loss
15
- @time = (Gosu.milliseconds - @starttime) / 1000.0
16
- end
17
- end
18
-
19
- def draw
20
- info = Gosu::Image.from_text("#{@time}s", LINE_HEIGHT)
21
- info.draw(0, 0, ZTEXT)
22
-
23
- if @window.loss
24
- restart_text = "Backspace to restart"
25
- restart = Gosu::Image.from_text(
26
- restart_text, LINE_HEIGHT,
27
- {:width => WINDOW_WIDTH, :align => :center}
28
- )
29
- restart.draw(0, LINE_HEIGHT, ZTEXT)
30
- end
31
- end
32
- end