Solarus Wiki

A wiki for the Solarus engine community

Outils pour utilisateurs

Outils du site


fr:upgrade_from_1.1_to_1.2

Mettre à jour votre quête de Solarus 1.1 vers Solarus 1.2

Solarus 1.2 apporte beaucoup de nouvelles fonctionnalités (entités personnalisées, SDL2, metatables et plus), de nombreuses nouvelles fonctions dans l'API Lua, et améliore le format de certains fichiers de données (en particulier strings.dat). Certaines entités sont plus personnalisables, comme les objets destructibles (pots, buissons, etc.) et les flux, nouveau nom des tapis roulants.

Comme toujours, commencez par sauvegarder vos données avant toute migration.

Dans cette page, nous allons nous pencher sur les incompatibilités. Visitez l'annonce ou le ChangeLog pour connaître les nouvelles fonctionnalités.

Mettre à jour les fichiers de données

Les fichiers de données autres que les scripts peuvent être mis à jour automatiquement par l'éditeur. Ouvrez votre quête avec Solarus Quest Editor 1.2 et une boîte de dialogue vous demandera de lancer la mise à jour.

En cas de problèmes, n'hésitez pas à solliciter notre aide sur les forums de Solarus.

Notez que l'opération peut aussi être réalisée depuis la ligne de commande, en lançant le script update_quest.lua dans le dossier tools du dépôt git (en fait, l'éditeur appelle ce script en interne).

Les principaux changement dans les fichiers de données sont :

  • Le fichier de traduction strings.dat a une nouvelle syntaxe plus lisible et plus facile à manipuler.
  • Les fichiers de planches de sprites sont vérifiés plus rigoureusement qu'avant. Une erreur s'affichera si une frame déborde de la taille de l'image dont elle provient. Ce problème n'était pas détecté auparavant.
  • Il y a des changements mineurs dans la syntaxe des fichiers de maps. En effet, certains types d'entités ont été renommés (conveyor_belt devient stream, shop_item devient shop_treasure), ajoutés (custom_entity) ou ont de nouvelles propriétés. Reportez-vous à l'annonce au au ChangeLog pour plus de détails.

À cause d'un bug dans SDL2, la police d'écriture fixed8.fon que nous utilisions dans Zelda Mystery of Solarus DX ne fonctionne plus. Si vous l'utilisez aussi dans votre jeu, vous aurez le message d'erreur suivant : “Cannot load font from file 'text/fixed8.fon': Couldn't set font size”. De plus, la licence de cette police d'écriture était indéterminée. Pour ces deux raisons, nous avons remplacé cette police par une autre dans ZSDX. Voir ce commit si vous voulez faire le même changement.

Changements de comportement du moteur

Certaines améliorations modifient légèrement le comportement spécifique de certaines entitiés dans quelques situations. Si vous avez des énigmes qui s'appuient sur l'ancien comportement, cela peut vous concerner.

  • Les ennemis ne sont désormais plus bloqués sur les blocs ou les plots de cristal.
  • Le bouclier ne protège plus le héros lorsqu'il est en train d'utiliser son épée ou lorsqu'il porte un objet.
  • Les objets lancés (pots, bombes, etc.) tombent désormais sur la couche inférieur si le joueur les lance depuis plus haut.
  • Les cristaux peuvent maintenant être activés en fonçant dessus en courant.
  • Si le joueur a la capacité de sauter, il peut alors sauter entre des plots de cristal distants.
  • Les règles de collision des flux (nouveau nom des tapis roulants) ont changé. S'il y a un espace par exemple de 8 pixels entre un flux et le mur de la salle, le héros peut maintenant passer dans cet espace dans certaines directions sans activer le flux.
  • Les règles de collision des jumpers ont changé. Les jumpers orientés vers le nord-est ou le sud-ouest était décalés de 8 pixels par erreur, aussi bien dans le moteur que dans l'éditeur. De plus, les jumpers diagonaux ne bloquaient pas suffisamment le héros, ce qui les rendait traversables dans certaines configurations. Si vous utilisez des jumpers diagonaux dans votre projet, il faut vérifier leur emplacement et les retester.

Mettre à jour les scripts Lua

L'API de scripting Lua de Solarus 1.2 introduit beaucoup de petites incompatibilités. Heureusement, la plupart d'entre elles sont très simples à prendre en compte ou ne vous concernent même pas. Cependant, nous indiquons ici la liste exhaustive des problèmes potentiels qu'il est possible de rencontrer.

Vidéo

Avec le passage à SDL2, l'API de gestion de l'affichage est plus simple et plus puissante. Passer en plein écran est bien plus rapide qu'avant et ne change plus la résolution de l'écran. Vous pouvez maintenant récupérer et modifier indépendamment la taille de la fenêtre, l'algorithme de lissage et l'option plein écran. Les modes vidéos “wide” n'existent plus car ils ne servent plus à rien : SDL2 adapte désormais correctement la taille de l'image en plein écran pour ne pas avoir de déformation.

Ces améliorations modifient l'API de sol.video.get_video_mode() and sol.video.set_video_mode(). Les modes vidéos disponibles sont maintenant : normal, scale2x, hq2x, hq3x and hq4x. En outre, sol.video.switch_mode() ne modifie plus l'option plein écran. Appelez sol.video.set_fullscreen() pour passer en plein écran ou en fenêtré.

Surfaces

surface:set_transparency_color() n'existe plus. Les surfaces sont toutes au format 32 bit avec un canal alpha et il n'y a pas de valeur de pixel spéciale. Utilisez la nouvelle méthode surface:clear() pour video le contenu d'une surface (cela va la rendre entièrement transparente). Utilisez le canal alpha des couleurs pour faire des pixels transparents ou semi-transparents.

C'est la seule incompatibilité en ce qui concerne les surfaces. Avec SDL2, si l'accélération graphique est disponible, les opérations de dessin sur les surfaces sont plus rapides car certains blits qui étaient fait en mémoire auparavant peuvent maintenant être effectués par la carte graphique. Les FPS devraient augmenter.

L'accélération vidéo peut être désactivée au lancement de Solarus en utilisant l'option de ligne de commande -video-acceleration=no.

Objets destructibles

Les objets destructibles (pots, buissons, etc.) sont maintenant entièrement personnalisables. Il n'y a plus de sous-types prédéfinis de destructibles. Dans map:create_destructible(), chaque propriété est maintenant spécifiée séparément : le sprite, le son, le poids, etc.

De plus, le moteur n'affiche plus de dialogue prédéfini lorsque le joueur échoue à soulever quelque chose qui devrait être coupé ou quelque chose de trop lourd. Il existe un nouvel évènement destructible:on_looked() que vous pouvez définir pour faire ce que vous souhaitez lorsque cela arrive. Pour afficher les mêmes dialogues que dans Solarus 1.1, vous pouvez utiliser le code suivant :

-- Initializes the behavior of destructible entities.
local function initialize_destructibles()
 
  local destructible_meta = sol.main.get_metatable("destructible")
  -- destructible_meta represents the shared behavior of all destructible objects.
 
  -- Show a dialog when the player cannot lift them.
  function destructible_meta:on_looked()
 
    local game = self:get_game()
    if self:get_can_be_cut()
        and not self:get_can_explode()
        and not game:has_ability("sword") then
      -- The destructible can be cut, but the player has no cut ability.
      game:start_dialog("_cannot_lift_should_cut");
    elseif not game:has_ability("lift") then
      -- No lift ability at all.
      game:start_dialog("_cannot_lift_too_heavy");
    else
      -- Not enough lift ability.
      game:start_dialog("_cannot_lift_still_too_heavy");
    end
  end
end

Appelez cette fonction une seule fois dans votre quête, même avant de démarrer une partie. Cela va définir un évènement on_looked() par défault pour tous les futurs objets destructibles, grâce au nouveau (et puissant) mécanisme des metatables.

Ennemis

Il ne devrait pas y avoir de traitement particulier des boss par rapport aux autres ennemis dans le moteur. Dans 1.1 et avant, les boss étaient automatiquement désactivés au démarrage de la map. Ce n'est plus le cas. Par conséquent, pour conserver le même comportement, vous pouvez appeler enemy:set_enabled(false) depuis l'évènement enemy:on_created() de votre boss, si vous ne le faisiez pas déjà. Vous pouvez aussi le faire depuis l'évènement map:on_started() de votre map, mais rappelez-vous que enemy:on_created() et enemy:on_restarted() ont déjà été appelés à ce moment.

Quoi qu'il en soit, il est recommandé de retester les boss de votre jeu.

Incompatibilités mineures

Les autres incompatibilités dans l'API sont moins perturbatrices. Elles sont simples à traiter, ou bien souvent n'ont même pas de conséquences.

  • Dans map:create_teletransporter(), le paramètre transition est maintenant une chaîne de caractères.
  • map:create_shop_item() est renommé en |map:create_shop_treasure().
  • map:create_conveyor_belt() est remplacé par map:create_stream().
  • Dans hero:get_state(), l'état “conveyor belt” n'existe plus.
  • La force par défaut des épées de niveau 3 ou plus a changé. Définissez enemy:on_hurt_by_sword si vous avez plus de 3 épées dans votre quête et que nouvelle la force par défaut ne vous convient pas.
  • enemy:on_hurt() est maintenant appelé avant enemy:on_dying().
  • enemy:on_hurt() ne prend plus de paramètre life_lost.
  • La défense par défaut de la tunique a changé. Définissez hero:on_taking_damage() si la nouvelle défense par défaut ne vous convient pas.
  • enemy:get/set_magic_damage() n'existe plus. Utilisez enemy:on_attacking_hero() pour faire des dégâts personnalisés.
  • hero:start_hurt() ne prend plus de paramètre magic. Appelez simplement game:remove_magic() si vous voulez retirer de la magie.
  • hero:start_hurt() blesse désormais le héros même s'il est temporairement invincible ou dans un état dans lequel les ennemis ne peuvent pas le toucher.
  • Les ennemis ont maintenant par défaut une taille de 16×16 et une origine en 8,13.
  • La taille des ennemis doit maintenant toujours être un multiple de 8.
  • item:on_pickable_movement_changed() n'existe plus. Utilisez pickable:on_movement_changed() à la place.
  • pickable:get_treasure() retourne désormais l'item au lieu du nom de l'item.
  • Timers: si vous retournez true dans le callback, le timer se répètera.
  • sol.timer.start() retourne maintenant le timer dans tous les cas, même si sa durée est de zéro.
  • sol.audio.play_music(“none”) est remplacé sol.audio.play_music(nil).
  • on_key_pressed() et on_character_pressed() sont maintenant deux évènements indépendents. Si vous arrêtez la propagation de on_key_pressed(), on_character_pressed() est tout de même appelé. Ce n'était pas le cas auparavant.

Obtenir de l'aide

Nous pouvons vous aider si vous avez des questions ou si vous rencontrez des problèmes pour mettre à jour votre jeu vers Solarus 1.2.

fr/upgrade_from_1.1_to_1.2.txt · Dernière modification: 2018/12/22 14:14 (modification externe)