# THOSBRIDGE

Especificació de la versió web educativa per a THOSAPPS. Revisió de calibratge: 13 d’octubre de 2026.

## Origen i reconeixement del creador

**THOSBRIDGE està inspirat en Bridge Building Game, creat per Alex Austin (Cryptic Sea).**

Referència del joc original: [Bridge Building Game — Cryptic Sea](https://crypticsea.com/bridgebuilding/).

La carpeta aportada conté `bridge.exe`, identificat internament com a **Bridge Building Game 1.25**, amb la cadena `Bridge Building Game (c) 2006 Alex Austin`, la biblioteca SDL i dos paquets de 15 nivells. Aquesta autoria es reconeix al peu visible de l’app, a l’ajuda i en aquest document.

THOSBRIDGE és una adaptació educativa independent. La interfície, l’editor i el motor del navegador s’han escrit de nou. No s’ha recuperat el codi font original ni s’ha convertit l’executable a WebAssembly. No es presenta com un producte oficial de Cryptic Sea ni com una reproducció exacta del seu motor.

Els fitxers dels nivells aportats s’han llegit i convertit a dades web, mantenint-ne la procedència. Els executables, la DLL i les textures originals no formen part dels fitxers publicats. No s’ha trobat un fitxer de llicència dins la carpeta aportada; aquest document no atribueix una nova llicència al material original.

## Objectiu didàctic

Construir una estructura amb un pressupost limitat i comprovar si un tren pot travessar-la. L’alumnat ha de poder observar la diferència entre tauler i reforç, l’efecte de la triangulació, els esforços de tracció i compressió, la deformació i la ruptura dels trams.

Interfície en català, execució al navegador i projectes desats localment. La primera versió prioritza un camí senzill: triar nivell, construir el pont, prémer **▶ Tren**, observar i millorar.

## Nivells recuperats

### Incorporació per famílies

S’incorpora una família cada vegada i l’usuari en fa les proves visuals i de joc abans de continuar amb la següent. **No badis** és la primera família addicional: **24 nivells**, procedents de [BB Classics Map Pack 01](https://www.indiedb.com/games/bridge-builder/addons/bb-classics-map-pack-01). L’app ofereix ara **54 nivells**: No miris (15), No cau (15) i No badis (24).

Els 11 fitxers MP01 són de **Schlumpfine** i els 13 MP02 de **Thomas McGuire**. **Captain Smith** els va convertir al format de Bridge Building Game. El readme del paquet explica que n’exclou sis abans de distribuir-lo: MP01L10–13, MP02L01 i MP02L05. THOSBRIDGE incorpora els 24 fitxers disponibles, ordenats pel nom original i numerats de l’1 al 24 dins de No badis; no inventa els sis nivells absents. Es conserva el nom original, l’autor, la geometria, el pressupost, els hashes i la procedència de cada fitxer. Al nivell 17 s’han trobat dos registres d’ancoratge sentinella molt fora del mapa; no es fan servir com a suports, però se’n conserva la posició a les metadades d’origen. Els crèdits del nivell seleccionat es poden consultar a l’Ajuda.

Les dades es publiquen a `thosbridge/families/no-badis.js`, separades dels 30 nivells inicials. Els identificadors nous són `no-badis-01` a `no-badis-24`; els identificadors `old-*` i `new-*` es mantenen. La família nova no inclou un botó d’exemple triangular, perquè aquest exemple només està preparat per al primer nivell de No miris i No cau. Els originals descarregats i les altres 13 famílies addicionals continuen locals, pendents de la seva incorporació i revisió.

**No badis: pendent de les proves de l’usuari.** Les comprovacions de conversió i estabilitat numèrica no certifiquen que els 24 nivells siguin resolubles amb les regles del motor web.

### Paquets inicials

- **No miris** (paquet original Old): `level/01-Old/Level01.lvl` a `Level15.lvl`.
- **No cau** (paquet original New): `level/02-New/01-Level.bgl` a `15-Level.bgl`.
- Aquests noms es mostren al selector, al títol del nivell i als missatges. Els identificadors interns `old` i `new` es mantenen perquè els ponts desats, el progrés i els JSON continuïn associats als mateixos nivells.
- Els 30 nivells es poden seleccionar directament. Superar-los els marca amb un indicador i permet passar al següent.
- Cada nivell conserva el seu pressupost, l’obertura, el perfil del terreny, la cota de l’aigua i els ancoratges presents al fitxer.
- **Pont basculant de No miris 15:** la via es construeix horitzontal, de l’ancoratge (−8, 0) fins a (2, 0). El pes dels reforços connectats a l’esquerra actua com a contrapès i aixeca la via fins a la riba elevada. El tren pot fer-la baixar si supera el moment del contrapès. Els contactes amb el terreny són temporals i no es converteixen en ancoratges. Els dissenys anteriors es conserven, però una via inicial inclinada s’ha d’adaptar abans de provar-la. Aquesta regla només s’activa en aquest nivell.
- **Aproximació del basculant:** s’integra el gir del conjunt segons el moment dels pesos i la inèrcia, amb amortiment i límits de contacte. La deformació i els esforços axials es calculen en un sistema de coordenades girat, amb una reacció auxiliar a l’extrem de la via. És una aproximació educativa, no un model dinàmic complet de mecanismes articulats. El gir intencionat no es compta com a flexió. Referència del repte original: [guia del nivell 15](https://www.bridgebuilder-game.com/bb-tips.php).
- **Ajust web de No miris 13:** s’hi afegeix un suport fix a l’extrem esquerre de la via (`x = −20, y = 0`). No és al fitxer original: és una adaptació explícita perquè el motor web no reconeix com a suport la riba, situada 0,25 unitats per sota de la via. Els ancoratges originals i el hash del fitxer es mantenen intactes.
- Es conserva una franja del relleu que cobreix tota l’obertura i 12 unitats addicionals de graella a cada costat. Els extrems del perfil es prolonguen per dibuixar el terreny fora d’aquesta franja.
- Les coordenades es normalitzen amb una graella de 4 unitats originals: centre de l’obertura a x = 0 i cota nominal del tauler a y = 0. La unitat de graella **no s’etiqueta com a metre**.
- Cada registre conserva ruta d’origen, mida i SHA-256 del fitxer aportat, així com la informació de normalització.

| Nivell | Pressupost No miris | Ancoratges No miris | Pressupost No cau | Ancoratges No cau |
| --- | ---: | ---: | ---: | ---: |
| 1 | 2.000 | 4 | 1.000 | 2 |
| 2 | 3.000 | 6 | 4.000 | 2 |
| 3 | 7.000 | 10 | 8.000 | 4 |
| 4 | 6.000 | 6 | 2.000 | 1 |
| 5 | 4.500 | 4 | 8.000 | 4 |
| 6 | 8.000 | 6 | 3.000 | 2 |
| 7 | 25.000 | 8 | 4.000 | 2 |
| 8 | 50.000 | 14 | 1.500 | 1 |
| 9 | 10.000 | 6 | 40.000 | 12 |
| 10 | 2.000 | 3 | 4.000 | 1 |
| 11 | 100.000 | 11 | 20.000 | 6 |
| 12 | 16.000 | 9 | 12.000 | 6 |
| 13 | 8.000 | 2 | 50.000 | 6 |
| 14 | 12.000 | 6 | 8.000 | 2 |
| 15 | 7.000 | 1 | 40.000 | 5 |

### Lectura dels formats

Els enters i els nombres de coma flotant es llegeixen en little-endian. El conversor comprova mides i estructura abans d’escriure les dades.

**LVL:** cota de l’aigua a l’offset 0, cota del tauler a 4, pressupost a 8, extrems de l’obertura a 12 i 16, 1.024 mostres de relleu a partir de 20 i recompte d’ancoratges a 4.116. Cada registre d’ancoratge ocupa 92 bytes; se’n recuperen les coordenades inicials. La resta del registre no es tracta com a propietats del motor web.

**BGL:** capçalera de 44 bytes, identificador enter 1.111.970.370 i versió 4; cota del tauler a 8, cota de l’aigua a 12, extrems a 16 i 20, pressupost a 24, valor de pes a 28, tres camps enters a 32, 36 i 40. Hi ha 512 mostres de relleu, recompte d’ancoratges a 2.092, un camp intermedi de 4 bytes i registres de coordenades de 12 bytes.

La capçalera BGL completa i els tres camps enters finals es conserven com a metadades. **No s’ha confirmat el significat de tots els camps ni de les possibles regles especials dels nivells.** No s’han inventat interpretacions per completar aquests camps. Les dades de càrrega s’utilitzen amb una escala pròpia del motor web, descrita a continuació.

## Editor

1. **Barra:** element de reforç estructural.
2. **Tauler:** element que també forma part del camí del tren.
3. **Seleccionar:** veure longitud i tipus d’un tram, canviar-lo entre barra i tauler o esborrar-lo.
4. **Esborrar:** eliminar trams i els nodes lliures que quedin sense connexions. Els ancoratges del nivell es conserven.

Els trams es creen clicant dos punts o arrossegant entre ells. Els punts nous s’ajusten a la graella; els ancoratges existents tenen prioritat en l’ajust. Els punts nous segueixen la graella. Es rebutgen els extrems de trams situats al terreny o enterrats si no coincideixen amb un ancoratge marcat. La via horitzontal inicial del basculant de No miris 15 conserva la seva excepció. Només els ancoratges marcats del nivell fixen l’estructura: tocar una riba o el fons del riu no crea cap suport nou. Cada tram nou costa **100 unitats de pressupost**, independentment de la longitud, i la longitud màxima web és de **4,5 unitats de graella**.

Amb l’eina **Via** es pot dibuixar directament d’una riba a l’altra. El traç es divideix en trams vàlids, reutilitza els nodes existents que hi coincideixen i mostra el nombre de trams i el cost abans de crear-los. A No miris · Nivell 1, el traç de 8 unitats es divideix en dos trams de 4 unitats i costa 200. Repassar una cadena de barres amb Via les converteix en trams transitables sense duplicar-les ni tornar a cobrar-les. Si falta pressupost, tota l’operació es descarta.

Un tram no es crea si supera el pressupost, té longitud nul·la o duplica una unió del mateix tipus. Les barres individuals massa llargues es rebutgen; l’eina Via les subdivideix. Els ancoratges no es poden moure ni afegir arbitràriament. Aquesta versió no inclou l’arrossegament de nodes ja construïts; es poden esborrar i reconstruir els trams afectats.

Desfer i refer conserven fins a 80 estats per al nivell actual. Canviar de nivell manté el seu pont desat, però reinicia l’historial de desfer. Buidar el pont és reversible amb Desfer.

El tauler automàtic construeix trams horitzontals de fins a dues unitats a la cota nominal. Omet trams on el terreny arriba a aquesta cota. L’operació és atòmica: si falta pressupost, no deixa un tauler parcial. Als nivells amb desnivells cal ajustar o completar manualment el camí.

Al primer nivell de cadascun dels dos paquets hi ha un exemple triangular de cinc trams, carregable amb un sol botó i preparat per provar. És una ajuda inicial; no s’afegeixen solucions automàtiques per als altres nivells.

## Simulació pròpia

### Prova prèvia d’esforços

El botó **◈ Test d’esforços** mostra un mapa sobre el disseny quiet, sense animació ni esperes pel pas d’un tren. El càlcul es fa en una còpia aïllada: aplica el pes propi i una càrrega vertical repartida pel tauler, proporcional a la longitud de cada tram i repartida entre els seus extrems. També es pot provar una estructura que encara no tingui un camí continu.

Totes les barres i el centre dels trams de tauler es pinten amb una escala **groc → taronja → vermell**, segons el valor absolut del màxim esforç relatiu: groc a 0%, taronja a 50% i vermell a 100% o més. La tracció i la compressió comparteixen aquesta escala de càrrega; el seu signe es descriu a la targeta de prova. Es destaquen els cinc trams més carregats amb identificador i percentatge del límit. Les vores turqueses del tauler es conserven.

Internament es reutilitza el motor numèric sobre la còpia, fins a 6 segons de temps de càlcul simulat, executats seguits sense animació: 0,8 segons de pes propi i 3 segons d’augment gradual de càrrega, seguits d’estabilització. No és un nou resolutor estàtic. Si supera el límit d’un tram o un node lliure baixa més que el límit de descens del nivell, el càlcul s’atura amb avís abans d’arribar necessàriament a tota la càrrega. Per presentar el mapa, es restitueixen les coordenades originals i es retenen els màxims d’esforç; no es dibuixen trams trencats ni una caiguda.

Completar el test no marca el nivell com a superat. Des del resultat es pot prémer **Fer passar el tren**, que inicia una prova nova sobre el disseny original, o **Millorar el pont**. La càrrega repartida és una aproximació didàctica pròpia: no equival al test del programa original i no garanteix resistir una càrrega mòbil. Una estructura formada només per barres es prova sota el seu pes propi, perquè no té tauler on repartir la càrrega.

### Targetes i controls

La targeta de resultat de la prova del tren té la capçalera verda si el pont se supera i vermella si no se supera. Només canvia el fons de la capçalera; el cos i el contorn de la targeta conserven els colors habituals. El mapa previ d’esforços conserva la capçalera neutra, perquè no marca el pont com a superat.

A **Trams més carregats**, cada tram inclou una barra que s’omple amb una animació curta fins al seu percentatge d’esforç i adopta el mateix color groc-taronja-vermell del mapa. L’amplada es limita al 100%; si l’esforç supera el límit, la xifra mostra el valor real. Durant el tren, les barres s’actualitzen sense recrear tota la llista ni reiniciar l’animació a cada fotograma. El tipus d’esforç i el percentatge continuen visibles en text. Es respecta la preferència del navegador de reduir moviment.

Els selectors de paquet i nivell i les accions de construcció se situen a la barra superior. El panell lateral desapareix i la graella ocupa tota l’amplada. El cost i el pressupost i els paràmetres i resultats de la prova es mostren en targetes sobre la graella, visibles durant el pas del tren. La llegenda de símbols i colors es consulta dins **Ajuda (?)**, juntament amb les indicacions de zoom; no ocupa una targeta sobre la graella.

Es poden arrossegar per la capçalera, moure amb les fletxes quan aquesta té el focus i plegar o ampliar independentment. La selecció d’un tram i el resultat també són targetes mòbils. **▣** amaga o mostra les targetes informatives; **⤢** restableix les posicions. Les posicions i l’estat plegat es desen amb la clau `thosbridge:cards:v1`, separats del projecte. Canviar-los no modifica el pont, el JSON ni l’historial. En redimensionar la pantalla, les targetes es mantenen dins de la graella.

### Prova amb tren

El motor web modela nodes amb massa i barres elàstiques articulades. Primer deixa actuar el pes propi durant 0,8 segons i després fa avançar una càrrega distribuïda en quatre punts, representada visualment com un tren.

| Paràmetre web | Valor inicial |
| --- | ---: |
| Pas de càlcul | 1/240 s |
| Rigidesa axial | 3.600 |
| Gravetat relativa | 10 |
| Resistència de referència | 260 |
| Massa base de node lliure | 0,35 |
| Massa afegida a cada extrem lliure | 0,08 × longitud del tram |
| Amortiment axial | 5 |
| Amortiment de velocitat | factor exp(−1,5 × dt) |
| Límit de descens del tauler per a la prova | 3% de la llum del nivell, limitat entre 0,25 i 4,5 unitats de graella |

La força axial depèn de l’allargament del tram i de la velocitat relativa dels seus extrems. El límit de resistència es redueix amb la longitud segons `260 / (1 + longitud² / 30)`. Un tram es trenca si el valor absolut de l’esforç relatiu supera 1.

Per als BGL, el valor recuperat a l’offset 28 s’escala com `pes / 5.000`, limitat entre 4 i 24 unitats de massa. Per als LVL, sense aquest camp, s’utilitza una referència de 40.000 i per tant una massa web base de 8. El selector de pes aplica factors del 50%, 100%, 150% o 200%. Aquest escalat és una decisió de THOSBRIDGE, **no una equivalència demostrada amb el tren original**.

Durant el càlcul, només els ancoratges explícits del nivell són suports fixos. Els nodes lliures continuen sent lliures encara que toquin el terreny. Qualsevol conjunt de trams sense connexió amb un ancoratge impedeix iniciar la prova, també al test d’esforços. Les unions entre barres continuen permeses i no creen ancoratges. Els ponts desats no es modifiquen, però els que depenien de suports de terreny automàtics poden deixar de superar la prova. El límit de descens és comú a totes les famílies i s’adapta a la llum del nivell: `clamp(0,03 × (right − left), 0,25, 4,5)` unitats de graella. És un llindar didàctic del motor web, no una propietat física ni una garantia que el nivell tingui una solució. L’aigua es representa com a context del nivell i no aplica flotabilitat ni forces hidrodinàmiques. Les barres treballen axialment: no es modelen flexió de bigues, moments als nusos, vinclament específic ni propietats de materials reals.

### Recorregut i resultat

- El tren necessita un camí continu format per trams de **tauler** entre les ribes. Les barres de reforç no compten com a camí.
- El recorregut avança en x i admet taulers inclinats amb pendent absoluta màxima 1. El terreny que arriba a la cota nominal pot connectar els accessos i els trams separats per sòl sòlid.
- L’aproximació sobre terreny es representa a la cota nominal, sense calcular la circulació del tren sobre totes les irregularitats del relleu. Per aquest motiu cal revisar especialment els nivells amb desnivells i regles especials.
- La càrrega es reparteix entre els extrems del tram sota cada punt de càrrega.
- La prova falla si falta el camí, es trenca un tram sota el tren, el tauler supera el límit de descens del nivell o el càlcul esdevé inestable. El límit es calcula amb una regla comuna: `clamp(0,03 × (right − left), 0,25, 4,5)` unitats de graella. És un criteri didàctic de THOSBRIDGE, no una equivalència amb un criteri d’enginyeria real.
- La prova passa quan la part posterior del tren supera l’arribada. Pot haver-hi trams trencats que ja no impedeixin el pas; el resultat informa dels trencaments.
- Una prova al 50% de pes no marca el nivell com a superat. Cal superar-la com a mínim al 100%.
- Pausa atura l’avanç del càlcul. **Editar** recupera les coordenades originals del pont; la deformació i la ruptura de la prova no modifiquen el projecte.

Si el pont perd el suport del tren, entra en una fase de **col·lapse**. El càlcul de les barres, la gravetat i el contacte amb el terreny continuen durant 8 segons de simulació perquè es pugui observar la caiguda. Els vehicles sense suport cauen i els que encara recolzen al tauler continuen carregant l’estructura. **El missatge i el botó Millorar el pont apareixen immediatament en detectar la fallada**, mentre la caiguda continua. Es pot pausar el col·lapse o tornar a editar sense esperar que acabi. Una manca de camí inicial continua donant un avís immediat, sense simular un col·lapse.

El tauler es dibuixa amb **dues vores turqueses** que identifiquen el camí del tren i conserven el color durant la prova. Durant el pas del tren, els colors vermells indiquen compressió i els blaus tracció; al tauler es mostren al centre, entre les dues vores. El mapa previ utilitza l’escala groc-taronja-vermell descrita abans. La intensitat expressa la proximitat al límit relatiu del tram, no tensions en MPa ni una verificació de resistència d’un pont real.

Quan no hi ha camí continu, el resultat indica **Falta completar el tauler**. Quan el camí existeix però no aguanta la prova, indica **El pont necessita reforços**. Construir un tauler continu permet iniciar la prova; superar-la també requereix resistència estructural.

## Desament i privacitat del projecte

Els ponts es desen per nivell a `localStorage`, amb clau `thosbridge:projects:v1`. El navegador conserva el nivell seleccionat i els nivells superats. Si l’emmagatzematge falla, l’app informa que cal descarregar el pont.

El format JSON exportat inclou `app: "THOSBRIDGE"`, `version: 1`, `levelId` i `bridge`. La importació valida coordenades finites, identificadors, extrems de trams, tipus, longitud, pressupost i integritat dels ancoratges. No permet afegir punts fixos nous. Hi ha límits de 700 nodes, 1.500 trams i 2 MB per fitxer importat.

Els projectes de l’alumnat no s’envien a un servidor ni es publiquen al repositori. Es comparteixen només si l’usuari descarrega i distribueix el seu JSON.

## Integració a THOSAPPS

Ruta pública prevista: `thosbridge.html`, que es conserva com a entrada a l’arrel i carrega `thosbridge/index.html`. La targeta THOSBRIDGE existent s’activa per obrir aquesta ruta, mantenint el seu SVG. No es crea una segona targeta.

Fitxers de l’aplicació:

```text
thosbridge.html (entrada pública)
thosbridge/index.html
thosbridge/app.css
thosbridge/app.js
thosbridge/core.js
thosbridge/cards.js
thosbridge/levels.js
thosbridge/thosbridge-card.svg
thosbridge/bridge.jpg (imatge conservada, sense referències actives)
thosbridge/families/no-badis.js
thosbridge/tests/core.test.js
thosbridge/tests/no-badis.test.js
thosbridge/tools/convert-levels.cjs
thosbridge/tools/convert-no-badis.cjs
thosbridge/tools/serve.cjs
thosbridge/package.json
thosbridge/THOSBRIDGE.md
```

La publicació inicial inclou també l’enllaç de la targeta a `index.html` i la ruta al `sitemap.xml`. Les revisions posteriors només modifiquen fitxers de THOSBRIDGE. No incorpora biblioteques externes ni depèn d’un backend. Les importacions web utilitzen el marcador de versió `20261011-noms-v21`.

### Ordres tècniques

Des de l’arrel del repositori:

```sh
node --test thosbridge/tests/*.test.js
node thosbridge/tools/serve.cjs
node thosbridge/tools/convert-levels.cjs "ruta/a/Bridge Building Game"
```

La prova que contrasta els fitxers originals requereix tenir-los accessibles. Al repositori, es pot indicar la carpeta original amb la variable d’entorn `BBG_SOURCE`; sense aquesta carpeta, aquesta prova específica queda omesa. La resta de proves funciona amb les dades web.

## Validació i límits d’aquesta primera versió

**Comprovacions tècniques realitzades:** 48 proves automàtiques aprovades a la carpeta original. Inclouen els hashes i la conversió dels 30 nivells, coordenades i pressupostos, recorreguts connectats i desconnectats, pressupost i longitud màxima, eliminació, importació JSON, càrregues diferents, estabilitat numèrica, el límit de descens proporcional a la llum i el rebuig de suports inventats en contacte amb el terreny. Els exemples dels dos primers nivells passen amb el tren estàndard; un tauler sense reforços falla a la mateixa prova.

Aquestes comprovacions **no demostren que tots els nivells tinguin una solució viable amb les regles del motor web** ni que el resultat coincideixi amb Bridge Building Game. La conversió preserva dades geomètriques i pressupostos; les regles especials i la fidelitat de la jugabilitat encara s’han de contrastar.

Abans de donar una família per validada, cada nivell haurà de tenir una estructura de referència que respecti el pressupost, completi el recorregut i superi el tren al 100% sense trencaments. Com a objectiu didàctic inicial, la càrrega màxima hauria de quedar per sota del 85% de la resistència i la fletxa per sota del 75% del límit del nivell. Aquests marges encara s’han de contrastar amb dissenys de referència; un resultat fallit d’una armadura genèrica no demostra que el nivell sigui impossible.

**Comprovacions visuals i d’interacció web: a càrrec de l’usuari**, segons la seva indicació. No s’han executat proves al navegador en aquesta fase.

Aspectes per a la seva revisió:

1. Crear i esborrar trams, desfer/refer i distingir barra de tauler.
2. Carregar l’exemple del primer nivell, provar, pausar i tornar a editar.
3. Comprovar colors, deformació i missatges de fallada.
4. Desar i reobrir un JSON; recarregar i recuperar els ponts de diversos nivells.
5. Recórrer els 54 escenaris, especialment els nivells amb desnivells, un sol ancoratge i obstacles alts.
6. Contrastar amb l’executable original la geometria visible i identificar les regles especials que calgui reproduir en una iteració posterior.
7. Moure i plegar les targetes, comprovar la barra superior i fer **Test d’esforços → Tren**. Contrastar els identificadors dels trams amb la targeta de prova.

Les millores posteriors s’han de decidir a partir d’aquesta revisió. No s’incorporen en aquesta primera versió un editor de nivells, materials addicionals, còpia/simetria d’estructures ni un motor professional de càlcul estructural.

### Unions explícites sobre trams (v13)

Començar o acabar una barra o tauler sobre un tram existent crea o reutilitza un node compartit i divideix aquell tram en dos, conservant el seu tipus. Només els extrems explícits creen unions: un creuament sense extrem compartit continua independent. Els punts nous segueixen la graella i la proximitat als nodes existents. No es creen nodes a tots els punts de la graella.

A partir de v20, dividir una barra o tauler existent és gratuït: els fragments comparteixen el cost original. Només els trams nous afegeixen 100 al pressupost utilitzat. L’operació completa, incloent les divisions als dos extrems, es comprova abans d’aplicar-la. Si supera pressupost o límits, no modifica el pont. Repintar tauler sobre un tram més llarg reutilitza les parts dividides i evita crear un segon tauler superposat.

Els fitxers desats no es transformen automàticament. Aquesta revisió s’ha comprovat amb construccions noves: transmissió real de càrrega en una unió central, reutilització de nodes, creuaments independents, pressupost atòmic i tauler sense duplicació. Les proves visuals les fa l’usuari.

### Indicador de tracció (v14)

La targeta Prova i esforços incorpora una barra blava animada de tracció màxima, amb percentatge respecte del límit i tram associat. Manté els cinc trams més carregats i els seus tipus d’esforç. La tracció es registra independentment del pic absolut, perquè una compressió posterior més gran a la mateixa barra no esborri la tracció anterior. El registre es reinicia a cada prova. Sense prova mostra pendent; si no hi ha tracció mostra 0% i no detectada. L’amplada es limita al 100%, però la xifra pot superar-lo. Es respecta la preferència de reduir moviment.

### Targeta de dades i opcions del tren (v16)

El pes del tren i la velocitat passen al diàleg Opcions del tren, accessible amb ⚙ a la barra superior. La targeta Prova i esforços només conté dades: resum de prova, tracció màxima amb barra blava animada i els cinc trams més carregats amb el seu tipus d’esforç. Es conserva el bloqueig del pes durant una prova i la velocitat es pot canviar en directe.

Per decisió de l’usuari, s’han retirat les dades de fletxa i vinclament orientatiu, incloent el contorn groc discontinu del pont. El motor continua representant només esforços axials de tracció i compressió.

### Fletxes didàctiques al llenç (v17)

Per petició de l’usuari, s’incorporen fins a quatre indicacions petites i semitransparents al llenç, sense tornar a afegir fletxa ni vinclament a la targeta de dades. Tracció: dues fletxes blaves cap enfora; compressió: dues fletxes vermelles cap endins. Es tria un tram representatiu per a cada tipus, amb esforç superior al 3,5% del límit axial. Durant el tren s’utilitza l’esforç actual; al mapa previ i al resultat, els pics registrats per separat.

La fletxa màxima és una mesura vertical lila entre la cota original i el punt de màxim descens registrat del tauler, en unitats de graella. Conserva les coordenades del moment mesurat i s’atura quan comença el col·lapse. No calcula moments de flexió. El mapa previ conserva aquesta mesura tot i mostrar el pont sense deformació. No es dibuixa per descensos menors o iguals a 0,025 u.

El vinclament es representa amb una petita fletxa lateral discontínua groga, explícitament etiquetada com a orientatiu, sobre una barra no trencada de longitud mínima 3,375 u i compressió superior al 3,5%. És una il·lustració didàctica, no un esforç calculat ni una corba de deformació simulada. No proporciona càrrega crítica, no dóna percentatge i no altera la física. Es prioritza compressió per longitud al quadrat per escollir un sol exemple.

L’animació és discreta: desplaçament curt de les fletxes axials i oscil·lació curta de l’indicador lateral, sense alterar la geometria del pont. Es respecta la preferència de reduir moviment i la pausa. El botó ◉ amaga també les fletxes. Les comprovacions visuals queden a càrrec de l’usuari.

### Fletxes sense textos i amb seguiment del tren (v18)

Per petició de l’usuari, les indicacions noves del llenç només dibuixen fletxes, sense etiquetes, valors ni percentatges. S’elimina la pulsació d’opacitat. Els colors i el significat es descriuen a l’ajuda; el vinclament continua sent només orientatiu. La targeta conserva les dades numèriques.

Durant el tren s’utilitza un filtratge exponencial de l’esforç actual amb constant de temps de 0,2 segons de simulació, aplicat només a les indicacions. La selecció de trams s’actualitza cada 500 ms de pantalla i conserva el representant mentre un altre no el superi en més del 20%, sempre que continuï treballant en el mateix sentit. Els trams trencats deixen de mostrar fletxes immediatament. Es mantenen els esforços i els criteris de fallada originals, sense filtrar la física. Al mapa previ i al resultat es representen els pics registrats. L’animació de les fletxes té amplitud de només 1,5 píxels i opacitat constant.

### Millores visuals abans de les noves famílies (v19)

Previsualització de connexió al punt de la graella: cercle verd amb marca per a node existent o unió sobre tram; cercle gris discontinu per a punt nou. Es ressalten els trams que rebran una unió. La previsualització i la divisió real comparteixen el mateix criteri geomètric; no modifiquen el pont fins a completar el dibuix. El pressupost continua comprovant-se al moment de crear els trams.

Els cinc trams més carregats es poden relacionar amb el llenç passant el cursor per la fila o enfocant el botó amb Tab. El tram rep un ressaltat daurat mentre dura la interacció, sense alterar selecció, geometria o prova. Es neteja en canviar de simulació o desaparèixer de la llista.

El tren es dibuixa amb vectors de Canvas: locomotora de vapor amb cabina, caldera, xemeneia, llum frontal, rodes i biela; vagó de carbó i dos vagons amb finestres. Contorns, vidres i franges donen contrast amb el tauler. Les rodes segueixen el desplaçament, els vehicles s’inclinen amb el tram transitable i els enganxalls són només visuals. Les dimensions s’adapten al zoom per evitar que se superposin a escales petites. La física, els quatre punts de càrrega, el pressupost i els nivells no canvien. La preferència de reduir moviment desactiva la rotació decorativa de les rodes.

### Unions sense penalització de pressupost (v20)

Crear un node sobre una barra o tauler conserva el cost total d’aquell material, també en divisions repetides i desiguals. Es reparteix proporcionalment a la longitud dels fragments amb el camp opcional costShare; sense aquest camp un tram costa 100. Afegir una barra nova costa 100 encara que divideixi material als dos extrems. Repassar material existent amb Tauler o dividir-lo no torna a cobrar-lo.

Eliminar un fragment retorna només la seva part proporcional de cost. El total es normalitza per evitar errors d’arrodoniment en el pressupost. La importació conserva les quotes vàlides i rebutja valors no finits, nuls, negatius, superiors a 1 o inferiors a la quota mínima compatible amb la longitud màxima original. Els fitxers anteriors sense costShare mantenen el seu cost declarat de 100 per tram; no s’inventa la procedència de les seves divisions.

La previsualització i els missatges mostren el cost del material que realment s’afegeix, i la selecció mostra la quota del fragment. El càlcul de la previsualització es desa temporalment mentre el punt no canviï. Les comprovacions inclouen unions als dos extrems, pressupost atòmic, divisions amb pressupost complet, cost conservat, eliminació proporcional, exportació/importació i quotes incorrectes. Aquest canvi no demostra per si sol que tots els nivells siguin superables.

### Noms de les eines (v21)

Les eines es mostren com a Reforç (abans Barra) i Via (abans Tauler). Reforç crea elements estructurals; Via crea el camí transitable del tren. Els botons, la selecció, els missatges i l’ajuda utilitzen aquests noms. Es mantenen les dreceres B i T, els identificadors interns bar/deck i el format dels ponts desats.

### Col·lapse visual (v20)

Quan una prova del tren falla, la fase de col·lapse no reutilitza com a velocitat física el desplaçament elàstic calculat al pas anterior. Durant la caiguda, els trams que s’allarguen més d’1,35 vegades respecte de la seva longitud inicial es trenquen. Al llenç es dibuixen com fragments curts de color coral que s’esvaeixen, amb un senyal breu al punt de fallada, en comptes de mantenir línies llargues entre extrems separats.

La fase continua durant 8 segons. Aquest tractament només actua després de detectar una fallada: no modifica els criteris per superar el nivell, el pressupost ni el pont guardat.
