petli 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7ee40f22dc44aa081835578e98eb98f7da356f8c6b9c507310312340ce058df
4
- data.tar.gz: b269134dbac6547026821802c5ac0e21320c5c84094fa3d0fa2813256b7226e2
3
+ metadata.gz: 05a633461e7b8d56e725df4c11e7e46cfd4877d5cd269289c10a466cea5c4c42
4
+ data.tar.gz: 2f39e13184061908e8f337e1283b7b8f798ee0203a1edc82ad487707cc59cb2c
5
5
  SHA512:
6
- metadata.gz: 5d8b52d56d5745735a8b387f24c62afe477ccbf2bea4143d9f93a3c439d1de2a1e4e3569ad375654694384506538a9bd774f6aca70039c8d192ec409e7a6ecec
7
- data.tar.gz: def5941f8c6ec9bacdeb63d3b20c906d35298ee0c72d09d05429172ee69c4ae390f6a09924dad86c0cbef4a01471b459e12aa2c472bdc5a85e37b8596cc91578
6
+ metadata.gz: fb7341dee8c0668b1ffdd2251e97501cd79251d39346c26d28103a1481409a30a0ba55e9d692fbfc991ec0dbaf33ccfff4b4b3a76363d808c64d5f2dc88adfae
7
+ data.tar.gz: 251b601b1e23126c8e6c60ddb34b36c73f9c81b4c14befe724b383e32d28e92948f700164004e6b6c2997b5df8cc6f6289350269c6666a279628a586feadbbf3
data/Gemfile.lock CHANGED
@@ -8,7 +8,7 @@ PATH
8
8
  tty-cursor (~> 0.7.1)
9
9
  tty-platform (~> 0.3.0)
10
10
  tty-reader (~> 0.9.0)
11
- tty-screen (~> 0.8.1)
11
+ tty-screen (~> 0.8.2)
12
12
 
13
13
  GEM
14
14
  remote: https://rubygems.org/
@@ -31,17 +31,18 @@ GEM
31
31
  tty-cursor (~> 0.7)
32
32
  tty-screen (~> 0.8)
33
33
  wisper (~> 2.0)
34
- tty-screen (0.8.1)
34
+ tty-screen (0.8.2)
35
35
  unicode-display_width (2.1.0)
36
36
  unicode_utils (1.4.0)
37
37
  wisper (2.0.1)
38
38
 
39
39
  PLATFORMS
40
40
  arm64-darwin-20
41
+ arm64-darwin-25
41
42
  x86_64-darwin-20
42
43
 
43
44
  DEPENDENCIES
44
45
  petli!
45
46
 
46
47
  BUNDLED WITH
47
- 2.2.3
48
+ 4.0.12
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2021 Tim Anema
1
+ Copyright 2026 Tim Anema
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of
4
4
  this software and associated documentation files (the "Software"), to deal in
data/bin/anim CHANGED
@@ -16,14 +16,9 @@ class Animate < Tatty::Stage
16
16
  done = @animation.step
17
17
  @animation.reset if !@animation.loop and done
18
18
  render_at(0, 0, @animation.display)
19
+ render_at(0, 5, "Animation: #{@animation.name}")
19
20
  end
20
21
  end
21
22
 
22
- filepath = ARGV[0]
23
- name = ARGV[1] || :default
24
- animation = Tatty::Anim.from_atlas(filepath, name: name)
25
- if animation.nil?
26
- puts "Cannot find animation '#{name}'"
27
- else
28
- Tatty.run(Animate, animation: animation)
29
- end
23
+ atlas = Tatty::Atlas.new(ARGV[0])
24
+ Tatty.run(Animate, animation: atlas[ARGV[1] || :default] || atlas[atlas.names.first])
data/bin/petli CHANGED
@@ -7,10 +7,9 @@ OptionParser.new do |opts|
7
7
  opts.banner = "Usage: petli [options]"
8
8
  opts.on("-r", "--reset", "Reset button to start over again") {|v| options[:reset] = v }
9
9
  opts.on("-s", "--status", "Dump pet status") {|v| options[:status] = v}
10
- opts.on("-b", "--bread", "Feed your pet bread without viewing") {|v| options[:bread] = v}
11
- opts.on("-c", "--candy", "Feed your pet candy without viewing") {|v| options[:candy] = v}
12
- opts.on("-m", "--medicine", "Feed your pet candy without viewing") {|v| options[:medicine] = v}
13
- opts.on("-l", "--clean", "Clean up any 'dirt' without viewing") {|v| options[:clean] = v}
10
+ opts.on("-f FOOD", "--feed=FOOD", "Feed your pet bread without viewing") {|v| options[:feed] = v}
11
+ opts.on("-c", "--clean", "Clean up any 'dirt' without viewing") {|v| options[:clean] = v}
12
+ opts.on("-l", "--light", "Hit the lightswitch") {|v| options[:light] = v}
14
13
  opts.on("-p", "--path [PATH]", "path to your pet data (defaults to system config dir)") do |v|
15
14
  $tattydboverridepath = v
16
15
  end
@@ -18,18 +17,22 @@ end.parse!
18
17
 
19
18
  pet = Petli::Pet.new
20
19
  pet.display # force pet to update first
20
+ FOOD_OPTIONS = [:bread, :candy, :medicine]
21
21
 
22
22
  if options[:reset]
23
23
  Tatty::DB.clear
24
24
  puts "Goodbye. I hope you love your next pet!"
25
25
  elsif options[:status]
26
26
  puts Tatty::DB.dump
27
- elsif options[:bread]
28
- pet.feed!(food: :bread)
29
- elsif options[:candy]
30
- pet.feed!(food: :candy)
31
- elsif options[:medicine]
32
- pet.feed!(food: :medicine)
27
+ elsif options[:feed]
28
+ if [:bread, :candy, :medicine].include?(options[:feed].to_sym)
29
+ pet.feed!(food: options[:feed].to_sym)
30
+ else
31
+ puts "Unknown food #{options[:feed]}, only accepts #{FOOD_OPTIONS.join(", ")}"
32
+ exit 1
33
+ end
34
+ elsif options[:light]
35
+ pet.light_switch
33
36
  elsif options[:clean]
34
37
  pet.clean
35
38
  else
data/data/poop.txtanim CHANGED
@@ -2,5 +2,5 @@ width: 5
2
2
  height: 2
3
3
  loop: true
4
4
  ---
5
- ı ı ı|ϟ ϟ ϟ
6
- ༼ᵔ◡ᵔ༽|༼ಠ益ಠ༽
5
+ ı ı ı|ϟ ϟ ϟ|
6
+ ༼ᵔ◡ᵔ༽|༼ಠ益ಠ༽|
@@ -6,16 +6,40 @@ module Petli
6
6
  db_attr :died_at
7
7
 
8
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)
9
+ die! if unhappy? && unhealthy? && (too_sick? || too_hungry?)
10
+ end
11
+
12
+ def die!
13
+ self.died_at = Time.now
14
+ end
15
+
16
+ def sick?
17
+ self.sick > 0
18
+ end
19
+
20
+ def too_sick?
21
+ self.sick > 2
22
+ end
23
+
24
+ def too_hungry?
25
+ days_since(self.last_meal) >= 1
26
+ end
27
+
28
+ def unhappy?
29
+ self.happiness <= 1
30
+ end
31
+
32
+ def unhealthy?
33
+ self.health <= 1
14
34
  end
15
35
 
16
36
  def dead?
17
37
  !self.died_at.nil?
18
38
  end
39
+
40
+ def lifetime
41
+ (self.died_at.nil? ? days_since(self.birth) : days_since(self.birth, self.died_at)).to_i
42
+ end
19
43
  end
20
44
  end
21
45
  end
@@ -12,12 +12,7 @@ module Petli
12
12
 
13
13
  def update_hunger
14
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
15
+ hunger(hr_ago) if rand >= 0.3
21
16
  end
22
17
  end
23
18
 
@@ -34,6 +29,14 @@ module Petli
34
29
  self.sick = [0, self.sick - 1].max if food == :medicine
35
30
  end
36
31
 
32
+ def hunger(hr_ago=hours_ago(1))
33
+ self.health = [1, self.health-1].max
34
+ self.happiness = [1, self.happiness-1].max
35
+ self.poops = self.poops + [hr_ago] if rand <= 0.4 && self.poops.count < POOP_LOCATIONS.count
36
+ self.sick = [self.poops.filter{|poop| hours_since(poop) > 1 }.count, 3].min
37
+ self.last_meal = Time.now
38
+ end
39
+
37
40
  def clean
38
41
  self.poops = []
39
42
  end
data/lib/petli/pet.rb CHANGED
@@ -25,9 +25,5 @@ module Petli
25
25
  update_animation
26
26
  animation.display
27
27
  end
28
-
29
- def lifetime
30
- (self.died_at.nil? ? days_since(self.birth) : days_since(self.birth, self.died_at)).to_i
31
- end
32
28
  end
33
29
  end
@@ -14,21 +14,27 @@ module Petli
14
14
  end
15
15
 
16
16
  def keypress(event)
17
- exit if event.value == "q" || event.value == "\e" || event.value == "x"
17
+ key = event.value.downcase
18
+ exit if key == "q" || key == "\e" || key == "x"
18
19
  return if @pet.busy? || @pet.dead?
19
20
  @page -= 1 if event.key.name == :left && @page > 0
20
21
  @page += 1 if event.key.name == :right && @page < action_pages.count - 1
21
- onkey(event)
22
+ keyact = self.actions.keys.find{|k| k[0].to_s.downcase == key}
23
+ if !keyact.nil?
24
+ actions[keyact].call
25
+ elsif !self.actions[:else].nil?
26
+ actions[:else].call
27
+ end
22
28
  end
23
29
 
24
30
  def actions
25
- %w()
31
+ {}
26
32
  end
27
33
 
28
34
  def action_pages
29
35
  pages = []
30
36
  current_page = []
31
- fmt_actions = self.actions.map{|a| "[#{a[0].capitalize}]#{a[1..]}"}
37
+ fmt_actions = self.actions.filter{|a,b| a != :else}.keys.map{|a| "[#{a[0].capitalize}]#{a[1..]}"}
32
38
  fmt_actions.each do |action|
33
39
  len = (current_page + [action]).join(" ").length
34
40
  if len >= GAME_WIDTH-2
@@ -10,7 +10,10 @@ module Petli
10
10
  end
11
11
 
12
12
  def actions
13
- %w(higher lower)
13
+ {
14
+ higher: -> {pick("h")},
15
+ lower: -> {pick("l")},
16
+ }
14
17
  end
15
18
 
16
19
  def enter
@@ -24,11 +27,10 @@ module Petli
24
27
  def roll
25
28
  end
26
29
 
27
- def onkey(event)
28
- return if event.value != "h" and event.value != "l"
29
- @pickedhigher = event.value == "h"
30
+ def pick(dir)
30
31
  @pick = (1..6).to_a.sample
31
- @won = (event.value == "h" && @pick > @value) || (event.value == "l" && @pick < @value)
32
+ @pickedhigher = dir == "h"
33
+ @won = (dir == "h" && @pick > @value) || (dir == "l" && @pick < @value)
32
34
  @won ? @pet.celebrate : @pet.embarass
33
35
  @countdown = 10
34
36
  end
@@ -2,17 +2,17 @@ module Petli
2
2
  module Stages
3
3
  class Feed < Base
4
4
  def actions
5
- %w(bread snack med)
5
+ acts = {
6
+ bread: -> {feed(:bread)},
7
+ snack: -> {feed(:candy)},
8
+ else: -> {goto(Main, pet: @pet)},
9
+ }
10
+ acts[:med] = -> {feed(:medicine)} if @pet.sick?
11
+ acts
6
12
  end
7
13
 
8
- def onkey(event)
9
- if event.value == "b"
10
- @pet.feed(food: :bread)
11
- elsif event.value == "s"
12
- @pet.feed(food: :candy)
13
- elsif event.value == "m"
14
- @pet.feed(food: :medicine)
15
- end
14
+ def feed(food)
15
+ @pet.feed(food: food)
16
16
  goto(Main, pet: @pet)
17
17
  end
18
18
  end
@@ -8,7 +8,10 @@ module Petli
8
8
  end
9
9
 
10
10
  def actions
11
- %w(left right)
11
+ {
12
+ left: -> {pick("l")},
13
+ right: -> {pick("r")},
14
+ }
12
15
  end
13
16
 
14
17
  def enter
@@ -19,10 +22,9 @@ module Petli
19
22
  @pet.reset
20
23
  end
21
24
 
22
- def onkey(event)
23
- return if event.value != "l" and event.value != "r"
25
+ def pick(dir)
24
26
  @petpickedleft = rand(1..2) == 1
25
- @pickedleft = event.value == "l"
27
+ @pickedleft = dir == "l"
26
28
  (@petpickedleft == @pickedleft) ? @pet.celebrate : @pet.embarass
27
29
  @countdown = 10
28
30
  end
@@ -2,19 +2,15 @@ module Petli
2
2
  module Stages
3
3
  class Main < Base
4
4
  def actions
5
- return %w(light) if @pet.lights_out
6
- acts = %w(play feed light)
7
- acts << "clean" if @pet.poops.count > 0
5
+ return {light: -> {@pet.light_switch}} if @pet.lights_out
6
+ acts = {
7
+ play: -> {goto(Play, pet: @pet)},
8
+ feed: -> {goto(Feed, pet: @pet)},
9
+ light: -> {@pet.light_switch},
10
+ }
11
+ acts[:clean] = -> {@pet.clean} if @pet.poops.count > 0
8
12
  acts
9
13
  end
10
-
11
- def onkey(event)
12
- return @pet.light_switch if event.value == "l"
13
- return if @pet.lights_out
14
- return goto(Feed, pet: @pet) if event.value == "f"
15
- return @pet.clean if event.value == "c"
16
- return goto(Play, pet: @pet) if event.value == "p"
17
- end
18
14
  end
19
15
  end
20
16
  end
@@ -2,13 +2,11 @@ module Petli
2
2
  module Stages
3
3
  class Play < Base
4
4
  def actions
5
- %w(guess dice)
6
- end
7
-
8
- def onkey(event)
9
- return goto(Dice, pet: @pet) if event.value == "d"
10
- return goto(Guess, pet: @pet) if event.value == "g"
11
- goto(Main, pet: @pet)
5
+ {
6
+ guess: -> {goto(Guess, pet: @pet)},
7
+ dice: -> {goto(Dice, pet: @pet)},
8
+ else: -> {goto(Main, pet: @pet)},
9
+ }
12
10
  end
13
11
  end
14
12
  end
data/lib/petli/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Petli
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
data/lib/tatty/atlas.rb CHANGED
@@ -12,6 +12,10 @@ module Tatty
12
12
  @sheet[name.to_sym]
13
13
  end
14
14
 
15
+ def names
16
+ @sheet.keys
17
+ end
18
+
15
19
  private
16
20
 
17
21
  def parse_data
data/lib/tatty.rb CHANGED
@@ -9,10 +9,8 @@ module Tatty
9
9
 
10
10
  def self.run(klass, **kargs)
11
11
  self.goto(klass, **kargs)
12
- @reader = TTY::Reader.new
13
- @reader.on(:keypress) do |event|
14
- self.stage.keypress(event)
15
- end
12
+ @reader = TTY::Reader.new(track_history: false)
13
+ @reader.on(:keypress){|e| self.stage.keypress(e)}
16
14
 
17
15
  begin
18
16
  TTY::Cursor.invisible do
data/petli.gemspec CHANGED
@@ -33,7 +33,7 @@ Gem::Specification.new do |s|
33
33
 
34
34
  s.add_dependency("pastel", "~> 0.8.0")
35
35
  s.add_dependency("tty-cursor", "~> 0.7.1")
36
- s.add_dependency("tty-screen", "~> 0.8.1")
36
+ s.add_dependency("tty-screen", "~> 0.8.2")
37
37
  s.add_dependency("tty-reader", "~> 0.9.0")
38
38
  s.add_dependency("tty-color", "~> 0.6.0")
39
39
  s.add_dependency("tty-box", "~> 0.7.0")
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: petli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Anema
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2021-11-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: pastel
@@ -44,14 +43,14 @@ dependencies:
44
43
  requirements:
45
44
  - - "~>"
46
45
  - !ruby/object:Gem::Version
47
- version: 0.8.1
46
+ version: 0.8.2
48
47
  type: :runtime
49
48
  prerelease: false
50
49
  version_requirements: !ruby/object:Gem::Requirement
51
50
  requirements:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
- version: 0.8.1
53
+ version: 0.8.2
55
54
  - !ruby/object:Gem::Dependency
56
55
  name: tty-reader
57
56
  requirement: !ruby/object:Gem::Requirement
@@ -185,8 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
185
184
  - !ruby/object:Gem::Version
186
185
  version: '0'
187
186
  requirements: []
188
- rubygems_version: 3.2.3
189
- signing_key:
187
+ rubygems_version: 3.6.7
190
188
  specification_version: 4
191
189
  summary: A little pet in your console
192
190
  test_files: []