#!/usr/bin/env python3
"""Generate 20 dinosaur coloring book pages using PIL line art."""

from PIL import Image, ImageDraw
import os

OUT_DIR = "/home/node/.openclaw/workspace/books/mondo-dei-dinosauri/images"
W, H = 2550, 3300  # 8.5x11" at 300 DPI
LINE_WIDTH = 12     # approximately 3-4pt at 300dpi (1pt ≈ 4px)

os.makedirs(OUT_DIR, exist_ok=True)

def new_page():
    img = Image.new("RGB", (W, H), "white")
    draw = ImageDraw.Draw(img)
    return img, draw

def save(img, name):
    path = os.path.join(OUT_DIR, f"{name:02d}.png")
    img.save(path, "PNG", dpi=(300, 300))
    return path

def rounded_rect(draw, bbox, r, **kw):
    """Draw a rounded rectangle."""
    x1, y1, x2, y2 = bbox
    draw.arc([x1, y1, x1+2*r, y1+2*r], 180, 270, **kw)
    draw.arc([x2-2*r, y1, x2, y1+2*r], 270, 360, **kw)
    draw.arc([x2-2*r, y2-2*r, x2, y2], 0, 90, **kw)
    draw.arc([x1, y2-2*r, x1+2*r, y2], 90, 180, **kw)
    draw.line([x1+r, y1, x2-r, y1], **kw)
    draw.line([x1+r, y2, x2-r, y2], **kw)
    draw.line([x1, y1+r, x1, y2-r], **kw)
    draw.line([x2, y1+r, x2, y2-r], **kw)

def draw_dino_body(draw, cx, cy, scale=1.0):
    """Draw a generic dinosaur body base."""
    s = scale
    # body (large oval)
    draw.ellipse([cx-200*s, cy-120*s, cx+200*s, cy+120*s], outline="black", width=LINE_WIDTH)
    # head (smaller oval, offset)
    draw.ellipse([cx+180*s, cy-100*s, cx+280*s, cy-20*s], outline="black", width=LINE_WIDTH)
    # eye
    draw.ellipse([cx+230*s, cy-75*s, cx+245*s, cy-60*s], outline="black", width=LINE_WIDTH)
    # smile
    draw.arc([cx+210*s, cy-40*s, cx+260*s, cy-10*s], 0, 180, width=LINE_WIDTH)
    # legs (4 simple lines)
    draw.line([cx-100*s, cy+110*s, cx-120*s, cy+200*s], fill="black", width=LINE_WIDTH)
    draw.line([cx-40*s, cy+115*s, cx-50*s, cy+200*s], fill="black", width=LINE_WIDTH)
    draw.line([cx+60*s, cy+115*s, cx+70*s, cy+200*s], fill="black", width=LINE_WIDTH)
    draw.line([cx+130*s, cy+110*s, cx+140*s, cy+200*s], fill="black", width=LINE_WIDTH)
    # tail
    draw.line([cx-190*s, cy-20*s, cx-280*s, cy-80*s], fill="black", width=LINE_WIDTH)
    draw.line([cx-280*s, cy-80*s, cx-300*s, cy-40*s], fill="black", width=LINE_WIDTH)
    # neck connector
    draw.line([cx+170*s, cy-70*s, cx+200*s, cy-70*s], fill="black", width=LINE_WIDTH)

# ─── 20 PAGES ──────────────────────────────────────────────

# 1 - T-Rex
img, d = new_page()
# Big T-Rex body
d.ellipse([650, 1200, 1250, 2000], outline="black", width=LINE_WIDTH)  # body
d.ellipse([1150, 800, 1450, 1300], outline="black", width=LINE_WIDTH)   # head
d.ellipse([1270, 920, 1310, 960], outline="black", width=LINE_WIDTH)    # eye
d.arc([1200, 1060, 1350, 1180], 0, 180, width=LINE_WIDTH)               # mouth with teeth
# teeth
for tx in [1230, 1270, 1310, 1350]:
    d.polygon([tx, 1100, tx+8, 1070, tx+16, 1100], outline="black", width=LINE_WIDTH//2)
    d.polygon([tx, 1100, tx+8, 1070, tx+16, 1100], fill="white", outline="black", width=3)
# tiny arms
d.line([1100, 1400, 1160, 1350], fill="black", width=LINE_WIDTH)
d.line([1160, 1350, 1160, 1420], fill="black", width=LINE_WIDTH)
d.line([1100, 1450, 1150, 1400], fill="black", width=LINE_WIDTH)
d.line([1150, 1400, 1140, 1470], fill="black", width=LINE_WIDTH)
# legs
d.line([800, 1950, 780, 2300], fill="black", width=LINE_WIDTH)
d.line([770, 2300, 850, 2300], fill="black", width=LINE_WIDTH)
d.line([1050, 1970, 1080, 2300], fill="black", width=LINE_WIDTH)
d.line([1070, 2300, 1150, 2300], fill="black", width=LINE_WIDTH)
# tail
d.line([680, 1600, 500, 1300], fill="black", width=LINE_WIDTH)
d.line([500, 1300, 420, 1400], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2300, 2300, 2300], fill="black", width=LINE_WIDTH*2)
# volcano background
d.polygon([1800, 2300, 1920, 1400, 2040, 2300], outline="black", width=LINE_WIDTH)
d.arc([1880, 1300, 1960, 1450], 0, 180, width=LINE_WIDTH)
d.ellipse([1880, 1420, 1960, 1480], fill="black")
save(img, 1)

# 2 - Triceratopo
img, d = new_page()
d.ellipse([700, 1200, 1300, 2000], outline="black", width=LINE_WIDTH)   # body
d.ellipse([1200, 900, 1550, 1400], outline="black", width=LINE_WIDTH)    # head
d.ellipse([1380, 1020, 1420, 1060], outline="black", width=LINE_WIDTH)   # eye
d.arc([1320, 1200, 1480, 1300], 180, 360, width=LINE_WIDTH)             # mouth
# frill
d.arc([1200, 850, 1480, 1050], 0, 180, width=LINE_WIDTH)
d.arc([1200, 850, 1480, 1050], 180, 360, width=LINE_WIDTH)
# horns
d.line([1450, 970, 1570, 900], fill="black", width=LINE_WIDTH)
d.line([1420, 960, 1520, 880], fill="black", width=LINE_WIDTH)
d.line([1380, 950, 1400, 850], fill="black", width=LINE_WIDTH)
# legs
d.line([800, 1950, 780, 2350], fill="black", width=LINE_WIDTH)
d.line([1100, 1970, 1120, 2350], fill="black", width=LINE_WIDTH)
d.line([760, 2330, 840, 2330], fill="black", width=LINE_WIDTH)
d.line([1080, 2330, 1160, 2330], fill="black", width=LINE_WIDTH)
# tail
d.line([720, 1500, 450, 1300], fill="black", width=LINE_WIDTH)
d.line([450, 1300, 350, 1400], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2350, 2300, 2350], fill="black", width=LINE_WIDTH*2)
# palm tree
d.line([300, 2350, 300, 1500], fill="black", width=LINE_WIDTH)
d.ellipse([250, 1380, 350, 1520], outline="black", width=LINE_WIDTH)
save(img, 2)

# 3 - Stegosauro
img, d = new_page()
d.ellipse([700, 1300, 1400, 2050], outline="black", width=LINE_WIDTH)   # body
d.ellipse([600, 1200, 900, 1450], outline="black", width=LINE_WIDTH)     # head
d.ellipse([700, 1260, 740, 1300], outline="black", width=LINE_WIDTH)     # eye
d.arc([680, 1360, 780, 1420], 180, 360, width=LINE_WIDTH)               # mouth
# plates on back
for px in [900, 1000, 1100, 1200, 1300]:
    d.polygon([px, 1300, px+30, 1050, px+60, 1300], outline="black", width=LINE_WIDTH)
# tail spikes
d.line([1360, 1800, 1550, 1900], fill="black", width=LINE_WIDTH)
d.line([1360, 1800, 1550, 1860], fill="black", width=LINE_WIDTH)
d.line([1360, 1800, 1550, 1920], fill="black", width=LINE_WIDTH)
# legs
d.line([800, 2000, 780, 2400], fill="black", width=LINE_WIDTH)
d.line([1200, 2020, 1220, 2400], fill="black", width=LINE_WIDTH)
d.line([760, 2380, 840, 2380], fill="black", width=LINE_WIDTH)
d.line([1180, 2380, 1260, 2380], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2400, 2300, 2400], fill="black", width=LINE_WIDTH*2)
# clouds
d.ellipse([1700, 500, 1850, 600], outline="black", width=LINE_WIDTH)
d.ellipse([1800, 480, 1980, 600], outline="black", width=LINE_WIDTH)
d.ellipse([1930, 500, 2050, 590], outline="black", width=LINE_WIDTH)
save(img, 3)

# 4 - Brachiosauro
img, d = new_page()
d.ellipse([700, 1600, 1200, 2200], outline="black", width=LINE_WIDTH)   # body
# long neck
d.line([1150, 1700, 1300, 900], fill="black", width=LINE_WIDTH)
d.line([1300, 900, 1400, 700], fill="black", width=LINE_WIDTH)
d.line([1050, 1680, 1200, 900], fill="black", width=LINE_WIDTH)
d.line([1200, 900, 1320, 700], fill="black", width=LINE_WIDTH)
# head
d.ellipse([1320, 640, 1500, 800], outline="black", width=LINE_WIDTH)
d.ellipse([1430, 690, 1460, 720], outline="black", width=LINE_WIDTH)     # eye
d.arc([1390, 750, 1470, 790], 0, 180, width=LINE_WIDTH)                 # smile
# legs
d.line([800, 2160, 780, 2550], fill="black", width=LINE_WIDTH)
d.line([1050, 2180, 1070, 2550], fill="black", width=LINE_WIDTH)
d.line([760, 2530, 840, 2530], fill="black", width=LINE_WIDTH)
d.line([1030, 2530, 1110, 2530], fill="black", width=LINE_WIDTH)
# tail
d.line([720, 1900, 500, 1400], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2550, 2300, 2550], fill="black", width=LINE_WIDTH*2)
# leaves
d.ellipse([1400, 500, 1500, 600], outline="black", width=LINE_WIDTH)
d.ellipse([1500, 450, 1600, 550], outline="black", width=LINE_WIDTH)
d.ellipse([1450, 550, 1550, 650], outline="black", width=LINE_WIDTH)
save(img, 4)

# 5 - Velociraptor
img, d = new_page()
d.ellipse([850, 1300, 1400, 1900], outline="black", width=LINE_WIDTH)   # body
d.ellipse([1300, 1050, 1550, 1350], outline="black", width=LINE_WIDTH)  # head
d.ellipse([1420, 1110, 1450, 1140], outline="black", width=LINE_WIDTH)  # eye
# mouth (slightly open)
d.line([1430, 1280, 1520, 1260], fill="black", width=LINE_WIDTH)
d.line([1430, 1320, 1520, 1300], fill="black", width=LINE_WIDTH)
# arms with claws
d.line([1150, 1500, 1250, 1450], fill="black", width=LINE_WIDTH)
d.line([1250, 1450, 1280, 1430], fill="black", width=LINE_WIDTH)
d.line([1150, 1540, 1240, 1480], fill="black", width=LINE_WIDTH)
d.line([1240, 1480, 1270, 1460], fill="black", width=LINE_WIDTH)
# legs
d.line([950, 1860, 900, 2200], fill="black", width=LINE_WIDTH)
d.line([1250, 1880, 1300, 2200], fill="black", width=LINE_WIDTH)
# big claw on foot
d.line([900, 2200, 850, 2250], fill="black", width=LINE_WIDTH)
d.line([1300, 2200, 1350, 2250], fill="black", width=LINE_WIDTH)
d.line([830, 2230, 870, 2230], fill="black", width=LINE_WIDTH)
d.line([1280, 2230, 1320, 2230], fill="black", width=LINE_WIDTH)
# tail (straight and stiff)
d.line([870, 1500, 550, 1200], fill="black", width=LINE_WIDTH)
d.line([550, 1200, 500, 1250], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2250, 2300, 2250], fill="black", width=LINE_WIDTH*2)
save(img, 5)

# 6 - Pterodattilo
img, d = new_page()
# wings (large)
d.polygon([1250, 1600, 800, 900, 1700, 900], outline="black", width=LINE_WIDTH)
d.polygon([1250, 1600, 700, 1200, 500, 1500], outline="black", width=LINE_WIDTH)
# body
d.ellipse([1050, 1300, 1450, 1700], outline="black", width=LINE_WIDTH)
# head with crest
d.ellipse([1300, 1050, 1500, 1250], outline="black", width=LINE_WIDTH)
d.line([1480, 1150, 1600, 1050], fill="black", width=LINE_WIDTH)
d.line([1460, 1200, 1620, 1150], fill="black", width=LINE_WIDTH)
d.ellipse([1390, 1110, 1420, 1140], outline="black", width=LINE_WIDTH)  # eye
d.line([1430, 1220, 1480, 1210], fill="black", width=LINE_WIDTH)        # beak
d.line([1430, 1250, 1480, 1240], fill="black", width=LINE_WIDTH)
# feet
d.line([1100, 1680, 1080, 1800], fill="black", width=LINE_WIDTH)
d.line([1400, 1680, 1420, 1800], fill="black", width=LINE_WIDTH)
# ground (rocks)
d.line([200, 1800, 2300, 1800], fill="black", width=LINE_WIDTH*2)
d.polygon([300, 1800, 350, 1700, 400, 1800], outline="black", width=LINE_WIDTH)
d.polygon([1800, 1800, 1850, 1650, 1900, 1800], outline="black", width=LINE_WIDTH)
save(img, 6)

# 7 - Diplodoco
img, d = new_page()
# very long body
d.ellipse([700, 1500, 1500, 2100], outline="black", width=LINE_WIDTH)   # body
# long neck up
d.line([1400, 1650, 1550, 800], fill="black", width=LINE_WIDTH)
d.line([1550, 800, 1650, 600], fill="black", width=LINE_WIDTH)
d.line([1320, 1630, 1450, 800], fill="black", width=LINE_WIDTH)
d.line([1450, 800, 1570, 600], fill="black", width=LINE_WIDTH)
# small head
d.ellipse([1570, 540, 1720, 680], outline="black", width=LINE_WIDTH)
d.ellipse([1670, 580, 1700, 610], outline="black", width=LINE_WIDTH)
d.arc([1630, 640, 1700, 670], 0, 180, width=LINE_WIDTH)
# very long tail
d.line([720, 1700, 400, 1900], fill="black", width=LINE_WIDTH)
d.line([400, 1900, 250, 1700], fill="black", width=LINE_WIDTH)
d.line([250, 1700, 150, 1850], fill="black", width=LINE_WIDTH)
# legs
d.line([850, 2060, 830, 2400], fill="black", width=LINE_WIDTH)
d.line([1300, 2080, 1320, 2400], fill="black", width=LINE_WIDTH)
d.line([810, 2380, 890, 2380], fill="black", width=LINE_WIDTH)
d.line([1280, 2380, 1360, 2380], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2400, 2300, 2400], fill="black", width=LINE_WIDTH*2)
# sun
d.ellipse([1800, 300, 2000, 500], outline="black", width=LINE_WIDTH)
save(img, 7)

# 8 - Anchilosauro
img, d = new_page()
# wide body with shell/armor
d.ellipse([700, 1400, 1450, 2100], outline="black", width=LINE_WIDTH)
d.arc([680, 1380, 1470, 1700], 0, 180, width=LINE_WIDTH)  # armored back
# shell pattern
for ax in [750, 900, 1050, 1200, 1350]:
    d.ellipse([ax, 1450, ax+60, 1550], outline="black", width=LINE_WIDTH-2)
    d.ellipse([ax+30, 1560, ax+90, 1660], outline="black", width=LINE_WIDTH-2)
# head
d.ellipse([550, 1300, 800, 1500], outline="black", width=LINE_WIDTH)
d.ellipse([680, 1360, 710, 1390], outline="black", width=LINE_WIDTH)
d.arc([650, 1440, 740, 1480], 180, 360, width=LINE_WIDTH)
# tail club
d.line([1380, 1800, 1600, 1700], fill="black", width=LINE_WIDTH)
d.ellipse([1580, 1620, 1700, 1780], outline="black", width=LINE_WIDTH)
# legs
d.line([800, 2060, 780, 2400], fill="black", width=LINE_WIDTH)
d.line([1250, 2080, 1270, 2400], fill="black", width=LINE_WIDTH)
d.line([760, 2380, 840, 2380], fill="black", width=LINE_WIDTH)
d.line([1230, 2380, 1310, 2380], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2400, 2300, 2400], fill="black", width=LINE_WIDTH*2)
save(img, 8)

# 9 - Pteranodonte
img, d = new_page()
# Flying dinosaur - wings spread
d.polygon([1250, 1400, 600, 700, 1900, 700], outline="black", width=LINE_WIDTH)  # left wing
# body
d.ellipse([1100, 1200, 1400, 1550], outline="black", width=LINE_WIDTH)
# head with long crest
d.ellipse([1300, 1000, 1500, 1250], outline="black", width=LINE_WIDTH)
d.line([1330, 1020, 1400, 800], fill="black", width=LINE_WIDTH)
d.line([1400, 800, 1420, 780], fill="black", width=LINE_WIDTH)
d.line([1420, 780, 1480, 800], fill="black", width=LINE_WIDTH)
d.line([1480, 800, 1420, 1050], fill="black", width=LINE_WIDTH)
d.ellipse([1400, 1120, 1430, 1150], outline="black", width=LINE_WIDTH)
d.line([1430, 1220, 1500, 1240], fill="black", width=LINE_WIDTH)
d.line([1430, 1260, 1500, 1280], fill="black", width=LINE_WIDTH)
# clouds
d.ellipse([300, 400, 500, 500], outline="black", width=LINE_WIDTH)
d.ellipse([400, 370, 650, 500], outline="black", width=LINE_WIDTH)
d.ellipse([1800, 300, 2000, 420], outline="black", width=LINE_WIDTH)
d.ellipse([1900, 270, 2150, 420], outline="black", width=LINE_WIDTH)
save(img, 9)

# 10 - Spinosauro
img, d = new_page()
# body
d.ellipse([700, 1400, 1400, 2100], outline="black", width=LINE_WIDTH)
# sail on back
d.polygon([800, 1400, 850, 700, 900, 1400], outline="black", width=LINE_WIDTH)
d.polygon([900, 1400, 950, 650, 1000, 1400], outline="black", width=LINE_WIDTH)
d.polygon([1000, 1400, 1050, 700, 1100, 1400], outline="black", width=LINE_WIDTH)
d.polygon([1100, 1400, 1150, 750, 1200, 1400], outline="black", width=LINE_WIDTH)
d.polygon([1200, 1400, 1250, 850, 1300, 1400], outline="black", width=LINE_WIDTH)
# head (crocodile-like)
d.ellipse([1200, 1050, 1500, 1400], outline="black", width=LINE_WIDTH)
d.ellipse([1400, 1120, 1440, 1160], outline="black", width=LINE_WIDTH)
d.line([1450, 1340, 1550, 1300], fill="black", width=LINE_WIDTH)
d.line([1450, 1380, 1550, 1340], fill="black", width=LINE_WIDTH)
# legs
d.line([800, 2060, 780, 2400], fill="black", width=LINE_WIDTH)
d.line([1200, 2080, 1220, 2400], fill="black", width=LINE_WIDTH)
d.line([760, 2380, 840, 2380], fill="black", width=LINE_WIDTH)
d.line([1180, 2380, 1260, 2380], fill="black", width=LINE_WIDTH)
# tail
d.line([720, 1700, 450, 1300], fill="black", width=LINE_WIDTH)
# ground + water
d.line([200, 2400, 2300, 2400], fill="black", width=LINE_WIDTH*2)
d.arc([300, 2350, 600, 2500], 0, 180, width=LINE_WIDTH-4)
d.arc([1500, 2350, 2100, 2500], 0, 180, width=LINE_WIDTH-4)
save(img, 10)

# 11 - Parasaurolofo
img, d = new_page()
# body
d.ellipse([750, 1300, 1350, 2000], outline="black", width=LINE_WIDTH)
# head with crest
d.ellipse([1200, 1000, 1450, 1300], outline="black", width=LINE_WIDTH)
d.line([1430, 1100, 1550, 800], fill="black", width=LINE_WIDTH)
d.line([1550, 800, 1580, 750], fill="black", width=LINE_WIDTH)
d.line([1580, 750, 1520, 1080], fill="black", width=LINE_WIDTH)
d.ellipse([1300, 1070, 1330, 1100], outline="black", width=LINE_WIDTH)
d.arc([1270, 1230, 1350, 1280], 0, 180, width=LINE_WIDTH)
# arms
d.line([1000, 1500, 950, 1650], fill="black", width=LINE_WIDTH)
d.line([1050, 1520, 1000, 1670], fill="black", width=LINE_WIDTH)
# legs
d.line([850, 1960, 830, 2300], fill="black", width=LINE_WIDTH)
d.line([1200, 1980, 1220, 2300], fill="black", width=LINE_WIDTH)
d.line([810, 2280, 890, 2280], fill="black", width=LINE_WIDTH)
d.line([1180, 2280, 1260, 2280], fill="black", width=LINE_WIDTH)
# tail
d.line([770, 1600, 500, 1300], fill="black", width=LINE_WIDTH)
d.line([500, 1300, 450, 1350], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2300, 2300, 2300], fill="black", width=LINE_WIDTH*2)
save(img, 11)

# 12 - Pachycephalosauro
img, d = new_page()
# body
d.ellipse([800, 1300, 1350, 1950], outline="black", width=LINE_WIDTH)
# head with dome
d.ellipse([1200, 1000, 1500, 1350], outline="black", width=LINE_WIDTH)
d.arc([1250, 950, 1450, 1080], 0, 180, width=LINE_WIDTH)  # dome
d.ellipse([1350, 1080, 1380, 1110], outline="black", width=LINE_WIDTH)
d.arc([1320, 1250, 1400, 1300], 0, 180, width=LINE_WIDTH)
# tiny arms
d.line([1100, 1500, 1060, 1600], fill="black", width=LINE_WIDTH)
d.line([1150, 1520, 1100, 1620], fill="black", width=LINE_WIDTH)
# legs
d.line([880, 1910, 860, 2250], fill="black", width=LINE_WIDTH)
d.line([1220, 1930, 1240, 2250], fill="black", width=LINE_WIDTH)
d.line([840, 2230, 920, 2230], fill="black", width=LINE_WIDTH)
d.line([1200, 2230, 1280, 2230], fill="black", width=LINE_WIDTH)
# tail
d.line([820, 1600, 550, 1300], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2250, 2300, 2250], fill="black", width=LINE_WIDTH*2)
# bushes
d.ellipse([300, 2000, 500, 2250], outline="black", width=LINE_WIDTH)
d.ellipse([1800, 1900, 2100, 2250], outline="black", width=LINE_WIDTH)
save(img, 12)

# 13 - Allosauro
img, d = new_page()
# body
d.ellipse([700, 1300, 1300, 2000], outline="black", width=LINE_WIDTH)
# head
d.ellipse([1150, 1000, 1500, 1350], outline="black", width=LINE_WIDTH)
d.ellipse([1370, 1080, 1400, 1110], outline="black", width=LINE_WIDTH)
# mouth open with teeth
d.line([1400, 1280, 1520, 1200], fill="black", width=LINE_WIDTH)
d.line([1400, 1320, 1520, 1240], fill="black", width=LINE_WIDTH)
# ridge above eyes
d.arc([1200, 1000, 1350, 1120], 0, 180, width=LINE_WIDTH)
# arms
d.line([1050, 1550, 1120, 1480], fill="black", width=LINE_WIDTH)
d.line([1120, 1480, 1120, 1550], fill="black", width=LINE_WIDTH)
d.line([1050, 1600, 1100, 1530], fill="black", width=LINE_WIDTH)
d.line([1100, 1530, 1100, 1600], fill="black", width=LINE_WIDTH)
# legs
d.line([800, 1960, 780, 2350], fill="black", width=LINE_WIDTH)
d.line([1150, 1980, 1170, 2350], fill="black", width=LINE_WIDTH)
d.line([760, 2330, 840, 2330], fill="black", width=LINE_WIDTH)
d.line([1130, 2330, 1210, 2330], fill="black", width=LINE_WIDTH)
# tail
d.line([720, 1600, 450, 1200], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2350, 2300, 2350], fill="black", width=LINE_WIDTH*2)
save(img, 13)

# 14 - Iguanodonte
img, d = new_page()
# body
d.ellipse([750, 1350, 1350, 2050], outline="black", width=LINE_WIDTH)
# head
d.ellipse([1200, 1050, 1480, 1400], outline="black", width=LINE_WIDTH)
d.ellipse([1350, 1120, 1380, 1150], outline="black", width=LINE_WIDTH)
d.arc([1330, 1300, 1420, 1360], 0, 180, width=LINE_WIDTH)
# thumb spike
d.line([1200, 1450, 1150, 1400], fill="black", width=LINE_WIDTH)
d.line([1150, 1400, 1150, 1350], fill="black", width=LINE_WIDTH)
d.line([1250, 1470, 1200, 1420], fill="black", width=LINE_WIDTH)
d.line([1200, 1420, 1200, 1370], fill="black", width=LINE_WIDTH)
# legs
d.line([850, 2010, 830, 2380], fill="black", width=LINE_WIDTH)
d.line([1200, 2030, 1220, 2380], fill="black", width=LINE_WIDTH)
d.line([810, 2360, 890, 2360], fill="black", width=LINE_WIDTH)
d.line([1180, 2360, 1260, 2360], fill="black", width=LINE_WIDTH)
# tail
d.line([770, 1700, 500, 1400], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2380, 2300, 2380], fill="black", width=LINE_WIDTH*2)
# trees
for tx in [250, 2100]:
    d.line([tx, 2380, tx, 1600], fill="black", width=LINE_WIDTH)
    d.ellipse([tx-60, 1500, tx+60, 1620], outline="black", width=LINE_WIDTH)
save(img, 14)

# 15 - Compsognato
img, d = new_page()
# small, running dinosaur
d.ellipse([950, 1500, 1250, 1900], outline="black", width=LINE_WIDTH)   # body
d.ellipse([1200, 1350, 1350, 1550], outline="black", width=LINE_WIDTH)   # head
d.ellipse([1280, 1400, 1300, 1420], outline="black", width=LINE_WIDTH)   # eye
d.arc([1260, 1480, 1320, 1520], 0, 180, width=LINE_WIDTH)
# long tail
d.line([960, 1650, 750, 1500], fill="black", width=LINE_WIDTH)
d.line([750, 1500, 650, 1550], fill="black", width=LINE_WIDTH)
# legs (running pose)
d.line([1000, 1860, 980, 2000], fill="black", width=LINE_WIDTH)
d.line([980, 2000, 950, 2100], fill="black", width=LINE_WIDTH)
d.line([1000, 1880, 1020, 2050], fill="black", width=LINE_WIDTH)
d.line([1020, 2050, 1050, 2120], fill="black", width=LINE_WIDTH)
d.line([1150, 1880, 1170, 2030], fill="black", width=LINE_WIDTH)
d.line([1170, 2030, 1140, 2100], fill="black", width=LINE_WIDTH)
d.line([1150, 1860, 1130, 2000], fill="black", width=LINE_WIDTH)
d.line([1130, 2000, 1100, 2100], fill="black", width=LINE_WIDTH)
# arms
d.line([1100, 1600, 1150, 1680], fill="black", width=LINE_WIDTH)
d.line([1150, 1680, 1150, 1720], fill="black", width=LINE_WIDTH)
d.line([1100, 1630, 1140, 1700], fill="black", width=LINE_WIDTH)
d.line([1140, 1700, 1130, 1740], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2120, 2300, 2120], fill="black", width=LINE_WIDTH*2)
# grass tufts
for gx in range(300, 2200, 200):
    d.line([gx, 2120, gx+10, 2050], fill="black", width=LINE_WIDTH-4)
    d.line([gx, 2120, gx-5, 2070], fill="black", width=LINE_WIDTH-4)
save(img, 15)

# 16 - Dilofosauro
img, d = new_page()
# body
d.ellipse([750, 1350, 1300, 2000], outline="black", width=LINE_WIDTH)
# head with double crest
d.ellipse([1200, 1050, 1450, 1380], outline="black", width=LINE_WIDTH)
d.ellipse([1350, 1130, 1380, 1160], outline="black", width=LINE_WIDTH)
# double crest
d.line([1350, 1080, 1420, 900], fill="black", width=LINE_WIDTH)
d.line([1420, 900, 1460, 920], fill="black", width=LINE_WIDTH)
d.line([1460, 920, 1400, 1100], fill="black", width=LINE_WIDTH)
d.line([1320, 1080, 1380, 920], fill="black", width=LINE_WIDTH)
d.line([1380, 920, 1420, 940], fill="black", width=LINE_WIDTH)
d.line([1420, 940, 1360, 1100], fill="black", width=LINE_WIDTH)
d.arc([1320, 1300, 1400, 1350], 0, 180, width=LINE_WIDTH)
# arms
d.line([1050, 1550, 1000, 1650], fill="black", width=LINE_WIDTH)
d.line([1000, 1650, 980, 1620], fill="black", width=LINE_WIDTH)
d.line([1050, 1590, 1020, 1680], fill="black", width=LINE_WIDTH)
d.line([1020, 1680, 1000, 1650], fill="black", width=LINE_WIDTH)
# legs
d.line([850, 1960, 830, 2350], fill="black", width=LINE_WIDTH)
d.line([1150, 1980, 1170, 2350], fill="black", width=LINE_WIDTH)
d.line([810, 2330, 890, 2330], fill="black", width=LINE_WIDTH)
d.line([1130, 2330, 1210, 2330], fill="black", width=LINE_WIDTH)
# tail
d.line([770, 1700, 500, 1400], fill="black", width=LINE_WIDTH)
d.line([500, 1400, 450, 1450], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2350, 2300, 2350], fill="black", width=LINE_WIDTH*2)
save(img, 16)

# 17 - Ankylosauro (variante in azione)
img, d = new_page()
# armored body - slightly tilted
d.ellipse([750, 1400, 1500, 2150], outline="black", width=LINE_WIDTH)
d.arc([730, 1380, 1520, 1750], 0, 180, width=LINE_WIDTH)
# armor spikes on edges
for sx in [750, 950, 1150, 1350, 1450, 800, 1000, 1200, 1400]:
    d.polygon([sx, 1400, sx+15, 1300, sx+30, 1400], outline="black", width=LINE_WIDTH-2)
# head
d.ellipse([600, 1350, 830, 1580], outline="black", width=LINE_WIDTH)
d.ellipse([720, 1410, 750, 1440], outline="black", width=LINE_WIDTH)
d.arc([680, 1500, 770, 1540], 180, 360, width=LINE_WIDTH)
# tail club (bigger)
d.line([1450, 1800, 1700, 1650], fill="black", width=LINE_WIDTH)
d.ellipse([1680, 1550, 1850, 1750], outline="black", width=LINE_WIDTH)
d.ellipse([1720, 1580, 1810, 1720], outline="black", width=LINE_WIDTH)
# action lines
d.line([1850, 1600, 2000, 1500], fill="black", width=LINE_WIDTH-4)
d.line([1850, 1680, 2000, 1700], fill="black", width=LINE_WIDTH-4)
d.line([1850, 1650, 2050, 1620], fill="black", width=LINE_WIDTH-4)
# legs
d.line([830, 2110, 810, 2450], fill="black", width=LINE_WIDTH)
d.line([1300, 2130, 1320, 2450], fill="black", width=LINE_WIDTH)
d.line([790, 2430, 870, 2430], fill="black", width=LINE_WIDTH)
d.line([1280, 2430, 1360, 2430], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2450, 2300, 2450], fill="black", width=LINE_WIDTH*2)
save(img, 17)

# 18 - Triceratopo in gruppo
img, d = new_page()
# Adult Triceratopo (larger)
d.ellipse([700, 1200, 1300, 1950], outline="black", width=LINE_WIDTH)
d.ellipse([1200, 900, 1550, 1350], outline="black", width=LINE_WIDTH)
d.arc([1200, 850, 1480, 1050], 0, 180, width=LINE_WIDTH)
d.line([1450, 970, 1570, 900], fill="black", width=LINE_WIDTH)
d.line([1420, 960, 1520, 880], fill="black", width=LINE_WIDTH)
d.line([1380, 950, 1400, 850], fill="black", width=LINE_WIDTH)
d.ellipse([1380, 1020, 1420, 1060], outline="black", width=LINE_WIDTH)
d.arc([1320, 1200, 1480, 1300], 180, 360, width=LINE_WIDTH)
d.line([800, 1910, 780, 2300], fill="black", width=LINE_WIDTH)
d.line([1100, 1930, 1120, 2300], fill="black", width=LINE_WIDTH)
d.line([760, 2280, 840, 2280], fill="black", width=LINE_WIDTH)
d.line([1080, 2280, 1160, 2280], fill="black", width=LINE_WIDTH)
d.line([720, 1500, 450, 1300], fill="black", width=LINE_WIDTH)

# Baby Triceratopo (smaller, beside parent)
d.ellipse([1300, 1700, 1600, 2100], outline="black", width=LINE_WIDTH)
d.ellipse([1600, 1550, 1750, 1780], outline="black", width=LINE_WIDTH)
d.arc([1570, 1500, 1720, 1620], 0, 180, width=LINE_WIDTH)
d.line([1700, 1600, 1760, 1560], fill="black", width=LINE_WIDTH-4)
d.line([1650, 1590, 1700, 1550], fill="black", width=LINE_WIDTH-4)
d.line([1580, 1620, 1600, 1560], fill="black", width=LINE_WIDTH-4)
d.ellipse([1680, 1610, 1700, 1630], outline="black", width=LINE_WIDTH-4)
d.line([1400, 2060, 1390, 2180], fill="black", width=LINE_WIDTH)
d.line([1520, 2070, 1530, 2180], fill="black", width=LINE_WIDTH)
d.line([1370, 2160, 1430, 2160], fill="black", width=LINE_WIDTH)
d.line([1500, 2160, 1560, 2160], fill="black", width=LINE_WIDTH)

# ground
d.line([200, 2300, 2300, 2300], fill="black", width=LINE_WIDTH*2)
# flowers
for fx in [400, 1800, 2000]:
    d.line([fx, 2300, fx, 2100], fill="black", width=LINE_WIDTH-4)
    d.ellipse([fx-15, 2080, fx+15, 2110], outline="black", width=LINE_WIDTH-4)
save(img, 18)

# 19 - T-Rex cucciolo
img, d = new_page()
# smaller, cute T-Rex
d.ellipse([850, 1400, 1250, 1950], outline="black", width=LINE_WIDTH)   # body
d.ellipse([1200, 1100, 1400, 1400], outline="black", width=LINE_WIDTH)   # head (bigger proportionally)
d.ellipse([1320, 1170, 1350, 1200], outline="black", width=LINE_WIDTH)   # big eye
# cute smile
d.arc([1270, 1320, 1370, 1400], 0, 180, width=LINE_WIDTH)
# tiny arms
d.line([1100, 1500, 1130, 1470], fill="black", width=LINE_WIDTH)
d.line([1130, 1470, 1130, 1510], fill="black", width=LINE_WIDTH)
d.line([1100, 1520, 1125, 1490], fill="black", width=LINE_WIDTH)
d.line([1125, 1490, 1125, 1530], fill="black", width=LINE_WIDTH)
# legs (shorter)
d.line([900, 1910, 880, 2150], fill="black", width=LINE_WIDTH)
d.line([1150, 1930, 1170, 2150], fill="black", width=LINE_WIDTH)
d.line([860, 2130, 940, 2130], fill="black", width=LINE_WIDTH)
d.line([1130, 2130, 1210, 2130], fill="black", width=LINE_WIDTH)
# tail
d.line([870, 1650, 700, 1450], fill="black", width=LINE_WIDTH)
d.line([700, 1450, 650, 1500], fill="black", width=LINE_WIDTH)
# ground
d.line([200, 2150, 2300, 2150], fill="black", width=LINE_WIDTH*2)
# butterfly
d.line([1700, 1200, 1700, 1100], fill="black", width=LINE_WIDTH-4)
d.ellipse([1690, 1070, 1710, 1090], fill="black")
d.ellipse([1670, 1090, 1720, 1150], outline="black", width=LINE_WIDTH-4)
d.ellipse([1680, 1090, 1730, 1150], outline="black", width=LINE_WIDTH-4)
save(img, 19)

# 20 - Parco dei dinosauri (scena finale di gruppo)
img, d = new_page()
# Distant dinosaurs silhouettes in background
d.line([300, 1600, 400, 1200, 500, 1600], fill="black", width=LINE_WIDTH-2)  # Brachiosaur neck
d.ellipse([350, 1150, 450, 1300], outline="black", width=LINE_WIDTH-2)
d.line([800, 1600, 750, 1100], fill="black", width=LINE_WIDTH-2)
d.line([750, 1100, 700, 1600], fill="black", width=LINE_WIDTH-2)
d.ellipse([680, 1050, 770, 1180], outline="black", width=LINE_WIDTH-2)

# Large dinosaur focal point
d.ellipse([750, 1200, 1400, 2000], outline="black", width=LINE_WIDTH)
d.ellipse([1300, 1000, 1550, 1300], outline="black", width=LINE_WIDTH)
d.ellipse([1420, 1070, 1450, 1100], outline="black", width=LINE_WIDTH)
d.arc([1360, 1230, 1470, 1320], 0, 180, width=LINE_WIDTH)
d.line([800, 1960, 780, 2350], fill="black", width=LINE_WIDTH)
d.line([1200, 1980, 1220, 2350], fill="black", width=LINE_WIDTH)
d.line([760, 2330, 840, 2330], fill="black", width=LINE_WIDTH)
d.line([1180, 2330, 1260, 2330], fill="black", width=LINE_WIDTH)
d.line([770, 1500, 500, 1150], fill="black", width=LINE_WIDTH)

# Small dinosaur walking
d.ellipse([1550, 1650, 1750, 2000], outline="black", width=LINE_WIDTH)
d.ellipse([1750, 1550, 1850, 1700], outline="black", width=LINE_WIDTH)
d.line([1850, 1650, 1900, 1620], fill="black", width=LINE_WIDTH)
d.line([1650, 1960, 1630, 2100], fill="black", width=LINE_WIDTH)
d.line([1720, 1970, 1750, 2100], fill="black", width=LINE_WIDTH)
d.line([1610, 2080, 1670, 2080], fill="black", width=LINE_WIDTH)
d.line([1730, 2080, 1790, 2080], fill="black", width=LINE_WIDTH)

# Volcano
d.polygon([1600, 2350, 1750, 1200, 1900, 2350], outline="black", width=LINE_WIDTH)
d.arc([1720, 1150, 1780, 1250], 0, 180, width=LINE_WIDTH)
# palm trees
for px in [300, 2000]:
    d.line([px, 2350, px, 1600], fill="black", width=LINE_WIDTH)
    d.polygon([px, 1600, px-50, 1480, px+50, 1480], outline="black", width=LINE_WIDTH)
    d.line([px-50, 1480, px-30, 1530], fill="black", width=LINE_WIDTH)
    d.line([px, 1480, px, 1550], fill="black", width=LINE_WIDTH)
    d.line([px+50, 1480, px+30, 1530], fill="black", width=LINE_WIDTH)

# Ground
d.line([200, 2350, 2300, 2350], fill="black", width=LINE_WIDTH*2)
# Pteranodons flying
d.polygon([1000, 600, 950, 560, 1050, 560], outline="black", width=LINE_WIDTH-4)
d.polygon([1050, 600, 1000, 560, 1100, 560], outline="black", width=LINE_WIDTH-4)
d.polygon([1100, 550, 1070, 520, 1130, 520], outline="black", width=LINE_WIDTH-4)
d.polygon([1130, 550, 1100, 520, 1160, 520], outline="black", width=LINE_WIDTH-4)
# Sun
d.ellipse([200, 300, 400, 500], outline="black", width=LINE_WIDTH)
save(img, 20)

print("✅ Tutte le 20 illustrazioni generate con successo!")
print(f"Cartella: {OUT_DIR}")
