Advertisement
Holy87

Game Updater System - ACE

Apr 24th, 2015
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 48.96 KB | None | 0 0
  1. %Q{
  2.  ==============================================================================
  3.   ■ Sistema di aggiornamenti di gioco di Holy87
  4.       versione 1.2.02
  5.       Difficoltà utente: ★★★★★
  6.       Licenza: CC. Chiunque può scaricare, modificare, distribuire e utilizzare
  7.       lo script nei propri progetti, sia amatoriali che commerciali. Vietata
  8.       l'attribuzione impropria.
  9.  
  10.      Changelog versione 1.2.02
  11.      ● Bugfix
  12.      
  13.      Changelog versione 1.2.01
  14.      ● Il gioco non si blocca più quando si aprono le informazioni via web
  15.        (niubba dimenticanza di riattivare la finestra, invece pensavo che si
  16.        bloccasse il gioco)
  17.      
  18.      Changelog versione 1.2
  19.      ● Il codice aftercode (vedi tutorial) viene eseguito al caricamento del
  20.        gioco, non più alla schermata del titolo.
  21.      ● Aggiunta compatibilità con le opzioni di gioco.
  22.      
  23.      Changelog versione 1.1
  24.      ● Aggiunta compatibilità con menu titolo personalizzato.
  25.      ● Aggiunta la possibilità di visualizzare l'aggiornamento prima di andare
  26.         nella schermata del titolo, per renderlo compatibile con gli script come
  27.         MogHunter
  28.       ● Aggiunta la possibilità di riprodurre un suono se trova un aggiornamento.
  29.  
  30.   ■ Questo script serve a rilevare e scaricare gli aggiornamenti sul gioco.
  31.     Quante volte ti sei accorto di aver fatto grossi errori solo dopo il
  32.     rilascio del gioco completo? Anche se rilasci una versione aggiornata, non
  33.     tutti i giocatori che l'hanno scaricato potrebbero averla o accorgersene.
  34.    Ecco, con questo non avrai più problemi! Sarà il gioco stesso, all'avvio,
  35.     a controllare la presenza di aggiornamenti e ad eventualmente scaricarli!
  36.     L'unica cosa che tu dovrai fare, è configurare le informazioni sugli
  37.    aggiornamenti.
  38.  
  39.  ■ Cose che puoi fare con gli aggiornamenti:
  40.    ● Puoi obbligare l'utente ad aggiornare, altrimenti non può giocare
  41.     ● Puoi inserire descrizioni sintetiche sull'aggiornamento: puoi usare
  42.      anche tutti i caratteri speciali di formattazione, come cambio colore e
  43.      dimensione del testo!
  44.    ● Puoi visualizzare un'immagine (su internet o del gioco) come sfondo della
  45.       schermata degli aggiornamenti
  46.     ● Puoi aprire una pagina web per mostrare al giocatore maggiori dettagli
  47.     ● Eseguire script configurati prima e dopo l'aggiornamento, al caricamento.
  48. ==============================================================================
  49.  ■ Requisiti
  50.    Essendo uno script complesso, richiede alcuni requisiti.
  51.    ● Spazio FTP: Hai bisogno di uno spazio Web. Puoi registrarne uno in modo
  52.      completamente gratuito su Altervista.
  53.    ● Script Modulo Universale di Holy87, versione 1.6 o superiore.
  54.    ● Script PHP per la WebAPI. Se non ce l'hai, puoi trovarlo qui
  55.       http://www.mediafire.com/download/462x7vgpbdub00h/API_Server.zip
  56.     ● Una certa esperienza con il patching. Non ti insegnerò a creare una patch.
  57.  ==============================================================================
  58.   ■ Compatibilità
  59.     Scene_Title           -> alias start, create_command_window
  60.     Window_TitleCommand   -> alias make_command_list
  61.     * maggiori effetti se installato lo script Smooth_movement di Holy87
  62.  ==============================================================================
  63.   ■ Installazione
  64.     Installare questo script sotto Materials e prima del Main.
  65.  ==============================================================================
  66.   ■ Istruzioni
  67.    
  68.   ▼ Configurazione dello script
  69.     Lo script ha una configurazione di base per le stringhe e un'altra per
  70.    configurare il tuo server remoto dove scaricare la patch.
  71.  
  72.    ● COSA IMPORTANTE, configura la variabile Domain (in basso) per l'indirizzo
  73.       in cui si trova il file php del tuo spazio web.
  74.  
  75.     ● Creare nella cartella di gioco un file version.ini con all'interno la
  76.      versione del gioco. La patch dovrà sovrascrivere anche questo file per
  77.      aggiornare la versione di gioco. La versione di gioco può essere
  78.      1.0, 1.2, 1.0.5, 1.2.3.2 ecc... a seconda dei cambiamenti.
  79.      a.b.c.d
  80.      a: Major release (un nuovo capitolo ad esempio, è quasi sempre 1)
  81.      b: Minor release (espansione del gioco con nuovi elementi, nuove funzioni)
  82.      c: Build (correzioni generiche al gioco, risoluzione di bug)
  83.      d: Revisione (piccole modifiche leggere)
  84.  
  85.  ▼ Configurazione dell'aggiornamento
  86.  
  87.     ● La patch d'aggiornamento è un file da scaricare. Consiglio archivi o,
  88.      meglio ancora, file d'installazione auto-configuranti. Puoi inserirla
  89.       sul server stesso o su un altro spazio web remoto.
  90.  
  91.     ● Configura, nella cartella FTP dov'è situata la WebAPI, il file
  92.      updateinfo.xml, che conterrà tutte le informazioni xml dell'aggiornamento
  93.       nel caso esso sia presente. Puoi anche eliminarlo se non ci sono patch.
  94.      
  95.   ▼ Configurazione del file xml per la descrizione dell'aggiornamento
  96.    Il file updateinfo.xml ha questa struttura:
  97.      <?xml version='1.0' encoding='UTF-8'?>
  98.      <update>
  99.        <- qui ci va tutta la roba ->
  100.      </update>
  101.    Inserisci le seguenti tag tra i tag <update> e </update> per descrivere
  102.    l'aggiornamento
  103.  
  104.     ● <version>x.x.x.x</version>
  105.       Numero di versione dell'aggiornamento. Se è superiore alla versione del
  106.      gioco, il gioco notificherà l'aggiornamento. Questo è un campo
  107.       obbligatorio, se si omette non verrà notificato alcun aggiornamento.
  108.  
  109.     ● <filename>patch</filename>
  110.       Nome del file della patch (ad es. Patch_1.05.zip)
  111.       Puoi mettere solo il nome se si trova nella stessa cartella della WebAPI,
  112.       altrimenti dovrai mettere l'indirizzo completo. Esempio
  113.      http://downloadsite.com/Patch_1.05.zip
  114.      Questo è un campo obbligatorio, se si omette potrebbe dare malfunzionamenti.
  115.  
  116.    ● <description>roba</description>
  117.      Porta la descrizione che il giocatore andrà a vedere nella finestra
  118.      d'aggiornamento, come le modifiche che apporterà. Puoi anche andare su
  119.       più righe ed usare i caratteri speciali di RPG Maker per cambiare colore,
  120.       grandezza ecc..., Esempio
  121.       <description>Ciao Mondo!
  122.       Questo è un \c[14]aggiornamento\c[0]
  123.       Bello eh?</description>
  124.       Questo non è un campo obbligatorio, ma è consigliato sempre metterlo per
  125.       dare al giocatore un servizio migliore.
  126.  
  127.     ● <weblink>link</weblink>
  128.       Link ad una pagina internet a discrezione dell'autore. Questa funzione è
  129.      stata pensata per dare all'utente informazioni più dettagliate nel caso
  130.       lo spazio per le descrizioni dell'aggiornamento sia troppo piccolo.
  131.      Questo non è un campo obbligatorio.
  132.  
  133.    ● <image>nomeimmagine</image>
  134.      Mostra un'immagine alternativa allo sfondo della schermata di aggiornamento
  135.       Se è il nome di un'immagine (ad esempio sfondo.png) caricherà un'immagine
  136.       nella cartella pictures del gioco. Se invece è un link a immagine (ad
  137.       esempio http://www.miosito.com/immagine.jpg) lo script scaricherà l'immagine
  138.      dal web e successivamente la applicherà come sfondo della schermata.
  139.      Questo è un campo facoltativo.
  140.  
  141.    ● <forced>true</forced>
  142.      Aggiungi questo campo se vuoi che l'aggiornamento sia forzato.
  143.       L'aggiornamento forzato impedisce al gioco di avviare una nuova partita o
  144.      di caricare il salvataggio se prima non aggiorna il gioco all'ultima
  145.       versione. Questo campo è facoltativo, ma utile nel caso l'aggiornamento
  146.      risolva un errore critico.
  147.  
  148.    ● <codexec>script</codexec>
  149.      Aggiungi questo campo se vuoi che venga eseguito uno script prima di
  150.      applicare la patch. Questa è una funzione per utenti pro e tutta
  151.      facoltativa.
  152.      
  153.    ● <codeafter>script</codeafter>
  154.      Aggiungi questo campo se venga eseguito uno script al caricamento del
  155.      salvataggio precedente all'aggiornamento DOPO l'applicazione di
  156.      una patch, ad esempio per aggiornare alcuni dati di gioco. Anche questa
  157.      è una funzione facoltativa e per utenti pro.
  158.      
  159.  ▼ Creazione delle patch
  160.    Non c'è molto da dire. L'essenziale è mettere in un archivio tutti i file
  161.    del gioco che avete modificato. Ad esempio, se modificate un nemico
  162.    create una cartella Data nell'archivio e inseriteci Enemies.rvdata2, se
  163.     cambiate la WindowSkin create una cartella Graphics\Windows e inserite
  164.     la windowskin. L'importante è rispettare i percorsi, in modo da permettere
  165.    all'utente di fare direttamente copia dall'archivio e incolla nella cartella
  166.    di gioco. Meglio se riuscite a fare una patch auto-installante, ma è troppo
  167.    difficile da spiegare in questo script.
  168.    Meglio se nell'archivio ci metti un file LEGGIMI.txt per indicare al
  169.     giocatore cosa deve fare.
  170. }
  171. #==============================================================================
  172. # ** CONFIGURAZIONE
  173. #------------------------------------------------------------------------------
  174. #  Puoi modificare le preferenze dello script qui
  175. #==============================================================================
  176. module H87Updater
  177.   #--------------------------------------------------------------------------
  178.   # * Configurazione di base
  179.   #--------------------------------------------------------------------------
  180.   #Inserisci in questo campo il link dov'è situata la tua WebAPI. Puoi usare
  181.   #il dominio impostato nel modulo universale con H87_ModConfig::HTTPDOMAIN.
  182.   Domain = H87_ModConfig::HTTPDOMAIN
  183.   #Questo è il nome dello script PHP. Se non hai modificatoi l nome, lascialo
  184.   #così com'è.
  185.   WebAPI = "updateinfo.php"
  186.  
  187.   #--------------------------------------------------------------------------
  188.   # * Stringhe: Queste sono le stringhe di base delle finestre
  189.   #--------------------------------------------------------------------------
  190.   #comando aggiorna nel titolo
  191.   UPDATE_COMMAND = "Aggiorna"
  192.   #testo mostrato nella finestra d'aiuto
  193.   UPDATE_HELP = "Aggiorna il gioco all'ultima versione."
  194.   #comando scarica nella schermata aggiornamenti
  195.   UPDATE_START = "Scarica"
  196.   #comando informazioni nella schermata aggiornamenti
  197.   UPDATE_INFO = "Informazioni"
  198.   #scritta delle dimensioni dell'aggiornamento
  199.   UPDATE_SIZE = "Dimensioni: %10.2f kB"
  200.   #scritta quando il download è in corso
  201.   UPDATE_DOWNLOAD = "Download in corso... %d%%"
  202.   #messaggio d'errore
  203.   SIZE_ERROR = "Impossibile determinare la dimensione."
  204.   #messaggio quando si entra nella schermata
  205.   UPDATE_READY = "L'aggiornamento è pronto per essere scaricato."
  206.   #messaggio quando si calcola la dimensione del file
  207.   UPDATE_SCHK = "Ottengo le dimensioni del file..."
  208.   #messaggio quando il download è completato
  209.   DOWNLOAD_COMPLETED = "Download completato."  
  210.   #messaggio d'aiuto per avviare l'installazione
  211.   DOWNLOAD_TIP = "Premi Invio per installare."
  212.   #--------------------------------------------------------------------------
  213.   # * Stringhe nel menu Opzioni - se hai installato lo script Opzioni di Holy
  214.   #--------------------------------------------------------------------------
  215.   OPT_TEXT = "Controllo aggiornamenti"
  216.   OPT_HELP = "Attiva o disattiva il controllo degli aggiornamenti."
  217.   OPT_ON   = "Attivato"
  218.   OPT_OFF  = "Disattivato"
  219.   #--------------------------------------------------------------------------
  220.   # * Stringhe debug: queste stringhe servono per il debug, puoi ignorarle.
  221.   #--------------------------------------------------------------------------
  222.   DEBUG_CHECK = "Controllo aggiornamenti di gioco..."
  223.   DEBUG_ERROR = "Impossibile connettersi al server per gli aggiornamenti."
  224.   DEBUG_CODERROR = "Il codice non è stato eseguito per la seguente ragione:"
  225.   DEBUG_DOWNLOAD = "Download da "
  226.   DEBUG_COMP = "Download %s completato."
  227.   DEBUG_VERS = "Versione attuale: %s"
  228.   UPDATE_CURRENTV = "Ultima versione disponibile: "
  229.  
  230.   #--------------------------------------------------------------------------
  231.   # * Colori della barra di download
  232.   #--------------------------------------------------------------------------
  233.   # NB: vengono presi i colori del testo della window
  234.   #colore del primo gradiente
  235.   GC1 = 28
  236.   #colore del secondo gradiente
  237.   GC2 = 29
  238.   #suono che viene riprodotto all'avviso dell'aggiornamento. Metti "" se non
  239.   #vuoi alcun suono.
  240.   UpdateFX = "Chime2"
  241.   #--------------------------------------------------------------------------
  242.   # * Opzioni aggiuntive
  243.   #--------------------------------------------------------------------------
  244.   #imposta questo parametro su true se vuoi che lo sfondo delle finestre
  245.   #sparisca quando c'è uno sfondo personalizzato. Falso altrimenti.
  246.   WINDOWS_AUTOPACITY = true
  247.   #Metti questa opzione a true se vuoi che il controllo degli aggiornamenti
  248.   #venga proposto prima della schermata del titolo. Questa opzione è utile se
  249.   #usi uno script per la schermata del titolo non compatibile con il sistema
  250.   #d'aggiornamenti.
  251.   PRETITLE_CHECK = false
  252.   #richiesta d'aggiornamento nella schermata prima del titolo
  253.   UPDATE_PRETITLE = "C'è un nuovo aggiornamento del gioco.
  254. Vuoi aggiornare ora?"
  255.   PRETITLE_YES = "Sì"
  256.   PRETITLE_NOT = "No"
  257.   #NEL CASO USI IL MENU TITOLO PERSONALIZZATO DI HOLY87
  258.   #seleziona le immagini che verranno mostrate come comandi della schermata
  259.   TITLE_ICON = "updater icon"
  260.   TITLE_BALOON = "updater baloon"
  261.  
  262. #--------------------- FINE DELLA CONFIGURAZIONE ----------------------------
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274. $imported = {} if $imported == nil
  275. $imported["H87_Updater"] = 1.2
  276. #==============================================================================
  277. # ** H87Updater
  278. #------------------------------------------------------------------------------
  279. #  Modulo degli aggiornamenti
  280. #==============================================================================
  281.   #--------------------------------------------------------------------------
  282.   # * Aggiornamento disponibile?
  283.   #     true se c'è un aggiornamento disponibile
  284.   #--------------------------------------------------------------------------
  285.   def self.update_avaiable?
  286.     return false if update_disabled?
  287.     return @update_avaiable unless @update_avaiable.nil?
  288.     println DEBUG_CHECK
  289.     println sprintf(DEBUG_VERS, $game_system.game_version.to_s)
  290.     begin
  291.       update_version = get_update_version
  292.     rescue UpdateCheckError
  293.       println $!.message
  294.       return false
  295.     end
  296.     @update_avaiable = $game_system.game_version < update_version
  297.     println UPDATE_CURRENTV + update_version.to_s
  298.     return @update_avaiable
  299.   end
  300.   #--------------------------------------------------------------------------
  301.   # * Ottiene la versione dell'ultimo aggiornamento
  302.   #--------------------------------------------------------------------------
  303.   def self.get_update_version
  304.     response = HTTP.await_get_server_response(Domain+"/"+WebAPI+"?get=version")
  305.     unless HTTP.check_response(response)
  306.       raise UpdateCheckError.new(DEBUG_ERROR)
  307.     end
  308.     version = Game_Version.new(response, 0)
  309.     if version == "0.0.0.0"
  310.       raise UpdateCheckError.new(response)
  311.     end
  312.     return version
  313.   end
  314.   #--------------------------------------------------------------------------
  315.   # * Restituisce se l'aggiornamento è forzato
  316.   #--------------------------------------------------------------------------
  317.   def self.forced_update?
  318.     if @forced.nil?
  319.       response = HTTP.await_get_server_response(Domain+"/"+WebAPI+"?get=forced")
  320.       unless HTTP.check_response(response)
  321.         raise UpdateCheckError.new(DEBUG_ERROR)
  322.       end
  323.       @forced = response =~ /[.]*true[.]*/i
  324.     end
  325.     return @forced
  326.   end    
  327.   #--------------------------------------------------------------------------
  328.   # * Scarica le informazioni sull'aggiornamento e restituisce l'oggetto
  329.   #     UpdateInfo
  330.   #--------------------------------------------------------------------------
  331.   def self.get_update_info
  332.     response = HTTP.await_get_server_response(Domain+"/"+WebAPI+"?get=all")
  333.     unless HTTP.check_response(response)
  334.       raise UpdateInfoError.new(DEBUG_ERROR)
  335.     end
  336.     unless response =~ /[.]*|[.]*/
  337.       raise UpdateCheckError.new(response)
  338.     end
  339.     return UpdateInfo.new(response)
  340.   end
  341.   #--------------------------------------------------------------------------
  342.   # * Stesso metodo di update_avaiable?
  343.   #--------------------------------------------------------------------------
  344.   def self.new_update?
  345.     return update_avaiable?
  346.   end
  347.   #--------------------------------------------------------------------------
  348.   # * Crea e restituisce la cartella di download dei file
  349.   #--------------------------------------------------------------------------
  350.   def self.download_folder
  351.     dir = "./Temp/"
  352.     Dir.mkdir(dir) unless File.directory?(dir)
  353.     dir
  354.   end
  355.   #--------------------------------------------------------------------------
  356.   # * Restituisce true se il controllo aggiornamento è disattivato dall'utente.
  357.   #--------------------------------------------------------------------------
  358.   def self.update_disabled?
  359.     return false unless $imported["H87_Options"]
  360.     return false if $game_settings["upd_opt"].nil?
  361.     return !$game_settings["upd_opt"]
  362.   end
  363.   #--------------------------------------------------------------------------
  364.   # * Inserimento del controllo nelle opzioni di gioco
  365.   #--------------------------------------------------------------------------
  366.   if $imported["H87_Options"]
  367.     hash = {:type => :switch, :sw => "upd_opt", :text => OPT_TEXT,
  368.             :help => OPT_HELP, :on => OPT_ON, :off => OPT_OFF, :default => true}
  369.     H87Options.push_internet_option(hash)
  370.   end
  371. end
  372.  
  373. #==============================================================================
  374. # ** UpdateCheckError e UpdateInfoError
  375. #------------------------------------------------------------------------------
  376. # Due classi che generano eccezioni
  377. #==============================================================================
  378. class UpdateCheckError < StandardError; end
  379. class UpdateInfoError < StandardError; end
  380.  
  381. #==============================================================================
  382. # ** UpdateInfo
  383. #------------------------------------------------------------------------------
  384. # Contiene le informazioni dell'aggiornamento
  385. #==============================================================================
  386. class UpdateInfo
  387.   attr_reader :version            #numero di versione aggiornamento
  388.   attr_reader :forced             #aggiornamento forzato?
  389.   attr_reader :weblink            #link delle informazioni
  390.   attr_reader :image              #immagine di sfondo dell'aggiornamento
  391.   attr_reader :filename           #nome del file d'aggiornamento
  392.   attr_reader :filelink           #link del file d'aggiornamento
  393.   attr_reader :description        #descrizione dell'aggiornamento
  394.   attr_reader :code_execution     #esecuzione del codice prima di aggiornare
  395.   attr_reader :code_after_update  #esecuzione del codice al primo avvio dopo agg
  396.   #--------------------------------------------------------------------------
  397.   # * Inizializzazione
  398.   #     update_string: stringa con le informazioni dell'agg. separate da |
  399.   #--------------------------------------------------------------------------
  400.   def initialize(update_string)
  401.     info = update_string.split("|")
  402.     @version = Game_Version.new(info[0])
  403.     @forced = info[1] == "true" ? true : false
  404.     @weblink = info[2].size > 0 ? info[2] : nil
  405.     @image = info[3].size > 0 ? info[3] : nil
  406.     @filelink = info[4]
  407.     @filename = File.basename(@filelink)
  408.     @description = info[5]
  409.     @code_execution = info[6]
  410.     @code_after_update = info[7]
  411.   end
  412.   #--------------------------------------------------------------------------
  413.   # * Restituisce true se è un'immagine locale
  414.   #--------------------------------------------------------------------------
  415.   def local_image?
  416.     return false if @image.nil?
  417.     return false if weblink?(@image)
  418.     return true
  419.   end
  420.   #--------------------------------------------------------------------------
  421.   # * Restituisce true se c'è un link alla pagina delle informazioni
  422.   #--------------------------------------------------------------------------
  423.   def i_link?
  424.     return @weblink != nil && @weblink != ""
  425.   end
  426.   #--------------------------------------------------------------------------
  427.   # * Restituisce true se la stringa è un link web
  428.   #--------------------------------------------------------------------------
  429.   def weblink?(link)
  430.     return link  =~ /[ ]*http[s]?:\/\//i
  431.   end
  432.   #--------------------------------------------------------------------------
  433.   # * Restuisce il link reale dove risiede la patch.
  434.   #--------------------------------------------------------------------------
  435.   def patch_truelink
  436.     return @filelink if weblink?(@filelink)
  437.     return H87Updater::Domain + "/" + @filelink
  438.   end
  439. end #updateinfo
  440.  
  441. #==============================================================================
  442. # ** Vocab
  443. #------------------------------------------------------------------------------
  444. # Aggiunta dei vocaboli nuovi
  445. #==============================================================================
  446. module Vocab
  447.   #--------------------------------------------------------------------------
  448.   # * Vocabolo comando aggiorna
  449.   #--------------------------------------------------------------------------
  450.   def self.update
  451.     H87Updater::UPDATE_COMMAND
  452.   end
  453. end #vocab
  454.  
  455. #==============================================================================
  456. # ** Game_System
  457. #------------------------------------------------------------------------------
  458. # Aggiunta dell'ultima versione del gioco presa dal salvataggio.
  459. #==============================================================================
  460. class Game_System
  461.   alias h87updater_oal on_after_load unless $@
  462.   #--------------------------------------------------------------------------
  463.   # * Restuisce l'ultima versione del salvataggio
  464.   #--------------------------------------------------------------------------
  465.   def last_game_version
  466.     update_version if @last_game_version.nil?
  467.     return @last_game_version
  468.   end
  469.   #--------------------------------------------------------------------------
  470.   # * Aggiorna la versione del salvataggio a quella attuale
  471.   #--------------------------------------------------------------------------
  472.   def update_version
  473.     @last_game_version = $game_system.game_version
  474.   end
  475.   #--------------------------------------------------------------------------
  476.   # * Alias del metodo per la fine del caricamento del salvataggio
  477.   #--------------------------------------------------------------------------
  478.   def on_after_load
  479.     h87updater_oal
  480.     check_aftercode
  481.   end
  482.   #--------------------------------------------------------------------------
  483.   # * Controlla che il codice venga eseguito
  484.   #--------------------------------------------------------------------------
  485.   def check_aftercode
  486.     return if last_game_version >= $game_system.game_version
  487.     return if $game_settings[:aftercode].nil?
  488.     $game_settings[:aftercode].each_pair do |version, code|
  489.       next if version.nil?
  490.       next if version == ""
  491.       next if version <= last_game_version
  492.       begin
  493.         eval(code)
  494.       rescue
  495.         println H87Updater::DEBUG_CODERROR
  496.         println $!.message
  497.       end
  498.     end
  499.     update_version
  500.   end
  501. end #game_system
  502.  
  503. #==============================================================================
  504. # ** Scene_Title
  505. #------------------------------------------------------------------------------
  506. # Aggiunta del comando d'aggiornamento
  507. #==============================================================================
  508. class Scene_Title < Scene_Base
  509.   alias h87updater_ccw create_command_window unless $@
  510.   alias h87updater_stt start unless $@
  511.   #--------------------------------------------------------------------------
  512.   # * Alias metodo start
  513.   #--------------------------------------------------------------------------
  514.   def start
  515.     flush_temp
  516.     h87updater_stt
  517.     #exec_aftercode > decommenta se vuoi che il codice venga eseguito qui
  518.   end
  519.   #--------------------------------------------------------------------------
  520.   # * Creazione della finestra dei comandi
  521.   #--------------------------------------------------------------------------
  522.   def create_command_window
  523.     h87updater_ccw
  524.     @command_window.set_handler(:update, method(:command_update))
  525.   end
  526.   #--------------------------------------------------------------------------
  527.   # * Azione del comando d'aggiornamento
  528.   #--------------------------------------------------------------------------
  529.   def command_update
  530.     SceneManager.call(Scene_Updater)
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # * Svuota la cartella temporanea
  534.   #--------------------------------------------------------------------------
  535.   def flush_temp
  536.     Dir.foreach(H87Updater.download_folder) do |file|
  537.       File.delete(H87Updater.download_folder+file) rescue next
  538.     end
  539.   end      
  540.   #--------------------------------------------------------------------------
  541.   # * Esegue il codice quando l'aggiornamento ha avuto successo
  542.   #--------------------------------------------------------------------------
  543.   def exec_aftercode
  544.     return if $game_settings[:aftercode].nil?
  545.     return if $game_settings[:aftercode][$game_system.game_version.to_s].nil?
  546.     return if $game_settings[:aftercode][$game_system.game_version.to_s] == ""
  547.     begin
  548.       eval($game_settings[:aftercode][$game_system.game_version.to_s])
  549.     rescue
  550.       println H87Updater::DEBUG_CODERROR
  551.       println $!.message
  552.     end
  553.     $game_settings[:aftercode].delete($game_system.game_version.to_s)
  554.     $game_settings.save
  555.   end
  556.   #--------------------------------------------------------------------------
  557.   # * Aggiunta del comando del menu titolo personalizzato
  558.   #--------------------------------------------------------------------------
  559.   if $imported["H87_TitleMenu"]
  560.   alias h87updater_ccp crea_contenuti_personalizzati
  561.   def crea_contenuti_personalizzati
  562.     h87updater_ccp
  563.     if H87Updater.update_avaiable?
  564.       add_cursor(:update,:command_update,H87Updater::TITLE_ICON,H87Updater::TITLE_BALOON)
  565.     end
  566.   end;end
  567. end #scene_title
  568.  
  569. #==============================================================================
  570. # ** Window_TitleCommand
  571. #------------------------------------------------------------------------------
  572. # Aggiunta del controllo e comando aggiornamento
  573. #==============================================================================
  574. class Window_TitleCommand < Window_Command
  575.   alias h87updater_make_command_list  make_command_list unless $@
  576.   #--------------------------------------------------------------------------
  577.   # * Aggiunta del comando di aggiornamento (solo se è disponibile)
  578.   #--------------------------------------------------------------------------
  579.   def make_command_list
  580.     if update_avaiable? && !H87Updater::PRETITLE_CHECK
  581.       add_command(Vocab::update, :update)
  582.       RPG::SE.new(H87Updater::UpdateFX).play
  583.     end
  584.     h87updater_make_command_list
  585.     check_forced_update if update_avaiable?
  586.   end
  587.   #--------------------------------------------------------------------------
  588.   # * Controllo dell'aggiornamento
  589.   #--------------------------------------------------------------------------
  590.   def update_avaiable?
  591.     return H87Updater.new_update?
  592.   end
  593.   #--------------------------------------------------------------------------
  594.   # * Controlla se l'aggiornamento è forzato e disabilita i comandi
  595.   #--------------------------------------------------------------------------
  596.   def check_forced_update
  597.     return unless forced_update?
  598.     @list.each do |command|
  599.       if command[:symbol] == :new_game || command[:symbol] == :continue
  600.         command[:enabled] = false
  601.       end
  602.     end
  603.   end
  604.   #--------------------------------------------------------------------------
  605.   # * Restituisce true se l'aggiornamento è forzato
  606.   #--------------------------------------------------------------------------
  607.   def forced_update?
  608.     return H87Updater.forced_update?
  609.   end
  610. end #window_titlecommand
  611.  
  612. #==============================================================================
  613. # ** Scene_Updater
  614. #------------------------------------------------------------------------------
  615. # La schermata dell'aggiornamento del gioco
  616. #==============================================================================
  617. class Scene_Updater < Scene_MenuBase
  618.   #--------------------------------------------------------------------------
  619.   # * Inizio
  620.   #--------------------------------------------------------------------------
  621.   def start
  622.     super
  623.     get_update_info                 #ottenimento delle informazioni
  624.     create_help_window              #creazione della finestra d'aiuto
  625.     create_command_window           #creazione della finestra comandi
  626.     create_download_window          #creazione della finestra download
  627.     create_info_window              #creazione della finestra informazioni
  628.     check_wallpaper_background      #controllo dello sfondo personalizzato
  629.   end
  630.   #--------------------------------------------------------------------------
  631.   # * Ottiene tutte le informazioni sull'aggiornamento
  632.   #--------------------------------------------------------------------------
  633.   def get_update_info
  634.     @update_info = H87Updater.get_update_info
  635.   end
  636.   #--------------------------------------------------------------------------
  637.   # * Crea la finestra d'aiuto
  638.   #--------------------------------------------------------------------------
  639.   def create_help_window
  640.     @help_window = Window_Help.new(1)
  641.    
  642.     @help_window.set_text(H87Updater::UPDATE_HELP)
  643.   end
  644.   #--------------------------------------------------------------------------
  645.   # * Crea la finestra dei comandi
  646.   #--------------------------------------------------------------------------
  647.   def create_command_window
  648.     y = @help_window.height
  649.     @command_window = Window_UpdateCommand.new(0, y, @update_info.i_link?)
  650.     @command_window.set_handler(:info, method(:launch_webInfo))
  651.     @command_window.set_handler(:download, method(:patch_download))
  652.     @command_window.set_handler(:cancel, method(:return_scene))
  653.   end
  654.   #--------------------------------------------------------------------------
  655.   # * Crea la finestra di donwnload e info
  656.   #--------------------------------------------------------------------------
  657.   def create_download_window
  658.     x = @command_window.width
  659.     y = @command_window.y
  660.     w = Graphics.width - x
  661.     h = @command_window.height
  662.     @download_window = Window_PatchDownload.new(x, y, w, h, @update_info)
  663.   end
  664.   #--------------------------------------------------------------------------
  665.   # * Crea la finestra delle descrizioni dell'aggiornamento
  666.   #--------------------------------------------------------------------------
  667.   def create_info_window
  668.     y = @command_window.y + @command_window.height
  669.     w = Graphics.width
  670.     h = Graphics.height - y
  671.     @info_window = Window_UpdateInfo.new(0, y, w, h, @update_info.description)
  672.   end
  673.   #--------------------------------------------------------------------------
  674.   # * Torna alla schermata precedente, o chiude il gioco se è forzato
  675.   #--------------------------------------------------------------------------
  676.   def return_scene
  677.     unless H87Updater::PRETITLE_CHECK
  678.       super
  679.     else
  680.       if H87Updater.forced_update?
  681.         SceneManager.exit
  682.       else
  683.         SceneManager.goto(SceneManager.h87updater_first_scene_class)
  684.       end
  685.     end
  686.   end
  687.   #--------------------------------------------------------------------------
  688.   # * Controlla se c'è uno sfondo del sistema d'aggiornamenti
  689.   #--------------------------------------------------------------------------
  690.   def check_wallpaper_background
  691.     @background = Sprite.new
  692.     @background.opacity = 0
  693.     return if @update_info.image.nil?
  694.     if @update_info.local_image?
  695.       set_image_background(Cache.picture(@update_info.image))
  696.     else
  697.       println(H87Updater::DEBUG_DOWNLOAD + @update_info.image)
  698.       folder = H87Updater.download_folder
  699.       url = @update_info.image
  700.       download_async(url, method(:image_downloaded), folder, false)
  701.     end
  702.   end
  703.   #--------------------------------------------------------------------------
  704.   # * Viene chiamato al download completato dell'immagine remota
  705.   #--------------------------------------------------------------------------
  706.   def image_downloaded
  707.     imgname = File.basename(@update_info.image)
  708.     println(sprintf(H87Updater::DEBUG_COMP, imgname))
  709.     background_bitmap = Cache.load_bitmap(H87Updater.download_folder,imgname)
  710.     set_image_background(background_bitmap)
  711.   end
  712.   #--------------------------------------------------------------------------
  713.   # * Imposta lo sfondo della schermata
  714.   #     bitmap: nuova bitmap
  715.   #--------------------------------------------------------------------------
  716.   def set_image_background(bitmap)
  717.     @background.bitmap = bitmap
  718.     @background.zoom_x = Graphics.width.to_f/@background.width.to_f
  719.     @background.zoom_y = Graphics.height.to_f/@background.height.to_f
  720.   end
  721.   #--------------------------------------------------------------------------
  722.   # * Aggiornamento
  723.   #--------------------------------------------------------------------------
  724.   def update
  725.     super
  726.     update_background
  727.     update_download_command
  728.   end
  729.   #--------------------------------------------------------------------------
  730.   # * Fine
  731.   #--------------------------------------------------------------------------
  732.   def terminate
  733.     super
  734.     @background.dispose
  735.   end
  736.   #--------------------------------------------------------------------------
  737.   # * Aggiornamento dello sfondo
  738.   #--------------------------------------------------------------------------
  739.   def update_background
  740.     return if @background.bitmap.nil?
  741.     @background.opacity += 2
  742.     if H87Updater::WINDOWS_AUTOPACITY
  743.       @help_window.opacity -= 2
  744.       @command_window.opacity -=2
  745.       @info_window.opacity -= 2
  746.       @download_window.opacity -= 2
  747.     end
  748.   end
  749.   #--------------------------------------------------------------------------
  750.   # * Aggiornamento dei comandi dopo il download
  751.   #--------------------------------------------------------------------------
  752.   def update_download_command
  753.     return unless @download_window.download_completed?
  754.     return_scene if Input.trigger?(:B)
  755.     start_patch if Input.trigger?(:C)
  756.   end
  757.   #--------------------------------------------------------------------------
  758.   # * Lancia il sito delle informazioni sul browser
  759.   #--------------------------------------------------------------------------
  760.   def launch_webInfo
  761.     Sound.play_ok
  762.     Browser.open(@update_info.weblink)
  763.     @command_window.activate
  764.   end
  765.   #--------------------------------------------------------------------------
  766.   # * Scarica la patch
  767.   #--------------------------------------------------------------------------
  768.   def patch_download
  769.     @download_window.width = Graphics.width
  770.     if $imported["H87_SmoothMovements"]
  771.       @command_window.smooth_move(0-@command_window.width, @command_window.y)
  772.       @download_window.smooth_move(0, @download_window.y)
  773.     else
  774.       @command_window.visible = false
  775.       @download_window.x = 0
  776.     end
  777.     @download_window.download_start
  778.   end
  779.   #--------------------------------------------------------------------------
  780.   # * Esegue la patch scaricata
  781.   #--------------------------------------------------------------------------
  782.   def start_patch
  783.     exec_code
  784.     register_aftercode
  785.     exec_patch
  786.     sleep(0.1)
  787.     close_game
  788.   end
  789.   #--------------------------------------------------------------------------
  790.   # * Esegue il codice personalizzato (se presente)
  791.   #--------------------------------------------------------------------------
  792.   def exec_code
  793.     return if @update_info.code_execution.nil?
  794.     return if @update_info.code_execution == ""
  795.     begin
  796.       eval(@update_info.code_execution)
  797.     rescue
  798.       println H87Updater::DEBUG_CODERROR
  799.       println $!.message
  800.     end
  801.   end
  802.   #--------------------------------------------------------------------------
  803.   # * Registra il codice personalizzato dopo la patch
  804.   #--------------------------------------------------------------------------
  805.   def register_aftercode
  806.     code = @update_info.code_after_update
  807.     $game_settings[:aftercode] = {} if $game_settings[:aftercode].nil?
  808.     $game_settings[:aftercode][@update_info.version.to_s] = code
  809.     $game_settings.save
  810.   end
  811.   #--------------------------------------------------------------------------
  812.   # * Apre la patch scaricata
  813.   #--------------------------------------------------------------------------
  814.   def exec_patch
  815.     path = File.expand_path(H87Updater.download_folder)
  816.     file = sprintf("explorer %s/%s", path, @update_info.filename)
  817.     Thread.new{system(file.gsub("/","\\"))}
  818.   end
  819.   #--------------------------------------------------------------------------
  820.   # * Chiude il gioco
  821.   #--------------------------------------------------------------------------
  822.   def close_game
  823.     SceneManager.exit
  824.   end
  825. end #scene_update
  826.  
  827. #==============================================================================
  828. # ** Window_UpdateCommand
  829. #------------------------------------------------------------------------------
  830. # Finestra dei comandi della schermata di aggiornamento
  831. #==============================================================================
  832. class Window_UpdateCommand < Window_Command
  833.   #--------------------------------------------------------------------------
  834.   # * Inizializzazione
  835.   #     x: coordinata X
  836.   #     y: coordinata Y
  837.   #     info: informazione attivata?
  838.   #--------------------------------------------------------------------------
  839.   def initialize(x, y, info)
  840.     @info_enabled = info
  841.     super(x, y)
  842.   end
  843.   #--------------------------------------------------------------------------
  844.   # * Genera la lista dei comandi
  845.   #--------------------------------------------------------------------------
  846.   def make_command_list
  847.     add_command(H87Updater::UPDATE_START, :download)
  848.     add_command(H87Updater::UPDATE_INFO, :info, @info_enabled)
  849.   end
  850. end
  851. #==============================================================================
  852. # ** Window_PatchDownload
  853. #------------------------------------------------------------------------------
  854. # Finestra di download della patch (e dettagli)
  855. #==============================================================================
  856. class Window_PatchDownload < Window_Base
  857.   #--------------------------------------------------------------------------
  858.   # * Inizializzazione
  859.   #     x: coordinata X
  860.   #     y: coordinata Y
  861.   #     w: larghezza
  862.   #     h: altezza
  863.   #     info: oggetto Updater_Info con la descrizione dell'aggiornamento
  864.   #--------------------------------------------------------------------------
  865.   def initialize(x, y, w, h, info)
  866.     super(x, y, w, h)
  867.     @info = info
  868.     @state = 0
  869.     refresh
  870.     check_download_size
  871.   end
  872.   #--------------------------------------------------------------------------
  873.   # * Refresh
  874.   #--------------------------------------------------------------------------
  875.   def refresh
  876.     case @state
  877.     when 0
  878.       create_initial_content
  879.     when 1
  880.       draw_download_state
  881.     when 2
  882.       draw_final_text
  883.     end
  884.   end
  885.   #--------------------------------------------------------------------------
  886.   # * Aggiornamento
  887.   #--------------------------------------------------------------------------
  888.   def update
  889.     super
  890.     refresh if downloading?
  891.   end
  892.   #--------------------------------------------------------------------------
  893.   # * Controlla le dimensioni della patch
  894.   #--------------------------------------------------------------------------
  895.   def check_download_size
  896.     if @info.weblink?(@info.filelink)
  897.       sizeloaded(HTTP.get_file_size(@info.patch_truelink))
  898.     else
  899.       url = H87Updater::Domain+"/"+H87Updater::WebAPI+"?get=size"
  900.       get_response_async(url, method(:sizeloaded))
  901.     end
  902.   end
  903.   #--------------------------------------------------------------------------
  904.   # * Crea il contenuto iniziale
  905.   #--------------------------------------------------------------------------
  906.   def create_initial_content
  907.     change_color(power_down_color)
  908.     draw_text(line_rect(0), $game_system.game_version)
  909.     change_color(power_up_color)
  910.     draw_text(line_rect(0), @info.version, 2)
  911.     change_color(normal_color)
  912.     draw_text(line_rect(0), "->", 1)
  913.     draw_text(0, ln(1), contents_width, line_height, H87Updater::UPDATE_SCHK)
  914.   end
  915.   #--------------------------------------------------------------------------
  916.   # * Inizia il download
  917.   #--------------------------------------------------------------------------
  918.   def download_start
  919.     create_contents
  920.     @state = 1
  921.     @old_perc = 0
  922.     folder = H87Updater.download_folder
  923.     url = @info.patch_truelink
  924.     download_async(url, method(:download_complete), folder, false)
  925.   end    
  926.   #--------------------------------------------------------------------------
  927.   # * Disegna lo stato del download
  928.   #--------------------------------------------------------------------------
  929.   def draw_download_state
  930.     progress = download_status(@info.filename)
  931.     return if progress.to_i == @old_perc
  932.     clear_line(0)
  933.     text = sprintf(H87Updater::UPDATE_DOWNLOAD, progress)
  934.     draw_text(line_rect(0), text)
  935.     rect = line_rect(1)
  936.     draw_gauge(rect.x, rect.y, rect.width, progress/100.0, gauge1, gauge2)
  937.     @old_perc = progress.to_i
  938.   end
  939.   #--------------------------------------------------------------------------
  940.   # * Download completato
  941.   #--------------------------------------------------------------------------
  942.   def download_complete
  943.     @state = 2
  944.     refresh
  945.   end
  946.   #--------------------------------------------------------------------------
  947.   # * Disegna il testo di download completato
  948.   #--------------------------------------------------------------------------
  949.   def draw_final_text
  950.     contents.clear
  951.     draw_text(line_rect(0),H87Updater::DOWNLOAD_COMPLETED)
  952.     draw_text(line_rect(1),H87Updater::DOWNLOAD_TIP)
  953.   end
  954.   #--------------------------------------------------------------------------
  955.   # * Restituisce true se sta scaricando
  956.   #--------------------------------------------------------------------------
  957.   def downloading?
  958.     @state == 1
  959.   end
  960.   #--------------------------------------------------------------------------
  961.   # * Restituisce true se il download è completato
  962.   #--------------------------------------------------------------------------
  963.   def download_completed?
  964.     @state == 2
  965.   end
  966.   #--------------------------------------------------------------------------
  967.   # * Restituisce la coordinata y della linea
  968.   #--------------------------------------------------------------------------
  969.   def ln(number)
  970.     line_height*number
  971.   end
  972.   #--------------------------------------------------------------------------
  973.   # * Viene chiamato quando si ottiene la dimensione del file
  974.   #     value: dimensione del file
  975.   #--------------------------------------------------------------------------
  976.   def sizeloaded(value)
  977.     return if @downloaded
  978.     clear_line(1)
  979.     begin
  980.       value = value.to_i
  981.       text = sprintf(H87Updater::UPDATE_SIZE, value/1000.0)
  982.     rescue
  983.       text = sprintf(H87Updater::SIZE_ERROR)
  984.     end
  985.     draw_text(0,ln(1),contents_width,line_height, text)
  986.   end
  987.   #--------------------------------------------------------------------------
  988.   # * Ottiene il rettangolo della linea
  989.   #--------------------------------------------------------------------------
  990.   def line_rect(line)
  991.     Rect.new(0, line_height*line, contents_width, line_height)
  992.   end
  993.   #--------------------------------------------------------------------------
  994.   # * Pulisce la linea
  995.   #--------------------------------------------------------------------------
  996.   def clear_line(line)
  997.     contents.clear_rect(line_rect(line))
  998.   end
  999.   #--------------------------------------------------------------------------
  1000.   # * Restituisce i colori della barra
  1001.   #--------------------------------------------------------------------------
  1002.   def gauge1; text_color(H87Updater::GC1); end
  1003.   def gauge2; text_color(H87Updater::GC2); end
  1004. end #window_info
  1005.  
  1006. #==============================================================================
  1007. # ** Window_UpdateInfo
  1008. #------------------------------------------------------------------------------
  1009. # Finestra che mostra la descrizione dell'aggiornamento
  1010. #==============================================================================
  1011. class Window_UpdateInfo < Window_Base
  1012.   #--------------------------------------------------------------------------
  1013.   # * Iniaizlizzazione
  1014.   #     text: testo di descrizione
  1015.   #--------------------------------------------------------------------------
  1016.   def initialize(x, y, w, h, text)
  1017.     super(x, y, w, h)
  1018.     @text = text
  1019.     refresh
  1020.   end
  1021.   #--------------------------------------------------------------------------
  1022.   # * Refresh
  1023.   #--------------------------------------------------------------------------
  1024.   def refresh
  1025.     contents.clear
  1026.     draw_text_ex(4, 0, @text.gsub(" ",""))
  1027.   end
  1028. end
  1029.  
  1030. #==============================================================================
  1031. # ** SceneManager
  1032. #------------------------------------------------------------------------------
  1033. # Cambio della prima schermata
  1034. #==============================================================================
  1035. module SceneManager
  1036.   class << self
  1037.     alias h87updater_first_scene_class first_scene_class
  1038.   end
  1039.   #--------------------------------------------------------------------------
  1040.   # * Cambio della prima schermata
  1041.   #--------------------------------------------------------------------------
  1042.   def self.first_scene_class
  1043.     return h87updater_first_scene_class unless H87Updater::PRETITLE_CHECK
  1044.     return h87updater_first_scene_class if @update_checked
  1045.     return h87updater_first_scene_class unless H87Updater.update_avaiable?
  1046.     @update_checked = true
  1047.     return Scene_UpdateCheck
  1048.   end
  1049. end #scenemanager
  1050.  
  1051. #==============================================================================
  1052. # ** Scene_UpdateCheck
  1053. #------------------------------------------------------------------------------
  1054. # Schermata di richiesta d'aggiornamento prima della schermata del titolo
  1055. #==============================================================================
  1056. class Scene_UpdateCheck < Scene_MenuBase
  1057.   #--------------------------------------------------------------------------
  1058.   # * Inizio
  1059.   #--------------------------------------------------------------------------
  1060.   def start
  1061.     super
  1062.     create_help_window
  1063.     create_command_window
  1064.   end
  1065.   #--------------------------------------------------------------------------
  1066.   # * Creazione della finestra d'aiuto
  1067.   #--------------------------------------------------------------------------
  1068.   def create_help_window
  1069.     @help_window = Window_Help.new
  1070.     @help_window.set_text(H87Updater::UPDATE_PRETITLE)
  1071.   end
  1072.   #--------------------------------------------------------------------------
  1073.   # * Creazione della finestra dei comandi
  1074.   #--------------------------------------------------------------------------
  1075.   def create_command_window
  1076.     @command_window = Window_UpdateRequest.new(@help_window.height)
  1077.     @command_window.set_handler(:yes, method(:update_scene))
  1078.     @command_window.set_handler(:no, method(:normal_scene))
  1079.     @command_window.set_handler(:back, method(:normal_scene))
  1080.   end
  1081.   #--------------------------------------------------------------------------
  1082.   # * Porta alla schermata d'aggiornamento
  1083.   #--------------------------------------------------------------------------
  1084.   def update_scene
  1085.     SceneManager.goto(Scene_Updater)
  1086.   end
  1087.   #--------------------------------------------------------------------------
  1088.   # * Porta alla schermata iniziale
  1089.   #--------------------------------------------------------------------------
  1090.   def normal_scene
  1091.     if H87Updater.forced_update?
  1092.       SceneManager.exit
  1093.     else
  1094.       SceneManager.goto(SceneManager.h87updater_first_scene_class)
  1095.     end
  1096.   end
  1097. end #updatecheck
  1098.  
  1099. #==============================================================================
  1100. # ** Window_UpdateRequest
  1101. #------------------------------------------------------------------------------
  1102. # Finestra dei comandi che mostrano sì o no.
  1103. #==============================================================================
  1104. class Window_UpdateRequest < Window_Command
  1105.   #--------------------------------------------------------------------------
  1106.   # * Inizializzazione
  1107.   #     y: coordinata Y
  1108.   #--------------------------------------------------------------------------
  1109.   def initialize(y)
  1110.     super(0, y)
  1111.     self.x = Graphics.width - self.width
  1112.   end
  1113.   #--------------------------------------------------------------------------
  1114.   # * Creazione della lista dei comandi
  1115.   #--------------------------------------------------------------------------
  1116.   def make_command_list
  1117.     add_command(H87Updater::PRETITLE_YES, :yes)
  1118.     add_command(H87Updater::PRETITLE_NOT, :no)
  1119.   end
  1120. end #fine dello script
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement