ezii 0.0.0.1

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.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/ezii-client/Gemfile +6 -0
  3. data/ezii-client/Gemfile.lock +32 -0
  4. data/ezii-client/Procfile +2 -0
  5. data/ezii-client/README.md +16 -0
  6. data/ezii-client/chat.txt +1446 -0
  7. data/ezii-client/config.ru +1 -0
  8. data/ezii-client/fake.rb +5 -0
  9. data/ezii-client/managables/programs/game_aided_manufacturing/functions/base_command.rb +26 -0
  10. data/ezii-client/managables/programs/game_aided_manufacturing/functions/mouse_y_axis_to_3d_z_axis.rb +4 -0
  11. data/ezii-client/managables/programs/game_aided_manufacturing/functions/record_audio_and_send_to_wit.rb +18 -0
  12. data/ezii-client/managables/programs/game_aided_manufacturing/functions/rotate_camera_axis_using_mouse_drag.rb +37 -0
  13. data/ezii-client/managables/programs/game_aided_manufacturing/functions/selection_cube.rb +35 -0
  14. data/ezii-client/managables/programs/game_aided_manufacturing/gam.rb +388 -0
  15. data/ezii-client/managables/programs/game_aided_manufacturing/gems.locked +75 -0
  16. data/ezii-client/managables/programs/game_aided_manufacturing/gems.rb +10 -0
  17. data/ezii-client/managables/programs/game_aided_manufacturing/lib/drb_server.rb +13 -0
  18. data/ezii-client/managables/programs/game_aided_manufacturing/lib/mittsu_monkeypatches/box_geometry.rb +5 -0
  19. data/ezii-client/managables/programs/game_aided_manufacturing/runnable.rb +20 -0
  20. data/ezii-client/managables/programs/game_aided_manufacturing/shapes/cube.rb +29 -0
  21. data/ezii-client/managables/programs/game_aided_manufacturing/sig/runable.rbi +9 -0
  22. data/ezii-client/managables/programs/game_aided_manufacturing/test.sh +5 -0
  23. data/ezii-client/managables/programs/game_aided_manufacturing/test/commands/test_move_cube.rb +18 -0
  24. data/ezii-client/managables/programs/game_aided_manufacturing/test/commands/test_selection_cube.rb +31 -0
  25. data/ezii-client/managables/programs/game_aided_manufacturing/test/test_command_remapping.rb +30 -0
  26. data/ezii-client/managables/programs/game_aided_manufacturing/test/test_helper.rb +75 -0
  27. data/ezii-client/managables/services/chat-bot-integrations/chat.txt +15 -0
  28. data/ezii-client/managables/services/chat-bot-integrations/gems.locked +66 -0
  29. data/ezii-client/managables/services/chat-bot-integrations/gems.rb +18 -0
  30. data/ezii-client/managables/services/chat-bot-integrations/gitter_zircon.rb +644 -0
  31. data/ezii-client/managables/services/chat-bot-integrations/regexes.rb +240 -0
  32. data/ezii-client/managables/services/chat-bot-integrations/setup-mac-os-x.sh +0 -0
  33. data/ezii-client/managables/services/chat-bot-integrations/setup.sh +1 -0
  34. data/ezii-client/managables/services/chat-bot-integrations/start.sh +3 -0
  35. data/ezii-client/managables/services/error-inspect/simplest-log +1 -0
  36. data/ezii-client/managables/services/error-inspect/simplest-log-init +1 -0
  37. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/ascii_nebuchadnezzar +9 -0
  38. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/chat.txt +1 -0
  39. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/twitch_zircon.rb +61 -0
  40. data/ezii-client/managables/services/livestream-interactive/Twitch.Tv/zion_fleet.rb +198 -0
  41. data/ezii-client/managables/services/livestream-interactive/chat.txt +40 -0
  42. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/README.md +3 -0
  43. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/__main__.js +58 -0
  44. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/black-out-random-word.js +74 -0
  45. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-sentence.js +57 -0
  46. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-wikipedia-page.js +25 -0
  47. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/random-words.js +34 -0
  48. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/rare-enough-word.js +41 -0
  49. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/functions/wikipedia-page.js +35 -0
  50. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/package.json +20 -0
  51. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/statistics/count-word.js +12 -0
  52. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/utils/log-to-natural-database.js +10 -0
  53. data/ezii-client/managables/services/stdlib-dot-com/koma/qanda-api@dev/word2vec-models/test-text8-vector.bin +0 -0
  54. data/ezii-client/managament_interface/gems.locked +13 -0
  55. data/ezii-client/managament_interface/gems.rb +3 -0
  56. data/ezii-client/managament_interface/management_interface +4 -0
  57. data/ezii-client/managament_interface/runnable.rb +30 -0
  58. data/ezii-client/rocknrolla +1 -0
  59. data/ezii-client/start.sh +2 -0
  60. data/ezii-client/test.wav +0 -0
  61. data/ezii-misc/detect-intent-from-git-patch.rb +46 -0
  62. data/ezii-server/Gemfile +23 -0
  63. data/ezii-server/Gemfile.lock +84 -0
  64. data/ezii-server/README.md +13 -0
  65. data/ezii-server/config.ru +2 -0
  66. data/ezii-server/eezee.rb +1243 -0
  67. data/ezii-server/httpsprojecteulernetproblem=155.png +0 -0
  68. data/ezii-server/httpsprojecteulernetproblem=205.png +0 -0
  69. data/ezii-server/httpsprojecteulernetproblem=228.png +0 -0
  70. data/ezii-server/httpsprojecteulernetproblem=262.png +0 -0
  71. data/ezii-server/httpsprojecteulernetproblem=3.png +0 -0
  72. data/ezii-server/httpsprojecteulernetproblem=333.png +0 -0
  73. data/ezii-server/httpsprojecteulernetproblem=334.png +0 -0
  74. data/ezii-server/httpsprojecteulernetproblem=337.png +0 -0
  75. data/ezii-server/httpsprojecteulernetproblem=426.png +0 -0
  76. data/ezii-server/httpsprojecteulernetproblem=442.png +0 -0
  77. data/ezii-server/httpsprojecteulernetproblem=449.png +0 -0
  78. data/ezii-server/httpsprojecteulernetproblem=497.png +0 -0
  79. data/ezii-server/httpsprojecteulernetproblem=51.png +0 -0
  80. data/ezii-server/httpsprojecteulernetproblem=514.png +0 -0
  81. data/ezii-server/httpsprojecteulernetproblem=520.png +0 -0
  82. data/ezii-server/httpsprojecteulernetproblem=571.png +0 -0
  83. data/ezii-server/httpsprojecteulernetproblem=587.png +0 -0
  84. data/ezii-server/httpsprojecteulernetproblem=588.png +0 -0
  85. data/ezii-server/httpsprojecteulernetproblem=599.png +0 -0
  86. data/ezii-server/httpsprojecteulernetproblem=72.png +0 -0
  87. data/ezii-server/httpsprojecteulernetproblem=93.png +0 -0
  88. data/ezii-server/regexes +258 -0
  89. data/ezii-server/sample.wav +0 -0
  90. data/ezii.gemspec +13 -0
  91. metadata +132 -0
@@ -0,0 +1,240 @@
1
+ if message =~ /bring probes to melting point/
2
+ @melting_point_receivables.push(@probes)
3
+ @probes = []
4
+ return "all of them? melt all the precious probes you idiot?"
5
+ end
6
+
7
+ if message =~ /probe (.*) (.*)/
8
+ action = :log
9
+
10
+ resource = $1
11
+ probe_identifier = $2
12
+
13
+ if probe_identifier =~ /(\d+)s/
14
+ duration_seconds = $1.to_i
15
+ end
16
+
17
+ if probe_identifier =~ /(\d+)bytes/
18
+ byte_count = $1.to_i
19
+ end
20
+
21
+ case resource
22
+ when /twitch.tv/
23
+ twitch_url = resource
24
+ action = :twitch
25
+ when /http/
26
+ action = :plain_curl
27
+ url = resource
28
+ end
29
+
30
+ case action
31
+ when :twitch
32
+ probe = record_live_stream_video_and_upload_get_url(url: twitch_url, duration_seonds: duration_seconds)
33
+ @probes.push(probe)
34
+ return probe
35
+ when :plain_curl
36
+ probe = get_string_of_x_bytes_by_curling_url(url: url, byte_count: byte_count)
37
+ @probes.push(probe)
38
+ return probe
39
+ end
40
+ end
41
+
42
+ if message =~ /show activity stream/
43
+ return "https://sideways-snowman.glitch.me/"
44
+ end
45
+
46
+ if message =~ /hey\Z/i
47
+ return "hey"
48
+ end
49
+
50
+ if message =~ /\Athrow (?:(.*)\s)?bomb\Z/i
51
+ if $1 == "bugsnag"
52
+ Bugsnag::Api.configure do |config|
53
+ config.auth_token = ENV["BUGSNAG_TOKEN"]
54
+ end
55
+ organizations = Bugsnag::Api.organizations
56
+
57
+ organization = organizations.first
58
+
59
+ projects = Bugsnag::Api.projects(organization[:id])
60
+
61
+
62
+ errors = Bugsnag::Api.errors(projects[0][:id], nil)
63
+
64
+ return errors.inspect[0...500]
65
+ end
66
+
67
+ return """
68
+ ```
69
+ Local variables (5 first)
70
+ #{local_variables.sample(5)}
71
+
72
+ Instance variables (5 first)
73
+ #{instance_variables.sample(5)}
74
+
75
+ Public methods (5 first)
76
+ #{public_methods.sample(5)}
77
+
78
+ ENV (120 first chars)
79
+ #{ENV.inspect[0...120]}
80
+
81
+ \`ifconfig\` (120 first chars)
82
+ #{`ifconfig`[0...120]}
83
+ ```
84
+ """
85
+ end
86
+
87
+ if message =~ /\Abring to melting point #{melting_point_receiavable_regex}\Z/i
88
+ if($1 === "last used picture")
89
+ Nokogiri::HTML(`curl -L http://gazelle.botcompany.de/lastInput`)
90
+
91
+ url = doc.css('a').first.url
92
+
93
+ @melting_point_receivables.push(url)
94
+ end
95
+ @melting_point_receivables.push($1)
96
+ end
97
+
98
+ if message =~ /\Amelt\Z/
99
+ # First step, assigning a variable
100
+ @melting_point = @melting_point_receivables.sample
101
+
102
+ def liqudify(raw_data_object)
103
+ # https://stackoverflow.com/a/24076936/4132642
104
+ i_ptr_int = raw_data_object.object_id << 1
105
+ # https://stackoverflow.com/questions/47757960/how-to-get-value-at-a-memory-address-in-linux-shell
106
+
107
+ end
108
+ liqudify(@melting_point)
109
+
110
+ # Next step, doing something intelligent with the data
111
+ # loosening it up somehow
112
+ # LIQUIDIFYING IT
113
+ # CONVERTING IT ALL TO BYTES
114
+ # PRESERVING VOLUME, just changing it's "Aggregatzustand"
115
+ end
116
+
117
+ if message =~ /\Aget-melting-point\Z/
118
+ return @melting_point
119
+ end
120
+
121
+ if message =~ /launch rocket (.*)\]var\[(.*)/
122
+ url = $1 + @melting_point + $2
123
+ curl_response = `curl -L #{url}`[0...100]
124
+
125
+ return """
126
+ CURL
127
+ #{curl_response}
128
+
129
+ URL
130
+ #{url}
131
+ """
132
+ end
133
+
134
+ if message =~ /\Awhat do you think?\Z/i
135
+ return "I think you're a stupid piece of shit and your dick smells worse than woz before he invented the home computer."
136
+ end
137
+
138
+ if message =~ /\Apass ball to @(\w+)\Z/i
139
+ @players[$1][:hasBall] = :yes
140
+ end
141
+
142
+ if message =~ /\Awho has ball\Z/i
143
+ return @players.find { |k, v| v[:hasBall] == :yes }[0]
144
+ end
145
+
146
+ if message =~ /\Aspace\Z/
147
+ exec_bash_visually_and_post_process_strings(
148
+ '/Users/lemonandroid/gam-git-repos/LemonAndroid/gam/managables/programs/game_aided_manufacturing/test.sh'
149
+ )
150
+ end
151
+
152
+ if message =~ /\Achat-variable (\w*) (.*)\Z/i
153
+ variable_value_used_by_chat_user = $2
154
+ return "Coming soon" if variable_value_used_by_chat_user == "selectDiscordMessage"
155
+ variable_identifier_used_by_chat_user = $1
156
+
157
+ if(variable_value_used_by_chat_user =~ /`(.*)`/)
158
+ variable_value_used_by_chat_user = eval($1)
159
+ end
160
+
161
+ @variables_for_chat_users[variable_identifier_used_by_chat_user] = variable_value_used_by_chat_user
162
+
163
+ return space_2_unicode("variable #{variable_identifier_used_by_chat_user} set to #{@variables_for_chat_users[variable_identifier_used_by_chat_user]}")
164
+ end
165
+
166
+ if message =~ /\Aget-chat-variable (\w*)\Z/i
167
+ return [
168
+ space_2_unicode("Getting variable value for key #{$1}"),
169
+ space_2_unicode(@variables_for_chat_users[$1].verbose_introspect(very_verbose=true))
170
+ ].join
171
+ end
172
+
173
+ if message =~ /\Aget-method-definition #{variable_regex}#{method_call_regex}\Z/
174
+ return @variables_for_chat_users[$1].method($2.to_sym).source
175
+ end
176
+
177
+ if message =~ /\A@LemonAndroid List github repos\Z/i
178
+ return "https://api.github.com/users/LemonAndroid/repos"
179
+ end
180
+
181
+ if message =~ /\AList 10 most recently pushed to Github Repos of LemonAndroid\Z/i
182
+ texts = ten_most_pushed_to_github_repos
183
+ texts.each do |text|
184
+ return text
185
+ end
186
+ end
187
+
188
+ if message =~ /\A@LemonAndroid work on (\w+\/\w+)\Z/i
189
+ @currently_selected_project = $1
190
+ return space_2_unicode("currently selected project set to #{@currently_selected_project}")
191
+ end
192
+
193
+ if message =~ /@LemonAndroid currently selected project/i
194
+ return space_2_unicode("currently selected project is #{@currently_selected_project}")
195
+ end
196
+
197
+ if message =~ /\Ashow `(.*)`\Z/i
198
+ test = $1
199
+ exec_bash_visually_and_post_process_strings
200
+ end
201
+
202
+ if message =~ /\A@LemonAndroid\s+show eval `(.*)`\Z/i
203
+ texts = [eval($1).to_s]
204
+ texts.each do |text|
205
+ return space_2_unicode(text)
206
+ end
207
+ end
208
+
209
+ if message =~ /\Als\Z/i
210
+ texts = execute_bash_in_currently_selected_project('ls')
211
+ texts.each do |text|
212
+ return text
213
+ end
214
+ end
215
+
216
+ if message =~ /\A@LemonAndroid cd ([^\s]+)\Z/i
217
+ path = nil
218
+ Dir.chdir(current_repo_dir) do
219
+ path = File.expand_path(File.join('.', Dir.glob("**/#{$1}")))
220
+ end
221
+ texts = execute_bash_in_currently_selected_project("ls #{path}")
222
+
223
+ return space_2_unicode("Listing directory `#{path}`")
224
+ texts.each do |text|
225
+ return text
226
+ end
227
+ end
228
+
229
+ if message =~ /\A@LemonAndroid cat ([^\s]+)\Z/i
230
+ path = nil
231
+ Dir.chdir(current_repo_dir) do
232
+ path = File.expand_path(File.join('.', Dir.glob("**/#{$1}")))
233
+ end
234
+ texts = execute_bash_in_currently_selected_project("cat #{path}")
235
+
236
+ return space_2_unicode("Showing file `#{path}`")
237
+ texts.each do |text|
238
+ return text
239
+ end
240
+ end
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+ cd /Users/lemonandroid/one/game/managables/services/chat-bot-integrations/
3
+ bundle exec ruby gitter_zircon.rb
@@ -0,0 +1 @@
1
+ tail -f /var/log/gam.stderr
@@ -0,0 +1 @@
1
+ sudo touch /var/log/gam.stderr
@@ -0,0 +1,9 @@
1
+
2
+ .-=-.
3
+ ( ),-------.
4
+ _ _,'-=-' -----... `-.
5
+ .-=-. .-=-.,--T-~;'` #::::.._ '---)
6
+ ( )( )-.___ *::.. ________ .-=-./
7
+ '-=-' '-=-' ''`-=.--- .-=-. __( )
8
+ ( ) ` '-=-'
9
+ '-=-'
@@ -0,0 +1,61 @@
1
+ require 'zircon'
2
+ require 'colorize'
3
+ require 'net/http'
4
+ require 'cgi'
5
+ LOG_FILE = File.open('chat.txt', 'w')
6
+
7
+ SCREEN = []
8
+
9
+ TWITCH_CHANNEL = '#' + ENV["TWITCH_CHANNEL"]
10
+
11
+ def start
12
+ client = Zircon.new(
13
+ server: 'irc.twitch.tv',
14
+ port: '6667',
15
+ channel: TWITCH_CHANNEL,
16
+ username: 'ezii_tm_registerred',
17
+ password: ENV["EZE_TWITCH_TOKEN_CHAT"]
18
+ )
19
+
20
+ removed_colors = [:black, :white, :light_black, :light_white]
21
+ colors = String.colors - removed_colors
22
+ client.on_message do |message|
23
+ puts ">>> #{message.from}: #{message.body}".colorize(colors.sample)
24
+ LOG_FILE.write(message.body.to_s + "\n")
25
+ if message.body == "Nebuchadnezzar"
26
+ Thread.new do
27
+ i = 0
28
+ puts `ls`
29
+ Dir.chdir("managables/services/livestream-interactive/Twitch.Tv/") do
30
+ open("|ruby zion_fleet.rb") do |∫|
31
+ while response = ∫.gets
32
+ i += 1
33
+ next if i < 20
34
+ SCREEN.push(response)
35
+ # if rand < 0.00001
36
+ # byebug
37
+ # end
38
+
39
+ url = URI.parse('https://ezii-server.herokuapp.com/' + '?message=' + CGI.escape(response))
40
+ response = Net::HTTP.get(url)
41
+ puts response
42
+ client.privmsg(TWITCH_CHANNEL, response.gsub(/\s/, '.')) if !response.empty?
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+
49
+ if message.body
50
+ url = URI.parse('https://ezii-server.herokuapp.com/' + '?message=' + CGI.escape(message.body))
51
+ response = Net::HTTP.get(url)
52
+ puts response
53
+ client.privmsg(TWITCH_CHANNEL, response) if !response.empty?
54
+ end
55
+ end
56
+
57
+ client.run!
58
+ end
59
+
60
+ start()
61
+
@@ -0,0 +1,198 @@
1
+ require 'io/console'
2
+
3
+ def at(x, y, str)
4
+ print "\033[#{y};#{x}H#{str}"
5
+ end
6
+
7
+
8
+
9
+
10
+ #
11
+ # INIT
12
+ #
13
+ # terminal configuration
14
+ Kernel.system "tput civis; stty -icanon -echo; resize -s 30 120; clear"
15
+ height, width = 30, 30
16
+ # Ship initial position, speed and fired missiles
17
+ lvl = 0
18
+ y_pos = 10
19
+ y_incr = 1
20
+ hull = 20
21
+ shield = 20
22
+ zion = 40
23
+ weapon = ['~', '=>', '░▒▓█', 'Φ']
24
+ wpn_i = 1
25
+ fire = [] # [x_pos, y_pos]
26
+ enemies = [] # [x_pos, y_pos]
27
+ kills = 0
28
+
29
+ while true
30
+ #
31
+ # WINDOW
32
+ #
33
+ # top left
34
+ at(1, 1, "Level: #{lvl.to_s}")
35
+ at(1, 2, "Kills: #{kills.to_s}")
36
+ at(1, 5, "Enemies: #{enemies.size.to_s}")
37
+ # top center
38
+ at(58, 1, "ZION")
39
+ at(40, 2, "#{('|' * zion).ljust(40, ' ')}")
40
+ # top right
41
+ at(width - 28, 1, 'Nebuchadnezzar')
42
+ at(width - 28, 2, "Hull: #{('|' * hull).ljust(20, ' ')}")
43
+ at(width - 28, 3, "Shield: #{('|' * shield).ljust(20, ' ')}")
44
+ # bottom left
45
+ at(1, height, '\'q\' to quit')
46
+
47
+
48
+
49
+
50
+
51
+ #
52
+ # USER INPUT
53
+ #
54
+ # STDIN input refresh screen, or 0.005 scd. Might melts some CPU ?
55
+ refresh = Kernel.select([$stdin], nil, nil, 0.005)
56
+ if refresh then
57
+ case $stdin.getc
58
+ when 'q' then system('clear') && break
59
+ when ' ' then
60
+ wpn_i += 1
61
+ # unlock new weapons
62
+ fire << [34, y_pos + 7, weapon[0]]
63
+ fire << [34, y_pos + 6, weapon[0]] if kills >= 10
64
+ fire << [28, y_pos + 4, weapon[1]] if kills >= 50
65
+ fire << [22, y_pos + 5, weapon[1]] if kills >= 100
66
+ fire << [17, y_pos + 3, weapon[2]] if kills >= 200 && wpn_i % 5 == 0
67
+ # ANSI escape sequence
68
+ when "\033"
69
+ # Arrow up
70
+ when 'A' then y_pos -= 1
71
+ # Arrow down
72
+ when 'B' then y_pos += 1
73
+ end
74
+ end
75
+
76
+
77
+
78
+
79
+
80
+
81
+ #
82
+ # SHIP
83
+ #
84
+ # clear trailing lines
85
+ at(24, y_pos, "#{' ' * 5}")
86
+ at(29, y_pos + 1, "#{' ' * 10}")
87
+ at(39, y_pos + 2, "#{' ' * 3}")
88
+ at(42, y_pos + 3, ' ')
89
+ at(42, y_pos + 7, ' ')
90
+ at(33, y_pos + 8, "#{' ' * 9}")
91
+ at(28, y_pos + 9, "#{' ' * 5}")
92
+
93
+ # make sure ship stay on the screen
94
+ y_pos = y_pos + 1 if y_pos <= 0
95
+ y_pos = y_pos - 1 if y_pos >= height - 8
96
+
97
+ # display ship. Instanciate new File object every 0.01 scd ? ¯\_(ツ)_/¯
98
+ at(nil, y_pos, File.read('ascii_nebuchadnezzar'))
99
+
100
+
101
+
102
+ #
103
+ # FIRE
104
+ #
105
+ if fire.any?
106
+ fire.each_with_index do |f, i|
107
+ # shots move forward without leaving a character behind them
108
+ at(f[0], f[1], ' ')
109
+ f[0] += 1
110
+
111
+ (f[0] + f[2].size) < width ? at(f[0], f[1], f[2]) : at(f[0], f[1], "#{' ' * f[2].size}")
112
+ fire.delete_at(i) if f[0] > width
113
+ end
114
+ end
115
+
116
+
117
+
118
+
119
+ #
120
+ # ENEMIES
121
+ #
122
+ # e = [x_position, y_position, x_pos as float, speed]
123
+
124
+ # more and more enemies spawn
125
+ if lvl < 1000
126
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 360 == 0
127
+ elsif lvl <= 2500
128
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 140 == 0
129
+ elsif lvl <= 5000
130
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 51 == 0
131
+ elsif lvl <= 10_000
132
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 20 == 0
133
+ elsif lvl <= 11_000
134
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 15 == 0
135
+ elsif lvl <= 12_000
136
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 10 == 0
137
+ elsif lvl <= 13_000
138
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 5 == 0
139
+ elsif lvl > 13_000
140
+ enemies << [width, rand(9..27), width, rand(0.008..0.09)] if lvl % 2 == 0
141
+ end
142
+
143
+ enemies.each_with_index do |e, i|
144
+ # each enemy has his own speed
145
+ e[2] -= e[3]
146
+ # enemies speed increases with time
147
+ case lvl
148
+ when 1..2000 then nil
149
+ when 2001..5000 then e[2] -= 0.02
150
+ when 5001..7500 then e[2] -= 0.04
151
+ else e[2] -= 0.07
152
+ end
153
+ e[0] = e[2].to_i
154
+
155
+ # display enemies
156
+ at(e[0], e[1], '*')
157
+ at(e[0] + 1, e[1], ' ')
158
+
159
+ # kill an enemy if he gets shot
160
+ fire.each_with_index do |f, j|
161
+ if e[0] == f[0] && e[1] == f[1]
162
+ enemies.delete_at(i)
163
+ at(f[0] - 1, f[1], ' ')
164
+ # weapon[2] (= laser) go through enemies
165
+ fire.delete_at(j) if f[2] != weapon[2]
166
+ kills += 1
167
+ end
168
+ end
169
+
170
+ # an enemy damages the ship shield/hull if they're on the same cell
171
+ if e[0] < 42
172
+ if (e[0].between?(24, 28) && e[1] == y_pos + 1) ||
173
+ (e[0].between?(23, 38) && e[1] == y_pos + 2) ||
174
+ (e[0].between?(23, 41) && e[1] == y_pos + 3) ||
175
+ (e[0] <= 42 && e[1] == y_pos + 4) ||
176
+ (e[0] <= 42 && e[1] == y_pos + 5) ||
177
+ (e[0] <= 42 && e[1] == y_pos + 6) ||
178
+ (e[0].between?(27, 41) && e[1] == y_pos + 7) ||
179
+ (e[0].between?(28, 32) && e[1] == y_pos + 8)
180
+ then
181
+ shield < 1 ? hull -= 0.2 : shield -= 1
182
+ enemies.delete_at(i)
183
+ end
184
+ end
185
+
186
+ # hide enemies if they cross the window and damage zion
187
+ if e[0] == 0
188
+ enemies.delete_at(i) && zion -= 1
189
+ end
190
+ end
191
+ # loose victory
192
+ break if hull < 0.2 || zion < 1
193
+
194
+ lvl += 1
195
+ end
196
+
197
+ Kernel.system "clear; tput cnorm; stty icanon echo"
198
+