fun_ci 1.2.1 → 2.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 (228) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +236 -0
  3. data/README.md +182 -59
  4. data/lib/fun_ci/agent/age.rb +15 -0
  5. data/lib/fun_ci/agent/command_support.rb +27 -0
  6. data/lib/fun_ci/agent/commands.rb +27 -0
  7. data/lib/fun_ci/agent/context.rb +10 -0
  8. data/lib/fun_ci/agent/digest.rb +49 -0
  9. data/lib/fun_ci/agent/events.rb +47 -0
  10. data/lib/fun_ci/agent/events_command.rb +61 -0
  11. data/lib/fun_ci/agent/evidence_text.rb +46 -0
  12. data/lib/fun_ci/agent/exit_code.rb +11 -0
  13. data/lib/fun_ci/agent/git.rb +32 -0
  14. data/lib/fun_ci/agent/live_pipeline.rb +35 -0
  15. data/lib/fun_ci/agent/options.rb +75 -0
  16. data/lib/fun_ci/agent/output.rb +81 -0
  17. data/lib/fun_ci/agent/report_stage.rb +71 -0
  18. data/lib/fun_ci/agent/reports.rb +47 -0
  19. data/lib/fun_ci/agent/run_report.rb +30 -0
  20. data/lib/fun_ci/agent/runs_command.rb +34 -0
  21. data/lib/fun_ci/agent/runs_text.rb +27 -0
  22. data/lib/fun_ci/agent/snapshots.rb +39 -0
  23. data/lib/fun_ci/agent/stage_summary.rb +30 -0
  24. data/lib/fun_ci/agent/status_command.rb +36 -0
  25. data/lib/fun_ci/agent/status_json.rb +27 -0
  26. data/lib/fun_ci/agent/status_text.rb +37 -0
  27. data/lib/fun_ci/agent/system_clock.rb +11 -0
  28. data/lib/fun_ci/agent/verdict.rb +32 -0
  29. data/lib/fun_ci/agent/wait_command.rb +71 -0
  30. data/lib/fun_ci/agent/waiting.rb +32 -0
  31. data/lib/fun_ci/agent/why_command.rb +50 -0
  32. data/lib/fun_ci/agent/why_json.rb +35 -0
  33. data/lib/fun_ci/agent/why_text.rb +43 -0
  34. data/lib/fun_ci/cli.rb +72 -94
  35. data/lib/fun_ci/cli_help.rb +65 -0
  36. data/lib/fun_ci/console/board_data.rb +66 -0
  37. data/lib/fun_ci/console/board_heartbeat.rb +40 -0
  38. data/lib/fun_ci/console/console_events.rb +20 -0
  39. data/lib/fun_ci/console/console_log.rb +26 -0
  40. data/lib/fun_ci/console/console_loop.rb +41 -0
  41. data/lib/fun_ci/console/console_session.rb +82 -0
  42. data/lib/fun_ci/console/console_state.rb +42 -0
  43. data/lib/fun_ci/console/key_handler.rb +73 -0
  44. data/lib/fun_ci/console/launcher.rb +43 -0
  45. data/lib/fun_ci/console/milestone_events.rb +38 -0
  46. data/lib/fun_ci/console/milestones.rb +25 -0
  47. data/lib/fun_ci/console/renderer_lookup.rb +51 -0
  48. data/lib/fun_ci/console/renderer_process.rb +60 -0
  49. data/lib/fun_ci/console/run_message.rb +33 -0
  50. data/lib/fun_ci/console/stage_change_detector.rb +32 -0
  51. data/lib/fun_ci/console/stage_events.rb +31 -0
  52. data/lib/fun_ci/console/stop_report.rb +39 -0
  53. data/lib/fun_ci/console/streak_counter.rb +19 -0
  54. data/lib/fun_ci/console/view.rb +47 -0
  55. data/lib/fun_ci/evidence/about.rb +12 -0
  56. data/lib/fun_ci/evidence/about_stage.rb +29 -0
  57. data/lib/fun_ci/evidence/caps.rb +77 -0
  58. data/lib/fun_ci/evidence/catalog.rb +83 -0
  59. data/lib/fun_ci/evidence/collector.rb +95 -0
  60. data/lib/fun_ci/evidence/command_output.rb +45 -0
  61. data/lib/fun_ci/evidence/command_reading.rb +38 -0
  62. data/lib/fun_ci/evidence/command_runner.rb +75 -0
  63. data/lib/fun_ci/evidence/context.rb +21 -0
  64. data/lib/fun_ci/evidence/context_document.rb +29 -0
  65. data/lib/fun_ci/evidence/deadline.rb +15 -0
  66. data/lib/fun_ci/evidence/detection.rb +82 -0
  67. data/lib/fun_ci/evidence/document.rb +59 -0
  68. data/lib/fun_ci/evidence/extract_command.rb +83 -0
  69. data/lib/fun_ci/evidence/extract_options.rb +45 -0
  70. data/lib/fun_ci/evidence/extraction.rb +54 -0
  71. data/lib/fun_ci/evidence/extractors/command.rb +52 -0
  72. data/lib/fun_ci/evidence/extractors/grep.rb +49 -0
  73. data/lib/fun_ci/evidence/extractors/json_log.rb +45 -0
  74. data/lib/fun_ci/evidence/extractors/junit_files.rb +32 -0
  75. data/lib/fun_ci/evidence/extractors/last_lines.rb +25 -0
  76. data/lib/fun_ci/evidence/extractors/log_file.rb +62 -0
  77. data/lib/fun_ci/evidence/extractors/process_tree.rb +51 -0
  78. data/lib/fun_ci/evidence/extractors/section.rb +49 -0
  79. data/lib/fun_ci/evidence/findings.rb +14 -0
  80. data/lib/fun_ci/evidence/line_ranges.rb +21 -0
  81. data/lib/fun_ci/evidence/line_scan.rb +22 -0
  82. data/lib/fun_ci/evidence/log_record.rb +58 -0
  83. data/lib/fun_ci/evidence/masking.rb +55 -0
  84. data/lib/fun_ci/evidence/option_check.rb +53 -0
  85. data/lib/fun_ci/evidence/outcome.rb +15 -0
  86. data/lib/fun_ci/evidence/patterns.rb +22 -0
  87. data/lib/fun_ci/evidence/presets/README.md +7 -0
  88. data/lib/fun_ci/evidence/presets/bun-test.yml +6 -0
  89. data/lib/fun_ci/evidence/presets/cargo-test.yml +6 -0
  90. data/lib/fun_ci/evidence/presets/dart-test.yml +6 -0
  91. data/lib/fun_ci/evidence/presets/deno-test.yml +6 -0
  92. data/lib/fun_ci/evidence/presets/dotnet-test.yml +6 -0
  93. data/lib/fun_ci/evidence/presets/ecs.yml +3 -0
  94. data/lib/fun_ci/evidence/presets/eslint.yml +6 -0
  95. data/lib/fun_ci/evidence/presets/exunit.yml +6 -0
  96. data/lib/fun_ci/evidence/presets/gcc.yml +6 -0
  97. data/lib/fun_ci/evidence/presets/go-build.yml +5 -0
  98. data/lib/fun_ci/evidence/presets/go-test.yml +6 -0
  99. data/lib/fun_ci/evidence/presets/gradle.yml +6 -0
  100. data/lib/fun_ci/evidence/presets/gtest.yml +6 -0
  101. data/lib/fun_ci/evidence/presets/jest.yml +6 -0
  102. data/lib/fun_ci/evidence/presets/logstash.yml +3 -0
  103. data/lib/fun_ci/evidence/presets/maven.yml +6 -0
  104. data/lib/fun_ci/evidence/presets/minitest.yml +6 -0
  105. data/lib/fun_ci/evidence/presets/mocha.yml +6 -0
  106. data/lib/fun_ci/evidence/presets/mypy.yml +6 -0
  107. data/lib/fun_ci/evidence/presets/node-test.yml +6 -0
  108. data/lib/fun_ci/evidence/presets/phpunit.yml +6 -0
  109. data/lib/fun_ci/evidence/presets/pino.yml +5 -0
  110. data/lib/fun_ci/evidence/presets/prove.yml +6 -0
  111. data/lib/fun_ci/evidence/presets/pytest.yml +6 -0
  112. data/lib/fun_ci/evidence/presets/rspec.yml +6 -0
  113. data/lib/fun_ci/evidence/presets/rubocop.yml +6 -0
  114. data/lib/fun_ci/evidence/presets/ruff.yml +6 -0
  115. data/lib/fun_ci/evidence/presets/rustc.yml +6 -0
  116. data/lib/fun_ci/evidence/presets/shellcheck.yml +5 -0
  117. data/lib/fun_ci/evidence/presets/structlog.yml +4 -0
  118. data/lib/fun_ci/evidence/presets/swift-test.yml +5 -0
  119. data/lib/fun_ci/evidence/presets/tsc.yml +6 -0
  120. data/lib/fun_ci/evidence/presets/unittest.yml +6 -0
  121. data/lib/fun_ci/evidence/presets/vitest.yml +6 -0
  122. data/lib/fun_ci/evidence/presets.rb +30 -0
  123. data/lib/fun_ci/evidence/problem.rb +9 -0
  124. data/lib/fun_ci/evidence/process_table.rb +40 -0
  125. data/lib/fun_ci/evidence/saved_run.rb +22 -0
  126. data/lib/fun_ci/evidence/section_walk.rb +49 -0
  127. data/lib/fun_ci/evidence/settings.rb +64 -0
  128. data/lib/fun_ci/evidence/settings_check.rb +78 -0
  129. data/lib/fun_ci/evidence/source.rb +34 -0
  130. data/lib/fun_ci/evidence/sources.rb +21 -0
  131. data/lib/fun_ci/evidence/stage_context.rb +30 -0
  132. data/lib/fun_ci/evidence/stamp.rb +10 -0
  133. data/lib/fun_ci/evidence/start.rb +36 -0
  134. data/lib/fun_ci/evidence/worktree.rb +62 -0
  135. data/lib/fun_ci/persistence/active_runs.rb +69 -0
  136. data/lib/fun_ci/persistence/database.rb +63 -30
  137. data/lib/fun_ci/persistence/null_recorder.rb +25 -0
  138. data/lib/fun_ci/persistence/output_tail.rb +24 -0
  139. data/lib/fun_ci/persistence/pipeline_recorder.rb +78 -32
  140. data/lib/fun_ci/persistence/pipeline_run.rb +26 -17
  141. data/lib/fun_ci/persistence/project_runs.rb +52 -0
  142. data/lib/fun_ci/persistence/raw_outputs.rb +46 -0
  143. data/lib/fun_ci/persistence/retention.rb +25 -0
  144. data/lib/fun_ci/persistence/run_status.rb +31 -0
  145. data/lib/fun_ci/persistence/stage_job.rb +61 -14
  146. data/lib/fun_ci/persistence/state_dir.rb +26 -0
  147. data/lib/fun_ci/persistence/write_trouble.rb +46 -0
  148. data/lib/fun_ci/pipeline/background_fork.rb +42 -0
  149. data/lib/fun_ci/pipeline/command_executor.rb +58 -0
  150. data/lib/fun_ci/pipeline/gate.rb +35 -0
  151. data/lib/fun_ci/pipeline/git_environment.rb +16 -0
  152. data/lib/fun_ci/pipeline/head_part.rb +40 -0
  153. data/lib/fun_ci/pipeline/in_place.rb +17 -0
  154. data/lib/fun_ci/pipeline/output_window.rb +73 -0
  155. data/lib/fun_ci/pipeline/pipeline_forker.rb +18 -16
  156. data/lib/fun_ci/pipeline/process_runner.rb +90 -17
  157. data/lib/fun_ci/pipeline/run_canceller.rb +75 -0
  158. data/lib/fun_ci/pipeline/slot.rb +30 -0
  159. data/lib/fun_ci/pipeline/slot_lock.rb +13 -0
  160. data/lib/fun_ci/pipeline/slot_run.rb +86 -0
  161. data/lib/fun_ci/pipeline/stage_dir.rb +50 -0
  162. data/lib/fun_ci/pipeline/stage_end.rb +70 -0
  163. data/lib/fun_ci/pipeline/stage_execution.rb +67 -0
  164. data/lib/fun_ci/pipeline/stage_runner.rb +42 -65
  165. data/lib/fun_ci/pipeline/stale_pipeline_canceller.rb +16 -33
  166. data/lib/fun_ci/pipeline/tail_segments.rb +60 -0
  167. data/lib/fun_ci/pipeline/test_report.rb +48 -0
  168. data/lib/fun_ci/pipeline/trigger.rb +55 -115
  169. data/lib/fun_ci/pipeline/trigger_command.rb +62 -0
  170. data/lib/fun_ci/pipeline/trigger_params.rb +56 -0
  171. data/lib/fun_ci/pipeline/workspaces.rb +22 -0
  172. data/lib/fun_ci/pipeline/worktree_pool.rb +66 -0
  173. data/lib/fun_ci/pipeline/worktree_prune.rb +49 -0
  174. data/lib/fun_ci/pipeline/worktrees.rb +45 -0
  175. data/lib/fun_ci/setup/agent_instructions.rb +31 -0
  176. data/lib/fun_ci/setup/commands.rb +49 -0
  177. data/lib/fun_ci/setup/git_hooks.rb +20 -0
  178. data/lib/fun_ci/setup/hook_script.rb +47 -0
  179. data/lib/fun_ci/setup/hook_writer.rb +13 -31
  180. data/lib/fun_ci/setup/installer.rb +39 -23
  181. data/lib/fun_ci/setup/legacy_hooks.rb +38 -0
  182. data/lib/fun_ci/setup/project_config.rb +43 -17
  183. data/lib/fun_ci/setup/project_detector.rb +39 -7
  184. data/lib/fun_ci/setup/settings.rb +36 -0
  185. data/lib/fun_ci/setup/setup_checker.rb +18 -12
  186. data/lib/fun_ci/setup/stage_templates/javascript.rb +18 -0
  187. data/lib/fun_ci/setup/stage_templates/managed.rb +24 -0
  188. data/lib/fun_ci/setup/stage_templates/native.rb +25 -0
  189. data/lib/fun_ci/setup/stage_templates/scripting.rb +27 -0
  190. data/lib/fun_ci/setup/stage_templates/shell.rb +16 -0
  191. data/lib/fun_ci/setup/stage_templates.rb +25 -0
  192. data/lib/fun_ci/setup/template_writer.rb +11 -36
  193. data/lib/fun_ci/version.rb +1 -1
  194. data/lib/fun_ci.rb +0 -1
  195. metadata +205 -41
  196. data/exe/fun-ci-trigger +0 -19
  197. data/exe/fun-ci-tui +0 -23
  198. data/lib/fun_ci/animations/celebrate.rb +0 -210
  199. data/lib/fun_ci/animations/explosion.rb +0 -138
  200. data/lib/fun_ci/animations/flash.rb +0 -205
  201. data/lib/fun_ci/animations/idle.rb +0 -127
  202. data/lib/fun_ci/animations/leprechauns.rb +0 -240
  203. data/lib/fun_ci/animations/running.rb +0 -129
  204. data/lib/fun_ci/animations/success.rb +0 -281
  205. data/lib/fun_ci/animations/yay.rb +0 -169
  206. data/lib/fun_ci/persistence/state_machine.rb +0 -50
  207. data/lib/fun_ci/pipeline/background_wrapper.rb +0 -27
  208. data/lib/fun_ci/tui/admin_tui.rb +0 -90
  209. data/lib/fun_ci/tui/animation.rb +0 -49
  210. data/lib/fun_ci/tui/animation_compositor.rb +0 -107
  211. data/lib/fun_ci/tui/animation_frames.rb +0 -112
  212. data/lib/fun_ci/tui/animation_library.rb +0 -46
  213. data/lib/fun_ci/tui/animation_renderer.rb +0 -144
  214. data/lib/fun_ci/tui/ansi.rb +0 -34
  215. data/lib/fun_ci/tui/board_data.rb +0 -53
  216. data/lib/fun_ci/tui/board_renderer.rb +0 -105
  217. data/lib/fun_ci/tui/duration_formatter.rb +0 -24
  218. data/lib/fun_ci/tui/header_animation_manager.rb +0 -71
  219. data/lib/fun_ci/tui/header_animation_player.rb +0 -45
  220. data/lib/fun_ci/tui/key_handler.rb +0 -86
  221. data/lib/fun_ci/tui/looping_animation_player.rb +0 -45
  222. data/lib/fun_ci/tui/relative_time.rb +0 -22
  223. data/lib/fun_ci/tui/row_formatter.rb +0 -108
  224. data/lib/fun_ci/tui/screen.rb +0 -103
  225. data/lib/fun_ci/tui/spinner.rb +0 -24
  226. data/lib/fun_ci/tui/stage_change_detector.rb +0 -58
  227. data/lib/fun_ci/tui/streak_counter.rb +0 -29
  228. data/lib/fun_ci/tui/terminal_input.rb +0 -69
@@ -1,240 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FunCi
4
- module Animations
5
- module Leprechauns
6
- # Dancing leprechauns with four-leaf clovers
7
- # Run: ruby exe/animation-player animations/leprechauns.rb
8
-
9
- g = "\e[1;32m" # bold green
10
- G = "\e[32m" # green
11
- d = "\e[2;32m" # dim green
12
- y = "\e[1;33m" # bold yellow
13
- Y = "\e[33m" # yellow
14
- b = "\e[38;5;94m" # brown (boots)
15
- s = "\e[38;5;215m" # skin tone
16
- x = "\e[0m" # reset
17
-
18
-
19
- raw_frames = [
20
- # Frame 1 — standing, arms down
21
- [
22
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
23
- "",
24
- " #{g}_____#{x} #{g}_____#{x}",
25
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
26
- " #{g}|_____|#{x} #{g}|_____|#{x}",
27
- " #{s}(o o)#{x} #{s}(o o)#{x}",
28
- " #{s}\\_/#{x} #{s}\\_/#{x}",
29
- " #{g}__|__#{x} #{g}__|__#{x}",
30
- " #{g}| |#{x} #{g}| |#{x}",
31
- " #{g}| |#{x} #{g}| |#{x}",
32
- " #{g}| |#{x} #{g}| |#{x}",
33
- " #{b}_| |_#{x} #{b}_| |_#{x}",
34
- "",
35
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
36
- ],
37
- # (hold)
38
- [
39
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
40
- "",
41
- " #{g}_____#{x} #{g}_____#{x}",
42
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
43
- " #{g}|_____|#{x} #{g}|_____|#{x}",
44
- " #{s}(o o)#{x} #{s}(o o)#{x}",
45
- " #{s}\\_/#{x} #{s}\\_/#{x}",
46
- " #{g}__|__#{x} #{g}__|__#{x}",
47
- " #{g}| |#{x} #{g}| |#{x}",
48
- " #{g}| |#{x} #{g}| |#{x}",
49
- " #{g}| |#{x} #{g}| |#{x}",
50
- " #{b}_| |_#{x} #{b}_| |_#{x}",
51
- "",
52
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
53
- ],
54
- # Frame 2 — arms up, right leg kick
55
- [
56
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
57
- "",
58
- " #{g}_____#{x} #{g}_____#{x}",
59
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
60
- " #{g}|_____|#{x} #{g}|_____|#{x}",
61
- " #{s}(^ ^)#{x} #{s}(^ ^)#{x}",
62
- " #{s}\\_/#{x} #{s}\\_/#{x}",
63
- " #{g}\\__|__|__/#{x} #{g}\\__|__|__/#{x}",
64
- " #{g}| |#{x} #{g}| |#{x}",
65
- " #{g}| |#{x} #{g}| |#{x}",
66
- " #{g}| \\#{x} #{g}| \\#{x}",
67
- " #{b}_| \\#{x} #{b}_| \\#{x}",
68
- "",
69
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
70
- ],
71
- # (hold)
72
- [
73
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
74
- "",
75
- " #{g}_____#{x} #{g}_____#{x}",
76
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
77
- " #{g}|_____|#{x} #{g}|_____|#{x}",
78
- " #{s}(^ ^)#{x} #{s}(^ ^)#{x}",
79
- " #{s}\\_/#{x} #{s}\\_/#{x}",
80
- " #{g}\\__|__|__/#{x} #{g}\\__|__|__/#{x}",
81
- " #{g}| |#{x} #{g}| |#{x}",
82
- " #{g}| |#{x} #{g}| |#{x}",
83
- " #{g}| \\#{x} #{g}| \\#{x}",
84
- " #{b}_| \\#{x} #{b}_| \\#{x}",
85
- "",
86
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
87
- ],
88
- # Frame 3 — arms down, feet together (bounce)
89
- [
90
- "",
91
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
92
- " #{g}_____#{x} #{g}_____#{x}",
93
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
94
- " #{g}|_____|#{x} #{g}|_____|#{x}",
95
- " #{s}(o o)#{x} #{s}(o o)#{x}",
96
- " #{s}\\_/#{x} #{s}\\_/#{x}",
97
- " #{g}__|__#{x} #{g}__|__#{x}",
98
- " #{g}| |#{x} #{g}| |#{x}",
99
- " #{g}| |#{x} #{g}| |#{x}",
100
- " #{g}| |#{x} #{g}| |#{x}",
101
- " #{b}_| |_#{x} #{b}_| |_#{x}",
102
- "",
103
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
104
- ],
105
- # Frame 4 — arms up, left leg kick
106
- [
107
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
108
- "",
109
- " #{g}_____#{x} #{g}_____#{x}",
110
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
111
- " #{g}|_____|#{x} #{g}|_____|#{x}",
112
- " #{s}(^ ^)#{x} #{s}(^ ^)#{x}",
113
- " #{s}\\_/#{x} #{s}\\_/#{x}",
114
- " #{g}\\__|__|__/#{x} #{g}\\__|__|__/#{x}",
115
- " #{g}| |#{x} #{g}| |#{x}",
116
- " #{g}| |#{x} #{g}| |#{x}",
117
- " #{g}/ |#{x} #{g}/ |#{x}",
118
- " #{b}/ |_#{x} #{b}/ |_#{x}",
119
- "",
120
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
121
- ],
122
- # (hold)
123
- [
124
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
125
- "",
126
- " #{g}_____#{x} #{g}_____#{x}",
127
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
128
- " #{g}|_____|#{x} #{g}|_____|#{x}",
129
- " #{s}(^ ^)#{x} #{s}(^ ^)#{x}",
130
- " #{s}\\_/#{x} #{s}\\_/#{x}",
131
- " #{g}\\__|__|__/#{x} #{g}\\__|__|__/#{x}",
132
- " #{g}| |#{x} #{g}| |#{x}",
133
- " #{g}| |#{x} #{g}| |#{x}",
134
- " #{g}/ |#{x} #{g}/ |#{x}",
135
- " #{b}/ |_#{x} #{b}/ |_#{x}",
136
- "",
137
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
138
- ],
139
- # Frame 5 — feet together, arms down (bounce back)
140
- [
141
- "",
142
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
143
- " #{g}_____#{x} #{g}_____#{x}",
144
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
145
- " #{g}|_____|#{x} #{g}|_____|#{x}",
146
- " #{s}(o o)#{x} #{s}(o o)#{x}",
147
- " #{s}\\_/#{x} #{s}\\_/#{x}",
148
- " #{g}__|__#{x} #{g}__|__#{x}",
149
- " #{g}| |#{x} #{g}| |#{x}",
150
- " #{g}| |#{x} #{g}| |#{x}",
151
- " #{g}| |#{x} #{g}| |#{x}",
152
- " #{b}_| |_#{x} #{b}_| |_#{x}",
153
- "",
154
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
155
- ],
156
- # Frame 6 — heel click! both jump, arms wide
157
- [
158
- "",
159
- "",
160
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
161
- " #{g}_____#{x} #{y}*#{x} #{g}_____#{x}",
162
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
163
- " #{g}|_____|#{x} #{g}|_____|#{x}",
164
- " #{s}(> <)#{x} #{s}(> <)#{x}",
165
- " #{s}\\_/#{x} #{s}\\_/#{x}",
166
- " #{g}\\__ | | __/#{x} #{g}\\__ | | __/#{x}",
167
- " #{g}| |#{x} #{g}| |#{x}",
168
- " #{g}\\ _ /#{x} #{g}\\ _ /#{x}",
169
- " #{b}V V#{x} #{b}V V#{x}",
170
- "",
171
- " #{d}~#{g}}}|{{#{d}~#{x} #{y}*#{x} #{d}~#{g}}}|{{#{d}~#{x}",
172
- ],
173
- # (hold)
174
- [
175
- "",
176
- "",
177
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
178
- " #{g}_____#{x} #{y}*#{x} #{g}_____#{x}",
179
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
180
- " #{g}|_____|#{x} #{g}|_____|#{x}",
181
- " #{s}(> <)#{x} #{s}(> <)#{x}",
182
- " #{s}\\_/#{x} #{s}\\_/#{x}",
183
- " #{g}\\__ | | __/#{x} #{g}\\__ | | __/#{x}",
184
- " #{g}| |#{x} #{g}| |#{x}",
185
- " #{g}\\ _ /#{x} #{g}\\ _ /#{x}",
186
- " #{b}V V#{x} #{b}V V#{x}",
187
- "",
188
- " #{d}~#{g}}}|{{#{d}~#{x} #{y}*#{x} #{d}~#{g}}}|{{#{d}~#{x}",
189
- ],
190
- # (hold)
191
- [
192
- "",
193
- "",
194
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
195
- " #{g}_____#{x} #{y}*#{x} #{g}_____#{x}",
196
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
197
- " #{g}|_____|#{x} #{g}|_____|#{x}",
198
- " #{s}(> <)#{x} #{s}(> <)#{x}",
199
- " #{s}\\_/#{x} #{s}\\_/#{x}",
200
- " #{g}\\__ | | __/#{x} #{g}\\__ | | __/#{x}",
201
- " #{g}| |#{x} #{g}| |#{x}",
202
- " #{g}\\ _ /#{x} #{g}\\ _ /#{x}",
203
- " #{b}V V#{x} #{b}V V#{x}",
204
- "",
205
- " #{d}~#{g}}}|{{#{d}~#{x} #{y}*#{x} #{d}~#{g}}}|{{#{d}~#{x}",
206
- ],
207
- # Frame 7 — landing
208
- [
209
- "",
210
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
211
- " #{g}_____#{x} #{g}_____#{x}",
212
- " #{g}|#{y}XXXXX#{g}|#{x} #{g}|#{y}XXXXX#{g}|#{x}",
213
- " #{g}|_____|#{x} #{g}|_____|#{x}",
214
- " #{s}(o o)#{x} #{s}(o o)#{x}",
215
- " #{s}\\_/#{x} #{s}\\_/#{x}",
216
- " #{g}__|__#{x} #{g}__|__#{x}",
217
- " #{g}| |#{x} #{g}| |#{x}",
218
- " #{g}| |#{x} #{g}| |#{x}",
219
- " #{g}| |#{x} #{g}| |#{x}",
220
- " #{b}_| |_#{x} #{b}_| |_#{x}",
221
- "",
222
- " #{d}~#{g}}}|{{#{d}~#{x} #{d}~#{g}}}|{{#{d}~#{x}",
223
- ],
224
- ]
225
-
226
- # Pad lines so all rows in each frame have equal stripped length —
227
- # prevents the player's per-line centering from misaligning the art.
228
- max = raw_frames.flatten.map { |l| l.gsub(/\e\[[0-9;]*m/, "").length }.max
229
- raw_frames.each do |frame|
230
- frame.map! { |l| l + " " * (max - l.gsub(/\e\[[0-9;]*m/, "").length) }
231
- end
232
-
233
- DATA = {
234
- name: "Dancing Leprechauns",
235
- fps: 8,
236
- frames: raw_frames
237
- }.freeze
238
- end
239
- end
240
- end
@@ -1,129 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FunCi
4
- module Animations
5
- module Running
6
- # Rocket cruising through a starfield — exhaust cycles short/medium/long
7
- # Body pipes fixed at cols 20 & 25, nose/tail at 21-24/22-23
8
-
9
- w = "\e[1;37m" # bold white (hull)
10
- c = "\e[1;36m" # bold cyan (window, bright stars)
11
- dc = "\e[36m" # cyan (mid stars)
12
- dm = "\e[2;36m" # dim cyan (far stars)
13
- y = "\e[1;33m" # bold yellow (flame core)
14
- o = "\e[38;5;208m" # orange (flame edge)
15
- r = "\e[2;33m" # dim yellow (flame trail)
16
- x = "\e[0m" # reset
17
-
18
- raw_frames = [
19
- [ # frame 1 — short exhaust
20
- " #{dm}.#{x} #{c}*#{x} #{dm}.#{x}",
21
- " #{c}.#{x} #{dm}.#{x}",
22
- " #{dc}.#{x} #{dm}.#{x}",
23
- "#{dm}.#{x} #{dc}.#{x}",
24
- " #{w}/\\#{x}",
25
- " #{w}/ \\#{x}",
26
- " #{o}~#{x} #{w}| #{c}oo#{w} |#{x} #{c}*#{x}",
27
- " #{y}=#{o}=#{r}=~#{x} #{w}| |====>#{x}",
28
- " #{o}~#{x} #{w}|#{c}FUN!#{w}|#{x}",
29
- " #{w}\\ /#{x}",
30
- " #{w}\\/#{x} #{dm}.#{x}",
31
- " #{dc}.#{x} #{c}.#{x}",
32
- " #{dm}.#{x} #{dc}.#{x}",
33
- " #{dm}.#{x}",
34
- ],
35
- [ # frame 2 — medium exhaust
36
- " #{dm}.#{x} #{c}*#{x} #{dm}.#{x}",
37
- " #{dm}.#{x} #{c}.#{x}",
38
- " #{dc}.#{x} #{dm}.#{x}",
39
- " #{dc}.#{x}",
40
- " #{w}/\\#{x}",
41
- " #{w}/ \\#{x}",
42
- " #{o}~~~#{x} #{w}| #{c}oo#{w} |#{x} #{c}*#{x}",
43
- " #{y}=#{o}==#{r}==~#{x} #{w}| |====>#{x}",
44
- " #{o}~~~#{x} #{w}|#{c}FUN!#{w}|#{x}",
45
- " #{w}\\ /#{x}",
46
- " #{w}\\/#{x} #{dm}.#{x}",
47
- " #{c}.#{x}",
48
- " #{dm}.#{x} #{dc}.#{x}",
49
- "#{dc}.#{x} #{dm}.#{x}",
50
- ],
51
- [ # frame 3 — long exhaust
52
- " #{dm}.#{x} #{c}*#{x} #{dm}.#{x}",
53
- " #{dm}.#{x} #{c}.#{x}",
54
- " #{dc}.#{x} #{dm}.#{x}",
55
- " #{dm}.#{x} #{dc}.#{x}",
56
- " #{w}/\\#{x}",
57
- " #{w}/ \\#{x}",
58
- " #{o}~~~~~#{x} #{w}| #{c}oo#{w} |#{x} #{c}*#{x}",
59
- " #{y}===#{o}==#{r}==~#{x} #{w}| |====>#{x}",
60
- " #{o}~~~~~#{x} #{w}|#{c}FUN!#{w}|#{x}",
61
- " #{w}\\ /#{x}",
62
- " #{w}\\/#{x} #{dm}.#{x}",
63
- " #{c}.#{x}",
64
- " #{dm}.#{x} #{dc}.#{x}",
65
- " #{dm}.#{x}",
66
- ],
67
- [ # frame 4 — short exhaust
68
- "#{dm}.#{x} #{c}*#{x} #{dm}.#{x}",
69
- " #{dm}.#{x} #{c}.#{x}",
70
- " #{dc}.#{x} #{dm}.#{x}",
71
- " #{dm}.#{x} #{dc}.#{x}",
72
- " #{w}/\\#{x}",
73
- " #{w}/ \\#{x}",
74
- " #{o}~#{x} #{w}| #{c}oo#{w} |#{x} #{c}*#{x}",
75
- " #{y}=#{o}=#{r}=~#{x} #{w}| |====>#{x}",
76
- " #{o}~#{x} #{w}|#{c}FUN!#{w}|#{x}",
77
- " #{w}\\ /#{x}",
78
- " #{w}\\/#{x} #{dm}.#{x}",
79
- " #{dm}.#{x} #{c}.#{x}",
80
- "#{dm}.#{x} #{dc}.#{x}",
81
- " #{dm}.#{x}",
82
- ],
83
- [ # frame 5 — medium exhaust
84
- " #{c}*#{x} #{dm}.#{x} #{c}.#{x}",
85
- " #{dm}.#{x} #{dm}.#{x}",
86
- " #{dc}.#{x} #{dm}.#{x}",
87
- " #{dm}.#{x} #{dc}.#{x}",
88
- " #{w}/\\#{x}",
89
- " #{w}/ \\#{x}",
90
- " #{o}~~~#{x} #{w}| #{c}oo#{w} |#{x} #{c}*#{x}",
91
- " #{y}=#{o}==#{r}==~#{x} #{w}| |====>#{x}",
92
- " #{o}~~~#{x} #{w}|#{c}FUN!#{w}|#{x}",
93
- " #{w}\\ /#{x}",
94
- " #{w}\\/#{x} #{dm}.#{x}",
95
- " #{c}.#{x}",
96
- " #{dm}.#{x} #{dc}.#{x}",
97
- " #{dm}.#{x}",
98
- ],
99
- [ # frame 6 — long exhaust
100
- " #{c}*#{x} #{dm}.#{x} #{c}.#{x}",
101
- " #{dm}.#{x} #{dm}.#{x}",
102
- " #{dc}.#{x} #{dm}.#{x}",
103
- " #{dm}.#{x} #{dc}.#{x}",
104
- " #{w}/\\#{x}",
105
- " #{w}/ \\#{x}",
106
- " #{o}~~~~~#{x} #{w}| #{c}oo#{w} |#{x} #{c}*#{x}",
107
- " #{y}===#{o}==#{r}==~#{x} #{w}| |====>#{x}",
108
- " #{o}~~~~~#{x} #{w}|#{c}FUN!#{w}|#{x}",
109
- " #{w}\\ /#{x}",
110
- " #{w}\\/#{x} #{dm}.#{x}",
111
- " #{c}.#{x}",
112
- " #{dm}.#{x} #{dc}.#{x}",
113
- " #{dm}.#{x}",
114
- ],
115
- ]
116
-
117
- max = raw_frames.flatten.map { |l| l.gsub(/\e\[[0-9;]*m/, "").length }.max
118
- raw_frames.each do |frame|
119
- frame.map! { |l| l + " " * (max - l.gsub(/\e\[[0-9;]*m/, "").length) }
120
- end
121
-
122
- DATA = {
123
- name: "Running",
124
- fps: 4,
125
- frames: raw_frames
126
- }.freeze
127
- end
128
- end
129
- end
@@ -1,281 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module FunCi
4
- module Animations
5
- module Success
6
- # Success celebration animation — fireworks bursting with sparkles
7
- # Run: ruby exe/animation-player animations/success.rb
8
-
9
- g = "\e[1;32m" # bold green
10
- G = "\e[32m" # green
11
- y = "\e[1;33m" # bold yellow
12
- Y = "\e[33m" # yellow
13
- w = "\e[1;37m" # bold white
14
- c = "\e[1;36m" # bold cyan
15
- d = "\e[2;32m" # dim green
16
- x = "\e[0m" # reset
17
-
18
- raw_frames = [
19
- # Frame 1 — launch
20
- [
21
- "",
22
- "",
23
- "",
24
- "",
25
- "",
26
- "",
27
- "",
28
- "",
29
- " #{w}|#{x}",
30
- " #{y}*#{x}",
31
- "",
32
- ],
33
- # Frame 2 — rising
34
- [
35
- "",
36
- "",
37
- "",
38
- "",
39
- "",
40
- "",
41
- " #{w}|#{x}",
42
- " #{y}*#{x}",
43
- " #{d}:#{x}",
44
- " #{d}.#{x}",
45
- "",
46
- ],
47
- # Frame 3 — ascending
48
- [
49
- "",
50
- "",
51
- "",
52
- "",
53
- " #{w}|#{x}",
54
- " #{y}*#{x}",
55
- " #{d}:#{x}",
56
- " #{d}.#{x}",
57
- "",
58
- "",
59
- "",
60
- ],
61
- # Frame 4 — about to burst
62
- [
63
- "",
64
- "",
65
- " #{w}*#{x}",
66
- " #{y}|#{x}",
67
- " #{d}:#{x}",
68
- "",
69
- "",
70
- "",
71
- "",
72
- "",
73
- "",
74
- ],
75
- # Frame 5 — small burst
76
- [
77
- "",
78
- " #{y}\\#{x} #{w}|#{x} #{y}/#{x}",
79
- " #{g}*#{y}*#{g}*#{x}",
80
- " #{y}/ #{w}|#{x} #{y}\\#{x}",
81
- "",
82
- "",
83
- "",
84
- "",
85
- "",
86
- "",
87
- "",
88
- ],
89
- # Frame 6 — full firework (hold 2x)
90
- [
91
- " #{c}*#{x} #{y}\\#{x} #{w}|#{x} #{y}/#{x} #{c}*#{x}",
92
- " #{g}*#{x} #{y}*#{x} #{w}*#{x} #{y}*#{x} #{g}*#{x}",
93
- " #{y}--#{x} #{g}*#{y}*#{w}*#{g}*#{y}*#{w} #{g}*#{y}*#{w}*#{g}*#{y}*#{x} #{y}--#{x}",
94
- " #{g}*#{x} #{y}*#{x} #{w}*#{x} #{y}*#{x} #{g}*#{x}",
95
- " #{c}*#{x} #{y}/#{x} #{w}|#{x} #{y}\\#{x} #{c}*#{x}",
96
- "",
97
- "",
98
- "",
99
- "",
100
- "",
101
- "",
102
- ],
103
- [
104
- " #{c}*#{x} #{y}\\#{x} #{w}|#{x} #{y}/#{x} #{c}*#{x}",
105
- " #{g}*#{x} #{y}*#{x} #{w}*#{x} #{y}*#{x} #{g}*#{x}",
106
- " #{y}--#{x} #{g}*#{y}*#{w}*#{g}*#{y}*#{w} #{g}*#{y}*#{w}*#{g}*#{y}*#{x} #{y}--#{x}",
107
- " #{g}*#{x} #{y}*#{x} #{w}*#{x} #{y}*#{x} #{g}*#{x}",
108
- " #{c}*#{x} #{y}/#{x} #{w}|#{x} #{y}\\#{x} #{c}*#{x}",
109
- "",
110
- "",
111
- "",
112
- "",
113
- "",
114
- "",
115
- ],
116
- # Frame 7 — big celebration with sparkles (hold 3x)
117
- [
118
- " #{c}+#{x} #{y}.#{x} #{g}*#{x} #{y}.#{x} #{c}+#{x}",
119
- " #{g}*#{x} #{y}*#{x} #{y}*#{x} #{g}*#{x}",
120
- " #{y}*#{x} #{g}.#{x} #{w}* #{g}P#{w}A#{g}S#{w}S #{g}*#{x} #{g}.#{x} #{y}*#{x}",
121
- " #{g}*#{x} #{y}*#{x} #{y}*#{x} #{g}*#{x}",
122
- " #{c}+#{x} #{y}'#{x} #{g}*#{x} #{y}'#{x} #{c}+#{x}",
123
- " #{d}.#{x} #{d}.#{x}",
124
- " #{d}*#{x} #{d}*#{x}",
125
- "",
126
- "",
127
- "",
128
- "",
129
- ],
130
- [
131
- " #{c}+#{x} #{y}.#{x} #{g}*#{x} #{y}.#{x} #{c}+#{x}",
132
- " #{g}*#{x} #{y}*#{x} #{y}*#{x} #{g}*#{x}",
133
- " #{y}*#{x} #{g}.#{x} #{w}* #{g}P#{w}A#{g}S#{w}S #{g}*#{x} #{g}.#{x} #{y}*#{x}",
134
- " #{g}*#{x} #{y}*#{x} #{y}*#{x} #{g}*#{x}",
135
- " #{c}+#{x} #{y}'#{x} #{g}*#{x} #{y}'#{x} #{c}+#{x}",
136
- " #{d}.#{x} #{d}.#{x}",
137
- " #{d}*#{x} #{d}*#{x}",
138
- "",
139
- "",
140
- "",
141
- "",
142
- ],
143
- [
144
- " #{c}+#{x} #{y}.#{x} #{g}*#{x} #{y}.#{x} #{c}+#{x}",
145
- " #{g}*#{x} #{y}*#{x} #{y}*#{x} #{g}*#{x}",
146
- " #{y}*#{x} #{g}.#{x} #{w}* #{g}P#{w}A#{g}S#{w}S #{g}*#{x} #{g}.#{x} #{y}*#{x}",
147
- " #{g}*#{x} #{y}*#{x} #{y}*#{x} #{g}*#{x}",
148
- " #{c}+#{x} #{y}'#{x} #{g}*#{x} #{y}'#{x} #{c}+#{x}",
149
- " #{d}.#{x} #{d}.#{x}",
150
- " #{d}*#{x} #{d}*#{x}",
151
- "",
152
- "",
153
- "",
154
- "",
155
- ],
156
- # Frame 8 — sparkles raining + second launch
157
- [
158
- " #{d}.#{x} #{c}+#{x} #{g}.#{x} #{y}*#{x} #{g}.#{x} #{c}+#{x} #{d}.#{x}",
159
- " #{y}.#{x} #{d}*#{x} #{y}.#{x}",
160
- " #{g}*#{x} #{d}.#{x} #{g}.#{x} #{d}.#{x} #{g}*#{x}",
161
- " #{d}'#{x} #{d}.#{x} #{d}'#{x}",
162
- " #{c}+#{x} #{d}. .#{x} #{c}+#{x}",
163
- " #{d}. .#{x}",
164
- " #{w}|#{x}",
165
- " #{y}*#{x}",
166
- " #{d}:#{x}",
167
- "",
168
- "",
169
- ],
170
- # Frame 9 — second firework rising + rain
171
- [
172
- " #{d}.#{x} #{d}.#{x}",
173
- " #{d}.#{x} #{d}'#{x} #{d}'#{x} #{d}.#{x}",
174
- " #{d}. . .#{x}",
175
- " #{w}*#{x}",
176
- " #{y}|#{x}",
177
- " #{d}:#{x}",
178
- "",
179
- "",
180
- "",
181
- "",
182
- "",
183
- ],
184
- # Frame 10 — second burst
185
- [
186
- "",
187
- " #{d}.#{x} #{d}.#{x}",
188
- " #{y}\\#{x} #{w}|#{x} #{y}/#{x}",
189
- " #{g}*#{y}*#{g}*#{x}",
190
- " #{y}/ #{w}|#{x} #{y}\\#{x}",
191
- "",
192
- "",
193
- "",
194
- "",
195
- "",
196
- "",
197
- ],
198
- # Frame 11 — second full firework (hold 2x)
199
- [
200
- "",
201
- " #{c}*#{x} #{y}\\#{x} #{w}|#{x} #{y}/#{x} #{c}*#{x}",
202
- " #{g}*#{y}*#{w}*#{y}*#{g}*#{x}",
203
- " #{y}--#{x} #{g}*#{w}*#{g}*#{w}*#{g}*#{x} #{y}--#{x}",
204
- " #{g}*#{y}*#{w}*#{y}*#{g}*#{x}",
205
- " #{c}*#{x} #{y}/#{x} #{w}|#{x} #{y}\\#{x} #{c}*#{x}",
206
- "",
207
- "",
208
- "",
209
- "",
210
- "",
211
- ],
212
- [
213
- "",
214
- " #{c}*#{x} #{y}\\#{x} #{w}|#{x} #{y}/#{x} #{c}*#{x}",
215
- " #{g}*#{y}*#{w}*#{y}*#{g}*#{x}",
216
- " #{y}--#{x} #{g}*#{w}*#{g}*#{w}*#{g}*#{x} #{y}--#{x}",
217
- " #{g}*#{y}*#{w}*#{y}*#{g}*#{x}",
218
- " #{c}*#{x} #{y}/#{x} #{w}|#{x} #{y}\\#{x} #{c}*#{x}",
219
- "",
220
- "",
221
- "",
222
- "",
223
- "",
224
- ],
225
- # Frame 12 — grand finale, both sparkle (hold 3x)
226
- [
227
- " #{c}+#{x} #{y}*#{x} #{g}.#{x} #{g}.#{x} #{y}*#{x} #{c}+#{x} #{g}.#{x}",
228
- " #{g}*#{x} #{y}.#{x} #{d}*#{x} #{d}*#{x} #{y}.#{x} #{g}*#{x} #{y}.#{x}",
229
- " #{y}.#{x} #{w}*#{x} #{g}YES#{x} #{w}*#{x} #{w}*#{x} #{g}YES#{x} #{w}*#{x} #{y}.#{x}",
230
- " #{g}*#{x} #{y}'#{x} #{d}*#{x} #{d}*#{x} #{y}'#{x} #{g}*#{x} #{y}'#{x}",
231
- " #{c}+#{x} #{y}*#{x} #{g}'#{x} #{g}'#{x} #{y}*#{x} #{c}+#{x} #{g}'#{x}",
232
- "#{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x}",
233
- " #{d}*#{x} #{d}*#{x} #{d}*#{x} #{d}*#{x} #{d}*#{x}",
234
- " #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x}",
235
- "",
236
- "",
237
- "",
238
- ],
239
- [
240
- " #{c}+#{x} #{y}*#{x} #{g}.#{x} #{g}.#{x} #{y}*#{x} #{c}+#{x} #{g}.#{x}",
241
- " #{g}*#{x} #{y}.#{x} #{d}*#{x} #{d}*#{x} #{y}.#{x} #{g}*#{x} #{y}.#{x}",
242
- " #{y}.#{x} #{w}*#{x} #{g}YES#{x} #{w}*#{x} #{w}*#{x} #{g}YES#{x} #{w}*#{x} #{y}.#{x}",
243
- " #{g}*#{x} #{y}'#{x} #{d}*#{x} #{d}*#{x} #{y}'#{x} #{g}*#{x} #{y}'#{x}",
244
- " #{c}+#{x} #{y}*#{x} #{g}'#{x} #{g}'#{x} #{y}*#{x} #{c}+#{x} #{g}'#{x}",
245
- "#{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x}",
246
- " #{d}*#{x} #{d}*#{x} #{d}*#{x} #{d}*#{x} #{d}*#{x}",
247
- " #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x}",
248
- "",
249
- "",
250
- "",
251
- ],
252
- [
253
- " #{c}+#{x} #{y}*#{x} #{g}.#{x} #{g}.#{x} #{y}*#{x} #{c}+#{x} #{g}.#{x}",
254
- " #{g}*#{x} #{y}.#{x} #{d}*#{x} #{d}*#{x} #{y}.#{x} #{g}*#{x} #{y}.#{x}",
255
- " #{y}.#{x} #{w}*#{x} #{g}YES#{x} #{w}*#{x} #{w}*#{x} #{g}YES#{x} #{w}*#{x} #{y}.#{x}",
256
- " #{g}*#{x} #{y}'#{x} #{d}*#{x} #{d}*#{x} #{y}'#{x} #{g}*#{x} #{y}'#{x}",
257
- " #{c}+#{x} #{y}*#{x} #{g}'#{x} #{g}'#{x} #{y}*#{x} #{c}+#{x} #{g}'#{x}",
258
- "#{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x}",
259
- " #{d}*#{x} #{d}*#{x} #{d}*#{x} #{d}*#{x} #{d}*#{x}",
260
- " #{d}.#{x} #{d}.#{x} #{d}.#{x} #{d}.#{x}",
261
- "",
262
- "",
263
- "",
264
- ],
265
- ]
266
-
267
- # Pad lines so all rows in each frame have equal stripped length —
268
- # prevents the player's per-line centering from misaligning the art.
269
- max = raw_frames.flatten.map { |l| l.gsub(/\e\[[0-9;]*m/, "").length }.max
270
- raw_frames.each do |frame|
271
- frame.map! { |l| l + " " * (max - l.gsub(/\e\[[0-9;]*m/, "").length) }
272
- end
273
-
274
- DATA = {
275
- name: "Success",
276
- fps: 8,
277
- frames: raw_frames
278
- }.freeze
279
- end
280
- end
281
- end