petli 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,16 @@
1
+ width: 11
2
+ height: 4
3
+ loop: true
4
+ name: sleep
5
+ ---
6
+ | | z |
7
+ | z | |
8
+ ‿ z | ‿ ‿ | ‿ ‿ |
9
+ ‾ | ° | ‾ |
10
+ ---
11
+ name: blink
12
+ ---
13
+ | | | | | | | |
14
+ | | | | | | | |
15
+ . . | _ _ | . . | _ _ | . . | . . | . . | . . |
16
+ ‾ | ‾ | ‾ | ‾ | ‾ | ‾ | ‾ | ‾ |
@@ -0,0 +1,91 @@
1
+ width: 11
2
+ height: 4
3
+ loop: true
4
+ name: walk_great
5
+ ---
6
+ | | | |
7
+ |ᕦ(O ‿ O )ᕡ | |ᕦ( O ‿ O)ᕡ |
8
+ ᕠ(^ ▽ ^)ᕤ | |ᕠ(^ ▽ ^)ᕤ | |
9
+ | | | |
10
+ ---
11
+ name: walk_happy
12
+ ---
13
+ | | | |
14
+ | | | |
15
+ ᕠ(O o O)ᕤ |ᕦ(o _ o )ᕡ |ᕠ(O o O)ᕤ |ᕦ( o _ o)ᕡ |
16
+ | | | |
17
+ ---
18
+ name: walk_normal
19
+ ---
20
+ | | | |
21
+ | | | |
22
+ ᕠ(O . O)ᕤ |ᕦ(O _ O )ᕡ |ᕠ(O . O)ᕤ |ᕦ( O _ O)ᕡ |
23
+ | | | |
24
+ ---
25
+ name: walk_annoyed
26
+ ---
27
+ | | | |
28
+ | | | |
29
+ ᕠ(⊜ _ ⊜)ᕤ |ᕦ(ಠ - ಠ )ᕡ |ᕠ(⊜ _ ⊜)ᕤ |ᕦ( ಠ - ಠ)ᕡ |
30
+ | | | |
31
+ ---
32
+ name: walk_angry
33
+ ---
34
+ | | | |
35
+ | | | |
36
+ ᕠ(ಠ 益 ಠ)ᕤ |ᕦ(ಠ ෴ ಠ )ᕡ |ᕠ(ಠ 益 ಠ)ᕤ |ᕦ( ಠ ෴ ಠ)ᕡ |
37
+ | | | |
38
+ ---
39
+ name: walk_sick
40
+ ---
41
+ | | | |
42
+ | | | |
43
+ _(ළ - ළ)_ |~(ತ . ತ )~ |_(ළ - ළ)_ |~( ತ . ತ)~ |
44
+ | | | |
45
+ ---
46
+ name: stand
47
+ ---
48
+ | |
49
+ | |
50
+ ᕠ(O . O)ᕤ | ᕦ(O _ O)ᕡ |
51
+ | |
52
+ ---
53
+ name: celebrate
54
+ loop_for: 3
55
+ ---
56
+ | |
57
+ | |
58
+ ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ |
59
+ | |
60
+ ---
61
+ name: embarass
62
+ loop_for: 3
63
+ ---
64
+ | |
65
+ | |
66
+ ᕠ(ಥ ◠ ಥ)ᕤ | ᕦ(ಥ - ಥ)ᕡ |
67
+ | |
68
+ ---
69
+ name: eat_bread
70
+ loop: false
71
+ ---
72
+ | | | | | | | | | | | | | |
73
+ | | | | | | | | | | | | | |
74
+ ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ |
75
+ ʕ=ʔ | ʕ=ʔ | ʕ=ʔ | ʕ=ʔ | ʕ=ʔ | =ʔ | =ʔ | ʔ | ʔ | | | | | |
76
+ ---
77
+ name: eat_candy
78
+ loop: false
79
+ ---
80
+ | | | | | | | | | | | | | |
81
+ | | | | | | | | | | | | | |
82
+ ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ |
83
+ ▷☯◁ | ▷☯◁ | ▷☯◁ | ▷☯◁ | ▷☯◁ | ☯◁ | ☯◁ | ◁ | ◁ | | | | | |
84
+ ---
85
+ name: eat_medicine
86
+ loop: false
87
+ ---
88
+ | | | | | | | | | | | | | |
89
+ | | | | | | | | | | | | | |
90
+ ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | \(O ▽ O)/ | _(ᗒ ‿ ᗕ)_ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ | ᕠ(☯ ᴥ ☯)ᕤ | ᕦ(✧ O ✧)ᕡ |
91
+ ◖◻◗ | ◖◻◗ | ◖◻◗ | ◖◻◗ | ◖◻◗ | ◻◗ | ◻◗ | ◗ | ◗ | | | | | |
@@ -0,0 +1,91 @@
1
+ width: 11
2
+ height: 4
3
+ loop: true
4
+ name: walk_great
5
+ ---
6
+ | | | |
7
+ |_[▢ ‿ ▢ ]_ | |_[ ▢ ‿ ▢]_ |
8
+ \[‾ ▽ ‾]/ | |\[‾ ▽ ‾]/ | |
9
+ | | | |
10
+ ---
11
+ name: walk_happy
12
+ ---
13
+ | | | |
14
+ | | | |
15
+ \[▢ ▫ ▢]/ |_[▢ _ ▢ ]_ |\[▢ ▫ ▢]/ |_[ ▢ _ ▢]_ |
16
+ | | | |
17
+ ---
18
+ name: walk_normal
19
+ ---
20
+ | | | |
21
+ | | | |
22
+ \[□ . □]/ |_[□ _ □ ]_ |\[□ . □]/ |_[ □ _ □]_ |
23
+ | | | |
24
+ ---
25
+ name: walk_annoyed
26
+ ---
27
+ | | | |
28
+ | | | |
29
+ \[⟥ _ ⟤]/ |_[⟥ - ⟤ ]_ |\[⟥ _ ⟤]/ |_[ ⟥ - ⟤]_ |
30
+ | | | |
31
+ ---
32
+ name: walk_angry
33
+ ---
34
+ | | | |
35
+ | | | |
36
+ \[⧅ ~ ⧅]/ |_[◫ ෴ ◫ ]_ |\[⧅ ~ ⧅]/ |_[ ◫ ෴ ◫]_ |
37
+ | | | |
38
+ ---
39
+ name: walk_sick
40
+ ---
41
+ | | | |
42
+ | | | |
43
+ _[▫ - ▫]_ |~[▪ . ▪ ]~ |_[▫ - ▫]_ |~[ ▪ . ▪]~ |
44
+ | | | |
45
+ ---
46
+ name: stand
47
+ ---
48
+ | |
49
+ | |
50
+ \[▢ ▫ ▢]/ | _[▢ _ ▢]_ |
51
+ | |
52
+ ---
53
+ name: celebrate
54
+ loop_for: 3
55
+ ---
56
+ | |
57
+ | |
58
+ \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ |
59
+ | |
60
+ ---
61
+ name: embarass
62
+ loop_for: 3
63
+ ---
64
+ | |
65
+ | |
66
+ \[ಥ ◠ ಥ]/ | _[ಥ - ಥ]_ |
67
+ | |
68
+ ---
69
+ name: eat_bread
70
+ loop: false
71
+ ---
72
+ | | | | | | | | | | | | | |
73
+ | | | | | | | | | | | | | |
74
+ \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ |
75
+ ʕ=ʔ | ʕ=ʔ | ʕ=ʔ | ʕ=ʔ | ʕ=ʔ | =ʔ | =ʔ | ʔ | ʔ | | | | | |
76
+ ---
77
+ name: eat_candy
78
+ loop: false
79
+ ---
80
+ | | | | | | | | | | | | | |
81
+ | | | | | | | | | | | | | |
82
+ \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ |
83
+ ▷☯◁ | ▷☯◁ | ▷☯◁ | ▷☯◁ | ▷☯◁ | ☯◁ | ☯◁ | ◁ | ◁ | | | | | |
84
+ ---
85
+ name: eat_medicine
86
+ loop: false
87
+ ---
88
+ | | | | | | | | | | | | | |
89
+ | | | | | | | | | | | | | |
90
+ \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[▫ □ ▫]/ | _[ᗒ ‿ ᗕ]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ | \[⛋ - ⛋]/ | _[◰ ▢ ◰]_ |
91
+ ◖◻◗ | ◖◻◗ | ◖◻◗ | ◖◻◗ | ◖◻◗ | ◻◗ | ◻◗ | ◗ | ◗ | | | | | |
@@ -0,0 +1,94 @@
1
+ module Petli
2
+ class Pet
3
+ module Animation
4
+ extend Tatty::DB::Attributes
5
+ db_attr :phase, default: :infant
6
+ db_attr :phase_select, default: 0
7
+ db_attr :lights_out, default: false
8
+
9
+ def setup_animation
10
+ hatch if (Time.now - self.birth) < 10
11
+ end
12
+
13
+ def update_animation
14
+ reset if animation.step && !animation.loop
15
+ if phase == :infant && hours_since(birth) > 1
16
+ self.phase = :teen
17
+ self.phase_select = rand(0...avail_animations[phase].count)
18
+ elsif phase == :teen && days_since(birth) > 1
19
+ self.phase = :adult
20
+ self.phase_select = rand(0...avail_animations[phase].count)
21
+ end
22
+ end
23
+
24
+ def reset
25
+ @doing = nil
26
+ end
27
+
28
+ def busy?
29
+ !@doing.nil?
30
+ end
31
+
32
+ def celebrate
33
+ react(:celebrate)
34
+ end
35
+
36
+ def embarass
37
+ react(:embarass)
38
+ end
39
+
40
+ def hatch
41
+ @doing = avail_animations[:hatch]
42
+ end
43
+
44
+ def light_switch
45
+ self.lights_out = !lights_out
46
+ self.happiness = [1, self.happiness-1].max if self.lights_out && !sleeping?
47
+ end
48
+
49
+ def sleeping?
50
+ hour = Time.now.hour
51
+ hour >= 16 || hour <= 8
52
+ end
53
+
54
+ def react(action)
55
+ anim = atlas[action]
56
+ anim.reset
57
+ @doing = anim
58
+ end
59
+
60
+ def animation
61
+ if self.dead?
62
+ avail_animations[:death]
63
+ elsif !@doing.nil?
64
+ @doing
65
+ elsif self.lights_out
66
+ if sleeping?
67
+ avail_animations[:sleep][:sleep]
68
+ else
69
+ avail_animations[:sleep][:blink]
70
+ end
71
+ elsif self.sick > 0
72
+ atlas[:walk_sick]
73
+ else
74
+ atlas["walk_#{self.mood}"]
75
+ end
76
+ end
77
+
78
+ def atlas
79
+ avail_animations[phase][phase_select]
80
+ end
81
+
82
+ def avail_animations
83
+ @avail_animations ||= {
84
+ hatch: Tatty::Anim.from_atlas(Petli.data_path('hatch.txtanim')),
85
+ infant: Dir[Petli.data_path('infant',"*.txtanim")].map {|p| Tatty::Atlas.new(p) },
86
+ teen: Dir[Petli.data_path('teen',"*.txtanim")].map {|p| Tatty::Atlas.new(p) },
87
+ adult: Dir[Petli.data_path('adult',"*.txtanim")].map {|p| Tatty::Atlas.new(p) },
88
+ death: Tatty::Anim.from_atlas(Petli.data_path('death.txtanim')),
89
+ sleep: Tatty::Atlas.new(Petli.data_path('sleep.txtanim')),
90
+ }
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,21 @@
1
+ module Petli
2
+ class Pet
3
+ module Death
4
+ extend Tatty::DB::Attributes
5
+ db_attr :birth, default: Time.now, readonly: true
6
+ db_attr :died_at
7
+
8
+ def check_if_dead
9
+ not_happy = self.happiness <= 1
10
+ not_healthy = self.health <= 1
11
+ is_sick = self.sick > 2
12
+ too_much_time = days_since(self.last_meal) >= 1
13
+ self.died_at = Time.now if not_happy && not_healthy && (is_sick || too_much_time)
14
+ end
15
+
16
+ def dead?
17
+ !self.died_at.nil?
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ module Petli
2
+ class Pet
3
+ module Food
4
+ extend Tatty::DB::Attributes
5
+
6
+ POOP_LOCATIONS = [[1,1], [1,4], [1,7], [11,1], [11,7], [20,1], [20,4], [20,7]]
7
+
8
+ db_attr :health, default: 5
9
+ db_attr :last_meal, default: Time.now
10
+ db_attr :sick, default: 0
11
+ db_attr :poops, default: []
12
+
13
+ def update_hunger
14
+ for_hours_since(last_meal) do |i, hr_ago|
15
+ self.last_meal = Time.now
16
+ next if rand <= 0.3
17
+ self.health = [1, self.health-1].max
18
+ self.happiness = [1, self.happiness-1].max
19
+ self.poops << hr_ago if rand <= 0.8 && self.poops.count < POOP_LOCATIONS.count
20
+ self.sick = self.poops.filter{|poop| hours_since(poop) > 1 }.count
21
+ end
22
+ end
23
+
24
+ def feed(food: :bread)
25
+ return self.embarass if ((food == :medicine && self.sick <= 0) || (self.health == 10 && food != :medicine))
26
+ self.last_meal = Time.now unless food == :medicine
27
+ react("eat_#{food}")
28
+ self.feed!(food: food)
29
+ end
30
+
31
+ def feed!(food: :bread)
32
+ self.health = [10, self.health+2].min unless food == :medicine
33
+ self.happiness = [10, self.happiness+2].min if food == :candy
34
+ self.sick = [0, self.sick - 1].max if food == :medicine
35
+ end
36
+
37
+ def clean
38
+ self.poops = []
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module Petli
2
+ class Pet
3
+ module Happy
4
+ extend Tatty::DB::Attributes
5
+ MOOD_SCALE = %i(angry annoyed normal happy great)
6
+
7
+ db_attr :mood, default: :normal
8
+ db_attr :last_play, default: Time.now
9
+ db_attr :happiness, default: 5
10
+
11
+ def update_happiness
12
+ for_hours_since(last_play) do |i|
13
+ self.last_play = Time.now
14
+ next if rand <= 0.3
15
+ self.happiness = [[1, self.happiness-1].max, self.health <= 3 ? 5 : 10].min
16
+ end
17
+ self.mood = MOOD_SCALE[((self.happiness.to_f/10.0)*(MOOD_SCALE.count - 1)).floor]
18
+ end
19
+
20
+ def play(game: :dice)
21
+ self.last_play = Time.now
22
+ react(:stand)
23
+ end
24
+
25
+ def win
26
+ self.happiness = [10, self.happiness+1].min
27
+ end
28
+
29
+ def lose
30
+ # todo I dont really want it to become more unhappy if they lose
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/petli/pet.rb CHANGED
@@ -1,131 +1,33 @@
1
1
  module Petli
2
2
  class Pet
3
- include Watch
4
- extend Tatty::DB::Attributes
5
-
6
- MOOD_SCALE = [:angry, :annoyed, :normal, :happy, :great]
3
+ autoload :Food, "petli/pet/food"
4
+ autoload :Happy, "petli/pet/happy"
5
+ autoload :Death, "petli/pet/death"
6
+ autoload :Animation, "petli/pet/animation"
7
7
 
8
- db_attr :birth, default: Time.now, readonly: true
9
- db_attr :health, default: 5
10
- db_attr :mood, default: :normal
11
- db_attr :happiness, default: 5
12
- db_attr :sick, default: 0
13
- db_attr :died_at
14
- db_attr :last_play, default: Time.now
15
- db_attr :last_meal, default: Time.now
16
- db_attr :poops, default: []
8
+ extend Tatty::DB::Attributes
9
+ include Animation
10
+ include Death
11
+ include Food
12
+ include Happy
13
+ include Watch
17
14
 
18
15
  def initialize
19
16
  super()
20
- @animation = Animator.new(
21
- hatching: (Time.now - self.birth) < 10,
22
- mood: self.mood,
23
- action: self.died_at.nil? ? :walk : :death
24
- )
25
- end
26
-
27
- def reset
28
- @animation.action = :walk
17
+ setup_animation
29
18
  end
30
19
 
31
20
  def display
32
- return @animation.step if self.dead?
33
-
34
- if hours_since(self.last_meal) > 1
35
- hours_past = hours_since(self.last_meal)
36
- self.last_meal = Time.now
37
- (0...hours_past).each do |i|
38
- next if rand <= 0.3
39
- self.health = [1, self.health-1].max
40
- self.happiness = [1, self.happiness-1].max
41
- self.poops << hours_ago(i) if rand <= 0.8 && self.poops.count < Poop::LOCATIONS.count
42
- end
43
- self.sick = self.poops.filter{|poop| hours_since(poop) > 1 }.count
44
- end
45
-
46
- if hours_since(self.last_play) > 1
47
- hours_past = hours_since(self.last_play)
48
- self.last_play = Time.now
49
- (0...hours_past).each do
50
- next if rand <= 0.3
51
- self.happiness = [1, self.happiness-1].max
52
- end
53
- end
54
-
55
- self.happiness = [self.happiness, 5].min if self.health <= 3
56
- self.mood = MOOD_SCALE[((self.happiness.to_f/10.0)*(MOOD_SCALE.count - 1)).floor ]
57
-
58
- self.check_if_dead
59
-
60
- @animation.mood = self.sick > 0 ? :sick : self.mood
61
- @animation.step
62
- end
63
-
64
- def check_if_dead
65
- not_happy = self.happiness <= 1
66
- not_healthy = self.health <= 1
67
- is_sick = self.sick > 2
68
- too_much_time = days_since(self.last_meal) >= 1
69
-
70
- if not_happy && not_healthy && (is_sick || too_much_time)
71
- self.died_at = Time.now
72
- @animation.action = :death
73
- end
74
- end
75
-
76
- def feed(food: :bread)
77
- return self.embarass if ((food == :medicine && self.sick <= 0) || (self.health == 10 && food != :medicine))
78
- self.last_meal = Time.now unless food == :medicine
79
- @animation.eat(food: food) do
80
- self.feed!(food: food)
81
- end
82
- end
83
-
84
- def feed!(food: :bread)
85
- self.health = [10, self.health+1].min unless food == :medicine
86
- self.happiness = [10, self.happiness+1].min if food == :candy
87
- self.sick = [0, self.sick - 1].max if food == :medicine
88
- end
89
-
90
- def win
91
- self.happiness = [10, self.happiness+1].min
92
- end
93
-
94
- def lose
95
- # todo I dont really want it to become more unhappy if they lose
96
- end
97
-
98
- def play(game: :dice)
99
- self.last_play = Time.now
100
- @animation.action = :stand
101
- end
102
-
103
- def clean
104
- self.poops = []
105
- end
106
-
107
- def busy?
108
- @animation.busy?
109
- end
110
-
111
- def dead?
112
- @animation.action == :death
113
- end
114
-
115
- def celebrate
116
- @animation.celebrate
117
- end
118
-
119
- def embarass
120
- @animation.embarass
21
+ return animation.next if self.dead?
22
+ update_hunger
23
+ update_happiness
24
+ check_if_dead
25
+ update_animation
26
+ animation.display
121
27
  end
122
28
 
123
29
  def lifetime
124
- if self.died_at.nil?
125
- days_since(self.birth).to_i
126
- else
127
- days_since(self.birth, self.died_at).to_i
128
- end
30
+ (self.died_at.nil? ? days_since(self.birth) : days_since(self.birth, self.died_at)).to_i
129
31
  end
130
32
  end
131
33
  end
@@ -9,29 +9,48 @@ module Petli
9
9
  def initialize(pet:)
10
10
  super()
11
11
  @pet = pet
12
- @poop = Poop.new
12
+ @poop = Tatty::Anim.from_atlas(Petli.data_path('poop.txtanim'))
13
+ @page = 0
13
14
  end
14
15
 
15
16
  def keypress(event)
16
17
  exit if event.value == "q" || event.value == "\e" || event.value == "x"
17
18
  return if @pet.busy? || @pet.dead?
19
+ @page -= 1 if event.key.name == :left && @page > 0
20
+ @page += 1 if event.key.name == :right && @page < action_pages.count - 1
18
21
  onkey(event)
19
22
  end
20
23
 
21
- def onkey(event)
22
- end
23
-
24
24
  def actions
25
25
  %w()
26
26
  end
27
27
 
28
+ def action_pages
29
+ pages = []
30
+ current_page = []
31
+ fmt_actions = self.actions.map{|a| "[#{a[0].capitalize}]#{a[1..]}"}
32
+ fmt_actions.each do |action|
33
+ len = (current_page + [action]).join(" ").length
34
+ if len >= GAME_WIDTH-2
35
+ pages << [current_page, current_page.join(" ").length]
36
+ current_page = [action]
37
+ else
38
+ current_page << action
39
+ end
40
+ end
41
+ pages + [[current_page, current_page.join(" ").length]]
42
+ end
43
+
28
44
  def action_bar
29
- return "" if @pet.dead?
45
+ return "" if @pet.dead? || @pet.busy?
46
+ pages = action_pages
30
47
  p = Pastel.new
31
- self.actions.map do |a|
32
- key = p.bold("[#{a[0].capitalize}]")
33
- "#{key}#{a[1..]}"
34
- end.join(" ")
48
+ page, page_len = pages[@page]
49
+ bar = p.bold(@page > 0 ? "◀" : "◁")
50
+ bar += page.map {|a| "#{p.bold(a[0..2])}#{a[3..]}"}.join(" ")
51
+ bar += (' ' * (GAME_WIDTH-page_len-4))
52
+ bar += p.bold(pages.count > 1 && @page < pages.count - 1 ? "▶" : "▷")
53
+ bar
35
54
  end
36
55
 
37
56
  def left
@@ -55,9 +74,9 @@ module Petli
55
74
  top: top,
56
75
  )
57
76
 
58
- poop = @poop.step
77
+ poop = @poop.next
59
78
  @pet.poops.each_with_index do |_, i|
60
- x, y = Poop::LOCATIONS[i]
79
+ x, y = Pet::POOP_LOCATIONS[i]
61
80
  render_at(left+1+x, top+1+y, poop)
62
81
  end
63
82
 
@@ -67,7 +86,7 @@ module Petli
67
86
  render_at(left+11-sick, top+4, "[#{'!'*sick}SICK#{'!'*sick}]")
68
87
  end
69
88
 
70
- render_at(left+1, top+1, "#{p.red("♥")*@pet.health}#{"♡"*(10-@pet.health)} #{"☺"*(10-@pet.happiness)}#{p.green("☻")*@pet.happiness}")
89
+ render_at(left+1, top+1, "#{p.red("♥")*@pet.health}#{"♡"*(10-@pet.health)} #{@pet.sick > 0 ? p.red("☠") : "☠"}#{@pet.lights_out ? "☼" : p.yellow("☀")} #{"☺"*(10-@pet.happiness)}#{p.green("☻")*@pet.happiness}")
71
90
  render_at(left+1, top+GAME_HEIGHT-2, self.action_bar)
72
91
  render_at(left+GAME_WIDTH-2, top, p.bright_white.bold("[x]"))
73
92
  end
@@ -30,7 +30,7 @@ module Petli
30
30
  @pick = (1..6).to_a.sample
31
31
  @won = (event.value == "h" && @pick > @value) || (event.value == "l" && @pick < @value)
32
32
  @won ? @pet.celebrate : @pet.embarass
33
- @countdown = 20
33
+ @countdown = 10
34
34
  end
35
35
 
36
36
  def draw
@@ -24,7 +24,7 @@ module Petli
24
24
  @petpickedleft = rand(1..2) == 1
25
25
  @pickedleft = event.value == "l"
26
26
  (@petpickedleft == @pickedleft) ? @pet.celebrate : @pet.embarass
27
- @countdown = 20
27
+ @countdown = 10
28
28
  end
29
29
 
30
30
  def draw
@@ -2,12 +2,15 @@ module Petli
2
2
  module Stages
3
3
  class Main < Base
4
4
  def actions
5
- acts = %w(play feed)
5
+ return %w(light) if @pet.lights_out
6
+ acts = %w(play feed light)
6
7
  acts << "clean" if @pet.poops.count > 0
7
8
  acts
8
9
  end
9
10
 
10
11
  def onkey(event)
12
+ return @pet.light_switch if event.value == "l"
13
+ return if @pet.lights_out
11
14
  return goto(Feed, pet: @pet) if event.value == "f"
12
15
  return @pet.clean if event.value == "c"
13
16
  return goto(Play, pet: @pet) if event.value == "p"
data/lib/petli/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Petli
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
data/lib/petli/watch.rb CHANGED
@@ -15,6 +15,11 @@ module Petli
15
15
  time_elapsed(last, HOURS_DIV)
16
16
  end
17
17
 
18
+ def for_hours_since(last)
19
+ hours_past = hours_since(last)
20
+ (0...hours_past).each { |i| yield(i, hours_ago(i)) } if hours_past > 1
21
+ end
22
+
18
23
  def hours_ago(hrs)
19
24
  Time.now - (hrs * 3600)
20
25
  end