Forno, stazione e chiesa; uscite della rotonda e di Via Calimara come il paese vero; mappa ordinata
- Dalla Pieve a destra il forno e, a sinistra, la stazione; dal portone centrale si entra nella Pieve (foto di Mariano Mirannalti, nei crediti alla voce «Fotografie»). - Via Calimara: in fondo la Piazza, verso chi guarda la farmacia. Rotonda del River: a sinistra il campo sportivo, in basso l'area feste, dietro la farmacia la Pieve, a destra il Comune, in basso a destra Calimara. - Polisportiva: dal ponte prima il campo principale, poi il secondario col padel; dietro, l'area feste. - Andrea ha 27 anni nel 2007: battute, documento e CLAUDE.md corretti. - Mappa su una griglia ordinata, senza etichette sovrapposte. - Doppio clic: Andrea va al doppio della velocità. In pausa la musica sfuma e si ferma; dopo un minuto senza toccare niente il gioco va in pausa da solo. - Crediti: scorre solo l'elenco, dedica e Chiudi sempre in vista. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017egeN2amL84ErjfgQFtEDn
This commit is contained in:
@@ -26,9 +26,10 @@ export class Command {
|
||||
return isItem ? `Usa ${name} con…` : `${VERB_LABELS[g.defaultVerb(target)]} ${name}`;
|
||||
}
|
||||
|
||||
// Clic sulla scena: `look` per il clic destro o la pressione lunga.
|
||||
clickScene(point, { look = false } = {}) {
|
||||
// Clic sulla scena: `look` per il clic destro o la pressione lunga, `hurry` per il doppio clic (passo doppio).
|
||||
clickScene(point, { look = false, hurry = false } = {}) {
|
||||
const g = this.game;
|
||||
g.hurry = hurry;
|
||||
if (g.skip()) return 'skip';
|
||||
if (g.dialogue || g.busy) return null;
|
||||
const h = g.hotspotAt(point);
|
||||
|
||||
+2
-1
@@ -62,6 +62,7 @@ export class Game {
|
||||
this.walking = false;
|
||||
this.time = 0;
|
||||
this.stride = 0; // strada fatta, per scegliere il passo della camminata
|
||||
this.hurry = false; // doppio clic: si cammina al doppio della velocità
|
||||
this.reach = 0; // secondi di braccio teso quando prende qualcosa
|
||||
this.back = false; // di spalle davanti a una porta o a una bacheca
|
||||
}
|
||||
@@ -213,7 +214,7 @@ export class Game {
|
||||
}
|
||||
if (this.walking) {
|
||||
const scale = this.scaleAt(this.state.y);
|
||||
let step = SPEED * scale * dt;
|
||||
let step = SPEED * (this.hurry ? 2 : 1) * scale * dt;
|
||||
this.stride += step / scale;
|
||||
while (step > 0 && this.path.length) {
|
||||
const target = this.path[0], d = dist([this.state.x, this.state.y], target);
|
||||
|
||||
+4
-1
@@ -23,6 +23,7 @@ export class Music {
|
||||
this.current = null; // { src, audio }
|
||||
this.old = [];
|
||||
this.duck = 1; // 1 = pieno; meno di 1 mentre parla qualcuno
|
||||
this.hold = false; // in pausa: il brano sfuma e si ferma, poi riprende da dov'era
|
||||
}
|
||||
|
||||
// Chiamata a ogni fotogramma con il brano voluto: avvia, cambia e sfuma.
|
||||
@@ -33,10 +34,12 @@ export class Music {
|
||||
this.current = src ? { src, audio: this.start(src) } : null;
|
||||
}
|
||||
// Il brano in corso sale (o scende) verso il volume scelto; quelli vecchi sfumano fino a zero.
|
||||
const step = dt / FADE, target = this.muted ? 0 : this.volume * this.duck;
|
||||
const step = dt / FADE, target = this.muted || this.hold ? 0 : this.volume * this.duck;
|
||||
if (this.current) {
|
||||
const a = this.current.audio;
|
||||
a.volume = a.volume < target ? Math.min(target, a.volume + step) : Math.max(target, a.volume - step);
|
||||
if (this.hold && a.volume === 0 && !a.paused) a.pause();
|
||||
else if (!this.hold && a.paused && a !== this.blocked) a.play().catch(() => { this.blocked = a; });
|
||||
}
|
||||
for (const a of this.old) a.volume = Math.max(0, a.volume - step);
|
||||
this.old = this.old.filter(a => a.volume > 0 || (a.pause(), false));
|
||||
|
||||
Reference in New Issue
Block a user