Kzone2023-12-24T22:39:44+00:00https://kemenaran.winosx.comKzoneVéligo cargo : dimensions des caisses2023-10-14T22:21:00+00:00/posts/veligo-cargo-dimension-des-caisses<p>En cherchant un siège-enfant qui rentre dans un <a href="https://www.veligo-location.fr/">Véligo</a> cargo, je me suis rendu compte qu’il était difficile de trouver en ligne les dimensions précises de la caisse de chaque vélo (biporteur ou triporteur).</p>
<p>Voici donc les relevés des dimensions de chaque caisse.</p>
<h2 id="véligo-biporteur">Véligo biporteur</h2>
<p><img src="/images/veligo/veligo-biporteur.webp" alt="Vélo biporteur Véligo" />
<img src="/images/veligo/veligo-biporteur-dimensions.png" alt="Dimensions de la caisse du vélo biporteur Véligo" /></p>
<h2 id="véligo-triporteur">Véligo triporteur</h2>
<p><img src="/images/veligo/veligo-triporteur.webp" alt="Vélo triporteur Véligo" />
<img src="/images/veligo/veligo-triporteur-dimensions.png" alt="Dimensions de la caisse du vélo triporteur Véligo" /></p>
Zelda: Link's Awakening progress reports moved to a new location2023-07-11T16:31:00+00:00/posts/zelda-links-awakening-progress-reports-moved-to-a-new-location<p>After two years of waiting, a new progress report for the Zelda: Link’s Awakening disassembly is <a href="https://zladx.github.io/posts/links-awakening-disassembly-progress-report-part-13">finally published</a>!</p>
<p>To celebrate this, I took the time to move this series of articles to its own dedicated website: the <a href="https://zladx.github.io/">Link’s Awakening disassembly blog</a>. Of course, the former URLs now redirect to these new pages.</p>
<p>This move makes subscribing to new disassembly-related articles easier, since only relevant Link’s Awakening content will be published.</p>
<p>And meanwhile my own blog will resume to more random and personal stuff.</p>
Paris mon camarade – Bernard Dimey2022-12-09T11:08:00+00:00/posts/paris-mon-camarade-bernard-dimey<p>Un poème de <a href="https://fr.wikipedia.org/wiki/Bernard_Dimey">Bernard Dimey</a>, que j’ai eu du mal à trouver facilement en ligne :</p>
<blockquote>
<p>Paris, mon camarade, pour causer, faut connaître,<br />
Faut s’y prom’ner la nuit, faut s’y fair’ des copains, <br />
Faut s’offrir du bitume, en faire des kilomètres, <br />
Y’aura toujours un pote pour t’offrir un bout de pain.<br />
Paris, si tu connais c’est comme un’ cour d’école,<br />
T’es tout partout chez toi si t’as l’coeur bien placé,<br />
Si jamais t’as l’bourdon, va voir ceux qui rigolent<br />
Et tu verras, l’soleil y en a toujours assez.</p>
<p>Paris, mon camarade, c’est pas tout c’qu’on raconte,<br />
C’est pas les bulldozers, c’est pas la Tour Machin,<br />
C’est un coeur qui s’allume au hasard des rencontres,<br />
C’est le petit bistrot où vont tous les copains ;<br />
Paris, si tu connais, c’est le vent dans les voiles,<br />
Romeo et Juliette en blue-jeans à midi,<br />
C’est le clodo Marcel qui dort sous les étoiles ;<br />
Y a de l’Enfer, c’est sûr, mais il y du Paradis.</p>
<p>Paris, mon camarade, si tu connais, c’est chouette,<br />
C’est toujours aussi bon, quand j’fous l’camp, quand j’reviens,<br />
C’est le sourire en coin quand le cafard me guette,<br />
C’est l’Opéra d’quat’ sous qu’est pas fait pour les chiens,<br />
C’est le seul cinéma où y a jamais d’entracte,<br />
Où j’ai tous mes amours et j’espère vraiment<br />
M’offrir un soir la joie d’y jouer mon dernier acte<br />
Et d’être parisien jusqu’au dernier moment.</p>
</blockquote>
<p><em><a href="https://fr.wikipedia.org/wiki/Bernard_Dimey">Bernard Dimey</a>, récité par <a href="https://www.facebook.com/BernardBeaufrereGardeChampetreRepubliqueMontmartre/">Bernard Beaufrère</a></em></p>
Zelda: Link’s Awakening Turbo-Français2022-11-14T13:03:00+00:00/posts/zelda-links-awakening-turbo-francais-mod<p>La traduction française de <em>Zelda: Link’s Awakening</em> a un charme particulier. Le texte de <a href="https://www.squarepalace.com/secret-of-mana-veronique-chantel-traduction-presse/secrets-de-traduction-de-secret-of-mana-magazine">Véronique Chantel</a> est plein de rimes, raccourcis, bizarreries et étrangetés, qui collent parfaitement à l’esprit « Twin Peaks » du jeu. Tout cela en respectant les contraintes techniques de la Game Boy, qui obligeait par exemple le texte français à être à peu près de la même longueur que le texte anglais ou japonais – d’où la nécessité de faire passer les informations essentielles en peu de mots.</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/pecheur.png" alt="Une capture d’écran du jeu, avec un pêcheur expliquant à Link « Sois un peu plus motivé ! »" /><br />
<em>« Vis ta vie ! Sois un peu plus motivé ! » Ce pêcheur m’a longtemps fasciné.</em>
</span></p>
<p>Mais le texte français comporte malgré tout une imperfection : <strong>les lettres majuscules n’ont pas d’accent.</strong> C’est dommage, car au delà de la lisibilité, le sens de certains mots change parfois en fonction des accents : « OEUF SACRE » n’est pas la même chose que « OEUF SACRÉ », ni « NAUFRAGE » que « NAUFRAGÉ ».</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/oeuf-sacre-sans-accent.png" alt="Une capture d’écran du jeu, avec un texte « VAS VOIR L’OEUF SACRE », sans accent sur le E de sacré." /><br />
<em>Un Œuf Sacre, c’est quand même pas la même chose.</em>
</span></p>
<p>Cette omission est dûe à un <strong>compromis technique</strong>.</p>
<p>Pour chaque traduction, les programmeurs du jeu ont ajusté le code du jeu aux nécessités typographiques de chaque langue. Par exemple, la version japonaise permet d’afficher des diacritiques sur certains caractères ; et la version allemande gère les lettres comportant des trémas. Et le code utilisé pour afficher les diacritiques sur les lettres majuscules peut utiliser au maximum deux signes différents (par exemple un tréma et un accent).</p>
<p>Mais le script français aurait besoin de <strong>trois accents</strong> : aigu, grave et circonflexe. Plutôt que de passer un temps précieux à supprimer cette limitation, l’équipe de traduction a donc préféré désactiver la gestion des accents sur les majuscules. Vu les contraintes de temps de développement, on les comprend.</p>
<h2 id="restaurer-la-gestion-des-accents">Restaurer la gestion des accents</h2>
<p>Toutefois, en explorant le <a href="https://github.com/zladx/LADX-Disassembly/tree/main/revisions/F0/src/text">script français</a>, il s’avère qu’une <a href="https://github.com/zladx/LADX-Disassembly/blob/916e58eec0a0ced3a1e26b796ba4d0b5abf1d0dc/revisions/F0/src/text/dialog_dx.asm#L23">unique ligne de texte</a> comporte une majuscule sur un accent : il est écrit « NAUFRAGÉ ». Et de fait, dans les graphismes stockés en mémoire, on trouve bien deux accents : <code class="language-plaintext highlighter-rouge">◌́</code> et <code class="language-plaintext highlighter-rouge">◌̀</code>.</p>
<p>Comme la gestion des diacritiques est désactivée pour le français, dans le jeu cette lettre est simplement affichée comme un « E » majuscule, sans accent. Mais cette lettre est un <strong>vestige des tentatives</strong> d’intégrer la gestion des diacritiques à la version française, avant que soit finalement entérinée l’absence d’accents sur les majuscules.</p>
<p>Heureusement, en utilisant le <a href="https://github.com/zladx/LADX-Disassembly">code-source restauré de Zelda: Link’s Awakening</a>, il est possible de compiler une version française qui ré-active la gestion des diacritiques. Cela permet à cet accent de s’afficher dans le jeu.</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/naufrage-avec-accent.png" alt="Une capture d’écran du jeu, avec un dialogue « NAUFRAGÉ » avec un accent sur le E de naufragé." /><br />
<em>Cet accent, désactivé dans le jeu original, n’avait pas été vu depuis 29 ans.</em>
</span></p>
<p>En modifiant le reste du texte, pour ajouter des accents aux autres majuscules, il devient alors possible d’afficher des accents sur toutes les majuscules du jeu !</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/E-avec-accent.png" alt="Une capture d’écran du jeu, avec un dialogue « TOUT SUR L’ÉPÉE TOURNOYANTE » avec deux accent sur les E de épée." />
</span></p>
<h2 id="accents-circonflexes">Accents circonflexes</h2>
<p>Toutes ? Presque. La limitation technique originale, qui empêche de gérer plus de deux types d’accents, est toujours présente. Comme les accents aigus et graves sont déjà présents, il manque l’accent circonflexe – ce qui empêche d’écrire un mot comme « POISSON-RÊVE ». Fâcheux.</p>
<p>La solution serait de trouver un espace inutilisé dans la mémoire graphique où stocker les pixels de l’accent circonflexe. Ce n’est pas simple : sur la Game Boy, la mémoire graphique est très limitée – et les accents doivent occuper le précieux espace des graphismes qui sont chargés en permanence en mémoire.</p>
<p>Comment faire ? Après quelques recherches, il s’avère qu’un emplacement n’est utilisé par le jeu que lorsque l’inventaire est ouvert. Il serait donc théoriquement possible, quand le jeu ouvre l’inventaire, de remplacer l’accent circonflexe par le graphisme dont l’inventaire a besoin – puis de restaurer l’accent circonflexe à la fermeture de l’inventaire.</p>
<p>Et ça marche ! Grâce à cette astuce, il est maintenant possible d’afficher les trois types d’accents dans le jeu.</p>
<p><img src="/images/zelda-links-awakening-turbo-francais/swap.gif" width="318px" height="223" style="width: 100%; height: auto; max-width: 450px;" alt="Une animation du jeu, montrant l'accent circonflexe être remplacé en mémoire graphique lorsque l'inventaire s'ouvre." /><br />
<em>Avec de bon yeux, on peut voir dans la mémoire graphique l’accent circonflexe être remplaçé par un autre symbole lorsque l’inventaire s’ouvre.</em></p>
<p>Il est donc enfin possible d’afficher correctement le texte ci-dessous :</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/poisson-reve-avec-accent.png" alt="Une capture d’écran du jeu, avec un dialogue « POISSON-RÊVE » avec un accent sur le E de poisson-rêve." /><br />
<em>Hourra !</em>
</span></p>
<h2 id="gérer-les-ligatures">Gérer les ligatures</h2>
<p>Un autre souci de la version originale est que les <em>e-dans-l’o</em> est affiché comme deux lettres séparées. Le jeu affiche donc par exemple « Coeur » et « Oeuf », sans faire la ligature.</p>
<p>Techniquement, il est relativement facile d’ajouter un caractère supplémentaire à la fonte du jeu. Reste à dessiner le nouveau caractère dans une police similaire à celle du jeu – ce qu’a fait avec brio <strong>merwok</strong> sur Discord.</p>
<p>Une fois ce nouveau caractère intégré, on peut facilement afficher le mot « cœur » correctement.</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/coeur-avec-ligature.png" alt="Une capture d’écran du jeu, avec un dialogue « cœur » avec le e-dans-l’o affiché comme une ligature." /><br />
<em>Haut les cœurs !</em>
</span></p>
<p>Le cas du « Œ » majuscule est un peu plus délicat : chaque lettre doit s’inscrire dans une case de 8x8 pixels – et le Œ majuscule est un peu trop large pour ça.</p>
<p>Heureusement il est possible d’ajouter à la fonte non pas un, mais deux caractères supplémentaires – ce qui rend donc 8x16 pixels disponibles pour dessiner la majuscule correctement.</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/OEUF-avec-ligature.png" alt="Une capture d’écran du jeu, avec un dialogue « ŒUF » avec le e-dans-l’o affiché comme une ligature." /><br />
<em>Ce « Œ » utilise deux tuiles de 8x8 pixels.</em>
</span></p>
<h2 id="zelda-links-awakening-turbo-français">Zelda: Link’s Awakening Turbo-Français</h2>
<p>Le résultat, c’est le mod le plus futile de tous les internets.</p>
<p><em><a href="https://www.romhacking.net/hacks/7281/">Zelda: Link’s Awakening Turbo-Français</a></em> ajuste le script français de Zelda DX, pour ajouter des accents et des ligatures partout où cela est nécessaire. Parfaitement in-dis-pen-sable pour les fans français du jeu.</p>
<p>Vous pouvez télécharger :</p>
<ul>
<li>Soit la <strong>version compilée</strong> (prête à l’usage dans un émulateur Game Boy, ou sur une vraie console) :<br />
<a href="/assets/files/zelda-links-awakening-turbo-francais/azlf-r1-turbo-francais-v1.3.gbc">📎 alzf-r1-turbo-francais-v1.3.gbc</a></li>
<li>Soit le <strong>patch IPS</strong> sur romhacking.net (à appliquer vous-même) :<br />
<a href="https://www.romhacking.net/hacks/7281/"> https://www.romhacking.net/hacks/7281/</a></li>
</ul>
<p>Pour celleux que ça intéresse, le <a href="https://github.com/kemenaran/LADX-Disassembly/commits/mod/turbo-francais">code-source de ces modifications</a> est également disponible.</p>
<p>Bon jeu !</p>
<p><span class="pixel-art">
<img src="/images/zelda-links-awakening-turbo-francais/kyoto-vero.png" alt="Une capture d’écran du jeu, avec un dialogue « Bon baisers de Kyoto! VÉRO ❤️ » avec un accent sur le E de Véro." />
</span></p>
Éducation égalitaire garçons / filles – 0-3 ans2022-10-24T21:33:00+00:00/posts/education-egalitaire-stereotypes-de-genre-0-3-ans<p>Les stéréotypes de genre apparaissent très tôt dans la vie d’un bébé. Dès la naissance, les personnes autour de lui projettent des choses différentes sur un bébé en fonction du sexe assigné à la naissance – et adoptent des comportements différents.</p>
<p>Pourtant, à bien regarder les bébés, les différences de genre sont loin d’être visibles en soi. C’est sans doute la raison pour laquelle on tient autant à habiller les filles en roses et les garçons en bleu : en dehors de ça, il n’y a pas grand chose pour faire la différence.</p>
<p>Mais les recherches montrent depuis des décennies, avec certitude, que dès la petite enfance, nos comportements d’éducateurs suivent des schémas sexistes inconscients et causent des inégalités et incapacités pour toute la vie.</p>
<p>Comme on n’a pas trouvé ailleurs de <strong>listes étoffées de ces stéréotypes de genre</strong>, voici donc une liste (incomplète) de quelque uns de ces stéréotypes. Elle est centrée principalement sur les premières années de la vie (0 - 3 ans), histoire d’y faire attention dans nos comportements.</p>
<h2 id="en-version-pdf">En version PDF</h2>
<p><em>Pour consulter ou imprimer, voici les deux fiches d’une page, au format PDF, réalisée par <a href="https://mastodon.xyz/web/@elise@esperanto.masto.host">@elise</a>.</em></p>
<figure style="text-align: center">
<a href="/images/education-egalitaire/fiche-education-egalitaire-garcons-filles.pdf">
<img src="/images/education-egalitaire/fiche-education-egalitaire-garcons-filles.jpeg" height="250px" alt="Une capture d’écran de la fiche complète." title="Cliquez pour télécharger la fiche complète au format PDF." />
<figcaption style="font-style: italic">
Une fiche complète sur les stéréotypes et biais de genre (une page).
</figcaption>
</a>
</figure>
<figure style="text-align: center">
<a href="/images/education-egalitaire/fiche-synthetique.pdf">
<img src="/images/education-egalitaire/fiche-synthetique.jpeg" height="250px" alt="Une capture d’écran de la fiche synthétique." title="Cliquez pour télécharger la fiche synthétique au format PDF." />
<figcaption style="font-style: italic">
Une autre fiche plus synthétique (une page).
</figcaption>
</a>
</figure>
<h2 id="en-version-html">En version HTML</h2>
<p><em>Pour mettre dans ses marques-pages et copier-coller, une version de la fiche complète au format HTML est disponible ci-dessous.</em></p>
<p><strong>Quand…</strong> on complimente toujours une fille sur son apparence (« jolie/mignonne ») ou ses vêtements ;<br />
<strong>Alors…</strong> on lui signifie que ces caractéristiques sont importantes, voire nécessaires pour être appréciée ;<br />
<strong>Que faire ?</strong> Il est vrai que cela correspond à une attente de notre société envers les femmes, mais essayons de varier les qualités que l’on valorise !</p>
<p><strong>Quand…</strong> On propose à une fille essentiellement des jeux relationnels et émotionnels, et à un garçon essentiellement des jeux de construction et déplacement ;<br />
<strong>Alors…</strong> On ne leur permet pas de développer leurs différentes compétences de manière équilibrée ; les garçons se trouvent amputés dans l’expression des émotions, les filles dans leur représentation de l’espace et la motricité ;<br />
<strong>Que faire ?</strong> Proposer des jeux variés et développer des compétences diverses permet à tous les enfants de se construire des personnalités plus équilibrées !</p>
<p><strong>Quand…</strong> On fait plus de câlins aux filles et on passe plus de temps avec elles à la maison ;<br />
<strong>Alors…</strong> On leur enseigne la relation et à exprimer leurs émotions ;<br />
<strong>Que faire ?</strong> Est-ce que les garçons ne méritent pas aussi cet apprentissage ? La société entière en bénéficierait !</p>
<p><strong>Quand…</strong> On assigne à un bébé fille la peur dès qu’elle exprime une émotion négative ;<br />
<strong>Alors…</strong> On lui retire la prise sur sa colère, qui est une ressource pour réagir et se défendre ; on lui prescrit un comportement anxieux face à la vie ;<br />
<strong>Que faire ?</strong> Tous les enfants peuvent apprendre à reconnaître et à vivre les émotions dans leur grande diversité, sans se laisser envahir ou écraser par elles ; apprenons-leur à reconnaître et accepter toute la palette des émotions !</p>
<p><strong>Quand…</strong> On assigne à un bébé garçon la colère dès qu’il exprime une émotion négative ;<br />
<strong>Alors…</strong> On lui interdit d’exprimer sa peur, et de vivre la tristesse ; toute émotion négative est ramenée à la colère, qui devient explosive et incontrôlable ;<br />
<strong>Que faire ?</strong> Tous les enfants peuvent apprendre à reconnaître et à vivre les émotions dans leur grande diversité, sans se laisser envahir ou écraser par elles ; apprenons-leur à reconnaître et accepter toute la palette des émotions !</p>
<p><strong>Quand…</strong> On projette un rapport plus fort entre mère et fille ou entre père et fils, par exemple en les décrivant comme très complices (« tel père, tel fils », « avec sa mère, elles n’arrêtent pas de parler ») ;<br />
<strong>Alors…</strong> On encourage chez l’enfant une sociabilité non-mixte ; chez le parent, on risque d’intensifier le phénomène d’identification, qui crée une plus grande exigence envers l’enfant du même sexe, donc une relation plus difficile par la suite ;<br />
<strong>Que faire ?</strong> Pour un enfant de l’autre genre, dans la même situation, on décrirait plutôt : « quand ils parlent de botanique, ça peut durer longtemps » ; pourquoi ne pas s’en inspirer ?</p>
<p><strong>Quand…</strong> On recourt plus souvent à la force face au refus d’un garçon dans des gestes quotidiens (changer une couche, mettre son manteau, etc) ;<br />
<strong>Alors…</strong> On lui enseigne que la contrainte physique est une manière acceptable et courante d’interagir avec les autres ;<br />
<strong>Que faire ?</strong> Voulons-nous vraiment cela ?</p>
<p><strong>Quand…</strong> On a tendance à faire parler, raconter sa journée, élaborer ses refus à une fille ;<br />
<strong>Alors…</strong> On lui apprend à verbaliser, à mieux comprendre ses émotions et ses expériences ;<br />
<strong>Que faire ?</strong> Pourquoi ne pas proposer la même chose aux garçons ?</p>
<p><strong>Quand…</strong> On réagit moins vite, voire pas du tout aux besoins exprimés par les petites filles ou on les qualifie plus facilement de « caprices » ;<br />
<strong>Alors…</strong> On leur apprend à patienter, mais aussi dans des cas plus extrêmes à négliger leurs propres besoins, ne plus se faire confiance, faire passer les autres avant elles-mêmes ;<br />
<strong>Que faire ?</strong> La patience et l’empathie, c’est bien, mais pas la soumission : il est important aussi de reconnaître ses propres besoins ; faisons place à ceux des petites filles !</p>
<p><strong>Quand…</strong> Dès la crèche, on accorde plus d’importance aux besoins des garçons ;<br />
<strong>Alors…</strong> À 18 mois, les petits garçons sont déjà plus attentifs aux demandes des autres garçons qu’à celles des filles ! ;<br />
<strong>Que faire ?</strong> Mieux vaut signifier à tous que les besoins de chacun et chacune sont aussi importants les uns que les autres !</p>
<p><strong>Quand…</strong> On interroge plus les garçons sur des questions de mathématiques et de logique… ou en général on leur accorde plus de temps en contexte scolaire ;<br />
<strong>Alors…</strong> Ils développent mieux ces compétences et osent plus prendre la parole ; c’est documenté notamment entre 4 et 7 ans, et cause un retard scolaire en sciences ;<br />
<strong>Que faire ?</strong> Proposons aussi ces activités aux filles, qui en auront tout autant besoin dans leur vie !</p>
<p><strong>Quand…</strong> On désigne les enfants par des mots qui insistent sur les catégories de genre : « les garçons ! » /« les filles » ;<br />
<strong>Alors…</strong> On renforce et on essentialise les différences fantasmées, assignées ou déjà assumées par les enfants ;<br />
<strong>Que faire ?</strong> Dire « les enfants », « les élèves », ou encore « les rapides qui ont déjà fini », ça ne mange pas de pain !</p>
<p><em>Et en bonus, suite à une discussion avec <a href="@celineb@mamot.fr">@celineb</a>, deux éléments qui ne sont pas sur les fiches :</em></p>
<p><strong>Quand…</strong> On projette du romantisme sur les relations entre entre garçons et filles, quand on dit des choses comme « C’est son amoureux ? » ou « Déjà un charmeur ! » ;<br />
<strong>Alors…</strong> Si garçons et filles ne peuvent se lier qu’à travers un prisme romantique hétérosexuel, on encourage chaque genre à joue un rôle (les garçons dragueurs et les filles coquettes et passives), et on décourage une sociabilité mixte ;<br />
<strong>Que faire ?</strong> Supposer l’amitié (plutôt que du romantisme), quel que soit le genre, permettra ensuite aux enfants de construire les formes relations qu’ils veulent !</p>
<p><strong>Quand…</strong> On propose aux petits garçons de faire la course, de jouer à la bagarre (pour gagner), et aux filles de collaborer et de prendre soin ;<br />
<strong>Alors…</strong> Valoriser la compétition chez un garçon n’est pas seulement mettre en avant ses besoins avant ceux des autres, c’est aussi lui dire que la société est fondée sur des valeurs hiérarchiques et qu’il se doit de convoiter la première place ;<br />
<strong>Que faire ?</strong> Proposons aux garçons de eux aussi collaborer (et de gagner <em>avec</em> les autres) plutôt que de toujours gagner <em>sur</em> les autres !</p>
Colocation : contribuer au loyer en fonction de ses revenus2022-04-13T07:04:20+00:00/posts/colocation-contribuer-au-loyer-en-fonction-de-ses-revenus<p>Dans notre colocation, on contribue aux loyer et aux dépenses en fonction de nos revenus. Plutôt que de payer chaque mois un loyer fixe, on met au pot en fonction de l’argent avec lequel on vit ce mois-ci.</p>
<p>Pourquoi on a eu envie de mettre ça en place ? Comment on en est arrivé à ce fonctionnement ? De quelle manière ça se passe en pratique ? Cet article raconte tout ça.</p>
<p><img src="/images/uploads/rue-de-paris.jpg" alt="Photographie d’une rue de Paris" />
<em>Mettre au pot en fonction de ses rentrées d’argent, une pratique commune à beaucoup d’habitats partagés ? Sans doute que oui.</em></p>
<h2 id="envies">Envies</h2>
<p>Au début, comme tout le monde, chaque personne dans la coloc payait le même loyer (ou presque, avec juste de légères variations en fonction de la taille de la chambre).</p>
<p>Et puis tout ça est parti d’une impression persistante qu’<strong>un euro de loyer n’a pas la même valeur pour tout le monde</strong>. Sortir 500 € quand on vit avec 650 € par mois, ce n’est pas pareil que quand on a un salaire de 1500 € qui tombe tous les mois.</p>
<p>Dans mon cas à moi, c’était aussi un moment où j’étais malheureux là où je travaillais ; mais j’hésitais à changer de boulot, et à devenir indépendant, un peu par peur d’une perte de revenus dans l’intervalle. Rien de très important – mais en regardant mieux, on s’est mis à voir autour de nous plein de situations comme ça, où des gens restent dans un travail qui les rend malheureux ou qui fait du mal au monde, pour une raison simple : la peur de ne plus pouvoir payer le loyer.</p>
<p>On voyait aussi les gens qui avaient des revenus irréguliers : certains mois, ça passe, mais c’est parfois suivi de mois de creux, où sortir toute la thune du loyer devient compliqué.</p>
<h2 id="discuter-ensemble">Discuter ensemble</h2>
<p>On a fini, un soir de février, par s’asseoir tous autour de la table de la cuisine, et par en discuter ensemble. On s’est parlé de nos expériences, déjà : de ce que ça nous fait de payer un loyer, ce que ça peut freiner ou rendre difficile, et commencer à imaginer comment ça pourrait être autrement.</p>
<p><strong>Est-ce que c’est une bonne idée d’avoir des loyers variables ?</strong> On pourrait faire ça en fonction de la situation matérielle des gens (boulot, chômage, travail précaire). Et si on se retrouvait chaque mois et qu’on discutait de combien on met chacun·e ? Ou alors est-ce qu’on ferait une formule fixe ? Mais est-ce que ça varierait chaque mois ou pas ?</p>
<p>La discussion a fait émerger plein de sujets intéressants. Par exemple, que <strong>la question du logement est anxiogène pour pas mal de gens</strong>. Payer un loyer fixe, même élevé, c’est quelque part l’assurance d’avoir un toit – et passer à des loyers variables envoie un peu d’incertitude là dessus.</p>
<p>On s’est aussi rendu compte en discutant que quelque part, <strong>en habitant tous ensemble, il est parfois plus facile de donner que de prendre</strong>. Les gens dont la situation actuelle fait qu’iels contribueraient moins ne se sentaient pas toujours à l’aise avec ça. On s’est demandé comment faire émerger un sentiment de justice là dessus, qui fasse que tout le monde ait l’impression de participer à un système juste, même aux moments de moindre contribution.</p>
<p>Quelques discussions aussi autour de « qu’est-ce qu’un revenu ? » Si on module le loyer en fonction de ce avec quoi les gens vivent, comment est-ce qu’on le définit ? Est-ce que les allocations chômage rentrent dedans ? Les aides au transport ? Les étrennes de la grand-mère ?</p>
<p>Et de l’autre côté, qu’est-ce qui rentre dans le loyer ? Le loyer général de l’appart, évidemment. Mais les charges, l’internet, les assurances s’il y en a : qu’est-ce que qu’on veut aussi faire rentrer dans un budget commun ?</p>
<p>En commençant à explorer des modes de répartition, on s’est aussi rendu compte de <strong>notre inégalité face aux chiffres</strong>. Si certain·es d’entre nous voyaient immédiatement les enjeux et les impacts d’une formule simple pour calculer les revenus, c’était beaucoup moins immédiat pour beaucoup d’autres. Pourtant, pour que tout le monde ait le sentiment d’un système juste, il fallait que le mode de répartition soit vraiment compréhensible intuitivement par tout le monde.</p>
<h2 id="explorer-les-effets">Explorer les effets</h2>
<p>Assez vite, il est donc apparu que, plutôt que de décider chaque mois de combien on met au pot, <strong>on préférait une formule de répartition fixe</strong>. Ça donne un sentiment de stabilité et d’absence de surprise qui semblait convenir à tout le monde.</p>
<p>Mais quelle formule, et selon quels critères ? Et surtout, comment rendre les différents enjeux de différentes formules vraiment accessibles à tout le monde ?</p>
<p>On a commencé par dessiner des grands graphiques, et à disséquer des formules possibles – mais au final l’un d’entre nous a proposé de faire des <strong>simulateurs interactifs de répartition</strong>.</p>
<p>Ça ressemblait par exemple à ça :</p>
<p><a href="https://pmorinerie.gitlab.io/coloc-loyers-solidaires/"><img src="/images/uploads/simulateur-de-loyers.gif" alt="Une capture d'écran du simulateur interactif d'une des formules." title="En déplaçant les chiffres de la formule, le résultat est mis à jour immédiatement." /></a>
<em>Un des simulateurs qu’on a mis en place (<a href="https://pmorinerie.gitlab.io/coloc-loyers-solidaires/">voir la version interactive</a>).</em></p>
<p>L’idée, c’est que si on peut changer les paramètres d’une formule, et voir le résultat en temps réel, hébin ça aide beaucoup à comprendre comment la formule fonctionne, et quel effet elle pourrait avoir sur soi. Et puis ça aide aussi à voir combien il faudrait que chacun·e mette pour équilibrer le budget ; ou encore à simuler rapidement ce qui se passe si quelqu’un·e n’a pas de revenus pendant quelques mois.</p>
<p>Pour évaluer les différents moyens de répartir un loyer, on a créé plusieurs simulateurs de ce que ça donnerait. Par exemple, un des simulateurs explorait un loyer qui soit exactement un pourcentage des revenus. Un autre représentait la situation avec une part fixe de loyer, et une part variable. Et encore un autre l’idée d’un revenu de base assuré par la coloc (versé quand on n’a vraiment rien pour vivre ce mois-ci).</p>
<h2 id="fonctionnement-actuel">Fonctionnement actuel</h2>
<p>Au final, le fonctionnement actuel utilise un <strong>revenu de base</strong>. Concrètement, chaque début de mois :</p>
<ul>
<li>On reçoit 100 € de la coloc,</li>
<li>On verse 35% de son revenu à la coloc.</li>
</ul>
<p>Ça veut dire que <strong>les gros revenus contribuent plus que les petits</strong> (ce qui est l’effet désiré). Mais surtout, si un mois vous êtes court·e pour le loyer, ou complètement à sec, non seulement vous ne payez pas (ou peu) de loyer, mais en plus <strong>la coloc vous verse de l’argent</strong>. Histoire d’assurer le minimum.</p>
<p><em>(On a préféré ça à un système progressif par tranches, parce que ça permet que les mois se compensent entre eux. Par exemple si on attend des allocs qui ne viennent pas, et qu’un mois on est à zéro, mais qu’on reçoit le double le mois suivant, pas de souci : ça fait pile comme si on avait contribué les deux mois.)</em></p>
<p>Avec ces sous, on paye le loyer de la partie de la coloc qu’on loue – mais aussi les charges (eau, électricité, internet), les assurances habitation, et les achats ponctuels de matériel pour la coloc. (En revanche, pour la lessive et le papier-toilette, chacun continue à se débrouiller.)</p>
<p>Au final, ce moyen de répartition permet d’être prévisible. Même si le loyer est variable chaque mois, la formule de calcul est fixe : pas besoin de discuter de la répartition des contributions chaque mois. En revanche, quand la situation à long-terme des habitant·es change (par exemple une nouvelle personne dans la coloc’, un changement de revenus, ou une fin de droits au chômage), là on se pose à nouveau autour d’une table avec le simulateur pour ré-équilibrer le budget, en mettant à jour la formule.</p>
<h2 id="en-pratique">En pratique</h2>
<p>Concrètement, chaque mois on doit verser nos contributions. Pour cela, on a essayé de simplifier les choses au maximum.</p>
<ol>
<li><strong>On estime avec combien on vit ce mois-ci.</strong> Salaire, chômage, allocations, économies perso… On ne flique pas les gens, c’est autogéré.</li>
<li><strong>On indique ses revenus dans un tableur partagé</strong>. La contribution à verser est automatiquement calculée en fonction de la formule en cours.</li>
<li><strong>On fait un virement sur le compte de la coloc</strong> si on doit verser des sous – ou un virement du compte vers soi si on récupère des sous ce mois-ci.</li>
</ol>
<p>Le tableur du budget a deux intérêts :</p>
<ul>
<li>Il calcule automatiquement la contribution de chaque mois en fonction de la formule,</li>
<li>Il permet de suivre l’état du budget.</li>
</ul>
<p><strong>Tout le monde peut voir l’état des finances</strong> à n’importe quel moment. Ça nous a semblé important pour l’auto-gestion que la responsabilité d’équilibrer les finances soit partagée par tout le monde – et que l’info soit donc visible et compréhensible facilement.</p>
<p><a href="/images/uploads/tableur-budget-coloc.png"><img src="/images/uploads/tableur-budget-coloc.png" alt="Une capture d'écran du tableur utilisé pour l'autogestion du budget" title="Les courbes sont mises à jour automatiquement chaque mois." /></a>
<em>Notre tableur partagé des finances. On l’utilise pour calculer nos contributions, et suivre l’état de la trésorerie. <a href="https://www.icloud.com/numbers/0k6LqmyCW_Qjq_HUOcgfzt6RA#Budget_coloc">Consulter ou copier le tableur d’exemple</a></em></p>
<h2 id="où-ça-en-est-aujourdhui">Où ça en est aujourd’hui</h2>
<p>Après quelques années d’utilisation de ce système, on a l’impression qu’il y a des choses qui fonctionnent particulièrement bien :</p>
<ul>
<li>Ça permet effectivement une plus grande justice dans la contribution au loyer 🙌</li>
<li>Quand une nouvelle personne entre dans la coloc, les discussions pour mettre à jour la formule se passent bien et rapidement. Le simulateur aide beaucoup pour ça.</li>
<li>Les gens sont à l’aise avec l’idée de contribuer plus que les autres ou moins que les autres (même si ne pas contribuer du tout reste parfois difficile).</li>
<li>On a pu gérer les cas particuliers sans problème (colocs présent·es seulement une semaine sur deux, par exemple). Dans ce cas on s’est généralement mis d’accord pour ajuster les choses – par exemple pour que la personne déduise N € de ses revenus mensuels, ce qui ajuste automatiquement la contribution sans changer la formule générale.</li>
</ul>
<p>Et puis évidemment il y a parfois des points de friction :</p>
<ul>
<li>La colocation a eu un léger déficit chronique, qu’on a dû combler par de la trésorerie externe. Ça va mieux depuis qu’on prévoit une formule qui met <em>un peu plus</em> que juste ce qu’il faut chaque mois pour atteindre l’équilibre.</li>
<li>Le loyer de certaines personnes dans la coloc est payé par d’autres gens (typiquement leurs parents). Dans ce cas, sur quels revenus on se base ?</li>
</ul>
<p>Mais tout ça se discute bien collectivement.</p>
<p>En tout cas l’expérience est vraiment positive. Ca fait du bien de sentir qu’on tend vers plus de justice (même à toute petite échelle), les discussions pour mettre en place les règles se passent bien, les contributions arrivent en temps voulu. A priori on va continuer comme ça pendant un bon moment !</p>
<p>Normalement ce fonctionnement et les outils qui vont avec sont assez réutilisable. Si vous envisagez de monter le même système dans une coloc’ ou un habitat partagé à vous, n’hésitez pas à vous en servir.</p>
<h2 id="ressources">Ressources</h2>
<ul>
<li>Le simulateur de contributions au loyer :<br />
<a href="https://pmorinerie.gitlab.io/coloc-loyers-solidaires/">https://pmorinerie.gitlab.io/coloc-loyers-solidaires/</a></li>
<li>Un exemple de feuille de calcul du budget :<br />
<a href="https://www.icloud.com/numbers/0k6LqmyCW_Qjq_HUOcgfzt6RA#Budget_coloc">https://www.icloud.com/numbers/0k6LqmyCW_Qjq_HUOcgfzt6RA</a></li>
</ul>
Utiliser Signal sans smartphone2021-04-26T18:12:19+00:00/posts/signal-sans-smartphone<p>Si vous utilisez la messagerie Signal, vous savez sans doute qu’il est possible d’envoyer et de recevoir des messages sur Signal depuis votre ordinateur, en utilisant l’application officielle.</p>
<p>Mais sur ordinateur, il n’est pas encore possible de <em>créer</em> un compte Signal : on ne peut officiellement que relier un compte qui existe déjà sur un smartphone.</p>
<p>J’ai cherché un peu, et en fait il existe un moyen d’utiliser Signal sans smartphone. On peut utiliser un outil en ligne de commande pour créer un compte sans installer l’application mobile, et ensuite y relier l’application Signal pour ordinateur.</p>
<p>J’ai testé ça l’autre jour, et ça a bien fonctionné. La création du compte, est un peu technique ; mais après plus besoin d’y toucher : une fois que l’appli Signal est connectée sur l’ordinateur, elle fonctionne normalement, sans commandes particulières.</p>
<p><img src="/images/uploads/signal-desktop.png" alt="Une capture d'écran de l'application Signal pour ordinateur." title="L'application Signal pour ordinateur a moins de fonctionnalités que la version mobile, mais l'essentiel est là." /></p>
<h2 id="mode-demploi">Mode d’emploi</h2>
<p>Pour ma part j’ai suivi ces instruction :</p>
<ol>
<li>
<p><strong>Installez l’utilitaire <a href="https://github.com/AsamK/signal-cli"><code class="language-plaintext highlighter-rouge">signal-cli</code></a></strong>, qui permet de créer un compte Signal sans smartphone.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c"># Sous mac</span>
brew <span class="nb">install </span>signal-cli
<span class="c"># Sous Linux, suivre les instruction ici :</span>
<span class="c"># https://github.com/AsamK/signal-cli/wiki/Quickstart</span>
</code></pre></div> </div>
</li>
<li>
<p><strong>Demandez la création du compte</strong>, en remplaçant <code class="language-plaintext highlighter-rouge">+33600000000</code> par votre propre numéro de téléphone :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>signal-cli -u +33600000000 register
</code></pre></div> </div>
<p>(Au besoin, ajoutez l’option <code class="language-plaintext highlighter-rouge">--voice</code> à la fin de la ligne pour avoir un appel vocal à la place ; par exemple si vous utilisez une ligne fixe.)</p>
</li>
<li>
<p>(optionnel) <strong>Si vous voyez un message <em>“Captcha invalid or required for verification”</em></strong> :</p>
<ul>
<li>Ouvrez la page <a href="https://signalcaptchas.org/registration/generate.html">https://signalcaptchas.org/registration/generate.html</a>,</li>
<li>Résolvez le test demandé ; une page blanche apparaît,</li>
<li>Ouvrez la Console du navigateur web, et cherchez un message parlant de <code class="language-plaintext highlighter-rouge">signalcaptcha://<plein de chiffres et de lettres></code>,</li>
<li>Copiez tous les chiffres et les lettres juste après <code class="language-plaintext highlighter-rouge">signalcaptcha://</code>,</li>
<li>
<p>Demandez à nouveau la création du compte, mais cette fois-ci en rajoutant le captcha que vous venez de copier :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>signal-cli -u +33600000000 register --captcha 'les chiffres et lettres que vous avez copié'
</code></pre></div> </div>
</li>
</ul>
</li>
<li>
<p><strong>Vérifiez le compte</strong>. Vous allez recevoir un SMS avec un code de vérification. Notez-le (avec ou sans le tiret, ça n’a pas d’importance), puis entrez cette commande :</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>signal-cli -u +33600000000 verify 000000
</code></pre></div> </div>
<p>(en remplaçant <code class="language-plaintext highlighter-rouge">000000</code> par votre code de vérification).</p>
</li>
<li>
<p><strong>Créez un profil Signal</strong>. Cela vous permettra de rejoindre les groupes de discussion.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>signal-cli -u +33600000000 updateProfile --name 'Votre nom ou pseudo'
</code></pre></div> </div>
</li>
<li><strong>Téléchargez <a href="https://signal.org/fr/download/">l’appli Signal pour votre ordinateur</a></strong>, et ouvrez-la.</li>
<li>L’application va vous demander de <strong>scanner un QR-code</strong>. Prenez une capture d’écran du code, et envoyez-le sur <a href="https://zxing.org">https://zxing.org</a> (par exemple) pour le décoder. Cela vous donnera un texte qui commence par <code class="language-plaintext highlighter-rouge">sgnl://</code> ; copiez-le.</li>
<li>
<p><strong>Associez l’appli pour ordinateur</strong> à votre compte Signal, en collant le texte décodé depuis le QR-code.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>signal-cli -u +33600000000 addDevice --uri "sgnl:/…"
</code></pre></div> </div>
<p>(N’oubliez pas les guillemets autour du lien.)</p>
</li>
</ol>
<p>Pour moi c’était suffisant : l’appli Signal sur mon ordinateur s’est automatiquement connectée au bout de quelques instants, et m’a permis d’envoyer et de recevoir des messages.</p>
<p>ℹ️ <strong>Pensez à lancer l’appli Signal régulièrement</strong> (ou à la garder ouverte) : au bout de 30 jours sans lancement, l’application sera déconnectée du compte, et ne ne recevra plus les nouveaux messages. Si cela arrive, il parait qu’il faut refaire la procédure avec le QR-code de l’application (l’étape 7).</p>
<h2 id="résumé">Résumé</h2>
<p>Si vous cherchez juste les instructions à taper rapidement, voici un résumé des commandes expliquées plus haut :</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Remplacez par votre n° de téléphone</span>
<span class="nv">PHONE</span><span class="o">=</span><span class="s1">'+33600000000'</span>
<span class="c"># Mac</span>
brew <span class="nb">install </span>signal-cli
<span class="c"># Linux</span>
<span class="c"># Voir https://github.com/AsamK/signal-cli/wiki/Quickstart</span>
<span class="c"># Allez sur https://signalcaptchas.org/registration/generate.html pour récupérer un captcha</span>
signal-cli <span class="nt">-u</span> <span class="nv">$PHONE</span> register <span class="nt">--captcha</span> <les lettres et chiffres après signalcaptcha://>
signal-cli <span class="nt">-u</span> <span class="nv">$PHONE</span> verify <code reçu par SMS>
signal-cli <span class="nt">-u</span> <span class="nv">$PHONE</span> updateProfile <span class="nt">--name</span> <votre nom>
signal-cli <span class="nt">-u</span> <span class="nv">$PHONE</span> addDevice <span class="nt">--uri</span> <span class="s2">"<lien sgnl:/ dans le qr-code de l’appli pour ordinateur>"</span>
</code></pre></div></div>
<p><em>Signal évolue régulièrement : si vous voyez une rectification à apporter à ces instructions, <a href="https://mastodon.xyz/@pmorinerie">envoyez-moi un message sur Mastodon</a>.</em></p>
Préparer du Yogi Tea maison2021-02-19T22:11:02+00:00/posts/yogi-tea-maison<p>Le Yogi Tea à la cannelle et aux épices, c’est bien bon. Pour en faire une version maison, je mélange (pour 4 tasses) :</p>
<ul>
<li>Quelques copeaux ou bâtons de cannelle,</li>
<li>Un cm3 de gingembre frais coupé en petits morceaux,</li>
<li>Trois gousses cardamone fendues,</li>
<li>Deux clous de girofle,</li>
<li>Un peu de poivre.</li>
</ul>
<p>Faire bouillir le tout pendant 20mn - 1/2h fera un excellent thé de cannelle.</p>
<h2 id="variante-rapide-et-économique">Variante rapide et économique</h2>
<p>Si on manque de temps, ou qu’on préfère utiliser des ingrédients plus simples, on peut utiliser des ingrédients en poudre. Pour cela, je mélange (pour une tasse) :</p>
<ul>
<li>Deux cuillères à café de cannelle en poudre,</li>
<li>Une cuillère à café de gingembre en poudre,</li>
<li>Une pincée de cardamome en poudre,</li>
<li>Un clou de girofle,</li>
<li>Un peu de poivre.</li>
</ul>
Link's Awakening Disassembly Progress Report part 122021-01-11T10:00:00+00:00/posts/links-awakening-disassembly-progress-report-part-12<p><em>This article is part of an ongoing “<a href="https://zladx.github.io/archives">Disassembling Link’s Awakening</a>” series, where I attempt to gain some understanding on how special effects were implemented in this game.</em></p>
<h2 id="-new-contributors">✨ New contributors</h2>
<p>First let’s congratulate the following new contributors, who made their first commit to the project during the past months:</p>
<ul>
<li><a href="https://github.com/callstack28/">@callstack28</a> fixed several typos in the <a href="https://github.com/zladx/LADX-Disassembly/pull/316/files">Super Game Boy comments</a> and the <a href="https://github.com/zladx/LADX-Disassembly/pull/317">variable definitions</a>.</li>
<li><a href="https://github.com/PileOfJunkMail/">@PileOfJunkMail</a> documented functions used to <a href="https://github.com/zladx/LADX-Disassembly/pull/256">play audio jingles</a>. Among many other improvements, they also replaced many hardcoded numbers by <a href="https://github.com/zladx/LADX-Disassembly/pull/256">proper</a> <a href="https://github.com/zladx/LADX-Disassembly/pull/243">constants</a> (which makes the code much easier to read), and documented the code executed at the <a href="https://github.com/zladx/LADX-Disassembly/pull/239">beginning of a fight</a> against a boss.</li>
<li><a href="https://github.com/stephaneseng">@stephaneseng</a> fixed the variable indicating wether Link is <a href="https://github.com/zladx/LADX-Disassembly/pull/275">touching the ground</a> or not.</li>
<li><a href="https://github.com/ariahiro">@ariahiro</a> fixed the palette of the <a href="https://github.com/zladx/LADX-Disassembly/pull/260">character sprites</a>, which were wrongly displayed as negative colors when displayed using a PNG editor.</li>
<li><a href="https://github.com/martendo7">@martendo7</a> added <a href="https://github.com/zladx/LADX-Disassembly/pull/270">assertions to the audio opcodes</a>, to detect invalid audio code at compile-time.</li>
<li><a href="https://github.com/zelosos">@zelosos</a> submitted more than 30 pull requests, touching many aspects of the code. Notably he labeled many health-related functions, made all the variables in HRAM <a href="https://github.com/zladx/LADX-Disassembly/pull/302">fully documented and shiftable</a>, fixed <a href="https://github.com/zladx/LADX-Disassembly/pull/290">deprecation warnings</a>, and re-formatted the definition of <a href="https://github.com/zladx/LADX-Disassembly/pull/294">every single</a> RAM variable to be clearer and more consistent.</li>
</ul>
<h2 id="-building-revisions">🔀 Building revisions</h2>
<p>For a long time, this project only disassembled the source code for a single version of the game: the US v1.0 release.</p>
<p>A few months ago, Marijn van der Werf started to add support for the German version of the game.</p>
<p>Not an easy task. Not only the dialogs differ from the US version, of course – but there are quite some more differences: a few tilemaps (like the translated Game Over screen), some tiles (e.g. extra alphabet letters), a handful of regional differences…</p>
<p>But in the end, after carefully finding all the differences in the game resources and code, and storing the differences with the baseline English version into <a href="https://github.com/zladx/LADX-Disassembly/tree/master/revisions/G0/src">German-specific files</a>, Marijn managed to add German support to the disassembly.</p>
<p><span class="pixel-art">
<img alt="Zelda: Link's Awakening File Selection menu in German" width="320" src="/images/zelda-links-awakening-progress-report-12/file-menu-german.png" />
</span><br />
<em>The File Selection menu in all its German glory.</em></p>
<p>But Marijn didn’t stop there.</p>
<p>While he was at it, he casually added support for <strong>every version of the game ever released</strong>.</p>
<p>In all languages.</p>
<p>Japanese v1.0? Got it. French v1.2? Here you go. English v1.1? There it is.</p>
<p><span class="pixel-art">
<img alt="Zelda: Link's Awakening File Selection menu in Japanese" src="/images/zelda-links-awakening-progress-report-12/file-menu-japanese.png" />
<img alt="Zelda: Link's Awakening File Selection menu in French" src="/images/zelda-links-awakening-progress-report-12/file-menu-french.png" />
</span><br />
<em>It is now easy to study the Japanese or French games: they will be compiled along the other versions.</em></p>
<p>These versions all have many small differences between them. Some places were improved, some bugs were patched. Supporting all these versions meant identifying each of those small changes.</p>
<p><span class="pixel-art">
<img alt="Zelda: Link's Awakening Title screen in Japanese" src="/images/zelda-links-awakening-progress-report-12/title-screen-japanese.png" />
<img alt="Zelda: Link's Awakening Title screen menu in English" src="/images/zelda-links-awakening-progress-report-12/title-screen-english.png" />
</span><br />
<em>Some changes are obvious, like the Title screen between languages.<br />
But other patches are much more subtle.</em></p>
<p>Moreover, the version are not linear: some patches applied to the Japanese 1.1 and 1.2 versions are not present in other languages’ 1.1 and 1.2 releases.</p>
<p>Fortunately, <a href="https://github.com/Xkeeper0">Xkeeper</a> took some time to research and document these patches: when they were written, what they do. The resulting matrix accurately the complexity of the actual revisions:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>| - | JP 1.0 | JP 1.1 | JP 1.2 | US 1.0 | US 1.1 | US 1.2 | FR 1.0 | FR 1.1 | DE 1.0 | DE 1.1 |
|:-------------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|:------:|
| `__PATCH_0__` | | Yes | Yes | | Yes | Yes | Yes | Yes | Yes | Yes |
| `__PATCH_1__` | | | | | | | Yes | Yes | Yes | Yes |
| `__PATCH_2__` | | Yes | Yes | | | Yes | Yes | Yes | Yes | Yes |
| `__PATCH_3__` | | Yes | Yes | | Yes | Yes | | | | |
| `__PATCH_4__` | | | Yes | | | Yes | | Yes | | Yes |
| `__PATCH_5__` | | | | | | | | | Yes | Yes |
| `__PATCH_6__` | Yes | Yes | Yes | | | | | | | |
| `__PATCH_7__` | | | | | | | Yes | Yes | | |
| `__PATCH_8__` | | Yes | Yes | | | | | | | |
| `__PATCH_9__` | Yes | Yes | Yes | | | | | | Yes | Yes |
| `__PATCH_A__` | 1 | 1 | 1 | | | | | | 2 | 2 |
| `__PATCH_B__` | 1 | 1 | 1 | | | | 2 | 2 | 1 | 1 |
| `__PATCH_C__` | | | | Yes | Yes | Yes | | | | |
</code></pre></div></div>
<p><em>Read the <a href="https://github.com/zladx/LADX-Disassembly/blob/master/src/x_notes.md">full patches notes</a> to get a idea of what each patch does.</em></p>
<p>Also, people at The Cutting Room Floor have been documenting the <a href="https://tcrf.net/The_Legend_of_Zelda:_Link%27s_Awakening/Version_Differences">version differences</a> for many years now. So now it’s all a matter of matching the differences in the code to the observable behavior changes.</p>
<p>With this massive work, the ZLADX disassembly can now build ten different revisions of the game, with exact byte-for-byte compatibility.</p>
<h2 id="-fixing-the-spritesheets">🧩 Fixing the spritesheets</h2>
<p>Sprites modding has been a feature of the ZLADX modding community for a long time. Popular randomizers like <a href="https://crystalsaver.github.io/Z4RandomizerBeta2/">Z4R</a> or <a href="https://daid.github.io/LADXR/">LADXR</a> allow you to customize the characters visuals by replacing the spritesheets.</p>
<p>However, until now, the spritesheets in the disassembly were not easy to edit. Actually, they were in a sorry state.</p>
<p>Well, that’s not all bad: spritesheets were stored as PNG files, which makes them easy to view, and automatically converted to the Game Boy <a href="https://www.huderlem.com/demos/gameboy2bpp.html">2bpp format</a> at compile-time. But many things were confusing in those PNG files. Here’s for instance how the first Link’s sprites appeared in the disassembly:</p>
<p><span class="pixel-art">
<img alt="A sample spritesheet, with anything hardly recognizable" width="256" src="/images/zelda-links-awakening-progress-report-12/link_2.png" />
</span><br />
<em>This raw dump of the sprites to a PNG file is not very clear.</em></p>
<p>It hard to see anything. That’s because this is a raw conversion of the in-ROM 2bpp tiles format to a PNG file. No other conversion is made, which causes the picture to be hard to read.</p>
<p>There are two things missing here.</p>
<p>First, the colors are wrong. Or, more precisely, the grayscale is wrong. When running on a Game Boy Color, the colors are applied at runtime, by matching each tile with a separately-defined color palette. So even on the Game Boy Color, graphics remain stored as grayscale, with 4 possible gray values.</p>
<p>But on the picture above, what should be rendered as the blackest gray value is instead rendered as white. And other grays are wrong to.</p>
<p>Contributor <a href="https://github.com/AriaHiro64">@AriaHiro64</a> found a fix for this: by tweaking the PNG file to <a href="https://github.com/zladx/LADX-Disassembly/pull/260">reorder the indexed colors table</a>, they were able to fix the grayscale values – while still retaining compatibility with the tool that transform these PNG files into 2bpp files at compile-time.</p>
<p><span class="pixel-art">
<img alt="The same spritesheet with inverted colors, which makes things slightly easier to see" width="256" src="/images/zelda-links-awakening-progress-report-12/link_2 indexed.png" />
</span>
<br />
<em>Proper color indexation already makes it more legible.<br />
Still looks like a puzzle though.</em></p>
<p>Now it’s easier to see the other missing element: the tiles are not ordered in the most natural way.</p>
<p>This is because on the Game Boy, sprites can be either a single tile (8×8 px) or two tiles (8×16 px). And on Link’s Awakening, most characters made of sprites are at least 16×16 px – that is, each character is composed of two 8×16 sprites stitched together vertically.</p>
<p>So tiles for sprites often differ from tiles used to store background maps. Tiles for background maps are usually stored horizontally, from left to right, as:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1️⃣2️⃣
3️⃣4️⃣
</code></pre></div></div>
<p>So the conversion of background map tiles from 2bpp tilesheets to PNG is straightforward.</p>
<p>But tiles for sprites are usually stored vertically, from top to bottom, as:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1️⃣3️⃣
2️⃣4️⃣
</code></pre></div></div>
<p>So naïvely converting a spritesheet to a PNG file yields tiles ordered as 1️⃣ 3️⃣ 2️⃣ 4️⃣, which will look wrong, exactly like on the picture above.</p>
<p>To solve this, we have to go through a process named <em>interleaving</em>: when extracting the original tiles to a PNG file, we fix the tiles ordering by <em>de-interleaving</em> them. The resulting PNG file then has the tiles in the proper order.</p>
<p>And at compile-time, when transforming the PNG files to to the native 2bpp format, the same Python script <em>interleaves</em> the tiles, back to the original representation.</p>
<p><span class="pixel-art">
<img alt="The same spritesheet inverted *and* interleaved, which makes all sprites appear clearly" width="128" src="/images/zelda-links-awakening-progress-report-12/link_2 interleaved.png" />
</span><br />
<em>When properly de-interleaved, Link’s sprites appear in their full glory.</em></p>
<p>To make this process easier to automate, a simple Make rule specifies that all PNG files prefixed with <code class="language-plaintext highlighter-rouge">oam_</code> are automatically inverted and interleaved at compile-time.</p>
<p>So thanks to these conversion steps, now <a href="https://github.com/zladx/LADX-Disassembly/tree/master/src/gfx/characters">all spritesheets of the game</a> can be easily browsed and edited. Have a look!</p>
<h2 id="-decoding-the-tilemaps">🏞 Decoding the tilemaps</h2>
<p>A few months ago, in the disassembly source code, background tilemaps were all stored sequentially in a <a href="https://github.com/zladx/LADX-Disassembly/blob/c86c1f6992dc067fbce89dd36c5b2bef0d08741a/src/data/backgrounds/background_tile_commands.asm">single ASM file</a>.</p>
<p>This was suboptimal for many reasons:</p>
<ol>
<li>The tilemaps were not named, which made identifying a tilemap difficult;</li>
<li>The ASM file format could not be imported into a tilemap editor;</li>
<li>The tilemaps are stored encoded, and it was difficult to write a tool to decode a single tilemap to a format readable by a tilemap editor.</li>
</ol>
<p>But since June, the situation greatly improved. First, Daid wrote a tool to parse the data format used by the tilemaps, and decode the data as readable instructions.</p>
<p>Then another PR identified and named the tilemaps. And last, all tilemaps are now exported them as individual binary files. So you can simply browse the tilemaps, and <code class="language-plaintext highlighter-rouge">peach.tilemap.encoded</code> will contain the data you expect.</p>
<p>Having separate files also makes easier to compare the differences between the successive revisions of the game. Before, all tilemaps were stored for each revision. But now only the tilemaps that actually differ from revision to revision are stored (usually mostly the file menus, because they include text that had to be localized).</p>
<p><img src="/images/zelda-links-awakening-progress-report-12/tilemap-studio.png" alt="A screenshot of Tilemap Studio editing a decoded Link's Awakening tilemap" /><br />
<em>Tilemaps can now be edited graphically using standard tools, like Tilemap Studio.</em></p>
<h3 id="why-storing-the-tilemaps-encoded">Why storing the tilemaps encoded?</h3>
<p>Ideally, the tilemaps would be stored in a decoded, easily manipulable format (that is, as a raw sequence of tile identifiers). And at compile-time, they would be re-encoded into the format expected by the game engine.</p>
<p>But unfortunately, when developing the original game, the encoded tilemaps were not machine-generated from decoded files. Instead they were hand-written by the original developers. So if we used an automated tool to encode the tilemaps, we wouldn’t get exactly the same result than the hand-written encoding: it would be functionally similar, and produce the same tilemaps, but the exact bytes wouldn’t be the same. Which means we would no longer have a byte-for-byte identical ROM.</p>
<p>Instead, the files are stored in the original encoded format. And to made them easier to edit, the disassembly now includes a command-line tool to <a href="https://github.com/zladx/LADX-Disassembly/blob/master/tools/convert_background.py">decode the tilemaps</a> to the raw binary format suitable for import into tilemap editors.</p>
<h2 id="initializing-the-fishing-minigame">Initializing the fishing minigame</h2>
<p>On a smaller note, Daid documented the <a href="https://github.com/zladx/LADX-Disassembly/pull/328">initialization values used by the fishing minigame</a>.</p>
<p>Did you ever want to build a custom version of the game with only the bigger fishes? Now is your chance!</p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-progress-report-12/modded-fishing-game.png" alt="Link's Awakening modded fishing game, with only the bigger fishes" />
</span><br />
<em>Wow, fishes in this pond sure must be well-fed…</em></p>
<h2 id="whats-next">What’s next?</h2>
<p>Of course many more improvements were done in the past months, much more than what is presented there.</p>
<p>And as for next steps, although the tilemap <em>values</em> are now decoded, the tilemap <em>attributes</em> are not. As the attributes associate a tile to a color palette, that means editing the tilemap colors is still harder than it should be. Fortunately, the tilemap attributes are stored in the same format than the tilemap values, so writing a tool to decode them should be straightforward.</p>
<p>Also the <a href="https://github.com/zladx/LADX-Disassembly/wiki/Game-engine-documentation">high-level engine documentation</a> is still evolving. It started as an incomplete description of the various systems of Link’s Awakening game engine, but is becoming more and more fleshed out. Many topics are still waiting to be explained though.</p>
<p><em>Want to read more? Read the <a href="https://zladx.github.io/archives">other articles</a> of this series,
discover <a href="https://github.com/zladx/LADX-Disassembly">more of Link’s Awakening code</a>, or <a href="https://discord.gg/sSHrwdB">join the discussion on Discord</a>.</em></p>
Achieving partial translucency on the Game Boy Color2020-12-23T18:23:00+00:00/posts/links-awakening-partial-translucency<p><em>This article is part of an ongoing “<a href="https://zladx.github.io/archives">Disassembling Link’s Awakening</a>” series, where I attempt to gain some understanding on how special effects were implemented in this game.</em></p>
<p>Neither the original Game Boy or the upgraded Game Boy Color had hardware support for partial translucency. This was always achieved with various hacks and workaround.</p>
<p>Let’s have a look at two of the most elaborated examples of these techniques, as showcased on the Title screen and End credits of Zelda Link’s Awakening.</p>
<h2 id="progressive-fade-in-on-the-title-screen">Progressive fade-in on the title screen</h2>
<p>On the title screen, after the main title appears, the “DX” logo appears with a nice, smooth fade.</p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-partial-translucency/title-screen.gif" alt="Link's Awakening Title screen" />
</span></p>
<p>But wait, the GBC doesn’t have variable opacity values. A sprite pixel can be fully transparent, or fully opaque – but there’s no “fade opacity from 0 to 1”.</p>
<p>So how is this gradual fading effect done?</p>
<p>The trick is that, instead of updating the opacity, the game updates the palette of the “DX” logo. Each frame, the “DX” palette is changed to go gradually from the sky shade to the logo shade. Nice.</p>
<p><img src="/images/zelda-links-awakening-partial-translucency/title-dx-palettes.gif" alt="title-dx-palettes" /><br />
<em>The palettes of the “DX” sprite during the fade-in</em></p>
<p>But wait! That shouldn’t work. The “DX” logo doesn’t sit over a flat-colored surface: it overlaps both the sky and the clouds. So how could changing the palette affect both the “sky → logo” and “clouds → logo” color progression?</p>
<p>Indeed, that’s an issue. And to solve it, the “DX” logo is split into two parts: one set of sprites for the part overlapping the sky, and one set for the part overlapping the clouds. Each part has its own palette, with its own gradual progression.</p>
<p><img src="/images/zelda-links-awakening-partial-translucency/title-sky.png" alt="title-sky" /><br />
<em>First set of sprites</em></p>
<p><img src="/images/zelda-links-awakening-partial-translucency/title-clouds.png" alt="title-clouds" /><br />
<em>Second set of sprites</em></p>
<p>Overall, a lot of effort for a small effect, that looks really easy to perform on modern hardware nowadays. But on the GBC, it actually required a good lot of tricks.</p>
<h2 id="secret-ending-fading-marin-in-and-out">Secret ending: fading Marin in and out</h2>
<p>When beating the game without dying once, a portrait of Marin is displayed after the end credits.</p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-partial-translucency/marin-ending.gif" alt="marin-ending" />
</span></p>
<p>We can see the same kind of transparency effects than on the Title screen:</p>
<ol>
<li>Marin’s face fades in, and displays many colors.</li>
<li>Marin’s face remains half-translucent for a while</li>
<li>A seagull fades in</li>
<li>Marin’s face fades out</li>
</ol>
<p>That’s a lot to unpack here. Each of these effects is not easily doable using the GBC hardware.</p>
<h3 id="1-marins-fades-in">1. Marin’s fades in</h3>
<p>The fade-in uses the same palette-update trick than the “DX” logo on the title screen: the sprite palettes are updated every few frames, and move from blue to the actual portrait colors.</p>
<p><img src="/images/zelda-links-awakening-partial-translucency/marin-ending-palettes.gif" alt="marin-ending-palettes" /></p>
<p>However, notice that the portrait is quite colorful. Some 8x8 areas even display up to 6 different colors at the same time, like Marin’s medallion:</p>
<p><span class="pixel-art">
<img width="64" src="/images/zelda-links-awakening-partial-translucency/marin-medallion.png" />
</span><br />
<em>There are more colors on this single tile than the Game Boy Color usually allows.</em></p>
<p>A standard sprite can only display 4 colors on the GBC (that is, 3 actual colors + a transparent one). So how is it done?</p>
<p>The answer is that the portrait is split into two layers of sprites, each with their own palette.</p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-partial-translucency/marin-layer-1.png" alt="First layer of Marin's sprites" />
</span><br />
<em>Layer 1</em></p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-partial-translucency/marin-layer-2.png" alt="Second layer of Marin's sprites" />
</span><br />
<em>Layer 2</em></p>
<p>It is then composited to get the full portrait.</p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-partial-translucency/marin-portrait.png" alt="Composited Marin's portrait" />
</span><br />
<em>The two layers one on top of each other</em></p>
<p>This solves the “Many different colors” issue: different layers of 3-colors sprites are overlaid on top of each other.</p>
<p>(However, unlike the DX title logo, the difference of fading between the sky and the clouds is not accounted for. The overlapped cloud areas become blue at the beginning of the animation.)</p>
<h3 id="2-marins-face-remain-half-translucent-for-a-while">2. Marin’s face remain half-translucent for a while</h3>
<p>Neither the GB or the GBC have half-transparent rendering – but they have the latency of the LCD screen. So the good old 50% transparency trick is used: displaying the portrait only every other frame.</p>
<p><span class="pixel-art gameboy-screen">
<img src="/images/zelda-links-awakening-partial-translucency/marin-blink.gif" alt="Marin's portrait slowed down" />
</span><br />
<em>The blinking effect, slowed down.</em></p>
<p>On full speed, the latency of the original screen then creates the half-transparency effect.</p>
<h3 id="3-a-seagull-fades-in">3. A seagull fades in</h3>
<p>The seagull fades in gradually, on the middle of Marin’s face.</p>
<p>Same trick: this is done by gradually updating the palettes of the seagull sprite.</p>
<h3 id="4-marins-face-fades-out">4. Marin’s face fades out</h3>
<p>Again, Marin’s portrait palettes are gradually shifted to becoming blue again.</p>
<p>And that’s it. A neat composition of several tricks, for a good and moving ending.</p>
<hr />
<p>So there it is: some of the tricks used to unlock partial translucency on the Game Boy Color hardware. Of course these techniques are quite time-consuming, and thus are only used during a handful of key moments.</p>
<p>A few years later, the hardware translucency support of the Game Boy Advance will make these kind of effects much easier to achieve.</p>
<p><em>Want to read more? Read the <a href="https://zladx.github.io/archives">other articles</a> of this series,
discover <a href="https://github.com/zladx/LADX-Disassembly">more of Link’s Awakening code</a>, or <a href="https://discord.gg/sSHrwdB">join the discussion on Discord</a>.</em></p>