Aller au contenu principal

Éléments de production

Fiche d'entité. Respecte le contrat de README.md : ContentBase / InstanceBase, argent entier en euros suffixé _eur, Tick = demi-journée, stats 0–100, probabilités suffixées _p, événements domaine.sujet.verbe_au_passé.

Périmètre : tout ce qui n'est pas une personne mais qu'il faut trouver, réserver, louer, construire, transporter, assurer. Matériel technique, décors, lieux, véhicules, accessoires, costumes, animaux, armes, moyens de post-production, prestataires, labos.


1. Rôle dans le jeu

Un directeur de production débutant croit que le matériel, c'est de l'achat : une ligne de devis, un chèque, l'objet arrive. Le jeu doit lui apprendre le contraire en trois soirées. Un élément n'est pas un prix, c'est quatre engagements simultanés :

engagementconcrètementl'aléa qui en découle
disponibilitéla Technocrane est chez quelqu'un d'autre du 12 au 19décaler un jour de tournage fait tomber toute la réservation
logistiqueelle voyage sur un porteur, se monte en 3 helle n'est pas là au premier plan du matin
fragilitéelle casse, elle s'use, elle revient rayéefranchise, immobilisation, remplacement en urgence
conformitéce qui arrive ≠ ce qui a été commandéles optiques réservées sont parties sur une pub, on vous envoie « l'équivalent »

C'est la deuxième grande source d'aléas après les gens, et une source qualitativement différente : un humain négocie, ment, se rattrape ; un élément est brutalement binaire — il est là ou il n'est pas là, et il ne s'excuse pas. Cette froideur produit des échecs non négociables, qui obligent à replanifier plutôt qu'à discuter. Les gens créent du drame, les éléments créent des impasses.

Ils sont aussi le support du dépouillement : lire une scène et en extraire « une voiture d'époque, un flingue, une rue fermée » est le geste métier fondateur, et sans éléments modélisés finement, le dépouillement (scenes.md) n'a rien à surligner.

Anti-objectif assumé : ce n'est pas un jeu d'inventaire. La granularité utile est celle d'une feuille de service, pas d'un bon de commande. On ne compte pas les gélatines.


2. Le problème de la taxonomie

Un Element plat ne suffit pas. Un type unique à 40 champs optionnels oblige le moteur à tester if (e.prixJour_eur != null) partout sans savoir si undefined veut dire « gratuit » ou « pas concerné », affiche 40 champs pour saisir un seau de faux sang, et n'empêche pas de créer un décor construit avec une date de péremption.

Quinze types distincts ne suffisent pas non plus. CameraDef, GrueDef, AnimalDef, ArmeDef… honnête sémantiquement, ingérable en pratique : la logique de location est identique pour une caméra, une grue et un cheval — la dupliquer quinze fois, c'est quinze endroits où corriger le dégressif. Et les objets du réel refusent les cases : une voiture de jeu d'époque est du matériel loué et un accessoire de décor et un objet à transporter et un objet réglementé. Elle irait dans quel type ?

La solution retenue : une base + neuf facettes composables. Un seul kind: 'element', une family purement descriptive (filtrage éditeur, iconographie, zéro logique), et des facettes qui portent tout le comportement moteur.

type ElementDef = ContentBase & {
kind: 'element'
family: ElementFamily // classement humain, aucune logique moteur
poste: Poste // qui en a la charge sur le plateau
chapitre: ChapitreDevis // 1..10, cf. README §6
phases: PhaseProduction[] // quand l'élément est mobilisable
apport: Partial<Record<CritereQualite, number>> // 0..100 par critère, cf. §7
etatAnnonce: Rated // 0..100 — le catalogue du loueur embellit
library: boolean // bibliothèque générique vs spécifique scénario
facets: ElementFacets
}

type ElementFamily =
| 'camera' | 'optique' | 'machinerie' | 'lumiere' | 'son' | 'vehicule'
| 'accessoire' | 'costume' | 'animal' | 'arme' | 'decor'
| 'consommable' | 'post' | 'prestataire' | 'administratif'

type ChapitreDevis = 1|2|3|4|5|6|7|8|9|10
type PhaseProduction = 'preparation' | 'tournage' | 'post'
type CritereQualite = 'image' | 'son' | 'jeu' | 'production_value' | 'securite'

Les facettes sont un objet à clés optionnelles, pas un tableau d'unions étiquetées : if (e.facets.locatable) se narrow tout seul, là où facets.find(f => f.type === …) demande un helper et un cast à chaque appel. Coût assumé : on ne peut pas porter deux fois la même facette — un élément « locatable deux fois » est en réalité deux éléments.

type ElementFacets = {
locatable?: Locatable; constructible?: Constructible; consommable?: Consommable
transportable?: Transportable; perissable?: Perissable; reglemente?: Reglemente
fragile?: Fragile; occupant?: Occupant; vivant?: Vivant
}

/** Se réserve chez un tiers, à la durée. */
type Locatable = {
fournisseurId: string; prixJour_eur: number; caution_eur: number
degressif: { seuilJours: number; coefficient_p: number }[] // 1 semaine ≈ 3 jours facturés
delaiCommande_ticks: number
fiabiliteFournisseur: Rated // le commercial est optimiste
substitutId?: string // l'« équivalent » qu'on vous refourguera
}
/** N'existe pas : il faut le fabriquer. */
type Constructible = {
dureeConstruction_ticks: number; coutMateriaux_eur: number
postesRequis: Partial<Record<Poste, number>> // ex. { deco: 4, electro: 1 }
qualiteParTickManquant: number // malus si on bâcle pour rattraper
demontable: boolean // sinon, occupe le plateau jusqu'à la fin
}
/** Se dépense à l'usage. */
type Consommable = {
unite: string // 'litre' | 'cartouche' | 'plaque'
consommationParPlan: number; prixUnitaire_eur: number; delaiReappro_ticks: number
}
/** Doit aller du loueur au décor, puis d'un décor à l'autre. */
type Transportable = {
volume: 'sac' | 'coffre' | 'break' | 'camion' | 'porteur' | 'convoi'
dureeChargement_ticks: number // 0 en général, 1 pour une grue
necessiteChauffeur: boolean // mobilise un poste 'regie'
fragileEnTransport_p: number
}
/** Se dégrade avec le temps réel, pas avec l'usage. */
type Perissable = {
dureeVie_ticks: number
aExpiration: 'inutilisable' | 'degrade'
conservation?: 'frigo' | 'sec' | 'obscurite' // une contrainte de régie
}
/** Demande une autorisation, un professionnel, une déclaration. */
type Reglemente = {
autorisations: AutorisationRef[]
posteObligatoire?: Poste // 'sfx' pour une arme, 'animaux' pour un chien
surcoutAssurance_eur: number
risqueControle_p: number // si le joueur passe outre
sanction: 'amende' | 'saisie' | 'arret_tournage' | 'perte_assurance'
}
type AutorisationRef = {
autorite: 'mairie' | 'prefecture' | 'proprietaire' | 'copropriete'
| 'drac' | 'dgac' | 'sncf' | 'police' | 'inspection_travail'
delaiInstruction_ticks: number; cout_eur: number; refus_p: number
}
/** Casse, s'use, immobilise. */
type Fragile = {
casseParJour_p: number; usureParJour: number; delaiReparation_ticks: number
franchise_eur: number // ce que ça coûte même assuré
bloquantSiCasse: boolean // une caméra oui, un pied non
}
/** Prend de la place et du temps sur un lieu. */
type Occupant = {
surface_m2: number; exclusif: boolean
dureeMontage_ticks: number; dureeDemontage_ticks: number
}
/** La neuvième, et elle se mérite. */
type Vivant = {
espece: string
dresseurRequis: boolean // poste 'animaux'
heuresTravailMax_ticks: number // 1 tick pour un chat, sérieusement
imprevisibilite: number // variance sur le nombre de prises
refus_p: number // le plan n'est pas obtenu du tout
}

Neuf facettes plutôt que quinze types : chaque facette est une mécanique, pas une catégorie d'objet. Une facette qui ne changerait rien au déroulement d'une partie devient un tag.

Quel objet du réel porte quelles facettes

élément (exemple nommé)famillefacettes
Grue Technocrane 22'machinerieLocatable + Transportable + Fragile
Série d'optiques Cooke S4/ioptiqueLocatable + Transportable + Fragile
Groupe électrogène 100 kVAlumiereLocatable + Transportable + Reglemente (bruit)
Décor « appartement de Nadia », studio d'ÉpinaydecorConstructible + Occupant
Peugeot 504 break de 1973vehiculeLocatable + Transportable + Fragile + Reglemente
Faux sang cinéma, 5 LconsommableConsommable + Perissable
MAS-36 neutralisé + balles à blancarmeLocatable + Reglemente + Transportable
Bergamote, chien berger australienanimalVivant + Reglemente + Transportable
Autorisation de tournage, mairie du 18eadministratifReglemente (seule)
Costume d'époque sur mesure, rôle NadiacostumeConstructible + Perissable (salissure)
Auditorium de mixage, Saint-OuenpostLocatable + Occupant
DCP + KDM, labo ÉclairpostLocatable (forfait)
Fumigène + ventilateurconsommableConsommable + Locatable + Reglemente

Lecture utile : une autorisation est un élément. Elle se trouve, elle a un délai, un coût, un risque de refus, et son absence bloque un plan exactement comme une caméra absente. La modéliser à part, ce serait recréer un seizième type pour ce qui tient dans une facette.


3. Les modes d'acquisition

Un même élément peut s'obtenir de plusieurs façons ; le choix du mode est une décision de joueur à part entière.

type ModeAcquisition =
| 'location' | 'achat' | 'construction' | 'faveur' | 'placement_produit' | 'requisition'

type OptionAcquisition = {
mode: ModeAcquisition
cout_eur: number // négatif pour un placement de produit
delai_ticks: number
qualiteObtenue: Rated // ce qu'on aura vraiment vs ce qui est promis
risqueEchec_p: number
contrepartie?: string // dette narrative, cf. events.md
}
modecoûtdélairisqueeffet de bord
Location jourplein tarif1–2 ticksfaibles'accumule : 12 jours de grue = le prix d'une grue
Location semaine≈ 3 j facturés pour 5–7 jmoyenfaibleverrouille le calendrier : décaler le plan de travail perd le dégressif
Achat5 à 20× la journéelongnull'objet reste, s'use, se revend en fin de tournage
Constructionmatériaux + temps + gens du poste deco3–10 ticksmoyen (retard, qualité)mobilise des humains qui ne sont pas ailleurs : le vrai coût est là
Emprunt / faveur0 €variableélevé : se retire au dernier momentcrée une dette narrative ; le prêteur réapparaît
Placement de produitnégatiflong (négociation)faiblecontraint la mise en scène ; le réalisateur se braque
Réquisition dernière minute2 à 4× le tarif0–1 tickdispo garantie, qualité mauvaisel'issue de secours : chère, moche, disponible

Deux règles opinionnées :

  1. La réquisition n'échoue jamais. C'est la soupape du jeu. Un joueur ne doit jamais être bloqué sans issue payante ; le prix de la soupape est le budget et la qualité, pas l'impossibilité.
  2. La faveur est la seule acquisition qui puisse se retirer après confirmation. Location et achat sont contractuels ; la faveur repose sur une relation, donc sur le moral et la réputation. C'est ce qui la rend intéressante.

4. Lieux et décors : un cas à part

La question : un lieu est-il un élément avec les facettes Occupant et Reglemente ?

La décision : non — une entité distincte LocationDef. Pas parce qu'il aurait plus de champs, mais parce qu'il joue un rôle structurel différent : un élément est une ressource consommée par un plan, un lieu est une clé de regroupement du plan de travail. Règle générale : une entité distincte se justifie quand elle apparaît comme dimension dans une autre structure du jeu. Le lieu apparaît dans le plan de travail, la feuille de service et le chapitre 6 du devis. Une grue non.

type LocationDef = ContentBase & {
kind: 'location'
nature: 'naturel' | 'studio' | 'construit_en_decor_naturel'
phases: PhaseProduction[]

base: { distanceBase_km: number; trajet_ticks: number } // depuis la base technique
capacite: { equipeMax: number; surface_m2: number }; parkingCamions: number

autorisations: AutorisationRef[] // ce qui fait qu'un lieu se perd
proprietaire: { exigeant: number; venal: number } // 0..100
voisinage: { tolerance: number; plaintes_p: number }

horairesAutorises: { debutTick: Tick; finTick: Tick }
bruit: 'silencieux' | 'passages' | 'axe_routier' | 'aeroport'
expositionMeteo: 'interieur' | 'abrite' | 'exterieur_total'
lumiereNaturelle: { orientation: string; heuresUtiles: number }

coutJour_eur: number
perteTardive_p: number // tout perdre à J-7
repliId?: string // le décor de secours, s'il existe
}

LocationDef réutilise le vocabulaire des facettes (AutorisationRef, Occupant pour les décors construits qu'on y monte) : c'est une spécialisation, pas un silo.

Le regroupement par décor : LA contrainte du plan de travail

C'est la seule règle métier qu'un joueur non initié ne devine pas, et celle qui produit le plus de gameplay. Un film se tourne dans le désordre du scénario, dans l'ordre des décors : toutes les scènes de l'appartement de Nadia se tournent à la suite, même si elles sont aux pages 4, 37 et 91. Raison prosaïque : chaque changement de décor coûte un déménagement — d'un demi-tick à une journée selon la distance et le volume de matériel.

Conséquences en cascade, que le moteur doit produire naturellement :

  • La continuité devient un problème. Nadia joue la scène 91 le matin (elle a pleuré, elle a un bleu), puis la scène 4 l'après-midi (elle est fraîche). Le poste hmc et la scripte deviennent critiques, et une erreur de raccord se paie au montage, pas au tournage : le retour est différé, donc cruel.
  • Un décor perdu ne coûte pas une scène, il coûte un bloc. Perdre l'appartement à J-4 détruit les quatre journées groupées, et les scènes doivent être re-réparties dans un calendrier plein, avec des comédiens dont les dates sont bloquées ailleurs.
  • L'ordre des décors est un puzzle lisible. Regrouper géographiquement (les trois décors du 18e le même jour) contre narrativement (garder la rupture pour la fin, pour le jeu) contre météo (les extérieurs tant qu'il fait beau). Trois pressions contradictoires.
  • Le tick de trajet est réel. trajet_ticks sort du temps de tournage : un décor à 1 h de la base, c'est une journée à 1,5 tick utile au lieu de 2. Le joueur découvre par l'échec pourquoi on installe le base-camp près des décors.
/** Dérivé par le moteur ; c'est ce que l'UI appelle « le plan de travail ». */
type BlocDecor = {
locationId: string
sceneIds: string[]
jours: Tick[]
coutDemenagementEntrant_eur: number
fragilite: number // 0..100 : quelle part du film tombe si le décor est perdu
}

fragilite s'affiche en rouge. C'est le meilleur outil pédagogique du jeu : « 40 % de votre film dépend d'un accord oral avec un propriétaire ».


5. ElementState

type ElementState = InstanceBase & {
statut: ElementStatut
modeAcquisition: ModeAcquisition

commandeDefId: string
recuDefId?: string // ≠ commandeDefId : substitution subie
conformite: number // 0..100, 100 = exactement ce qui était prévu

usure: number // 0..100 cumulé
quantiteRestante?: number // facette Consommable
expireAuTick?: Tick // facette Perissable

reservation?: { duTick: Tick; auTick: Tick; prixVerrouille_eur: number }
livraisonPrevueTick?: Tick; retard_ticks: number
autorisationsObtenues: string[]; autorisationsManquantes: string[]

coutEngage_eur: number // déjà dû, même si l'élément n'a pas servi
coutPaye_eur: number
incidents: Tick[] // historique de casse — nourrit la relation au loueur
}

type ElementStatut =
| 'repere' // identifié, rien de réservé : un devis, une photo de repérage
| 'option' // réservé mais annulable, souvent 48 h
| 'reserve' // engagé contractuellement, annulation payante
| 'confirme' // le fournisseur a confirmé la date exacte
| 'en_transit' | 'livre'
| 'monte' // Occupant / Constructible : utilisable sur le plateau
| 'en_panne'
| 'perdu' // volé, détruit, ou défaut du fournisseur
| 'rendu'

La distinction option / reserve est le principal levier de trésorerie du métier : poser des options sur trois décors et n'en confirmer qu'un est le geste normal ; oublier d'annuler les deux autres est l'erreur de débutant, et elle doit coûter cher.

recuDefId ≠ commandeDefId porte la catastrophe la plus réaliste et la moins spectaculaire du métier : on a réservé des Cooke, on reçoit des Zeiss « équivalentes », le chef op le voit au premier plan et perd une heure à recaler. Elle se découvre à la livraison, pas à la commande — donc trop tard.

événementémis quandeffet du réducteur
element.option.poseele joueur pose une optionstatut option, échéance armée
element.option.expireeéchéance sans confirmationstatut → repere ; un autre peut le prendre
element.materiel.commandeconfirmationstatut reserve, coutEngage_eur
element.livraison.retardeetirage sur fiabiliteFournisseur.actualretard_ticks++, propagation au plan de travail
element.livraison.substitueele fournisseur envoie autre choserecuDefId renseigné, conformite baissée
element.materiel.cassetirage casseParJour_pstatut en_panne, franchise débitée
element.stock.epuisequantiteRestante <= 0plan dégradé ou bloqué selon criticité
element.construction.termineefin des ticks de constructionstatut monte, qualité effective figée
lieu.autorisation.refuseetirage refus_pautorisation en manquante, blocage
lieu.decor.perdutirage perteTardive_ptout le BlocDecor invalidé
element.materiel.rendufin de locationcaution rendue moins l'usure

6. La chaîne logistique comme mécanique

La tentation est de simuler des camions ; il faut y résister. Règle de granularité : la logistique n'est modélisée que là où elle peut faire rater un plan. Trois nombres.

type ChaineLogistique = {
delaiCommande_ticks: number // décidé à la commande, connu du joueur
delaiTransport_ticks: number // dérivé de la distance du décor, connu
aleaLivraison_p: number // dérivé de fiabiliteFournisseur.actual, caché
}

Le joueur ne conduit pas de camion : il décide d'une date de commande, le moteur lui dit si l'élément est là à temps. Le gameplay n'est pas dans le transport, il est dans la marge — commander tôt coûte des jours de location en plus, commander juste à temps expose au retard.

commande transport montage tournage
├──────────────────┤ ├─────────────┤ ├──────────┤ ├───────────────┤
↑ ↑
décision du joueur └─── marge ───┘ le plan a besoin de l'élément

Sources de tension, par ordre d'importance :

  1. Le blocage en cascade. Un élément absent ne fait pas perdre son plan : il fait perdre l'heure pendant laquelle l'équipe attend, donc les plans suivants, donc la journée. 1 tick de retard de livraison peut coûter 3 ticks de tournage. Le joueur doit sentir que le temps d'attente est plus cher que l'objet.
  2. Le montage occupe le lieu. Monter 15 m de travelling dans une rue fermée prend un tick pendant lequel on ne tourne pas. Qui planifie 8 plans dans la journée sans compter les montages en fait 4.
  3. La casse ouvre une décision, elle ne punit pas. Caméra en panne à 10 h → réquisition à 4× le prix, ou caméra B en dégradé, ou journée perdue. Toute casse doit offrir un choix.
  4. Le stock n'existe que pour les consommables. Une quantité, une règle de réappro. Pas d'entrepôt, pas d'inventaire multi-sites.

Ce qu'on ne modélise pas, explicitement : tournées de camions, chargement individuel, créneaux de livraison, itinéraires, carburant. Ces choses existent dans la fiction (la régie s'en plaint) mais jamais comme décision de joueur.


7. Participation à la résolution

Côté scène, un besoin d'élément porte sa criticité — et la criticité est une propriété du besoin, pas de l'élément : la même grue est bloquante pour un plan-séquence aérien et confortable pour un plan fixe.

type BesoinElement = {
elementDefId?: string // un élément précis…
family?: ElementFamily // …ou « n'importe quelle caméra »
quantite: number
criticite: 'bloquant' | 'degradable' | 'confort'
penalite: Partial<Record<CritereQualite, number>> // appliqué si absent
surcoutTemps_ticks?: number // appliqué si absent
}
criticitési l'élément est absentexemple
bloquantle plan n'est pas tourné. Le temps est consommé, l'argent aussi, rien n'est produit ; le plan retourne au plan de travail.pas de caméra ; pas d'autorisation pour fermer la rue ; scène en costume d'époque, costume pas livré
degradablele plan est tourné, avec penalite sur les critères concernés — et le joueur peut ne pas s'en apercevoir tout de suite.pas de grue → mouvement fait à l'épaule : image -25, production_value -30
confortplan tourné sans perte de qualité, mais surcoutTemps_ticks en plus.pas de dolly → rails posés à la main, +1 tick

Règle éditoriale : au plus deux besoins bloquant par scène. Le reste dégrade. Trop de bloquant et le jeu devient un mur ; trop de degradable et rien n'a d'enjeu. Une catastrophe doit presque toujours laisser tourner — le film médiocre est plus intéressant à jouer que le film non tourné.

function contributionElement(def: ElementDef, st: ElementState): number {
const etat = (100 - st.usure) / 100
const conforme = st.conformite / 100
const dispo = st.statut === 'monte' || st.statut === 'livre' ? 1 : 0
return etat * conforme * dispo // 0..1
}
// apportEffectif[c] = def.apport[c] * contributionElement(def, st)
// qualite[c] = base[c] + Σ apportEffectif[c] - Σ penalites[c]

Trois choix assumés :

  • Le produit, pas la moyenne. Une caméra conforme mais usée à 60 % ne rend pas « un peu moins bien » : elle rend 40 % de ce qu'elle promettait. Les éléments se multiplient.
  • etatAnnonce ment, apport ne ment pas. Ce qu'une optique apporte à l'image est une donnée objective que le chef op connaît. Ce qui ment, c'est l'état de l'exemplaire précis qu'on vous livrera.
  • L'excès ne sert à rien. L'apport d'une famille est plafonné au meilleur élément présent plus un bonus décroissant. Sinon le jeu se gagne en louant tout.

8. Éléments spécifiques à la post-production

Tranché : le même modèle pour cinq d'entre eux, autre chose pour deux.

moyen de postmodélisation retenuepourquoi
Salle de montage (12 semaines)LocationDef, nature: 'studio', phases: ['post']un lieu occupé exclusivement pendant des semaines, avec calendrier et coût jour
Auditorium de mixage (5 jours)LocationDefidem, en plus rare et plus cher : la contention sur les auditoriums est un vrai gameplay de calendrier
Étalonnage (labo, 4 jours)LocationDef + un Person (l'étalonneur)l'humain compte autant que la salle
Studio VFXElementDef family: 'prestataire' + Locatable à long delaiCommande_ticksun forfait avec délai et qualité annoncée mensongère (Rated) : le pattern location marche tel quel
DCP + KDM (labo)ElementDef family: 'post' + Locatable forfaitairelivrable simple, délai, risque de non-conformité DCI
Droits musicaux❌ pas un élément → un Deal, chapitre 1on ne le loue pas, on ne le transporte pas, on ne le casse pas. C'est une négociation avec un ayant droit, qui peut échouer après que le film est monté dessus
Les plans VFX eux-mêmes❌ pas des éléments → attributs de Shot340 plans truqués ne sont pas 340 objets à réserver : c'est un volume de travail attaché aux plans déjà tournés, cf. shots.md

Aucun modèle parallèle n'est nécessaire : le champ phases suffit. Une seule propriété métier est propre à la post et doit être codée en dur : le retard n'y a plus de soupape. Pas de réquisition d'auditorium à 4× le prix la veille du festival. La contrainte se durcit en fin de partie — ce qui est le bon sens dramaturgique.


9. Assurance, réglementation, sécurité

Le socle est la facette Reglemente. L'intérêt ludique : la réglementation est un système d'échange temps/argent contre risque, et le joueur doit pouvoir tricher.

situationce que ça exigecoûtdélaisi on triche
Arme, même neutraliséearmurier agréé (sfx), déclaration préfecture800 €/j + 1 500 € dossier10 tickscontrôle police : saisie + arrêt de tournage
Animaldresseur (animaux), vétérinaire d'astreinte si scène à risque600–2 500 €/j6 tickssignalement, mauvaise presse (réputation −)
Cascadecoordinateur (cascades), doublure, répétition, surprime3 000 €/j + 8 % de surprime8 ticksaccident : p élevé, arrêt de production
Enfant de moins de 16 ansautorisation DDETS, 4 h/j max, répétiteur (enfants), cachet consigné1 200 € dossier20 ticksinspection du travail, amende, arrêt
Dronetélépilote, scénario S3, autorisation DGAC1 800 €/j15 ticksamende lourde, assurance annulée sur tout le film
Fermeture de ruemairie + police, arrêté, riverains prévenus400–4 000 €12 ticksplainte des riverains, police sur place, journée perdue
Nuit (22 h – 6 h)dérogation, majoration salariale+40 % de masse salariale6 ticksconflit avec l'équipe, moral --
Pyrotechnie / feuartificier, pompiers sur place, périmètre2 500 €/j + pompiers10 ticksblessure, procédure, film arrêté
  • Le délai punit plus que le coût. 20 ticks pour l'autorisation d'un enfant, c'est 10 jours : découvrir en semaine 3 qu'on a un enfant en scène 12, c'est déjà être en retard. Meilleure leçon du jeu sur la préparation — l'argent, lui, se trouve toujours.
  • Tricher doit être jouable et parfois rationnel. Tourner sans autorisation dans une rue calme un dimanche matin a un risqueControle_p faible ; le joueur qui s'en sort a appris quelque chose de vrai. Celui qui tente une avenue en semaine se fait ramasser.
  • La sanction est graduée, jamais aléatoire pure. risqueControle_p est modulé par voisinage.tolerance, l'heure et la visibilité de l'infraction : punir une prise de risque raisonnable est frustrant, punir une imprudence évidente est pédagogique.
  • La perte d'assurance est la sanction ultime. Elle ne coûte rien immédiatement : elle supprime la couverture de tous les incidents suivants. Différée, donc terrifiante — et elle enseigne à quoi sert une assurance.
type AssuranceState = {
primeBase_eur: number
surprimes: { motif: string; montant_eur: number }[]
franchiseParSinistre_eur: number
couverte: boolean // false après une infraction constatée
sinistres: { tick: Tick; montant_eur: number; prisEnCharge: boolean }[]
}

10. Édition dans le backoffice

Deux bibliothèques, et c'est tout :

  • Générique (library: true, packId: 'core') : ce qui existe dans le monde réel et revient dans tous les scénarios — Alexa 35, série de Cooke, Technocrane, 4 kW HMI, groupe électrogène. Écrit une fois, versionné avec le jeu.
  • Spécifique (library: false, packId: '<scenario>') : la Peugeot 504 précise que le réalisateur veut, l'appartement de Nadia, le chien Bergamote.

Le mécanisme de réemploi qui compte est le pack :

type PackElements = ContentBase & {
kind: 'element'
isPack: true
contenu: { elementDefId: string; quantite: number }[]
remise_p: number // un pack loué en bloc coûte moins que la somme de ses lignes
}

Packs à écrire une fois : « caméra 2 corps + optiques + accessoires », « lumière fiction intérieur jour », « machinerie légère », « régie base-camp ». Un auteur compose 90 % de son matériel en glissant trois packs, puis saisit les cinq objets qui font l'histoire.

┌─ Élément ─────────────────────────────── [core] ──── ready ─┐
│ Nom [ Grue Technocrane 22' ] │
│ Famille [ machinerie ▾ ] Poste [ machinerie ▾ ] Ch. [ 7 ] │
│ Résumé [ Grue télescopique 22 pieds, tête stabilisée ] │
│ Tags [ prestige ] [ exterieur ] [ lourd ] [ + ] │
├─ Facettes ───────────────────────────────────────────────────┤
│ ☑ Locatable ☐ Constructible ☐ Consommable │
│ ☑ Transportable ☐ Périssable ☐ Réglementé │
│ ☑ Fragile ☐ Occupant ☐ Vivant │
│ │
│ ▸ Locatable Fournisseur [ TSF ▾ ] Prix/jour [ 1 400 ] € │
│ Dégressif 5 j → 0.62 Caution [ 15 000 ] € │
│ Délai commande [ 4 ] ticks │
│ Fiabilité annoncée [90] réelle [64] conf.[.5]│
│ ▸ Transportable volume [ porteur ▾ ] chargement [1] tick │
│ ▸ Fragile casse/j [0.04] franchise [ 3 000 ] € │
├─ Apport qualité ─────────────────────────────────────────────┤
│ image [████████░░ 78] production_value [█████████░ 88] │
└──────────────────────────────────────────────────────────────┘

Trois exigences non négociables :

  1. Les facettes sont des cases qui révèlent des sous-formulaires. Un élément moyen en coche deux : le formulaire fait 12 champs, pas 40.
  2. Rated est un widget, pas trois champs. annoncée / réelle / confiance sur une ligne, avec un signal visuel quand l'écart est grand — c'est là que l'auteur écrit de l'intrigue, il faut que ça saute aux yeux.
  3. Un bouton « dupliquer vers ce scénario » : partir d'un élément générique pour en faire une variante spécifique est le geste éditorial le plus fréquent.

Validations bloquantes : un Constructible sans postesRequis, un Consommable sans unite, un Reglemente sans autorisation, un élément dont apport est vide sur tous les critères (il ne sert à rien : c'est probablement un tag).


11. Questions ouvertes

  1. Neuf facettes, est-ce déjà trop ? Perissable ne sert qu'au faux sang, à la nourriture et aux costumes salis ; Vivant qu'aux animaux. Les fusionner dans un Contraignant porteur d'une règle scriptée, ou assumer une facette par mécanique ?

  2. Un exemplaire ou une ligne de location ? « La Technocrane que j'ai louée », avec son usure et son historique de casse, ou « ma ligne de location de grue » ? La première permet une réputation par exemplaire, la seconde évite de gérer un parc.

  3. La substitution est-elle négociable ? Quand le loueur envoie des Zeiss à la place des Cooke, le joueur peut-il refuser, exiger, menacer ? Une mécanique sociale sur une entité non humaine : élégant, ou confus ?

  4. Faut-il un marché avec de vrais concurrents ? Aujourd'hui la disponibilité est un tirage ; on pourrait simuler d'autres productions qui réservent les mêmes grues aux mêmes dates. Plus juste, beaucoup plus coûteux — et le joueur le percevrait-il ?

  5. Où s'arrête la granularité des lieux ? La cuisine et le salon d'un même appartement sont deux décors, deux implantations lumière, deux demi-journées de montage. Un niveau Decor sous Location doublerait le nombre d'objets à saisir : ça les vaut ?

  6. La construction consomme-t-elle des gens nominativement ? Des individus modélisés (donc une qualité variable selon compétence et moral) ou une quantité abstraite de poste deco ? La première relie les deux fiches, la seconde évite quinze constructeurs fantômes.

  7. Quelle courbe pour le plafonnement par famille ? Un second corps caméra a une valeur réelle considérable — il double la cadence. Une règle par famille plutôt qu'une générale ?

  8. Le joueur voit-il conformite avant de tourner ? Visible à la livraison, il peut réagir ; visible seulement au rush, c'est plus juste dramatiquement mais peut sembler arbitraire. Piste : visible par le chef op si sa compétence image dépasse un seuil — l'aléa devient une récompense de casting.