RMRK is retiring.
Server is paid up for the rest of 2026, but the forum may go after that. See here for more information. Please archive or save anything you would like to keep before 2027.
Main Menu
  • Welcome to The RPG Maker Resource Kit.

[SOLVED] Achievements - only one bug

Started by Lysop, October 08, 2011, 09:02:49 PM

0 Members and 1 Guest are viewing this topic.

Lysop

IN REVISION!

I use an achievement system which has the nice option, to add a field in the title screen to see all the achievements as well as to sum up all scores and their data from the achievements together. There is only a bug:

- Start a game and unlock some achievements.
- After that you have these achievements on the title screen and in all save files.
- Quit the game and restart it.
- You will see now that there are no achievements unlocked. Everything is deleted.

So, I think that all achievements data aren't saved after quitting the game.
Does someone see this bug in the script below and could try to solve it?


Look at Reply #3 post for more details.

CODE
#===============================================================================
#
# MK3 - Phoenix Power Productions Presents: Erfolge 0.98a
# Letztes Update: Freitag, 09.10.2009
# Title Add-On by: HungrySnake
# Update on: 2.10.2011
# Level: Leicht, Normal
#
# Dieses Script erweitert das Spiel um die Möglichkeit, einen Gamerscore ähnlich
# dem bei der XBox 360 einzubauen.
# Ferner hat es noch ein Custom Menu eingebaut bekommen, dieses ist allerdings
# noch nicht so umfangreich ausgebaut und wird später wahrscheinlich in ein
# eigenes Script übertragen.
#
#===============================================================================
# Updates:
# ----------------------------------------------------------------------------
# o 05.10.2009 - Beginn des Scripts.
# o 06.10.2009 - Vollendung der Pre-A, offiziell Version 0.51a
# o 07.10.2009 - Erweiterung des Moduls, Einbau eines Custom-Menus, V 0.91
# o 08.10.2009 - Bei Erhalt eines Erfolgs wird "Battle_end" in der Database
#                abgespielt, Versionsnummer auf 0.97a erhöht
# o 09.10.2009 - Erweiterung der Einstellungsmöglichkeiten, V 0.98
#===============================================================================
# Installation und Anleitung
#===============================================================================
#
# Platziere dieses Script irgendwo zwischen Material und Main.
# Im Modul Erfolge nach dieser Einleitung gibt es einen Punkt "ERFOLGE_LISTE".
# In diesen können sämtliche Erfolge eingetragen werden, müssen dabei allerdings
# durchgezählt sein, sonst findet die Scene sie nicht.
# Mit "Geheime_Erfolge" können die Erfolge angegeben werden, welche nicht von
# Anfang an ausführlich angezeigt werden.
# Darunter kann man bei "GEHEIM_BESCHREIBUNG" die Erfolgs-IDs reinsetzen, welche
# zwar den Namen vor Erhalt anzeigen, nicht jedoch die Beschreibung.
# Will man einem Spieler einen Erfolg verleihen (sprich: er hat ihn erreicht),
# so funktioniert dies mit dem Befehl "gib_erfolg(ID)" unter 'Script' im Event-
# Command 'Advance'. Dabei steht ID für die Nummer, unter welcher der Erfolg in
# Aufzählung ERFOLGE_LISTE zu finden ist.
# Seit Version 0.71 ist es mit Add-On 1 kompatibel.
# Seit Version 0.80 unterstützt das Script auch die Möglichkeit, in anderen Scripts
# mit dem Befehl "$mk.gib_erfolg(id)" Erfolge nach denselben Regeln freizuschalten,
# wie dies in Events bisher möglich war.
# Seit Version 0.91 ist es mit Add-On 2 kompatibel.
# Will man das Script ohne Menü-Einbettung nutzen, so kann man es auch per Event
# mit dem Script-Command "ruf_erfolg(scene)" (ohne die "") aufrufen. Dabei steht
# scene für die Scene, zu welcher nach Verlassen des Erfolgs-Screens zurückgekehrt
# werden soll, also Scene_Battle, wenn man es während dem Kampf aufruft, Scene_Map,
# wenn man es von der Karte aus aufruft,...
#
#===============================================================================
#
# Kompatibilität
# - Alias: Game_System: initialize
# - Alias: Scene_Title: start
# - Alias: Scene_File: write_save_data, load_save_data
# - Alias: Scene_Menu: create_command_window, update_command_selection, terminate
# - Alias: Scene_Map: update
# - Overwrite: Window_Help: initialize
# - Overwrite: Scene_Menu: update
# - Overwrite: Scene_Item: return_scene
# - Overwrite: Scene_Skill: return_scene
# - Overwrite: Scene_Status: return_scene
# - Overwrite: Scene_File: return_scene
# - Overwrite: Scene_End: return_scene
#
#===============================================================================

module MK3
  module Erfolge
    # Mit diesem Namen wird der Erfolgs-Bildschirm-Aufruf betitelt, wenn man ihn
    # über das Custom Menu aufruft.
    ERFOLGE_NAME = "Erfolge"
   
    # Dieser Schalter bestimmt, ob der Erfolgs-Screen in den Titel-Bildschirm
    # integriert wird. Gleichzeitig bewirkt er auch, dass die Erfolge nicht von
    # einem Spielstand, sondern vom Spiel direkt geladen werden, sind also immer
    # in jedem Spielstand des jeweiligen Exemplars gleich.
    INTEGRATE_TITLE = true
   
    # Mit diesem Schalter kann man bestimmen, ob der Erfolgs-Screen per Taste auf
    # der Map gerufen werden kann.
    MAP_ACCESS = false
   
    # Wenn MAP_ACCESS = true, wird mit diesem Button (nach Controller-Regelung)
    # der Erfolgs-Screen geöffnet. Die Rückkehr erfolg danach automatisch wieder
    # zurück zur jeweiligen Map. Der Default-Wert "X" wäre in dem Fall zum Bei-
    # spiel die Taste A auf dem Keyboard, wenn man nicht mit F1 die Tastenbele-
    # gung geändert hat.
    MAP_CALL_BUTTON = Input::X
   
    # Dieser Schalter bestimmt, ob Erfolge über das Menü aufgerufen werden kann.
    # Es wird außerdem für die Custom-Menu-Funktionen unten in diesem Modul be-
    # nötigt.
    MENU_ACCESS = true
   
    # Mit dieser Liste bestimmt ihr die Reihenfolge der Menü-Einträge. Aller-
    # dings unterstützt sie nur die Grundelemente und das Erfolgs-Script (Rest
    # muss noch getestet werden). Wer mehr Punkte integrieren möchte, braucht
    # sich nur dieses Script:
    #
    #        http://pockethouse.wordpress.com/vx/scene-menu-redux/
    #
    # zu besorgen und sich darin ein wenig einzuarbeiten. Es ist nicht schwierig.
    #
    # Die ID muss mit den Zahlen in MENU_SORT übereinstimmen, der erste Eintrag
    # im Array ist die Scene, welche aufgerufen wird (wenn Parameter übergeben
    # werden müssen, unterstützt dieses Scriptdabei nur jene aus dem Grundpro-
    # gramm). Der zweite Eintrag schließlich ist der Name, mit welchem die Scenes
    # im Menü eingetragen werden.
    MENU_LIST = {
    # ID   Scene zum Aufruf Name im Menü
      1 => ["Scene_Item", "Item"],
      2 => ["Scene_Skill", "Skill"],
      3 => ["Scene_Equip", "Equip"],
      4 => ["Scene_Status", "Status"],
      5 => ["Scene_File", "Save"],
      6 => ["Scene_End", "Shutdown"],
      7 => ["Scene_Erfolge", ERFOLGE_NAME],
      }
   
    # In dem Array unter diesem Kommentar werden die Aufrufe in der Reihenfolge
    # eingegeben, wie sie im Menü erscheinen sollen. Sie müssen hierbei exakt
    # mit den IDs in MENU_LIST übereinstimmen.
    MENU_SORT = [4, 5, 1, 3, 2, 7, 6]
   
    # Dieser Schalter bestimmt, ob die bisherige Spielzeit im Menü angezeigt wird.
    # Funktioniert nur, wenn "MENU_ACCESS = true".
    SHOW_TIME = false
   
    # In diesem Array müssen alle Scenes stehen, bei welchen man zuvor eine
    # Actor-Auswahl im Menü-Status machen möchte. Standardmäßig sind dies 2 für
    # Skill, 3 für Equip und 4 für Status.
    # Dieses Feature ist noch nicht fertig ausgebaut und unterstützt deshalb nur
    # Skill, Equip und Status, die Zahl, welche man eingibt, gibt die Position an,
    # in welcher der jeweilige Befehl in MENU_SORT drinsteht (beginnt bei 1).
    CHAR_WAHL = [1, 4, 5]
   
    # In der folgenden Liste kannst du alle Erfolge einrichten. Die ID ist die
    # Nummer, mit welcher du Erfolge verwalten kannst, Titel ist der Name des
    # Erfolgs, welcher in der Liste angezeigt wird, Beschreibung sind ein paar
    # nähere Worte zu dem Erfolg und Score ist die Punktzahl, welche er bringt.
    # Bei Beschreibung kann man mit dem Zeichen "|" einen Zeilenumbruch anzeigen.
    # Hierbei empfehle ich aber, nicht mehr als zwei Zeilen zu verwenden, da es
    # sonst wahrscheinlich nicht richtig angezeigt wird (habe es noch nicht ge-
    # testet).
    # Mit Version 0.94 ist eine freiwillige Zeile hinzugekommen. Man kann nun
    # jedem einzelnen Erfolg eine Icon-ID zuweisen, welche nach Erhalt des Erfolgs
    # bei diesem angezeigt wird (vorausgesetzt, ICON_ZEIGEN = true). Man kann die
    # Icon_ID einfach hinter die Position der Punktzahl in den Array schreiben
    # (Komma nicht vergessen).
    ERFOLGE_LISTE = {
    # ID     Titel            Beschreibung                            Score Icon-ID
      1 => ["5 Quests", "Finish your 5. Quest.", 5],
      2 => ["25 Quests", "Finish your 25. Quest.",                  10],
      3 => ["50 Quests", "Finish your 50. Quest.",         25],
      4 => ["100 Quests", "Finish your 100. Quest.", 50]
      }
     
    # Im Event-Command "Advanced - Script" kannst du mit dem Befehl "gib_erfolg(ID)
    # den Erfolg freischalten. Damit wird dem Spieler die Punktzahl des Erfolgs
    # gutgeschrieben und der Erfolg als erhalten gekennzeichnet
   
    # Der Schalter bestimmt, ob ein Icon gezeigt wird oder nicht. Diese Einstellung
    # betrifft ALLE Icon-Optionen des Scripts, also auch jene bei ERFOLGE_LISTE
    ICON_ZEIGEN = true
   
    # Der Schalter bestimmt, ob zusätzlich zu freigeschalteten Erfolgen auch die
    # noch nicht erhaltenen Erfolge ein ICON erhalten, wobei dieses immer dasselbe
    # ist, unabhängig von der Zuweisung bei ERFOLGE_LISTE oder ICON_INDEX.
    ICON_ZEIGEN_UNDONE = true
   
    # Diese Zahl entspricht der Icon-ID, welche angezeigt wird für nicht erhaltene
    # und nicht geheime Erfolge , wenn ICON_ZEIGEN und ICON_ZEIGEN_UNDONE = true.
    ICON_UNDONE = 331
   
    # Dieser Schalter bestimmt, ob (wenn ICON_ZEIGEN_UNDONE = true) die Icons von
    # geheimen Erfolgen versteckt werden sollen. Hierbei bedeutet false, dass die
    # Icons gezeigt werden.
    GEHEIM_ICON_ZEIGEN = true
   
    # Wenn ICON_ZEIGEN und ICON_ZEIGEN_UNDONE = true und ICON_ZEIGEN_VERSTECKEN =
    # false, dann wird für nicht freigeschaltete, geheime Erfolge die Icon-ID,
    # welche in diesem Punkt angegeben ist, angezeigt.
    ICON_GEHEIM = 331
   
    # Gibt den Index des Icons an, welches bei erhaltenen Erfolgen gezeigt wird.
    # Wenn man als Wert 0 eingibt, werden Icons nur dort angezeigt, wo man auch
    # explizit welche wünscht.
    ERHALTEN_ICON_DEFAULT = 516
   
    # In ICON_INDEX kann man jedem Punktwert eine Icon-ID zuweisen, nämlich mit
    # "X => Y" (ohne Anführungszeichen), wobei X der jeweilige Punktwert und Y
    # die dazugehörige Icon-ID ist. Jeder Punktwert, der darin nicht vorkommt,
    # und auch nicht in ERFOLGE_LISTE ist (welche bevorzugt behandelt wird), kriegt
    # automatisch die Icon-ID in ERHALTEN_ICON_DEFAULT zugewiesen.
    ICON_INDEX = {
      5 => 516,
      10 => 516,
      15 => 516, 
    }
   
    # Der Schalter bestimmt, ob erlangte Erfolge eingefärbt werden sollen
    HAT_ERFOLG_FARBE = true
   
    # Gibt die Farbe an, in welche der Erfolg eingefärbt wird.
    ERFOLG_FARBE = 17
    # Für diejenigen, die es nicht wissen: die Farbe richtet sich nach den Flächen
    # unten rechts im Window-Bild, also jener Bild-Datei unter System, welche die
    # Anzeige sämtlicher Windows steuert. Dabei wird in gewohnter Leserichtung
    # durchgezählt, begonnen mit 0.
   
    # Dieser Schalter bestimmt, ob das Punktefenster oben rechts angezeigt wird.
    # Ist dieser Schalter false, wird das erklärende Fenster oben links entspre-
    # chend gestretcht (was einen längeren Erklär-Text ermöglicht)
    SHOW_SCORE_WINDOW = true
   
    # Diese Einstellung steuert die Anzeige des Einzel-Score (also die Darstellung
    # der Erfolgs-Punktzahl eines einzelnen Erfolges). Steht der Wert auf 1, wird
    # die Erfolgs-Punktzahl am rechten Rand hinter dem jeweiligen Titel angezeigt,
    # steht er auf 2 steht er am unteren rechten Rand der Beschreibung. Bei 0 wird
    # der Score nicht angezeigt.
    SHOW_SINGLE_SCORE = 1
   
    # Dieser Text bestimmt, was dem Score hintenangestellt werden soll, wenn die
    # Konstante SHOW_SINGLE_SCORE auf 1 oder 2 steht und der Score über 1 beträgt.
    SINGLE_SCORE_PLUS = " Punkte"
   
    # Dieser Text funktioniert genauso wie SINGLE_SCORE_PLUS, allerdings berück-
    # sichtigt er nur Erfolgs-Punkte, die 1 entsprechen. Soll das Anhängsel bei
    # beiden Fällen gleich sein, einfach dasselbe wie bei SINGLE_SCORE_PLUS ein-
    # bauen. Tipp: Es sieht besser aus, wenn der Text genauso viele Zeichen ent-
    # hält wie jener in SINGLE_SCORE_PLUS.
    SINGLE_SCORE_PLUS_ONE = " Punkt "
   
    # In dieses Feld kannst du einfügen, welcher Text vor der Beschreibung stehen
    # soll. Soll kein Text da stehen, so schreibe "" in das Feld.
    BESCHREIBUNG = "Beschreibung: " # denke an das Leerzeichen, sonst wird es
                                    # gequetscht
   
    # In diese Liste kannst du alle Erfolge aufzählen, welche vor Erhalt nicht
    # näher beschrieben werden, sobald sie (mit "gib_erfolg(ID)") freigeschaltet
    # wurden, werden sie jedoch wie gewohnt angezeigt
    Geheime_Erfolge = []
   
    # Diese Liste funktioniert fast wie die Liste Geheime_Erfolge, nur versteckt
    # sie lediglich den beschreibenden Text, der Titel wird hingegen angezeigt.
    GEHEIME_BESCHREIBUNG = [3]
   
    # Dieser Name wird für den Erfolg angezeigt, wenn er in der Liste Geheime_Erfolge
    # steht und noch nicht freigeschaltet wurde
    GEHEIM_TITEL = "Geheim"
   
    # Diese Beschreibung erhält man, wenn man einen geheimen, nicht freigeschalteten
    # Erfolg anwählt. Genauso wie bei den Beschreibungen in der ERFOLGE_LISTE kann
    # auch diese mit "|" mit Zeilenumbruch versehen werden (trotzdem sollte es bei
    # zwei Zeilen bleiben).
    GEHEIM_BESCHREIBUNG = "Beschreibung: Dies ist ein geheimer Erfolg, du musst ihn erst|freischalten, um ihn betrachten zu können"
   
    # Dieser Schalter bestimmt, ob im Hilfe-Fenster die Zahl der gesammelten/
    # insgesamten Erfolge angezeigt werden sollen
    # Steht der Schalter auf false, sollte der Text in ERFOLGE_HILFE dement-
    # sprechend angepasst werden
    ERFOLGSZAHL_ZEIGEN = true
   
    # Diese Nachricht steht im Hilfe-Fenster, ist "ERFOLGSZAHL_ZEIGEN" (s. oben)
    # true, so wird der Text um X/Y erweitert, wobei X für die Anzahl bereits
    # freigeschalteter Bilder steht und Y für die Gesamtzahl aller Erfolge
    ERFOLGE_HILFE = "Dies sind deine Erfolge. Du hast "
   
    # Dieser Schalter bestimmt, ob bei Erhalt eines Erfolgs die ME, welche in der
    # Database bei "Battle_End" (Default: Victory1) abgespielt wird.
    PLAY_ERFOLG_SOUND = true
  end
end

$imported = {} if $imported == nil
$imported["MK3_Erfolge_Basis"] = true

module MK3::Commands
  def gib_erfolg(id)
    if !$Erfolge_erhalten.include?(id) then
      $Erfolge_erhalten << id
      if MK3::Erfolge::PLAY_ERFOLG_SOUND
        $game_system.battle_end_me.play
      end
    end
  end

  def ruf_erfolg(scene)
    $scene = Scene_Erfolge.new(scene)
  end
end

class Game_Interpreter
  include MK3::Commands
end

class MK3_Commands
  def initialize
  end

  def gib_erfolg(id)
    if !$Erfolge_erhalten.include?(id)
      $Erfolge_erhalten << id
      if MK3::Erfolge::PLAY_ERFOLG_SOUND
        $game_system.battle_end_me.play
      end
    end
  end
end

class Game_System
  alias mk_initialize initialize

  def initialize
    mk_initialize
    $mk = MK3_Commands.new
  end
end

class Window_ErfolgsScore < Window_Base
  def initialize(x, y, width, height)
    super(x, y, width, height)
    create_contents
    now_score = get_score
    text = now_score.to_s + "/" + $score.to_s + " Punkte"
    contents.draw_text (0, 0, contents.width, WLH, text, 1)
  end

  def get_score
    now_score = 0
    for id in $Erfolge_erhalten do
      erfolg = MK3::Erfolge::ERFOLGE_LISTE[id]
      next unless erfolg != nil
        now_score += erfolg[2]
    end
    return now_score
  end
end

class Window_Erfolge < Window_Selectable
  WLH = 24

  def initialize(x, y, width, height, spacing = 76)
    super(x, y, width, height, spacing)
    self.index = 0
    refresh
  end

  def refresh
    self.contents.clear
    @data = []
    MK3::Erfolge::ERFOLGE_LISTE.each_key do |key|
      if $Erfolge_erhalten.include?(key) then
        @data << key
      end
    end
    MK3::Erfolge::ERFOLGE_LISTE.each_key do |key|
      if !$Erfolge_erhalten.include?(key) then
        @data << key
      end
    end
    @item_max = @data.size
    create_contents
    for i in 1...@item_max+1
      draw_erfolg(i)
    end
  end

  def make_icon(id)
    if $Erfolge_erhalten.include?(id)
      get_icon_id = MK3::Erfolge::ERFOLGE_LISTE[id]
      if get_icon_id[3] != nil
        icon_id = get_icon_id[3]
      else
        icon_weiser = []
        MK3::Erfolge::ICON_INDEX.each_key do |key|
          icon_weiser << key
        end
        icon_weiser.each do |id_test|
          if id_test = get_icon_id[2]
            icon_id = MK3::Erfolge::ICON_INDEX[id_test]
          end
        end
      end
    elsif MK3::Erfolge::ICON_ZEIGEN_UNDONE
      if MK3::Erfolge::Geheime_Erfolge.include?(id) or MK3::Erfolge::GEHEIME_BESCHREIBUNG.include?(id)
        if MK3::Erfolge::GEHEIM_ICON_ZEIGEN
          icon_id = MK3::Erfolge::ICON_GEHEIM
        end
      else
        icon_id = MK3::Erfolge::ICON_UNDONE
      end
    end
    draw_icon(icon_id, 0, (WLH * id)-WLH)
  end
   
  def draw_icon(icon_index, x, y, enabled = true)
    bitmap = Cache.system("Iconset")
    rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
    self.contents.blt(x, y, bitmap, rect, enabled ? 255 : 128)
  end

  def draw_erfolg(id)
    contents.font.color = text_color(0)
    erfolg = MK3::Erfolge::ERFOLGE_LISTE[id] # theoretisch mit @data sortierbar
    if MK3::Erfolge::ICON_ZEIGEN
      make_icon(id)
    end
    if MK3::Erfolge::Geheime_Erfolge.include?(id) and !$Erfolge_erhalten.include?(id) then
      text = MK3::Erfolge::GEHEIM_TITEL
    elsif $Erfolge_erhalten.include?(id) then
      if erfolg != nil
        if MK3::Erfolge::HAT_ERFOLG_FARBE
          contents.font.color = text_color(MK3::Erfolge::ERFOLG_FARBE)
        end
        text = erfolg[0]
      end
    else
      if erfolg != nil
        text = erfolg[0]
      end
    end
    case MK3::Erfolge::ICON_ZEIGEN
    when true
      x = 25
      x_width = 480
    else
      x = 0
      x_width = 505
    end
    self.contents.draw_text(x, WLH * (id - 1), x_width, 24, text, 0)
    if MK3::Erfolge::SHOW_SINGLE_SCORE == 1
      case erfolg[2]
      when 1
        bonus = MK3::Erfolge::SINGLE_SCORE_PLUS_ONE
      when nil
        bonus = ""
      else
        bonus = MK3::Erfolge::SINGLE_SCORE_PLUS
      end
      if erfolg[2] != nil
        score = erfolg[2].to_s + bonus
      else
        score = ""
      end
      self.contents.draw_text(x, WLH * (id - 1), x_width, 24, score, 2)
    end
  end
   
  def draw_medal(medal_name, x = 0, y = 0)
    return if medal_name == nil
    bitmap = Cache.picture(medal_name)
    rect = Rect.new(0, 0, 72, 72)
    self.contents.blt(x, y, bitmap, rect)
  end

  def item_rect(index)
    rect = Rect.new(0, 0, 0, 0)
    case MK3::Erfolge::ICON_ZEIGEN
    when true
      x_width = 25
    else
      x_width = 0
    end
    rect.width = ((contents.width + @spacing) / @column_max - @spacing) - x_width
    rect.height = WLH
    rect.x = (index % @column_max * (rect.width + @spacing)) + x_width
    rect.y = index / @column_max * WLH # Faktor muss identisch sein mit y-Faktor bei Titel
    return rect
  end

  def update
    super
  end

  def create_contents
    self.contents.dispose
    self.contents = Bitmap.new(width - 32, [height - 32, row_max * WLH].max)
  end

  def row_max
    return (@item_max + @column_max - 1) / @column_max
  end
end

class Window_ErfolgsBeschreibung < Window_Base
  def initialize(x, y, width, height)
    super(x, y, width, height)
  end
end

class Scene_Title < Scene_Base
  alias mk_start start

  def start
    mk_start
    if $Erfolge_erhalten == nil then
      $Erfolge_erhalten = []
    end
    get_erfolgpoints
  end

  def get_erfolgpoints
    $score = 0
    MK3::Erfolge::ERFOLGE_LISTE.each_value do |val|
      $score += val[2]
    end
  end 
 
  def create_command_window
    s1 = Vocab::new_game
    s2 = Vocab::continue
    s3 = Vocab::shutdown
    if MK3::Erfolge::INTEGRATE_TITLE
      s4 = MK3::Erfolge::ERFOLGE_NAME
      @command_window = Window_Command.new(172, [s1, s2, s4,s3])
      @command_window.y = 288 - 24
    else
      @command_window = Window_Command.new(172, [s1, s2, s3])
      @command_window.y = 288
    end
    @command_window.x = (544 - @command_window.width) / 2
    if @continue_enabled                    # If continue is enabled
      @command_window.index = 1             # Move cursor over command
    else                                    # If disabled
      @command_window.draw_item(1, false)   # Make command semi-transparent
    end
    @command_window.openness = 0
    @command_window.open
  end

  def update
    super
    @command_window.update
    if Input.trigger?(Input::C)
      case @command_window.index
      when 0; command_new_game
      when 1; command_continue
      when 2
        if MK3::Erfolge::INTEGRATE_TITLE
          $scene = Scene_Erfolge.new(Scene_Title)
        else
          command_shutdown
        end
      end
      if MK3::Erfolge::INTEGRATE_TITLE
        case @command_window.index
        when 3
          command_shutdown
        end
      end
    end
  end
end

class Window_Time < Window_Base
  def update(text)
    self.create_contents
    self.contents.draw_text(0, 0, 128, 24, text, 1)
  end
end

class Window_Help_Vary < Window_Base

  def initialize(x = 0, y = 0, width = 544, height = WLH + 32)
    super(x, y, width, height)
  end

  def set_text(text, align = 0)
    if text != @text or align != @align
      self.contents.clear
      self.contents.font.color = normal_color
      self.contents.draw_text(4, 0, self.width - 40, WLH, text, align)
      @text = text
      @align = align
    end
  end
end

class Scene_Menu < Scene_Base
  alias mk_create_command_window create_command_window
  alias mk_update_command_selection update_command_selection
  alias mk_terminate terminate

  def update
    super
    update_menu_background
    @command_window.update
    @gold_window.update
   if MK3::Erfolge::SHOW_TIME
      text = game_time
      @time_window.update(text)
    end
    @status_window.update
    if @command_window.active
      update_command_selection
    elsif @status_window.active
      if MK3::Erfolge::MENU_ACCESS then
        #mk_update_actor_selection
        update_actor_selection
      else
        update_actor_selection
      end
    end
  end

  def terminate
    mk_terminate
   if MK3::Erfolge::SHOW_TIME
      @time_window.dispose
    end
  end

  def game_time(modificate = false)
    @gametime = Graphics.frame_count / Graphics.frame_rate
    hours = @gametime / 3600
    minutes = @gametime / 60 % 60
    seconds = @gametime % 60
    if modificate then
      result = sprintf("%d%02d%02d", hours, minutes, seconds)
    else
      result = sprintf("%d:%02d:%02d", hours, minutes, seconds)
    end
    return result
  end

  def create_command_window
    if MK3::Erfolge::MENU_ACCESS
      if MK3::Erfolge::SHOW_TIME
        @time_window = Window_Time.new(0, 300, 160, 60)
        @time_window.contents.clear
        @time_window.create_contents
        text = game_time
        @time_window.contents.draw_text(0, 0, 24, 128, text, 1)
      end
      @liste = MK3::Erfolge::MENU_SORT
      @command = []
      @liste.each do |id|
        name = MK3::Erfolge::MENU_LIST[id]
        @command << name[1]
      end
      @command_window = Window_Command.new(160, @command)
      @command_window.index = @menu_index
      if $game_party.members.size == 0          # If number of party members is 0
        @command_window.draw_item(0, false)     # Disable item
        @command_window.draw_item(1, false)     # Disable skill
        @command_window.draw_item(2, false)     # Disable equipment
        @command_window.draw_item(3, false)     # Disable status
      end
      if $game_system.save_disabled             # If save is forbidden
        @command_window.draw_item(4, false)     # Disable save
      end
    else
      mk_create_command_window
    end
  end
   
  def update_command_selection
    if MK3::Erfolge::MENU_ACCESS
      if Input.trigger?(Input::B)
        Sound.play_cancel
        $scene = Scene_Map.new
      elsif Input.trigger?(Input::C)
        if $game_party.members.size == 0 and @command_window.index < 4
          Sound.play_buzzer
          return
        elsif $game_system.save_disabled and @command_window.index == 4
          Sound.play_buzzer
          return
        end
        Sound.play_decision
        befehl = @liste
        aufruf = MK3::Erfolge::MENU_LIST[befehl[@command_window.index]]
        if MK3::Erfolge::CHAR_WAHL.include?(@command_window.index + 1)
          start_actor_selection
          return
        end
        scene = aufruf[0] + ".new"
        case scene
        when "Scene_File.new" then
          scene += "(true, false, false)"
        end
        $scene = eval(scene)
      end
    else
      mk_update_command_selection
    end
  end

  def mk_update_actor_selection
    if Input.trigger?(Input::B)
      Sound.play_cancel
      end_actor_selection
    elsif Input.trigger?(Input::C)
      $game_party.last_actor_index = @status_window.index
      Sound.play_decision
      position = MK3::Erfolge::MENU_SORT[@command_window.index]
      from = MK3::Erfolge::MENU_LIST[position]
      if Input.trigger?(Input::C)
        case from[0]
        when "Scene_Skill"  # skill
          $scene = Scene_Skill.new(@status_window.index)
        when "Scene_Equip"  # equipment
          $scene = Scene_Equip.new(@status_window.index)
        when "Scene_Status"  # status
          $scene = Scene_Status.new(@status_window.index)
        end
      end
    end
  end
end

class Scene_Map < Scene_Base
  alias mk_update update

  def update
    mk_update
    if MK3::Erfolge::MAP_ACCESS
      if Input.trigger?(MK3::Erfolge::MAP_CALL_BUTTON)
        $scene = Scene_Erfolge.new(Scene_Map)
      end
    end
  end
end

class Scene_Base
  def get_menu_index(scene)
    MK3::Erfolge::MENU_LIST.each do |key, val|
      if val.include?(scene)
        x = MK3::Erfolge::MENU_SORT.index(key)
        return x != nil ? x : 0
      end
    end
  end
end

class Scene_Item < Scene_Base

  def return_scene
    x = get_menu_index("Scene_Item")
    $scene = Scene_Menu.new(x)
  end
end

class Scene_Skill < Scene_Base

  def return_scene
    x = get_menu_index("Scene_Skill")
    $scene = Scene_Menu.new(x)
  end
end

class Scene_Equip < Scene_Base

  def return_scene
    x = get_menu_index("Scene_Equip")
    $scene = Scene_Menu.new(x)
  end
end

class Scene_Status < Scene_Base

  def return_scene
    x = get_menu_index("Scene_Status")
    $scene = Scene_Menu.new(x)
  end
end

class Scene_File < Scene_Base
  alias mk_write_save_data write_save_data
  alias mk_read_save_data read_save_data

  def return_scene
    if @from_title
      $scene = Scene_Title.new
    elsif @from_event
      $scene = Scene_Map.new
    else
      x = get_menu_index("Scene_File")
      $scene = Scene_Menu.new(x)
    end
  end

  def write_save_data(file)
    mk_write_save_data(file)
    if !MK3::Erfolge::INTEGRATE_TITLE
      Marshal.dump($Erfolge_erhalten, file)
    end
  end

  def read_save_data(file)
    mk_read_save_data(file)
    if !MK3::Erfolge::INTEGRATE_TITLE
      $Erfolge_erhalten = Marshal.load(file)
    end
  end
end

class Scene_End < Scene_Base

  def return_scene
    x = get_menu_index("Scene_End")
    $scene = Scene_Menu.new(x)
  end
end

class Scene_Erfolge < Scene_Base
  def initialize(scene = Scene_Menu)
    @scene = scene
  end

  def start
    create_menu_background
    text = MK3::Erfolge::ERFOLGE_HILFE
    if MK3::Erfolge::ERFOLGSZAHL_ZEIGEN
      text +=  $Erfolge_erhalten.length.to_s + "/" + MK3::Erfolge::ERFOLGE_LISTE.length.to_s
    end
    if MK3::Erfolge::SHOW_SCORE_WINDOW
      @score_window = Window_ErfolgsScore.new(404, 0, 140, 56)
      @help_window = Window_Help_Vary.new(0, 0, 404)
    else
      @help_window = Window_Help_Vary.new
    end
    @help_window.contents.clear
    @help_window.set_text (text, 1)
    @erfolg_titel_window = Window_Erfolge.new(0, 56, 544, 275)
    @erfolg_def_window = Window_ErfolgsBeschreibung.new(0, 331, 544, 85)
    @erfolg_titel_window.active = true
  end

  def terminate
    super
    dispose_menu_background
    @help_window.dispose
    if MK3::Erfolge::SHOW_SCORE_WINDOW
      @score_window.dispose
    end
    @erfolg_titel_window.active = false
    @erfolg_titel_window.dispose
    @erfolg_def_window.dispose
  end

  def update
    super
    update_menu_background
    @erfolg_titel_window.update
    @erfolg_def_window.update
    update_erfolg_def(@erfolg_titel_window.index)
    if Input.trigger?(Input::B)
      Sound.play_cancel
      if @scene == Scene_Menu
        $scene = @scene.new(6)#(get_menu_index("Scene_Erfolge"))
      else
        $scene = @scene.new
      end
    end
  end

  def update_erfolg_def(id)
    id += 1
    erfolg = MK3::Erfolge::ERFOLGE_LISTE[id]
    if (MK3::Erfolge::GEHEIME_BESCHREIBUNG.include?(id) or MK3::Erfolge::Geheime_Erfolge.include?(id)) and !$Erfolge_erhalten.include?(id)
      text = MK3::Erfolge::GEHEIM_BESCHREIBUNG
    else
      text = MK3::Erfolge::BESCHREIBUNG
      text += erfolg[1]
    end
    @erfolg_def_window.contents.clear
    @erfolg_def_window.create_contents
    y = 0
    txsize = 24
    nwidth = 512
    buf = text.gsub(/\\N(\[\d+\])/i) { "\\__#{$1}" }
    lines = buf.split(/(?:[|]|\\n)/i)
    lines.each_with_index { |l, i|
      l.gsub!(/\\__(\[\d+\])/i) { "\\N#{$1}" }
      @erfolg_def_window.contents.draw_text(0, i * txsize + y, nwidth, 24, l, 0)
    }
    if (MK3::Erfolge::SHOW_SINGLE_SCORE == 2)# and (l = i.size)
      case erfolg[2]
      when 1
        bonus = MK3::Erfolge::SINGLE_SCORE_PLUS_ONE
      when nil
        bonus = ""
      else
        bonus = MK3::Erfolge::SINGLE_SCORE_PLUS
      end
      if erfolg[2] != nil
        score = erfolg[2].to_s + bonus
      else
        score = ""
      end
      @erfolg_def_window.contents.draw_text(0, txsize + y, nwidth, 24, score, 2)
    end
  end
end


Lysop


slimmeturq61

#2
HungrySnake here, I guess this is what you want:

http://pastebin.com/X9H6XqXE

Lysop

#3
IN REVISION!

Edit

Thanks for your help, but one thing is missing and there is one bug:

(optional, it would be great if someone could solve this)
- If you want to delete all achievements (really all achievements from all save files) there should be a button in the title screen add-on to delete all achievements without deleting the save files. A button is maybe difficult, because there is no space. It could be a button to press, e.g. "A". Then you will see the option to delete all achievements data from all save files or to leave well alone.
If you load a saved game after deleting all achievements data, every save file has 0 achievements unlocked. Ill hope this is not too complicated. :-\

(really important, please solve this at first)
- The bug is that when you quit the game and start it again, all achievements data are deleted, in the title add-on and in the save files.
Im not sure whether I did sth. wrong, but I tested it in a new project and more than one time.


_____________________________________________________________________________
(optional, it would be great if someone could solve this)
Here is an additional error I have found:



It appears when you use the default icon in line 225.
You have to unlock an achievement with a default icon and look at it in the menu.
Its a general error, so it didnt come with the title add-on.
But it would be great, if someone could solve this error, I dont want to start a new topic for this.

Lysop

I'm here! And I hope a second person, too! :-\

Lysop

One week is over and I'm still alive, wow!  :D

Lysop

I can help you in exchange, too, no problem, but I need a solution :o .