Mini-Jeu : Puzzle des Ruines Alpha

  • 3 Réponses
  • 191 Vues
*

Hors ligne FL0RENT_

Mini-Jeu : Puzzle des Ruines Alpha
« le: 23 mai 2017, 11:36:14 »
Il s'agit d'un petit script reproduisant le mini-jeu des ruines de Pokémon Or/Argent



Instalation :

Créez un nouveau script au dessus de main et collez y ceci :

spoiler

#--------------------------------------------
# Puzzle des Ruines Alpha
# Par FL0RENT_
#--------------------------------------------
class Interpreter
  def puzzle_alpha(id = 1)
    $victoire_puzzle_alpha = false
    $scene = Alph_Ruins_Puzzle.new(id)
  end
end

class Alph_Ruins_Puzzle
  #Choix des fichiers son
  #SE
  MOVESOUND1 = "menu" #mouvement sans piece
  MOVESOUND2 = "hitlow" #mouvement avec piece
  PLACESOUND = "notverydamage" #pose de piece
  TAKESOUND = nil #prise de piece
  #BGM
  VICTORY_THEME = "PkmRS-Victory"
 
  def initialize(id)
    Graphics.freeze
    @background = Plane.new
    @background.bitmap = RPG::Cache.picture("Puzzle_Ruines/Fond")
    @background2 = Sprite.new
    @background2.bitmap = RPG::Cache.picture("Puzzle_Ruines/Fond2")
    @background2.x = 192
    @background2.y = 96
    @grid = []
    6.times do
      @grid.push Array.new(6)
    end
    @pieces = []
    @cursor_piece = nil
    @cursor = Sprite.new
    @cursor.bitmap = RPG::Cache.picture("Puzzle_Ruines/Curseur")
    @cursor.z = 9001
    @cursor_x = 0
    @cursor_y = 0
    @cursor_wait = 0
    4.times do |x|
      4.times do |y|
        img = Sprite.new
        img.bitmap = RPG::Cache.picture("Puzzle_Ruines/" + id.to_s)
        img.src_rect = Rect.new(x * 72, y * 72, 72, 72)
        @pieces.push img
      end
    end
    for piece in @pieces
      verif = false
      until verif
        a = rand(3)
        case a
        when 0
          b = rand(6)
          if @grid[0][b] == nil
            verif = true
            @grid[0][b] = piece
          end
        when 1
          b = rand(6)
          if @grid[5][b] == nil
            verif = true
            @grid[5][b] = piece
          end
        when 2
          b = rand(4)
          if @grid[b + 1][0] == nil
            verif = true
            @grid[b + 1][0] = piece
          end
        end
       
      end
    end
  end
 
  def main
    pieces_position
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if victory_check
        $victoire_puzzle_alpha = true
        if VICTORY_THEME != nil
          Audio.bgm_play("Audio/BGM/" + VICTORY_THEME)
          wait(80)
          wait_hit
          $scene = Scene_Map.new
          $game_system.bgm_play($game_map.bgm)
        else
          wait(120)
          $scene = Scene_Map.new
        end
      end
      if $scene != self
        break
      end
    end
   
    Graphics.freeze
    dispose
  end
 
 
  def update
    if @cursor_piece == nil
      @cursor_wait += 1
      @cursor_wait = 0 if @cursor_wait > 40
      @cursor.opacity = 0 if @cursor_wait == 20
      @cursor.opacity = 255 if @cursor_wait == 0
    end
    if Input.trigger?(Input::B)
      $scene = Scene_Map.new
    end
    if Input.trigger? (Input::DOWN)
      unless @cursor_y >= 5 or (@cursor_y == 4 and @cursor_x != 0 and @cursor_x != 5)
        @cursor_y += 1
        move
      end
    end
    if Input.trigger? (Input::UP)
      unless @cursor_y == 0
        @cursor_y -= 1
        move
      end
    end
    if Input.trigger? (Input::RIGHT)
      unless @cursor_x >= 5 or @cursor_y == 5
        @cursor_x += 1
        move
      end
    end
    if Input.trigger? (Input::LEFT)
      unless @cursor_x == 0 or @cursor_y == 5
        @cursor_x -= 1
        move
      end
    end
    if Input.trigger?(Input::C)
      if @cursor_piece == nil
        if @grid[@cursor_x][@cursor_y] != nil
          wait 4
          @cursor_piece = @grid[@cursor_x][@cursor_y]
          @grid[@cursor_x][@cursor_y] = nil
          Audio.se_play("Audio/SE/" + TAKESOUND, 80) if TAKESOUND != nil
          @cursor.bitmap = RPG::Cache.picture("Puzzle_Ruines/Curseur_b")
          @cursor.opacity = 255
          @cursor_wait = 0
        end
      else
        if @grid[@cursor_x][@cursor_y] == nil
          wait 4
          @grid[@cursor_x][@cursor_y] = @cursor_piece
          @cursor_piece = nil
          Audio.se_play("Audio/SE/" + PLACESOUND) if PLACESOUND != nil
          @cursor.bitmap = RPG::Cache.picture("Puzzle_Ruines/Curseur")
        end
      end
    end
    pieces_position
  end
 
  def dispose
    @background.dispose
    @background2.dispose
    @cursor.dispose
    @pieces.each do |p|
      p.dispose
    end
  end
 
 
  def victory_check
    4.times do |x|
      4.times do |y|
        if @grid[x + 1][y + 1] != @pieces[y + (4 * x)]
          return false
        end
      end
    end
    return true
    print "a"
  end
 
  def pieces_position
    @cursor.x = 120 + @cursor_x * 72
    @cursor.y = 24 + @cursor_y * 72
   
    for piece in @pieces
      if @cursor_piece == piece
        piece.x = 120 + @cursor_x * 72
        piece.y = 24 + @cursor_y * 72
        piece.z = 1
      else
        for line in @grid
          if line.include?(piece)
            x = @grid.index(line)
            y = line.index(piece)
            piece.x = 120 + x * 72
            piece.y = 24 + y * 72
            piece.z = 0
          end
        end
      end
    end
  end
 
  def wait(x)
    x.times do
      Graphics.update
    end
  end
 
  def wait_hit
    loop do
      Graphics.update
      Input.update
      if Input.trigger?(Input::C) or Input.trigger?(Input::B)
        break
      end
    end
  end
 
  def move
    if @cursor_piece == nil
      Audio.se_play("Audio/SE/" + MOVESOUND1, 80) if MOVESOUND1 != nil
      wait(5)
      @cursor.opacity = 255
      @cursor_wait = 0
    else
      Audio.se_play("Audio/SE/" + MOVESOUND2, 80) if MOVESOUND2 != nil
      wait(5)
    end
  end
 
end

Ensuite, collez le dossier contennu dans ce zip dans le dossier "Graphics/Pictures" de votre projet :

http://www.mediafire.com/file/zm6a6gtb2qxndpd/Ruines_alpha.zip

Utilisation :

Pour lancer le mini-jeu, utilisez ceci en commande de script dans un evenement :
puzzle_alpha(N)
Remplacez N par le numéro de votre puzzle.
De base il y a :
Kabuto : 1
Amonita : 2
Ptera : 3
Ho-oh : 4

Vous pouvez rajouter plus de puzzles dans le dossier Puzzle_Ruines.

Enfin, pour vérifier si le joueur a réussi le puzzle, vous pouvez utiliser ceci dans une condition scriptée :
$victoire_puzzle_alpha




« Modifié: 20 juin 2017, 16:19:51 par FL0RENT_ »
 
Utilisateurs ayant remercié ce post : Yumekua, Bentoxx, romnair, AEliso19, Alizia

*

Hors ligne Bentoxx

Mini-Jeu : Puzzle des Ruines Alpha
« Réponse #1 le: 23 mai 2017, 15:17:20 »
Cool ! ça m'évitera de prendre celui d'Essential, y'a t-il une différence entre les deux ?
Du coup si je comprend bien le script s'occupe de "Briser" le puzzle ?

En tout cas beau boulot !
 

*

Hors ligne FL0RENT_

Mini-Jeu : Puzzle des Ruines Alpha
« Réponse #2 le: 23 mai 2017, 16:21:57 »
Cool ! ça m'évitera de prendre celui d'Essential, y'a t-il une différence entre les deux ?

Je ne sais pas vraiment, je ne me suis pas spécialement intéressé à celui d'Essentials, mais de ce que j'en ai vu la disposition générale est différente, et il semblerait qu'il utilise des paterns prédéfinis pour placer les pièces (en tout cas, c'est l'impression que j'ai en voyant les ressources dudit script).
Le mien réplique la disposition d'or argent et change aléatoirement l’ordre des pièces à chaque partie.

Edit:
Je me suis renseigné un peu, et le script d'essentials permets plusieurs modes de jeu différents.
Celui là n'est fait que pour le mode de base.

Du coup si je comprend bien le script s'occupe de "Briser" le puzzle ?
On peut dire ça comme ça.
En fait, techniquement le script affiche plusieurs exemplaires de l'image et les rogne pour n'avoir qu'une pièce à la fois.
C'est un peu le même fonctionnement que les charsets.
« Modifié: 23 mai 2017, 16:44:25 par FL0RENT_ »
 
Utilisateurs ayant remercié ce post : Bentoxx

*

Hors ligne FL0RENT_

Mini-Jeu : Puzzle des Ruines Alpha
« Réponse #3 le: 20 juin 2017, 16:28:36 »
J'ai corrigé un petit bug d'affichage (les pièces apparaissaient en haut à gauche de l’écran pendant la transition)

Pour ceux qui ont déjà le script, remplacez par la version corrigée dans le 1er post, ou bien rajoutez :

Graphics.freeze
après la ligne : def initialize(id)

ainsi que :
pieces_position
après la ligne :  def main