├── .github ├── FUNDING.yml └── workflows │ ├── ci.yml │ ├── dist.yml │ └── release.yml ├── .gitignore ├── CHANGELOG.md ├── Cargo.lock ├── Cargo.toml ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── RELEASE.md ├── cliff.toml ├── demo ├── theattyr-demo-shaders.gif ├── theattyr-demo1.gif ├── theattyr-demo2.gif └── theattyr-demo3.gif ├── src ├── animation.rs ├── app.rs ├── args.rs ├── event.rs ├── fps.rs ├── lib.rs └── main.rs └── vt100 ├── bambi.vt ├── bambi_godzila ├── barney.vt ├── beer.vt ├── bevis.butthead.vt ├── blinkeyes.vt ├── bomb.vt ├── bugsbunny.vt ├── cartwhee.vt ├── castle.vt ├── cert18.vt ├── cow.vt ├── cowboom.vt ├── crash.vt ├── cursor.vt ├── delay.vt ├── demo.vt ├── dirty.vt ├── dogs.vt ├── dont-wor.vt ├── dontworry.vt ├── duckpaint.vt ├── firework.vt ├── fireworks.vt ├── fishy-fishy.vt ├── fishy.vt ├── fishy2.vt ├── flatmap.vt ├── frogs.vt ├── glass.vt ├── globe.vt ├── hallow.vt ├── hello.vt ├── juanspla.vt ├── july.4.vt ├── jumble.vt ├── maingate.vt ├── mark_twain.vt ├── monkey.vt ├── monorail.vt ├── moon.animation ├── movglobe.vt ├── mr_pumpkin ├── nasa.vt ├── new_year.vt ├── newbeer.vt ├── nifty.vt ├── outerlimits.vt ├── pac3d.vt ├── paradise.vt ├── peace.vt ├── prey.vt ├── prey_col.vt ├── safesex.vt ├── shuttle.vt ├── skyway.vt ├── snowing ├── snowing.vt ├── spinweb.vt ├── sship.vt ├── startrek.vt ├── strike.vt ├── sun.vt ├── surf.vt ├── tetris.vt ├── tomorrw.vt ├── torturet.vt ├── treadmill.vt ├── trek.vt ├── trekvid.vt ├── turkey.vt ├── tv.vt ├── twilight.vt ├── twilightzone.vt ├── valentin.vt ├── valentine.vt ├── van_halen.vt ├── wineglas.vt ├── xmas-00.vt ├── xmas-01.vt ├── xmas-02.vt ├── xmas-03.vt ├── xmas-04.vt ├── xmas-05.vt ├── xmas-06.vt ├── xmas-07.vt ├── xmas-08.vt ├── xmas-09.vt ├── xmas.large ├── xmas.vt ├── xmas2.vt ├── xmasshort.vt └── zorro.vt /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: orhun 2 | patreon: orhunp 3 | buy_me_a_coffee: orhun 4 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | pull_request: 8 | branches: 9 | - main 10 | schedule: 11 | - cron: "0 0 * * 0" 12 | 13 | env: 14 | CARGO_TERM_COLOR: always 15 | 16 | jobs: 17 | build: 18 | name: Build 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: Checkout 22 | uses: actions/checkout@v4 23 | 24 | - name: Install Rust stable 25 | uses: dtolnay/rust-toolchain@stable 26 | 27 | - name: Cache Cargo dependencies 28 | uses: Swatinem/rust-cache@v2 29 | 30 | - name: Build 31 | run: cargo build --locked --verbose 32 | 33 | lint: 34 | name: Lints 35 | runs-on: ubuntu-latest 36 | steps: 37 | - name: Checkout 38 | uses: actions/checkout@v4 39 | 40 | - name: Install Rust stable 41 | uses: dtolnay/rust-toolchain@stable 42 | with: 43 | components: clippy 44 | 45 | - name: Cache Cargo dependencies 46 | uses: Swatinem/rust-cache@v2 47 | 48 | - name: Check lints 49 | run: cargo clippy -- -D warnings 50 | 51 | format: 52 | name: Format 53 | runs-on: ubuntu-latest 54 | needs: build 55 | steps: 56 | - name: Checkout 57 | uses: actions/checkout@v4 58 | 59 | - name: Install Rust stable 60 | uses: dtolnay/rust-toolchain@stable 61 | with: 62 | components: rustfmt 63 | 64 | - name: Check formatting 65 | run: cargo fmt --all -- --check 66 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | tags: 6 | - "v*.*.*" 7 | 8 | jobs: 9 | publish-crates-io: 10 | name: Publish on crates.io 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout the repository 14 | uses: actions/checkout@v4 15 | 16 | - name: Install Rust stable 17 | uses: dtolnay/rust-toolchain@stable 18 | 19 | - name: Publish 20 | run: cargo publish --locked --token ${{ secrets.CARGO_REGISTRY_TOKEN }} 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## 0.1.10 - 2024-10-11 6 | 7 | ### 🎨 Styling 8 | 9 | - *(ui)* Add a simple shader effect via tachyonfx 10 | 11 | ## 0.1.9 - 2024-09-29 12 | 13 | ### 🐛 Bug Fixes 14 | 15 | - *(render)* Handle errors gracefully 16 | 17 | ## 0.1.8 - 2024-09-26 18 | 19 | ### 🎨 Styling 20 | 21 | - *(tui)* Fade the list on scroll 22 | 23 | ## 0.1.7 - 2024-09-24 24 | 25 | ### 🐛 Bug Fixes 26 | 27 | - *(args)* Take file as a positional argument 28 | 29 | ## 0.1.6 - 2024-09-24 30 | 31 | ### 🐛 Bug Fixes 32 | 33 | - *(release)* Remove unnecessary job dependency 34 | 35 | ### 📚 Documentation 36 | 37 | - *(readme)* Update playlist link 38 | - *(readme)* Move installation section to top 39 | - *(readme)* Move installation section 40 | - *(readme)* Add demos and usage 41 | - *(readme)* Add emoji 42 | - *(readme)* Fix admonitions 43 | 44 | ## 0.1.5 - 2024-09-24 45 | 46 | ### 🐛 Bug Fixes 47 | 48 | - *(ci)* Remove publish-github step 49 | 50 | ### 🚜 Refactor 51 | 52 | - *(ci)* Rename jobs and update changelog 53 | 54 | ## 0.1.4 - 2024-09-24 55 | 56 | ### 🚀 Features 57 | 58 | - *(release)* Add a simpler release workflow 59 | - *(args)* Support starting with a file name 60 | - *(args)* Add command-line arguments 61 | 62 | ### 🐛 Bug Fixes 63 | 64 | - *(lint)* Remove unnecessary format 65 | - *(app)* Return error on unknown file 66 | 67 | ### 🚜 Refactor 68 | 69 | - *(ci)* Split jobs 70 | 71 | ### 📚 Documentation 72 | 73 | - *(readme)* Add more context 74 | - *(readme)* Update project details 75 | 76 | ### 🎨 Styling 77 | 78 | - *(fmt)* Fix formatting 79 | - *(app)* Update title 80 | - *(ui)* Update the style 81 | - *(ui)* Tweak the UI 82 | 83 | ## 0.1.3 - 2024-09-12 84 | 85 | ### ⚙️ Miscellaneous Tasks 86 | 87 | - _(release)_ Allow dirty CI builds 88 | 89 | ## 0.1.1 - 2024-09-12 90 | 91 | ### 🐛 Bug Fixes 92 | 93 | - _(release)_ Update cargo-dist's tag pattern 94 | 95 | 96 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "theattyr" 3 | version = "0.1.10" 4 | description = "A terminal theater for playing VT100 art and animations" 5 | authors = ["Orhun Parmaksız "] 6 | license = "MIT OR Apache-2.0" 7 | readme = "README.md" 8 | homepage = "https://github.com/orhun/theattyr" 9 | repository = "https://github.com/orhun/theattyr" 10 | keywords = ["terminal", "vt100", "animation", "rendering"] 11 | categories = ["command-line-utilities"] 12 | edition = "2021" 13 | include = [ 14 | "src/**/*", 15 | "vt100", 16 | "Cargo.*", 17 | "LICENSE*", 18 | "README.md", 19 | "CHANGELOG.md", 20 | ] 21 | 22 | [dependencies] 23 | ratatui = "0.28.1" 24 | tui-term = "0.1.13" 25 | vt100 = "0.15.2" 26 | rust-embed = { version = "8.5.0", features = ["compression", "debug-embed"] } 27 | color-eyre = "0.6.3" 28 | clap = { version = "4.5.17", features = ["derive", "env", "wrap_help", "cargo"] } 29 | tachyonfx = "0.7.0" 30 | 31 | [profile.dev] 32 | opt-level = 0 33 | debug = true 34 | panic = "abort" 35 | 36 | [profile.test] 37 | opt-level = 0 38 | debug = true 39 | 40 | [profile.release] 41 | opt-level = 3 42 | debug = false 43 | panic = "unwind" 44 | lto = true 45 | codegen-units = 1 46 | strip = true 47 | 48 | [profile.bench] 49 | opt-level = 3 50 | debug = false 51 | 52 | [profile.dist] 53 | inherits = "release" 54 | lto = "thin" 55 | 56 | # Config for 'cargo dist' 57 | [workspace.metadata.dist] 58 | # The preferred cargo-dist version to use in CI (Cargo.toml SemVer syntax) 59 | cargo-dist-version = "0.22.0" 60 | # CI backends to support 61 | ci = "github" 62 | # The installers to generate for each app 63 | installers = ["shell", "powershell"] 64 | # Target platforms to build apps for (Rust target-triple syntax) 65 | targets = ["aarch64-apple-darwin", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-unknown-linux-musl", "x86_64-pc-windows-msvc"] 66 | # Path that installers should place binaries in 67 | install-path = "CARGO_HOME" 68 | # Whether to install an updater program 69 | install-updater = false 70 | # Allow dirty CI builds 71 | allow-dirty = ["ci"] 72 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2024 Orhun Parmaksız 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /RELEASE.md: -------------------------------------------------------------------------------- 1 | # Creating a Release 2 | 3 | [GitHub](https://github.com/orhun/binsider/releases) and [crates.io](https://crates.io/crates/binsider/) releases are automated via [GitHub actions](.github/workflows/cd.yml) and triggered by pushing a tag. 4 | 5 | 1. Bump the version in [Cargo.toml](Cargo.toml) according to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 2. Update [Cargo.lock](Cargo.lock) by building the project: `cargo build` 7 | 3. Update [CHANGELOG.md](CHANGELOG.md) by running [`git-cliff`](https://git-cliff.org): `git cliff -u -t v[X.Y.Z] -p CHANGELOG.md` 8 | 4. Commit your changes: `git add -A && git commit -m "chore(release): bump version"` 9 | 5. Pull existing tags: `git fetch --tags` 10 | 6. Create a new tag: `git tag v[X.Y.Z]` 11 | 7. Push the tag: `git push --tags` 12 | 8. Announce the release! 🥳 13 | -------------------------------------------------------------------------------- /cliff.toml: -------------------------------------------------------------------------------- 1 | # git-cliff ~ default configuration file 2 | # https://git-cliff.org/docs/configuration 3 | # 4 | # Lines starting with "#" are comments. 5 | # Configuration options are organized into tables and keys. 6 | # See documentation for more information on available options. 7 | 8 | [changelog] 9 | # template for the changelog header 10 | header = """ 11 | # Changelog\n 12 | All notable changes to this project will be documented in this file.\n 13 | """ 14 | # template for the changelog body 15 | # https://keats.github.io/tera/docs/#introduction 16 | body = """ 17 | {% if version %}\ 18 | ## {{ version | trim_start_matches(pat="v") }} - {{ timestamp | date(format="%Y-%m-%d") }} 19 | {% else %}\ 20 | ## Unreleased 21 | {% endif %}\ 22 | {% for group, commits in commits | group_by(attribute="group") %} 23 | ### {{ group | striptags | trim | upper_first }} 24 | {% for commit in commits %} 25 | - {% if commit.scope %}*({{ commit.scope }})* {% endif %}\ 26 | {% if commit.breaking %}[**breaking**] {% endif %}\ 27 | {{ commit.message | upper_first }}\ 28 | {% endfor %} 29 | {% endfor %}\n 30 | """ 31 | # remove the leading and trailing s 32 | trim = true 33 | 34 | [git] 35 | # parse the commits based on https://www.conventionalcommits.org 36 | conventional_commits = true 37 | # filter out the commits that are not conventional 38 | filter_unconventional = true 39 | # regex for preprocessing the commit messages 40 | # regex for parsing and grouping commits 41 | commit_parsers = [ 42 | { message = "^feat", group = "🚀 Features" }, 43 | { message = "^fix", group = "🐛 Bug Fixes" }, 44 | { message = "^doc", group = "📚 Documentation" }, 45 | { message = "^perf", group = "⚡ Performance" }, 46 | { message = "^refactor", group = "🚜 Refactor" }, 47 | { message = "^style", group = "🎨 Styling" }, 48 | { message = "^test", group = "🧪 Testing" }, 49 | { message = "^chore\\(release\\): prepare for", skip = true }, 50 | { message = "^chore\\(deps.*\\)", skip = true }, 51 | { message = "^chore\\(pr\\)", skip = true }, 52 | { message = "^chore\\(pull\\)", skip = true }, 53 | { message = "^chore|^ci", group = "⚙️ Miscellaneous Tasks" }, 54 | { body = ".*security", group = "🛡️ Security" }, 55 | { message = "^revert", group = "◀️ Revert" }, 56 | ] 57 | # filter out the commits that are not matched by commit parsers 58 | filter_commits = false 59 | # sort the commits inside sections by oldest/newest order 60 | sort_commits = "newest" 61 | -------------------------------------------------------------------------------- /demo/theattyr-demo-shaders.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/demo/theattyr-demo-shaders.gif -------------------------------------------------------------------------------- /demo/theattyr-demo1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/demo/theattyr-demo1.gif -------------------------------------------------------------------------------- /demo/theattyr-demo2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/demo/theattyr-demo2.gif -------------------------------------------------------------------------------- /demo/theattyr-demo3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/demo/theattyr-demo3.gif -------------------------------------------------------------------------------- /src/animation.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | collections::HashMap, 3 | io::{BufRead, BufReader, Cursor}, 4 | sync::OnceLock, 5 | }; 6 | 7 | use ratatui::{buffer::Buffer, layout::Rect, widgets::Widget}; 8 | use rust_embed::Embed; 9 | use tui_term::widget::PseudoTerminal; 10 | use vt100::Parser; 11 | 12 | #[derive(Embed)] 13 | #[folder = "vt100"] 14 | pub struct Animations; 15 | 16 | pub struct Animation { 17 | /// Is the animation rendered? 18 | pub is_rendered: bool, 19 | // Reader for the file. 20 | pub reader: BufReader>>, 21 | /// VT100 parser. 22 | pub parser: Parser, 23 | /// Buffer. 24 | pub buffer: String, 25 | } 26 | 27 | impl Default for Animation { 28 | fn default() -> Self { 29 | Self { 30 | is_rendered: true, 31 | reader: BufReader::new(Cursor::new(Vec::new())), 32 | parser: Parser::default(), 33 | buffer: String::new(), 34 | } 35 | } 36 | } 37 | 38 | impl Widget for &mut Animation { 39 | fn render(self, area: Rect, buf: &mut Buffer) 40 | where 41 | Self: Sized, 42 | { 43 | let mut line_buffer = String::new(); 44 | if let Ok(bytes_read) = self.reader.read_line(&mut line_buffer) { 45 | self.buffer += &line_buffer; 46 | self.parser.process(self.buffer.as_bytes()); 47 | let pseudo_term = PseudoTerminal::new(self.parser.screen()); 48 | pseudo_term.render(area, buf); 49 | if bytes_read == 0 { 50 | self.is_rendered = true; 51 | } 52 | } 53 | } 54 | } 55 | 56 | pub fn descriptions() -> &'static HashMap<&'static str, &'static str> { 57 | static MEM: OnceLock> = OnceLock::new(); 58 | MEM.get_or_init(|| { 59 | let mut m = HashMap::new(); 60 | m.insert("bambi.vt", "Bambi vs. Godzilla"); 61 | m.insert("bambi_godzila", "Bambi Versus Godzilla, from Dave Brett"); 62 | m.insert("barney.vt", "Barney Being Crushed by a Rock"); 63 | m.insert("beer.vt", "Time for a Beer Break, Folks!"); 64 | m.insert("bevis.butthead.vt", "Beavis and Butthead"); 65 | m.insert("blinkeyes.vt", "Blinking Eyes"); 66 | m.insert("bomb.vt", "The Bomb Test"); 67 | m.insert("bugsbunny.vt", "Bugs Bunny: That's All, Folks"); 68 | m.insert("cartwhee.vt", "Doing a Cartwheel"); 69 | m.insert("castle.vt", "Disney's Fantasy in the Sky, by Don Bertino"); 70 | m.insert("cert18.vt", "Make Money Fast: The Revenge, by GtB (1993)"); 71 | m.insert("cow.vt", "Exploding Cow, Hauled off by U-Mass Food Service"); 72 | m.insert("cowboom.vt", "Cow Explodes, Gets Hauled Off"); 73 | m.insert("crash.vt", "Shuttle Blows Up"); 74 | m.insert("cursor.vt", "Cursor Control Examples in VT100"); 75 | m.insert("delay.vt", "A Small Delay"); 76 | m.insert("demo.vt", "Alan's Impressive Demonstration"); 77 | m.insert("dirty.vt", "Someone Having an Awful Amount of Fun"); 78 | m.insert("dogs.vt", "Fucking Dogs"); 79 | m.insert( 80 | "dont-wor.vt", 81 | "George Custer's Last Stand: Don't Worry, be Happy", 82 | ); 83 | m.insert( 84 | "dontworry.vt", 85 | "Man Being Shot with Arrows: Don't Worry, Be Happy", 86 | ); 87 | m.insert("duckpaint.vt", "Duck Painting"); 88 | m.insert("firework.vt", "Fireworks by Chen Lin"); 89 | m.insert("fireworks.vt", "Guy Setting Off Fireworks"); 90 | m.insert("fishy-fishy.vt", "3-D Fishy Fishy"); 91 | m.insert("fishy.vt", "Fish Swiming By, Glug Glug"); 92 | m.insert("fishy2.vt", "Shamus the Fish by David Rybolt (1994)"); 93 | m.insert("flatmap.vt", "Shifting Flat World Map"); 94 | m.insert("frogs.vt", "Hopping Frog"); 95 | m.insert("glass.vt", "Filling Glass of Liquid"); 96 | m.insert("globe.vt", "ABSOLUTELY EXCELLENT Spinning Globe"); 97 | m.insert("hallow.vt", "Happy Halloween"); 98 | m.insert("hello.vt", "HELLO!"); 99 | m.insert("juanspla.vt", "Plan File in the Form of a Typewriter"); 100 | m.insert("july.4.vt", "July 4th Animation"); 101 | m.insert("jumble.vt", "Now Is the Time for All Good Men"); 102 | m.insert("maingate.vt", "The Disneyland Main Gate, by Don Bertino"); 103 | m.insert("mark_twain.vt", "The Mark Twain Ferry, by Don Bertino"); 104 | m.insert("monkey.vt", "The Monkey Gives You The Finger"); 105 | m.insert("monorail.vt", "Disneyland's Monorail, by Don Bertino"); 106 | m.insert("moon.animation", "Winking Moon Says Good Evening"); 107 | m.insert("movglobe.vt", "Incredible Spinning, Moving Globe"); 108 | m.insert("mr_pumpkin", "Happy Halloween Pumpkin by Mike Kamlet"); 109 | m.insert("nasa.vt", "NASA: Keep Reaching for the Stars, by A.J.L."); 110 | m.insert("new_year.vt", "Happy New Year to You"); 111 | m.insert("newbeer.vt", "Working on a VT100"); 112 | m.insert("nifty.vt", "Small Animated Word NIFTY"); 113 | m.insert("outerlimits.vt", "The Outer Limits"); 114 | m.insert("pac3d.vt", "Pac Man in 3-D Chomping a Ghost"); 115 | m.insert("paradise.vt", "A Bomb in Paradise by Gonad the Barbarian"); 116 | m.insert("peace.vt", "Imagine World Peace by John G. Poupore"); 117 | m.insert("prey.vt", "Klingon Bird of Prey"); 118 | m.insert("prey_col.vt", "Klingon Bird of Prey"); 119 | m.insert("safesex.vt", "Safe Sex (Literally)"); 120 | m.insert("shuttle.vt", "Technology, Who Needs It"); 121 | m.insert("skyway.vt", "Disneyland's Skyway, by Don Bertino"); 122 | m.insert("snowing", "Merry Christmas from Woodrow"); 123 | m.insert("snowing.vt", "Tis the Season: Merry Christmas"); 124 | m.insert("spinweb.vt", "Spinning Web by R.L. Samuell (April 6, 1994)"); 125 | m.insert("sship.vt", "Space Ship Warps and Fires"); 126 | m.insert( 127 | "startrek.vt", 128 | "Star Trek Enterprise Blows up Politically Correct New Enterprise", 129 | ); 130 | m.insert("strike.vt", "Bowling a Strike"); 131 | m.insert("sun.vt", "A Happy Sun"); 132 | m.insert("surf.vt", "Surfing Wave (In 3-D)"); 133 | m.insert("tetris.vt", "Tetris Game"); 134 | m.insert("tomorrw.vt", "Disneyland's Tomorrowland, by Don Bertino"); 135 | m.insert( 136 | "torturet.vt", 137 | "VT100 FONT: The VT-100 Torture Test by Joe Smith (May 8, 1985)", 138 | ); 139 | m.insert("treadmill.vt", "The Treadmill, by GtB Productions (1993)"); 140 | m.insert("trek.vt", "The Enterprise Blows up an RCA Satellite"); 141 | m.insert("trekvid.vt", "Politically Incorrect Star Trek"); 142 | m.insert("turkey.vt", "Happy Thanksgiving"); 143 | m.insert("tv.vt", "The Outer Limits Television Show"); 144 | m.insert("twilight.vt", "The Twilight Zone"); 145 | m.insert("twilightzone.vt", "Twilight Zone Opener"); 146 | m.insert("valentin.vt", "Happy Valentine's Day, Beth and Dave"); 147 | m.insert("valentine.vt", "Happy Valentine's Day, Jane and Chris"); 148 | m.insert("van_halen.vt", "Van Halen's Song 5150, Animated"); 149 | m.insert("wineglas.vt", "Wine Glass Filling"); 150 | m.insert( 151 | "xmas-00.vt", 152 | "Santa Holds Moving Sign: Merry Christmas, Happy New Year", 153 | ); 154 | m.insert("xmas-01.vt", "Merry Christmas"); 155 | m.insert("xmas-02.vt", "Bird Flies By, Tree Grows, Merry Christmas"); 156 | m.insert("xmas-03.vt", "Merry Christmas (Tree, Train, Presents)"); 157 | m.insert( 158 | "xmas-04.vt", 159 | "Merry Christmas, Champagne Glass Filling, Jack-in-the-Box", 160 | ); 161 | m.insert( 162 | "xmas-05.vt", 163 | "Happy Holidays, Starry Night, Christmas Tree, by Peter", 164 | ); 165 | m.insert("xmas-06.vt", "Merry Christmas: Hearth and Tree"); 166 | m.insert("xmas-07.vt", "A Christmas Card: Merry Christmas, from MIS"); 167 | m.insert("xmas-08.vt", "Christmas Eve, 1992 (1992)"); 168 | m.insert("xmas-09.vt", "Merry Christmas: Reindeer Land on Roof"); 169 | m.insert("xmas.large", "Compilation of Several Christmas Animations"); 170 | m.insert("xmas.vt", "Merry Christmas"); 171 | m.insert("xmas2.vt", "Large Collection of Christmas Animations"); 172 | m.insert("xmasshort.vt", "Merry Christmas, Tree, Train, Present"); 173 | m.insert("zorro.vt", "The Story of Zorro by Cian O'Kiersey"); 174 | m 175 | }) 176 | } 177 | -------------------------------------------------------------------------------- /src/app.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | io::{BufReader, Cursor}, 3 | time::{Duration, Instant}, 4 | }; 5 | use tachyonfx::{ 6 | fx::{self}, 7 | Duration as FxDuration, Effect, EffectRenderer, Interpolation, Shader, 8 | }; 9 | use vt100::Parser; 10 | 11 | use crate::{ 12 | animation::{descriptions, Animation, Animations}, 13 | event::{handle_key_events, Event, EventHandler}, 14 | fps::Fps, 15 | Args, 16 | }; 17 | use color_eyre::Result; 18 | use ratatui::{ 19 | layout::{Alignment, Constraint, Direction, Layout, Margin, Rect}, 20 | style::{Color, Style, Stylize}, 21 | text::{Line, ToLine}, 22 | widgets::{ 23 | block::{Position, Title}, 24 | Block, List, ListState, Scrollbar, ScrollbarOrientation, ScrollbarState, 25 | }, 26 | DefaultTerminal, Frame, 27 | }; 28 | 29 | pub struct App { 30 | /// Arguments. 31 | pub args: Args, 32 | /// Is the application running? 33 | pub is_running: bool, 34 | /// Is the UI toggled? 35 | pub is_toggled: bool, 36 | /// Event handler. 37 | pub event_handler: EventHandler, 38 | /// List state. 39 | pub list_state: ListState, 40 | /// Animations. 41 | pub animations: Vec, 42 | /// Animation widget. 43 | pub animation: Animation, 44 | /// Animation area. 45 | pub animation_area: Rect, 46 | /// Frame interval for stable FPS. 47 | pub frame_interval: Duration, 48 | /// FPS counter widget. 49 | pub fps: Fps, 50 | /// Terminal effect. 51 | pub effect: Effect, 52 | } 53 | 54 | impl App { 55 | /// Construct a new instance of [`App`]. 56 | pub fn new(event_handler: EventHandler, args: Args) -> Self { 57 | let effect = fx::coalesce((800, Interpolation::SineOut)); 58 | Self { 59 | is_running: true, 60 | is_toggled: true, 61 | event_handler, 62 | list_state: ListState::default().with_selected(Some(0)), 63 | animations: Animations::iter().map(|a| a.to_string()).collect(), 64 | animation: Animation::default(), 65 | animation_area: Rect::default(), 66 | frame_interval: Duration::from_secs_f32(1.0 / args.fps), 67 | fps: Fps::default(), 68 | effect, 69 | args, 70 | } 71 | } 72 | 73 | /// Run the application's main loop. 74 | pub fn run(mut self, mut terminal: DefaultTerminal) -> Result<()> { 75 | let mut accumulator = Duration::new(0, 0); 76 | let mut last_tick = Instant::now(); 77 | let list_width = self 78 | .animations 79 | .iter() 80 | .map(|a| a.len()) 81 | .max() 82 | .unwrap_or_default(); 83 | if let Some(position) = self 84 | .args 85 | .file 86 | .as_ref() 87 | .and_then(|file| self.animations.iter().position(|anim| file == anim)) 88 | { 89 | self.is_toggled = false; 90 | self.list_state.select(Some(position)); 91 | } else if self.args.file.is_some() { 92 | color_eyre::eyre::bail!("unknown file, please select one of {:?}", self.animations) 93 | } 94 | while self.is_running { 95 | terminal.draw(|frame| self.draw(frame, list_width))?; 96 | let event = self.event_handler.next()?; 97 | match event { 98 | Event::Tick => { 99 | self.fps.tick(); 100 | accumulator += last_tick.elapsed(); 101 | while accumulator >= self.frame_interval { 102 | if !self.animation.is_rendered { 103 | self.event_handler.sender.send(Event::Tick)?; 104 | } 105 | accumulator -= self.frame_interval; 106 | } 107 | last_tick = Instant::now(); 108 | } 109 | Event::Key(key_event) => handle_key_events(key_event, &mut self)?, 110 | Event::Mouse(_) => {} 111 | Event::Resize(_, _) => { 112 | self.animation 113 | .parser 114 | .set_size(self.animation_area.height, self.animation_area.width); 115 | } 116 | } 117 | } 118 | Ok(()) 119 | } 120 | 121 | /// Renders the user interface. 122 | fn draw(&mut self, frame: &mut Frame, list_width: usize) { 123 | let area = Layout::new( 124 | Direction::Horizontal, 125 | [ 126 | Constraint::Min((list_width as u16 + 5) * self.is_toggled as u16), 127 | Constraint::Percentage(100), 128 | ], 129 | ) 130 | .split(frame.area()); 131 | 132 | let mut lines = Vec::new(); 133 | let selected = self.list_state.selected().unwrap_or_default(); 134 | for (i, animation) in self.animations.iter().enumerate() { 135 | let distance = (i as isize - selected as isize).abs() as f64; 136 | let adjusted_brightness = (100. - distance * 2.).max(30.); 137 | let color = Color::from_hsl(0.0, 0.0, adjusted_brightness); 138 | let line = animation.to_line().style(Style::default().fg(color)); 139 | lines.push(line); 140 | } 141 | 142 | frame.render_stateful_widget( 143 | List::new(lines) 144 | .block( 145 | Block::bordered() 146 | .border_style(Style::default().fg(Color::Rgb(100, 100, 100))) 147 | .title( 148 | "VT100 Animations" 149 | .fg(Color::Reset) 150 | .bold() 151 | .underlined() 152 | .into_centered_line(), 153 | ), 154 | ) 155 | .highlight_style(if self.animation.is_rendered { 156 | Style::default().fg(Color::Magenta).slow_blink() 157 | } else { 158 | Style::default().fg(Color::Green) 159 | }) 160 | .highlight_symbol("➤ "), 161 | area[0], 162 | &mut self.list_state, 163 | ); 164 | if self.is_toggled { 165 | let scrollbar = Scrollbar::new(ScrollbarOrientation::VerticalRight) 166 | .begin_symbol(Some("↑")) 167 | .end_symbol(Some("↓")); 168 | let mut scrollbar_state = ScrollbarState::new(self.animations.len()) 169 | .position(self.list_state.selected().unwrap_or_default()); 170 | frame.render_stateful_widget( 171 | scrollbar, 172 | area[0].inner(Margin { 173 | vertical: 1, 174 | horizontal: 0, 175 | }), 176 | &mut scrollbar_state, 177 | ); 178 | } 179 | let mut block = Block::bordered() 180 | .border_style(Style::default().fg(Color::Rgb(100, 100, 100))) 181 | .title(Title::from( 182 | "theaTTYr 🎥" 183 | .to_string() 184 | .fg(Color::Reset) 185 | .bold() 186 | .into_centered_line(), 187 | )) 188 | .title( 189 | Title::from(Line::from(vec![ 190 | "|".into(), 191 | self.list_state 192 | .selected() 193 | .map(|i| self.animations[i].clone()) 194 | .unwrap_or_default() 195 | .fg(Color::Reset) 196 | .bold(), 197 | ": ".into(), 198 | self.list_state 199 | .selected() 200 | .and_then(|i| { 201 | descriptions() 202 | .get(self.animations[i].as_str()) 203 | .map(|v| v.to_string()) 204 | }) 205 | .unwrap_or_default() 206 | .fg(Color::Reset) 207 | .italic(), 208 | "|".into(), 209 | ])) 210 | .alignment(Alignment::Left) 211 | .position(Position::Bottom), 212 | ); 213 | 214 | self.animation_area = area[1].inner(Margin { 215 | vertical: 1, 216 | horizontal: 1, 217 | }); 218 | 219 | if !self.animation.is_rendered { 220 | block = block.title( 221 | Title::from(Line::from(vec![ 222 | "|".into(), 223 | "fps".italic(), 224 | ": ".into(), 225 | self.fps.to_string().into(), 226 | "|".into(), 227 | ])) 228 | .alignment(Alignment::Right) 229 | .position(Position::Top), 230 | ); 231 | } 232 | 233 | frame.render_widget(block, area[1]); 234 | frame.render_widget(&mut self.animation, self.animation_area); 235 | frame.render_effect( 236 | &mut self.effect, 237 | self.animation_area, 238 | FxDuration::from_millis(100), 239 | ); 240 | } 241 | 242 | pub fn start_animation(&mut self) { 243 | let selected = self.list_state.selected().unwrap_or_default(); 244 | let data = Animations::get(&self.animations[selected].clone()) 245 | .expect("no animation found") 246 | .data 247 | .into_owned(); 248 | self.animation = Animation { 249 | is_rendered: false, 250 | reader: BufReader::new(Cursor::new(data)), 251 | parser: Parser::new(self.animation_area.height, self.animation_area.width, 0), 252 | buffer: String::new(), 253 | }; 254 | self.effect.reset(); 255 | } 256 | } 257 | -------------------------------------------------------------------------------- /src/args.rs: -------------------------------------------------------------------------------- 1 | pub use clap::Parser; 2 | 3 | /// Argument parser powered by [`clap`]. 4 | #[derive(Clone, Debug, Default, Parser)] 5 | #[clap( 6 | version, 7 | author = clap::crate_authors!("\n"), 8 | about, 9 | rename_all_env = "screaming-snake", 10 | help_template = "\ 11 | {before-help}{name} {version} 12 | {author-with-newline}{about-with-newline} 13 | {usage-heading} 14 | {usage} 15 | 16 | {all-args}{after-help} 17 | ", 18 | )] 19 | pub struct Args { 20 | /// Play a specific file. 21 | pub file: Option, 22 | 23 | /// Terminal tick rate. 24 | #[arg(env, short, long, value_name = "MS", default_value = "100")] 25 | pub tick_rate: u64, 26 | 27 | /// Target FPS value. 28 | #[arg(env, short, long, default_value = "60.0")] 29 | pub fps: f32, 30 | } 31 | 32 | #[cfg(test)] 33 | mod tests { 34 | use super::*; 35 | use clap::CommandFactory; 36 | #[test] 37 | fn test_args() { 38 | Args::command().debug_assert(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/event.rs: -------------------------------------------------------------------------------- 1 | use crate::app::App; 2 | use color_eyre::Result; 3 | use ratatui::crossterm::event::{ 4 | self, Event as CrosstermEvent, KeyCode, KeyEvent, KeyEventKind, KeyModifiers, MouseEvent, 5 | }; 6 | use std::sync::mpsc; 7 | use std::thread; 8 | use std::time::{Duration, Instant}; 9 | 10 | /// Terminal events. 11 | #[derive(Clone, Debug, PartialEq)] 12 | pub enum Event { 13 | /// Terminal tick. 14 | Tick, 15 | /// Key press. 16 | Key(KeyEvent), 17 | /// Mouse click/scroll. 18 | Mouse(MouseEvent), 19 | /// Terminal resize. 20 | Resize(u16, u16), 21 | } 22 | 23 | /// Terminal event handler. 24 | #[allow(dead_code)] 25 | #[derive(Debug)] 26 | pub struct EventHandler { 27 | /// Tick rate. 28 | pub tick_rate: Duration, 29 | /// Event sender channel. 30 | pub sender: mpsc::Sender, 31 | /// Event receiver channel. 32 | receiver: mpsc::Receiver, 33 | /// Event handler thread. 34 | handler: thread::JoinHandle<()>, 35 | } 36 | 37 | impl EventHandler { 38 | /// Constructs a new instance of [`EventHandler`]. 39 | pub fn new(tick_rate: u64) -> Self { 40 | let tick_rate = Duration::from_millis(tick_rate); 41 | let (sender, receiver) = mpsc::channel(); 42 | let handler = { 43 | let sender = sender.clone(); 44 | thread::spawn(move || { 45 | let mut last_tick = Instant::now(); 46 | loop { 47 | let timeout = tick_rate 48 | .checked_sub(last_tick.elapsed()) 49 | .unwrap_or(tick_rate); 50 | if event::poll(timeout).expect("failed to poll new events") { 51 | match event::read().expect("unable to read event") { 52 | CrosstermEvent::Key(e) => { 53 | if e.kind == KeyEventKind::Press { 54 | sender.send(Event::Key(e)) 55 | } else { 56 | Ok(()) 57 | } 58 | } 59 | CrosstermEvent::Mouse(e) => sender.send(Event::Mouse(e)), 60 | CrosstermEvent::Resize(w, h) => sender.send(Event::Resize(w, h)), 61 | CrosstermEvent::FocusGained => Ok(()), 62 | CrosstermEvent::FocusLost => Ok(()), 63 | CrosstermEvent::Paste(_) => unimplemented!(), 64 | } 65 | .expect("failed to send terminal event") 66 | } 67 | 68 | if last_tick.elapsed() >= tick_rate { 69 | sender.send(Event::Tick).expect("failed to send tick event"); 70 | last_tick = Instant::now(); 71 | } 72 | } 73 | }) 74 | }; 75 | Self { 76 | tick_rate, 77 | sender, 78 | receiver, 79 | handler, 80 | } 81 | } 82 | 83 | /// Receive the next event from the handler thread. 84 | /// 85 | /// This function will always block the current thread if 86 | /// there is no data available and it's possible for more data to be sent. 87 | pub fn next(&self) -> Result { 88 | Ok(self.receiver.recv()?) 89 | } 90 | } 91 | 92 | /// Handles the key events and updates the application state. 93 | pub fn handle_key_events(key: KeyEvent, app: &mut App) -> Result<()> { 94 | match (key.modifiers, key.code) { 95 | (_, KeyCode::Esc | KeyCode::Char('q')) 96 | | (KeyModifiers::CONTROL, KeyCode::Char('c') | KeyCode::Char('C')) => { 97 | app.is_running = false; 98 | } 99 | (_, KeyCode::Down | KeyCode::Char('j') | KeyCode::Char('J')) => { 100 | app.list_state.select_next(); 101 | } 102 | (_, KeyCode::Up | KeyCode::Char('k') | KeyCode::Char('K')) => { 103 | app.list_state.select_previous(); 104 | } 105 | (_, KeyCode::Enter) => { 106 | app.start_animation(); 107 | } 108 | (_, KeyCode::Tab) => { 109 | app.is_toggled = !app.is_toggled; 110 | } 111 | _ => {} 112 | } 113 | Ok(()) 114 | } 115 | -------------------------------------------------------------------------------- /src/fps.rs: -------------------------------------------------------------------------------- 1 | use std::time::{Duration, Instant}; 2 | 3 | #[derive(Debug)] 4 | pub struct Fps { 5 | frame_count: usize, 6 | pub last_instant: Instant, 7 | fps: Option, 8 | } 9 | 10 | impl Default for Fps { 11 | fn default() -> Self { 12 | Self { 13 | frame_count: 0, 14 | last_instant: Instant::now(), 15 | fps: None, 16 | } 17 | } 18 | } 19 | 20 | impl std::fmt::Display for Fps { 21 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 22 | write!(f, "{:.2}", self.fps.unwrap_or(0.0)) 23 | } 24 | } 25 | 26 | impl Fps { 27 | pub fn tick(&mut self) { 28 | self.frame_count += 1; 29 | let elapsed = self.last_instant.elapsed(); 30 | // update the fps every second, but only if we've rendered at least 2 frames (to avoid 31 | // noise in the fps calculation) 32 | if elapsed > Duration::from_secs(1) && self.frame_count > 2 { 33 | self.fps = Some(self.frame_count as f32 / elapsed.as_secs_f32()); 34 | self.frame_count = 0; 35 | self.last_instant = Instant::now(); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod animation; 2 | pub mod app; 3 | pub mod args; 4 | pub mod event; 5 | pub mod fps; 6 | 7 | pub use args::{Args, Parser}; 8 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use theattyr::*; 2 | 3 | fn main() -> color_eyre::Result<()> { 4 | let args = Args::parse(); 5 | color_eyre::install()?; 6 | let terminal = ratatui::init(); 7 | let event_handler = event::EventHandler::new(args.tick_rate); 8 | let result = app::App::new(event_handler, args).run(terminal); 9 | ratatui::restore(); 10 | result 11 | } 12 | -------------------------------------------------------------------------------- /vt100/barney.vt: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |  ____ 27 |  _/ `--_ 28 |  /__/ _-- \ \ 29 |  // / \ ) 30 |  \_/_________/ 31 |  ___ I love you... 32 |  / oo\ / 33 |  _.( .\..| _ 34 |  (_ \\_\==//_) 35 |  \| | \_/ 36 |  /.\_// 37 |  \) L) 38 |  ____-------___ 39 |  \___ ==== __| 40 |  ) ( 41 |  |________| 42 |  | | | | | | 43 |  ____ 44 |  _/ `--_ 45 |  /__/ _-- \ \ 46 |  // / \ ) 47 |  \_/_________/ 48 |  ___ I love you... 49 |  / oo\ / 50 |  _.( .\..| _ 51 |  (_ \\_\==//_) 52 |  \| | \_/ 53 |  /.\_// 54 |  \) L) 55 |  ____-------___ 56 |  \___ ==== __| 57 |  ) ( 58 |  |________| 59 |  | | | | | | 60 |  | | | | | | 61 |  ____ 62 |  _/ `--_ 63 |  /__/ _-- \ \ 64 |  // / \ ) 65 |  \_/_________/ 66 |  | | | | 67 |  | | | | | | 68 |  | | | | | | 69 |  ____ 70 |  _/ `--_ 71 |  /__/ _-- \ \ 72 |  // / \ ) 73 |  \_/_________/ 74 |  | | | | 75 |  | | | | 76 |  | | | | | | 77 |  | | | | | | 78 |  ____ 79 |  _/ `--_ 80 |  /__/ _-- \ \ 81 |  // / \ ) 82 |  \_/_________/ 83 |  | | 84 |  | | 85 |  | | | | 86 |  | | | | 87 |  | | | | | | 88 |  | | | | | | 89 |  ____ 90 |  _/ `--_ 91 |  /__/ _-- \ \ 92 |  // / \ ) 93 |  \_/_________/ 94 |  | 95 |  | | 96 |  | | 97 |  | | | | 98 |  | | | | 99 |  | | | | | | 100 |  | | | | | | 101 |  ____ 102 |  _/ `--_ 103 |  /__/ _-- \ \ 104 |  // / \ ) 105 |  \_/_________/ 106 |  107 |  | 108 |  | | 109 |  | | 110 |  | | | | 111 |  | | | | 112 |  | | | | | | 113 |  | | | | | | 114 |  ____ 115 |  _/ `--_ 116 |  /__/ _-- \ \ 117 |  // / \ ) 118 |  \_/_________/ 119 |  120 |  | 121 |  | | 122 |  | | 123 |  | | | | 124 |  | | | | 125 |  | | | | | | 126 |  | | | | | | 127 |  ____ 128 |  _/ `--_ 129 |  /__/ _-- \ \ 130 |  // / \ ) 131 |  \_/_________/ 132 |  / oo\ / 133 |  _.( .\..| _ 134 |  (_ \\_\==//_) 135 |  \| | \_/ 136 |  /.\_// 137 |  \) L) 138 |  ____-------___ 139 |  \___ ==== __| 140 |  ) ( 141 |  |________| 142 |  143 |  | 144 |  | | 145 |  | | 146 |  | | | | 147 |  | | | | 148 |  | | | | | | 149 |  | | | | | | 150 |  ____ 151 |  _/ `--_ 152 |  /__/ _-- \ \ 153 |  // / \ ) 154 |  \_/_________/ 155 |  _.( .\..| _ 156 |  (_ \\_\==//_) 157 |  \| | \_/ 158 |  /.\_// 159 |  \) L) 160 |  ____-------___ 161 |  \___ ==== __| 162 |  ) ( 163 |  |________| 164 |  165 |  | 166 |  | | 167 |  | | 168 |  | | | | 169 |  | | | | 170 |  | | | | | | 171 |  | | | | | | 172 |  ____ 173 |  _/ `--_ 174 |  /__/ _-- \ \ 175 |  // / \ ) 176 |  \_/_________/ 177 |  (_ \\_\==//_) 178 |  \| | \_/ 179 |  /.\_// 180 |  \) L) 181 |  ____-------___ 182 |  \___ ==== __| 183 |  ) ( 184 |  |________| 185 |  186 |  | 187 |  | | 188 |  | | 189 |  | | | | 190 |  | | | | 191 |  | | | | | | 192 |  | | | | | | 193 |  ____ 194 |  _/ `--_ 195 |  /__/ _-- \ \ 196 |  // / \ ) 197 |  \_/_________/ 198 |  \| | \_/ 199 |  /.\_// 200 |  \) L) 201 |  ____-------___ 202 |  \___ ==== __| 203 |  ) ( 204 |  |________| 205 |  206 |  | 207 |  | | 208 |  | | 209 |  | | | | 210 |  | | | | 211 |  | | | | | | 212 |  | | | | | | 213 |  ____ 214 |  _/ `--_ 215 |  /__/ _-- \ \ 216 |  // / \ ) 217 |  \_/_________/ 218 |  /.\_// 219 |  \) L) 220 |  ____-------___ 221 |  \___ ==== __| 222 |  ) ( 223 |  |________| 224 |  225 |  | 226 |  | | 227 |  | | 228 |  | | | | 229 |  | | | | 230 |  | | | | | | 231 |  | | | | | | 232 |  ____ 233 |  _/ `--_ 234 |  /__/ _-- \ \ 235 |  // / \ ) 236 |  \_/_________/ 237 |  \) L) 238 |  ____-------___ 239 |  \___ ==== __| 240 |  ) ( 241 |  |________| 242 |  243 |  244 |  245 |  246 |  247 |  248 |  249 |  250 |  251 |  252 |  253 |  254 |  255 |  256 |  257 |  258 |  ___ 259 |  _/ |/--_ 260 |  /__/ _/ \ \ 261 |  / / \ ) 262 |  \/__++,++,+/__ 263 |  \___ //===; __| 264 |  . _ )U '( 265 |  . (/. |________|__ ___ 266 | -------------------------------------------------------------------------------- /vt100/blinkeyes.vt: -------------------------------------------------------------------------------- 1 |  ###=========@( o o )@\ ^ /MUSA ! 2 | 3 | 4 | ###=========@( o o )@\ ^ /MUSA ! 5 | 6 | 7 | ###=========@( o o )@\ ^ /MUSA ! 8 | 9 | 10 | ###=========@( o o )@\ ^ /MUSA ! 11 | ---- 12 | oooo 13 | ---- 14 | oooo 15 | ---- 16 | oooo 17 | ---- 18 | oooo 19 | ---- 20 | oooo 21 | ---- 22 | oooo 23 | ---- 24 | oooo 25 | ---- 26 | oooo 27 | ---- 28 | oooo 29 | ---- 30 | oooo 31 | ---- 32 | oooo 33 | ---- 34 | oooo 35 | ---- 36 | oooo 37 | ---- 38 | oooo 39 | ---- 40 | oooo 41 | ---- 42 | oooo 43 | ---- 44 | oooo 45 | ---- 46 | oooo 47 | ---- 48 | oooo 49 | ---- 50 | oooo 51 | ---- 52 | oooo 53 | ---- 54 | oooo 55 | ---- 56 | oooo 57 | ---- 58 | oooo 59 | ---- 60 | oooo 61 | ---- 62 | oooo 63 | ---- 64 | oooo 65 | ---- 66 | oooo 67 | ---- 68 | oooo 69 | ---- 70 | oooo 71 | ---- 72 | oooo 73 | ---- 74 | oooo 75 | 76 | -------------------------------------------------------------------------------- /vt100/bomb.vt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/vt100/bomb.vt -------------------------------------------------------------------------------- /vt100/bugsbunny.vt: -------------------------------------------------------------------------------- 1 | $""!!!!>h6IW$$$*E !Ue*$!!!\$$k!!!! #$$HII@$B'(?"W@$$$$5!!!@.'*$!!!$IBWW!(()**$I` . !!!!!U!:!h#$$W!! #$X$$K>WXWW$>((@$$$$"d$R!! !!e!!:"$\9$LH! "<9 Ux! C( I\(.B*"tKX!  9$mrd-~ T<rT@k!!!!$$$$!!!(XN$# :!!XU@*`!(k!!:!!R!!!NUX!!: #$NX!!: $6!T$.~!?#$$e. )!!)$$$$$F!!!!!!!!!(:!~ d$M!!~ $" :  :!! :>X!!.*\zG:!'$$$@$$$$$$!>$#?!!!~                                            -------------------------------------------------------------------------------- /vt100/delay.vt: -------------------------------------------------------------------------------- 1 |  2 |  3 |  4 |  5 |  6 |  7 |  8 |  9 |  10 |  11 |  12 |  13 |  14 |  15 |  16 |  17 |  18 |  19 |  20 |  21 |  22 |  23 |  24 |  25 |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  35 |  36 |  37 |  38 |  39 |  40 |  41 |  42 |  43 |  44 |  45 |  46 |  47 |  48 |  49 |  50 |  51 |  52 |  53 |  54 |  55 |  56 |  57 |  58 |  59 |  60 |  61 |  62 |  63 |  64 |  65 |  66 |  67 |  68 |  69 |  70 |  71 |  72 |  73 |  74 |  75 |  76 |  77 |  78 |  79 |  80 |  81 |  82 |  83 |  84 |  85 |  86 |  87 |  88 |  89 |  90 |  91 |  92 |  93 |  94 |  95 |  96 |  97 |  98 |  99 |  100 |  101 |  102 |  103 |  104 |  105 |  106 |  107 |  108 |  109 |  110 |  111 |  112 |  113 |  114 |  115 |  116 | 117 | 118 | -------------------------------------------------------------------------------- /vt100/dogs.vt: -------------------------------------------------------------------------------- 1 |  2 | 3 |  __ 4 |  _/ o\__, 5 |  / ____/ 6 |  / / 7 |  _- /\\ __ 8 |  \_/ /---\\-/ o\__ 9 |  \ |= ___ ____/ 10 |  | /| / || 11 |  ||_|| ||_ 12 |  ~~~~~~~~~~~~~~~~~~~~~~~~~ 13 | 14 |  15 |  16 |  17 |  _/ -\__ 18 | 19 |  / /\\ __ 20 |  \_/ /--\\-/ O\__ 21 |  | / ___ ____/ 22 |  23 |  24 |  25 |  _- /\\ __ 26 |  _/ /---\\-/ o\__ 27 |  / \ |= ___ ____/ 28 |  29 |  30 |  31 | 32 |  / /\\ __ 33 |  \_/ /--\\-/ O\__ 34 |  | / ___ ____/ 35 |  36 |  37 |  38 |  _- /\\ __ 39 |  _/ /---\\-/ o\__ 40 |  / \ |= ___ ____/ 41 |  42 |  43 |  44 | 45 |  / /\\ __ 46 |  \_/ /--\\-/ O\__ 47 |  | / ___ ____/ 48 |  49 |  50 |  51 |  _- /\\ __ 52 |  _/ /---\\-/ o\__ 53 |  / \ |= ___ ____/ 54 |  55 |  56 |  57 | 58 |  / /\\ __ 59 |  \_/ /--\\-/ O\__ 60 |  | / ___ ____/ 61 |  62 |  63 |  64 |  _- /\\ __ 65 |  _/ /---\\-/ o\__ 66 |  / \ |= ___ ____/ 67 |  68 |  69 |  70 | 71 |  / /\\ __ 72 |  \_/ /--\\-/ O\__ 73 |  | / ___ ____/ 74 |  75 |  76 |  77 |  _- /\\ __ 78 |  _/ /---\\-/ o\__ 79 |  / \ |= ___ ____/ 80 |  81 |  82 |  83 | 84 |  / /\\ __ 85 |  \_/ /--\\-/ O\__ 86 |  | / ___ ____/ 87 |  88 |  89 |  90 |  _- /\\ __ 91 |  _/ /---\\-/ o\__ 92 |  / \ |= ___ ____/ 93 |  94 |  95 |  96 | 97 |  / /\\ __ 98 |  \_/ /--\\-/ O\__ 99 |  | / ___ ____/ 100 |  101 |  102 |  103 |  _- /\\ __ 104 |  _/ /---\\-/ o\__ 105 |  / \ |= ___ ____/ 106 |  107 |  108 |  109 | 110 |  / /\\ __ 111 |  \_/ /--\\-/ O\__ 112 |  | / ___ ____/ 113 |  114 |  115 |  116 |  _- /\\ __ 117 |  _/ /---\\-/ o\__ 118 |  / \ |= ___ ____/ 119 |  120 |  121 |  122 | 123 |  / /\\ __ 124 |  \_/ /--\\-/ O\__ 125 |  | / ___ ____/ 126 |  127 |  128 |  129 |  _- /\\ __ 130 |  _/ /---\\-/ o\__ 131 |  / \ |= ___ ____/ 132 |  133 |  134 |  135 | 136 |  / /\\ __ 137 |  \_/ /--\\-/ O\__ 138 |  | / ___ ____/ 139 |  140 |  141 |  142 |  _- /\\ __ 143 |  _/ /---\\-/ o\__ 144 |  / \ |= ___ ____/ 145 |  146 |  147 |  148 | 149 | 150 |  151 |  152 |  153 |  154 |  155 |  156 |  _/ .\__, Arrrgh 157 |  / ____/ _/ 158 |  / / 159 |  / /\\ __ 160 |  \_/ /--\\-/ *\__ Woof. 161 |  | / ___ ____/ _/ 162 |  163 | 164 |  \ 165 |  166 |  167 |  168 |  / 169 | 170 |  \ 171 |  172 |  173 |  174 |  / 175 | 176 |  \ 177 |  178 |  179 |  180 |  / 181 | 182 |  \ 183 |  184 |  185 |  186 |  / 187 | 188 |  \ 189 |  190 |  191 |  192 |  / 193 | 194 |  \ 195 |  196 |  197 |  198 |  / 199 | 200 |  \ 201 |  202 |  203 |  204 |  / 205 | 206 |  \ 207 |  208 |  209 |  210 |  / 211 | 212 |  \ 213 |  214 |  215 |  216 |  / 217 | 218 |  \ 219 |  220 |  221 |  222 |  / 223 | 224 |  \ 225 |  226 |  227 |  228 |  / 229 | 230 |  \ 231 |  232 |  233 |  234 |  / 235 | 236 |  \ 237 |  238 |  239 |  240 |  / 241 | 242 |  \ 243 |  244 |  245 |  246 |  / 247 | 248 |  \ 249 |  250 |  251 |  252 |  / 253 | 254 |  \ 255 |  256 |  257 |  258 |  / 259 | 260 |  \ 261 |  262 |  263 |  264 |  / 265 | 266 |  \ 267 |  268 |  269 |  270 |  / 271 | 272 |  \ 273 |  274 |  275 |  276 |  / 277 | 278 |  \ 279 |  280 |  281 |  282 |  / 283 | 284 | 285 |  286 | 287 | 288 | -------------------------------------------------------------------------------- /vt100/duckpaint.vt: -------------------------------------------------------------------------------- 1 | < 2 |  3 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 5 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7 | ~~~~~~~~~~~~~~~~~~~ 8 | ~~~~~~~~~~~~~~~~~~~~~ 9 | \ 10 | \\ 11 | \ 12 | \\\\\\ 13 | \\\\\\\ 14 | \\\\\\\\ 15 | \\\\\\\ 16 | \\\\\ 17 | \\\ 18 | \ 19 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 20 | UUUUUUUUUUUUUUU 21 | UUUUUUUUUUUUUUUU 22 | UUUUUUUUUUUUUU 23 | UU 24 | UUUUUUUUU 25 | UUUUUUUUUUUUUUU 26 | UUUUUUUUUUUUU 27 | UU 28 | UU 29 | UUUUUUUUUU 30 | UUUUUUUUUUUUU 31 | UUUUUUUUUU 32 | UU 33 | UU 34 | UU 35 | UUUUUUUUUU 36 | UUUUUUUUUUUU 37 | UUUUUUU 38 | UU 39 | UU 40 | UU 41 | UU 42 | UUUUUUUUU 43 | UUUUUUUUUUUU 44 | UUUU 45 | UU 46 | UU 47 | UU 48 | UU 49 | UU 50 | UUUUUUU 51 | UUUUUUUUUUUU 52 | UU 53 | UU 54 | UU 55 | UU 56 | UU 57 | UU 58 | UU 59 | UUUUU 60 | UUUUUUUU 61 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU 62 | UUUUUUUUUU 63 | UUUU 64 | U 65 | ///// 66 | ///////// 67 | //////////// 68 | ////////////// 69 | /////////////// 70 | /////// 71 | //// 72 | // 73 | ........ 74 | ............. 75 | ............... 76 | UUUUUUUUU 77 | ............ 78 | UUUUUUUUUUUUUU 79 | .............. 80 | UUUUUU 81 | ........ 82 | OO 83 | .... 84 | UU 85 | ............. 86 | ......... 87 |  88 | UUUUUUUUU 89 | quack 90 |  91 |  92 | UUUUUUUUU 93 |  94 | UUUUUUUUU 95 | quack 96 |  97 |  98 | UUUUUUUUU 99 |  100 | -------------------------------------------------------------------------------- /vt100/fireworks.vt: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | .... Only in a place called .... 5 | 6 | 7 | #3  The  8 | #4  The  9 | #3 TWILIGHT ZONE 10 | #4 TWILIGHT ZONE 11 | 12 |  13 | 14 |  15 | (0 16 | xxxx 17 | #3/\ooooooooooooooooooooo\ 18 | #4/\ooooooooooooooooooooo\ 19 | #3( ) F I R E W O R K S  ) 20 | #4( ) F I R E W O R K S  ) 21 | #3\/sssssssssssssssssssss/ 22 | #4\/sssssssssssssssssssss/ 23 | (B By MATTEL 24 | (0 25 |  26 |  27 |  28 |  29 |  30 |  31 |  32 |  33 |  34 |  35 | q\ /q 36 |   37 | q\ /q  38 |   q\ / 39 | q    40 | q\ /q  41 |   42 | (B[?5h[?5l 43 | 44 | (0 45 | /(B~~(0// /(Bo 46 | (0\([ >/ooo\\ ssu/ \\/o\ 47 | / / \// \/ / /\ \ 48 | \ \ x \ \\ \ x \ \ 49 | (\ss\qqqqj\ \ \\mvjj \/ \ \s/\ 50 | < \ \ \ \ \/\/ \ \ ) \ /o / 51 | mq/ \sssss/\sss/ / / 52 |  53 |  54 |  55 |  56 | \/q\\ /q 57 | \    58 |    59 | ff f 60 |  f f 61 |  f  62 |  f f 63 |  f f 64 |  f f 65 |  f f f 66 |  f  67 | [?5h  [?5l   68 |       69 |     70 |      71 |  [?5h\* 72 | [?5lO O[?5hy 73 | f[?5l* 74 | [?5h[?5l 75 |  76 | [?5h[?5l 77 |   78 | * *[?5h   79 |   [?5l    80 |       81 |    (Bo 82 | o(0      83 |      84 |     85 |     86 |    87 |       88 |    89 |  90 |  91 |  92 |  93 |  94 |  95 |  96 |  97 |  98 |  99 |  100 |  101 | \/q\\ /q 102 | \    103 |    104 | ff f 105 |  f f 106 |  f  107 |  f f 108 |  f f 109 |  f f 110 |  f f f 111 |  f  112 | [?5h  [?5l  113 |       114 |      115 |      116 |     117 | [?5h [?5l    118 |      119 | [?5h  [?5l af 120 |     f 121 |       122 |       123 | [?5h   [?5l f 124 | [?5h [?5l   125 |      126 |    (0aa 127 | ff 128 | [?5h 129 | [?5l      130 | [?5h  [?5l   131 |      132 |      133 | [?5h [?5l     134 |      135 | [?5h [?5l     136 |       137 | [?5h [?5l    138 |      139 |      140 |    (0  141 |      142 |  143 |  144 |  145 |  146 |  147 |  148 |  149 |  150 |  151 |  152 |  153 |  154 |  155 | \/q\\ /q 156 | \    157 |    158 | ff f  159 | f f f 160 |  f f  161 | f f f  162 | f f f  163 | f f 164 |   165 | O 166 | ?#3?#4 167 | [24 168 | )B 169 | (B 170 | 171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /vt100/fishy-fishy.vt: -------------------------------------------------------------------------------- 1 | [?25l 2 | ,.. . ,.. . ,.. . ,.. . ,.. . ,.. . 3 | `~' `~^~' ``~' `~^~' ``~' `~^~' ``~' `~^~' ``~' `~^~' ``~' `~^~' ` 4 | \/ \/ \/ \/ \/ \/ \/ 5 | \/ \/ \/ \/ \/ \/ \/ 6 | \\ \\/ \\\/ \\ \/ \\ \/ \\ \/ \\ \/ 7 | \,... \ ,... \ ,... \ ,... \ ,.../ \ ,...\/ \ ,... \/\ 8 | \\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O;/ \\\;::(O;\/\\\;::(O; \\\\ 9 | <{(fishy <{(fishy/ <{(fishy / <{(fishy /<{(fishy <{(fishy/ <{(fishy\/ <{ 10 | //^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~/ ///^UWU~\/ /// 11 | \/// \// // / \/ /// / // //\/ / /\/ // \/ // \/// \/ / \// \/// 12 | \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 13 | \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ 14 | o0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O 15 | 0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0O 16 | o0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O0oo0Oo0OOo0O 17 |  18 | \\\ \\ \\/ \\\/ \\ \/ \\ \/ \\ \/ 19 | \ \/,... \ \,... \ ,... \ ,... \ ,... \ ,.../ \ ,...\/ \ 20 | \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O;/ \\\;::(O;\/\\ 21 | <{(fishy <{(fishy <{(fishy/ <{(fishy / <{(fishy /<{(fishy <{(fishy/ < 22 | ///^UWU~ \ ///^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~/ // 23 | / \/// \/ / \/// \// // / \/ /// / // //\/ / /\/ // \/ // \/// \/ / 24 |  25 | \/\\ \\\ \\ \\/ \\\/ \\ \/ \\ \/ 26 | \\/ ,... \ \/,... \ \,... \ ,... \ ,... \ ,... \ ,.../ \ 27 | \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O;/ \ 28 | <{(fishy <{(fishy <{(fishy <{(fishy/ <{(fishy / <{(fishy /<{(fishy 29 | ///^UWU~\ ///^UWU~ \ ///^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \/ 30 | /\/ // \/ / \/// \/ / \/// \// // / \/ /// / // //\/ / /\/ // \/ // 31 |  32 | \/ \\ \/\\ \\\ \\ \\/ \\\/ \\ \/ 33 | \/ ,... \\/ ,... \ \/,... \ \,... \ ,... \ ,... \ ,... 34 | \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; 35 | \<{(fishy <{(fishy <{(fishy <{(fishy <{(fishy/ <{(fishy / <{(fishy 36 | \///^UWU~ ///^UWU~\ ///^UWU~ \ ///^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \ 37 | // ///\/ /\/ // \/ / \/// \/ / \/// \// // / \/ /// / // //\/ / 38 |  39 | \/ \\ \/ \\ \/\\ \\\ \\ \\/ \\\/ 40 | \\ ,... \/ ,... \\/ ,... \ \/,... \ \,... \ ,... \ ,... 41 | ; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; 42 | y \/<{(fishy \<{(fishy <{(fishy <{(fishy <{(fishy <{(fishy/ <{(fishy 43 | \////^UWU~ \///^UWU~ ///^UWU~\ ///^UWU~ \ ///^UWU~ \///^UWU~/ ///^UWU~\ 44 | \/ / /// // ///\/ /\/ // \/ / \/// \/ / \/// \// // / \/ /// / 45 |  46 | \/ \\ \/ \\ \/ \\ \/\\ \\\ \\ \\/ 47 | . \/\ ,... \\ ,... \/ ,... \\/ ,... \ \/,... \ \,... \ ,... 48 | O; \\\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; 49 | hy\/ <{(fishy \/<{(fishy \<{(fishy <{(fishy <{(fishy <{(fishy <{(fishy 50 | ~\/ ///^UWU~ \////^UWU~ \///^UWU~ ///^UWU~\ ///^UWU~ \ ///^UWU~ \///^UWU~ 51 | \/// // \/ / /// // ///\/ /\/ // \/ / \/// \/ / \/// \// // / 52 |  53 | \/ \\ \/ \\ \/ \\ \/ \\ \/\\ \\\ \\ 54 | ..\/ \ ,... \/\ ,... \\ ,... \/ ,... \\/ ,... \ \/,... \ \,... 55 | (O;\/\\\;::(O; \\\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O 56 | shy/ <{(fishy\/ <{(fishy \/<{(fishy \<{(fishy <{(fishy <{(fishy <{(fish 57 | U~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~ ///^UWU~\ ///^UWU~ \ ///^UWU~ 58 | \/ / \// \/// // \/ / /// // ///\/ /\/ // \/ / \/// \/ / \/// 59 |  60 | \ \/ \\ \/ \\ \/ \\ \/ \\ \/ \\ \/\\ \\\ 61 | .../ \ ,...\/ \ ,... \/\ ,... \\ ,... \/ ,... \\/ ,... \ \/,.. 62 | :(O;/ \\\;::(O;\/\\\;::(O; \\\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::( 63 | ishy <{(fishy/ <{(fishy\/ <{(fishy \/<{(fishy \<{(fishy <{(fishy <{(fis 64 | WU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~ ///^UWU~\ ///^UWU 65 | / \/ // \/// \/ / \// \/// // \/ / /// // ///\/ /\/ // \/ / \/// 66 |  67 | \\ \/ \\ \/ \\ \/ \\ \/ \\ \/ \\ \/ \\ \/\\ 68 | ,... \ ,.../ \ ,...\/ \ ,... \/\ ,... \\ ,... \/ ,... \\/ ,. 69 | ::(O; \\\;::(O;/ \\\;::(O;\/\\\;::(O; \\\\;::(O; \\\;::(O; \\\;::(O; \\\;:: 70 | fishy /<{(fishy <{(fishy/ <{(fishy\/ <{(fishy \/<{(fishy \<{(fishy <{(fi 71 | UWU~ \////^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~ ///^UW 72 | //\/ / /\/ // \/ // \/// \/ / \// \/// // \/ / /// // ///\/ /\/ // 73 |  74 | \\\/ \\ \/ \\ \/ \\ \/ \\ \/ \\ \/ \\ \/ \ 75 | ,... \ ,... \ ,.../ \ ,...\/ \ ,... \/\ ,... \\ ,... \/ , 76 | ;::(O; \\\;::(O; \\\;::(O;/ \\\;::(O;\/\\\;::(O; \\\\;::(O; \\\;::(O; \\\;: 77 | (fishy / <{(fishy /<{(fishy <{(fishy/ <{(fishy\/ <{(fishy \/<{(fishy \<{(f 78 | ^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^U 79 | /// / // //\/ / /\/ // \/ // \/// \/ / \// \/// // \/ / /// // // 80 |  81 | \\/ \\\/ \\ \/ \\ \/ \\ \/ \\ \/ \\ \/ 82 | ,... \ ,... \ ,... \ ,.../ \ ,...\/ \ ,... \/\ ,... \\ 83 | \;::(O; \\\;::(O; \\\;::(O; \\\;::(O;/ \\\;::(O;\/\\\;::(O; \\\\;::(O; \\\; 84 | {(fishy/ <{(fishy / <{(fishy /<{(fishy <{(fishy/ <{(fishy\/ <{(fishy \/<{( 85 | /^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^ 86 | // / \/ /// / // //\/ / /\/ // \/ // \/// \/ / \// \/// // \/ / 87 |  88 | \\ \\/ \\\/ \\ \/ \\ \/ \\ \/ \\ \/ 89 | \,... \ ,... \ ,... \ ,... \ ,.../ \ ,...\/ \ ,... \/\ 90 | \\;::(O; \\\;::(O; \\\;::(O; \\\;::(O; \\\;::(O;/ \\\;::(O;\/\\\;::(O; \\\\ 91 | <{(fishy <{(fishy/ <{(fishy / <{(fishy /<{(fishy <{(fishy/ <{(fishy\/ <{ 92 | //^UWU~ \///^UWU~/ ///^UWU~\/ ///^UWU~ \////^UWU~ \///^UWU~/ ///^UWU~\/ /// 93 | \/// \// // / \/ /// / // //\/ / /\/ // \/ // \/// \/ / \// \/// 94 | [?25h 95 | -------------------------------------------------------------------------------- /vt100/fishy.vt: -------------------------------------------------------------------------------- 1 | [?25l 2 |  3 | ________________________ 4 | /// 5 | \_/\)\ 6 | ))) 7 | )))/ 8 | //_ 9 | \\\ 10 | \_________________________//// 11 | '/\\\\ 12 | / ( ( (/ ( ( ( (\ ( ( (O 13 | o 14 | o 15 | o 16 | o 17 | o 18 | o 19 | o 20 | o 21 | o 22 | o 23 | 24 | 25 |  26 | ___________________ 27 |    28 | /// 29 |    30 | \_/\)\ 31 |    32 | ))) 33 |    34 | )))/ 35 |    36 | //_ 37 |   38 | \\\ 39 |     40 | \_________________________//// 41 |      42 | '/\\\\ 43 | _____ 44 |  - 45 |    46 | / ( ( (/ ( ( ( (\ ( ( ( 47 | 48 | o 49 | o 50 | o 51 | o 52 | o 53 | o 54 | o 55 | o 56 | o 57 | o 58 | 59 |  60 | ___________________ 61 |    62 | /// 63 |    64 | \_/\)\ 65 |    66 | ))) 67 |    68 | )))/ 69 |    70 | //_ 71 |   72 | \\\ 73 |     74 | \_________________________//// 75 |      76 | '/\\\\ 77 | _____ 78 |  O 79 |    80 | / ( ( (/ ( ( ( (\ ( ( ( 81 | 82 | O 83 | O 84 | O 85 | O 86 | O 87 | O 88 | O 89 | O 90 | O 91 | O 92 | 93 |  94 | ___________________ 95 |    96 | /// 97 |    98 | \_/\)\ 99 |    100 | ))) 101 |    102 | )))/ 103 |    104 | //_ 105 |   106 | \\\ 107 |     108 | \_________________________//// 109 |      110 | '/\\\\ 111 | _____ 112 |  - 113 |    114 | / ( ( (/ ( ( ( (\ ( ( ( 115 | 116 | O 117 | O 118 | O 119 | O 120 | O 121 | O 122 | O 123 | O 124 | O 125 | O 126 | 127 |  128 | ___________________ 129 |    130 | /// 131 |    132 | \_/\)\ 133 |    134 | ))) 135 |    136 | )))/ 137 |    138 | //_ 139 |   140 | \\\ 141 |     142 | \_________________________//// 143 |      144 | '/\\\\ 145 | _____ 146 |  O 147 |    148 | / ( ( (/ ( ( ( (\ ( ( ( 149 | 150 | O 151 | O 152 | O 153 | O 154 | O 155 | O 156 | O 157 | O 158 | O 159 | O 160 | 161 |  162 | ___________________ 163 |    164 | /// 165 |    166 | \_/\)\ 167 |    168 | ))) 169 |    170 | )))/ 171 |    172 | //_ 173 |   174 | \\\ 175 |     176 | \_________________________//// 177 |      178 | '/\\\\ 179 | _____ 180 |  - 181 |    182 | / ( ( (/ ( ( ( (\ ( ( ( 183 | 184 | O 185 | O 186 | 187 |  188 | ___________________ 189 |    190 | /// 191 |    192 | \_/\)\ 193 |    194 | ))) 195 |    196 | )))/ 197 |    198 | //_ 199 |   200 | \\\ 201 |     202 | \_________________________ 203 |      204 | \ 205 |  O 206 | _____ 207 |    208 | / ( ( (/ ( ( ( (\ ( ( ( 209 | 210 | 211 |  212 | ____________________ 213 |    214 | /// 215 |    216 | \_/\)\ 217 |    218 | ))) 219 |    220 | )))/ 221 |    222 | //_ 223 |   224 | \\\ 225 |  226 | \____________________ 227 |  228 |  229 |    230 | / ( ( (/ ( ( ( (\ ( ( ( 231 | 232 |  233 | _______________ 234 |    235 | /// 236 |    237 | \_/\)\ 238 |    239 | ))) 240 |    241 | )))/ 242 |    243 | //_ 244 |   245 | \\\ 246 |  247 | \_______________ 248 |    249 | / ( ( (/ ( ( ( (\ ( ( ( 250 | 251 |  252 | __________ 253 |    254 | /// 255 |    256 | \_/\)\ 257 |    258 | ))) 259 |    260 | )))/ 261 |    262 | //_ 263 |   264 | \\\ 265 |  266 | \__________ 267 |    268 | / / (\ 269 | 270 |  271 | _____ 272 |    273 | /// 274 |    275 | \_/\)\ 276 |    277 | ))) 278 |    279 | )))/ 280 |    281 | //_ 282 |   283 | \\\ 284 |  285 | \_____ 286 |    287 | GLUG!! 288 | 289 |  290 |    291 | /// 292 |    293 | \_/\)\ 294 |    295 | ))) 296 |    297 | )))/ 298 |    299 | //_ 300 |   301 | \\\ 302 |  303 | \ 304 | GLUG!! 305 | 306 |    307 |    308 | \\)\ 309 |    310 | ))) 311 |    312 | )))/ 313 |    314 | // 315 |   316 |  317 | GLUG!! 318 | 319 |    320 |    321 |    322 |   323 | 324 |  325 | 326 | [?25h 327 | -------------------------------------------------------------------------------- /vt100/flatmap.vt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/vt100/flatmap.vt -------------------------------------------------------------------------------- /vt100/hello.vt: -------------------------------------------------------------------------------- 1 | [?5h[?3l#3#4#3#4#3#4#3#4#3#4#3#4#3#4#3#4#3#4#3#4 2 | HHEELLLLOO  HH  EE  LL 3 |  LL  OO  HH  EE  LL  LL 4 |  OO  HH  EE  LL  LL  5 | OO  HH  EE  LL  LL  OO 6 |   HH  EE  LL  LL  OO  7 | HH  EE  LL  LL  OO  HH 8 |  EE  LL  LL  OO  HH  EE 9 |  LL  LL  OO  HH  EE  10 | LL  LL  OO  HH  EE  11 | LLLL  OO  OOHH  EE  12 | LLLL  EEOHELL OHELL              13 |                       14 |      OOHELL HELL OOHHELL       15 |                         16 |   OOHELL HELL OOHHELL ELL  O OHEHELL LL  O OHELHELL L 17 |     HELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLO 18 | HELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLO 19 | #5#5#5#5#5[?5l 20 | -------------------------------------------------------------------------------- /vt100/july.4.vt: -------------------------------------------------------------------------------- 1 |  2 | ........[12;80............ 3 | ************** 4 | +++++++++++++++ 5 | ............... 6 | [5;2............... 7 | [15;12............... 8 | *.*.*.*..*.** 9 | +++.+.+++..++.+.+.+.+*[21;59+ 10 | +++.+.+++..++.+.+.+.+*[11;50+ 11 | ^^! ^! ^! ^! ^! ^! ^! ^! ^[16 12 | 13 | 14 | ;65H! ^! ^! ^! ^! ^! ^! ^! ^! [6;65^![7;6 15 | 16 | 17 | 5H ^  HAPPY! 18 | ^^! ^! ^! ^! ^! ^! ^! ^! ^[16 19 | 20 | 21 | ;65H! ^! ^! ^! ^! ^! ^! ^! ^! [6;65^![7;6 22 | 23 | 24 | 5H ^  HAPPY! 25 | ............................. 26 | 27 | 28 | ........................JULY 4   29 | 30 | 31 |                  32 |  33 |  34 |  35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /vt100/moon.animation: -------------------------------------------------------------------------------- 1 | < 2 | (0 3 |  4 | aaaaaaaa 5 | aaaaaaaa 6 | aaaaaaaa 7 | aaaaaaaa 8 | aaaaaaa 9 | aaaaaaa 10 | aaaaaa 11 | aaaaaa 12 | aaaaaa 13 | aaaaaa 14 | aaaaaa 15 | aaaaaa 16 |  17 | aaaaaa 18 |  19 | aaaaaa 20 |  21 | aaaaaa 22 |  23 | aaaaaa 24 |  25 | aaaaaa 26 |  27 | aaaaaa 28 |  29 | aaaaaaaaaa 30 |  31 | aaaaaaaaaa 32 |  33 | aaaaaaa 34 |  35 | aaaa 36 |  37 | aaaaaa 38 |  39 | aaaaaa 40 |  41 | aaaaaa 42 |  43 | aaaaa 44 |  45 | aaaaa 46 |  47 | aaaaa 48 |  49 | aaaaa 50 |  51 | aaaaa 52 |  53 | aaaaa 54 |  55 | aaaaa 56 |  57 | aaaaa 58 |  59 | aaaaa 60 |  61 |  62 |  63 | aaaaa 64 | aaaaa 65 | aaaaa 66 |  67 |  68 |  69 | aaaaa 70 | aaaaa 71 | aaaaa 72 |  73 |  74 |  75 | aaaaa 76 | aaaaa 77 | aaaaa 78 |  79 |  80 |  81 | aaaaa 82 | aaaaa 83 | aaaaa 84 |  85 |  86 |  87 | aaaa 88 | aaaaaaaa 89 | aaaaaaaaaaaaa 90 |  91 |  92 |  93 | aaaaaaaaaaaa 94 | aaaaaaaaaa 95 |  96 |  97 |  98 | aaaaaaaa 99 | aaaaaa 100 | aaaaaa 101 |  102 |  103 |  104 | aaaaa 105 | aaaaa 106 | aaaa 107 |  108 |  109 |  110 | aaaa 111 |  112 | aaaa 113 |  114 | aaaa 115 |  116 | aaaa 117 |  118 | aaaa 119 |  120 | aaaa 121 |  122 | aaaaa 123 |  124 | aaaaaa 125 |  126 | aaaaaa 127 |  128 | aaaaaa 129 |  130 | aaaaaa 131 |  132 | aaaaaa 133 |  134 | aaaaaa 135 |  136 | aaaaa 137 |  138 | aaaaaa 139 |  140 | aaaaa 141 |  142 | aaaa 143 |  144 | aaaa 145 |  146 | aaaa 147 |  148 | aaaa 149 |  150 | aaaa 151 |  152 | aaaa 153 |  154 | aaaa 155 |  156 | aaaa 157 |  158 | aaaa 159 |  160 | aaaa 161 |  162 | aaaa 163 |  164 | aaaaa 165 |  166 | aaaaaa 167 |  168 | aaaaaa 169 |  170 | aaaaaa 171 |  172 | aaaaa 173 |  174 | aaaa 175 |  176 | aaa 177 |  178 | aa 179 |  180 | a 181 |  182 | a 183 |  184 | a 185 |  186 | a 187 |  188 | a 189 |  190 | a 191 |  192 |  193 |  194 |  195 |  196 |  197 |  198 |  199 |  200 |  201 |  202 |  203 |  204 | a 205 | aa 206 | aaaa 207 | aaaaaa 208 | aaaaaaaaaaaaa 209 | aaaaaaaaaa 210 | aaaaaaaaaaaaaaaa 211 | aaaaaaaaaaaaaa 212 | aaaaaaaaaaaaaaaaa 213 | aaaaaaaaaaaaaaaaa 214 | aaaaaaaaaaaaaaaa 215 | aaaaaaaaaaaaaaaa 216 | aaaaaaaaaaaaaaaa 217 | aaaaaaaaaaaaaaa 218 | aaaaaaaaaaaaaaaa 219 | aaaaaaaaaaaaaaaa 220 | aaaaaaaaaaaaaaaa 221 | aaaaaaaaaaaaaaaa 222 | aaaaaaaaaaaaaaa 223 | aaaaaaaaaaaaaaaa 224 | aaaaaaaaaaaaaaaa 225 | aaaaaaaaaaaaaaaa 226 | aaaaaaaaaaaaaaaaa 227 | aaaaaaaaaaaaaaaaa 228 | aaaaaaaaaaaaaa 229 | aaaaaaaaaaaaaaaa 230 | aaaaaaaaaa 231 | aaaaaaaaaaaaa 232 | aaaaaa 233 | aaaa 234 | aa 235 | a 236 | * 237 | * 238 | * 239 | * 240 | * 241 | * 242 | * 243 | * 244 | * 245 | a 246 | aaa 247 | aaaaa 248 | aaaaaa 249 | a 250 |  251 |  252 |  253 |  254 |  255 |  256 |  257 |  258 |  259 |  260 |  261 |  262 |  263 | 264 | a 265 | aaaaaa 266 | aaaa 267 | aaaaa 268 | a 269 |  270 |  271 |  aa 272 |  273 |  274 | 275 | a 276 | aaaaaa 277 | aaaa 278 | aaaaa 279 | a 280 |  281 |  282 |  aa 283 |  284 |  285 | 286 | a 287 | aaaaaa 288 | aaaa 289 | aaaaa 290 | a 291 |  292 |  293 |  aa 294 |  295 |  296 | 297 | a 298 | aaaaaa 299 | aaaa 300 | aaaaa 301 | a 302 |  303 |  304 |  aa 305 |  306 |  307 | 308 | a 309 | aaaaaa 310 | aaaa 311 | aaaaa 312 | a 313 |  314 |  315 |  aa 316 |  317 |  318 | 319 | a 320 | aaaaaa 321 | aaaa 322 | aaaaa 323 | a 324 |  325 |  326 |  aa 327 |  328 |  329 | 330 | a 331 | aaaaaa 332 | aaaa 333 | aaaaa 334 | a 335 |  336 |  337 |  aa 338 |  339 |  340 | 341 | a 342 | aaaaaa 343 | aaaa 344 | aaaaa 345 | a 346 |  347 |  348 |  aa 349 |  350 |  351 | 352 | (B 353 | - 354 |  355 |  356 |  357 |  358 |  359 | G 360 |  361 |  362 | o 363 |  364 |  365 | o 366 |  367 |  368 | d 369 |  370 |  371 |  372 |  373 |  374 | E 375 |  376 |  377 | v 378 |  379 |  380 | e 381 |  382 |  383 | n 384 |  385 |  386 | i 387 |  388 |  389 | n 390 |  391 |  392 | g 393 |  394 |  395 | ! 396 | 397 |  398 |  399 |  400 |  401 |  402 |  403 |  404 |  405 |  406 |  407 |  408 |  409 |  410 |  411 |  412 |  413 |  414 |  415 |  416 |  417 |  418 |  419 |  420 |  421 |  422 |  423 |  424 |  425 |  426 |  427 |  428 |  429 |  430 |  431 |  432 |  433 |  434 |  435 |  436 |  437 |  438 |  439 |  440 |  441 |  442 |  443 |  444 |  445 |  446 |  447 |  448 |  449 |  450 |  451 |  452 |  453 |  454 |  455 |  456 |  457 | 458 |  459 |  460 |  461 |  462 |  463 |  464 |  465 |  466 |  467 |  468 |  469 |  470 |  471 |  472 |  473 |  474 |  475 |  476 |  477 |  478 |  479 |  480 |  481 |  482 |  483 |  484 |  485 |  486 |  487 |  488 |  489 |  490 |  491 |  492 |  493 |  494 |  495 |  496 |  497 |  498 |  499 |  500 |  501 | 502 | 503 |  504 | -------------------------------------------------------------------------------- /vt100/nasa.vt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orhun/theattyr/209d37733655477720d6706c2e86475045e689da/vt100/nasa.vt -------------------------------------------------------------------------------- /vt100/nifty.vt: -------------------------------------------------------------------------------- 1 | 2 |   3 |  nifty.. 4 |   5 |   nifty.. 6 |  nif 7 |   nifty.. 8 |  nifty. 9 |   nifty.. 10 |  nifty... 11 |   nifty.. 12 |  nifty... 13 |   nifty.. 14 |  nifty... 15 |   nifty.. 16 |  nifty... 17 |   nifty.. 18 |  nifty... 19 |   nifty.. 20 |  nifty... 21 |   nifty... 22 |  nifty... 23 |   nifty... 24 |  nifty... 25 |   nifty... 26 |  nifty... 27 |   nifty... 28 |  nifty... 29 |   nifty... 30 |  nifty... 31 |   nifty... 32 |  nifty... 33 |   nifty... 34 |  nifty... 35 |   nifty... 36 |  nifty... 37 |   nifty... 38 |  nifty... 39 |   nifty... 40 |  nifty... 41 |   nifty... 42 |  nifty... 43 |   44 |  45 | -------------------------------------------------------------------------------- /vt100/prey.vt: -------------------------------------------------------------------------------- 1 | 2 |  _ 3 | | | 4 | / \ 5 | _ _ _ _ 6 | _ _- - ' ` - -_ _ 7 | .-' _ _ `-._ 8 | , _ .- `- - -- - -\_ _/- - - - -' -. _ , 9 | .'.' - '.`. 10 | '.' '.' 11 | '' '' 12 | ' ) ( ' 13 | ` ` ' ' 14 | `.) (.' 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |  _ 23 | _|_|_ 24 | / \ 25 | ___[ ]___ 26 | ___---++ ++---___ 27 | __-+ __ __ +-__ 28 | / __+- `----------\_ _/----------' -+__ \ 29 | _/_/ - \_\_ 30 | /_/ \_\ 31 | // \\ 32 | / ) ( \ 33 | \ \ / / 34 | \_) (_/ 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |  _ 43 | _|_|_ 44 | / \ 45 | ___[ ]___ 46 | ___-==++""" """++==-___ 47 | __-+"" __ __ ""+-__ 48 | / __+-"" `-----=====\_ _/=====-----' ""-+__ \ 49 | _/_/ ""="" \_\_ 50 | /_/ \_\ 51 | // \\ 52 | / ) ( \ 53 | \ \ / / 54 | \_) (_/ 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |  _ 63 | _|_|_ 64 | ^/ . ..\^ 65 | ___[=========]___ 66 | ___-==++""" . /. . . \ . """++==-___ 67 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 68 | /\__+-"" `-----=====\_ _/=====-----' ""-+__/\ 69 | _/_/ ""="" \_\_ 70 | /_/ \_\ 71 | // \\ 72 | /") ("\ 73 | \o\ /o/ 74 | \_) (_/ 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 |  _ 83 | _|_|_ 84 | ^/ . ..\^ 85 | ___[=========]___ 86 | ___-==++""" . /. . . \ . """++==-___ 87 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 88 | /\__+-"" `-----=====\_ <O> _/=====-----' ""-+__/\ 89 | _/_/ ""="" \_\_ 90 | /_/ \_\ 91 | // \\ 92 | /") ("\ 93 | \o\ /o/ 94 | \_) (_/ 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |  _ 103 | _|_|_ 104 | ^/ . ..\^ 105 | ___[=========]___ 106 | ___-==++""" . /. . . \ . """++==-___ 107 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 108 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 109 | _/_/ ""O"" \_\_ 110 | /_/ \_\ 111 | // \\ 112 | /") ("\ 113 | \o\ /o/ 114 | \_) (_/ 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 |  _ 123 | _|_|_ 124 | ^/ . ..\^ 125 | ___[=========]___ 126 | ___-==++""" . /. . . \ . """++==-___ 127 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 128 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 129 | _/_/ ""="" \_\_ 130 | /_/ O \_\ 131 | // \\ 132 | /") ("\ 133 | \o\ /o/ 134 | \_) (_/ 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 |  _ 143 | _|_|_ 144 | ^/ . ..\^ 145 | ___[=========]___ 146 | ___-==++""" . /. . . \ . """++==-___ 147 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 148 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 149 | _/_/ ""="" \_\_ 150 | /_/ \_\ 151 | // -O- \\ 152 | /") ("\ 153 | \o\ /o/ 154 | \_) (_/ 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 |  _ 163 | _|_|_ 164 | ^/ . ..\^ 165 | ___[=========]___ 166 | ___-==++""" . /. . . \ . """++==-___ 167 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 168 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 169 | _/_/ ""="" \_\_ 170 | /_/ \_\ 171 | // | \\ 172 | /") --O-- ("\ 173 | \o\ | /o/ 174 | \_) (_/ 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 |  _ 183 | _|_|_ 184 | ^/ . ..\^ 185 | ___[=========]___ 186 | ___-==++""" . /. . . \ . """++==-___ 187 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 188 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 189 | _/_/ ""="" \_\_ 190 | /_/ \_\ 191 | // \|/ \\ 192 | /") --O-- ("\ 193 | \o\ /|\ /o/ 194 | \_) (_/ 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 |  _ 203 | _|_|_ 204 | ^/ . ..\^ 205 | ___[=========]___ 206 | ___-==++""" . /. . . \ . """++==-___ 207 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 208 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 209 | _/_/ ""="" \_\_ 210 | /_/ * \_\ 211 | // *\|/* \\ 212 | /") *--O--* ("\ 213 | \o\ */|\* /o/ 214 | \_) * (_/ 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 |  _ 223 | _|_|_ 224 | ^/ . ..\^ 225 | ___[=========]___ 226 | ___-==++""" . /. . . \ . """++==-___ 227 | __-+"" __\ .. . . | .. . | . . . /__ ""+-__ 228 | /\__+-"" `-----=====\_ < > _/=====-----' ""-+__/\ 229 | _/_/ ""="" \_\_ 230 | /_/ \ * / \_\ 231 | // *\|/* \\ 232 | /") - *--O--* - ("\ 233 | \o\ */|\* /o/ 234 | \_) / * \ (_/ 235 | | 236 | 237 | 238 | 239 | 240 | 241 | 242 | -------------------------------------------------------------------------------- /vt100/snowing: -------------------------------------------------------------------------------- 1 |  2 | #6 Tis the Season.... 3 | (B)0 4 | [?5l 5 | . . . . . . . . . 6 | . . . n . . . . . 7 |  . . 8 | . . . . . . .. 9 | . 10 | . ` 11 | ` sssssssslkss / \ 12 | . / \ ` . / mj \ / + \ 13 | / ~ \ . / \ . wqqqqqqqqqqqqw / f f\ 14 | qqqqqqq/ f f\qqqqqqqq/ ~ \qqqqqqqqqqqqqqqqu nn lqqk nn tqqqqqqqqqqqqq/ .~ f \ 15 | / . + f\ / f f\ x x-.x x /srqwqwqrs\ 16 | /srqwqwqrs\ / . ~ f\ mqqqqvqqvqqqqj lqvqvqk 17 | lqvqvqk /srqwqwqrs\ mqqqqqj 18 | mqqqqqj lqvqvqk 19 | mqqqqqj 20 |  21 | ****** * 22 | * * * * * * * 23 | * * * * * * * 24 | * * * * * * * 25 | ****** * 26 | * * * * * * * 27 | * * * * * * * 28 | * * * * * * * 29 |       30 | * * * * * *  31 | ****** * 32 | * * * * * * * 33 | * * * * * * * 34 | * * * * * * * 35 | It's Snowing 36 | * * * * * * 37 | ****** * 38 | * * * * * * * 39 | * * * * * * * 40 | * * * * * * * 41 | * * * * * * 42 | * * * * * *  43 | * * * * * * 44 |  45 | * * * * * * 46 | ****** * 47 | * * * * * * * 48 | * * * * * * * 49 | * * * * * * * 50 | ****** * 51 | * * * * * * * 52 | * * * * * * * 53 |  54 | * * * * * * * 55 |       56 | * * * * * *  57 | ****** * 58 | * * * * * * * 59 | * * * * * * * 60 | * * * * * * * 61 | * * * * * * 62 | ****** * 63 | * * * * * * * 64 | * * * * * * * 65 | * * * * * * * 66 | * * * * * * 67 |  68 | Merry Christmas from Woodrow! 69 | * * * * * *  70 | * * * * * * 71 | * * * * * * 72 | ****** * 73 | * * * * * * * 74 | * * * * * * * 75 | * * * * * * * 76 | ****** * 77 | * * * * * * * 78 | * * * * * * * 79 | * * * * * * * 80 |       81 | * * * * * *  82 | ****** * 83 | * * * * * * * 84 | * * * * * * * 85 | * * * * * * * 86 | * * * * * * 87 | ****** * 88 | * * * * * * * 89 | * * * * * * * 90 | * * * * * * * 91 | * * * * * * 92 | * * * * * *  93 | * * * * * * 94 | * * * * * * 95 | ****** * 96 | * * * * * * * 97 | * * * * * * * 98 | * * * * * * * 99 | ****** * 100 | * * * * * * * 101 | * * * * * * * 102 | * * * * * * * 103 |       104 | * * * * * *  105 | ****** * 106 | * * * * * * * 107 | * * * * * * * 108 | * * * * * * * 109 | * * * * * * 110 | ****** * 111 | * * * * * * * 112 | * * * * * * * 113 | * * * * * * * 114 | * * * * * * 115 | * * * * * *  116 | * * * * * * 117 | * * * * * * 118 |       119 |  120 | 121 | -------------------------------------------------------------------------------- /vt100/snowing.vt: -------------------------------------------------------------------------------- 1 |  2 | #6 Tis the Season.... 3 | (B)0 4 | [?5l 5 | . . . . . . . . 6 | [0m . 7 | . . . n . . . . . 8 |  . . 9 | . . . . . . .. 10 | . 11 | . ` 12 | ` sssssssslkss / \ 13 | . / \ ` . / mj \ / + \ 14 | / ~ \ . / \ . wqqqqqqqqqqqqw / f f\ 15 | qqqqqqq/ f f\qqqqqqqq/ ~ \qqqqqqqqqqqqqqqqu nn lqqk nn tqqqqqqqqqqqqq/ .~ f \ 16 | / . + f\ / f f\ x x-.x x /srqwqwqrs\ 17 | /srqwqwqrs\ / . ~ f\ mqqqqvqqvqqqqj lqvqvqk 18 | lqvqvqk /srqwqwqrs\ mqqqqqj 19 | mqqqqqj lqvqvqk 20 | mqqqqqj 21 |  22 | ****** * 23 | * * * * * * * 24 | * * * * * * * 25 | * * * * * * * 26 | ****** * 27 | * * * * * * * 28 | * * * * * * * 29 | * * * * * * * 30 |       31 | * * * * * *  32 | ****** * 33 | * * * * * * * 34 | * * * * * * * 35 | * * * * * * * 36 | It's Snowing 37 | * * * * * * 38 | ****** * 39 | * * * * * * * 40 | * * * * * * * 41 | * * * * * * * 42 | * * * * * * 43 | * * * * * *  44 | * * * * * * 45 |  46 | * * * * * * 47 | ****** * 48 | * * * * * * * 49 | * * * * * * * 50 | * * * * * * * 51 | ****** * 52 | * * * * * * * 53 | * * * * * * * 54 |  55 | * * * * * * * 56 |       57 | * * * * * *  58 | ****** * 59 | * * * * * * * 60 | * * * * * * * 61 | * * * * * * * 62 | * * * * * * 63 | ****** * 64 | * * * * * * * 65 | * * * * * * * 66 | * * * * * * * 67 | * * * * * * 68 |  69 | Merry Christmas and Happy New Year! 70 | * * * * * *  71 | * * * * * * 72 | * * * * * * 73 | ****** * 74 | * * * * * * * 75 | * * * * * * * 76 | * * * * * * * 77 | ****** * 78 | * * * * * * * 79 | * * * * * * * 80 | * * * * * * * 81 |       82 | * * * * * *  83 | ****** * 84 | * * * * * * * 85 | * * * * * * * 86 | * * * * * * * 87 | * * * * * * 88 | ****** * 89 | * * * * * * * 90 | * * * * * * * 91 | * * * * * * * 92 | * * * * * * 93 | * * * * * *  94 | * * * * * * 95 | * * * * * * 96 | ****** * 97 | * * * * * * * 98 | * * * * * * * 99 | * * * * * * * 100 | ****** * 101 | * * * * * * * 102 | * * * * * * * 103 | * * * * * * * 104 |       105 | * * * * * *  106 | ****** * 107 | * * * * * * * 108 | * * * * * * * 109 | * * * * * * * 110 | * * * * * * 111 | ****** * 112 | * * * * * * * 113 | * * * * * * * 114 | * * * * * * * 115 | * * * * * * 116 | * * * * * *  117 | * * * * * * 118 | * * * * * * 119 |       120 |  121 |  122 | 123 | -------------------------------------------------------------------------------- /vt100/spinweb.vt: -------------------------------------------------------------------------------- 1 | [=2;7h*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_*_* * * * * * * * * * * * * * * * * *\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* * * * * * * * * * * *_* * * * * * */*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*/*\*\*\*\*\*\*/*/*/*/*/*/*_*_*_*_*_*_*_*_*_*_*_*_*/*\*\*\*\*\*\*/*/*/*/*/*/\*_*_*_*_*_*_*_*_*_*_*/*\*\*\*\*\*/*/*/*/*/*_*_*_*_*_*_*_*_*_*_*/*\*\*\*\*\*/*/*/*/*/\*_*_*_*_*_*_*_*_*/*\*\*\*\*/*/*/*/*_*_*_*_*_*_*_*_*/*\*\*\*\*/*/*/*/\*_*_*_*_*_*_*/*\*\*\*/*/*/*_*_*_*_*_*_*/*\*\*\*/*/*/\*_*_*_*_*/*\*\*/*/*_*_*_*_*/*\*\*/*/\*_*_*/* */*/*_*_*\*_*\*_*\*_*\*_*\*_*_*|*|*|*|*|* whew !!!SPINWEB.VTby R L Samuellsamuell@cis.uab.eduApril 6, 1994 2 | -------------------------------------------------------------------------------- /vt100/strike.vt: -------------------------------------------------------------------------------- 1 | [?25l _ _ _ _ 2 | | | _ | | _ | | _ | | 3 | ) (| |'_`| |'_`| |) ( 4 | ( ) (| |'_`| |) ( ) 5 | \_( ) (| |) ( )_/ 6 | \_( ) ( )_/ 7 | \_( )_/ 8 | \_/ 9 | 10 |  .-. ( )  `"' 11 |  .-. ( )  `"' 12 |  .-. ( )  `"' 13 |  .-. ( _ )  `-' 14 |  .-. ( _ )  `-' 15 |  .-. ( _ )  `-' 16 |  .-. ( - )  `-'  17 |  .-. ( - )  `-' 18 |  .-. ( - )  `-' 19 |  .-. ( " )  `-' 20 |  .-. ( " )  `-' 21 |  .-. ( " )  `-' 22 |  .-. ( )  `-'  23 |  .-. ( )  `-' 24 |  .-. ( )  `-' 25 |  .-. ( )  `-' 26 |  .-. ( )  `-' 27 |  .-. ( )  `-' 28 |  .-. ( )  `-'  29 |  .-. ( )  `-' 30 |  .-. ( )  `-' 31 |  .-. ( )  `-' 32 |  .-. ( )  `-' 33 |  .-. ( )  `-' 34 |  .-. ( )  `-'  35 |  .-. ( )  `-' 36 |  .-. ( )  `-' 37 |  .-. ( )  `"' 38 |  .-. ( )  `"' 39 |  .-. ( )  `"' 40 |  .-. ( _ )  `-'  41 |  .-. ( _ )  `-' 42 |  .-. ( _ )  `-' 43 |  .-. ( - )  `-' 44 |  .-. ( - )  `-' 45 |  .-. ( - )  `-' 46 |  .-. ( " )  `-'  47 |  .-. ( " )  `-' 48 |  .-. ( " )  `-' 49 |  .-. ( )  `-' 50 |  .-. ( )  `-' 51 |  .-. ( )  `-' 52 |  .-. ( )  `-'  53 |  .-. ( )  `-' 54 |  .-. ( )  `-' 55 |  .-. ( )  `-' 56 |  .-. ( )  `-'  57 |  .-. ( )  `-' 58 |  .-. ( )  `-' 59 |  .-. ( )  `-' 60 |  .-. ( )  `-' 61 |  .-. ( )  `-' 62 |  .-. ( )  `"'  63 |  .-. ( )  `"' 64 |  .-. ( )  `"' 65 |  .-. ( . )  `-' 66 |  .-. ( . )  `-' 67 |  .-. ( . )  `-' 68 |  .-. ( ; )  `-'  69 |  .-. ( ; )  `-' 70 |  .-. ( ; )  `-' 71 |  ... ( ' )  `-' 72 |  ... ( ' )  `-' 73 |  ... ( ' )  `-' 74 |  .,. ( )  `-'  75 |  .,. ( )  `-' 76 |  .,. ( )  `-' 77 |  .-. ( )  `-' 78 |  .-. ( )  `-' 79 |  .-. ( )  `-' 80 |  .-. ( )  `-'  81 |  .-. ( )  `-' 82 |  .-. ( )  `-' 83 |  .-. ( )  `-' 84 |  .-. ( )  `-' 85 |  .-. ( )  `-' 86 |  _ _ _ _ 87 | | | _ | | _ | | _ | | 88 | ) (| |'_`| |'_`| |) ( 89 | ( ) (| |_ `| |) ( ) 90 | \_( ) ( ) ) ( )_/ 91 | \_( ) \ )_/ 92 | \_( .-._/ 93 | ( ) 94 | `-' 95 | 96 | 97 |  _ _ _ _ 98 | | | _ | | _ | | _ | | 99 | ) (| |_ `| |' _| |) ( 100 | ( ) ( ) ) `|( ) ( ) 101 | \_( ) \ ) / ( )_/ 102 | \_( ).-. )_/ 103 | \_`( )/ 104 | `-' 105 | 106 |  _ _ _ _ 107 | | |_| | |__ | | _| | 108 | ) ( )|_ ( )|' _|( ) ( 109 | ( ) \ ) ) \|( / ( ) 110 | \_( () ).-.( |_/ 111 | \.( \)( )'./ 112 | `-' `-' 113 | 114 |  _ _ _ _ 115 | ( ) ( ) ( ) ( ) 116 | ) \ ( () / () ) ( 117 | ( ()\ () \.-./ () ) 118 | `.( \() `( )/ ).' 119 | `-(__\' `-' './ 120 | 121 |  122 | 123 | () () () .-.) () () 124 | ( \()\ () ( ) ()/ ) 125 | `.(__\() ` `-' /__).' 126 | (__\' 127 | [============ A M F ==========] 128 | [============ A M F ==========] 129 | [============ A M F ==========] 130 | [============ A M F ==========] 131 | [============ A M F ==========] 132 |  133 | [============ A M F ==========] 134 | [============ A M F ==========] 135 | [============ A M F ==========] 136 | [============ A M F ==========] 137 | [============ A M F ==========] 138 |  139 | [============ A M F ==========] 140 | [============ A M F ==========] 141 | [============ A M F ==========] 142 | [============ A M F ==========] 143 | [============ A M F ==========] 144 |  145 | [============ A M F ==========] 146 | [============ A M F ==========] 147 | [============ A M F ==========] 148 | [============ A M F ==========] 149 | [============ A M F ==========] 150 |  151 | [============ A M F ==========] 152 | [============ A M F ==========] 153 | [============ A M F ==========] 154 | [============ A M F ==========] 155 | [============ A M F ==========] 156 |  157 | [============ A M F ==========] 158 | [============ A M F ==========] 159 | [============ A M F ==========] 160 | [============ A M F ==========] 161 | [============ A M F ==========] 162 |  163 | [============ A M F ==========] 164 | [============ A M F ==========] 165 |  166 | [============ A M F ==========] 167 | [============ A M F ==========] 168 |  169 | [============ A M F ==========] 170 | [============ A M F ==========] 171 |  172 | [============ A M F ==========] 173 | [============ A M F ==========] 174 |  175 | [============ A M F ==========] 176 |  177 | [?25h 178 | -------------------------------------------------------------------------------- /vt100/sun.vt: -------------------------------------------------------------------------------- 1 | < 2 | (0 3 |  4 | aaaaaaaaaaa 5 | aaaaaaaaaaaaaaaaa 6 | aaaaaaaaaaaaaaaaaaaaa 7 | aaaaaaaaaaaaaaaaaaaaaaa 8 | aaaaaaaaaaaaaaaaaaaaaaaaa 9 | aaaaaaaaaaaaaaaaaaaaaaaaaaa 10 | aaaaaaaaaaaaaaaaaaaaaaaaaaa 11 | aaaaaaaaaaaaaaaaaaaaaaaaaaa 12 | aaaaaaaaaaaaaaaaaaaaaaaaa 13 | aaaaaaaaaaaaaaaaaaaaaaa 14 | aaaaaaaaaaaaaaaaaaaaa 15 | aaaaaaaaaaaaaaaaa 16 | aaaaaaaaaaa 17 |  18 |  19 |  20 |  21 |  22 |  23 |  24 |  25 |  26 | aa 27 | aaaaaaaa 28 | aaaaaaaaaaaaaaa 29 | aaaaaaaaaaaaaaaaaaaaaa 30 | aaaaaaaaaaaaaaaaaaaaaaaaa 31 | aaaaaaaaaaaaaaaaaaaaaaaaaaa 32 | aaaaaaaaaaaaaaaaaaaaaaaaa 33 | aaaaaaaaaaaaaaaaaaaaaaa 34 | aaaaaaaaaaaaaaaaaaaaa 35 | aa 36 | aaaaaa 37 | aaaaaaaaaaaaaaa 38 | aaaaaaaaaaaaaaaaa 39 | aaaaaaaaaaaaaaaaaaa 40 | aaaaaaaaaaaaaaaaaaaaa 41 |  42 |  43 |  44 | aaaaaaaaaaaaaaaaaaaaaaaa 45 | aaaaaaaaaaaaaaaaaaaaaaaa 46 | aaaaaaaaaaaaaaaaaaaaaaaaa 47 | aaaaaaaaaaaaaaaaaaaaaaaaaa 48 | aaaaaaaaaaaaaaaaaaaaaa 49 | aaaaaaaaaaaaaaaaa 50 | aaaaaaaaaaaa 51 | aaaaaaa 52 | aa 53 | aaaaaaaaaaaaaaaaaaaaaaaa 54 | aaaaaaaaaaaaaaaaaaaaaaaa 55 | aaaaaaaaaaaaaaaaaaaaaaaaa 56 | aaaaaaaaaaaaaaaaaaaaaaaaaa 57 | aaaaaaaaaaaaaaaaaaaaaa 58 | aaaaaaaaaaaaaaaaa 59 | aaaaaaaaaaaa 60 | aaaaaaa 61 | aa 62 |  63 |  64 |  65 |  66 | aa 67 | aaaaaa 68 | aaaaaaaaaaaaaaa 69 | aaaaaaaaaaaaaaaaa 70 | aaaaaaaaaaaaaaaaaaa 71 | aaaaaaaaaaaaaaaaaaaaa 72 | aa 73 | aaaaaaaa 74 | aaaaaaaaaaaaaaa 75 | aaaaaaaaaaaaaaaaaaaaaa 76 | aaaaaaaaaaaaaaaaaaaaaaaaa 77 | aaaaaaaaaaaaaaaaaaaaaaaaaaa 78 | aaaaaaaaaaaaaaaaaaaaaaaaa 79 | aaaaaaaaaaaaaaaaaaaaaaa 80 | aaaaaaaaaaaaaaaaaaaaa 81 |  82 |  83 |  84 |  85 |  86 |  87 |  88 |  89 | (B 90 |  91 | -------------------------------------------------------------------------------- /vt100/tetris.vt: -------------------------------------------------------------------------------- 1 | Your level: 6 * * 2 | Full lines: 56 * * 3 | * ## * STATISTICS 4 | SCORE 10131 * ## * 5 | * * ### - 15 6 | * * # 7 | H E L P * * #### - 18 8 | * * 9 | 7:Left * * ### - 22 10 | 9:Right * * # 11 | 8:Rotate * * ## - 26 12 | 1:Draw Next * * ## 13 | 6:Speed Up * * ## - 17 14 | 4:Drop * * ## 15 | SPACE:Drop * * ## - 21 16 | * * ## 17 | * #* ### - 24 18 | Next: * #* # 19 | * # ## #* ------------ 20 | ## * ##### #* E : 143 21 | ## ************ 22 | 23 | Play TETRIS ! 24 |  25 |  ## 26 | ## 27 |  28 |  29 |  30 |  31 |  32 |  ## 33 | ## 34 |  35 |  36 |  37 |  38 |  39 |  ## 40 | ## 41 |  42 |  43 |  44 |  45 |  46 |  ## 47 | ## 48 |  49 |  50 |  51 |  52 |  53 |  ## 54 | ## 55 |  56 |  57 |  58 |  59 |  60 |  ## 61 | ## 62 |  63 |  64 |  65 |  66 |  67 |  ## 68 | ## 69 |  70 |  71 |  72 |  73 |  74 |  ## 75 | ## 76 |  77 |  78 |  79 |  80 |  81 |  ## 82 | ## 83 |  84 |  ## 85 | ## 86 |  87 |  ## 88 | ## 89 |  90 |  ## 91 | ## 92 |  93 |  ## 94 | ## 95 |  96 |  ## 97 | ## 98 |  99 |  ## 100 | ## 101 |  102 |  ## 103 | ## 104 |  105 |  ## 106 | ## 107 |  108 |  ## 109 | ## 110 |  111 |  ## 112 | ## 113 |  ## 114 |  ## 115 | 7 116 | 4 117 | 41 118 | ## 119 | ## 120 |  121 |  122 |  123 |  124 |  125 | ## 126 | ## 127 |  128 |  129 |  130 |  131 |  132 | ## 133 | ## 134 |  135 |  136 |  137 |  138 |  139 | ## 140 | ## 141 |  142 |  143 |  144 |  145 |  146 |  ## 147 |  ## 148 |  149 |  150 |  151 |  152 |  153 |  ## 154 |  ## 155 |  156 |  157 |  158 |  159 |  160 |  ## 161 |  ## 162 |  163 |  164 |  165 |  166 |  167 |  ## 168 |  ## 169 |  170 |  171 |  172 |  173 |  174 |  ## 175 |  ## 176 |  177 |  178 |  179 |  180 |  181 | ## 182 | ## 183 |  184 |  185 |  186 |  187 |  188 | ## 189 | ## 190 |  191 | ## 192 | ## 193 |  194 | ## 195 | ## 196 |  197 | ## 198 | ## 199 |  200 | ## 201 | ## 202 |  203 | ## 204 | ## 205 |  206 | ## 207 | ## 208 |  209 | ## 210 | ## 211 |  212 | ## 213 | ## 214 |  215 | ## 216 | ## 217 |  218 | ## 219 | ## 220 |  221 | ## 222 | ## 223 | 2 224 | 5 225 | 51 226 |  227 |  # 228 |  # 229 | ## # ##### 230 | 25 231 | 7 232 |  # 233 |  ### 234 | +---------------------------+ 235 | | H I G H S C O R E | 236 | +---------------------------+ 237 | | | 238 | | Paul Butterworth | 239 | | | 240 | | Software Designer | 241 | | | 242 | | VeriFone (UK) Ltd | 243 | | | 244 | | paul_b2@verifone.com | 245 | | | 246 | | 100114.230@compuserve.com | 247 | | | 248 | | pbutterworth@ | 249 | | cix.compulink.co.uk | 250 | | | 251 | | Please Play Again! | 252 | | | 253 | +---------------------------+ 254 |  255 | 256 | -------------------------------------------------------------------------------- /vt100/torturet.vt: -------------------------------------------------------------------------------- 1 | \<>PrEM1\[?4h 2 | #6(0a`opqrs`(B This is the (0`srqpo`a(B 3 | #3VT100 series Torture Test Demonstration. 4 | #4VT100 series Torture Test Demonstration. 5 | #6 Watch the blinking lights  6 |  7 |  8 |  9 | PrEM0\ 10 | 11 | This file is a VT100-series Torture Test. It demonstrates all the visual 12 | attributes of the VT100 terminal. 13 | 14 | The top line is double-width/single-height with inverse-video line-drawing 15 | characters. The 2nd and 3rd lines are double-width/double-height in bold 16 | inverse video. They also show the limited scrolling region. 17 | 18 | The remaining lines will show NORMAL, BOLD, BLINK, INVERSE, and all 16 19 | combinations of those 4 attributes. They show that there is a difference 20 | between an underscore character and the underline attribute, and that 21 | lower-case decenders go below the underline. 22 | 23 | A window pane is drawn in the lower right to show how the line-drawing set 24 | can be used. At the lower left is the character set double-wide/double-high 25 | to show the dot-matrix used. Upper-case characters are 8 by 7 in a 10 by 10 26 | character cell, with 1 blank row on top and 2 on the bottom. The underline 27 | attribute uses the first bottom blank row, lower-case decenders use both. 28 | 29 | 30 | 31 | This is a normal line __________________________________________________y_ 32 | This is a bold line (normal unless the Advanced Video Option is installed) 33 | This line is underlined _ " " " " " " _y_ 34 | This is a blinking line _ " " " " " " _y_ 35 | This is inverse video _ (underlined if no AVO and cursor is underline) _y_ 36 | Normal gjpqy Underline  Blink Underline+Blink gjpqy 37 | Bold gjpqy Underline  Blink Underline+Blink gjpqy 38 | Inverse Underline  Blink Underline+Blink 39 | Bold+Inverse Underline  Blink Underline+Blink 40 | PrEM1\ 41 | #6This is double width 42 | #3This is double height 43 | #4This is double height 44 | #6_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ioy 45 | #3_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ioy 46 | #4_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789ioy 47 | ACEGIKMOQSUWY02468iy 48 | _BDFHJLNPRTVXZ13579o 49 | _BDFHJLNPRTVXZ13579o 50 | (0#6`abcdefghijklmnopqrstuvwxyz{|}~ lqwqk 51 | #3`abcdefghijklmnopqrstuvwxyz{|}~ tqnqu 52 | #4`abcdefghijklmnopqrstuvwxyz{|}~ tqnqu 53 | acegikmoqsuwy{} 54 | `bdfhjlnprtvxz|~ 55 | `bdfhjlnprtvxz|~(B 56 | #6`abcdefghijklmnopqrstuvwxyz{|}~(0 mqvqj(B 57 | acegikmoqsuwy{} 58 | PrEM0\ $PrEM0 works on GIGI  59 | This test created by Joe Smith, 8-May-85  60 |  61 | 62 | -------------------------------------------------------------------------------- /vt100/valentin.vt: -------------------------------------------------------------------------------- 1 | 2 | (0 3 | #6 H A P P Y V A L E N T I N E ' S 4 | 5 | #6 D A Y 6 | 7 | 8 | ff ff 9 | f f f f 10 | f f f f 11 | f f f 12 | f BETH f 13 | f AND f 14 | f DAVE f 15 | f f 16 | f f 17 | f f 18 | f f 19 | f 20 |  21 |  22 |  23 |  24 |  25 |  26 |  27 |  28 |  29 |  30 | < 31 |