3 Commits
Author SHA1 Message Date
david 7519b719ba edited workflows so it's gitea now. this is release 1.1 ! ! !!! !
ci / linux (push) Successful in 49s
release / dist (push) Successful in 53s
release / build (push) Successful in 44s
release / release (push) Successful in 15s
2026-10-30 19:02:28 -03:00
david bfb4b6513f added teto
ci / unix (macos-15) (push) Canceled after 0s
ci / unix (macos-15-intel) (push) Canceled after 0s
ci / unix (ubuntu-24.04) (push) Canceled after 0s
ci / unix (ubuntu-24.04-arm) (push) Canceled after 0s
ci / windows (push) Canceled after 0s
ci / freebsd (push) Canceled after 0s
2026-10-30 18:49:09 -03:00
david effca97ac0 added teto
ci / unix (macos-15) (push) Canceled after 0s
ci / unix (macos-15-intel) (push) Canceled after 0s
ci / unix (ubuntu-24.04) (push) Canceled after 0s
ci / unix (ubuntu-24.04-arm) (push) Canceled after 0s
ci / windows (push) Canceled after 0s
ci / freebsd (push) Canceled after 0s
2026-10-30 18:00:06 -03:00
8 changed files with 347 additions and 204 deletions

No files matched your search

+14
View File
@@ -0,0 +1,14 @@
name: ci
on:
push:
branches: [main]
pull_request:
jobs:
linux:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./configure && make
- run: ./mikusays -V && ./mikusays "hi"
+71
View File
@@ -0,0 +1,71 @@
name: release
on:
push:
tags: ["v*"]
jobs:
# builds the source tarball (configure included) and checks tag == configure.ac version
dist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: install autotools
run: sudo apt-get update && sudo apt-get install -y autoconf automake
- run: autoreconf -fi
- run: touch configure configure.ac aclocal.m4 Makefile.in
- name: tag must match version in configure.ac
run: |
ver=$(./configure --version | head -1 | awk '{print $NF}')
test "v$ver" = "$GITHUB_REF_NAME"
- run: ./configure && make distcheck
- uses: actions/upload-artifact@v3
with:
name: dist
path: mikusays-*.tar.gz
# linux binary, built from the tarball (so it tests what packagers get)
build:
needs: dist
runs-on: ubuntu-latest
steps:
- name: install compiler
run: sudo apt-get update && sudo apt-get install -y build-essential
- uses: actions/download-artifact@v3
with:
name: dist
- name: build and package
run: |
VERSION=${GITHUB_REF_NAME#v}
tar xf mikusays-$VERSION.tar.gz
cd mikusays-$VERSION
./configure LDFLAGS="-static"
make
strip mikusays
./mikusays -V
./mikusays "hi" > /dev/null
out=mikusays-$VERSION-linux-x86_64
mkdir "$out"
cp mikusays LICENSE README.md "$out"/
tar czf ../"$out".tar.gz "$out"
- uses: actions/upload-artifact@v3
with:
name: bin-linux-x86_64
path: mikusays-*-linux-x86_64.tar.gz
release:
needs: [dist, build]
runs-on: ubuntu-latest
steps:
- uses: actions/download-artifact@v3
with:
path: artifacts
- name: checksums
run: |
cd artifacts
find . -mindepth 2 -type f -exec mv {} . \;
find . -type d -empty -delete
sha256sum * > SHA256SUMS
- uses: akkuman/gitea-release-action@v1
with:
files: artifacts/*
-49
View File
@@ -1,49 +0,0 @@
name: ci
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
unix:
strategy:
fail-fast: false
matrix:
os: [ubuntu-24.04, ubuntu-24.04-arm, macos-15, macos-15-intel]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- run: ./configure && make
- run: ./mikusays -V && ./mikusays "hi"
windows:
runs-on: windows-2025
defaults:
run:
shell: msys2 {0}
steps:
- uses: actions/checkout@v6
- uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
install: mingw-w64-ucrt-x86_64-gcc make
- run: ./configure && make
- run: ./mikusays.exe -V && ./mikusays.exe "hi"
# runs in a real FreeBSD VM with its stock cc + BSD make
freebsd:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- uses: vmactions/freebsd-vm@v1
with:
usesh: true
run: |
./configure
make
./mikusays -V
./mikusays "hi"
-116
View File
@@ -1,116 +0,0 @@
name: release
on:
push:
tags: ["v*"]
permissions:
contents: read
jobs:
# builds the source tarball (configure included) and checks tag == configure.ac version
dist:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v6
- name: install autotools
run: sudo apt-get update && sudo apt-get install -y autoconf automake
- run: autoreconf -fi
- run: touch configure configure.ac aclocal.m4 Makefile.in
- name: tag must match version in configure.ac
run: |
ver=$(./configure --version | head -1 | awk '{print $NF}')
test "v$ver" = "$GITHUB_REF_NAME"
- run: ./configure && make distcheck
- uses: actions/upload-artifact@v7
with:
name: dist
path: mikusays-*.tar.gz
# linux + macos binaries, built from the tarball (so it tests what packagers get)
build:
needs: dist
strategy:
fail-fast: false
matrix:
include:
- { name: linux-x86_64, os: ubuntu-24.04, ldflags: "-static" }
- { name: linux-aarch64, os: ubuntu-24.04-arm, ldflags: "-static" }
- { name: macos-arm64, os: macos-15, ldflags: "" }
- { name: macos-x86_64, os: macos-15-intel, ldflags: "" }
runs-on: ${{ matrix.os }}
env:
MACOSX_DEPLOYMENT_TARGET: "11.0"
steps:
- uses: actions/download-artifact@v8
with:
name: dist
- name: build and package
run: |
VERSION=${GITHUB_REF_NAME#v}
tar xf mikusays-$VERSION.tar.gz
cd mikusays-$VERSION
./configure LDFLAGS="${{ matrix.ldflags }}"
make
strip mikusays
./mikusays -V
./mikusays "hi" > /dev/null
out=mikusays-$VERSION-${{ matrix.name }}
mkdir "$out"
cp mikusays LICENSE README.md "$out"/
tar czf ../"$out".tar.gz "$out"
- uses: actions/upload-artifact@v7
with:
name: bin-${{ matrix.name }}
path: mikusays-*-${{ matrix.name }}.tar.gz
# windows exe via MSYS2/MinGW (configure needs a posix shell)
windows:
needs: dist
runs-on: windows-2025
defaults:
run:
shell: msys2 {0}
steps:
- uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
install: mingw-w64-ucrt-x86_64-gcc make zip
- uses: actions/download-artifact@v8
with:
name: dist
- name: build and package
run: |
VERSION=${GITHUB_REF_NAME#v}
tar xf mikusays-$VERSION.tar.gz
cd mikusays-$VERSION
./configure LDFLAGS="-static"
make
strip mikusays.exe
./mikusays.exe -V
./mikusays.exe "hi" > /dev/null
out=mikusays-$VERSION-windows-x86_64
mkdir "$out"
cp mikusays.exe LICENSE README.md "$out"/
zip -r ../"$out".zip "$out"
- uses: actions/upload-artifact@v7
with:
name: bin-windows-x86_64
path: mikusays-*-windows-x86_64.zip
release:
needs: [dist, build, windows]
runs-on: ubuntu-24.04
permissions:
contents: write
steps:
- uses: actions/download-artifact@v8
with:
path: artifacts
merge-multiple: true
- name: checksums
run: cd artifacts && sha256sum * > SHA256SUMS
- uses: softprops/action-gh-release@v2
with:
files: artifacts/*
generate_release_notes: true
Generated Vendored
+10 -10
View File
@@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.73 for mikusays 1.0.0. # Generated by GNU Autoconf 2.73 for mikusays 1.1.0.
# #
# #
# Copyright (C) 1992-1996, 1998-2017, 2020-2026 Free Software Foundation, # Copyright (C) 1992-1996, 1998-2017, 2020-2026 Free Software Foundation,
@@ -584,8 +584,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='mikusays' PACKAGE_NAME='mikusays'
PACKAGE_TARNAME='mikusays' PACKAGE_TARNAME='mikusays'
PACKAGE_VERSION='1.0.0' PACKAGE_VERSION='1.1.0'
PACKAGE_STRING='mikusays 1.0.0' PACKAGE_STRING='mikusays 1.1.0'
PACKAGE_BUGREPORT='' PACKAGE_BUGREPORT=''
PACKAGE_URL='https://git.squeakyrat.moe/mikusays-c' PACKAGE_URL='https://git.squeakyrat.moe/mikusays-c'
@@ -1281,7 +1281,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
'configure' configures mikusays 1.0.0 to adapt to many kinds of systems. 'configure' configures mikusays 1.1.0 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1348,7 +1348,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of mikusays 1.0.0:";; short | recursive ) echo "Configuration of mikusays 1.1.0:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@@ -1443,7 +1443,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
mikusays configure 1.0.0 mikusays configure 1.1.0
generated by GNU Autoconf 2.73 generated by GNU Autoconf 2.73
Copyright (C) 2026 Free Software Foundation, Inc. Copyright (C) 2026 Free Software Foundation, Inc.
@@ -1555,7 +1555,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by mikusays $as_me 1.0.0, which was It was created by mikusays $as_me 1.1.0, which was
generated by GNU Autoconf 2.73. Invocation command line was generated by GNU Autoconf 2.73. Invocation command line was
$ $0$ac_configure_args_raw $ $0$ac_configure_args_raw
@@ -3171,7 +3171,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='mikusays' PACKAGE='mikusays'
VERSION='1.0.0' VERSION='1.1.0'
printf '%s\n' "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf '%s\n' "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -5437,7 +5437,7 @@ cat >>"$CONFIG_STATUS" <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by mikusays $as_me 1.0.0, which was This file was extended by mikusays $as_me 1.1.0, which was
generated by GNU Autoconf 2.73. Invocation command line was generated by GNU Autoconf 2.73. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@@ -5497,7 +5497,7 @@ ac_cs_config_escaped=`printf '%s\n' "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1 cat >>"$CONFIG_STATUS" <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped' ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\ ac_cs_version="\\
mikusays config.status 1.0.0 mikusays config.status 1.1.0
configured by $0, generated by GNU Autoconf 2.73, configured by $0, generated by GNU Autoconf 2.73,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
+1 -1
View File
@@ -1,5 +1,5 @@
AC_PREREQ([2.69]) AC_PREREQ([2.69])
AC_INIT([mikusays], [1.0.0], [], [mikusays], [https://git.squeakyrat.moe/mikusays-c]) AC_INIT([mikusays], [1.1.0], [], [mikusays], [https://git.squeakyrat.moe/mikusays-c])
AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_SRCDIR([src/main.c])
AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_AUX_DIR([build-aux])
AM_INIT_AUTOMAKE([foreign subdir-objects -Wall]) AM_INIT_AUTOMAKE([foreign subdir-objects -Wall])
+185
View File
@@ -733,5 +733,190 @@ static char **mikuart[] = {
#define migucount (sizeof(mikuart)/sizeof(mikuart[0])) #define migucount (sizeof(mikuart)/sizeof(mikuart[0]))
static char *tetoart_0[] = {
"",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⢚⡫⠽⢗⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣞⠞⠁⠀⠀⠀⠈⠙⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠴⠚⠋⠉⠉⠉⢻⡟⠉⠉⠉⠛⠲⢤⡀⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠁⠀⠀⠀⠀⠀⠀⠘⠀⠀⠀⠀⠀⠀⠀⠉⠳⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡞⢀⠀⠀⢀⡠⠒⠉⠀⠀⠀⠘⣦⣀⠀⠉⠒⢦⡀⠀⠘⢦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⣀⢤⣤⣤⣒⣒⣒⣶⣖⣠⣴⣳⡠⠃⣠⠖⠁⠀⠀⠀⢠⠃⠀⠀⢸⡌⠳⣄⠀⠀⠙⣄⠀⠘⣇⢀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀",
"⢸⠺⣏⠉⠁⠀⠀⠉⠉⠉⣹⠇⡰⣡⠞⠁⡀⠀⠀⠀⣠⡎⠀⠀⠀⢨⡇⠀⠈⠢⡀⠀⠘⣆⠀⠸⡟⠛⠋⠉⠛⠛⠻⠿⠿⢯⣶",
"⠈⡦⢄⣉⠒⠒⠀⠒⢒⣩⣿⣼⡿⡁⠤⡼⢂⣀⢀⡴⢻⠁⠀⠀⠀⢸⠱⡀⠀⠀⠀⠀⠀⠈⢆⢣⣗⣦⠤⣀⣀⣀⣀⠤⠖⠫⡾",
"⠀⢯⠒⠦⠬⠍⠙⢧⣤⡤⠟⠋⣁⣠⠟⠀⣠⠴⠋⠀⢸⠀⠀⠀⢠⠟⠒⠳⣄⠀⠀⢰⡀⠀⠈⠣⡧⣉⣓⠒⠠⠤⠄⠒⠂⣩⡇",
"⠀⠸⣯⣓⣒⣒⣒⣒⣲⠯⣿⢉⡵⠋⣠⢞⣿⣿⣦⠢⢸⢠⠇⣠⢋⡀⢀⣀⣈⠢⣀⠀⠻⡦⣤⣀⣬⡿⠯⣍⣉⣀⣀⣤⠬⢴⠁",
"⠀⠀⢇⠉⠉⠉⠉⢁⣒⣭⢿⣫⢴⣻⡇⢸⣈⢿⡤⡇⢰⣞⡜⠁⢠⣾⣿⡿⢿⠻⡏⠓⠦⣝⣦⣟⡷⣉⠙⠓⠒⠶⠶⠶⠟⡇⠀",
"⠀⠀⣯⣉⠉⠉⣉⣙⡿⢿⣿⢇⡎⢸⡃⠈⠣⠤⠝⢀⠞⠋⠀⠀⠀⣧⠜⠣⡺⢠⡃⠀⠀⡎⢻⠋⢿⣫⢝⡒⠲⠤⠤⠤⢖⡇⠀",
"⠀⠀⢻⢛⡻⠯⠥⠤⠖⠋⣾⢸⣼⠸⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠒⠚⢁⡼⡇⠀⣾⢠⡏⠀⢸⣝⠯⣙⣒⣲⣶⣲⢖⡇⠀",
"⠀⠀⠘⠦⠴⠿⠛⣲⣺⣿⠁⠀⠱⣦⡗⣿⣗⡤⣄⣀⠐⠤⠤⠀⠀⠀⠀⢀⣨⢴⣁⡾⠷⠏⠀⠀⠘⢢⡥⣤⣀⣀⣀⣒⣹⠀⠀",
"⠀⠀⠀⠀⠸⣉⣉⣹⠾⠋⠀⠀⠀⠁⠙⠊⠛⠾⢇⡽⣿⣿⣗⣲⣶⠿⡍⠉⠰⠟⠁⠀⠀⠀⠀⠀⠀⠸⣍⠺⣦⡤⢤⠈⠁⠀⠀",
"⠀⠀⠀⠀⠀⠀⠳⢾⣄⡀⠀⠀⠀⠀⠀⠀⠀⣠⠿⣏⣈⢹⣏⣉⣧⡰⢿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢩⣳⡞⠋⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⢀⡴⠁⢀⡟⠜⣦⡟⠶⠛⢻⡓⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠒⠛⠁⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⣿⡿⢢⢫⠇⠀⡷⡇⠀⠀⠸⣷⠀⢈⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⡛⣫⡴⢣⣾⡦⢤⣷⣇⣀⣠⠤⡷⣧⠿⠟⣳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠀⡰⣻⡹⠁⠀⡇⠀⡇⠀⢇⠘⣜⣦⣼⢚⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠳⢗⣒⣤⣇⣀⣥⣒⣚⢭⣽⠊⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡧⠤⠤⡏⡧⠹⠮⢿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⡇⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⡇⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠀⠘⠛⠛⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
NULL
};
static char * tetoart_1[] = {
"",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣠⣬⣤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⢠⣶⠟⣿⣿⣿⣿⣿⣿⣿⣿⣷⣤⡀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⢠⣿⠏⣼⣿⣿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⣾⣿⡆⣿⣿⡃⣿⣧⣝⢿⡻⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀",
"⠀⠀⠀⠀⢸⣿⣿⣿⢸⣿⣴⣾⣿⣿⣯⣳⣜⢿⣿⣿⣿⣿⡇⠀⠀⠀",
"⠀⠀⠀⠀⡌⣿⣿⣿⡈⣿⢀⣤⣤⣭⡉⠙⢿⡏⣿⣿⣿⣿⡇⠀⠀⠀",
"⠀⠀⠀⢀⢸⡟⣿⣿⢷⡌⢸⣿⣿⣿⣿⣷⡜⢷⣿⣿⣿⣿⡇⠀⠀⠀",
"⠀⠀⠀⠸⢘⡀⢻⣿⣦⡀⣙⡛⠛⠛⠿⠿⠿⢸⣿⣿⣿⣿⠃⠀⠀⠀",
"⠀⠀⠀⠀⢰⠀⢠⣍⠙⠻⣿⣿⣿⣷⣶⣦⠀⣾⣿⣿⣿⠃⠀⠀⠀⠀",
"⠀⠀⠀⠀⠈⢦⣾⢹⣿⣦⢘⣋⡁⠀⠀⢙⠃⣿⣿⠟⠁⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠈⢻⣾⣿⡏⠸⣿⡿⠿⠿⠟⢀⣡⣄⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠈⣾⠟⠀⠀⠠⢤⣼⣿⣆⢻⣿⣿⣷⡀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠘⠁⣊⣐⡀⣴⣶⡼⠟⣡⣾⣿⣿⣿⣷⡀⠀⠀⠀⠀",
"⠀⠀⠀⠀⡀⠀⢀⣴⣿⣿⣿⠿⠋⠀⠘⣻⣿⡿⢻⣿⣿⣿⢆⠀⠀⠀",
"⠀⠀⠀⣠⡅⠐⢿⣙⠾⠿⠁⣰⣶⡾⢘⣋⣩⣾⡆⣿⣿⣿⣿⡆⠀⠀",
"⠀⠀⠀⣿⡇⠀⠀⠙⠷⢷⣶⣭⣍⡁⣾⣿⣿⣿⡗⣿⣿⣿⣿⠇⠀⠀",
"⠀⠀⠀⢿⡇⠀⠀⠀⠀⠀⣿⣶⣶⡄⢿⡛⠛⠛⠛⣸⠿⢏⠉⠀⠀⠀",
"⠀⠀⠀⠀⠃⠀⠀⠀⠀⠀⠙⠛⠛⠁⠀⠈⠁⠀⠁⠀⠀⠀⠀⠀⠀⠀",
NULL
};
static char *tetoart_2[] = {
"",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠴⠶⠖⠒⠒⠲⠶⠦⣤⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣟⣆⣧⣤⣶⣶⣶⣦⣤⣤⣤⣄⣀⡇⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⠀",
"⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⡀⠀⠀⣸⡿⠟⠛⠛⠛⠛⠛⠛⠛⠛⠋⠉⠙⠓⢦⣀⣠⠴⠶⠚⠉⠉⠀⠘⡇",
"⠀⠀⠀⠀⠀⠀⣼⠁⠀⠀⠉⠉⣹⡿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠰⣦⢸⡋⠁⠀⠀⠀⠀⠀⠀⠀⠀⢹",
"⠀⠀⠀⠀⠀⠀⡿⠀⠀⠀⠀⢠⡟⠁⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘",
"⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⡿⠀⠀⠀⢸⠇⠀⠀⠀⠀⠀⣷⠀⠀⠀⠀⠀⠈⢿⣆⠀⠀⠀⠀⢀⣤⣤⣴⣾",
"⠀⠀⠀⠀⠀⠈⣳⣶⣤⣤⢸⠇⠀⠀⠀⢸⡀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠈⣿⡀⠀⠀⠀⠀⠀⠀⠀⠘",
"⠀⠀⠀⠀⠀⠀⡿⠀⠀⠀⢸⠀⠀⠀⢀⣸⡇⠀⠀⠀⠀⠀⢸⣧⡴⠆⠀⠀⠀⠀⠸⣟⣶⡶⠖⠀⠀⠀⠀⣀",
"⠀⠀⠀⠀⠀⠀⣇⡀⠀⠀⣿⠀⠀⠀⢨⡟⢳⡒⠀⠀⠀⠈⡟⠉⠻⣤⠀⠀⠀⠀⣀⢻⣿⡀⠀⠀⠠⠾⠟⢳",
"⠀⠀⠀⠀⠀⠀⢠⠟⠛⠀⣿⣾⠀⢀⣾⠀⠈⢳⣼⣷⣄⢰⠇⠀⠀⠈⠓⢦⣄⣀⡙⢷⣿⣷⠀⠀⠀⠀⠀⢸",
"⠀⠀⠀⣾⡳⣄⢸⡀⠀⠐⢿⢇⣠⡟⢻⡀⠀⣀⣽⡿⠈⠉⠀⣰⣶⣆⣠⣼⢧⡟⠹⣍⡟⠈⢻⠖⠀⠀⣴⠚",
"⠀⠀⠀⢻⠀⢻⡀⠳⣤⡄⠘⠛⣯⢻⣹⣟⠛⢛⠋⠁⠀⠀⠀⠉⠉⠩⠍⢸⣼⠁⡼⠋⠀⠀⠘⠦⠤⣄⢈⡿",
"⠀⠀⠀⣠⣇⠀⣧⢺⣍⢠⡴⠶⠋⠈⢻⣿⣆⠀⠀⠀⣴⠚⠙⢷⠀⢀⡴⠿⠷⠚⠁⠀⠀⠀⠀⠀⢠⠿⠋⠀",
"⠀⡴⠺⡅⠘⣆⠘⣆⠉⠻⢧⠀⠀⠀⠀⠈⠈⠙⠢⢤⣘⣦⣤⡼⢶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⢰⢷⡀⢻⡀⢿⠀⠙⠚⠛⠛⣦⠀⠀⠀⠀⢀⣀⣠⣤⢞⡟⠒⠒⠺⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠘⣦⡻⣤⠿⠚⠀⢀⡶⠋⠉⠉⠀⠀⢀⡴⡏⣽⣽⣳⣿⣇⠀⠀⣴⣿⣷⠶⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠈⡿⠗⠀⠒⠒⢻⡄⠀⠀⠀⠀⣠⢞⣽⢱⣿⡟⣿⣿⣿⣤⢾⢿⢇⣹⠀⣿⠸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠓⣶⠒⠒⠒⢿⠀⠀⢀⣄⡾⡿⢊⡏⡞⡼⣸⣿⣿⢹⠓⠚⠚⢼⡿⠀⣿⠀⡀⠀⠀⠀⠀⠀⠀⢀⠀⠀",
"⠀⠀⠀⢻⠀⠀⠀⠘⡆⣴⢋⢜⠻⣴⣿⢹⢿⢷⣿⣿⣿⠈⣽⢿⠖⢿⠁⠀⡗⠀⡀⠀⠀⠀⠀⠀⠀⢸⠙⠆",
"⠀⠀⠀⠈⡇⠀⠀⠀⢻⠡⡫⣋⢎⢝⣇⣏⡎⣾⣿⣿⡟⢸⣾⣼⢸⢸⡀⠀⡇⠀⡇⠀⠀⠀⠀⠀⢀⡜⠀⠰",
NULL
};
static char *tetoart_3[] = {
"",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣈⡧⠖⠚⠉⠉⠀⠀⠀⠀⠀⠘⡆⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⡴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡞⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢧⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⢀⡜⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠦⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣨⡆⠀",
"⠀⠀⠀⠀⠀⠀⢀⡎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⢀⡨⠻⣗⢄⠀⠀⣀⣠⡤⣤⠔⠛⢩⠟⠀⠀",
"⠀⢀⣀⡤⠤⠤⣾⠀⠀⠀⠀⠰⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣆⠀⠀⠀⢀⡀⢤⡒⠥⠒⠉⠘⢯⡽⢿⠉⢀⣴⣁⣤⠴⠧⡄⠀⠀",
"⠁⠀⠀⠀⠀⠀⡇⠁⠒⠀⠀⠀⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣆⠀⢀⡴⠉⠳⣄⠀⠀⠀⠀⠀⠻⣼⣖⠋⠁⠀⠀⠀⠀⢹⡀⠀",
"⠀⠀⠀⠀⠀⠀⡇⠐⠒⠂⠤⠤⠤⡿⣄⠤⠤⠀⠀⠀⠀⠀⠀⠀⣽⣾⣋⠀⠀⠀⠈⠃⠀⠀⠀⠀⠀⠀⠺⠿⣤⠀⠀⠀⣀⡤⡿⠀",
"⡄⠀⠀⠀⠀⠀⣹⠀⠀⠀⠀⠀⢠⣇⠘⢦⠀⠀⠀⠀⠀⠀⠰⠏⣽⡟⠉⠉⠓⣶⣴⣤⡀⣽⠦⠤⠴⡶⠚⠉⠁⣀⣴⠞⠁⡼⠃⠀",
"⠈⡆⢀⡴⠲⠯⣭⡆⠀⠀⠀⠀⢸⡱⠉⠩⠿⣖⠂⣄⠀⠀⠀⠀⢀⣧⣶⣶⣿⣿⣯⣿⣷⠺⡄⠀⠀⡿⠤⢞⣩⣾⣥⡤⠾⠓⠙⡇",
"⠀⠙⠯⠤⠤⣤⡴⠻⡄⠀⠀⠀⡞⠁⠀⠀⢀⣈⣳⣼⠛⢦⣀⠀⢲⣿⣿⡿⣿⡇⢹⡟⠛⠀⡧⠀⢠⡇⠀⠘⡆⠀⠀⠀⠀⠀⢠⡇",
"⠀⠀⠀⠸⣍⠁⠀⠀⡇⠀⠀⣸⡇⣶⠿⣿⣿⣿⣷⡮⠀⠀⠈⠉⠓⠋⠘⢷⡬⠔⠋⡇⠀⠀⢧⠀⡼⠀⠀⠀⠉⠒⢠⡤⠤⣶⠞⠁",
"⠀⠀⠀⠀⠈⠳⣄⣤⣿⡄⣰⣽⢻⡹⣆⠘⣿⡛⢻⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⢸⠸⣅⠀⠀⠀⢰⠏⠙⢶⣋⣁⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⡿⢽⡏⢧⠀⠀⠈⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⡼⠒⠚⠳⠀⠀⠈⠓⠦⠤⠼⠛⠁⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠈⠋⢧⠘⡇⠘⣇⠀⠀⠀⠀⠀⠀⠀⣠⠴⣒⡦⢤⡀⠀⠀⢀⣿⠀⢠⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠓⠿⡄⢸⣦⣀⠀⠀⠀⠀⠀⡟⠉⠀⠀⠀⣳⢀⡴⠋⢸⣄⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣛⠋⣳⣰⡇⠈⠛⠲⠤⣄⣀⣙⠦⠤⢤⣲⠵⠋⣀⣤⣼⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀⠛⠀⠀⠀⠀⠀⠀⣠⣿⣿⣭⡉⣠⣴⠿⡛⢉⣻⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣠⣄⣀⣰⣿⢻⣷⣔⣿⣗⢀⣠⣶⣿⣿⣿⣿⢦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠋⠁⠀⠑⡀⣿⣶⣴⣼⣿⣿⣿⢿⣿⣿⢿⣿⡿⠏⣡⠿⠉⠀⢨⣿⡟⡩⠏⠉⠉⠓⠶⡄⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⢸⢿⡿⠿⠿⢿⣆⠙⣿⣻⣿⣿⢉⣡⡾⠃⠀⠀⠀⠨⣿⡏⠀⠀⠀⠀⠀⠀⢹⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡇⠀⠀⠀⠀⠀⡞⠀⠏⠂⠢⡀⢹⣿⣿⣽⣿⣿⠾⠯⠀⠄⠤⠀⠔⠚⢸⠃⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠈⠁⣿⡿⣿⠛⡟⣴⠈⠁⠀⠀⠀⠀⠀⢸⠁⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⢀⡾⠚⠛⠛⠐⠒⢶⣤⡇⡇⣿⢰⣿⢃⡤⠖⠚⠉⠙⠓⠲⡏⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⠀⠀⠀⢠⣼⢷⣄⣿⡿⢀⣠⣾⣼⠁⠀⣿⣼⠃⣟⠀⠀⠰⣶⡆⣠⣴⣧⠀⠀⠀⠀⠀⠀⠀⡏⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⢀⢦⣿⡀⠈⣿⠏⠉⢱⡇⢿⣶⣿⣿⡏⠀⡽⠉⠛⠛⣿⠛⡉⣸⠈⢄⡀⠀⠀⠀⠀⢰⡇⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⣤⠾⠒⠒⢳⣾⠀⠉⠂⡏⠀⠀⣾⡇⢸⣿⠻⢿⠁⠀⡇⠀⠀⠀⣿⢠⡇⣿⠶⠒⠛⠉⠉⠉⠙⢚⡆⠀⠀⠀",
NULL
};
static char *tetoart_4[] = {
"",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠞⠉⠐⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣿⡃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣻⡟⢯⣛⢿⣿⣷⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⢷⣫⢇⣟⣣⠟⣮⢞⣯⡝⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⢀⣶⣾⣿⣿⣿⣿⣿⣿⡿⢉⣾⢱⢏⣶⣿⢿⣸⣉⣷⢹⣆⣿⣷⣰⣶⣰⣶⣆⡀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠘⣾⣭⢩⣝⣿⣻⣿⣟⣵⡋⣤⣿⢿⠿⡟⢚⣵⣿⢿⣶⢿⡾⣿⣿⣿⢿⣿⣿⣿⣿⡆",
"⠀⠀⠀⠀⠀⠀⠀⠀⢳⢾⡋⠼⣿⣯⣷⡿⢧⣿⡻⠟⠁⢀⣏⣟⡟⠁⠈⢻⣯⢿⣿⣿⣿⠲⠴⣾⡿⣿⠇",
"⠀⠀⠀⠀⠀⠀⠀⠀⢘⣿⣷⣿⣾⣿⣿⣫⣿⡾⣷⣮⠁⢰⡾⠋⣴⣤⣤⡀⣿⣯⢿⣟⣿⣓⡻⢳⣻⡟⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣶⠶⣯⣿⣿⣿⣧⠃⠹⠋⠀⠀⠀⠀⠸⣻⠏⡿⣿⣿⣿⣿⣟⡛⣿⣿⡏⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣟⣹⣿⠟⣿⣿⡀⠀⠀⠀⠠⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣩⣽⣾⠿⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢯⣷⠀⠈⡟⡿⠢⢀⠁⠀⠈⠁⢀⡤⢺⠟⠛⠋⢹⣅⣫⢿⠟⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⠀⠀⠈⠋⢉⣀⢗⡠⠔⣞⡁⠀⠋⠀⠀⠀⠈⣿⠆⠁⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠄⠀⣤⣴⣶⣿⡏⠀⠁⠃⠘⣿⣦⣴⣶⣤⢄⡐⠉⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡐⠁⠀⠀⣿⣞⣿⣿⢧⡀⠀⣀⣾⣿⣿⣿⡿⠁⠀⠈⢂⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣆⡀⠀⠀⢰⢹⣭⣿⣿⣿⣿⣾⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⡆⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣆⠀⣾⣿⣧⢿⣽⣿⢻⢿⣯⢿⣿⣿⣇⡄⠀⢠⣤⣶⡇⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⣿⣿⡿⢚⣿⢿⡻⢿⣿⢾⢫⢾⣽⣫⢿⣿⣿⣿⡄⠈⠉⠁⠠⠀⠀⠀⠀⠀⠀",
"⠀⠀⣠⣶⣿⣿⣿⣿⣿⣿⠟⠁⠀⠸⣯⢷⣛⣯⣿⣿⠿⣿⣾⣯⢷⡞⣽⣿⣷⣀⡠⣴⣾⣄⠀⠀⠀⠀⠀",
"⢠⣿⡻⣼⣹⣯⣿⣿⡟⠁⠀⠀⠀⠀⣿⢿⡻⣟⢷⡏⢾⣿⢺⡟⣿⢻⣿⣿⠃⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀",
"⠸⣸⣿⢱⣇⢿⣸⢿⣇⠀⠀⠀⠀⠀⣿⣇⡿⣾⢹⣏⣹⣏⡷⢿⣸⢏⣿⣿⠀⢸⣿⣿⣿⡿⡆⠀⠀⠀⠀",
"⠀⠘⠬⡑⠌⠛⠮⣏⣿⣵⣄⠀⠀⢸⣿⣜⣳⣭⣿⢽⣻⡿⣼⢻⡜⣯⣿⡇⠀⠈⣿⣿⢿⡿⣇⠀⠀⠀⠀",
"⠀⠀⠀⠈⢳⣾⣔⣨⣗⢯⣿⣷⣄⡾⣿⣜⣳⢮⣿⣧⢻⡷⣭⡗⣯⣳⣿⣗⠀⠀⢻⡽⣾⣽⡿⡀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠙⢿⣿⣿⣯⣿⣿⣿⢀⣿⡾⣱⣯⣿⣽⣻⡽⣖⢯⣷⡿⣯⣏⠀⠀⠈⡷⣏⡿⣿⡗⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠻⣿⣿⣟⠯⣿⣳⣻⣿⣳⡽⣟⠻⣻⡿⣭⣿⢯⡽⣾⣿⡄⠀⠀⢿⣱⣏⣿⠳⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣻⡱⢎⣷⡯⣿⣿⣿⣷⣿⣿⣿⣛⡮⣗⣿⣿⣿⣿⡄⠀⢺⣷⢺⣿⣿⡀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⢠⡴⣿⣿⣷⣞⣿⡷⣿⢿⣿⣿⣟⢶⣯⢳⣿⣿⣿⣿⣿⣷⡀⢸⣷⣻⡿⢿⡅⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠃⠈⢹⢹⣿⡳⢯⣟⣿⡿⣿⣿⣿⣿⣿⣾⣿⢿⡿⣿⣿⣿⣿⣿⣽⢶⡛⣷⢦⡇⠀⠀",
NULL
};
static char *tetoart_5[] = {
"",
"⠀⠀⠀⠀⠀⠀⠀⠀⣠⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠻⡿⠆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢘⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠿⠥⠤⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⡠⡄⣤⠀⠀⠀⢀⠃⣷⡄⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠠⠀⠆⠀⠀⠐⠀⠈⠀⠨⠂⡄⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠚⠀⠠⠀⠀⠀⠀⢀⠀⠈⠐⣠⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠐⠀⠀⠀⠂⠀⠀⡀⠀⠀⠂⢁⢊⡅⠀⠀⠀⠀",
"⠀⠀⠀⠀⢀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠄⠀⠂⡐⢼⡀⠀⠀⠀",
"⠀⠀⠀⠀⠂⠀⠀⠀⠂⠀⠀⣆⠀⠀⠀⠈⠄⠀⡔⣣⠀⠀⠀",
"⠀⠀⠀⡡⠊⢆⠀⡀⠀⠀⡇⠈⠣⡀⠀⠀⠡⠀⠌⠐⣣⠀⠀",
"⠀⡐⣬⢑⡅⢊⢎⣛⢬⡅⢧⠡⣂⣀⣄⠀⠈⠠⠈⠠⢘⢧⠀",
"⢀⢱⡖⣍⣿⣧⠀⠣⣧⠓⠀⡜⣅⣿⣿⣧⢀⠐⠀⠂⢤⠭⡂",
"⠠⠸⢇⠻⣿⡟⠂⠀⠘⢷⠀⠈⢿⣿⡿⡻⡉⠄⡁⠀⢀⠨⡆",
"⠨⠀⠀⠀⠀⠀⠀⠐⠀⠀⠀⠀⠀⠀⠈⠀⠣⠀⠄⠐⠀⢁⡂",
"⠈⡀⠀⠀⠀⠀⠀⢤⣀⣀⣠⠆⠀⠀⠀⠀⠁⠐⠌⠄⡠⢷⠃",
"⠀⠐⡠⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠁⠀⡃⠠⣂⢢⡜⠀",
"⠀⠀⠈⢄⠁⢀⠀⡀⠀⠀⡀⠀⠠⠀⠀⠀⡠⠀⢁⢒⠈⠀⠀",
"⠀⠀⠀⠀⠐⠠⡀⠂⠈⠄⠀⣀⠀⠈⢂⠈⠠⡰⠖⠁⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠉⠛⠷⣶⢾⣼⣧⡿⠷⠋⠁⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
"⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀",
NULL
};
static char **tetoart[] = {
tetoart_0,
tetoart_1,
tetoart_2,
tetoart_3,
tetoart_4,
tetoart_5,
};
#define tetocount (sizeof(tetoart)/sizeof(tetoart[0]))
#endif #endif
+66 -28
View File
@@ -1,10 +1,15 @@
#include "../defs/all.h" #include "../defs/all.h"
#include "../defs/mikuart.h" #include "../defs/mikuart.h"
char **getmikuart(int style){ char **getmikuart(int style, int isteto){
if(isteto == 0){
if(style < 0)
style = rand() % migucount;
return mikuart[style];
}
if(style < 0) if(style < 0)
style = rand() % migucount; style = rand() % tetocount;
return mikuart[style]; return tetoart[style];
} }
struct win { struct win {
@@ -232,7 +237,10 @@ static void print_help(void){
" [TEXT] Text to display in the speech bubble\n\n" " [TEXT] Text to display in the speech bubble\n\n"
"Options:\n" "Options:\n"
" -s, --style <STYLE> Style of the Miku art. A random one is chosen if not specified\n" " -s, --style <STYLE> Style of the Miku art. A random one is chosen if not specified\n"
" -l, --list List all available art styles with their indices\n" " -l, --list List all available art (miku and teto) styles with their indices\n"
" -lm, --listmiku List only the Miku art styles\n"
" -lt, --listteto List only the Teto art styles\n"
" -t, --teto Use Teto art instead of Miku\n"
" --rainbow Apply a smooth rainbow gradient across the ASCII art\n" " --rainbow Apply a smooth rainbow gradient across the ASCII art\n"
" --saturation <SATURATION> Saturation level for rainbow gradient (0-100) [default: 100]\n" " --saturation <SATURATION> Saturation level for rainbow gradient (0-100) [default: 100]\n"
" --brightness <BRIGHTNESS> Brightness level for rainbow gradient (0-100) [default: 50]\n" " --brightness <BRIGHTNESS> Brightness level for rainbow gradient (0-100) [default: 50]\n"
@@ -244,18 +252,33 @@ static void print_help(void){
" -V, --version Print version\n"); " -V, --version Print version\n");
} }
static void list_all_art_styles(void){ #define LIST_NONE 0
printf("Available Miku art styles:\n"); #define LIST_BOTH 1
printf("==========================\n"); #define LIST_MIKU 2
printf("Total styles: %zu\n", migucount); #define LIST_TETO 3
for(size_t i = 0; i < migucount; i++){ static void list_art_group(const char *name, char ***art, size_t total){
printf("\n--- Style %zu ---\n", i); printf("%s styles (total: %zu)\n", name, total);
for(int j = 0; mikuart[i][j] != NULL; j++) printf("==========================\n");
printf("%s\n", mikuart[i][j]); for(size_t style_index = 0; style_index < total; style_index++){
printf("\n--- %s style %zu ---\n", name, style_index);
for(int line_index = 0; art[style_index][line_index] != NULL; line_index++)
printf("%s\n", art[style_index][line_index]);
} }
}
static void list_all_art_styles(int list_mode){
printf("Available art styles:\n\n");
if(list_mode == LIST_BOTH || list_mode == LIST_MIKU)
list_art_group("Miku", mikuart, migucount);
if(list_mode == LIST_BOTH)
printf("\n");
if(list_mode == LIST_BOTH || list_mode == LIST_TETO)
list_art_group("Teto", tetoart, tetocount);
printf("\nUse --style <number> to select a specific style, or omit for random selection.\n"); printf("\nUse --style <number> to select a specific style, or omit for random selection.\n");
printf("Use --teto to pick from the Teto styles instead of the Miku ones.\n");
printf("\nColor Options:\n" printf("\nColor Options:\n"
" --rainbow Apply a smooth rainbow gradient\n" " --rainbow Apply a smooth rainbow gradient\n"
@@ -334,11 +357,11 @@ static void print_art_line(const char *line, size_t *index, size_t total){
} }
void draw_miku_says(char *text, int style){ void draw_miku_says(char *text, int style, int teto){
char **speech_bubble_lines = getbubblelines(text); char **speech_bubble_lines = getbubblelines(text);
if(speech_bubble_lines == NULL) if(speech_bubble_lines == NULL)
return; return;
char **miku_art = getmikuart(style); char **miku_art = getmikuart(style, teto);
int available_width = TERMINALWIDTH; int available_width = TERMINALWIDTH;
int available_height = TERMINALHEIGHT; int available_height = TERMINALHEIGHT;
@@ -525,12 +548,16 @@ static int parse_gradient(const char *specification, rgbcolor *start, rgbcolor *
int main(int argc, char **argv){ int main(int argc, char **argv){
long style = -1; //-1 means random long style = -1; //-1 means random
int index, result = 0, list_requested = 0, color_debug = 0, no_color = 0; int index, result = 0, list_requested = 0, color_debug = 0;
#ifdef _WIN32
int no_color = 0;
#endif
int has_text = 0, options_ended = 0, ansi_enabled = 0; int has_text = 0, options_ended = 0, ansi_enabled = 0;
const char *value, *color_text = NULL, *gradient_text = NULL; const char *value, *color_text = NULL, *gradient_text = NULL;
ColorParseError color_error; ColorParseError color_error;
size_t length = 0; size_t length = 0, art_total;
char *text; char *text;
int areyouteto = 0;
srand(time(NULL)); srand(time(NULL));
getterminalsize(); getterminalsize();
@@ -558,15 +585,25 @@ int main(int argc, char **argv){
printf("mikusays " VERSION "\n"); printf("mikusays " VERSION "\n");
goto out; goto out;
} else if(strcmp(argument, "-l") == 0 || strcmp(argument, "--list") == 0){ } else if(strcmp(argument, "-l") == 0 || strcmp(argument, "--list") == 0){
list_requested = 1; list_requested = LIST_BOTH;
} else if(strcmp(argument, "--no-color") == 0){ } else if(strcmp(argument, "-lm") == 0 || strcmp(argument, "--listmiku") == 0){
no_color = 1; list_requested = LIST_MIKU;
colors.mode = MODE_NONE; } else if(strcmp(argument, "-lt") == 0 || strcmp(argument, "--listteto") == 0){
}else if(strcmp(argument, "--rainbow") == 0){ list_requested = LIST_TETO;
}
#ifdef _WIN32
else if(strcmp(argument, "--no-color") == 0){
no_color = 1;
colors.mode = MODE_NONE;
}
#endif
else if(strcmp(argument, "--rainbow") == 0){
colors.rainbow_enabled = true; colors.rainbow_enabled = true;
} else if(strcmp(argument, "--color-debug") == 0){ } else if(strcmp(argument, "--color-debug") == 0){
color_debug = 1; color_debug = 1;
} else if(match_value_option(argc, argv, &index, "--style", 's', &value)){ } else if(strcmp(argument, "--teto") == 0 || strcmp(argument, "-t") == 0){
areyouteto = 1;
}else if(match_value_option(argc, argv, &index, "--style", 's', &value)){
char *end; char *end;
long parsed; long parsed;
if(value == NULL){ if(value == NULL){
@@ -621,7 +658,7 @@ int main(int argc, char **argv){
} }
if(list_requested){ if(list_requested){
list_all_art_styles(); list_all_art_styles(list_requested);
goto out; goto out;
} }
if(!has_text){ if(!has_text){
@@ -629,9 +666,10 @@ int main(int argc, char **argv){
result = 1; result = 1;
goto out; goto out;
} }
if(style >= (long)migucount){ art_total = areyouteto ? tetocount : migucount;
result = usage_error("style %ld does not exist; choose a value between 0 and %lu", if(style >= (long)art_total){
style, (unsigned long)(migucount - 1)); result = usage_error("style %ld does not exist for %s; choose a value between 0 and %lu",
style, areyouteto ? "Teto" : "Miku", (unsigned long)(art_total - 1));
goto out; goto out;
} }
@@ -658,9 +696,9 @@ int main(int argc, char **argv){
goto out; goto out;
} }
draw_miku_says(text, (int)style); draw_miku_says(text, (int)style, (int)areyouteto);
//i didn't know you could do labels like in assembly (nasm) this is very useful knowledge //i didn't know you could do labels like in assembly (nasm) this is very useful knowledge
out: out:
free(text); free(text);
return result; return result;
} //ooooo 666 lines spookyyy evillll }