import React from 'react';
import {Figur, NOA_HOEHE, type Posenfolge} from '../baukasten/figur';
import {FIGUREN} from '../baukasten/posen';
import {punkt} from '../baukasten/helfer';
import {BODEN, Ort} from '../baukasten/orte';
// Bildteile für Folge 8 „Noas Laterne“: Abendgarten mit Hauswand, die gebastelte Laterne,
// Schatten an der Wand und Hand-Schatten. Alles in Szenenkoordinaten (1920 × 1080).
// Hauswand rechts im Garten (Szene 3) bzw. als ganzer Hintergrund an der Wand (Szene 4–7)
export const WAND = {x0: 1060, x1: 1980, oben: 170, unten: BODEN - 30};
export const FENSTER = {x: 1180, y: 280, b: 230, h: 210};
// Abendgarten in der „blauen Stunde“: Nachtgarten aufgehellt, damit es freundlich und nicht unheimlich wirkt
export const GartenAbend: React.FC<{wandVoll?: boolean; papaWinkt?: number}> = ({wandVoll = false, papaWinkt = 0}) => {
const x0 = wandVoll ? -60 : WAND.x0;
const oben = wandVoll ? 70 : WAND.oben;
return (
<>
>
);
};
export const HAKEN = {x: FENSTER.x + FENSTER.b + 66, y: FENSTER.y + 62};
export const WAND_VOLL = {...WAND, x0: -60, oben: 70}; // an der Wand (Szene 4–7): höher, damit ganze Schatten draufpassen
// Die gebastelte Laterne: gelbes Papier, fünf Glitzersterne, ein Papier-Igel, innen ein Lämpchen.
// (x, y) = Mitte; sterne = wie viele schon aufgeklebt sind; igel 0–1; licht 0–1.
const STERNE: [number, number][] = [
[-34, -28],
[22, -40],
[40, 6],
[-6, 30],
[-44, 18],
];
const Stern: React.FC<{x: number; y: number; r: number; glanz: number}> = ({x, y, r, glanz}) => {
const pkt = new Array(10)
.fill(0)
.map((_, i) => {
const w = (Math.PI / 5) * i - Math.PI / 2;
const rr = i % 2 ? r * 0.45 : r;
return `${x + Math.cos(w) * rr},${y + Math.sin(w) * rr}`;
})
.join(' ');
return 0.5 ? '#fff6c2' : '#f2c84b'} stroke="#c9952a" strokeWidth={1.5} />;
};
export const Laterne: React.FC<{x: number; y: number; s?: number; sterne?: number; igel?: number; licht?: number; schwung?: number; stab?: boolean}> = ({
x,
y,
s = 1,
sterne = 5,
igel = 1,
licht = 0,
schwung = 0,
stab = true,
}) => (
{licht > 0 && (
)}
);
// Weicher Schatten einer Figur an der Wand. Er steht hinter der Figur, ist um `k` vergrößert und
// liegt vom Licht weg verschoben (`versatz`: Anteil des Abstands Licht–Figur); je näher die Figur am Licht, desto größer (k aus `schattenGroesse`).
// Weich, rund und bläulich-dunkel, ohne harten Rand (Drehbuch: groß, aber nicht unheimlich).
export const schattenGroesse = (abstand: number) => Math.min(3.2, Math.max(1.05, 1 + 260 / Math.max(60, abstand)));
export const WandSchatten: React.FC<{
pose: string | Posenfolge;
x: number; // Fußpunkt der Figur
licht: {x: number; y: number};
hoehe: number;
k: number;
wand?: {x0: number; x1: number; oben: number; unten: number};
deckkraft?: number;
drehung?: number;
stauchY?: number;
versatz?: number;
}> = ({pose, x, licht, hoehe, k, wand = WAND, deckkraft = 0.42, drehung = 0, stauchY = 1, versatz = 0.35}) => (
);
// Hand-Schatten an der Wand: Hase (zwei Ohren) und Igel (Faust mit gespreizten Fingern)
export const HandSchatten: React.FC<{art: 'hase' | 'igel'; x: number; y: number; s?: number; deckkraft?: number; wackeln?: number}> = ({art, x, y, s = 1, deckkraft = 0.45, wackeln = 0}) => (
);
// Wo die Laterne in der Pose noa_A_laterne hängt, und wie groß unsere Laterne sein muss, um die orange
// Laterne des Bildes ganz abzudecken (gemessen: 131 × 134 Bildpunkte, Mitte bei 73/423 im Bild, Bild bei 339/156)
export const laterneInNoasHand = (noaX: number, noaY = BODEN) => ({
...punkt('noa', noaX, noaY, 339 + 73.5, 156 + 423),
s: (1.2 * NOA_HOEHE) / FIGUREN.noa.refHoehe,
});
// Abend-Dämmerung über der ganzen Szene, aufgehellt um die Laterne (warmes Licht, Rest bläulich)
export const Abenddunkel: React.FC<{licht: {x: number; y: number}; staerke?: number; radius?: number}> = ({licht, staerke = 0.4, radius = 500}) => (
);