🤔 Para Refletir :
"Água mole em pedra dura tanto bate até que fura... Bem, exceto se você alterar as configurações de resistência elemental do seu projeto!"
- Moge

[Ace] Sistema de Achievements Simples

Takki Masculino

Starboy
Membro
Membro
Juntou-se
28 de Junho de 2015
Postagens
206
Bravecoins
148
Sistema de Achievements Simples
por XP

Esse script adiciona um sistema simples pelo qual o jogador pode desbloquear achievements criados por você. Os achievements são, na verdade, itens, mas se usa apenas o seu nome, seu ícone e seu preço, que equivale aos pontos. Pode-se tanto adicionar quanto remover achievements. O script é bem simples, e é instalado normalmente.

w9h7rc9.png
hV1tkZ4.png
fPgq2d6.png

Como criar achievements:
Crie um novo item simples, e mude seu nome, seu ícone e seu preço. O preço será a quantidade de pontos recebidos do achievement.
Como dar achievements:
Utilize Chamar Script com o comando $ac.give(ID) e no lugar de ID, coloque o id do item equivalente ao seu achievement.
Como remover achievements:
Utilize Chamar Script com o comando $ac.take(ID) e no lugar de ID, coloque o id do item relativo ao achievement que quiser remover.
Como ver os achievements atuais:
Utilize Chamar Script com o comando $ac.show e janela de achievements aparecerá.
Como usar o número de pontos em no jogo:
Crie uma variável e no campo "Script" ponha $ac.points. Lembre-se de atualizar esta variável caso o número de pontos tenha mudado.

Ruby:
=begin
╔══════════════════════════════════════════════════════════════════════════════╗
║                             ____  _____________                              ║
║                             \   \/  /\______   \                             ║
║                              \     /  |     ___/                             ║
║                              /     \  |    |                                 ║
║                             /___/\  \ |____|                                 ║
║                                   \_/                                        ║
╟──────────────────────────────────────────────────────────────────────────────╢
║                       Sistema de Achievements Simples                        ║
╚══════════════════════════════════════════════════════════════════════════════╝
  ┌────────────┐
  │ Instruções │
┌─┴────────────┴───────────────────────────────────────────────────────────────┐
│ Como criar achievements:                                                     │
│ - Crie um novo item simples, e mude seu nome, seu ícone e seu preço.         │
│   O preço será a quantidade de pontos recebidos do achievement.              │
│                                                                              │
│ Como dar achievements:                                                       │
│ - Utilize Chamar Script com o comando "$ac.give(ID)" e no lugar de ID,       │
│   coloque o id do item equivalente ao seu achievement.                       │
│                                                                              │
│ Como remover achievements:                                                   │
│ - Utilize Chamar Script com o comando "$ac.take(ID)" e no lugar de ID,       │
│   coloque o id do item relativo ao achievement que quiser remover.           │
│                                                                              │
│ Como ver os achievements atuais:                                             │
│ - Utilize Chamar Script com o comando "$ac.show" e janela de achievements    │
│   aparecerá.                                                                 │
│                                                                              │
│ Como usar o número de pontos em no jogo:                                     │
│ - Crie uma variável e no campo "Script" ponha "$ac.points". Lembre-se de     │
│   atualizar esta variável caso o número de pontos tenha mudado.              │
└──────────────────────────────────────────────────────────────────────────────┘
=end
module XP
  Icon_size = 24           # Tamanho dos ícones
  Text_give = " recebido!" # Texto ao receber achievement
  Text_take = " perdido!"  # Texto ao perder achievement
  Text_points = "Pontos: " # Texto da janela de pontos

  Key = :C # Tecla para sair da janela de achievement

  Normal_color = 0 # Cor normal
  Name_color = 3   # Cor do nome do achievement
  Points_up = 3    # Cor dos pontos positivos
  Points_down = 2  # Cor dos pontos negativos

  SE_give = RPG::SE.new("Chime1", 70, 80) # SE ao receber achievement
  SE_take = RPG::SE.new("Down1", 70, 80)  # SE ao perder achievement

end

class Achievements

  attr_accessor :achievements
  attr_accessor :points

  def initialize
    @achievements = []
    @points = 0
  end

  def give(id)
    if @achievements.include?(id) == false
      XP::SE_give.play
      @achievements[@achievements.length] = id
      @achievements.sort
      @points += $data_items[id].price    
      @a = Window_Achieved.new($data_items[id].icon_index, "\ec[#{XP::Name_color}]#{$data_items[id].name}\ec[#{XP::Normal_color}]#{XP::Text_give} \ec[#{XP::Points_up}]+#{$data_items[id].price}")
      @a.openness = 0
      @a.open
      update until @a.open?    
      loop do
        update
        if Input.trigger?(XP::Key)
          break
        end
      end
      @a.close
      update until @a.close?
    end
  end

  def take(id)
    if @achievements.include?(id) == true
      XP::SE_take.play
      @achievements.delete(id)
      @achievements.sort
      @points -= $data_items[id].price  
      @a = Window_Achieved.new($data_items[id].icon_index, "\ec[#{XP::Name_color}]#{$data_items[id].name}\ec[#{XP::Normal_color}]#{XP::Text_take} \ec[#{XP::Points_down}]-#{$data_items[id].price}")
      @a.openness = 0
      @a.open
      update until @a.open?    
      loop do
        update
        if Input.trigger?(XP::Key)
          break
        end
      end
      @a.close
      update until @a.close?
    end
  end

  def show  
    SceneManager.call(Scene_Achievements)
  end

  def update  
    Graphics.update
    Input.update
    instance_variables.each do |varname|
    ivar = instance_variable_get(varname)
    ivar.update if ivar.is_a?(Window)
    end
  end
end

class Window_Achieved < Window_Base

  def initialize(icon_index, text)
    super(0, 0, (standard_padding * 2) + Bitmap.new(1,1).text_size(text.gsub(/\ec\[[0-9]*\]/) {|s| ""}).width + 4 + XP::Icon_size,fitting_height(1))
    @icon_index = icon_index
    @text = text  
    refresh
  end

  def set_text(text)
    if text != @text
      @text = text
      refresh
    end
  end

  def clear
    set_text("")
  end

  def refresh
    self.x = (Graphics.width / 2) - (self.width / 2)
    self.y = (Graphics.height / 2) - (self.height / 2)
    contents.clear
    draw_text_ex(4 + XP::Icon_size, 0, @text)
    draw_icon(@icon_index, 0, (fitting_height(1) - XP::Icon_size) / fitting_height(1))
  end
end

class Window_Achievements < Window_ItemList

  def initialize(x, y, width, height)
    super
    @category = :none
    @data = []
  end

  def col_max
    return 1
  end

  def make_item_list
    for i in $ac.achievements do
      @data[@data.length] = $data_items[i]
    end
  end

  def draw_item(index)
    item = @data[index]
    if item
      rect = item_rect(index)
      rect.width -= 4
      draw_item_name(item, rect.x, rect.y, true)
    end
  end

  def select_last
    select(0)
  end
end

class Window_Desc < Window_Base
  def initialize(text, line_number = 1)
    super(0, 0, (standard_padding * 2) + Bitmap.new(1,1).text_size(text.gsub(/\ec\[[0-9]*\]/) {|s| ""}).width + 4,  fitting_height(line_number))
    @text = text  
    refresh
  end

  def clear
    set_text("")
  end

  def refresh
    contents.clear
    draw_text_ex(4, 0, @text)
  end
end


class Scene_Achievements < Scene_ItemBase

  def start
    super
    create_help_window
    create_item_window
  end

  def create_item_window
    w = Graphics.width / 2
    h = Graphics.height / 2
    @help_window.x = Graphics.width / 2 - @help_window.width / 2
    @help_window.y = Graphics.height / 2 - h / 2 - @help_window.height / 2
    @item_window = Window_Achievements.new(Graphics.width / 2 - w / 2, Graphics.height / 2 - h / 2 + @help_window.height / 2, w, h)
    @item_window.viewport = @viewport
    @item_window.category = :item
    @item_window.activate
    @item_window.select_last
    @item_window.set_handler(:cancel, method(:cancel))
  end

  def create_help_window
    @help_window = Window_Desc.new("#{XP::Text_points}#{$ac.points}")
  end

  def cancel
    SceneManager.call(Scene_Map)
  end
end

class Scene_Title < Scene_Base

  alias n_command_new_game command_new_game
  def command_new_game
    $ac = Achievements.new
    n_command_new_game
  end
end

DEMO
 
Voltar
Topo Inferior