[PSDK] PC : Empêcher la dépose/déplacement/relâchement d'un Pokémon selon son ID

4 Réponses • 561 Vues

Rey

Modérateur

Bonjour. C'était une demande d'Eurons à l'origine, pour laquelle Maxoumi avait donné un début de réponse, et j'ai simplement complété/amélioré ce qui a été fait.
Voilà le script :
Script
module GamePlay
  # Liste des ID nationaux des Pokémon ne pouvant être stocké/déplacer/relâché.
  # BAN_ID = [id1, id2, id3...]
  BAN_ID = [803, 804, 805]

  class StorageUtils
    def release_pokemon(index)
      c = display_message(text_get(33, 101), 1, text_get(33, 83), text_get(33, 84))
      return if (c == 1)
      if (index >= 31) # Pokémon de l'équipe
        pkmn = $actors[index - 31]
        unless BAN_ID.include?pkmn.id
          $actors[index - 31] = nil
          unless check
            return $actors[index - 31] = pkmn
          end
          $actors.compact!
          deleted = true
          draw_pokemon_team
        else
          c = display_message("Vous ne pouvez pas relâcher ce Pokémon !")
        end
      else # Pokémon de la boite
        pkmn = $storage.remove(index - 1)
        draw_pokemon_box
      end
      if deleted
        display_message(parse_text(33, 102, PFM::Text::PKNICK[0] => pkmn.given_name), 1) # "#{pkmn.given_name} a été relâché.", 1)
        display_message(parse_text(33, 103, PFM::Text::PKNICK[0] => pkmn.given_name), 1) # "Bye-bye, #{pkmn.given_name} !", 1)
        draw_info_pokemon(index)
        deleted = false
      end
    end
  end

  class StorageDrop
    def update
      @utils.update
      return if $game_temp.message_text
      if (@mode == :selection)
        if (Input.trigger?(:B))
          c = @utils.display_message(text_get(33, 85), 2, text_get(33, 83),  text_get(33, 84))
          @running = false if (c == 1)
        end
        @index = @utils.deplacement_equipe(@index, :drop)
        if (Input.trigger?(:A))
          return if ($actors[@index - 31] == nil)
          choice
        end
      elsif (@mode == :drop)
        if (Input.trigger?(:B))
          cancel_drop
        end
        if (Input.trigger?(:A))
          # On vérifie que l'ID du Pokémon déposé n'appartient pas à cette liste
          unless BAN_ID.include?@pokemon_drop.id 
            confirm_drop
          else
            c = @utils.display_message("Vous ne pouvez pas déposer ce Pokémon.")
            cancel_drop
          end
        end
        if (Input.trigger?(:RIGHT))
          if ($storage.current_box < (PFM::Storage::MAX_BOXES - 1))
            $storage.current_box += 1
          else
            $storage.current_box = 0
          end
          @utils.change_box
        end
        if (Input.trigger?(:LEFT))
          if ($storage.current_box < 1)
            $storage.current_box = PFM::Storage::MAX_BOXES - 1
          else
            $storage.current_box -= 1
          end
          @utils.change_box
        end
      end
    end
  end

  class StorageMove
    def update
      @utils.update
      return if $game_temp.message_text
      if (Input.trigger?(:B) and @pokemon_move == nil)
        c = @utils.display_message(text_get(33, 85), 2,  text_get(33, 83),  text_get(33, 84))
        @running = false if (c == 1)
      end
      if (@index == 0) # Changement de boîte
        @index = @utils.changer_boite(@index, @pokemon_move)
      elsif (@index > 0 and @index < 31)# Déplacement dans la boîte
        @index = @utils.deplacement_boite(@index, :move, @pokemon_move)
        if (Input.trigger?(:A))
          if (@mode == :move)
            unless BAN_ID.include?@pokemon_move.id
              if ($storage.slot_contain_pokemon?(@index - 1)) # Pokémon présent
                pokemon = $storage.remove(@index - 1)
                $storage.store_pokemon_at(@pokemon_move, @index - 1)
                @pokemon_move = pokemon
                @utils.change_box
                @utils.draw_selector(@index, @pokemon_move)
              else
                $storage.store_pokemon_at(@pokemon_move, @index - 1)
                @pokemon_move = nil
                @utils.change_box
                @utils.draw_selector(@index)
                @mode = :selection
              end
            else
              c = @utils.display_message("Ce Pokémon ne peut être déposé.")
              cancel_drop
            end
          else
            return if (!$storage.slot_contain_pokemon?(@index - 1))
            choice
          end
        end
      else # Déplacement dans l'équipe
        @index = @utils.deplacement_equipe(@index, :move, @pokemon_move)
        if (Input.trigger?(:A))
          if (@mode == :move)
            if ($actors[@index - 31] != nil) # Pokémon présent
              pokemon = $actors[@index - 31].clone
              $actors[@index - 31] = @pokemon_move
              @pokemon_move = pokemon
              @utils.draw_pokemon_team
              @utils.draw_selector(@index, @pokemon_move)
            else
              $actors.push(@pokemon_move)
              $actors.compact!
              @pokemon_move = nil
              @utils.draw_pokemon_team
              @utils.draw_selector(@index)
              @mode = :selection
            end
          else
            return if ($actors[@index - 31] == nil)
            choice
          end
        end
      end
    end
  end
end

Vous pouvez aussi directement le télécharger ICI, et l'extraire dans le dossier script à la racine de votre projet.

Pour l'utilisation, rien de plus simple. Avec un éditeur de texte permettant de le faire, il vous suffit de rentrer l'ID correspondant à l'espèce de Pokémon à empêcher d'être déposé, déplacer ou relâcher ici :
BAN_ID = []

« Modifié: 14 octobre 2019, 16:00:02 par Rey »

Script PSDK

Rey

Modérateur

J'viens d'effectuer une mise à jour de maintien du script pour l'adapter aux nouveaux noms de méthodes introduits dernièrement dans PSDK.
Le script sous spoiler a été mis à jour (l'indentation était foireuse, j'ai corrigé ça), pareil pour le lien de téléchargement.
Pas de nouveautés introduites, ne sachant pas spécialement ce qu'il y a de plus à rajouter. Si quelqu'un a une potentielle idée, qu'il s'exprime. :)
Désolé de déterrer ce topic, mais je propose que l'on puisse faire que un certain pokemon ne soit que inrelachble, car pour le starter du joueur, et le légendaire empecher le relachement peux être bien, mais si le joueur doit se les trimballer tout le temps, ça devient pénible. Et je voulais aussi savoir si une phrase apparait quand le joueur essaye de deposer relacher deplacer. Si oui, gère t'elle les langues ?

Rey

Modérateur

Ca sera certainement géré à la prochaine version du PC. Ce que j'ai mis là c'est un très vieux script qui date d'avant mon apprentissage de Ruby et il est clairement sous-optimisé (aucun CSV donc juste en français + pas de distinction entre déposer/récupérer et relâcher. A l'avenir on fera certainement avec des attributs directement donnés aux Pokémon mais ça faisait déjà parti des choses que l'on voulait faire.
Ok, merci d'avoir éclairé ma lanterne ^^

There was an error while thanking
Thanking...