Un mois très similaire au précédent. « Shattered Realm » continue d’avaler la totalité de ma productivité. Les fêtes de fin d’année ont été l’occasion de faire une pause (même si j’ai continué le design sur papier ; je suis même rentré·e avec quelques idées de mécaniques très intéressantes).
Plusieurs discussions m’ont donné envie de me pencher sur le jeu de rôle (écriture et conception, faute de pouvoir pratiquer). Sans oser m’avancer, il y aura peut-être du mouvement sur ce terrain dans les mois qui viennent.
Mon fer à souder attend toujours sagement sur mon bureau.
Jeux Vidéo
« Shattered Realm », donc. Ce mois-ci a vu essentiellement du refactoring, du bugfix et des petites améliorations (discrètes mais tellement importantes), et comparativement peu d’ajouts de gameplay.
Notamment, une humble optimisation a fait passer le démarrage du serveur de 10 secondes à 2 secondes. Relancer un test à partir de zéro est désormais 80 % moins frustrant.
Les modifications les plus saillantes concernent l’interface (et ses répercussions côté serveur). Le client a désormais de nouvelles icônes d’action (blanc sur noir), et un panneau latéral interactif listant les objets contenus dans l’inventaire du personnage et dans le coffre auquel il accède. Ceci a pour effet de rendre la souris beaucoup plus utile et la manipulation de l’inventaire beaucoup plus intuitive, puisqu’il est désormais possible de prendre et de poser des objets simplement en cliquant sur leur nom dans le panneau latéral. Cette méthode est également moins ambiguë que le clavier lorsqu’il s’agit de prendre des sacs identiques mais au contenu différent. Cependant, l’interface au clavier reste inchangée, et permet toujours de jouer entièrement sans la souris. Dans la même veine, le nom des personnages (et des PNJs) est désormais affiché au-dessus d’eux.
Côté gameplay, deux nouvelles mécaniques ont été créées et intégrées dans des rêves : l’ombre, qui cache le décor, et la possibilité de créer de la lumière pour le révéler ; les gargouilles, qui infligent des dégâts par leur regard, mais peuvent être contournées.
Les règles des portails entre les fragments ont été entièrement retravaillées. Désormais, il n’y a plus de notion de « profondeur », uniquement de distance. Chaque portail appartient à une région ; ouvrir un portail vers sa propre région est facile ; ouvrir un portail vers une région adjacente est plus difficile (nécessite un pouvoir particulier) ; ouvrir un portail vers une région distance est impossible (pour l’instant). Voyager d’une région à une autre est donc désormais plus complexe et plus coûteux. La région profonde de Kalzakrax est désormais une région à part entière, désormais nommée « La Forteresse Infinie », qui n’est adjacent qu’à Kalzakrax (et dans la foulée, de nouveaux défis et de nouvelles récompenses y ont été ajoutées).
Les objets peuvent désormais être améliorés ; pour l’instant, il n’y a que le sertissage, qui permet de donner des pouvoirs aux sceptres (avant, les sceptres étaient forgés en une seule fois ; désormais, les ingrédients sont exactement les mêmes, mais la fabrication se fait en deux étapes), et de changer l’élément d’une amulette. Les perspectives de cette mécanique sont de créer des amures et des vêtements de haut niveau qui cumuleraient des protections et des pouvoirs.
Also, no spoil, mais il est désormais possible de souffler des billes en verre.
L’une des perspectives de travail de ces prochaines semaines concerne le tutoriel. J’aimerais qu’il soit moins scolaire et plus basé sur de vraies énigmes de difficulté croissante ; s’inspirer des rêves, qui se concentrent sur une mécanique dans un espace fermé, semble une piste intéressante.
Le gros travail qui se profile à l’horizon sera la zone de départ des ombres de la mort (personnages jouables). Le refactoring de ces deux derniers mois devrait porter ses fruits et permettre un meilleur level design, et l’ajout de nouveaux ingrédients et de nouvelles recettes devrait être trivial. Il me reste cependant quelques mécaniques à mettre en place (notamment la pesée des âmes).
Je compte publier une vraie mise à jour très prochainement (même s’il y a eu une mise à jour silencieuse juste avant les fêtes) et lancer un playtest, mais j’aimerais que ces deux éléments (tutoriel et région des ombres) y soient inclus. Les éléments qui ne seront probablement pas dans cette mise à jour sont les suivants : point-and-clic (sorts ciblés, arcs et flèches), drag-and-drop (modification intuitive de l’interface du client), pathfinding pour les PNJs, subsecond timers (refactoring des timers pour leur permettre une précision plus fine que la seconde), la zones de départ des dryades, la manipulation du ka via le palais mental, la zone du tombeau du roi des démons, la piété envers les divinités (remplacement du sort d’invocation), les sorts basés sur la mécanique de contrôle.
Comme c’est la fin de l’année et que je code pratiquement non-stop sur ce projet, j’ai compilé (purement pour le plaisir) toutes les modifications qui datent de moins de deux mois sur Shattered Realm (le jeu) et HacKraft (le client et le serveur). Je ne m'attends pas à ce que quelqu'un les lise d'un bout à l'autre, c'est juste pour se donner une idée du boulot accompli. (Et quelle est l'utilité de ce journal si ce n'est précisément ça ?) Tant que j'y suis, un p'tit lien vers la todo-list, qui fait actuellement... presque 350 lignes, presque 1000 mots et plus de 60000 signes.
L'historique du jeu Shattared Realm :
Several small fixes.
Fix a bug where it was possible to upgrade an already upgraded item.
Fix a bug where souls in a bag couldn't be accessed.
Set a minimum size to the side-list to avoid it moving too much while inventory is being managed.
Fix displayed name of the Infinite Fortress' zones.
Fix bugs preventing rewards to be generated in the Infinite Fortress' necromantic coffers.
Fix gems-consuming spells not updating the side-list.
Fix action /open not properly displaying obsidian coffer's content.
Add "noretrigger" to most up-down links in castle, floating and lavacave.
Refactor "floating portal crypt".
Several small fixes.
Interpret.lua doesn't use braces to represent doorframes anymore.
Fix error message complaining about forest:sign not found.
Fix generation of haunted skulls in randgen Kalzakrax's coffers, and increase the odds of finding a portal scepter.
Rename 'ash_soul' into 'sand_soul'.
Add "sesame" optional challenge to the "cathedral" dream.
Refactor "sesame" doors. Add "efficient sesame" power.
Add gargoyle traps, and the "cathedral" dream using that.
Sort dream endings and dream dusts.
Add darkness and light, and the "dark" dream using that.
Several bugfixes and improvments.
The Portal spell only spend mana fur used range (pay less for a short trip, even if you are able to do a long one).
Add a one-way exit to randgen Kalzakrax's ziggurats with a Sesame door.
Action /inventory doesn't list the inventory in the console anymore (only in the side pannel). Informations such as damages and protections are still displayed in the console.
Fix action /drink consuming liquid even when useless.
Fix a bug occuring when trying to /equip an already equiped item.
Fix the side-list proposing invalid actions on items not in the player's inventory.
Fix a bug where soul burners didn't consume the soul and trigger proper scripts.
Fix a bug where failing to move a soul produced a wrong warning.
Upgrade soul scripts. Prepare for "pure/evil" souls.
Add blueprint for Ardamant (metal level 2, type fire); no use yet.
Additions to the randgen "Infinite Fortress".
* some coffers now contain amethysts,
* add a four-ways necromantic challenge,
* add one new layout.
Fix a bug where stacks of ingredients were generated with only one element.
Scepters with a 'magic' gem now give the improved portal power. (And ziggurats in randgen Kalzakrax shards now contains 'magic' scepters.)
The portal spell now has a range, 0 by default, that can be increased with a power.
Minor fixes and additions.
* Fix graphical bug in ziggurats.
* Fix goatskins not available to craft.
* Add rock elementals as possible NPCs.
* Spell "heat" now requires a ruby.
Portals now have a notion of distance between regions. Regions don't have a "deep" versions anymore, just a region only adjacent to them.
Refactoring level design of "floating" zone is in progress. Also add tiles door-stairs up and down.
Optimisation : preload build-tools "interpret.lua" and "map_get.lua". Server startup time went from 10 sec to 2.
Fix : only "death" marbles can contain souls, now.
Add artifact upgrade logic and gemsetting action. Can set gems on amulets and scepters (now /forge only makes bare and powerless scepters that need gems).
Automatically display inventory on the side-panel.
Passive NPCs can now be talked to just by walking into them.
Fix : shorten horrors' names.
Fix : add 'move' actions.
Fix : listing inventory doesn't display '1' before non-stackable items.
Add glass marbles. (Also improve crafting actions to handle non-item artifact creation.)
Add layouts and challenges to deep Kalzakrax dungeons.
* Arena : horrors.
* Doors : soul, fire, advanced fire.
* Rewards : obsidian coffer.
* Other : one-way north and south.
Minor improvments (test zone, powers, scepters, spells).
Use amulets to get dream avatar's element. Add 'death' challenge to 'mine' dream.
Some bugfixes, mainly around dream avatar's death trigger.
Tie dream generation and rewards to the blueprints; add dream lucidity and /generate action.
Small tweaks and corrections.
Reorganize tileset "base".
The obsidian coffer now contains the key to the character's personal mental palace.
Also rework how characters are saved and retrieved (saving from withing a dream now works properly).
Various small bugfixes and improvments.
Rework inventory handling (refactoring and some bugfixes).
Many small additions and changes.
* Add "glass blade" as an elemental weapon recipe using glassblowing.
* Add /tailor for cloth and leather (requiring no crafting station, no needle and no thread, for now).
* Add /craft for wood and bones (requiring no crafting station).
* Add NPC: stygian spider.
* Add PC: death shadow and a placeholder for their starting zone.
* Add tileset 'manichean', used in tutorial.
* Rename fire elemental's aspect as "flame".
* Now a damage type is just the id of the element.
Add notes for future rework of /cast and spells using blueprints.
New artifact craft and generation system.
* Use blueprints for every raw ingredients.
* Use 'craft.lua' to apply recipes and transform ingredients into other ingredients or items.
* Use 'create_artifact.lua' to generate artifacts accordingly to the generic recipes.
* Refactor world building and randgen scripts to use 'create_artifact.lua'.
* Refactor /forge, /blow and smelting to use 'craft.lua'.
* TODO : use this system for upgrading items, brewing potions and managing dream dusts.
Refactor powers to use blueprints.
Use new Blueprint interface for ores and metals (mining, melting and forging).
Fix endless loop while trying to /forge.
Some fixes and optimizations.
Add a new layout for deep Kalzakrax dungeons.
Refactoring forge (anvil and furnace).
Improve mine's dream; add dream's emotions and action /remember.
Add dream of mine (level design needs polish). No reward yet.
Remove depreciated logic/string_to_place.lua and reverse. (Now every script must use HK functions [de]serialize_place(). )
New "link_zones" tool, using serialize_place(). Applied it to demon's lavacave.
Refactor /logic/portal/* to use new [de]serialize_place() function.
Link alchemy and dreams : add /manifest and receipes for potion of sleep and potion of dream.
Add basic dream system : drink_script, sleep and /wakeup, plus basic test generation.
Fix a bug where inscribed portal doors cannot be /read.
Fix a bug where /take could put two different liquids in the same vial.
Add alchemy system (cauldron, /pour, /dilute and logic/brew.lua).
Add darkness damage and damage-over-time scripts.
* Add two curses: dread (darkness/3 after 5 min) and crawling shadow (darkness/1 every 1 min).
* Naderia rand-shards use dread.
* TODO: warn cursed players every minute.
* TODO: save and restore DoTs as characters are saved and recovered.
L'historique du client HacKraft :
Replace "README.txt" with "LISEZMOI.txt" containing updated informations.
Now, hitting 'enter' on an empty command line repeats the last command, and hitting 'backspace' on an empty command line adds the last command to the command line to be edited.
Fix a bug where fast, repeated clicks on an icon (or side-pannel line) could send the command twice in one line. (The letter-commands use to have the same problem.)
Fix : correct "conf.txt" pointing to "manichean" tileset.
Add standard commands file (minor spoils, but no incantation).
Fix icon commands running off of the screen. Fix first command not read properly (work around BOM, actually).
Fix : mouseover texts (icon-commands and side-panel) don't run out of the right-end of the screen anymore.
Fix : redefining an icon-command doesn't reset its icon anymore.
Add icons usage in mouseover tips.
Add "left" and "right" clics to the side-panel.
Add side-panel.
Convert underscores to spaces in names received from the network.
Display names atop characters.
Update network protocol.
Add letter-commands and icon-commands (replacing F1-F12 macros).
(Old modification integrated late in git history.)
L'historique du serveur HacKraft :
Makes 'retrigger' a non-default per-place option.
When a character bumps into a wall, the "land-on" script is retriggered. (Doors used to require to be stepped out of before crossing back.)
Add 'hidden' mechanism for places.
Fix 'create_artifact_from_*' not considering asked quantity.
Add Lua function get_aspect_index(string).
Fix assert_* still returning true between item marked for deletion and actual deletion. (Now assert_* fail immediately after delete_*.)
Lua function 'character_move' now returns true if coordinates were changed.
Refactoring Zone's interface.
Refactoring : Zone::getPlace() now returns a reference, not a naked pointer, and throws OOR instead of returning nullptr.
Add "left" and "right" clics to the side-panel.
Add basic side-pannel abilities (add and clear).
Fix : spaces in names are turned into underscores before being send through the network. (Clients are expected to convert underscores back to spaces upon reception.)
Update network protocol.
Deprecate server -> client command "hint".
Following a new character now automatically update all gauges (the client must forget all gauges' info when ordered to follow a new character).
Expose artifact_canstack() to Lua.
(And fix a bug from last commit.)
Tagged can now import and export their values to and from a map of tags.
Blueprints are now just raw Tagged objects.
Artifacts now import and export NAME, TYPE and QTT in their 'map of tags' form.
Add blueprints.
Add cache to players' messages in order to reduce the number of TCP packets.
Silence warnings on assert_* failing because of nil argument.
Add Lua functions 'serialize' and 'deserialize' for places (zone, x, y).