Add architecture docs and humanize use case copy

This commit is contained in:
Ajax Davis 2026-01-21 07:37:04 +10:00
parent ad974239fd
commit c5a17a0a69
24 changed files with 1969 additions and 1468 deletions

View file

@ -1,67 +0,0 @@
#!/bin/bash
printf "\n\033[1m WALKING DOWN\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;255;200;50m▄███▄\033[0m \033[38;2;255;200;50m▄███▄\033[0m \033[38;2;255;200;50m▄███▄\033[0m \033[38;2;255;200;50m▄███▄\033[0m\n"
printf " \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m\n"
printf " \033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[38;2;0;0;0m██\033[38;2;255;200;50m█\033[0m\n"
printf " \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m\n"
printf " \033[38;2;255;200;50m███\033[0m \033[38;2;255;200;50m███\033[0m \033[38;2;255;200;50m███\033[0m \033[38;2;255;200;50m███\033[0m\n"
printf " \033[38;2;139;90;43m▄█████▄\033[0m \033[38;2;139;90;43m▄█████▄\033[0m \033[38;2;139;90;43m▄█████▄\033[0m \033[38;2;139;90;43m▄█████▄\033[0m\n"
printf " \033[38;2;139;90;43m███\033[38;2;255;215;0m█\033[38;2;139;90;43m███\033[0m \033[38;2;139;90;43m███\033[38;2;255;215;0m█\033[38;2;139;90;43m███\033[0m \033[38;2;139;90;43m███\033[38;2;255;215;0m█\033[38;2;139;90;43m███\033[0m \033[38;2;139;90;43m███\033[38;2;255;215;0m█\033[38;2;139;90;43m███\033[0m\n"
printf " \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m\n"
printf " \033[38;2;139;90;43m█████\033[0m \033[38;2;139;90;43m█████\033[0m \033[38;2;139;90;43m█████\033[0m \033[38;2;139;90;43m█████\033[0m\n"
printf " \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m\n"
printf " \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m\n"
printf "\n\033[1m WALKING UP\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;255;200;50m▄███▄\033[0m \033[38;2;255;200;50m▄███▄\033[0m \033[38;2;255;200;50m▄███▄\033[0m \033[38;2;255;200;50m▄███▄\033[0m\n"
printf " \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m\n"
printf " \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m \033[38;2;255;200;50m███████\033[0m\n"
printf " \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m\n"
printf " \033[38;2;255;200;50m███\033[0m \033[38;2;255;200;50m███\033[0m \033[38;2;255;200;50m███\033[0m \033[38;2;255;200;50m███\033[0m\n"
printf " \033[38;2;139;90;43m▄█████▄\033[0m \033[38;2;139;90;43m▄█████▄\033[0m \033[38;2;139;90;43m▄█████▄\033[0m \033[38;2;139;90;43m▄█████▄\033[0m\n"
printf " \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m\n"
printf " \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m \033[38;2;139;90;43m███████\033[0m\n"
printf " \033[38;2;139;90;43m█████\033[0m \033[38;2;139;90;43m█████\033[0m \033[38;2;139;90;43m█████\033[0m \033[38;2;139;90;43m█████\033[0m\n"
printf " \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m\n"
printf " \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m\n"
printf "\n\033[1m WALKING LEFT\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;255;200;50m▄███\033[0m \033[38;2;255;200;50m▄███\033[0m \033[38;2;255;200;50m▄███\033[0m \033[38;2;255;200;50m▄███\033[0m\n"
printf " \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m\n"
printf " \033[38;2;0;0;0m██\033[38;2;255;200;50m███\033[0m \033[38;2;0;0;0m██\033[38;2;255;200;50m███\033[0m \033[38;2;0;0;0m██\033[38;2;255;200;50m███\033[0m \033[38;2;0;0;0m██\033[38;2;255;200;50m███\033[0m\n"
printf " \033[38;2;255;200;50m████\033[0m \033[38;2;255;200;50m████\033[0m \033[38;2;255;200;50m████\033[0m \033[38;2;255;200;50m████\033[0m\n"
printf " \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m██\033[0m\n"
printf " \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m\n"
printf " \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m\n"
printf " \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m\n"
printf " \033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[0m\n"
printf " \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m\n"
printf " \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m\n"
printf "\n\033[1m WALKING RIGHT\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m \033[38;2;139;90;43m█\033[0m\n"
printf " \033[38;2;255;200;50m███▄\033[0m \033[38;2;255;200;50m███▄\033[0m \033[38;2;255;200;50m███▄\033[0m \033[38;2;255;200;50m███▄\033[0m\n"
printf " \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m \033[38;2;255;200;50m█████\033[0m\n"
printf " \033[38;2;255;200;50m███\033[38;2;0;0;0m██\033[0m \033[38;2;255;200;50m███\033[38;2;0;0;0m██\033[0m \033[38;2;255;200;50m███\033[38;2;0;0;0m██\033[0m \033[38;2;255;200;50m███\033[38;2;0;0;0m██\033[0m\n"
printf " \033[38;2;255;200;50m████\033[0m \033[38;2;255;200;50m████\033[0m \033[38;2;255;200;50m████\033[0m \033[38;2;255;200;50m████\033[0m\n"
printf " \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m██\033[0m\n"
printf " \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m\n"
printf " \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[38;2;255;215;0m█\033[38;2;139;90;43m██\033[0m\n"
printf " \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m \033[38;2;139;90;43m████\033[0m\n"
printf " \033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[0m \033[38;2;139;90;43m██\033[0m\n"
printf " \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m██\033[0m \033[38;2;255;200;50m█\033[0m \033[38;2;255;200;50m█\033[0m\n"
printf " \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m█\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m██\033[0m \033[38;2;101;67;33m█\033[0m\n"
printf "\n"

View file

@ -0,0 +1,115 @@
'use client';
import { Button } from '@tpmjs/ui/Button/Button';
import { Drawer } from '@tpmjs/ui/Drawer/Drawer';
import { Icon } from '@tpmjs/ui/Icon/Icon';
import Link from 'next/link';
import { ExecutorsDiagram } from './architecture/ExecutorsDiagram';
import { NpmRegistryDiagram } from './architecture/NpmRegistryDiagram';
import { OutputsDiagram } from './architecture/OutputsDiagram';
import { ToolsDiagram } from './architecture/ToolsDiagram';
import { TpmjsDiagram } from './architecture/TpmjsDiagram';
import { UsersDiagram } from './architecture/UsersDiagram';
// Map node IDs to their diagram components
const diagramComponents: Record<string, React.ComponentType> = {
tools: ToolsDiagram,
npm: NpmRegistryDiagram,
tpmjs: TpmjsDiagram,
users: UsersDiagram,
executors: ExecutorsDiagram,
outputs: OutputsDiagram,
};
interface NodeDetailDrawerProps {
open: boolean;
onClose: () => void;
nodeId: string;
title: string;
description: string;
bullets: string[];
links?: { label: string; href: string }[];
}
export function NodeDetailDrawer({
open,
onClose,
nodeId,
title,
description,
bullets,
links,
}: NodeDetailDrawerProps): React.ReactElement {
const DiagramComponent = diagramComponents[nodeId];
return (
<Drawer
open={open}
onClose={onClose}
title={title}
side="right"
size="lg"
footer={
<div className="flex justify-end">
<Button variant="outline" onClick={onClose}>
Close
</Button>
</div>
}
>
<div className="space-y-6">
{/* Interactive Diagram */}
{DiagramComponent && (
<div className="space-y-3">
<h4 className="text-sm font-semibold text-foreground uppercase tracking-wide">
How It Works
</h4>
<div className="bg-surface/50 rounded-lg border border-border p-4">
<DiagramComponent />
</div>
<p className="text-xs text-foreground-tertiary italic">
Hover over elements for more details
</p>
</div>
)}
{/* Description */}
<p className="text-foreground-secondary leading-relaxed">{description}</p>
{/* Bullet points */}
<div className="space-y-3">
<h4 className="text-sm font-semibold text-foreground uppercase tracking-wide">
Key Features
</h4>
<ul className="space-y-2">
{bullets.map((bullet, i) => (
<li key={i} className="flex items-start gap-3">
<Icon icon="check" size="sm" className="flex-shrink-0 mt-0.5 text-primary" />
<span className="text-sm text-foreground-secondary">{bullet}</span>
</li>
))}
</ul>
</div>
{/* Links */}
{links && links.length > 0 && (
<div className="space-y-3">
<h4 className="text-sm font-semibold text-foreground uppercase tracking-wide">
Learn More
</h4>
<div className="flex flex-wrap gap-2">
{links.map((link) => (
<Link key={link.href} href={link.href}>
<Button variant="outline" size="sm">
{link.label}
<Icon icon="arrowRight" size="sm" className="ml-1" />
</Button>
</Link>
))}
</div>
</div>
)}
</div>
</Drawer>
);
}

View file

@ -236,6 +236,12 @@ export default function UseCaseCaseStudy({ useCase }: UseCaseCaseStudyProps) {
>
{useCase.scenario.collection.name}
</a>
<a
href={`/${useCase.scenario.collection.user.username}/collections/${useCase.scenario.collection.slug}/scenarios/${useCase.scenario.id}`}
className="mt-2 block text-sm text-primary hover:underline"
>
View scenario details
</a>
</div>
)}
</div>

View file

@ -145,7 +145,7 @@ async function generateMarketingContent(
model: openai('gpt-4o-mini'),
schema: UseCaseGenerationSchema,
system: `You are a marketing expert specializing in B2B SaaS and AI tools.
Your task is to transform technical test scenarios into compelling marketing use cases.
Your task is to transform technical test scenarios into compelling marketing use cases that read like natural, human-written copy.
Guidelines:
1. Write clear, benefit-focused titles that resonate with business users
@ -158,6 +158,14 @@ Guidelines:
- business-process: business area (customer-support, sales, hr)
- technical: technical domain (api-integration, data-processing)
Writing rules (avoid AI tell-tales):
- Avoid inflated significance, trend talk, or vague "experts say" attributions.
- Avoid promo hype, generic positivity, and grand claims.
- Prefer simple copula sentences ("is/are/has") over "serves as/stands as/boasts."
- Avoid filler and hedging, rule-of-three padding, and negative parallelism.
- Avoid em dashes, bolded lists, emojis, and title-case headings.
- Use concrete details and natural rhythm with varied sentence length.
For personas, use common roles like:
- CTO, VP Engineering, Engineering Manager
- Product Manager, Product Owner
@ -515,8 +523,8 @@ export async function generateUseCasesForQualifyingScenarios(): Promise<UseCaseG
// Find qualifying scenarios
const scenarios = await prisma.scenario.findMany({
where: {
qualityScore: { gte: 0.3 },
totalRuns: { gte: 1 },
qualityScore: { gte: 0 },
totalRuns: { gte: 0 },
lastRunStatus: 'pass',
},
include: {
@ -585,7 +593,7 @@ export async function generateUseCaseForScenario(
}
// Check qualification
if (scenario.qualityScore < 0.3 || scenario.totalRuns < 1 || scenario.lastRunStatus !== 'pass') {
if (scenario.qualityScore < 0 || scenario.totalRuns < 0 || scenario.lastRunStatus !== 'pass') {
return {
success: false,
error: 'Scenario does not meet qualification criteria',

144
beast.sh
View file

@ -1,144 +0,0 @@
#!/bin/bash
# Humanoid Beast Sprite Sheet with Bounding Boxes
# Colors (background mode for solid pixels)
F="\033[48;2;139;90;43m" # Fur (brown)
D="\033[48;2;101;67;33m" # Dark fur
L="\033[48;2;178;134;87m" # Light fur/highlight
E="\033[48;2;255;200;0m" # Eyes (glowing yellow)
e="\033[48;2;180;140;0m" # Eyes dark
M="\033[48;2;60;40;30m" # Muzzle/nose dark
T="\033[48;2;200;200;200m" # Teeth/claws
C="\033[48;2;40;40;40m" # Claws dark
X="\033[0m" # Reset
P=" " # Pixel (two spaces)
# Box drawing
BOX_COLOR="\033[38;2;100;100;100m"
RESET="\033[0m"
clear
echo ""
echo -e "\033[1m HUMANOID BEAST - SPRITE SHEET\033[0m"
echo -e " Each sprite: 16x20 pixels (32x20 characters)"
echo ""
# Function to draw horizontal box line
hline() {
echo -ne "${BOX_COLOR}"
echo -n " ┌"
for i in {1..32}; do echo -n "─"; done
echo -n "┐ ┌"
for i in {1..32}; do echo -n "─"; done
echo -n "┐ ┌"
for i in {1..32}; do echo -n "─"; done
echo -n "┐ ┌"
for i in {1..32}; do echo -n "─"; done
echo -e "┐${RESET}"
}
hline_bottom() {
echo -ne "${BOX_COLOR}"
echo -n " └"
for i in {1..32}; do echo -n "─"; done
echo -n "┘ └"
for i in {1..32}; do echo -n "─"; done
echo -n "┘ └"
for i in {1..32}; do echo -n "─"; done
echo -n "┘ └"
for i in {1..32}; do echo -n "─"; done
echo -e "┘${RESET}"
}
V="${BOX_COLOR}│${RESET}"
echo -e "\033[1m WALKING DOWN\033[0m"
echo " Frame 1 Frame 2 Frame 3 Frame 4"
hline
# Row 1 - Ears
printf " ${V} ${D}${P}${P}${X} ${D}${P}${P}${X} ${V} ${V} ${D}${P}${P}${X} ${D}${P}${P}${X} ${V} ${V} ${D}${P}${P}${X} ${D}${P}${P}${X} ${V} ${V} ${D}${P}${P}${X} ${D}${P}${P}${X} ${V}\n"
# Row 2 - Ears connect to head
printf " ${V} ${D}${P}${F}${P}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${X} ${F}${P}${D}${P}${X} ${V}\n"
# Row 3 - Top of head
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 4 - Brow
printf " ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${P}${P}${L}${P}${F}${P}${X} ${V} ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${P}${P}${L}${P}${F}${P}${X} ${V} ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${P}${P}${L}${P}${F}${P}${X} ${V} ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${P}${P}${L}${P}${F}${P}${X} ${V}\n"
# Row 5 - Eyes
printf " ${V} ${F}${P}${E}${P}${P}${F}${P}${P}${P}${P}${E}${P}${P}${F}${P}${X} ${V} ${V} ${F}${P}${E}${P}${P}${F}${P}${P}${P}${P}${E}${P}${P}${F}${P}${X} ${V} ${V} ${F}${P}${E}${P}${P}${F}${P}${P}${P}${P}${E}${P}${P}${F}${P}${X} ${V} ${V} ${F}${P}${E}${P}${P}${F}${P}${P}${P}${P}${E}${P}${P}${F}${P}${X} ${V}\n"
# Row 6 - Under eyes
printf " ${V} ${F}${P}${e}${P}${F}${P}${P}${P}${P}${P}${P}${e}${P}${F}${P}${X} ${V} ${V} ${F}${P}${e}${P}${F}${P}${P}${P}${P}${P}${P}${e}${P}${F}${P}${X} ${V} ${V} ${F}${P}${e}${P}${F}${P}${P}${P}${P}${P}${P}${e}${P}${F}${P}${X} ${V} ${V} ${F}${P}${e}${P}${F}${P}${P}${P}${P}${P}${P}${e}${P}${F}${P}${X} ${V}\n"
# Row 7 - Muzzle top
printf " ${V} ${F}${P}${P}${D}${P}${M}${P}${P}${D}${P}${F}${P}${P}${X} ${V} ${V} ${F}${P}${P}${D}${P}${M}${P}${P}${D}${P}${F}${P}${P}${X} ${V} ${V} ${F}${P}${P}${D}${P}${M}${P}${P}${D}${P}${F}${P}${P}${X} ${V} ${V} ${F}${P}${P}${D}${P}${M}${P}${P}${D}${P}${F}${P}${P}${X} ${V}\n"
# Row 8 - Mouth with fangs
printf " ${V} ${F}${P}${T}${P}${M}${P}${P}${P}${P}${T}${P}${F}${P}${X} ${V} ${V} ${F}${P}${T}${P}${M}${P}${P}${P}${P}${T}${P}${F}${P}${X} ${V} ${V} ${F}${P}${T}${P}${M}${P}${P}${P}${P}${T}${P}${F}${P}${X} ${V} ${V} ${F}${P}${T}${P}${M}${P}${P}${P}${P}${T}${P}${F}${P}${X} ${V}\n"
# Row 9 - Chin
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 10 - Neck
printf " ${V} ${D}${P}${F}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 11 - Shoulders
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 12 - Upper torso
printf " ${V} ${C}${P}${F}${P}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${F}${P}${P}${P}${C}${P}${X} ${V} ${V} ${C}${P}${F}${P}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${F}${P}${P}${P}${C}${P}${X} ${V} ${V} ${C}${P}${F}${P}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${F}${P}${P}${P}${C}${P}${X} ${V} ${V} ${C}${P}${F}${P}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${F}${P}${P}${P}${C}${P}${X} ${V}\n"
# Row 13 - Mid torso with claws
printf " ${V} ${T}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${T}${P}${X} ${V} ${V} ${T}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${T}${P}${X} ${V} ${V} ${T}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${T}${P}${X} ${V} ${V} ${T}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${F}${P}${P}${D}${P}${T}${P}${X} ${V}\n"
# Row 14 - Lower torso
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 15 - Hips
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 16 - Upper legs - animated
printf " ${V} ${F}${P}${P}${P}${X} ${F}${P}${P}${P}${X} ${V} ${V} ${F}${P}${P}${P}${F}${P}${P}${P}${X} ${V} ${V} ${F}${P}${P}${P}${X} ${F}${P}${P}${P}${X} ${V} ${V} ${F}${P}${P}${P}${F}${P}${P}${P}${X} ${V}\n"
# Row 17 - Mid legs
printf " ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${F}${P}${D}${P}${X} ${V}\n"
# Row 18 - Lower legs
printf " ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V}\n"
# Row 19 - Feet with claws
printf " ${V} ${C}${P}${D}${P}${F}${P}${X} ${F}${P}${D}${P}${C}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${X} ${F}${P}${D}${P}${C}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${X} ${F}${P}${D}${P}${C}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${X} ${F}${P}${D}${P}${C}${P}${X} ${V}\n"
# Row 20 - Claws
printf " ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V} ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V} ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V} ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V}\n"
hline_bottom
echo ""
echo -e "\033[1m WALKING LEFT (SIDE VIEW)\033[0m"
echo " Frame 1 Frame 2 Frame 3 Frame 4"
hline
# Row 1 - Ear
printf " ${V} ${D}${P}${P}${X} ${V} ${V} ${D}${P}${P}${X} ${V} ${V} ${D}${P}${P}${X} ${V} ${V} ${D}${P}${P}${X} ${V}\n"
# Row 2 - Ear to head
printf " ${V} ${D}${P}${F}${P}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${X} ${V}\n"
# Row 3 - Head top
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 4 - Brow
printf " ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${F}${P}${X} ${V} ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${F}${P}${X} ${V} ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${F}${P}${X} ${V} ${V} ${F}${P}${L}${P}${F}${P}${P}${P}${P}${F}${P}${X} ${V}\n"
# Row 5 - Eye (side)
printf " ${V} ${E}${P}${P}${F}${P}${P}${P}${P}${P}${F}${P}${X} ${V} ${V} ${E}${P}${P}${F}${P}${P}${P}${P}${P}${F}${P}${X} ${V} ${V} ${E}${P}${P}${F}${P}${P}${P}${P}${P}${F}${P}${X} ${V} ${V} ${E}${P}${P}${F}${P}${P}${P}${P}${P}${F}${P}${X} ${V}\n"
# Row 6 - Muzzle
printf " ${V} ${D}${P}${M}${P}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${M}${P}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${M}${P}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${M}${P}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 7 - Mouth
printf " ${V} ${T}${P}${M}${P}${P}${F}${P}${P}${D}${P}${X} ${V} ${V} ${T}${P}${M}${P}${P}${F}${P}${P}${D}${P}${X} ${V} ${V} ${T}${P}${M}${P}${P}${F}${P}${P}${D}${P}${X} ${V} ${V} ${T}${P}${M}${P}${P}${F}${P}${P}${D}${P}${X} ${V}\n"
# Row 8 - Chin/neck
printf " ${V} ${D}${P}${F}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${D}${P}${X} ${V}\n"
# Row 9 - Shoulders
printf " ${V} ${C}${P}${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 10 - Arm/torso
printf " ${V} ${T}${P}${F}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${T}${P}${F}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${T}${P}${F}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${T}${P}${F}${P}${P}${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 11 - Mid torso
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 12 - Lower torso
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 13 - Hips
printf " ${V} ${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${P}${P}${P}${D}${P}${X} ${V}\n"
# Row 14-20 - Legs animated
printf " ${V} ${F}${P}${P}${P}${P}${X} ${V} ${V} ${F}${P}${P}${X} ${F}${P}${P}${X} ${V} ${V} ${F}${P}${P}${P}${P}${X} ${V} ${V} ${F}${P}${P}${X} ${F}${P}${P}${X} ${V}\n"
printf " ${V} ${D}${P}${F}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V}\n"
printf " ${V} ${D}${P}${F}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${F}${P}${D}${P}${X} ${V} ${V} ${D}${P}${F}${P}${X} ${F}${P}${D}${P}${X} ${V}\n"
printf " ${V} ${C}${P}${D}${P}${F}${P}${F}${P}${D}${P}${C}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${X} ${F}${P}${D}${P}${C}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${F}${P}${D}${P}${C}${P}${X} ${V} ${V} ${C}${P}${D}${P}${F}${P}${X} ${F}${P}${D}${P}${C}${P}${X} ${V}\n"
printf " ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V} ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V} ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V} ${V} ${T}${P}${C}${P}${X} ${C}${P}${T}${P}${X} ${V}\n"
printf " ${V} ${V} ${V} ${V} ${V} ${V} ${V} ${V}\n"
hline_bottom
echo ""
echo -e " \033[1mDimensions:\033[0m"
echo " • Sprite size: 16 pixels wide × 20 pixels tall"
echo " • Character size: 32 chars wide × 20 rows (each pixel = 2 chars)"
echo " • Color palette: Brown fur, yellow eyes, white fangs/claws"
echo ""

View file

@ -0,0 +1,392 @@
# TPMJS Architecture Diagram
This document accompanies the `architecture.d2` diagram and provides a comprehensive overview of the TPMJS platform architecture.
## Rendering the Diagram
Install D2 and render the diagram:
```bash
# Install D2 (macOS)
brew install d2
# Render to SVG (recommended)
d2 docs/architecture.d2 docs/architecture.svg --layout=elk
# Render to PNG
d2 docs/architecture.d2 docs/architecture.png --layout=elk
```
## Architecture Overview
TPMJS (Tool Platform for Model Junctions) is an open platform for discovering, sharing, and executing AI agent tools. Think of it as "npm for AI tools."
---
## 1. External Clients
| Client | Description |
|--------|-------------|
| **Web App** | Next.js 16 App Router application at tpmjs.com |
| **TPMJS CLI** | Command-line tool for interacting with the registry |
| **AI Clients** | External AI applications (Claude Desktop, GPT, etc.) using MCP protocol |
| **Bridge CLI** | (WIP) Local bridge for connecting local MCP servers to TPMJS |
---
## 2. API Gateway
### Authentication Methods
- **Better Auth**: Email/password and OAuth (GitHub, Google)
- **TPMJS API Keys**: Scoped keys with permissions (`mcp:execute`, `agent:chat`, `bridge:connect`, `usage:read`)
- **Session Tokens**: Browser-based sessions
### Rate Limiting
- Per-endpoint limits
- Tier-based limits (FREE, PRO, ENTERPRISE)
- API key-specific overrides
---
## 3. API Endpoints
### Tool Discovery
```
GET /api/tools - List tools with pagination
GET /api/tools/search - Search tools with filters
GET /api/tools/[id] - Get tool details
```
### Execution
```
POST /api/tools/execute/[slug] - Execute tool (SSE streaming)
```
### MCP Protocol
```
POST /api/mcp/[user]/[slug]/[transport] - JSON-RPC 2.0 endpoint
- tools/list: List available tools
- tools/call: Execute a tool
```
### Agents & Collections
```
/api/agents/* - CRUD for AI agents
/api/collections/* - CRUD for tool collections
/api/chat/* - Chat conversations
```
### Scenarios (Testing)
```
/api/scenarios/* - Integration test scenarios
/api/use-cases/* - AI-generated marketing content
```
### Sync (Cron)
```
/api/sync/changes - npm changes feed sync
/api/sync/keyword - npm keyword search sync
/api/sync/metrics - Download/star metrics sync
```
---
## 4. Dual Execution Flows
### Path A: Playground Flow (Web UI)
```
User Prompt
↓
POST /api/tools/execute/[slug]
↓
AI Agent (AI SDK v6) - GPT-4 / Claude / etc.
↓
Tool Schema (Zod)
↓
Executor Resolution: Agent → Collection → System Default
↓
EXECUTOR (Railway) - POST /execute-tool
↓
SSE Stream Response (chunk, tokens, complete)
```
**SSE Event Types:**
```typescript
{ type: 'chunk', content: 'AI response text...' }
{ type: 'tool_call', toolCallId, toolName, args }
{ type: 'tool_result', toolCallId, toolName, result }
{ type: 'tokens', inputTokens, outputTokens }
{ type: 'complete' }
```
### Path B: MCP Flow (External AI Client)
```
External AI Client (Claude Desktop, etc.)
↓
JSON-RPC 2.0
↓
POST /api/mcp/[username]/[slug]/[transport]
↓
MCP Handler (tools/list, tools/call)
↓
Tool Name Resolution (Registry + Bridge tools)
↓
Same Executor as Path A
↓
JSON-RPC Response
```
---
## 5. Schema Extraction Pipeline
The pipeline that discovers npm packages and extracts tool schemas:
```
NPM Registry (packages with "tpmjs" keyword)
↓
Sync Workers (Vercel Cron):
- /api/sync/changes (every 2 min) - npm _changes feed
- /api/sync/keyword (every 15 min) - keyword search
- /api/sync/metrics (every hour) - downloads, stars
↓
Schema Extraction:
1. Fetch package from npm
2. Import via esm.sh (dynamic)
3. listToolExports() - discover exports
4. extractToolSchema() - analyze signatures
5. AI extraction (if needed) - GPT for complex types
6. validateTpmjsField() - validate schema
7. Store in database (inputSchema field)
↓
Zod / AI SDK Conversion:
TPMJS Parameters → convertToZodSchema() → Zod Schema
↓
AI SDK inputSchema
↓
LLM Tool Definition (OpenAI/Anthropic)
```
---
## 6. Executor Architecture
### Executor Contract
All executors implement this HTTP interface:
```typescript
// Execute a tool
POST /execute-tool
Request: { packageName, name, version, params, env }
Response: { success, output, error, executionTimeMs }
// Health check
GET /health
Response: { status: "ok" }
```
### Implementations
| Executor | Description | Use Case |
|----------|-------------|----------|
| **Railway** (Default) | Sandboxed Node.js, dynamic imports from esm.sh | Production default |
| **Vercel Template** | Serverless functions, one-click deploy | Self-hosting |
| **Custom** | User-provided URL endpoint | Private tools |
### Resolution Cascade
```
Agent executorConfig
↓ (if not set)
Collection executorConfig
↓ (if not set)
System Default (Railway)
```
---
## 7. Database Schema (Logical Groups)
### PACKAGES
- `Package` - NPM package metadata
- `Tool` - Individual tools within packages
- `HealthCheck` - Health check audit history
### USERS
- `User` - Authenticated users
- `Session` - Active sessions
- `Account` - OAuth/credential accounts
- `Verification` - Email verification tokens
- `UserApiKey` - User's encrypted API keys (for AI providers)
- `TpmjsApiKey` - User's TPMJS API keys
### EXECUTION
- `Simulation` - Playground execution records
- `TokenUsage` - Token consumption tracking
- `ExecutionLog` - Detailed execution logs
- `ApiUsageRecord` - API request logs (30-day retention)
- `ApiUsageSummary` - Aggregated usage rollups
### COLLECTIONS
- `Collection` - User-created tool groups
- `CollectionTool` - Many-to-many: Collection ↔ Tool
- `CollectionLike` - User likes on collections
- `CollectionBridgeTool` - Bridge tools in collections
### AGENTS
- `Agent` - AI agent configurations
- `AgentCollection` - Many-to-many: Agent ↔ Collection
- `AgentTool` - Many-to-many: Agent ↔ Tool
- `AgentLike` - User likes on agents
- `Conversation` - Chat sessions
- `Message` - Individual messages
### SYNC
- `SyncCheckpoint` - Sync progress tracking
- `SyncLog` - Sync operation audit trail
- `StatsSnapshot` - Daily registry statistics
- `EndpointHealthReport` - External health monitoring
### SCENARIOS
- `Scenario` - AI-generated test scenarios
- `ScenarioRun` - Scenario execution records
- `ScenarioEmbedding` - Vector embeddings for similarity
- `ScenarioQuota` - Daily usage quotas
### USE CASES
- `UseCase` - Marketing content from scenarios
- `Persona` - User personas for targeting
- `Industry` - Industry categories
- `Category` - Functional categories
- `SocialProof` - Quality metrics display
### ENGAGEMENT
- `ToolLike` - User likes on tools
- `ToolRating` - 1-5 star ratings
- `ToolReview` - Written reviews
- `UserActivity` - Activity stream
### BRIDGE (WIP)
- `BridgeConnection` - Active bridge connections
---
## 8. Background Workers (Vercel Cron)
| Schedule | Endpoint | Description |
|----------|----------|-------------|
| Every 2 min | `/api/sync/changes` | npm changes feed |
| Every 15 min | `/api/sync/keyword` | npm keyword search |
| Every hour | `/api/sync/metrics` | Downloads, stars update |
| Daily | `/api/sync/stats-snapshot` | Registry statistics |
| Daily 3am | `/api/sync/cleanup-activity` | Activity cleanup |
| Daily 9am | `/api/cron/discord-summary` | Discord notification |
| Daily | `/api/cron/use-cases` | AI use case generation |
---
## 9. External Services
### Package Sources
- **npm Registry** - Package metadata, changes feed
- **GitHub API** - Stars, repository metadata
- **Bundlephobia** - Package size analysis
### Runtime
- **esm.sh** - Dynamic ESM imports for tool loading
- **Vercel** - Hosting, Edge, Cron jobs
- **Railway** - Default executor hosting
### Data
- **Neon** - PostgreSQL database (serverless)
### AI Providers
- **OpenAI** - GPT-4, GPT-4 Turbo, embeddings
- **Anthropic** - Claude models
- **Google** - Gemini models
- **Groq** - Fast inference
- **Mistral** - Mistral models
### Notifications
- **Discord** - Daily summary webhooks
---
## 10. Bridge System (WIP)
The Bridge system enables local MCP servers to expose tools through TPMJS:
```
Local MCP Server (Blender, Chrome DevTools, etc.)
↓
Bridge CLI (@tpmjs/bridge)
↓
POST /api/bridge { type: 'register', tools: [...] }
↓
BridgeConnection record (DB)
↓
Tool calls via polling:
GET /api/bridge → pending tool calls
POST /api/bridge → tool results
```
**Status:** Work in progress (dashed lines in diagram)
---
## 11. AI Integration Points
### User-Provided Keys
Users bring their own API keys for:
- Agent chats (stored encrypted in `UserApiKey`)
- Custom collection configurations
### Internal Keys (TPMJS)
TPMJS uses internal API keys for:
- Schema extraction (analyzing tool signatures)
- Use case generation (marketing content)
- Scenario evaluation (pass/fail determination)
- Discord summaries
---
## Key Architectural Decisions
### 1. Design System First
All UI uses `@tpmjs/ui` components for consistency.
### 2. No Barrel Exports
Direct imports for better tree-shaking and clearer dependencies:
```typescript
// Good
import { Button } from '@tpmjs/ui/Button/Button';
// Bad
import { Button } from '@tpmjs/ui';
```
### 3. Executor Abstraction
Pluggable execution backends allow:
- Different security/isolation levels
- Self-hosting options
- Custom environments for specific tools
### 4. Dual Protocol Support
Both web UI (SSE) and MCP (JSON-RPC) share the same execution backend, ensuring consistency.
### 5. Real-time npm Sync
The 2-minute changes feed sync ensures new packages are discoverable quickly.
---
## Related Documentation
- [TPMJS Architecture (detailed)](./TPMJS-ARCHITECTURE.md) - In-depth architecture explanation
- [NPM Sync System](../CLAUDE.md#npm-package-syncing-system) - Sync worker details
- [MCP Bridge Status](./MCP-BRIDGE-STATUS.md) - Bridge implementation status
- [Tool Health System](./TOOL_HEALTH_SYSTEM.md) - Health check implementation

497
docs/architecture-v1.d2 Normal file
View file

@ -0,0 +1,497 @@
# TPMJS Architecture Diagram
# Canonical reference for the entire TPMJS platform
# Render with: d2 architecture.d2 architecture.svg --layout=elk
# ==============================================================================
# STYLES
# ==============================================================================
classes: {
api: {
style: {
fill: "#e3f2fd"
stroke: "#1976d2"
}
}
db: {
style: {
fill: "#e8f5e9"
stroke: "#388e3c"
}
}
external: {
style: {
fill: "#fff3e0"
stroke: "#f57c00"
}
}
ai: {
style: {
fill: "#f3e5f5"
stroke: "#7b1fa2"
}
}
executor: {
style: {
fill: "#fce4ec"
stroke: "#c2185b"
}
}
wip: {
style: {
stroke-dash: 5
opacity: 0.7
}
}
client: {
style: {
fill: "#e0f7fa"
stroke: "#00838f"
}
}
}
# ==============================================================================
# 1. EXTERNAL CLIENTS
# ==============================================================================
clients: External Clients {
class: client
web: "Web App\n(Next.js 16)"
cli: "TPMJS CLI\n(@tpmjs/cli)"
ai_clients: "AI Clients\n(Claude Desktop, GPT, etc.)"
bridge_cli: "Bridge CLI\n(@tpmjs/bridge)" {
class: wip
}
}
# ==============================================================================
# 2. API GATEWAY / AUTHENTICATION
# ==============================================================================
gateway: API Gateway {
class: api
auth: Authentication {
better_auth: "Better Auth\n(email/password, OAuth)"
api_keys: "TPMJS API Keys\n(scoped permissions)"
sessions: "Session Tokens"
}
rate_limit: Rate Limiting {
per_endpoint: "Per-endpoint limits"
tier_based: "User tier-based\n(FREE, PRO, ENTERPRISE)"
}
}
# ==============================================================================
# 3. API ENDPOINTS
# ==============================================================================
api: API Endpoints {
class: api
discovery: Tool Discovery {
list: "GET /api/tools"
search: "GET /api/tools/search"
detail: "GET /api/tools/[id]"
}
execution: Execution {
execute: "POST /api/tools/execute/[slug]"
stream: "(SSE streaming)"
}
mcp: MCP Protocol {
endpoint: "/api/mcp/[user]/[slug]/[transport]"
protocol: "(JSON-RPC 2.0)"
}
agents: Agents & Collections {
agents_api: "/api/agents/*"
collections_api: "/api/collections/*"
chat_api: "/api/chat/*"
}
bridge: Bridge {
class: wip
register: "POST /api/bridge"
poll: "GET /api/bridge"
respond: "(polling + results)"
}
testing: Scenarios {
scenarios_api: "/api/scenarios/*"
use_cases_api: "/api/use-cases/*"
}
sync: Sync (Cron) {
changes: "/api/sync/changes"
keyword: "/api/sync/keyword"
metrics: "/api/sync/metrics"
}
health: Stats & Health {
stats: "GET /api/stats"
health: "GET /api/health"
report: "POST /api/health/report"
}
}
# ==============================================================================
# 4. EXECUTION FLOWS
# ==============================================================================
execution_flows: Execution Flows {
playground_flow: "Path A: Playground Flow\n(Web UI)" {
class: executor
step1: "1. User Prompt"
step2: "2. POST /api/tools/execute/[slug]"
step3: "3. AI Agent (AI SDK v6)\nGPT-4 / Claude / etc."
step4: "4. Tool Schema (Zod)"
step5: "5. Executor Resolution\nAgent -> Collection -> Default"
step6: "6. EXECUTOR (Railway)\nPOST /execute-tool"
step7: "7. SSE Stream Response\n(chunk, tokens, complete)"
step1 -> step2 -> step3 -> step4 -> step5 -> step6 -> step7
}
mcp_flow: "Path B: MCP Flow\n(External AI Client)" {
class: executor
mcp1: "1. External AI Client"
mcp2: "2. JSON-RPC 2.0"
mcp3: "3. /api/mcp/[user]/[slug]/[transport]"
mcp4: "4. MCP Handler\ntools/list, tools/call"
mcp5: "5. Tool Name Resolution\nRegistry + Bridge tools"
mcp6: "6. Same Executor"
mcp7: "7. JSON-RPC Response"
mcp1 -> mcp2 -> mcp3 -> mcp4 -> mcp5 -> mcp6 -> mcp7
}
}
# ==============================================================================
# 5. SCHEMA EXTRACTION PIPELINE
# ==============================================================================
schema_pipeline: Schema Extraction Pipeline {
class: ai
npm_source: "NPM Registry\npackages with 'tpmjs' keyword" {
class: external
}
sync_workers: "Sync Workers (Vercel Cron)" {
changes_feed: "/api/sync/changes (every 2 min)\nnpm _changes feed"
keyword_search: "/api/sync/keyword (every 15 min)\nkeyword search"
metrics_sync: "/api/sync/metrics (every hour)\ndownloads, stars"
}
extraction: "Schema Extraction" {
step1: "1. Fetch package from npm"
step2: "2. Import via esm.sh (dynamic)"
step3: "3. listToolExports() - discover exports"
step4: "4. extractToolSchema() - analyze signatures"
step5: "5. AI extraction (if needed)"
step6: "6. validateTpmjsField()"
step7: "7. Store in database (inputSchema)"
}
zod_conversion: "Zod / AI SDK Conversion" {
params: "TPMJS Parameters"
convert: "convertToZodSchema()"
zod: "Zod Schema\nz.object({ ... })"
ai_sdk: "AI SDK inputSchema"
llm_def: "LLM Tool Definition\n(OpenAI/Anthropic format)"
params -> convert -> zod -> ai_sdk -> llm_def
}
npm_source -> sync_workers -> extraction -> zod_conversion
}
# ==============================================================================
# 6. EXECUTOR ARCHITECTURE
# ==============================================================================
executors: Executor Architecture {
class: executor
contract: "Executor Contract" {
execute: "POST /execute-tool\n{ packageName, name, version, params, env }"
response: "Response: { success, output, error, executionTimeMs }"
health: "GET /health"
}
implementations: "Implementations" {
railway: "Railway (Default)\n- Sandboxed Node.js\n- Dynamic imports from esm.sh\n- Runs untrusted npm code safely"
vercel_template: "Vercel Template\n- Serverless functions\n- One-click deploy"
future: "Future Options\n- AWS Lambda\n- Docker\n- Custom HTTP service"
}
contract -> implementations
}
# ==============================================================================
# 7. DATABASE (Logical Groups)
# ==============================================================================
database: "Database (Neon PostgreSQL)" {
class: db
packages_group: PACKAGES {
Package: "Package"
Tool: "Tool"
HealthCheck: "HealthCheck"
}
users_group: USERS {
User: "User"
Session: "Session"
Account: "Account"
Verification: "Verification"
UserApiKey: "UserApiKey"
TpmjsApiKey: "TpmjsApiKey"
}
execution_group: EXECUTION {
Simulation: "Simulation"
TokenUsage: "TokenUsage"
ExecutionLog: "ExecutionLog"
ApiUsageRecord: "ApiUsageRecord"
ApiUsageSummary: "ApiUsageSummary"
}
collections_group: COLLECTIONS {
Collection: "Collection"
CollectionTool: "CollectionTool"
CollectionLike: "CollectionLike"
CollectionBridgeTool: "CollectionBridgeTool"
}
agents_group: AGENTS {
Agent: "Agent"
AgentCollection: "AgentCollection"
AgentTool: "AgentTool"
AgentLike: "AgentLike"
Conversation: "Conversation"
Message: "Message"
}
sync_group: SYNC {
SyncCheckpoint: "SyncCheckpoint"
SyncLog: "SyncLog"
StatsSnapshot: "StatsSnapshot"
EndpointHealthReport: "EndpointHealthReport"
}
scenarios_group: SCENARIOS {
Scenario: "Scenario"
ScenarioRun: "ScenarioRun"
ScenarioEmbedding: "ScenarioEmbedding"
ScenarioQuota: "ScenarioQuota"
}
use_cases_group: USE_CASES {
UseCase: "UseCase"
Persona: "Persona"
Industry: "Industry"
Category: "Category"
SocialProof: "SocialProof"
}
engagement_group: ENGAGEMENT {
ToolLike: "ToolLike"
ToolRating: "ToolRating"
ToolReview: "ToolReview"
UserActivity: "UserActivity"
}
bridge_group: BRIDGE {
class: wip
BridgeConnection: "BridgeConnection"
}
# Relationships between groups
packages_group.Tool -> collections_group.CollectionTool
packages_group.Tool -> agents_group.AgentTool
packages_group.Tool -> engagement_group.ToolLike
packages_group.Tool -> scenarios_group.Scenario: "via Collection"
users_group.User -> collections_group.Collection
users_group.User -> agents_group.Agent
users_group.User -> bridge_group.BridgeConnection
collections_group.Collection -> agents_group.AgentCollection
collections_group.Collection -> scenarios_group.Scenario
scenarios_group.Scenario -> use_cases_group.UseCase
}
# ==============================================================================
# 8. BACKGROUND WORKERS
# ==============================================================================
workers: "Background Workers (Vercel Cron)" {
class: external
sync_jobs: "Sync Jobs" {
changes: "Every 2 min: /api/sync/changes\n(npm changes feed)"
keyword: "Every 15 min: /api/sync/keyword\n(keyword search)"
metrics: "Every hour: /api/sync/metrics\n(downloads, stars)"
}
daily_jobs: "Daily Jobs" {
stats: "Daily: /api/sync/stats-snapshot"
cleanup: "Daily 3am: /api/sync/cleanup-activity"
discord: "Daily 9am: /api/cron/discord-summary"
use_cases: "Daily: /api/cron/use-cases\n(AI generation)"
}
}
# ==============================================================================
# 9. EXTERNAL SERVICES
# ==============================================================================
external: External Services {
class: external
package_sources: "Package Sources" {
npm: "npm Registry\nMetadata, changes feed"
github: "GitHub API\nStars, repo metadata"
bundlephobia: "Bundlephobia\nPackage size analysis"
}
runtime: "Runtime" {
esm_sh: "esm.sh\nDynamic ESM imports"
vercel: "Vercel\nHosting, Edge, Cron"
railway: "Railway\nDefault executor hosting"
}
data: "Data" {
neon: "Neon\nPostgreSQL database"
}
ai_providers: "AI Providers" {
openai: "OpenAI\nGPT-4, embeddings"
anthropic: "Anthropic\nClaude"
google: "Google\nGemini"
groq: "Groq"
mistral: "Mistral"
}
notifications: "Notifications" {
discord: "Discord\nDaily summaries"
}
}
# ==============================================================================
# 10. BRIDGE SYSTEM (WIP)
# ==============================================================================
bridge_system: "Bridge System (WIP)" {
class: wip
local_mcp: "Local MCP Server\n(Blender, etc.)"
bridge_cli: "Bridge CLI\n(@tpmjs/bridge)"
api_bridge: "POST /api/bridge\n{ type: 'register', tools: [...] }"
db_record: "BridgeConnection record"
polling: "Tool calls via polling:\nGET /api/bridge -> pending calls\nPOST /api/bridge -> tool results"
local_mcp -> bridge_cli -> api_bridge -> db_record -> polling
}
# ==============================================================================
# 11. AI INTEGRATION POINTS
# ==============================================================================
ai_integration: AI Integration Points {
class: ai
user_keys: "User-Provided Keys" {
agent_chat: "Agent chats\n(users bring their own API keys)"
custom_collections: "Custom collections\nwith API key storage"
}
internal_keys: "Internal Keys (TPMJS)" {
schema_extraction: "Schema extraction\n(analyze tool signatures)"
use_case_gen: "Use case generation\n(marketing content)"
scenario_eval: "Scenario evaluation\n(pass/fail determination)"
discord_summaries: "Discord summaries"
}
providers: "Supported Providers" {
list: "OpenAI (GPT-4, GPT-4 Turbo)\nAnthropic (Claude)\nGoogle (Gemini)\nGroq\nMistral"
}
}
# ==============================================================================
# CONNECTIONS
# ==============================================================================
# Clients -> Gateway
clients.web -> gateway.auth
clients.cli -> gateway.auth
clients.ai_clients -> gateway.auth
clients.bridge_cli -> gateway.auth: {
style.stroke-dash: 5
}
# Gateway -> API
gateway -> api
# API -> Execution
api.discovery -> execution_flows.playground_flow.step2
api.execution -> execution_flows.playground_flow.step2
api.mcp -> execution_flows.mcp_flow.mcp3
# Execution -> Executors
execution_flows.playground_flow.step6 -> executors.contract
execution_flows.mcp_flow.mcp6 -> executors.contract
# Executors -> External
executors.implementations.railway -> external.runtime.railway
# Schema Pipeline -> Database
schema_pipeline.extraction.step7 -> database.packages_group.Tool
# Schema Pipeline -> External
schema_pipeline.npm_source -> external.package_sources.npm
schema_pipeline.extraction.step2 -> external.runtime.esm_sh
schema_pipeline.extraction.step5 -> external.ai_providers
# Workers -> API (cron triggers)
workers.sync_jobs -> api.sync
workers.daily_jobs -> api.testing
# API -> Database
api.discovery -> database.packages_group
api.agents -> database.agents_group
api.agents -> database.collections_group
api.testing -> database.scenarios_group
api.testing -> database.use_cases_group
api.health -> database.sync_group
# External Services -> Database
external.data.neon -> database
# AI Integration -> External Providers
ai_integration.user_keys -> external.ai_providers
ai_integration.internal_keys -> external.ai_providers
# Bridge System (WIP - dashed lines)
clients.bridge_cli -> bridge_system.bridge_cli: {
style.stroke-dash: 5
}
bridge_system -> api.bridge: {
style.stroke-dash: 5
}
bridge_system.db_record -> database.bridge_group: {
style.stroke-dash: 5
}

109
docs/architecture-v1.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 135 KiB

View file

@ -0,0 +1,139 @@
# System Overview
# Purpose: Show the TPMJS ecosystem from tools to execution
direction: down
# ==============================================================================
# STYLES
# ==============================================================================
classes: {
tools: {
style: {
fill: "#e3f2fd"
stroke: "#1976d2"
border-radius: 8
}
}
npm: {
style: {
fill: "#fff3e0"
stroke: "#f57c00"
border-radius: 8
}
}
tpmjs: {
style: {
fill: "#e8f5e9"
stroke: "#388e3c"
border-radius: 8
}
}
user: {
style: {
fill: "#f3e5f5"
stroke: "#7b1fa2"
border-radius: 8
}
}
execution: {
style: {
fill: "#fce4ec"
stroke: "#c2185b"
border-radius: 8
}
}
output: {
style: {
fill: "#e8f5e9"
stroke: "#388e3c"
border-radius: 8
}
}
}
# ==============================================================================
# TOOLS (Examples)
# ==============================================================================
tools: Tools {
class: tools
weather: weather-tool
calculator: calculator-tool
translator: translator-tool
}
# ==============================================================================
# NPM REGISTRY
# ==============================================================================
npm: npm Registry {
class: npm
packages: Packages with\n'tpmjs' keyword
}
# ==============================================================================
# TPMJS PLATFORM
# ==============================================================================
tpmjs: TPMJS {
class: tpmjs
sync: Sync Workers
registry: Tool Registry
}
# ==============================================================================
# USER LAYER
# ==============================================================================
user: Users {
class: user
collections: Collections
agents: Agents
mcp: MCP Servers
}
# ==============================================================================
# EXECUTION
# ==============================================================================
execution: Executors {
class: execution
direction: down
sandbox: Official Sandbox
custom: Custom Executor
}
# ==============================================================================
# OUTPUTS
# ==============================================================================
outputs: Outputs {
class: output
sse: SSE Response
jsonrpc: JSON-RPC Response
}
# ==============================================================================
# MAIN FLOW
# ==============================================================================
tools -> npm: publish
npm -> tpmjs.sync: sync
tpmjs.sync -> tpmjs.registry: store
tpmjs.registry -> user.collections: collect & share
user.collections -> user.agents: power
user.collections -> user.mcp: auto-generate
user.collections -> execution: run
user.agents -> execution: run
user.mcp -> execution: run
execution -> outputs: expose

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

View file

@ -0,0 +1,137 @@
# Tool Discovery Flow (Hero Path)
# Purpose: Show how npm packages become TPMJS tools
# Direction: Left → Right
direction: right
# ==============================================================================
# STYLES
# ==============================================================================
classes: {
external: {
style: {
fill: "#fff3e0"
stroke: "#f57c00"
border-radius: 8
}
}
sync: {
style: {
fill: "#e8eaf6"
stroke: "#3f51b5"
border-radius: 8
}
}
extract: {
style: {
fill: "#f3e5f5"
stroke: "#7b1fa2"
border-radius: 8
}
}
storage: {
style: {
fill: "#e8f5e9"
stroke: "#388e3c"
border-radius: 8
}
}
available: {
style: {
fill: "#e3f2fd"
stroke: "#1976d2"
border-radius: 8
}
}
hero: {
style: {
stroke-width: 3
stroke: "#1976d2"
}
}
}
# ==============================================================================
# NPM REGISTRY (Source)
# ==============================================================================
npm: npm Registry {
class: external
packages: "'tpmjs' keyword"
}
# ==============================================================================
# SYNC WORKERS
# ==============================================================================
sync: Sync Workers {
class: sync
}
# ==============================================================================
# SCHEMA EXTRACTION
# ==============================================================================
extract: Schema Extraction {
class: extract
import: Import via esm.sh
analyze: Extract Schema
zod: Convert to Zod
}
# ==============================================================================
# TOOL REGISTRY (Storage)
# ==============================================================================
registry: Tool Registry {
class: storage
tools: Tool Table
}
# ==============================================================================
# AVAILABLE FOR USE
# ==============================================================================
available: Available {
class: available
web: Web UI
mcp: MCP Protocol
api: REST API
}
# ==============================================================================
# HERO PATH CONNECTIONS (emphasized)
# ==============================================================================
npm -> sync: {
class: hero
style.stroke: "#1976d2"
style.stroke-width: 3
}
sync -> extract: {
class: hero
style.stroke: "#1976d2"
style.stroke-width: 3
}
# ==============================================================================
# INTERNAL CONNECTIONS
# ==============================================================================
# Extract internal
extract.import -> extract.analyze
extract.analyze -> extract.zod
extract.zod -> registry.tools
# Available internal
registry.tools -> available.web
registry.tools -> available.mcp
registry.tools -> available.api

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 25 KiB

View file

@ -0,0 +1,98 @@
# Tool Execution Flow
# Purpose: Show how tools get executed
# Direction: Left → Right
direction: right
# ==============================================================================
# STYLES
# ==============================================================================
classes: {
input: {
style: {
fill: "#e3f2fd"
stroke: "#1976d2"
border-radius: 8
}
}
executor: {
style: {
fill: "#fce4ec"
stroke: "#c2185b"
border-radius: 8
}
}
custom: {
style: {
fill: "#fafafa"
stroke: "#9e9e9e"
stroke-dash: 5
border-radius: 8
}
}
output: {
style: {
fill: "#e8f5e9"
stroke: "#388e3c"
border-radius: 8
}
}
}
# ==============================================================================
# INPUT
# ==============================================================================
input: Input {
class: input
tool: Tool
payload: Payload
}
# ==============================================================================
# EXECUTORS
# ==============================================================================
executors: Executors {
class: executor
official: Official Executor {
direction: down
esm: esm.sh Import
deno: Deno Runtime
resolve: Resolution
}
custom: Custom/Community Executors {
class: custom
label: "Anyone can build\nand host their own"
}
}
# ==============================================================================
# OUTPUTS
# ==============================================================================
web_output: SSE Response {
class: output
}
mcp_output: JSON-RPC Response {
class: output
}
# ==============================================================================
# CONNECTIONS
# ==============================================================================
input -> executors
# Executor internal
executors.official.esm -> executors.official.deno
executors.official.deno -> executors.official.resolve
executors -> web_output
executors -> mcp_output

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

142
docs/diagrams/README.md Normal file
View file

@ -0,0 +1,142 @@
# TPMJS Architecture Diagrams
Visual documentation of the TPMJS system architecture, optimized for quick understanding.
## Diagram Index
| Diagram | Purpose | View |
|---------|---------|------|
| [System Overview](./01-overview.svg) | 10-second understanding of TPMJS | [SVG](./01-overview.svg) |
| [Tool Discovery](./02-discovery.svg) | How npm packages become tools | [SVG](./02-discovery.svg) |
| [Tool Execution](./03-execution.svg) | How tools get called and run | [SVG](./03-execution.svg) |
| [Data Model](./04-data-model.svg) | Database domain groups | [SVG](./04-data-model.svg) |
---
## 1. System Overview
**Purpose:** Understand what TPMJS is at a glance.
![System Overview](./01-overview.svg)
**Flow:** Inputs → TPMJS Core → Execution → Outputs
- **Inputs:** npm Registry, AI Clients, Web Users, Bridge CLI (WIP)
- **Core:** API Gateway, Tool Registry, Schema Pipeline
- **Execution:** AI Agents, Executor (Railway)
- **Outputs:** Tool Results, MCP Responses, SSE Streams
---
## 2. Tool Discovery Flow
**Purpose:** Show how npm packages become TPMJS tools (Hero Path).
![Tool Discovery](./02-discovery.svg)
**Flow:** npm Registry → Sync Workers → Schema Extraction → Tool Registry → Available
1. **npm Registry** - Packages with `tpmjs` keyword
2. **Sync Workers** - Changes feed (2 min), Keyword search (15 min), Metrics (hourly)
3. **Schema Extraction** - Import via esm.sh, Extract schema, AI assist, Convert to Zod
4. **Tool Registry** - Database storage (Package + Tool tables)
5. **Available** - Web UI, MCP Protocol, REST API
---
## 3. Tool Execution Flow
**Purpose:** Show how tools get called and executed via two paths.
![Tool Execution](./03-execution.svg)
**Path A (Web Playground):**
```
User Prompt → AI Agent → Tool Schema → Executor → SSE Response
```
**Path B (MCP Protocol):**
```
AI Client → JSON-RPC → MCP Handler → Executor → JSON-RPC Response
```
Both paths converge at the **Executor** which handles:
- Resolution (Agent → Collection → Default)
- Railway execution (POST /execute-tool)
- Dynamic import via esm.sh
---
## 4. Data Model
**Purpose:** Database structure reference (domain groups, not individual tables).
![Data Model](./04-data-model.svg)
**6 Domain Groups:**
| Group | Contains |
|-------|----------|
| Packages & Tools | Package, Tool, ToolVersion |
| Users & Auth | User, Session, Account, APIKey |
| Agents & Chats | Agent, Chat, Message, Prompt |
| Collections | Collection, CollectionTool |
| Execution & Usage | Execution, Usage, Feedback |
| Sync & Scenarios | SyncCheckpoint, SyncLog, Scenario |
---
## Visual Legend
### Arrow Styles
| Style | Meaning |
|-------|---------|
| **Solid →** | Synchronous request/response |
| **Dashed ⇢** | Async, event, or cron job |
| **Dotted ··→** | WIP / Future feature |
### Color Coding
| Color | Domain |
|-------|--------|
| Blue | API / Gateway |
| Green | Database / Storage |
| Orange | External Services |
| Purple | AI / LLM |
| Pink | Execution |
| Gray | WIP Features |
---
## Editing Diagrams
Diagrams are written in [D2](https://d2lang.com/) and rendered to SVG.
### Prerequisites
```bash
# Install D2
brew install d2
```
### Render a diagram
```bash
cd docs/diagrams
d2 01-overview.d2 01-overview.svg --layout=elk
```
### Render all diagrams
```bash
for f in *.d2; do d2 "$f" "${f%.d2}.svg" --layout=elk; done
```
### Source Files
- `01-overview.d2` - System Overview
- `02-discovery.d2` - Tool Discovery Flow
- `03-execution.d2` - Tool Execution Flow
- `04-data-model.d2` - Data Model
---
## Version History
- **v2** (Current) - Split into 4 focused diagrams, left-to-right flow
- **v1** - Single comprehensive diagram (archived as `../architecture-v1.d2`)

100
hotel.sh
View file

@ -1,100 +0,0 @@
#!/bin/bash
# Hotel - Exterior View (Front Facade)
# Using ANSI 24-bit color codes
clear
echo ""
echo " ╔══════════════════════════════════════════════════════════════════════╗"
echo " ║ GRAND HOTEL - EXTERIOR VIEW ║"
echo " ╚══════════════════════════════════════════════════════════════════════╝"
echo ""
# Colors
SKY="\033[48;2;135;180;220m"
WALL="\033[48;2;180;160;140m"
WIN="\033[48;2;100;140;180m"
WIN_LIT="\033[48;2;255;230;150m"
WIN_FRAME="\033[48;2;80;70;60m"
ROOF="\033[48;2;100;80;70m"
ROOF_H="\033[48;2;120;100;90m"
GROUND="\033[48;2;80;80;80m"
GRASS="\033[48;2;60;120;50m"
DOOR="\033[48;2;120;60;40m"
DOOR_H="\033[48;2;160;100;60m"
GLASS="\033[48;2;180;200;210m"
AWN="\033[48;2;160;40;40m"
AWN_S="\033[48;2;120;30;30m"
SIGN="\033[48;2;40;40;50m"
SIGN_LIT="\033[48;2;255;200;100m"
TRIM="\033[48;2;200;190;170m"
PLANT="\033[48;2;40;100;40m"
LAMP="\033[48;2;60;60;60m"
LAMP_ON="\033[48;2;255;240;200m"
X="\033[0m"
P=" "
# SKY
echo -e "${SKY}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${X}"
# ROOF
echo -e "${SKY}${P}${P}${P}${P}${P}${P}${ROOF}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${SKY}${P}${P}${P}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${P}${P}${ROOF}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${SKY}${P}${P}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${P}${ROOF_H}${ROOF}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${ROOF}${SKY}${P}${P}${P}${X}"
# ROOF EDGE / TRIM
echo -e "${SKY}${P}${P}${P}${TRIM}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${TRIM}${SKY}${P}${P}${X}"
# FLOOR 5
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# FLOOR 4
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# FLOOR 3
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# FLOOR 2
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${WIN_FRAME}${WIN_LIT}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# HOTEL SIGN
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${SIGN}${P}${SIGN_LIT}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${SIGN_LIT}${P}${SIGN}${P}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# FLOOR 1 - ENTRANCE
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${P}${P}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${P}${P}${P}${GLASS}${GLASS}${DOOR}${DOOR}${DOOR}${DOOR}${DOOR}${DOOR}${GLASS}${GLASS}${P}${P}${WALL}${P}${WIN_FRAME}${WIN}${P}${WIN_FRAME}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${P}${P}${P}${GLASS}${GLASS}${DOOR}${DOOR_H}${DOOR}${DOOR}${DOOR_H}${DOOR}${GLASS}${GLASS}${P}${P}${WALL}${P}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# AWNING
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${P}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${AWN}${P}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
echo -e "${SKY}${P}${P}${P}${WALL}${P}${P}${P}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${AWN}${AWN_S}${P}${P}${P}${WALL}${SKY}${P}${P}${X}"
# ENTRANCE GROUND LEVEL
echo -e "${SKY}${P}${P}${LAMP}${WALL}${P}${PLANT}${P}${P}${P}${P}${P}${P}${GLASS}${GLASS}${DOOR}${DOOR_H}${DOOR}${DOOR}${DOOR_H}${DOOR}${GLASS}${GLASS}${P}${P}${P}${P}${P}${P}${PLANT}${P}${WALL}${LAMP}${SKY}${P}${X}"
echo -e "${SKY}${P}${P}${LAMP_ON}${WALL}${P}${PLANT}${P}${P}${P}${P}${P}${P}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${GLASS}${P}${P}${P}${P}${P}${P}${PLANT}${P}${WALL}${LAMP_ON}${SKY}${P}${X}"
# GROUND / SIDEWALK
echo -e "${GRASS}${P}${P}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GROUND}${GRASS}${P}${X}"
echo -e "${GRASS}${P}${P}${P}${GROUND}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${GROUND}${P}${GRASS}${P}${X}"
echo -e "${GRASS}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${X}"
echo ""
echo " ┌──────────────────────────────────────────────────────────────────────┐"
echo " │ LEGEND │"
echo " ├──────────────────────────────────────────────────────────────────────┤"
echo -e " │ ${WALL} ${X} Wall ${WIN} ${X} Window (dark) ${WIN_LIT} ${X} Window (lit) │"
echo -e " │ ${ROOF} ${X} Roof ${DOOR} ${X} Door ${GLASS} ${X} Glass │"
echo -e " │ ${AWN} ${X} Awning ${PLANT} ${X} Plants ${LAMP_ON} ${X} Lamp │"
echo -e " │ ${GROUND} ${X} Ground ${GRASS} ${X} Grass ${SIGN_LIT} ${X} Sign lights │"
echo " └──────────────────────────────────────────────────────────────────────┘"
echo ""
echo " 5-story hotel with central glass entrance, red awning, and lit windows"
echo ""

182
knight.sh
View file

@ -1,182 +0,0 @@
#!/bin/bash
# Knight in Armor v2 - Improved Detail
# Better proportions, sharper edges, ground shadow
clear
c() { echo -en "\033[38;2;$1;$2;$3m\033[48;2;$4;$5;$6m"; }
X="\033[0m"
echo ""
echo " ╔═══════════════════════════════════════════════════════════════════════════════════╗"
echo " ║ KNIGHT IN ARMOR v2 - IMPROVED DETAIL (Facing Down) ║"
echo " ╚═══════════════════════════════════════════════════════════════════════════════════╝"
echo ""
# ═══════════════════════════════════════════════════════════════════════════════
# REFINED COLOR PALETTE
# ═══════════════════════════════════════════════════════════════════════════════
# Metal (more contrast)
M1="220 225 235" # Brightest highlight
M2="170 175 185" # Light
M3="120 125 135" # Mid
M4="75 80 90" # Dark
M5="40 42 50" # Darkest
# Gold (richer)
G1="255 200 60" # Bright gold
G2="180 140 40" # Dark gold
# Cape (deeper blue)
C1="100 120 200" # Light
C2="60 80 160" # Mid
C3="35 50 120" # Dark
# Plume (vibrant red)
P1="240 50 50" # Bright
P2="180 30 30" # Dark
# Shield (bold red with gold cross)
SH="180 40 40" # Shield red
SHD="130 25 25" # Shield dark
# Sword
SW="240 245 255" # Blade bright
SWD="180 185 195" # Blade shadow
# Shadow on ground
SD="0 0 0"
# Terrains
GR="40 95 40" # Grass
ST="85 85 90" # Stone
SA="170 150 110" # Sand
WA="45 90 130" # Water
echo " ┌────────────────┐┌────────────────┐┌────────────────┐┌────────────────┐"
echo " │ GRASS ││ STONE ││ SAND ││ WATER │"
echo " └────────────────┘└────────────────┘└────────────────┘└────────────────┘"
# Unified knight drawing - 12 cells wide, tighter layout
# Each column: terrain bg, knight on top
# Row 1: Plume top
echo -en " "
echo -en "$(c $P1 $GR) ⢀⣴⣷⣦⡀ $(c $P1 $ST) ⢀⣴⣷⣦⡀ $(c $P1 $SA) ⢀⣴⣷⣦⡀ $(c $P1 $WA) ⢀⣴⣷⣦⡀ "
echo -e "${X}"
# Row 2: Plume body
echo -en " "
echo -en "$(c $P1 $GR) $(c $P2 $GR)⣼$(c $P1 $GR)⣿⣿⣿⣿$(c $P2 $GR)⣧$(c $P1 $GR) $(c $P1 $ST) $(c $P2 $ST)⣼$(c $P1 $ST)⣿⣿⣿⣿$(c $P2 $ST)⣧$(c $P1 $ST) $(c $P1 $SA) $(c $P2 $SA)⣼$(c $P1 $SA)⣿⣿⣿⣿$(c $P2 $SA)⣧$(c $P1 $SA) $(c $P1 $WA) $(c $P2 $WA)⣼$(c $P1 $WA)⣿⣿⣿⣿$(c $P2 $WA)⣧$(c $P1 $WA) "
echo -e "${X}"
# Row 3: Helmet crown with plume base
echo -en " "
echo -en "$(c $M4 $GR) ⣰$(c $M3 $GR)⣿$(c $P2 $GR)⣿⣿⣿⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣆ $(c $M4 $ST) ⣰$(c $M3 $ST)⣿$(c $P2 $ST)⣿⣿⣿⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣆ $(c $M4 $SA) ⣰$(c $M3 $SA)⣿$(c $P2 $SA)⣿⣿⣿⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣆ $(c $M4 $WA) ⣰$(c $M3 $WA)⣿$(c $P2 $WA)⣿⣿⣿⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣆ "
echo -e "${X}"
# Row 4: Helmet dome - bright center
echo -en " "
echo -en "$(c $M5 $GR) ⣼$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M1 $GR)⣿⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR)⣧ $(c $M5 $ST) ⣼$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M1 $ST)⣿⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST)⣧ $(c $M5 $SA) ⣼$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M1 $SA)⣿⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA)⣧ $(c $M5 $WA) ⣼$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M1 $WA)⣿⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA)⣧ "
echo -e "${X}"
# Row 5: Helmet back plate
echo -en " "
echo -en "$(c $M5 $GR) ⣿$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M1 $GR)⣿⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR)⣿ $(c $M5 $ST) ⣿$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M1 $ST)⣿⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST)⣿ $(c $M5 $SA) ⣿$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M1 $SA)⣿⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA)⣿ $(c $M5 $WA) ⣿$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M1 $WA)⣿⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA)⣿ "
echo -e "${X}"
# Row 6: Gorget with gold trim
echo -en " "
echo -en "$(c $M5 $GR) ⠸$(c $M4 $GR)⣿$(c $G1 $GR)⡿$(c $M2 $GR)⣿⣿⣿⣿$(c $G1 $GR)⢿$(c $M4 $GR)⣿$(c $M5 $GR)⠇ $(c $M5 $ST) ⠸$(c $M4 $ST)⣿$(c $G1 $ST)⡿$(c $M2 $ST)⣿⣿⣿⣿$(c $G1 $ST)⢿$(c $M4 $ST)⣿$(c $M5 $ST)⠇ $(c $M5 $SA) ⠸$(c $M4 $SA)⣿$(c $G1 $SA)⡿$(c $M2 $SA)⣿⣿⣿⣿$(c $G1 $SA)⢿$(c $M4 $SA)⣿$(c $M5 $SA)⠇ $(c $M5 $WA) ⠸$(c $M4 $WA)⣿$(c $G1 $WA)⡿$(c $M2 $WA)⣿⣿⣿⣿$(c $G1 $WA)⢿$(c $M4 $WA)⣿$(c $M5 $WA)⠇ "
echo -e "${X}"
# Row 7: Shoulders - wide pauldrons
echo -en " "
echo -en "$(c $C3 $GR)⣴$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M1 $GR)⣿$(c $C2 $GR)⣿⣿$(c $M1 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $C3 $GR)⣦$(c $C3 $ST)⣴$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M1 $ST)⣿$(c $C2 $ST)⣿⣿$(c $M1 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $C3 $ST)⣦$(c $C3 $SA)⣴$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M1 $SA)⣿$(c $C2 $SA)⣿⣿$(c $M1 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $C3 $SA)⣦$(c $C3 $WA)⣴$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M1 $WA)⣿$(c $C2 $WA)⣿⣿$(c $M1 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $C3 $WA)⣦"
echo -e "${X}"
# Row 8: Pauldrons with spikes + cape
echo -en " "
echo -en "$(c $C1 $GR)⣿$(c $M3 $GR)⣿$(c $G1 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $C1 $GR)⣿⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $G1 $GR)⣿$(c $M3 $GR)⣿$(c $C1 $GR)⣿$(c $C1 $ST)⣿$(c $M3 $ST)⣿$(c $G1 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $C1 $ST)⣿⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $G1 $ST)⣿$(c $M3 $ST)⣿$(c $C1 $ST)⣿$(c $C1 $SA)⣿$(c $M3 $SA)⣿$(c $G1 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $C1 $SA)⣿⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $G1 $SA)⣿$(c $M3 $SA)⣿$(c $C1 $SA)⣿$(c $C1 $WA)⣿$(c $M3 $WA)⣿$(c $G1 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $C1 $WA)⣿⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $G1 $WA)⣿$(c $M3 $WA)⣿$(c $C1 $WA)⣿"
echo -e "${X}"
# Row 9: Upper torso + cape + arms start
echo -en " "
echo -en "$(c $C1 $GR)⣿$(c $C2 $GR)⣿$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $C2 $GR)⣿$(c $C1 $GR)⣿⣿$(c $C2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $C2 $GR)⣿$(c $C1 $GR)⣿$(c $C1 $ST)⣿$(c $C2 $ST)⣿$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $C2 $ST)⣿$(c $C1 $ST)⣿⣿$(c $C2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $C2 $ST)⣿$(c $C1 $ST)⣿$(c $C1 $SA)⣿$(c $C2 $SA)⣿$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $C2 $SA)⣿$(c $C1 $SA)⣿⣿$(c $C2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $C2 $SA)⣿$(c $C1 $SA)⣿$(c $C1 $WA)⣿$(c $C2 $WA)⣿$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $C2 $WA)⣿$(c $C1 $WA)⣿⣿$(c $C2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $C2 $WA)⣿$(c $C1 $WA)⣿"
echo -e "${X}"
# Row 10: Shield (left) + torso + sword hilt (right)
echo -en " "
echo -en "$(c $C2 $GR)⣿$(c $SH $GR)⣿$(c $G1 $GR)⣿$(c $SH $GR)⣿$(c $C2 $GR)⣿$(c $C1 $GR)⣿⣿$(c $C2 $GR)⣿$(c $M3 $GR)⣿$(c $G2 $GR)⣿$(c $SW $GR)⡇$(c $C2 $GR)⣿$(c $C2 $ST)⣿$(c $SH $ST)⣿$(c $G1 $ST)⣿$(c $SH $ST)⣿$(c $C2 $ST)⣿$(c $C1 $ST)⣿⣿$(c $C2 $ST)⣿$(c $M3 $ST)⣿$(c $G2 $ST)⣿$(c $SW $ST)⡇$(c $C2 $ST)⣿$(c $C2 $SA)⣿$(c $SH $SA)⣿$(c $G1 $SA)⣿$(c $SH $SA)⣿$(c $C2 $SA)⣿$(c $C1 $SA)⣿⣿$(c $C2 $SA)⣿$(c $M3 $SA)⣿$(c $G2 $SA)⣿$(c $SW $SA)⡇$(c $C2 $SA)⣿$(c $C2 $WA)⣿$(c $SH $WA)⣿$(c $G1 $WA)⣿$(c $SH $WA)⣿$(c $C2 $WA)⣿$(c $C1 $WA)⣿⣿$(c $C2 $WA)⣿$(c $M3 $WA)⣿$(c $G2 $WA)⣿$(c $SW $WA)⡇$(c $C2 $WA)⣿"
echo -e "${X}"
# Row 11: Shield with cross + mid torso + sword blade
echo -en " "
echo -en "$(c $C3 $GR)⣿$(c $SH $GR)⣿$(c $G1 $GR)⣿$(c $G1 $GR)⣿$(c $C2 $GR)⣿$(c $C1 $GR)⣿⣿$(c $C2 $GR)⣿$(c $M4 $GR)⣿$(c $SW $GR)⣿$(c $SW $GR)⡇$(c $C3 $GR)⣿$(c $C3 $ST)⣿$(c $SH $ST)⣿$(c $G1 $ST)⣿$(c $G1 $ST)⣿$(c $C2 $ST)⣿$(c $C1 $ST)⣿⣿$(c $C2 $ST)⣿$(c $M4 $ST)⣿$(c $SW $ST)⣿$(c $SW $ST)⡇$(c $C3 $ST)⣿$(c $C3 $SA)⣿$(c $SH $SA)⣿$(c $G1 $SA)⣿$(c $G1 $SA)⣿$(c $C2 $SA)⣿$(c $C1 $SA)⣿⣿$(c $C2 $SA)⣿$(c $M4 $SA)⣿$(c $SW $SA)⣿$(c $SW $SA)⡇$(c $C3 $SA)⣿$(c $C3 $WA)⣿$(c $SH $WA)⣿$(c $G1 $WA)⣿$(c $G1 $WA)⣿$(c $C2 $WA)⣿$(c $C1 $WA)⣿⣿$(c $C2 $WA)⣿$(c $M4 $WA)⣿$(c $SW $WA)⣿$(c $SW $WA)⡇$(c $C3 $WA)⣿"
echo -e "${X}"
# Row 12: Lower shield + fauld (waist) + sword
echo -en " "
echo -en "$(c $C3 $GR)⠸$(c $SHD $GR)⣿$(c $SH $GR)⣿$(c $SHD $GR)⣿$(c $C2 $GR)⣿$(c $G1 $GR)⣤⣤$(c $C2 $GR)⣿$(c $M4 $GR)⣿$(c $SW $GR)⣿$(c $SWD $GR)⡇$(c $C3 $GR)⠇$(c $C3 $ST)⠸$(c $SHD $ST)⣿$(c $SH $ST)⣿$(c $SHD $ST)⣿$(c $C2 $ST)⣿$(c $G1 $ST)⣤⣤$(c $C2 $ST)⣿$(c $M4 $ST)⣿$(c $SW $ST)⣿$(c $SWD $ST)⡇$(c $C3 $ST)⠇$(c $C3 $SA)⠸$(c $SHD $SA)⣿$(c $SH $SA)⣿$(c $SHD $SA)⣿$(c $C2 $SA)⣿$(c $G1 $SA)⣤⣤$(c $C2 $SA)⣿$(c $M4 $SA)⣿$(c $SW $SA)⣿$(c $SWD $SA)⡇$(c $C3 $SA)⠇$(c $C3 $WA)⠸$(c $SHD $WA)⣿$(c $SH $WA)⣿$(c $SHD $WA)⣿$(c $C2 $WA)⣿$(c $G1 $WA)⣤⣤$(c $C2 $WA)⣿$(c $M4 $WA)⣿$(c $SW $WA)⣿$(c $SWD $WA)⡇$(c $C3 $WA)⠇"
echo -e "${X}"
# Row 13: Tassets + cape behind
echo -en " "
echo -en "$(c $C3 $GR) ⠈$(c $C2 $GR)⠻$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $C2 $GR)⠟$(c $C3 $GR)⠁ $(c $C3 $ST) ⠈$(c $C2 $ST)⠻$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $C2 $ST)⠟$(c $C3 $ST)⠁ $(c $C3 $SA) ⠈$(c $C2 $SA)⠻$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $C2 $SA)⠟$(c $C3 $SA)⠁ $(c $C3 $WA) ⠈$(c $C2 $WA)⠻$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $C2 $WA)⠟$(c $C3 $WA)⠁ "
echo -e "${X}"
# Row 14: Upper legs (cuisses) - WIDER
echo -en " "
echo -en "$(c $M5 $GR) $(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M5 $GR) $(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M5 $GR) $(c $M5 $ST) $(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M5 $ST) $(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M5 $ST) $(c $M5 $SA) $(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M5 $SA) $(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M5 $SA) $(c $M5 $WA) $(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M5 $WA) $(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M5 $WA) "
echo -e "${X}"
# Row 15: Knee guards (poleyns) with gold
echo -en " "
echo -en "$(c $M5 $GR) $(c $M4 $GR)⣿$(c $G1 $GR)⣿$(c $M2 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR) $(c $M4 $GR)⣿$(c $M2 $GR)⣿$(c $G1 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR) $(c $M5 $ST) $(c $M4 $ST)⣿$(c $G1 $ST)⣿$(c $M2 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST) $(c $M4 $ST)⣿$(c $M2 $ST)⣿$(c $G1 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST) $(c $M5 $SA) $(c $M4 $SA)⣿$(c $G1 $SA)⣿$(c $M2 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA) $(c $M4 $SA)⣿$(c $M2 $SA)⣿$(c $G1 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA) $(c $M5 $WA) $(c $M4 $WA)⣿$(c $G1 $WA)⣿$(c $M2 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA) $(c $M4 $WA)⣿$(c $M2 $WA)⣿$(c $G1 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA) "
echo -e "${X}"
# Row 16: Greaves (shin) - WIDER
echo -en " "
echo -en "$(c $M5 $GR) $(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR) $(c $M4 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR) $(c $M5 $ST) $(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST) $(c $M4 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST) $(c $M5 $SA) $(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA) $(c $M4 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA) $(c $M5 $WA) $(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA) $(c $M4 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA) "
echo -e "${X}"
# Row 17: Lower greaves
echo -en " "
echo -en "$(c $M5 $GR) $(c $M5 $GR)⢸$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR)⡇$(c $M5 $GR) $(c $M5 $GR)⢸$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR)⡇ $(c $M5 $ST) $(c $M5 $ST)⢸$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST)⡇$(c $M5 $ST) $(c $M5 $ST)⢸$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST)⡇ $(c $M5 $SA) $(c $M5 $SA)⢸$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA)⡇$(c $M5 $SA) $(c $M5 $SA)⢸$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA)⡇ $(c $M5 $WA) $(c $M5 $WA)⢸$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA)⡇$(c $M5 $WA) $(c $M5 $WA)⢸$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA)⡇ "
echo -e "${X}"
# Row 18: Sabatons (feet)
echo -en " "
echo -en "$(c $M5 $GR) ⣠$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR)⣄$(c $M4 $GR)⣿$(c $M3 $GR)⣿$(c $M2 $GR)⣿$(c $M3 $GR)⣿$(c $M4 $GR)⣿$(c $M5 $GR)⣄ $(c $M5 $ST) ⣠$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST)⣄$(c $M4 $ST)⣿$(c $M3 $ST)⣿$(c $M2 $ST)⣿$(c $M3 $ST)⣿$(c $M4 $ST)⣿$(c $M5 $ST)⣄ $(c $M5 $SA) ⣠$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA)⣄$(c $M4 $SA)⣿$(c $M3 $SA)⣿$(c $M2 $SA)⣿$(c $M3 $SA)⣿$(c $M4 $SA)⣿$(c $M5 $SA)⣄ $(c $M5 $WA) ⣠$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA)⣄$(c $M4 $WA)⣿$(c $M3 $WA)⣿$(c $M2 $WA)⣿$(c $M3 $WA)⣿$(c $M4 $WA)⣿$(c $M5 $WA)⣄ "
echo -e "${X}"
# Row 19: Ground shadow
echo -en " "
echo -en "$(c $SD $GR) ⠈⠉⠛⠛⠛⠛⠛⠛⠉⠁ $(c $SD $ST) ⠈⠉⠛⠛⠛⠛⠛⠛⠉⠁ $(c $SD $SA) ⠈⠉⠛⠛⠛⠛⠛⠛⠉⠁ $(c $SD $WA) ⠈⠉⠛⠛⠛⠛⠛⠛⠉⠁ "
echo -e "${X}"
# Row 20: Terrain texture 1
echo -en " "
echo -en "$(c 60 130 60 $GR)⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿$(c 105 105 110 $ST)⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿$(c 190 170 130 $SA)⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿$(c 70 120 160 $WA)⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿"
echo -e "${X}"
# Row 21: Terrain texture 2
echo -en " "
echo -en "$(c 35 75 35 $GR)⢻⣛⣛⣻⢻⣛⣛⣻⢻⣛⣛⣻$(c 65 65 70 $ST)⣿⣤⣤⣿⣿⣤⣤⣿⣿⣤⣤⣿$(c 150 130 90 $SA)⣀⣠⣄⣀⣀⣠⣄⣀⣀⣠⣄⣀$(c 90 140 180 $WA)⢀⣠⣤⣀⢀⣠⣤⣀⢀⣠⣤⣀"
echo -e "${X}"
echo ""
echo " ┌─────────────────────────────────────────────────────────────────────────────────────┐"
echo " │ IMPROVEMENTS IN V2 │"
echo " ├─────────────────────────────────────────────────────────────────────────────────────┤"
echo " │ • Wider legs for better proportions │"
echo " │ • Larger feet (sabatons) for stability │"
echo " │ • Higher contrast metal shading (5 levels) │"
echo " │ • Cleaner gold trim on gorget and knees │"
echo " │ • Shield with visible gold cross pattern │"
echo " │ • Ground shadow for depth │"
echo " │ • Tighter tile spacing │"
echo " │ • Richer terrain textures │"
echo " └─────────────────────────────────────────────────────────────────────────────────────┘"
echo ""

View file

@ -1,156 +0,0 @@
#!/bin/bash
# Reptile Lord - Method 1: Half-Block Characters (▀ ▄)
# Each cell = 2 vertical pixels using foreground + background color
# ▀ = top pixel (foreground), bottom pixel (background)
# ▄ = bottom pixel (foreground), top pixel (background)
# Full block = both same color, space = both background
clear
echo ""
echo " ╔═══════════════════════════════════════════════════════════════════════════╗"
echo " ║ REPTILE LORD - HALF-BLOCK METHOD (2 vertical pixels/cell) ║"
echo " ╚═══════════════════════════════════════════════════════════════════════════╝"
echo ""
# Color function: fg;bg
# Usage: $(c 0 100 0 50 50 50) = green foreground, dark gray background
c() {
echo -en "\033[38;2;$1;$2;$3m\033[48;2;$4;$5;$6m"
}
X="\033[0m"
# Colors (R G B)
# BG = transparent/background (dark purple for visibility)
BG="40 30 50"
# Scales
S1="0 120 80" # Dark green scales
S2="0 160 100" # Mid green scales
S3="0 200 120" # Light green scales/highlight
# Underbelly
U1="180 160 100" # Tan underbelly
U2="200 180 120" # Light tan
# Eyes
EY="255 200 0" # Yellow eyes
EP="0 0 0" # Pupil
# Claws/horns
CL="60 50 40" # Dark brown claws
CH="80 70 60" # Horn highlight
# Mouth
MO="150 50 50" # Red mouth interior
echo " ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────────┐"
echo " │ FACING DOWN │ │ FACING LEFT │ │ FACING RIGHT │"
echo " └─────────────────────┘ └─────────────────────┘ └─────────────────────┘"
echo ""
# Each sprite is 10 cells wide x 12 cells tall = 10x24 "pixels"
# Row pairs (each row represents 2 pixel rows via half-blocks)
# --- FACING DOWN ---
# Using ▀ (upper half) and ▄ (lower half) and █ (full) and space (empty)
# Row 1-2: Top of head with small horns
echo -en " "
echo -en "$(c $BG $BG) $(c $CL $BG)▄$(c $S1 $BG)▄▄▄▄$(c $CL $BG)▄$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $BG $BG) $(c $CL $BG)▄$(c $S1 $BG)▄▄▄▄$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $BG)▄▄▄▄$(c $CL $BG)▄$(c $BG $BG) $(c $BG $BG) "
echo -e "${X}"
# Row 3-4: Upper head with eyes
echo -en " "
echo -en "$(c $S2 $S1)▄$(c $S1 $S1)█$(c $EY $S1)▀$(c $S2 $S1)▄▄$(c $EY $S1)▀$(c $S1 $S1)█$(c $S2 $S1)▄"
echo -en " "
echo -en "$(c $BG $BG) $(c $S2 $S1)▄$(c $S1 $S1)█$(c $EY $S1)▀$(c $S2 $S1)▄▄$(c $S1 $S1)█$(c $S2 $S1)▄$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S2 $S1)▄$(c $S1 $S1)█$(c $S2 $S1)▄▄$(c $EY $S1)▀$(c $S1 $S1)█$(c $S2 $S1)▄$(c $BG $BG) "
echo -e "${X}"
# Row 5-6: Snout/muzzle
echo -en " "
echo -en "$(c $S1 $S2)▄$(c $S2 $S2)█$(c $S3 $S2)▀$(c $U1 $S2)▄▄$(c $S3 $S2)▀$(c $S2 $S2)█$(c $S1 $S2)▄"
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S2)▄$(c $S2 $S2)██$(c $U1 $S2)▄$(c $S2 $S2)██$(c $S1 $S2)▄$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S2)▄$(c $S2 $S2)██$(c $U1 $S2)▄$(c $S2 $S2)██$(c $S1 $S2)▄$(c $BG $BG) "
echo -e "${X}"
# Row 7-8: Neck/shoulders
echo -en " "
echo -en "$(c $S1 $BG)▀$(c $S2 $S1)▄$(c $U1 $S2)▄$(c $U2 $U1)▀▀$(c $U1 $S2)▄$(c $S2 $S1)▄$(c $S1 $BG)▀"
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $BG)▀$(c $S2 $S1)▄$(c $U1 $U1)██$(c $S2 $S1)▄▄$(c $BG $BG) $(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $BG $BG) $(c $S2 $S1)▄▄$(c $U1 $U1)██$(c $S2 $S1)▄$(c $S1 $BG)▀$(c $BG $BG) "
echo -e "${X}"
# Row 9-10: Upper torso with arms
echo -en " "
echo -en "$(c $CL $BG)▄$(c $S1 $S2)▄$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S2)▄$(c $CL $BG)▄"
echo -en " "
echo -en "$(c $CL $BG)▄$(c $S1 $BG)▀$(c $S2 $S1)▄$(c $U1 $U1)██$(c $S2 $S1)▄$(c $S1 $S2)▄$(c $S2 $BG)▀$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S2 $BG)▀$(c $S1 $S2)▄$(c $S2 $S1)▄$(c $U1 $U1)██$(c $S2 $S1)▄$(c $S1 $BG)▀$(c $CL $BG)▄"
echo -e "${X}"
# Row 11-12: Lower torso
echo -en " "
echo -en "$(c $CL $CL)█$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $CL)█"
echo -en " "
echo -en "$(c $CL $CL)█$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S1)█$(c $S1 $BG)▀$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $BG)▀$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $CL)█"
echo -e "${X}"
# Row 13-14: Hips
echo -en " "
echo -en "$(c $BG $CL)▀$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S1)█$(c $BG $CL)▀"
echo -en " "
echo -en "$(c $BG $CL)▀$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S1)█$(c $BG $BG) $(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $BG $BG) $(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)██$(c $S2 $S2)█$(c $S1 $S1)█$(c $BG $CL)▀"
echo -e "${X}"
# Row 15-16: Upper legs
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S2 $BG)▀$(c $BG $BG) $(c $BG $BG) $(c $S2 $BG)▀$(c $S1 $S1)█$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) $(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $S1 $BG)▄$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $BG)▄$(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) $(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) "
echo -e "${X}"
# Row 17-18: Lower legs
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) $(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) $(c $BG $BG) $(c $S1 $S1)█$(c $S1 $BG)▀$(c $S1 $S1)█$(c $BG $BG) "
echo -en " "
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $BG)▀$(c $S1 $S1)█$(c $BG $BG) $(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) "
echo -e "${X}"
# Row 19-20: Feet with claws
echo -en " "
echo -en "$(c $CL $BG)▄$(c $S1 $S1)█$(c $CL $S1)▄$(c $BG $BG) $(c $BG $BG) $(c $CL $S1)▄$(c $S1 $S1)█$(c $CL $BG)▄"
echo -en " "
echo -en "$(c $CL $BG)▄$(c $S1 $S1)█$(c $CL $S1)▄$(c $BG $BG) $(c $BG $BG) $(c $S1 $BG)▀$(c $CL $S1)▄$(c $S1 $S1)█$(c $CL $BG)▄"
echo -en " "
echo -en "$(c $CL $BG)▄$(c $S1 $S1)█$(c $CL $S1)▄$(c $S1 $BG)▀$(c $BG $BG) $(c $BG $BG) $(c $CL $S1)▄$(c $S1 $S1)█$(c $CL $BG)▄"
echo -e "${X}"
# Row 21-22: Claws
echo -en " "
echo -en "$(c $BG $CL)▀$(c $CL $CL)█$(c $BG $CL)▀$(c $BG $BG) $(c $BG $BG) $(c $BG $CL)▀$(c $CL $CL)█$(c $BG $CL)▀"
echo -en " "
echo -en "$(c $BG $CL)▀$(c $CL $CL)█$(c $BG $CL)▀$(c $BG $BG) $(c $BG $BG) $(c $BG $BG) $(c $BG $CL)▀$(c $CL $CL)█$(c $BG $CL)▀"
echo -en " "
echo -en "$(c $BG $CL)▀$(c $CL $CL)█$(c $BG $CL)▀$(c $BG $BG) $(c $BG $BG) $(c $BG $BG) $(c $BG $CL)▀$(c $CL $CL)█$(c $BG $CL)▀"
echo -e "${X}"
echo ""
echo " Resolution: 10×24 pixels per sprite (10 cells × 12 rows, 2 vertical pixels/cell)"
echo " Characters: ▀ (upper half), ▄ (lower half), █ (full block), space (empty)"
echo " Colors: Foreground = top pixel, Background = bottom pixel"
echo ""

View file

@ -1,180 +0,0 @@
#!/bin/bash
# Reptile Lord - Method 2: Quadrant Block Characters
# Each cell = 2×2 subpixels (4 pixels per cell)
#
# Quadrant characters (2-color only: fg + bg):
# ▖ = bottom-left ▗ = bottom-right
# ▘ = top-left ▝ = top-right
# ▌ = left half ▐ = right half
# ▀ = top half ▄ = bottom half
# ▙ = all except top-right ▟ = all except top-left
# ▛ = all except bottom-right ▜ = all except bottom-left
# █ = full block (space) = empty
#
# Limitation: Only 2 colors per cell (foreground + background)
clear
echo ""
echo " ╔═══════════════════════════════════════════════════════════════════════════╗"
echo " ║ REPTILE LORD - QUADRANT BLOCKS (2×2 subpixels/cell) ║"
echo " ╚═══════════════════════════════════════════════════════════════════════════╝"
echo ""
# Color helper
c() {
echo -en "\033[38;2;$1;$2;$3m\033[48;2;$4;$5;$6m"
}
X="\033[0m"
# Palette
BG="30 25 40" # Background
S1="0 100 70" # Dark scales
S2="0 140 90" # Mid scales
S3="0 180 110" # Light scales
U1="170 150 90" # Underbelly dark
U2="190 170 110" # Underbelly light
EY="255 200 0" # Eye
CL="50 40 35" # Claw
HR="70 60 50" # Horn
echo " ┌───────────────────────────────────────────────────────────────────────────┐"
echo " │ FACING FORWARD (Idle) ATTACK FRAME WALKING FRAME │"
echo " └───────────────────────────────────────────────────────────────────────────┘"
echo ""
# Sprite: 8 cells wide × 10 cells tall = 16×20 subpixels
# Building row by row (each cell is 2×2)
# --- ROW 1: Horns and top of head ---
echo -en " "
# IDLE
echo -en "$(c $BG $BG) $(c $HR $BG)▖$(c $S1 $BG)▄▄$(c $HR $BG)▗$(c $BG $BG) "
echo -en " "
# ATTACK - horns more prominent
echo -en "$(c $HR $BG)▗$(c $HR $BG)▖$(c $S1 $BG)▄▄$(c $HR $BG)▗$(c $HR $BG)▖$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $BG $BG) $(c $HR $BG)▖$(c $S1 $BG)▄▄$(c $HR $BG)▗$(c $BG $BG) "
echo -e "${X}"
# --- ROW 2: Upper head with eyes ---
echo -en " "
# IDLE
echo -en "$(c $S2 $S1)▙$(c $S1 $S1)█$(c $EY $S1)▐$(c $S1 $S1)█$(c $EY $S1)▌$(c $S1 $S1)█$(c $S2 $S1)▟$(c $BG $BG) "
echo -en " "
# ATTACK - angry eyes
echo -en "$(c $S2 $S1)▙$(c $S1 $S1)█$(c $EY $S1)▄$(c $S1 $S1)█$(c $EY $S1)▄$(c $S1 $S1)█$(c $S2 $S1)▟$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $S2 $S1)▙$(c $S1 $S1)█$(c $EY $S1)▐$(c $S1 $S1)█$(c $EY $S1)▌$(c $S1 $S1)█$(c $S2 $S1)▟$(c $BG $BG) "
echo -e "${X}"
# --- ROW 3: Snout/muzzle ---
echo -en " "
# IDLE
echo -en "$(c $S1 $S2)▜$(c $S2 $S2)█$(c $U1 $S2)▄▄$(c $S2 $S2)█$(c $S1 $S2)▛$(c $BG $BG) "
echo -en " "
# ATTACK - open mouth
echo -en "$(c $S1 $S2)▜$(c $S2 $S2)█$(c $U1 $S2)▀▀$(c $S2 $S2)█$(c $S1 $S2)▛$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $S1 $S2)▜$(c $S2 $S2)█$(c $U1 $S2)▄▄$(c $S2 $S2)█$(c $S1 $S2)▛$(c $BG $BG) "
echo -e "${X}"
# --- ROW 4: Neck ---
echo -en " "
# IDLE
echo -en "$(c $BG $BG) $(c $S1 $S2)▜$(c $U1 $U1)██$(c $S1 $S2)▛$(c $BG $BG) "
echo -en " "
# ATTACK
echo -en "$(c $BG $BG) $(c $S1 $S2)▜$(c $U1 $U1)██$(c $S1 $S2)▛$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $BG $BG) $(c $S1 $S2)▜$(c $U1 $U1)██$(c $S1 $S2)▛$(c $BG $BG) "
echo -e "${X}"
# --- ROW 5: Shoulders/arms ---
echo -en " "
# IDLE - arms down
echo -en "$(c $CL $BG)▗$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $BG)▖$(c $BG $BG) "
echo -en " "
# ATTACK - arms raised
echo -en "$(c $CL $S1)▗$(c $S1 $BG)▘$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $BG)▝$(c $CL $S1)▖$(c $BG $BG) "
echo -en " "
# WALK - one arm forward
echo -en "$(c $S1 $BG)▗$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $BG)▖$(c $BG $BG) "
echo -e "${X}"
# --- ROW 6: Torso ---
echo -en " "
# IDLE
echo -en "$(c $CL $CL)█$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $CL)█$(c $BG $BG) "
echo -en " "
# ATTACK
echo -en "$(c $CL $CL)█$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $CL)█$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $CL $BG)▝$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $CL $CL)█$(c $BG $BG) "
echo -e "${X}"
# --- ROW 7: Lower torso/hips ---
echo -en " "
# IDLE
echo -en "$(c $BG $CL)▀$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $BG $CL)▀$(c $BG $BG) "
echo -en " "
# ATTACK
echo -en "$(c $BG $CL)▀$(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $BG $CL)▀$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S2 $S2)█$(c $U1 $U1)█$(c $S2 $S2)█$(c $S1 $S1)█$(c $BG $CL)▀$(c $BG $BG) "
echo -e "${X}"
# --- ROW 8: Upper legs ---
echo -en " "
# IDLE
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $BG)▘$(c $BG $BG) $(c $S1 $BG)▝$(c $S1 $S1)█$(c $BG $BG) "
echo -en " "
# ATTACK - wide stance
echo -en "$(c $S1 $BG)▗$(c $S1 $S1)█$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $BG)▖$(c $BG $BG) "
echo -en " "
# WALK - mid stride
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $BG)▝$(c $BG $BG) $(c $S1 $BG)▘$(c $S1 $S1)█$(c $BG $BG) "
echo -e "${X}"
# --- ROW 9: Lower legs ---
echo -en " "
# IDLE
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) "
echo -en " "
# ATTACK
echo -en "$(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $S1)█$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $BG $BG) $(c $S1 $S1)█$(c $S1 $BG)▘$(c $BG $BG) $(c $BG $BG) $(c $S1 $BG)▝$(c $S1 $S1)█$(c $BG $BG) "
echo -e "${X}"
# --- ROW 10: Feet with claws ---
echo -en " "
# IDLE
echo -en "$(c $CL $BG)▖$(c $S1 $S1)█$(c $CL $BG)▗$(c $BG $BG) $(c $CL $BG)▖$(c $S1 $S1)█$(c $CL $BG)▗$(c $BG $BG) "
echo -en " "
# ATTACK
echo -en "$(c $CL $S1)▙$(c $S1 $S1)█$(c $CL $BG)▗$(c $BG $BG) $(c $CL $BG)▖$(c $S1 $S1)█$(c $CL $S1)▟$(c $BG $BG) "
echo -en " "
# WALK
echo -en "$(c $CL $BG)▖$(c $S1 $S1)█$(c $CL $BG)▗$(c $BG $BG) $(c $BG $BG) $(c $CL $BG)▖$(c $S1 $S1)█$(c $CL $BG)▗"
echo -e "${X}"
echo ""
echo " ┌───────────────────────────────────────────────────────────────────────────┐"
echo " │ QUADRANT BLOCK REFERENCE │"
echo " ├───────────────────────────────────────────────────────────────────────────┤"
echo " │ ▘ top-left ▝ top-right ▖ bottom-left ▗ bottom-right │"
echo " │ ▌ left-half ▐ right-half ▀ top-half ▄ bottom-half │"
echo " │ ▛ no-BR ▜ no-BL ▙ no-TR ▟ no-TL │"
echo " │ █ full (space) empty │"
echo " └───────────────────────────────────────────────────────────────────────────┘"
echo ""
echo " Resolution: 16×20 subpixels per sprite (8 cells × 10 rows, 2×2 per cell)"
echo " Limitation: Only 2 colors per cell (foreground + background)"
echo ""

View file

@ -1,280 +0,0 @@
#!/bin/bash
# Reptile Lord - Method 3: Braille Characters (Highest Resolution)
# Each cell = 2×4 dots (8 subpixels per cell!)
#
# Braille dot numbering:
# 1 4
# 2 5
# 3 6
# 7 8
#
# Character = U+2800 + sum of dot values
# dot1=1, dot2=2, dot3=4, dot4=8, dot5=16, dot6=32, dot7=64, dot8=128
#
# Limitation: Single color per character (foreground only, no per-dot colors)
# Best for: Silhouettes, outlines, high-detail monochrome sprites
clear
echo ""
echo " ╔═══════════════════════════════════════════════════════════════════════════╗"
echo " ║ REPTILE LORD - BRAILLE METHOD (2×4 dots/cell = 8 subpixels) ║"
echo " ╚═══════════════════════════════════════════════════════════════════════════╝"
echo ""
# Color function (foreground only for braille)
fg() {
echo -en "\033[38;2;$1;$2;$3m"
}
X="\033[0m"
# Common braille characters reference:
# ⣿ = full (255) ⠀ = empty (0)
# ⡇ = left col (71) ⢸ = right col (184)
# ⠉ = top row (9) ⣀ = bottom row (192)
# ⠛ = top 2 rows (27) ⣤ = bottom 2 rows (228)
# ⡿ = all but top-right (127) ⣾ = all but top-left (254)
# ⣷ = all but bottom-right (247) ⣯ = all but bottom-left (239)
echo " ┌─────────────────────────────────────────────────────────────────────────┐"
echo " │ MONOCHROME SILHOUETTES - Maximum Detail │"
echo " └─────────────────────────────────────────────────────────────────────────┘"
echo ""
# Green reptile lord
G="0 200 100"
echo -en " "
echo -en "$(fg $G)"
# IDLE POSE - 10 cells wide x 8 cells tall = 20×32 "dots"
echo " IDLE ATTACK WALK LEFT WALK RIGHT"
echo ""
# Row 1: Horns
echo -en " $(fg $G)"
echo -en " ⢀⣴⣾⣷⣦⡀ "
echo -en " "
echo -en "⢀⣴⣾⣿⣷⣦⡀ "
echo -en " "
echo -en " ⢀⣴⣾⣷⣦⡀ "
echo -en " "
echo -en " ⢀⣴⣾⣷⣦⡀ "
echo -e "${X}"
# Row 2: Upper head
echo -en " $(fg $G)"
echo -en " ⣼⣿⡟⠛⢻⣿⣧ "
echo -en " "
echo -en "⣼⣿⡟⠿⠿⢻⣿⣧ "
echo -en " "
echo -en " ⣼⣿⡟⠛⢻⣿⣧ "
echo -en " "
echo -en " ⣼⣿⡟⠛⢻⣿⣧ "
echo -e "${X}"
# Row 3: Eyes and snout
echo -en " $(fg $G)"
echo -en " ⣿⣿⣿⣶⣶⣿⣿⣿ "
echo -en " "
echo -en "⣿⣿⣿⣭⣭⣿⣿⣿ "
echo -en " "
echo -en " ⣿⣿⣿⣶⣶⣿⣿⣿ "
echo -en " "
echo -en " ⣿⣿⣿⣶⣶⣿⣿⣿ "
echo -e "${X}"
# Row 4: Lower head/jaw
echo -en " $(fg $G)"
echo -en " ⠹⣿⣿⣿⣿⠏ "
echo -en " "
echo -en " ⠹⣿⣿⣿⣿⣿⠏ "
echo -en " "
echo -en " ⠹⣿⣿⣿⣿⠏ "
echo -en " "
echo -en " ⠹⣿⣿⣿⣿⠏ "
echo -e "${X}"
# Row 5: Neck/shoulders
echo -en " $(fg $G)"
echo -en " ⣿⣿⣿⣿⣿ "
echo -en " "
echo -en " ⢸⣿⣿⣿⣿⡇ "
echo -en " "
echo -en " ⣿⣿⣿⣿⣿ "
echo -en " "
echo -en " ⣿⣿⣿⣿⣿ "
echo -e "${X}"
# Row 6: Arms/torso
echo -en " $(fg $G)"
echo -en " ⣼⣿⣿⣿⣿⣿⣿⣧ "
echo -en " "
echo -en "⣿⡿⣿⣿⣿⣿⣿⢿⣿"
echo -en " "
echo -en "⣀⣿⣿⣿⣿⣿⣿⣿ "
echo -en " "
echo -en " ⣿⣿⣿⣿⣿⣿⣿⣀"
echo -e "${X}"
# Row 7: Lower torso
echo -en " $(fg $G)"
echo -en " ⠸⣿⣿⣿⣿⣿⣿⠇ "
echo -en " "
echo -en "⠈⠃⣿⣿⣿⣿⣿⠘⠁"
echo -en " "
echo -en " ⣿⣿⣿⣿⣿⣿⣿ "
echo -en " "
echo -en " ⣿⣿⣿⣿⣿⣿⣿ "
echo -e "${X}"
# Row 8: Hips
echo -en " $(fg $G)"
echo -en " ⢸⣿⣿⣿⣿⡇ "
echo -en " "
echo -en " ⣿⣿⣿⣿⣿⣿ "
echo -en " "
echo -en " ⠸⣿⣿⣿⣿⠇ "
echo -en " "
echo -en " ⠸⣿⣿⣿⣿⠇ "
echo -e "${X}"
# Row 9: Upper legs
echo -en " $(fg $G)"
echo -en " ⢸⣿⠁⠈⣿⡇ "
echo -en " "
echo -en " ⣾⣿ ⣿⣷ "
echo -en " "
echo -en " ⣿⣿ ⣿⣷ "
echo -en " "
echo -en " ⣾⣿ ⣿⣿ "
echo -e "${X}"
# Row 10: Lower legs
echo -en " $(fg $G)"
echo -en " ⢸⣿ ⣿⡇ "
echo -en " "
echo -en "⣸⣿⠇ ⠸⣿⣇"
echo -en " "
echo -en " ⣿⡇ ⣿⡇ "
echo -en " "
echo -en " ⢸⣿ ⢸⣿ "
echo -e "${X}"
# Row 11: Feet
echo -en " $(fg $G)"
echo -en " ⣿⣿⡄⢠⣿⣿ "
echo -en " "
echo -en "⣿⣿⠃ ⠘⣿⣿"
echo -en " "
echo -en " ⣼⣿⡄ ⢠⣿⣧ "
echo -en " "
echo -en " ⣼⣿⡄ ⢠⣿⣧ "
echo -e "${X}"
# Row 12: Claws
echo -en " $(fg $G)"
echo -en " ⠛⠛ ⠛⠛ "
echo -en " "
echo -en "⠛⠛ ⠛⠛"
echo -en " "
echo -en " ⠛⠃ ⠘⠛ "
echo -en " "
echo -en " ⠛⠃ ⠘⠛ "
echo -e "${X}"
echo ""
echo ""
# Multi-colored version using background + foreground trick
echo " ┌─────────────────────────────────────────────────────────────────────────┐"
echo " │ COLORED VERSION - Using colored backgrounds behind braille │"
echo " └─────────────────────────────────────────────────────────────────────────┘"
echo ""
# For colored braille, we use:
# - Background color for the "off" dots
# - Foreground color for the "on" dots
# This gives us 2-color braille
cf() {
echo -en "\033[38;2;$1;$2;$3m\033[48;2;$4;$5;$6m"
}
# Colors
SCALE="0 180 100" # Green scales (foreground/dots)
BG="20 15 30" # Dark purple background
EYE="255 220 0" # Yellow eyes
BELLY="200 180 120" # Tan underbelly
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⢀⣴⣾⣷⣦⡀ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⣼⣿"
echo -en "$(cf $EYE $BG)⠿⠿"
echo -en "$(cf $SCALE $BG)⣿⣧ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⣿⣿"
echo -en "$(cf $BELLY $BG)⣶⣶"
echo -en "$(cf $SCALE $BG)⣿⣿ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⠹⣿⣿⣿⣿⠏ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⣿"
echo -en "$(cf $BELLY $BG)⣿⣿"
echo -en "$(cf $SCALE $BG)⣿ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⣼⣿"
echo -en "$(cf $BELLY $BG)⣿⣿"
echo -en "$(cf $SCALE $BG)⣿⣧ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⠸⣿"
echo -en "$(cf $BELLY $BG)⣿⣿"
echo -en "$(cf $SCALE $BG)⣿⠇ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⢸⣿ ⣿⡇ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⣿⣿ ⣿⣿ "
echo -e "${X}"
echo -en " "
echo -en "$(cf $SCALE $BG)"
echo -en " ⠛⠛ ⠛⠛ "
echo -e "${X}"
echo ""
echo " ┌─────────────────────────────────────────────────────────────────────────┐"
echo " │ BRAILLE DOT PATTERN │"
echo " ├─────────────────────────────────────────────────────────────────────────┤"
echo " │ 1 4 Values: 1=1, 2=2, 3=4, 4=8, 5=16, 6=32, 7=64, 8=128 │"
echo " │ 2 5 Character = U+2800 + sum(dot values) │"
echo " │ 3 6 Example: ⣿ = all dots = 1+2+4+8+16+32+64+128 = 255 = U+28FF │"
echo " │ 7 8 │"
echo " └─────────────────────────────────────────────────────────────────────────┘"
echo ""
echo " Resolution: 20×32 dots per sprite (10 cells × 8 rows, 2×4 dots per cell)"
echo " Best for: High-detail silhouettes, outlines, retro terminal aesthetics"
echo ""

View file

@ -1,69 +0,0 @@
#!/bin/bash
printf "\n\033[1m WALKING DOWN\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;70;70;80m▄███▄\033[0m \033[38;2;70;70;80m▄███▄\033[0m \033[38;2;70;70;80m▄███▄\033[0m \033[38;2;70;70;80m▄███▄\033[0m\n"
printf " \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m\n"
printf " \033[38;2;50;50;60m█████\033[0m \033[38;2;50;50;60m█████\033[0m \033[38;2;50;50;60m█████\033[0m \033[38;2;50;50;60m█████\033[0m\n"
printf " \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m\n"
printf " \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m\n"
printf " \033[38;2;70;70;80m███\033[38;2;255;50;50m███\033[38;2;70;70;80m███\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m███\033[38;2;70;70;80m███\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m███\033[38;2;70;70;80m███\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m███\033[38;2;70;70;80m███\033[0m\n"
printf " \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m\n"
printf " \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;70;70;80m██\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m\n"
printf "\n\033[1m WALKING UP\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;70;70;80m▄███▄\033[0m \033[38;2;70;70;80m▄███▄\033[0m \033[38;2;70;70;80m▄███▄\033[0m \033[38;2;70;70;80m▄███▄\033[0m\n"
printf " \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m\n"
printf " \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m\n"
printf " \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m \033[38;2;70;70;80m███████\033[0m\n"
printf " \033[38;2;50;50;60m█████\033[0m \033[38;2;50;50;60m█████\033[0m \033[38;2;50;50;60m█████\033[0m \033[38;2;50;50;60m█████\033[0m\n"
printf " \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m\n"
printf " \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██▄\033[0m\n"
printf " \033[38;2;70;70;80m█████████\033[0m \033[38;2;70;70;80m█████████\033[0m \033[38;2;70;70;80m█████████\033[0m \033[38;2;70;70;80m█████████\033[0m\n"
printf " \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m██\033[0m\n"
printf " \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m███\033[38;2;50;50;60m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[38;2;70;70;80m██\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m\n"
printf "\n\033[1m WALKING LEFT\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;70;70;80m▄██▄\033[0m \033[38;2;70;70;80m▄██▄\033[0m \033[38;2;70;70;80m▄██▄\033[0m \033[38;2;70;70;80m▄██▄\033[0m\n"
printf " \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m\n"
printf " \033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m \033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m \033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m \033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m\n"
printf " \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m\n"
printf " \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m\n"
printf " \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m▄██\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m▄██\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m\n"
printf " \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m███\033[0m\n"
printf "\n\033[1m WALKING RIGHT\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;70;70;80m▄██▄\033[0m \033[38;2;70;70;80m▄██▄\033[0m \033[38;2;70;70;80m▄██▄\033[0m \033[38;2;70;70;80m▄██▄\033[0m\n"
printf " \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m\n"
printf " \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[0m \033[38;2;70;70;80m███\033[38;2;255;50;50m██\033[0m\n"
printf " \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m \033[38;2;70;70;80m█████\033[0m\n"
printf " \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m██▄\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m██▄\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m██\033[38;2;70;70;80m███\033[0m\n"
printf " \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m \033[38;2;50;50;60m█\033[38;2;255;50;50m██\033[38;2;50;50;60m█\033[0m\n"
printf " \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m█\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m██\033[0m \033[38;2;70;70;80m█\033[0m\n"
printf " \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m██\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m███\033[0m \033[38;2;50;50;60m██\033[0m\n"
printf "\n"

104
robot2.sh
View file

@ -1,104 +0,0 @@
#!/bin/bash
# Dark Android Sprite Sheet - Full tile pixels with shading
# Colors: Body=70,70,80 Shadow=45,45,55 Highlight=95,95,105 Red=255,50,50 DarkRed=180,30,30
echo ""
echo -e "\033[1m WALKING DOWN\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m\n"
echo ""
echo -e "\033[1m WALKING UP\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m\n"
echo ""
echo -e "\033[1m WALKING LEFT\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m \033[48;2;180;30;30m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m\n"
echo ""
echo -e "\033[1m WALKING RIGHT\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;95;95;105m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;180;30;30m \033[0m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[0m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[0m \033[48;2;70;70;80m \033[48;2;180;30;30m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[48;2;255;50;50m \033[48;2;45;45;55m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;45;45;55m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[48;2;255;50;50m \033[0m \033[48;2;255;50;50m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m \033[48;2;70;70;80m \033[0m\n"
printf " \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m \033[48;2;45;45;55m \033[0m\n"
echo ""

121
robot3.sh
View file

@ -1,121 +0,0 @@
#!/bin/bash
# Dark Android Sprite - Polished version with better proportions
# Colors (background mode for solid pixels)
B="\033[48;2;70;70;80m" # Body
D="\033[48;2;45;45;55m" # Dark/Shadow
H="\033[48;2;95;95;105m" # Highlight
R="\033[48;2;255;50;50m" # Red glow
r="\033[48;2;180;30;30m" # Dark red
X="\033[0m" # Reset
P=" " # Pixel (two spaces)
clear
echo ""
echo -e "\033[1m WALKING DOWN\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
# HEAD - all frames same
printf " ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X}\n"
printf " ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X}\n"
printf " ${B}${P}${H}${P}${B}${P}${P}${P}${H}${P}${B}${P}${X} ${B}${P}${H}${P}${B}${P}${P}${P}${H}${P}${B}${P}${X} ${B}${P}${H}${P}${B}${P}${P}${P}${H}${P}${B}${P}${X} ${B}${P}${H}${P}${B}${P}${P}${P}${H}${P}${B}${P}${X}\n"
printf " ${B}${P}${R}${P}${P}${B}${P}${P}${P}${R}${P}${P}${B}${P}${X} ${B}${P}${R}${P}${P}${B}${P}${P}${P}${R}${P}${P}${B}${P}${X} ${B}${P}${R}${P}${P}${B}${P}${P}${P}${R}${P}${P}${B}${P}${X} ${B}${P}${R}${P}${P}${B}${P}${P}${P}${R}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${r}${P}${P}${B}${P}${P}${P}${r}${P}${P}${B}${P}${X} ${B}${P}${r}${P}${P}${B}${P}${P}${P}${r}${P}${P}${B}${P}${X} ${B}${P}${r}${P}${P}${B}${P}${P}${P}${r}${P}${P}${B}${P}${X} ${B}${P}${r}${P}${P}${B}${P}${P}${P}${r}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X}\n"
# NECK with red accent
printf " ${R}${P}${D}${P}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${P}${R}${P}${X}\n"
# TORSO
printf " ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X}\n"
printf " ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X}\n"
printf " ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${B}${P}${X}\n"
printf " ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X}\n"
printf " ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X}\n"
printf " ${B}${P}${D}${P}${P}${P}${B}${P}${X} ${B}${P}${D}${P}${P}${P}${B}${P}${X} ${B}${P}${D}${P}${P}${P}${B}${P}${X} ${B}${P}${D}${P}${P}${P}${B}${P}${X}\n"
# LEGS - Frame 1: standing, Frame 2: step left, Frame 3: standing, Frame 4: step right
printf " ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X}${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${B}${P}${P}${X}\n"
printf " ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X} ${B}${P}${R}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X} ${B}${P}${R}${P}${R}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${X} ${B}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${X} ${B}${P}${X}\n"
printf " ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${X}\n"
echo ""
echo -e "\033[1m WALKING UP\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
# Back view - no face details visible
printf " ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X}\n"
printf " ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${P}${D}${P}${X}\n"
printf " ${R}${P}${D}${P}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${P}${R}${P}${X}\n"
printf " ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${R}${P}${B}${P}${X}\n"
printf " ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${R}${P}${B}${P}${P}${R}${P}${D}${P}${X}\n"
printf " ${B}${P}${D}${P}${P}${P}${B}${P}${X} ${B}${P}${D}${P}${P}${P}${B}${P}${X} ${B}${P}${D}${P}${P}${P}${B}${P}${X} ${B}${P}${D}${P}${P}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X}${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${B}${P}${P}${X}\n"
printf " ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X} ${B}${P}${R}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X} ${B}${P}${R}${P}${R}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${X} ${B}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${X} ${B}${P}${X}\n"
printf " ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${X}\n"
echo ""
echo -e "\033[1m WALKING LEFT\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
# Side profile facing left - eye on left side
printf " ${D}${P}${B}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${D}${P}${X}\n"
printf " ${D}${P}${B}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${P}${D}${P}${X}\n"
printf " ${B}${P}${H}${P}${B}${P}${P}${P}${P}${X} ${B}${P}${H}${P}${B}${P}${P}${P}${P}${X} ${B}${P}${H}${P}${B}${P}${P}${P}${P}${X} ${B}${P}${H}${P}${B}${P}${P}${P}${P}${X}\n"
printf " ${R}${P}${P}${B}${P}${P}${P}${P}${X} ${R}${P}${P}${B}${P}${P}${P}${P}${X} ${R}${P}${P}${B}${P}${P}${P}${P}${X} ${R}${P}${P}${B}${P}${P}${P}${P}${X}\n"
printf " ${r}${P}${P}${B}${P}${P}${P}${P}${X} ${r}${P}${P}${B}${P}${P}${P}${P}${X} ${r}${P}${P}${B}${P}${P}${P}${P}${X} ${r}${P}${P}${B}${P}${P}${P}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${X}\n"
printf " ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X} ${D}${P}${B}${P}${P}${P}${D}${P}${X}\n"
printf " ${R}${P}${D}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${R}${P}${X} ${R}${P}${D}${P}${P}${R}${P}${X}\n"
printf " ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${X} ${B}${P}${P}${R}${P}${B}${P}${P}${P}${P}${X}\n"
printf " ${B}${P}${D}${P}${R}${P}${B}${P}${P}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${P}${X} ${B}${P}${D}${P}${R}${P}${B}${P}${P}${P}${X}\n"
printf " ${B}${P}${R}${P}${B}${P}${P}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${P}${X} ${B}${P}${R}${P}${B}${P}${P}${P}${X}\n"
printf " ${D}${P}${R}${P}${D}${P}${P}${P}${X} ${D}${P}${R}${P}${D}${P}${P}${P}${X} ${D}${P}${R}${P}${D}${P}${P}${P}${X} ${D}${P}${R}${P}${D}${P}${P}${P}${X}\n"
printf " ${B}${P}${D}${P}${P}${X} ${B}${P}${D}${P}${P}${X} ${B}${P}${D}${P}${P}${X} ${B}${P}${D}${P}${P}${X}\n"
# Legs animated - walking left
printf " ${B}${P}${P}${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X}\n"
printf " ${B}${P}${R}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X} ${B}${P}${R}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X}\n"
printf " ${B}${P}${X} ${B}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${X} ${B}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X}\n"
printf " ${D}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X}\n"
echo ""
echo -e "\033[1m WALKING RIGHT\033[0m"
echo ""
echo " Frame 1 Frame 2 Frame 3 Frame 4"
echo ""
# Side profile facing right - eye on right side
printf " ${D}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${B}${P}${D}${P}${X}\n"
printf " ${D}${P}${P}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${P}${P}${B}${P}${D}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${H}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${H}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${H}${P}${B}${P}${X} ${B}${P}${P}${P}${P}${H}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${R}${P}${X} ${B}${P}${P}${P}${P}${P}${R}${P}${X} ${B}${P}${P}${P}${P}${P}${R}${P}${X} ${B}${P}${P}${P}${P}${P}${R}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${r}${P}${X} ${B}${P}${P}${P}${P}${P}${r}${P}${X} ${B}${P}${P}${P}${P}${P}${r}${P}${X} ${B}${P}${P}${P}${P}${P}${r}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${P}${P}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${X} ${B}${P}${P}${P}${P}${P}${P}${P}${X}\n"
printf " ${D}${P}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${P}${B}${P}${D}${P}${X} ${D}${P}${P}${P}${B}${P}${D}${P}${X}\n"
printf " ${R}${P}${P}${D}${P}${R}${P}${X} ${R}${P}${P}${D}${P}${R}${P}${X} ${R}${P}${P}${D}${P}${R}${P}${X} ${R}${P}${P}${D}${P}${R}${P}${X}\n"
printf " ${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X} ${B}${P}${P}${P}${P}${R}${P}${B}${P}${P}${X}\n"
printf " ${B}${P}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${P}${P}${R}${P}${D}${P}${B}${P}${X} ${B}${P}${P}${P}${R}${P}${D}${P}${B}${P}${X}\n"
printf " ${B}${P}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${P}${P}${R}${P}${B}${P}${X} ${B}${P}${P}${P}${R}${P}${B}${P}${X}\n"
printf " ${D}${P}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${P}${P}${R}${P}${D}${P}${X} ${D}${P}${P}${P}${R}${P}${D}${P}${X}\n"
printf " ${B}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${B}${P}${X} ${B}${P}${D}${P}${B}${P}${X}\n"
# Legs animated - walking right
printf " ${B}${P}${P}${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X}\n"
printf " ${B}${P}${R}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X} ${B}${P}${R}${P}${R}${P}${B}${P}${X} ${B}${P}${R}${P}${X} ${R}${P}${B}${P}${X}\n"
printf " ${B}${P}${X} ${B}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X} ${B}${P}${X} ${B}${P}${X} ${B}${P}${P}${X} ${B}${P}${P}${X}\n"
printf " ${D}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${X} ${D}${P}${P}${P}${X} ${D}${P}${P}${P}${X}\n"
echo ""

View file

@ -1,61 +0,0 @@
#!/bin/bash
printf "\n\033[1m WALKING DOWN\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;255;105;180m▄███▄\033[0m \033[38;2;255;105;180m▄███▄\033[0m \033[38;2;255;105;180m▄███▄\033[0m \033[38;2;255;105;180m▄███▄\033[0m\n"
printf " \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m\n"
printf " \033[38;2;255;105;180m█\033[38;2;255;206;180m█████\033[38;2;255;105;180m█\033[0m \033[38;2;255;105;180m█\033[38;2;255;206;180m█████\033[38;2;255;105;180m█\033[0m \033[38;2;255;105;180m█\033[38;2;255;206;180m█████\033[38;2;255;105;180m█\033[0m \033[38;2;255;105;180m█\033[38;2;255;206;180m█████\033[38;2;255;105;180m█\033[0m\n"
printf " \033[38;2;255;105;180m█\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;255;105;180m█\033[0m \033[38;2;255;105;180m█\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;255;105;180m█\033[0m \033[38;2;255;105;180m█\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;255;105;180m█\033[0m \033[38;2;255;105;180m█\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;60;60;60m▀\033[38;2;255;206;180m█\033[38;2;255;105;180m█\033[0m\n"
printf " \033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m█\033[0m\n"
printf " \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m\n"
printf " \033[38;2;0;206;209m███████\033[0m \033[38;2;0;206;209m███████\033[0m \033[38;2;0;206;209m███████\033[0m \033[38;2;0;206;209m███████\033[0m\n"
printf " \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m\n"
printf " \033[38;2;199;21;133m▄█████▄\033[0m \033[38;2;199;21;133m▄█████▄\033[0m \033[38;2;199;21;133m▄█████▄\033[0m \033[38;2;199;21;133m▄█████▄\033[0m\n"
printf " \033[38;2;199;21;133m▀███▀\033[0m \033[38;2;199;21;133m▀███▀\033[0m \033[38;2;199;21;133m▀███▀\033[0m \033[38;2;199;21;133m▀███▀\033[0m\n"
printf " \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m\n"
printf " \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m\n"
printf "\n\033[1m WALKING UP\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;255;105;180m▄███▄\033[0m \033[38;2;255;105;180m▄███▄\033[0m \033[38;2;255;105;180m▄███▄\033[0m \033[38;2;255;105;180m▄███▄\033[0m\n"
printf " \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m\n"
printf " \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m\n"
printf " \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m \033[38;2;255;105;180m███████\033[0m\n"
printf " \033[38;2;255;105;180m█████\033[0m \033[38;2;255;105;180m█████\033[0m \033[38;2;255;105;180m█████\033[0m \033[38;2;255;105;180m█████\033[0m\n"
printf " \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m \033[38;2;255;206;180m▀\033[38;2;0;206;209m███\033[38;2;255;206;180m▀\033[0m\n"
printf " \033[38;2;0;206;209m███████\033[0m \033[38;2;0;206;209m███████\033[0m \033[38;2;0;206;209m███████\033[0m \033[38;2;0;206;209m███████\033[0m\n"
printf " \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀▀▀\033[0m\n"
printf " \033[38;2;199;21;133m▄█████▄\033[0m \033[38;2;199;21;133m▄█████▄\033[0m \033[38;2;199;21;133m▄█████▄\033[0m \033[38;2;199;21;133m▄█████▄\033[0m\n"
printf " \033[38;2;199;21;133m▀███▀\033[0m \033[38;2;199;21;133m▀███▀\033[0m \033[38;2;199;21;133m▀███▀\033[0m \033[38;2;199;21;133m▀███▀\033[0m\n"
printf " \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m\n"
printf " \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m\n"
printf "\n\033[1m WALKING LEFT\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;255;105;180m████▄\033[0m \033[38;2;255;105;180m████▄\033[0m \033[38;2;255;105;180m████▄\033[0m \033[38;2;255;105;180m████▄\033[0m\n"
printf " \033[38;2;255;105;180m██████▄\033[0m \033[38;2;255;105;180m██████▄\033[0m \033[38;2;255;105;180m██████▄\033[0m \033[38;2;255;105;180m██████▄\033[0m\n"
printf " \033[38;2;255;206;180m████\033[38;2;255;105;180m██▀\033[0m \033[38;2;255;206;180m████\033[38;2;255;105;180m██▀\033[0m \033[38;2;255;206;180m████\033[38;2;255;105;180m██▀\033[0m \033[38;2;255;206;180m████\033[38;2;255;105;180m██▀\033[0m\n"
printf " \033[38;2;60;60;60m▀\033[38;2;255;206;180m██\033[38;2;200;80;80m▄\033[38;2;255;105;180m█\033[0m \033[38;2;60;60;60m▀\033[38;2;255;206;180m██\033[38;2;200;80;80m▄\033[38;2;255;105;180m█\033[0m \033[38;2;60;60;60m▀\033[38;2;255;206;180m██\033[38;2;200;80;80m▄\033[38;2;255;105;180m█\033[0m \033[38;2;60;60;60m▀\033[38;2;255;206;180m██\033[38;2;200;80;80m▄\033[38;2;255;105;180m█\033[0m\n"
printf " \033[38;2;0;206;209m████\033[0m \033[38;2;0;206;209m████\033[0m \033[38;2;0;206;209m████\033[0m \033[38;2;0;206;209m████\033[0m\n"
printf " \033[38;2;0;206;209m█████\033[0m \033[38;2;0;206;209m█████\033[0m \033[38;2;0;206;209m█████\033[0m \033[38;2;0;206;209m█████\033[0m\n"
printf " \033[38;2;255;215;0m▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀\033[0m\n"
printf " \033[38;2;199;21;133m▄████\033[0m \033[38;2;199;21;133m▄████\033[0m \033[38;2;199;21;133m▄████\033[0m \033[38;2;199;21;133m▄████\033[0m\n"
printf " \033[38;2;199;21;133m▀██▀\033[0m \033[38;2;199;21;133m▀██▀\033[0m \033[38;2;199;21;133m▀██▀\033[0m \033[38;2;199;21;133m▀██▀\033[0m\n"
printf " \033[38;2;255;206;180m██\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m██\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m\n"
printf " \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m\n"
printf "\n\033[1m WALKING RIGHT\033[0m\n\n"
printf " Frame 1 Frame 2 Frame 3 Frame 4\n\n"
printf " \033[38;2;255;105;180m▄████\033[0m \033[38;2;255;105;180m▄████\033[0m \033[38;2;255;105;180m▄████\033[0m \033[38;2;255;105;180m▄████\033[0m\n"
printf " \033[38;2;255;105;180m▄██████\033[0m \033[38;2;255;105;180m▄██████\033[0m \033[38;2;255;105;180m▄██████\033[0m \033[38;2;255;105;180m▄██████\033[0m\n"
printf " \033[38;2;255;105;180m▀██\033[38;2;255;206;180m████\033[0m \033[38;2;255;105;180m▀██\033[38;2;255;206;180m████\033[0m \033[38;2;255;105;180m▀██\033[38;2;255;206;180m████\033[0m \033[38;2;255;105;180m▀██\033[38;2;255;206;180m████\033[0m\n"
printf " \033[38;2;255;105;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m██\033[38;2;60;60;60m▀\033[0m \033[38;2;255;105;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m██\033[38;2;60;60;60m▀\033[0m \033[38;2;255;105;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m██\033[38;2;60;60;60m▀\033[0m \033[38;2;255;105;180m█\033[38;2;200;80;80m▄\033[38;2;255;206;180m██\033[38;2;60;60;60m▀\033[0m\n"
printf " \033[38;2;0;206;209m████\033[0m \033[38;2;0;206;209m████\033[0m \033[38;2;0;206;209m████\033[0m \033[38;2;0;206;209m████\033[0m\n"
printf " \033[38;2;0;206;209m█████\033[0m \033[38;2;0;206;209m█████\033[0m \033[38;2;0;206;209m█████\033[0m \033[38;2;0;206;209m█████\033[0m\n"
printf " \033[38;2;255;215;0m▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀\033[0m \033[38;2;255;215;0m▀▀▀▀▀\033[0m\n"
printf " \033[38;2;199;21;133m████▄\033[0m \033[38;2;199;21;133m████▄\033[0m \033[38;2;199;21;133m████▄\033[0m \033[38;2;199;21;133m████▄\033[0m\n"
printf " \033[38;2;199;21;133m▀██▀\033[0m \033[38;2;199;21;133m▀██▀\033[0m \033[38;2;199;21;133m▀██▀\033[0m \033[38;2;199;21;133m▀██▀\033[0m\n"
printf " \033[38;2;255;206;180m██\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m██\033[0m \033[38;2;255;206;180m█\033[0m \033[38;2;255;206;180m█\033[0m\n"
printf " \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m█\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m██\033[0m \033[38;2;255;50;50m█\033[0m\n"
printf "\n"