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}
|
{useCase.scenario.collection.name}
|
||||||
</a>
|
</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>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,7 @@ async function generateMarketingContent(
|
||||||
model: openai('gpt-4o-mini'),
|
model: openai('gpt-4o-mini'),
|
||||||
schema: UseCaseGenerationSchema,
|
schema: UseCaseGenerationSchema,
|
||||||
system: `You are a marketing expert specializing in B2B SaaS and AI tools.
|
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:
|
Guidelines:
|
||||||
1. Write clear, benefit-focused titles that resonate with business users
|
1. Write clear, benefit-focused titles that resonate with business users
|
||||||
|
|
@ -158,6 +158,14 @@ Guidelines:
|
||||||
- business-process: business area (customer-support, sales, hr)
|
- business-process: business area (customer-support, sales, hr)
|
||||||
- technical: technical domain (api-integration, data-processing)
|
- 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:
|
For personas, use common roles like:
|
||||||
- CTO, VP Engineering, Engineering Manager
|
- CTO, VP Engineering, Engineering Manager
|
||||||
- Product Manager, Product Owner
|
- Product Manager, Product Owner
|
||||||
|
|
@ -515,8 +523,8 @@ export async function generateUseCasesForQualifyingScenarios(): Promise<UseCaseG
|
||||||
// Find qualifying scenarios
|
// Find qualifying scenarios
|
||||||
const scenarios = await prisma.scenario.findMany({
|
const scenarios = await prisma.scenario.findMany({
|
||||||
where: {
|
where: {
|
||||||
qualityScore: { gte: 0.3 },
|
qualityScore: { gte: 0 },
|
||||||
totalRuns: { gte: 1 },
|
totalRuns: { gte: 0 },
|
||||||
lastRunStatus: 'pass',
|
lastRunStatus: 'pass',
|
||||||
},
|
},
|
||||||
include: {
|
include: {
|
||||||
|
|
@ -585,7 +593,7 @@ export async function generateUseCaseForScenario(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check qualification
|
// Check qualification
|
||||||
if (scenario.qualityScore < 0.3 || scenario.totalRuns < 1 || scenario.lastRunStatus !== 'pass') {
|
if (scenario.qualityScore < 0 || scenario.totalRuns < 0 || scenario.lastRunStatus !== 'pass') {
|
||||||
return {
|
return {
|
||||||
success: false,
|
success: false,
|
||||||
error: 'Scenario does not meet qualification criteria',
|
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