É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énementsdomaine.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 :
| engagement | concrètement | l'aléa qui en découle |
|---|---|---|
| disponibilité | la Technocrane est chez quelqu'un d'autre du 12 au 19 | décaler un jour de tournage fait tomber toute la réservation |
| logistique | elle voyage sur un porteur, se monte en 3 h | elle n'est pas là au premier plan du matin |
| fragilité | elle casse, elle s'use, elle revient rayée | franchise, 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é) | famille | facettes |
|---|---|---|
| Grue Technocrane 22' | machinerie | Locatable + Transportable + Fragile |
| Série d'optiques Cooke S4/i | optique | Locatable + Transportable + Fragile |
| Groupe électrogène 100 kVA | lumiere | Locatable + Transportable + Reglemente (bruit) |
| Décor « appartement de Nadia », studio d'Épinay | decor | Constructible + Occupant |
| Peugeot 504 break de 1973 | vehicule | Locatable + Transportable + Fragile + Reglemente |
| Faux sang cinéma, 5 L | consommable | Consommable + Perissable |
| MAS-36 neutralisé + balles à blanc | arme | Locatable + Reglemente + Transportable |
| Bergamote, chien berger australien | animal | Vivant + Reglemente + Transportable |
| Autorisation de tournage, mairie du 18e | administratif | Reglemente (seule) |
| Costume d'époque sur mesure, rôle Nadia | costume | Constructible + Perissable (salissure) |
| Auditorium de mixage, Saint-Ouen | post | Locatable + Occupant |
| DCP + KDM, labo Éclair | post | Locatable (forfait) |
| Fumigène + ventilateur | consommable | Consommable + 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
}
| mode | coût | délai | risque | effet de bord |
|---|---|---|---|---|
| Location jour | plein tarif | 1–2 ticks | faible | s'accumule : 12 jours de grue = le prix d'une grue |
| Location semaine | ≈ 3 j facturés pour 5–7 j | moyen | faible | verrouille le calendrier : décaler le plan de travail perd le dégressif |
| Achat | 5 à 20× la journée | long | nul | l'objet reste, s'use, se revend en fin de tournage |
| Construction | matériaux + temps + gens du poste deco | 3–10 ticks | moyen (retard, qualité) | mobilise des humains qui ne sont pas ailleurs : le vrai coût est là |
| Emprunt / faveur | 0 € | variable | élevé : se retire au dernier moment | crée une dette narrative ; le prêteur réapparaît |
| Placement de produit | négatif | long (négociation) | faible | contraint la mise en scène ; le réalisateur se braque |
| Réquisition dernière minute | 2 à 4× le tarif | 0–1 tick | dispo garantie, qualité mauvaise | l'issue de secours : chère, moche, disponible |
Deux règles opinionnées :
- 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é.
- 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
hmcet 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_tickssort 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 quand | effet du réducteur |
|---|---|---|
element.option.posee | le joueur pose une option | statut option, échéance armée |
element.option.expiree | échéance sans confirmation | statut → repere ; un autre peut le prendre |
element.materiel.commande | confirmation | statut reserve, coutEngage_eur |
element.livraison.retardee | tirage sur fiabiliteFournisseur.actual | retard_ticks++, propagation au plan de travail |
element.livraison.substituee | le fournisseur envoie autre chose | recuDefId renseigné, conformite baissée |
element.materiel.casse | tirage casseParJour_p | statut en_panne, franchise débitée |
element.stock.epuise | quantiteRestante <= 0 | plan dégradé ou bloqué selon criticité |
element.construction.terminee | fin des ticks de construction | statut monte, qualité effective figée |
lieu.autorisation.refusee | tirage refus_p | autorisation en manquante, blocage |
lieu.decor.perdu | tirage perteTardive_p | tout le BlocDecor invalidé |
element.materiel.rendu | fin de location | caution 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 :
- 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.
- 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.
- 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.
- 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 absent | exemple |
|---|---|---|
bloquant | le 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é |
degradable | le 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 |
confort | plan 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.
etatAnnoncement,apportne 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 post | modélisation retenue | pourquoi |
|---|---|---|
| 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) | LocationDef | idem, 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 VFX | ElementDef family: 'prestataire' + Locatable à long delaiCommande_ticks | un forfait avec délai et qualité annoncée mensongère (Rated) : le pattern location marche tel quel |
| DCP + KDM (labo) | ElementDef family: 'post' + Locatable forfaitaire | livrable simple, délai, risque de non-conformité DCI |
| Droits musicaux | ❌ pas un élément → un Deal, chapitre 1 | on 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 Shot | 340 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.
| situation | ce que ça exige | coût | délai | si on triche |
|---|---|---|---|---|
| Arme, même neutralisée | armurier agréé (sfx), déclaration préfecture | 800 €/j + 1 500 € dossier | 10 ticks | contrôle police : saisie + arrêt de tournage |
| Animal | dresseur (animaux), vétérinaire d'astreinte si scène à risque | 600–2 500 €/j | 6 ticks | signalement, mauvaise presse (réputation −) |
| Cascade | coordinateur (cascades), doublure, répétition, surprime | 3 000 €/j + 8 % de surprime | 8 ticks | accident : p élevé, arrêt de production |
| Enfant de moins de 16 ans | autorisation DDETS, 4 h/j max, répétiteur (enfants), cachet consigné | 1 200 € dossier | 20 ticks | inspection du travail, amende, arrêt |
| Drone | télépilote, scénario S3, autorisation DGAC | 1 800 €/j | 15 ticks | amende lourde, assurance annulée sur tout le film |
| Fermeture de rue | mairie + police, arrêté, riverains prévenus | 400–4 000 € | 12 ticks | plainte des riverains, police sur place, journée perdue |
| Nuit (22 h – 6 h) | dérogation, majoration salariale | +40 % de masse salariale | 6 ticks | conflit avec l'équipe, moral -- |
| Pyrotechnie / feu | artificier, pompiers sur place, périmètre | 2 500 €/j + pompiers | 10 ticks | blessure, 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_pfaible ; 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_pest modulé parvoisinage.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 :
- 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.
Ratedest 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.- 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
-
Neuf facettes, est-ce déjà trop ?
Perissablene sert qu'au faux sang, à la nourriture et aux costumes salis ;Vivantqu'aux animaux. Les fusionner dans unContraignantporteur d'une règle scriptée, ou assumer une facette par mécanique ? -
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.
-
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 ?
-
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 ?
-
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
DecorsousLocationdoublerait le nombre d'objets à saisir : ça les vaut ? -
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. -
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 ?
-
Le joueur voit-il
conformiteavant 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étenceimagedépasse un seuil — l'aléa devient une récompense de casting.