bin/ 230 CLI tools (ask-*, br-*, agent-*, roadid, carpool) scripts/ 99 automation scripts fleet/ Node configs and deployment workers/ Cloudflare Worker sources (roadpay, road-search, squad webhooks) roadc/ RoadC programming language roadnet/ Mesh network (5 APs, WireGuard) operator/ Memory system scripts config/ System configs dotfiles/ Shell configs docs/ Documentation BlackRoad OS — Pave Tomorrow. RoadChain-SHA2048: d1a24f55318d338b RoadChain-Identity: alexa@sovereign RoadChain-Full: d1a24f55318d338b24b60bad7be39286379c76ae5470817482100cb0ddbbcb97e147d07ac7243da0a9f0363e4e5c833d612b9c0df3a3cd20802465420278ef74875a5b77f55af6fe42a931b8b635b3d0d0b6bde9abf33dc42eea52bc03c951406d8cbe49f1a3d29b26a94dade05e9477f34a7d4d4c6ec4005c3c2ac54e73a68440c512c8e83fd9b1fe234750b898ef8f4032c23db173961fe225e67a0432b5293a9714f76c5c57ed5fdf35b9fb40fd73c03ebf88b7253c6a0575f5afb6a6b49b3bda310602fb1ef676859962dad2aebbb2875814b30eee0a8ba195e482d4cbc91d8819e7f38f6db53e8063401649c77bb994371473cabfb917fb53e8cbe73d60
90 lines
2.4 KiB
Bash
Executable File
90 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# BR-Pixel - Procedural pixel art world generator
|
|
clear
|
|
trap 'printf "\033[?25h\033[0m"; clear; exit' INT TERM EXIT
|
|
printf '\033[?25l'
|
|
COLS=$(( $(tput cols) / 2 )) LINES=$(( $(tput lines) - 2 ))
|
|
|
|
# Terrain colors
|
|
SKY=33 CLOUD=231 SUN=226
|
|
MOUNT=240 MOUNT2=245
|
|
TREE_TRUNK=94 TREE_LEAF=34
|
|
GRASS=28 GRASS2=22
|
|
WATER=27 WATER2=33
|
|
SAND=222 FLOWER1=205 FLOWER2=214
|
|
|
|
generate() {
|
|
printf '\033[H'
|
|
# Sky gradient
|
|
sky_h=$((LINES * 40 / 100))
|
|
for ((y=0;y<sky_h;y++)); do
|
|
line=""
|
|
shade=$((17 + y * 3 / sky_h))
|
|
for ((x=0;x<COLS;x++)); do
|
|
if (( RANDOM % 40 == 0 && y > 1 && y < sky_h/2 )); then
|
|
line+="\033[48;5;${CLOUD}m "
|
|
elif (( x == COLS/3 && y == 2 )); then
|
|
line+="\033[48;5;${SUN}m "
|
|
else
|
|
line+="\033[48;5;${shade}m "
|
|
fi
|
|
done
|
|
printf '%b\033[0m\n' "$line"
|
|
done
|
|
|
|
# Mountains
|
|
mount_h=$((LINES * 15 / 100))
|
|
peak=$((RANDOM % COLS))
|
|
for ((y=0;y<mount_h;y++)); do
|
|
line=""
|
|
w=$((y * COLS / mount_h / 2))
|
|
for ((x=0;x<COLS;x++)); do
|
|
dist=$((x - peak)); (( dist < 0 )) && dist=$((-dist))
|
|
if (( dist < w )); then
|
|
line+="\033[48;5;${MOUNT}m "
|
|
elif (( RANDOM % 3 == 0 && dist < w+2 )); then
|
|
line+="\033[48;5;${MOUNT2}m "
|
|
else
|
|
line+="\033[48;5;${SKY}m "
|
|
fi
|
|
done
|
|
printf '%b\033[0m\n' "$line"
|
|
done
|
|
|
|
# Ground
|
|
ground_h=$((LINES - sky_h - mount_h))
|
|
water_start=$((RANDOM % (COLS/2) + COLS/4))
|
|
water_w=$((RANDOM % 8 + 4))
|
|
for ((y=0;y<ground_h;y++)); do
|
|
line=""
|
|
for ((x=0;x<COLS;x++)); do
|
|
# Water
|
|
if (( x >= water_start && x < water_start + water_w && y > ground_h/3 )); then
|
|
c=$WATER; (( RANDOM % 3 == 0 )) && c=$WATER2
|
|
line+="\033[48;5;${c}m "
|
|
# Sand near water
|
|
elif (( x >= water_start-2 && x < water_start+water_w+2 && y > ground_h/3 )); then
|
|
line+="\033[48;5;${SAND}m "
|
|
# Trees
|
|
elif (( RANDOM % 15 == 0 && y > 0 )); then
|
|
line+="\033[48;5;${TREE_LEAF}m "
|
|
# Flowers
|
|
elif (( RANDOM % 30 == 0 )); then
|
|
c=$FLOWER1; (( RANDOM % 2 == 0 )) && c=$FLOWER2
|
|
line+="\033[48;5;${c}m "
|
|
else
|
|
c=$GRASS; (( RANDOM % 4 == 0 )) && c=$GRASS2
|
|
line+="\033[48;5;${c}m "
|
|
fi
|
|
done
|
|
printf '%b\033[0m\n' "$line"
|
|
done
|
|
printf '\033[38;5;205m🎨 BR-Pixel World \033[38;5;69m[Enter=regenerate, q=quit]\033[0m'
|
|
}
|
|
|
|
while true; do
|
|
generate
|
|
read -rsn1 K
|
|
[[ "$K" == "q" ]] && exit
|
|
done
|