petli 0.0.3 → 0.0.4

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.
data/lib/petli.rb CHANGED
@@ -1,9 +1,14 @@
1
1
  module Petli
2
- autoload :Animator, "petli/animator"
3
- autoload :HUD, "petli/hud"
4
2
  autoload :Pet, "petli/pet"
5
- autoload :Poop, "petli/poop"
6
3
  autoload :Stages, "petli/Stages"
7
- autoload :Watch, "petli/watch"
8
4
  autoload :VERSION, "petli/version"
5
+ autoload :Watch, "petli/watch"
6
+
7
+ def self.root
8
+ File.expand_path(File.join(__dir__, '..'))
9
+ end
10
+
11
+ def self.data_path(*filepaths)
12
+ File.join(root, 'data', *filepaths)
13
+ end
9
14
  end
data/lib/tatty/anim.rb CHANGED
@@ -1,18 +1,60 @@
1
1
  module Tatty
2
2
  class Anim
3
- def initialize(atlas, frame: 0, rate: 2)
3
+ attr_reader :width, :height, :loop, :rate, :name
4
+
5
+ def self.from_atlas(filepath, name: :default)
6
+ Atlas.new(filepath)[name]
7
+ end
8
+
9
+ def initialize(atlas, width:, height:, **kargs)
4
10
  @atlas = atlas
5
- @frame = frame
6
- @rate = rate
11
+ @rate = kargs[:speed] || 2
12
+ @loop = kargs[:loop] || false
13
+ if kargs[:loop_for].nil?
14
+ @loop_for = -1
15
+ else
16
+ @loop = false
17
+ @loop_for_start = kargs[:loop_for] || -1
18
+ @loop_for = @loop_for_start
19
+ end
20
+ @name = kargs[:name]
21
+ @width = width
22
+ @height = height
23
+ reset
24
+ end
25
+
26
+ def reset
27
+ @frame = 0
28
+ @loop_for = @loop_for_start if @loop_for == 0
7
29
  end
8
30
 
9
31
  def step
10
32
  @frame += 1
11
- @frame = 0 if self.frame >= @atlas.count
12
- @atlas[self.frame]
33
+ if rate_frame >= @atlas.count
34
+ reset if self.loop
35
+ @loop_for -= 1 if @loop_for > 0
36
+ true
37
+ else
38
+ false
39
+ end
40
+ end
41
+
42
+ def display
43
+ @atlas[rate_frame]
44
+ end
45
+
46
+ def next
47
+ step
48
+ display
13
49
  end
14
50
 
15
- def frame
51
+ def loop
52
+ @loop || @loop_for > 0
53
+ end
54
+
55
+ private
56
+
57
+ def rate_frame
16
58
  (@frame/@rate).ceil
17
59
  end
18
60
  end
@@ -0,0 +1,74 @@
1
+ require 'yaml'
2
+
3
+ module Tatty
4
+ class Atlas
5
+ def initialize(filepath)
6
+ @filepath = File.expand_path(filepath)
7
+ @sheet = {}
8
+ parse_data
9
+ end
10
+
11
+ def [](name)
12
+ @sheet[name.to_sym]
13
+ end
14
+
15
+ private
16
+
17
+ def parse_data
18
+ chunks = File.read(@filepath).split(/^---.*$/)
19
+ shouldBeYaml = true
20
+ default_config = {name: :default}.merge(parse_yaml(chunks.first))
21
+ default_config.delete(:alias)
22
+ config = {}
23
+ chunks.each do |chunk|
24
+ if shouldBeYaml
25
+ config = default_config.merge(parse_yaml(chunk))
26
+ else
27
+ validate_config(config)
28
+ animation = Anim.new(parse_animation(chunk, config), **config)
29
+ ([config[:name]] + Array(config[:alias])).map(&:to_sym).each do |name|
30
+ @sheet[name] = animation
31
+ end
32
+ end
33
+ shouldBeYaml = !shouldBeYaml
34
+ end
35
+ end
36
+
37
+ def validate_config(config)
38
+ name = config[:name].to_sym
39
+ if name.nil?
40
+ raise "All animations in an atlas need to have a name attribute"
41
+ elsif !@sheet[name].nil?
42
+ raise "Duplicate animation name '#{name}'"
43
+ elsif config[:width].nil? || config[:height].nil?
44
+ raise "Animation '#{name}' does not have a width and/or height attribute"
45
+ end
46
+ end
47
+
48
+ def parse_yaml(chunk)
49
+ YAML.load(chunk).each_with_object({}) { |(k,v), h| h[k.to_sym] = v }
50
+ rescue
51
+ raise "unable to parse chunk #{chunk}"
52
+ end
53
+
54
+ def parse_animation(chunk, config)
55
+ width, height = config[:width], config[:height]
56
+ frames = []
57
+ frame_offset = 0
58
+ chunk.lines.each_slice(height+1).to_a.each do |frame_line|
59
+ frame_line.each do |line|
60
+ i = 0
61
+ while line.length > 1
62
+ frames[frame_offset+i] ||= []
63
+ frames[frame_offset+i] << line.slice!(0, width)
64
+ line.slice!(0, 1) # separator
65
+ i+=1
66
+ end
67
+ end
68
+ frame_offset = frames.count
69
+ end
70
+ frames.map {|f| f.join("\n") }
71
+ end
72
+ end
73
+ end
74
+
data/lib/tatty/stage.rb CHANGED
@@ -19,6 +19,9 @@ module Tatty
19
19
  ::Tatty.goto(klass, **kargs)
20
20
  end
21
21
 
22
+ def keypress(evt)
23
+ end
24
+
22
25
  def screen_size
23
26
  TTY::Screen.size
24
27
  end
data/lib/tatty.rb CHANGED
@@ -3,6 +3,7 @@ module Tatty
3
3
  require 'tty-cursor'
4
4
 
5
5
  autoload :Anim, "tatty/anim"
6
+ autoload :Atlas, "tatty/atlas"
6
7
  autoload :DB, "tatty/db"
7
8
  autoload :Stage, "tatty/stage"
8
9
 
data/petli.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
  HERE
25
25
  s.metadata = { "source_code_uri" => "https://github.com/tanema/petli" }
26
26
 
27
- s.files = Dir.glob('{bin/*,lib/**/*,data/*,[A-Z]*}')
27
+ s.files = Dir.glob('{bin/*,lib/**/*,data/**/*,[A-Z]*}')
28
28
  s.bindir = "bin"
29
29
  s.executables = ["petli"]
30
30
  s.require_paths = ['lib']
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: petli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim Anema
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-13 00:00:00.000000000 Z
11
+ date: 2021-11-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pastel
@@ -110,7 +110,7 @@ dependencies:
110
110
  version: 0.3.0
111
111
  description: 'A virtual pet that will live in your command line!
112
112
 
113
- '
113
+ '
114
114
  email:
115
115
  - timanema@gmail.com
116
116
  executables:
@@ -123,14 +123,28 @@ files:
123
123
  - LICENSE
124
124
  - README.md
125
125
  - Rakefile
126
+ - bin/anim
127
+ - bin/bootstrap.rb
126
128
  - bin/console
127
129
  - bin/petli
128
- - data/character.json
129
- - data/face_ref
130
+ - data/adult/001_diddly.txtanim
131
+ - data/adult/002_kirby.txtanim
132
+ - data/adult/003_tama.txtanim
133
+ - data/adult/004_big.txtanim
134
+ - data/adult/005_angel.txtanim
135
+ - data/death.txtanim
136
+ - data/hatch.txtanim
137
+ - data/infant/001_baby.txtanim
138
+ - data/poop.txtanim
139
+ - data/sleep.txtanim
140
+ - data/teen/001_baloop.txtanim
141
+ - data/teen/002_roboty.txtanim
130
142
  - lib/petli.rb
131
- - lib/petli/animator.rb
132
143
  - lib/petli/pet.rb
133
- - lib/petli/poop.rb
144
+ - lib/petli/pet/animation.rb
145
+ - lib/petli/pet/death.rb
146
+ - lib/petli/pet/food.rb
147
+ - lib/petli/pet/happy.rb
134
148
  - lib/petli/stages.rb
135
149
  - lib/petli/stages/base.rb
136
150
  - lib/petli/stages/dice.rb
@@ -142,6 +156,7 @@ files:
142
156
  - lib/petli/watch.rb
143
157
  - lib/tatty.rb
144
158
  - lib/tatty/anim.rb
159
+ - lib/tatty/atlas.rb
145
160
  - lib/tatty/db.rb
146
161
  - lib/tatty/stage.rb
147
162
  - petli.gemspec
@@ -170,8 +185,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
170
185
  - !ruby/object:Gem::Version
171
186
  version: '0'
172
187
  requirements: []
173
- rubygems_version: 3.0.3
174
- signing_key:
188
+ rubygems_version: 3.2.3
189
+ signing_key:
175
190
  specification_version: 4
176
191
  summary: A little pet in your console
177
192
  test_files: []
193
+ ...
data/data/character.json DELETED
@@ -1,40 +0,0 @@
1
- {
2
- "eyes": {
3
- "default": ["O"],
4
- "mezmerized": ["◉", "✧", "☯"],
5
- "great": ["^", "O"],
6
- "happy": ["O", "o"],
7
- "tired": ["ළ", "ತ"],
8
- "annoyed": ["⊜", "ಠ"],
9
- "angry": ["ಠ"],
10
- "embarassed": ["ಥ"],
11
- "eating": ["O", ["ᗒ", "ᗕ"]],
12
- "sick": [["⨴","⨵"],"ꔸ"]
13
- },
14
- "mouth": {
15
- "default": ["_", "."],
16
- "mezmerized": ["ᴥ", "O"],
17
- "great": ["▽", "‿"],
18
- "happy": ["o", "_"],
19
- "tired": ["-", "."],
20
- "annoyed": ["_", "-"],
21
- "angry": ["益", "෴"],
22
- "embarassed": ["◠", "-"],
23
- "eating": ["▽", "‿"],
24
- "sick": ["▱","﹃"]
25
- },
26
- "arms": {
27
- "default": [["ᕠ", "ᕤ"], ["ᕦ", "ᕡ"]],
28
- "plain": ["_", "~"],
29
- "tired": ["_", "~"],
30
- "embarassed": [["乁","ㄏ"], "_"],
31
- "eating": [["\\", "/"], "_"],
32
- "sick": ["_", "~"]
33
- },
34
- "head": {
35
- "default": [["(", ")"]]
36
- },
37
- "bread": "ʕ=ʔ",
38
- "candy": "▷☯◁",
39
- "medicine": "◖◻◗"
40
- }
data/data/face_ref DELETED
@@ -1,73 +0,0 @@
1
- ☠⚕
2
- (o . o)
3
- (o _ o)
4
- (o _ O)
5
- (O _ O)
6
- (* ^ *)
7
- (O _ o)
8
- (ʘ _ ʘ)
9
- (u _ u)
10
- (^ _ ^)
11
- (ಠ _ ಠ)
12
- (^ o ^)
13
- (◉ ᴥ ◉)
14
- (o O o)
15
- (o - o)
16
- (- _ -)
17
- (T _ T)
18
- (ಥ _ ಥ)
19
- (ಠ 益ಠ)
20
- (ಠ ෴ ಠ)
21
- (ᴗ □ ᴗ)
22
- ☆゚☆゚☆゚☆゚
23
- (o ‿ o)
24
- (ᗒ o ᗕ)
25
- (⇀ - ↼)
26
- (⨴ _ ⨵)
27
- (ꔸ _ ꔸ)
28
- (ළ _ ළ) # tired
29
- (ತ _ ತ)
30
- (⊜ _ ⊜)
31
- (✧ _ ✧)
32
- (☯ _ ☯)
33
-
34
- \(⇀ O ↼)/ ʕ=ʔ
35
- _(O _ O)_ =ʔ
36
- \(⇀ O ↼)/ =ʔ
37
- _(O _ O)_ ʔ
38
- \(⇀ O ↼)/ ʔ
39
- _(O _ O)_
40
- (◉ ᴥ ◉)
41
- (o O o)
42
-
43
- ξꔸ ꔸ)
44
-
45
- ☛(O _ O)☛
46
- ☚(O _ O)☚
47
- 乁(O _ O)ㄏ
48
- _(O _ O)_
49
- ᕠ(O _ O)ᕤ
50
- ᕦ(O _ O)ᕡ
51
- \(O _ O)/
52
- /(O _ O)\
53
-
54
- ߍ೧
55
- ༼ºل͟º༽
56
-
57
- poop friend
58
- ı ┐ ┌ ┌ ı ı ı ┌ ┐ ┐ ı ı
59
- ༼ᵔ◡ᵔ༽ ༼ಠ益ಠ༽ ༼ᵔ◡ᵔ༽ ༼ಠ益ಠ༽
60
-
61
- ⚀ ⚁ ⚂ ⚃ ⚄ ⚅
62
-
63
- _
64
- (O O)
65
- |-|
66
-
67
-
68
-
69
- ┌───┐
70
- │ ☠ │
71
- │ │
72
- ```````
73
-
@@ -1,137 +0,0 @@
1
- module Petli
2
- require 'json'
3
-
4
- class Animator
5
- ANIMATIONS = {
6
- egg: [" _\n / \\\n \\_/", " _\n((/ \\\n \\_/))", " _\n / \\))\n((\\_/"]*5,
7
- egg_crack: [" _\n/ \\\n\\_‚/"," _\n/ \\\n\\_¡/"," _\n/ \\\n\\_¦/"," _\n/ ¡\\\n\\_ϟ/"," _\n/ ¦\\\n\\_ϟ/"," _\n/ ϟ\\\n\\_ϟ/","\n/ ϟ\\\n\\_ϟ/"," ☁\n/ ϟ\\\n\\_ϟ/"],
8
- stand: ["\n\nahe m eha\n", "\n\nahe m eha\n"],
9
- left: ["\n\nahe m e ha\n", "\n\nahe m e ha\n"],
10
- right: ["\n\nah e m eha\n", "\n\nah e m eha\n"],
11
- item: ["\n\nahe m eha fff\n", "\n\nahe m eha fff\n", "\n\nahe m eha fff\n", "\n\nahe m eha fff\n"],
12
- eat: ["\n\nahe m eha fff\n", "\n\nahe m eha ff\n", "\n\nahe m eha ff\n", "\n\nahe m eha f\n", "\n\nahe m eha f\n", "\n\nahe m eha\n"],
13
- walk: ["\n\n ahe m eha\n", "\n\nahe m e ha\n", "\n\nahe m eha\n", "\n\nah e m eha\n"],
14
- hop: ["\n\n ahe m eha\n", "\nahe m e ha\n\n", "\n\nahe m e ha\n", "\n\nahe m eha\n", "\nah e m eha\n\n", "\n\nah e m eha\n"],
15
- death: [" ┌───┐ \n │ ☠ │ \n │ │ \n ```````", " ┌───┐ \n │ ☠ │ \n │ │ \n '''''''"],
16
- }
17
-
18
- attr_writer :mood
19
- attr_reader :action
20
-
21
- def initialize(hatching:, mood:, action: :walk)
22
- @frame = 0
23
- @food = :bread
24
- @mood = mood
25
- @action = action
26
- if hatching
27
- @mood_stack = [:mezmerized, :mezmerized, :mezmerized, :mezmerized]
28
- @action_stack = [:egg, :egg_crack, :stand, :stand]
29
- else
30
- @mood_stack = []
31
- @action_stack = []
32
- end
33
- end
34
-
35
- def step
36
- add_frame
37
- leftarm, rightarm = getit(:arms, 2)
38
- lefteye, righteye = getit(:eyes, 2)
39
- mouth = getit(:mouth)
40
- lefthead, righthead = getit(:head, 2)
41
- [leftarm,lefthead,lefteye,mouth,righteye,righthead,rightarm]
42
-
43
- food_peices = food.split('')
44
-
45
- ANIMATIONS[action][frame]
46
- .sub('a', leftarm.to_s).sub('a', rightarm.to_s)
47
- .sub('h', lefthead).sub('h', righthead)
48
- .sub('e', lefteye).sub('e', righteye)
49
- .sub('m', mouth)
50
- .reverse
51
- .sub('f', food_peices[2]).sub('f', food_peices[1]).sub('f', food_peices[0])
52
- .reverse
53
- end
54
-
55
- def eat(food: :bread, &block)
56
- @busy = true
57
- @frame = 0
58
- @food = food
59
- @action_stack = [:item, :eat, :stand, :stand, :stand, :stand]
60
- @mood_stack = [:mezmerized, :eating, :eating, :mezmerized, :mezmerized]
61
- @on_complete = block
62
- end
63
-
64
- def celebrate
65
- @action_stack = [:stand, :stand, :stand, :stand]
66
- @mood_stack = [:mezmerized, :mezmerized, :mezmerized, :mezmerized]
67
- @frame = 0
68
- end
69
-
70
- def embarass
71
- @action_stack = [:stand, :stand, :stand, :stand]
72
- @mood_stack = [:embarassed, :embarassed, :embarassed, :embarassed]
73
- @frame = 0
74
- end
75
-
76
- def busy?
77
- @busy
78
- end
79
-
80
- def action=(act)
81
- @action = act
82
- @frame = 0
83
- end
84
-
85
- def action
86
- @action_stack.count > 0 ? @action_stack[0] : @action
87
- end
88
-
89
- def mood
90
- @mood_stack.count > 0 ? @mood_stack[0] : @mood
91
- end
92
-
93
- private
94
-
95
- def add_frame
96
- frame_count = ANIMATIONS[action].count
97
- @frame += 1
98
- if frame == frame_count
99
- @frame = 0
100
- @action_stack.shift if @action_stack.count > 0
101
- @mood_stack.shift if @mood_stack.count > 0
102
- if @action_stack.count == 0 && @mood_stack.count == 0
103
- @busy = false
104
- @on_complete.call unless @on_complete.nil?
105
- @on_complete = nil
106
- end
107
- end
108
- end
109
-
110
- def food
111
- data[@food]
112
- end
113
-
114
- def frame # to control framerate
115
- (@frame/3).ceil
116
- end
117
-
118
- def getit(part, vals=1)
119
- mood_part = data[part][mood] || data[part][:default]
120
- part_frame = frame % mood_part.count
121
- result = mood_part[part_frame]
122
- if vals == 2 && result.is_a?(String)
123
- [result, result]
124
- else
125
- result
126
- end
127
- end
128
-
129
- def data
130
- @data ||= JSON.parse(
131
- File.read(File.expand_path('../../data/character.json', __dir__)),
132
- {:symbolize_names => true}
133
- )
134
- end
135
- end
136
- end
137
-
data/lib/petli/poop.rb DELETED
@@ -1,9 +0,0 @@
1
- module Petli
2
- class Poop < Tatty::Anim
3
- LOCATIONS = [[1,1], [1,4], [1,7], [11,1], [11,7], [20,1], [20,4], [20,7]]
4
- ANIMATION = ["ı ı ı\n༼ᵔ◡ᵔ༽", "ϟ ϟ ϟ\n༼ಠ益ಠ༽"]
5
- def initialize()
6
- super(ANIMATION)
7
- end
8
- end
9
- end