Add architecture docs and humanize use case copy
This commit is contained in:
parent
ad974239fd
commit
c5a17a0a69
24 changed files with 1969 additions and 1468 deletions
67
alien.sh
67
alien.sh
|
|
@ -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"
|
||||
115
apps/web/src/components/NodeDetailDrawer.tsx
Normal file
115
apps/web/src/components/NodeDetailDrawer.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
144
beast.sh
|
|
@ -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 ""
|
||||
392
docs/ARCHITECTURE-DIAGRAM.md
Normal file
392
docs/ARCHITECTURE-DIAGRAM.md
Normal 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
497
docs/architecture-v1.d2
Normal 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
109
docs/architecture-v1.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 135 KiB |
139
docs/diagrams/01-overview.d2
Normal file
139
docs/diagrams/01-overview.d2
Normal 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
|
||||
118
docs/diagrams/01-overview.svg
Normal file
118
docs/diagrams/01-overview.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 36 KiB |
137
docs/diagrams/02-discovery.d2
Normal file
137
docs/diagrams/02-discovery.d2
Normal 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
|
||||
102
docs/diagrams/02-discovery.svg
Normal file
102
docs/diagrams/02-discovery.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 25 KiB |
98
docs/diagrams/03-execution.d2
Normal file
98
docs/diagrams/03-execution.d2
Normal 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
|
||||
102
docs/diagrams/03-execution.svg
Normal file
102
docs/diagrams/03-execution.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 22 KiB |
142
docs/diagrams/README.md
Normal file
142
docs/diagrams/README.md
Normal 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.
|
||||
|
||||

|
||||
|
||||
**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).
|
||||
|
||||

|
||||
|
||||
**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.
|
||||
|
||||

|
||||
|
||||
**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).
|
||||
|
||||

|
||||
|
||||
**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
100
hotel.sh
|
|
@ -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
182
knight.sh
|
|
@ -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 ""
|
||||
|
|
@ -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 ""
|
||||
|
|
@ -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 ""
|
||||
|
|
@ -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 ""
|
||||
69
robot.sh
69
robot.sh
|
|
@ -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
104
robot2.sh
|
|
@ -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
121
robot3.sh
|
|
@ -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 ""
|
||||
61
sprite.sh
61
sprite.sh
|
|
@ -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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue