feat(packages): ludic.photo - a camera's photographs: what the lens sees (the frustum and a line of sight over the ground and the trunks), a grade out of a hundred on size, framing, light and the moment weighted by how much subject there is, the frame's best subject and its tags, the roll with its order and pages, a buyer's price on the grade's curve, the best of each subject; the lens, the light and the market through ports; kept, full, deleted and sold as facts; the roll in its own save section

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-25 08:58:00 +03:00
parent 473552cc81
commit 24a35f1174
17 changed files with 975 additions and 0 deletions

View file

@ -0,0 +1,37 @@
# frame.ludic - what the camera sees right now: the game offers each subject and tag, and the frame
# takes the best subject's grade - which is what a photographer would say about it
export function photo_frame_begin() -> void {
pht_pending_tags = ""
pht_pending_mask = 0
pht_pending_legend = 0
pht_pending_grade = 0
pht_pending_why = PHOTO_WHY_NONE
pht_pending_sign = -1
pht_pending_stars = false
}
# A subject `sp` (0..31) named `name`, h metres tall, standing at (x, y, z) and doing something worth
# `moment`. True when the lens sees it within its range: it is tagged (once a kind, every legend) and
# scored, and the best score is the frame's.
export function photo_frame_subject(sp: int, name: string, x: float, y: float, z: float, h: float, legend: bool, moment: int) -> bool {
if not photo_in_view(x, y + 0.8, z, PhotoLens.range()) { return false }
if (pht_pending_mask & (1 << sp)) == 0 or legend { photo_frame_tag(name) }
pht_pending_mask = pht_pending_mask | (1 << sp)
if legend { pht_pending_legend = pht_pending_legend | (1 << sp) }
let g = photo_score(x, y, z, h, moment)
if g > pht_pending_grade {
pht_pending_grade = g
pht_pending_why = photo_why_of_comp()
}
return true
}
# anything else in the picture worth naming: a landmark, the water, a sign
export function photo_frame_tag(text: string) -> void {
if len(text) == 0 { return }
if len(pht_pending_tags) > 0 { pht_pending_tags = pht_pending_tags + ", " }
pht_pending_tags = pht_pending_tags + text
}
export function photo_frame_sign(sign: int) -> void { pht_pending_sign = sign }
export function photo_frame_stars() -> void { pht_pending_stars = true }