Плохо! Плохо!:  0
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Neo Save System

  1. #1
    Маститый Аватар для Andrew
    Информация о пользователе
    Регистрация
    08.02.2011
    Адрес
    Беларусь, Витебск
    Сообщений
    1,049
    Записей в дневнике
    3
    Репутация: 30 Добавить или отнять репутацию

    По умолчанию Neo Save System

    ___________________________________

    Neo Save System V
    Автор: Woratana
    Перевод: mephis


    Описание: Скрипт, расширяющий возможности сохранения игры.


    Функции:
    • Бесконечное количество слотов сохранений, можно указать максимум
    • Множество настроек
    • Поддержка скрипта смены тайлсета "Swap Tile"
    • В качестве фона сцены сохранения можно использовать картинку
    • Можно выбрать имя файлов сохранения и папку, где они будут храниться
    • Можно настроить выводимую информацию в сцене сохранения
    • Изменяемый текст информационного заголовка
    • Вывод тайлов той карты, где находится игрок
    • Можно из имени карты убрать текст, который вам не нужен (например, теги для некоторых скриптов)
    • Можно выбирать карты, для которых не нужно показывать их имена
    • Подтверждение при попытке перезаписать предыдущее сохранение



    Скриншоты:
    Спойлер Так экран сохранения выглядит по умолчанию:

    Спойлер А можно его настроить, например, вот так:



    Текст скрипта:
    Спойлер Neo Save System V:
    Код:
    #==========================================================================
    # ● [VX] ◦ Neo Save System V (Новая Система Сохранений V) ◦ □
    #---------------------------------------------------------------------------
    # ◦ Автор: Woratana [woratana@hotmail.com]
    # ◦ Thaiware RPG Maker Community
    # ◦ Перевод: mephis
    # ◦ Последнее обновление:
    # ◦ Версия: 3.0 -> 5.0
    # ◦ Сейчас этот скрипт поддерживает Helladen 
    # ◦ (Авторство скриншотов: Woratana, Andreas21 и Cybersam)
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии V:
    # - Введена поддержка скриншотов для желающих, чтобы на изображении карты
    #   был виден уровень тона, погода и спрайты. И в отличие от первой версии,
    #   теперь изображение центрировано.
    # - Добавлена опция остаться в экране сохранения после записи сохранения
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии IV:
    # - Новое дополнение, скрывающее имена карт. С помощью свитча можно включать
    #   или отключать работу списка MAP_NO_NAME_LIST.
    # - Пересмотрены некоторые настройки и организация скрипта.
    # - Добавлена опция отключения текста vocab::Gold справа от кол-ва денег.
    # - Добавлена опция выбора: использовать или нет уровень прозрачности по умолч.
    # - Добавлена поддержка совместимости скрипта смены тайлсета (swap_tile)
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии III:
    # - Вернулись к отрисовке карты с помощью скриншота. Картинки больше не нужны.
    # - При отрисовке карты персонажи не показываются на ней.
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии II:
    # - DLL для скриншотов не работает под Vista Aero, поэтому она была убрана,
    #   вместо этого используется картинка для каждой карты вместо скриншота.
    # - Уровень персонажа в прошлой версии (V.1) показывался неправильно.
    #---------------------------------------------------------------------------
    # ◦ Свойства:
    # - Бесконечное количество слотов сохранений, можно указать максимум
    # - Множество настроек
    # - Поддержка скрипта смены тайлсета "Swap Tile"
    # - В качестве фона сцены сохранения можно использовать картинку
    # - Можно выбрать имя файлов сохранения и папку, где они будут храниться
    # - Можно настроить выводимую информацию в сцене сохранения
    # - Изменяемый текст информационного заголовка
    # - Вывод тайлов той карты, где находится игрок
    # - Можно из имени карты убрать текст, который вам не нужен 
    #     (например, теги для некоторых скриптов)
    # - Можно выбирать карты, для которых не нужно показывать их имена
    # - Подтверждение при попытке перезаписать предыдущее сохранение
    #===========================================================================
    
    module Wora_NSS Wora_NSS
      #==========================================================================
      # * НАЧАЛО НОВОЙ СИСТЕМЫ СОХРАНЕНИЙ - НАСТРОЙКИ
      #--------------------------------------------------------------------------
      OPACITY_DEFAULT = true # Использовать настройки непрозрачности окон по умолчанию?
                             # Имейте в виду, что эта опция повлияет на оба
                             # параметра непрозрачности, указанных ниже
      NSS_WINDOW_OPACITY = 255 # Непрозрачность всех окон (Наименьшая 0 - 255 Наибольшая)
      # Если хотите использовать картинку для фона, установите это значение в 0
      NSS_IMAGE_BG = '' # Имя файла фоновой картинки, он должен лежать в папке Picture
      #                   Если фоновой картинки не будет, оставьте значение ''
      NSS_IMAGE_BG_OPACITY = 255 # Непрозрачность фоновой картинки
      
      # Если будете использовать метод скриншота, то эти опции вам не нужны
      SWAP_TILE = false # Если не будете использовать скрипт swap_tile,
                        # оставьте это значение в false
      SWAP_TILE_SWITCH = 84 # ID того же свитча, который используется в swap_tile.
      #                       Если SWAP_TILE установлен в false, то эта настройка
      #                       не имеет значения.
      
      # Если равно true, то будет создаваться скриншот карты.
      # Если равно false, то карта будет отрисовываться.
      SCREENSHOT_IMAGE = true # Плюс отрисовки в том, что вам не понадобится .DLL
      # или картинки для создания скриншотов. С другой стороны, метод скриншотов
      # лучше, так как в нём будут видны спрайты, уровень тона и погода.
      # Вам нужно включить swap_tile, если эта опция будет установлена в false.
      
      IMAGE_FILETYPE = '.png' # Тип картинки скриншота
      # Может быть '.bmp', '.jpg' или '.png'
      
      # Если равно true, то сцена не изменится при сохранении игры
      SCENE_CHANGE = true  # Если true, то сцена сохранения будет на текущей карте
    
      MAX_SAVE_SLOT = 20 # Максимальное количество слотов сохранения
      SLOT_NAME = 'СЛОТ {id}'
      # Название слота сохранения (показывается в списке сохранений)
      # Вместо {id} будет вставляться порядковый номер файла сохранения
      SAVE_FILE_NAME = 'Save {id}.rvdata'
      # Имя файла сохранений, можете также сменить расширение .rvdata на другое.
      # Вместо {id} будет вставляться порядковый номер файла сохранения
      
      SAVE_PATH = '' # Путь к папке сохранений, например 'Save/' или 
                     # '' (сохранения будут в корневой папке игры)
      SAVED_SLOT_ICON = 133 # Номер иконки слота с сохранением
      
      EMPTY_SLOT_ICON = 141 # Номер иконки пустого слота
      EMPTY_SLOT_TEXT = '— Пусто —' # Текст, показывающийся в пустом слоте
      
      DRAW_GOLD = true # Выводить кол-во денег
      DRAW_PLAYTIME = true # Выводить время игры
      DRAW_LOCATION = true # Выводить имя текущей локации
      DRAW_FACE = true # Показывать лица героев
      DRAW_LEVEL = true # Показывать уровень героев
      DRAW_NAME = true # Показывать имена героев
      DRAW_TEXT_GOLD = true # Выводить текст из vocab::Gold справа от количества денег
      
      PLAYTIME_TEXT = 'Время игры: '
      GOLD_TEXT = 'Деньги: '
      LOCATION_TEXT = 'Локация: '
      LV_TEXT = 'Ур. '
      
      MAP_NAME_TEXT_SUB = %w{}
      # Текст, который вы хотите убрать из имени карты,
      # например: %w{[LN] [DA]} уберёт текст '[LN]' и '[DA]' из имени карты
      
      MAP_NO_NAME_LIST = [2] # ID карт, для которых не нужно выводить их имя,
                             # например: [1,2,3]
      MAP_NO_NAME = '???' # Так будут называться безымянные карты
    
      # Этот свитч включает или отключает карты, показывающиеся как MAP_NO_NAME.
      # Если данный свитч отключить, то эти карты станут обычными.
      MAP_NO_NAME_SWITCH = 95 # Чтобы MAP_NO_NAME_LIST заработал, нужно включить
                              # этот свитч.
      
      MAP_BORDER = Color.new(0,0,0,200) # Цвет рамки изображения карты
                                        # (Красный,Зелёный,Синий,Непрозрачность)
      FACE_BORDER = Color.new(0,0,0,200) # Цвет рамки лиц героев
      
      # Окно подтверждения перезаписи поверх старого сохранения
      SFC_Text_Confirm = 'Перезаписать' # Текст подтверждения перезаписи
      SFC_Text_Cancel = 'Отмена' # Текст отмены сохранения
      SFC_Window_Width = 200 # Ширина окна подтверждения
      SFC_Window_X_Offset = 0 # Сдвиг окна подтверждения по горизонтали
      SFC_Window_Y_Offset = 0 # Сдвиг окна подтверждения по вертикали
      
      #-------------------------------------------------------------------------
      # КОНЕЦ НОВОЙ СИСТЕМЫ СОХРАНЕНИЙ - НАСТРОЙКИ
      # (Всё, что идёт ниже, можно изменять только на свой страх и риск)
      #=========================================================================
      
      #-------------------------------------------------------------
      # Screenshot V2 by Andreas21 and Cybersam
      #-------------------------------------------------------------
      @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
      @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
      @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' 
      module_function
      def self.shot(file_name)
        case IMAGE_FILETYPE
        when '.bmp'; typid = 0
        when '.jpg'; typid = 1
        when '.png'; typid = 2
        end
        # Get Screenshot
        filename = file_name + IMAGE_FILETYPE
        @screen.call(0, 0, Graphics.width, Graphics.height, filename, self.handel,
        typid)
      end
      def self.handel
        game_name = "\0" * 256
        @readini.call('Game','Title','',game_name,255,".\\Game.ini")
        game_name.delete!("\0")
        return @findwindow.call('RGSS Player',game_name)
      end
      
    end
    
    class Scene_File < Scene_Base
      include Wora_NSS
      attr_reader :window_slotdetail
      #-------------------------------------------------------------------------
      # * Start processing
      #-------------------------------------------------------------------------
      def start
        super
        create_menu_background
        if NSS_IMAGE_BG != ''
          @bg = Sprite.new
          @bg.bitmap = Cache.picture(NSS_IMAGE_BG)
          @bg.opacity = NSS_IMAGE_BG_OPACITY
        end
        @help_window = Window_Help.new
        command = []
        (1..MAX_SAVE_SLOT).each do |i|
          command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { i.to_s }
        end
        @window_slotdetail = Window_NSS_SlotDetail.new
        @window_slotlist = Window_SlotList.new(160, command)
        @window_slotlist.y = @help_window.height
        @window_slotlist.height = Graphics.height - @help_window.height
        if OPACITY_DEFAULT == false
        @help_window.opacity = NSS_WINDOW_OPACITY
        @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY
        end
    
      # Create Folder for Save file
      if SAVE_PATH != ''
        Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH)
      end
        if @saving
          @index = $game_temp.last_file_index
          @help_window.set_text(Vocab::SaveMessage)
        else
          @index = self.latest_file_index
          @help_window.set_text(Vocab::LoadMessage)
          (1..MAX_SAVE_SLOT).each do |i|
            @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i)
         end
        end
        @window_slotlist.index = @index
        # Draw Information
        @last_slot_index = @window_slotlist.index
        @window_slotdetail.draw_data(@last_slot_index + 1)
      end
      #--------------------------------------------------------------------------  
      # * Termination Processing
      #--------------------------------------------------------------------------
      def terminate
        super
        dispose_menu_background
        unless @bg.nil?
          @bg.bitmap.dispose
          @bg.dispose
        end
        @window_slotlist.dispose
        @window_slotdetail.dispose
        @help_window.dispose
      end
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      def update
        super
        if !@confirm_window.nil?
          @confirm_window.update
          if Input.trigger?(Input::C)
            if @confirm_window.index == 0
              determine_savefile
              @confirm_window.dispose
              @confirm_window = nil
            else
              Sound.play_cancel
              @confirm_window.dispose
              @confirm_window = nil
            end
          elsif Input.trigger?(Input::B)
          Sound.play_cancel
          @confirm_window.dispose
          @confirm_window = nil
          end
        else
          update_menu_background
          @window_slotlist.update
          if @window_slotlist.index != @last_slot_index
            @last_slot_index = @window_slotlist.index
            @window_slotdetail.draw_data(@last_slot_index + 1)
          end
          @help_window.update
          update_savefile_selection
        end
      end
      #--------------------------------------------------------------------------
      # * Update Save File Selection
      #--------------------------------------------------------------------------
      def update_savefile_selection
        if Input.trigger?(Input::C)
          if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1)
            Sound.play_decision
            text1 = SFC_Text_Confirm
            text2 = SFC_Text_Cancel
            @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2])
            @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset
            @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset
          else
            determine_savefile
          end
        elsif Input.trigger?(Input::B)
          Sound.play_cancel
          return_scene
        end
      end
      
      #--------------------------------------------------------------------------
      # * Execute Save
      #--------------------------------------------------------------------------
      def do_save
        if SCREENSHOT_IMAGE
        File.rename(SAVE_PATH + 'temp' + IMAGE_FILETYPE,
        make_filename(@last_slot_index).gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE)  
        end  
        file = File.open(make_filename(@last_slot_index), "wb")
        write_save_data(file)
        file.close   
        if SCENE_CHANGE
        $scene = Scene_Map.new
        else
        $scene = Scene_File.new(true, false, false)
        end
      end
      #--------------------------------------------------------------------------
      # * Execute Load
      #--------------------------------------------------------------------------
      def do_load
        file = File.open(make_filename(@last_slot_index), "rb")
        read_save_data(file)
        file.close
        $scene = Scene_Map.new
        RPG::BGM.fade(1500)
        Graphics.fadeout(60)
        Graphics.wait(40)
        @last_bgm.play
        @last_bgs.play
      end
      #--------------------------------------------------------------------------
      # * Confirm Save File
      #--------------------------------------------------------------------------
      def determine_savefile
        if @saving
          Sound.play_save
          do_save
        else
          if @window_slotdetail.file_exist?(@last_slot_index + 1)
            Sound.play_load
            do_load
          else
            Sound.play_buzzer
            return
          end
        end
        $game_temp.last_file_index = @last_slot_index
      end
      #--------------------------------------------------------------------------
      # * Create Filename
      #     file_index : save file index (0-3)
      #--------------------------------------------------------------------------
      def make_filename(file_index)
        return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
      end
      #--------------------------------------------------------------------------
      # * Select File With Newest Timestamp
      #--------------------------------------------------------------------------
      def latest_file_index
        latest_index = 0
        latest_time = Time.at(0)
        (1..MAX_SAVE_SLOT).each do |i|
          file_name = make_filename(i - 1)
          next if !@window_slotdetail.file_exist?(i)
          file_time = File.mtime(file_name)
          if file_time > latest_time
            latest_time = file_time
            latest_index = i - 1
          end
        end
        return latest_index
      end
    
    class Window_SlotList < Window_Command
      #--------------------------------------------------------------------------
      # * Draw Item
      #--------------------------------------------------------------------------
      def draw_item(index, enabled = true)
        rect = item_rect(index)
        rect.x += 4
        rect.width -= 8
        icon_index = 0
        self.contents.clear_rect(rect)
        if $scene.window_slotdetail.file_exist?(index + 1)
          icon_index = Wora_NSS::SAVED_SLOT_ICON
        else
          icon_index = Wora_NSS::EMPTY_SLOT_ICON
        end
        if !icon_index.nil?
          rect.x -= 4
          draw_icon(icon_index, rect.x, rect.y, enabled) # Draw Icon
          rect.x += 26
          rect.width -= 20
        end
        self.contents.clear_rect(rect)
        self.contents.font.color = normal_color
        self.contents.font.color.alpha = enabled ? 255 : 128
        self.contents.draw_text(rect, @commands[index])
      end
      
      def cursor_down(wrap = false)
        if @index < @item_max - 1 or wrap
          @index = (@index + 1) % @item_max
        end
      end
    
      def cursor_up(wrap = false)
        if @index > 0 or wrap
          @index = (@index - 1 + @item_max) % @item_max
        end
      end
    end
    
    class Window_NSS_SlotDetail < Window_Base
      include Wora_NSS
      def initialize
        super(160, 56, 384, 360)
        @data = []
        @exist_list = []
        @bitmap_list = {}
        @map_name = []
      end
      
      def dispose
        dispose_tilemap
        super
      end
    
      def draw_data(slot_id)
        contents.clear # 352, 328
        dispose_tilemap
        load_save_data(slot_id) if @data[slot_id].nil?
        if @exist_list[slot_id]
          save_data = @data[slot_id]
          # DRAW SCREENSHOT
         contents.fill_rect(0,30,352,160, MAP_BORDER)
         if SCREENSHOT_IMAGE
          if save_data['ss']
            bitmap = get_bitmap(save_data['ss_path'])
            rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
            contents.blt(2,32,bitmap,rect)
          end
         else 
          if SWAP_TILE and $game_switches[SWAP_TILE_SWITCH]
          create_swaptilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
          else
          create_tilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
          end
         end
          if DRAW_GOLD
            # DRAW GOLD
            gold_textsize = contents.text_size(save_data['gamepar'].gold).width
            goldt_textsize = contents.text_size(GOLD_TEXT).width  
            contents.font.color = system_color
            contents.draw_text(0, 0, goldt_textsize, WLH, GOLD_TEXT)
            contents.font.color = normal_color
            contents.draw_text(goldt_textsize, 0, gold_textsize, WLH, save_data['gamepar'].gold)  
           if DRAW_TEXT_GOLD == false
            gold_textsize = 0
            goldt_textsize = 0    
           else
            contents.draw_text(goldt_textsize + gold_textsize, 0, 200, WLH, Vocab::gold)
           end
          end
          if DRAW_PLAYTIME
            # DRAW PLAYTIME
            hour = save_data['total_sec'] / 60 / 60
            min = save_data['total_sec'] / 60 % 60
            sec = save_data['total_sec'] % 60
            time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
            pt_textsize = contents.text_size(PLAYTIME_TEXT).width
            ts_textsize = contents.text_size(time_string).width
            contents.font.color = system_color
            contents.draw_text(contents.width - ts_textsize - pt_textsize, 0,
            pt_textsize, WLH, PLAYTIME_TEXT)
            contents.draw_text(goldt_textsize + gold_textsize,0,200,WLH, Vocab::gold)
            contents.font.color = normal_color
            contents.draw_text(0, 0, contents.width, WLH, time_string, 2)
          end
          if DRAW_LOCATION
            # DRAW LOCATION
            lc_textsize = contents.text_size(LOCATION_TEXT).width
            mn_textsize = contents.text_size(save_data['map_name']).width
            contents.font.color = system_color
            contents.draw_text(0, 190, contents.width, WLH, LOCATION_TEXT)
            contents.font.color = normal_color
            contents.draw_text(lc_textsize, 190, contents.width, WLH, save_data['map_name'])
          end
            # DRAW FACE & Level & Name
            save_data['gamepar'].members.each_index do |i|
              actor = save_data['gameactor'][save_data['gamepar'].members[i].id]
              face_x_base = (i*80) + (i*8)
              face_y_base = 216
              lvn_y_plus = 10
              lv_textsize = contents.text_size(actor.level).width
              lvt_textsize = contents.text_size(LV_TEXT).width
            if DRAW_FACE
              # Draw Face
              contents.fill_rect(face_x_base, face_y_base, 84, 84, FACE_BORDER)
              draw_face(actor.face_name, actor.face_index, face_x_base + 2,
              face_y_base + 2, 80)
            end
            if DRAW_LEVEL
              # Draw Level
              contents.font.color = system_color
              contents.draw_text(face_x_base + 2 + 80 - lv_textsize - lvt_textsize,
              face_y_base + 2 + 80 - WLH + lvn_y_plus, lvt_textsize, WLH, LV_TEXT)
              contents.font.color = normal_color
              contents.draw_text(face_x_base + 2 + 80 - lv_textsize,
              face_y_base + 2 + 80 - WLH + lvn_y_plus, lv_textsize, WLH, actor.level)
            end
            if DRAW_NAME
              # Draw Name
              contents.draw_text(face_x_base, face_y_base + 2 + 80 + lvn_y_plus - 6, 84,
              WLH, actor.name, 1)
            end
          end
        else
          contents.draw_text(0,0, contents.width, contents.height - WLH, EMPTY_SLOT_TEXT, 1)
       end
      end
      
      def load_save_data(slot_id)
        file_name = make_filename(slot_id)
        if file_exist?(slot_id) or FileTest.exist?(file_name)
          @exist_list[slot_id] = true
          @data[slot_id] = {}
          # Start load data
          file = File.open(file_name, "r")
          @data[slot_id]['time'] = file.mtime
          @data[slot_id]['char'] = Marshal.load(file)
          @data[slot_id]['frame'] = Marshal.load(file)
          @data[slot_id]['last_bgm'] = Marshal.load(file)
          @data[slot_id]['last_bgs'] = Marshal.load(file)
          @data[slot_id]['gamesys'] = Marshal.load(file)
          @data[slot_id]['gamemes'] = Marshal.load(file)
          @data[slot_id]['gameswi'] = Marshal.load(file)
          @data[slot_id]['gamevar'] = Marshal.load(file)
          @data[slot_id]['gameselfvar'] = Marshal.load(file)
          @data[slot_id]['gameactor'] = Marshal.load(file)
          @data[slot_id]['gamepar'] = Marshal.load(file)
          @data[slot_id]['gametro'] = Marshal.load(file)
          @data[slot_id]['gamemap'] = Marshal.load(file)
          @data[slot_id]['total_sec'] = @data[slot_id]['frame'] / Graphics.frame_rate
          if SCREENSHOT_IMAGE
          @data[slot_id]['ss_path'] = file_name.gsub(/\..*$/){'_ss'} + IMAGE_FILETYPE
          @data[slot_id]['ss'] = FileTest.exist?(@data[slot_id]['ss_path'])
          end
          @data[slot_id]['map_name'] = get_mapname(@data[slot_id]['gamemap'].map_id)
          file.close
        else
          @exist_list[slot_id] = false
          @data[slot_id] = -1
        end
      end
    
      def make_filename(file_index)
        return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s }
      end
      
      def file_exist?(slot_id)
        return @exist_list[slot_id] if !@exist_list[slot_id].nil?
        @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id))
        return @exist_list[slot_id]
      end
      
      def get_bitmap(path)
        if !@bitmap_list.include?(path)
          @bitmap_list[path] = Bitmap.new(path)
        end
      return @bitmap_list[path]
      end
      
     def get_mapname(map_id)
        if @map_data.nil?
          @map_data = load_data("Data/MapInfos.rvdata")
        end
       if @map_name[map_id].nil?
         if MAP_NO_NAME_LIST.include?(map_id) and $game_switches[MAP_NO_NAME_SWITCH]
           @map_name[map_id] = MAP_NO_NAME
         else
           @map_name[map_id] = @map_data[map_id].name
         end  
           MAP_NAME_TEXT_SUB.each_index do |i|
           @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '')
           @mapname = @map_name[map_id]
         end 
       end
        return @map_name[map_id] 
     end  
      
      def create_tilemap(map_data, ox, oy)
        @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
        @viewport.z = self.z
        @tilemap = Tilemap.new(@viewport)
        @tilemap.bitmaps[0] = Cache.system("TileA1")
        @tilemap.bitmaps[1] = Cache.system("TileA2")
        @tilemap.bitmaps[2] = Cache.system("TileA3")
        @tilemap.bitmaps[3] = Cache.system("TileA4")
        @tilemap.bitmaps[4] = Cache.system("TileA5")
        @tilemap.bitmaps[5] = Cache.system("TileB")
        @tilemap.bitmaps[6] = Cache.system("TileC")
        @tilemap.bitmaps[7] = Cache.system("TileD")
        @tilemap.bitmaps[8] = Cache.system("TileE")
        @tilemap.map_data = map_data
        @tilemap.ox = ox / 8 + 99
        @tilemap.oy = oy / 8 + 90
      end
      
        def create_swaptilemap(map_data, ox, oy)
        @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
        @viewport.z = self.z
        @tilemap = Tilemap.new(@viewport)
        
        tile1 = Cache_Swap_Tiles.swap($tileA1 + ".png") rescue nil
        tile2 = Cache_Swap_Tiles.swap($tileA2 + ".png") rescue nil
        tile3 = Cache_Swap_Tiles.swap($tileA3 + ".png") rescue nil
        tile4 = Cache_Swap_Tiles.swap($tileA4 + ".png") rescue nil
        tile5 = Cache_Swap_Tiles.swap($tileA5 + ".png") rescue nil
        tile6 = Cache_Swap_Tiles.swap($tileB + ".png") rescue nil
        tile7 = Cache_Swap_Tiles.swap($tileC + ".png") rescue nil
        tile8 = Cache_Swap_Tiles.swap($tileD + ".png") rescue nil
        tile9 = Cache_Swap_Tiles.swap($tileE + ".png") rescue nil
        
    if $tileA1 != nil
    @tilemap.bitmaps[0] = tile1
    else
    @tilemap.bitmaps[0] = Cache.system("TileA1")
    end
    
    if $tileA2 != nil
    @tilemap.bitmaps[1] = tile2
    else
    @tilemap.bitmaps[1] = Cache.system("TileA2")
    end
    
    if $tileA3 != nil
    @tilemap.bitmaps[2] = tile3  
    else
    @tilemap.bitmaps[2] = Cache.system("TileA3")
    end  
    
    if $tileA4 != nil
    @tilemap.bitmaps[3] = tile4
    else
    @tilemap.bitmaps[3] = Cache.system("TileA4")
    end
    
    if $tileA5 != nil
    @tilemap.bitmaps[4] = tile5  
    else
    @tilemap.bitmaps[4] = Cache.system("TileA5")
    end
    
    if $tileB != nil
    @tilemap.bitmaps[5] = tile6
    else
    @tilemap.bitmaps[5] = Cache.system("TileB")  
    end  
    
    if $tileC != nil
    @tilemap.bitmaps[6] = tile7
    else
    @tilemap.bitmaps[6] = Cache.system("TileC")
    end  
    
    if $tileD != nil
    @tilemap.bitmaps[7] = tile8
    else
    @tilemap.bitmaps[7] = Cache.system("TileD")  
    end
    
    if $tileE != nil
    @tilemap.bitmaps[8] = tile9
    else
    @tilemap.bitmaps[8] = Cache.system("TileE")  
    end
      
        @tilemap.map_data = map_data
        @tilemap.ox = ox / 8 + 99
        @tilemap.oy = oy / 8 + 90
    end
      
      def dispose_tilemap
        unless @tilemap.nil?
          @tilemap.dispose
          @tilemap = nil
        end
      end
    end
    end
    
    class Scene_Title < Scene_Base
      def check_continue
        file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' }
        @continue_enabled = (Dir.glob(file_name).size > 0)
      end
    end
    
    class Scene_Map < Scene_Base
      alias wora_nss_scemap_ter terminate
      def terminate
        Wora_NSS.shot(Wora_NSS::SAVE_PATH + 'temp')
        wora_nss_scemap_ter
      end
    end
    #======================================================================
    # END - NEO SAVE SYSTEM by Woratana
    #======================================================================


    Демка (внезапно, на русском!): Скачать (1.56 Мб)
    Последний раз редактировалось aisuuw; 17.03.2011 в 17:25.


  2. #2
    Бывалый Аватар для Inkognitoo
    Информация о пользователе
    Регистрация
    30.09.2008
    Адрес
    Пермь.
    Сообщений
    988
    Записей в дневнике
    4
    Репутация: 16 Добавить или отнять репутацию

    По умолчанию

    Скриншоты говорят об обратном..)

  3. #3
    Маститый Аватар для Andrew
    Информация о пользователе
    Регистрация
    08.02.2011
    Адрес
    Беларусь, Витебск
    Сообщений
    1,049
    Записей в дневнике
    3
    Репутация: 30 Добавить или отнять репутацию

    По умолчанию

    Скриншоты с сайта, но могу свои показать.


  4. #4
    Бывалый Аватар для Inkognitoo
    Информация о пользователе
    Регистрация
    30.09.2008
    Адрес
    Пермь.
    Сообщений
    988
    Записей в дневнике
    4
    Репутация: 16 Добавить или отнять репутацию

    По умолчанию

    Желательно бы..)

  5. #5
    Маститый Аватар для Andrew
    Информация о пользователе
    Регистрация
    08.02.2011
    Адрес
    Беларусь, Витебск
    Сообщений
    1,049
    Записей в дневнике
    3
    Репутация: 30 Добавить или отнять репутацию

    По умолчанию

    Всё.


  6. #6
    Познающий Аватар для mephis
    Информация о пользователе
    Регистрация
    27.01.2011
    Адрес
    Новосибирск
    Сообщений
    330
    Записей в дневнике
    8
    Репутация: 34 Добавить или отнять репутацию

    По умолчанию

    Мда, блин. Мимо такого сложно пройти. Ради этого, даже не жалко раскупорить первый пост на этом форуме.

    Цитата Сообщение от Andrew Посмотреть сообщение
    Название: Neo Save System III
    Rpg Maker: VX
    Язык: я русифицировал полностью
    Автор: Woratana
    Вона чо нынче называется полной русификацией! Перевод трёх строчек: "Ур", "Время" и "Денги" (Денги, ёпта!). Титаническая работа проделана! Тэксь, где мой любимый фейспалмовый смайлик... А, вот он:

    Не, ну реально, смысл? Там в скрипте, между прочим, куча настроек, документация к ним. Вот что нужно было переводить, а не "Денги"

    Можно ж было пару часов уделить, чтобы получилось хотя бы так:
    ___________________________________

    Neo Save System V
    Автор: Woratana
    Перевод: mephis


    Описание: Скрипт, расширяющий возможности сохранения игры.


    Функции:
    • Бесконечное количество слотов сохранений, можно указать максимум
    • Множество настроек
    • Поддержка скрипта смены тайлсета "Swap Tile"
    • В качестве фона сцены сохранения можно использовать картинку
    • Можно выбрать имя файлов сохранения и папку, где они будут храниться
    • Можно настроить выводимую информацию в сцене сохранения
    • Изменяемый текст информационного заголовка
    • Вывод тайлов той карты, где находится игрок
    • Можно из имени карты убрать текст, который вам не нужен (например, теги для некоторых скриптов)
    • Можно выбирать карты, для которых не нужно показывать их имена
    • Подтверждение при попытке перезаписать предыдущее сохранение



    Скриншоты:
    Спойлер Так экран сохранения выглядит по умолчанию:

    Спойлер А можно его настроить, например, вот так:



    Текст скрипта:
    Спойлер Neo Save System V:
    Код:
    #==========================================================================
    # ● [VX] ◦ Neo Save System V (Новая Система Сохранений V) ◦ □
    #---------------------------------------------------------------------------
    # ◦ Автор: Woratana [woratana@hotmail.com]
    # ◦ Thaiware RPG Maker Community
    # ◦ Перевод: mephis
    # ◦ Последнее обновление:
    # ◦ Версия: 3.0 -> 5.0
    # ◦ Сейчас этот скрипт поддерживает Helladen 
    # ◦ (Авторство скриншотов: Woratana, Andreas21 и Cybersam)
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии V:
    # - Введена поддержка скриншотов для желающих, чтобы на изображении карты
    #   был виден уровень тона, погода и спрайты. И в отличие от первой версии,
    #   теперь изображение центрировано.
    # - Добавлена опция остаться в экране сохранения после записи сохранения
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии IV:
    # - Новое дополнение, скрывающее имена карт. С помощью свитча можно включать
    #   или отключать работу списка MAP_NO_NAME_LIST.
    # - Пересмотрены некоторые настройки и организация скрипта.
    # - Добавлена опция отключения текста vocab::Gold справа от кол-ва денег.
    # - Добавлена опция выбора: использовать или нет уровень прозрачности по умолч.
    # - Добавлена поддержка совместимости скрипта смены тайлсета (swap_tile)
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии III:
    # - Вернулись к отрисовке карты с помощью скриншота. Картинки больше не нужны.
    # - При отрисовке карты персонажи не показываются на ней.
    #---------------------------------------------------------------------------
    # ◦ Изменения в версии II:
    # - DLL для скриншотов не работает под Vista Aero, поэтому она была убрана,
    #   вместо этого используется картинка для каждой карты вместо скриншота.
    # - Уровень персонажа в прошлой версии (V.1) показывался неправильно.
    #---------------------------------------------------------------------------
    # ◦ Свойства:
    # - Бесконечное количество слотов сохранений, можно указать максимум
    # - Множество настроек
    # - Поддержка скрипта смены тайлсета "Swap Tile"
    # - В качестве фона сцены сохранения можно использовать картинку
    # - Можно выбрать имя файлов сохранения и папку, где они будут храниться
    # - Можно настроить выводимую информацию в сцене сохранения
    # - Изменяемый текст информационного заголовка
    # - Вывод тайлов той карты, где находится игрок
    # - Можно из имени карты убрать текст, который вам не нужен 
    #     (например, теги для некоторых скриптов)
    # - Можно выбирать карты, для которых не нужно показывать их имена
    # - Подтверждение при попытке перезаписать предыдущее сохранение
    #===========================================================================
    
    module Wora_NSS Wora_NSS
      #==========================================================================
      # * НАЧАЛО НОВОЙ СИСТЕМЫ СОХРАНЕНИЙ - НАСТРОЙКИ
      #--------------------------------------------------------------------------
      OPACITY_DEFAULT = true # Использовать настройки непрозрачности окон по умолчанию?
                             # Имейте в виду, что эта опция повлияет на оба
                             # параметра непрозрачности, указанных ниже
      NSS_WINDOW_OPACITY = 255 # Непрозрачность всех окон (Наименьшая 0 - 255 Наибольшая)
      # Если хотите использовать картинку для фона, установите это значение в 0
      NSS_IMAGE_BG = '' # Имя файла фоновой картинки, он должен лежать в папке Picture
      #                   Если фоновой картинки не будет, оставьте значение ''
      NSS_IMAGE_BG_OPACITY = 255 # Непрозрачность фоновой картинки
      
      # Если будете использовать метод скриншота, то эти опции вам не нужны
      SWAP_TILE = false # Если не будете использовать скрипт swap_tile,
                        # оставьте это значение в false
      SWAP_TILE_SWITCH = 84 # ID того же свитча, который используется в swap_tile.
      #                       Если SWAP_TILE установлен в false, то эта настройка
      #                       не имеет значения.
      
      # Если равно true, то будет создаваться скриншот карты.
      # Если равно false, то карта будет отрисовываться.
      SCREENSHOT_IMAGE = true # Плюс отрисовки в том, что вам не понадобится .DLL
      # или картинки для создания скриншотов. С другой стороны, метод скриншотов
      # лучше, так как в нём будут видны спрайты, уровень тона и погода.
      # Вам нужно включить swap_tile, если эта опция будет установлена в false.
      
      IMAGE_FILETYPE = '.png' # Тип картинки скриншота
      # Может быть '.bmp', '.jpg' или '.png'
      
      # Если равно true, то сцена не изменится при сохранении игры
      SCENE_CHANGE = true  # Если true, то сцена сохранения будет на текущей карте
    
      MAX_SAVE_SLOT = 20 # Максимальное количество слотов сохранения
      SLOT_NAME = 'СЛОТ {id}'
      # Название слота сохранения (показывается в списке сохранений)
      # Вместо {id} будет вставляться порядковый номер файла сохранения
      SAVE_FILE_NAME = 'Save {id}.rvdata'
      # Имя файла сохранений, можете также сменить расширение .rvdata на другое.
      # Вместо {id} будет вставляться порядковый номер файла сохранения
      
      SAVE_PATH = '' # Путь к папке сохранений, например 'Save/' или 
                     # '' (сохранения будут в корневой папке игры)
      SAVED_SLOT_ICON = 133 # Номер иконки слота с сохранением
      
      EMPTY_SLOT_ICON = 141 # Номер иконки пустого слота
      EMPTY_SLOT_TEXT = '— Пусто —' # Текст, показывающийся в пустом слоте
      
      DRAW_GOLD = true # Выводить кол-во денег
      DRAW_PLAYTIME = true # Выводить время игры
      DRAW_LOCATION = true # Выводить имя текущей локации
      DRAW_FACE = true # Показывать лица героев
      DRAW_LEVEL = true # Показывать уровень героев
      DRAW_NAME = true # Показывать имена героев
      DRAW_TEXT_GOLD = true # Выводить текст из vocab::Gold справа от количества денег
      
      PLAYTIME_TEXT = 'Время игры: '
      GOLD_TEXT = 'Деньги: '
      LOCATION_TEXT = 'Локация: '
      LV_TEXT = 'Ур. '
      
      MAP_NAME_TEXT_SUB = %w{}
      # Текст, который вы хотите убрать из имени карты,
      # например: %w{[LN] [DA]} уберёт текст '[LN]' и '[DA]' из имени карты
      
      MAP_NO_NAME_LIST = [2] # ID карт, для которых не нужно выводить их имя,
                             # например: [1,2,3]
      MAP_NO_NAME = '???' # Так будут называться безымянные карты
    
      # Этот свитч включает или отключает карты, показывающиеся как MAP_NO_NAME.
      # Если данный свитч отключить, то эти карты станут обычными.
      MAP_NO_NAME_SWITCH = 95 # Чтобы MAP_NO_NAME_LIST заработал, нужно включить
                              # этот свитч.
      
      MAP_BORDER = Color.new(0,0,0,200) # Цвет рамки изображения карты
                                        # (Красный,Зелёный,Синий,Непрозрачность)
      FACE_BORDER = Color.new(0,0,0,200) # Цвет рамки лиц героев
      
      # Окно подтверждения перезаписи поверх старого сохранения
      SFC_Text_Confirm = 'Перезаписать' # Текст подтверждения перезаписи
      SFC_Text_Cancel = 'Отмена' # Текст отмены сохранения
      SFC_Window_Width = 200 # Ширина окна подтверждения
      SFC_Window_X_Offset = 0 # Сдвиг окна подтверждения по горизонтали
      SFC_Window_Y_Offset = 0 # Сдвиг окна подтверждения по вертикали
      
      #-------------------------------------------------------------------------
      # КОНЕЦ НОВОЙ СИСТЕМЫ СОХРАНЕНИЙ - НАСТРОЙКИ
      # (Всё, что идёт ниже, можно изменять только на свой страх и риск)
      #=========================================================================
      
      #-------------------------------------------------------------
      # Screenshot V2 by Andreas21 and Cybersam
      #-------------------------------------------------------------
      @screen = Win32API.new 'screenshot', 'Screenshot', %w(l l l l p l l), ''
      @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l'
      @findwindow = Win32API.new 'user32', 'FindWindowA', %w(p p), 'l' 
      module_function
      def self.shot(file_name)
        case IMAGE_FILETYPE
        when '.bmp'; typid = 0
        when '.jpg'; typid = 1
        when '.png'; typid = 2
        end
        # Get Screenshot
        filename = file_name + IMAGE_FILETYPE
        @screen.call(0, 0, Graphics.width, Graphics.height, filename, self.handel,
        typid)
      end
      def self.handel
        game_name = "\0" * 256
        @readini.call('Game','Title','',game_name,255,".\\Game.ini")
        game_name.delete!("\0")
        return @findwindow.call('RGSS Player',game_name)
      end
      
    end
    
    class Scene_File < Scene_Base
      include Wora_NSS
      attr_reader :window_slotdetail
      #-------------------------------------------------------------------------
      # * Start processing
      #-------------------------------------------------------------------------
      def start
        super
        create_menu_background
        if NSS_IMAGE_BG != ''
          @bg = Sprite.new
          @bg.bitmap = Cache.picture(NSS_IMAGE_BG)
          @bg.opacity = NSS_IMAGE_BG_OPACITY
        end
        @help_window = Window_Help.new
        command = []
        (1..MAX_SAVE_SLOT).each do |i|
          command << SLOT_NAME.clone.gsub!(/\{ID\}/i) { i.to_s }
        end
        @window_slotdetail = Window_NSS_SlotDetail.new
        @window_slotlist = Window_SlotList.new(160, command)
        @window_slotlist.y = @help_window.height
        @window_slotlist.height = Graphics.height - @help_window.height
        if OPACITY_DEFAULT == false
        @help_window.opacity = NSS_WINDOW_OPACITY
        @window_slotdetail.opacity = @window_slotlist.opacity = NSS_WINDOW_OPACITY
        end
    
      # Create Folder for Save file
      if SAVE_PATH != ''
        Dir.mkdir(SAVE_PATH) if !FileTest.directory?(SAVE_PATH)
      end
        if @saving
          @index = $game_temp.last_file_index
          @help_window.set_text(Vocab::SaveMessage)
        else
          @index = self.latest_file_index
          @help_window.set_text(Vocab::LoadMessage)
          (1..MAX_SAVE_SLOT).each do |i|
            @window_slotlist.draw_item(i-1, false) if !@window_slotdetail.file_exist?(i)
         end
        end
        @window_slotlist.index = @index
        # Draw Information
        @last_slot_index = @window_slotlist.index
        @window_slotdetail.draw_data(@last_slot_index + 1)
      end
      #--------------------------------------------------------------------------  
      # * Termination Processing
      #--------------------------------------------------------------------------
      def terminate
        super
        dispose_menu_background
        unless @bg.nil?
          @bg.bitmap.dispose
          @bg.dispose
        end
        @window_slotlist.dispose
        @window_slotdetail.dispose
        @help_window.dispose
      end
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      def update
        super
        if !@confirm_window.nil?
          @confirm_window.update
          if Input.trigger?(Input::C)
            if @confirm_window.index == 0
              determine_savefile
              @confirm_window.dispose
              @confirm_window = nil
            else
              Sound.play_cancel
              @confirm_window.dispose
              @confirm_window = nil
            end
          elsif Input.trigger?(Input::B)
          Sound.play_cancel
          @confirm_window.dispose
          @confirm_window = nil
          end
        else
          update_menu_background
          @window_slotlist.update
          if @window_slotlist.index != @last_slot_index
            @last_slot_index = @window_slotlist.index
            @window_slotdetail.draw_data(@last_slot_index + 1)
          end
          @help_window.update
          update_savefile_selection
        end
      end
      #--------------------------------------------------------------------------
      # * Update Save File Selection
      #--------------------------------------------------------------------------
      def update_savefile_selection
        if Input.trigger?(Input::C)
          if @saving and @window_slotdetail.file_exist?(@last_slot_index + 1)
            Sound.play_decision
            text1 = SFC_Text_Confirm
            text2 = SFC_Text_Cancel
            @confirm_window = Window_Command.new(SFC_Window_Width,[text1,text2])
            @confirm_window.x = ((544 - @confirm_window.width) / 2) + SFC_Window_X_Offset
            @confirm_window.y = ((416 - @confirm_window.height) / 2) + SFC_Window_Y_Offset
          else
            determine_savefile
          end
        elsif Input.trigger?(Input::B)
          Sound.play_cancel
          return_scene
        end
      end
      
      #--------------------------------------------------------------------------
      # * Execute Save
      #--------------------------------------------------------------------------
      def do_save
        if SCREENSHOT_IMAGE
        File.rename(SAVE_PATH + 'temp' + IMAGE_FILETYPE,
        make_filename(@last_slot_index).gsub(/\..*$/){ '_ss' } + IMAGE_FILETYPE)  
        end  
        file = File.open(make_filename(@last_slot_index), "wb")
        write_save_data(file)
        file.close   
        if SCENE_CHANGE
        $scene = Scene_Map.new
        else
        $scene = Scene_File.new(true, false, false)
        end
      end
      #--------------------------------------------------------------------------
      # * Execute Load
      #--------------------------------------------------------------------------
      def do_load
        file = File.open(make_filename(@last_slot_index), "rb")
        read_save_data(file)
        file.close
        $scene = Scene_Map.new
        RPG::BGM.fade(1500)
        Graphics.fadeout(60)
        Graphics.wait(40)
        @last_bgm.play
        @last_bgs.play
      end
      #--------------------------------------------------------------------------
      # * Confirm Save File
      #--------------------------------------------------------------------------
      def determine_savefile
        if @saving
          Sound.play_save
          do_save
        else
          if @window_slotdetail.file_exist?(@last_slot_index + 1)
            Sound.play_load
            do_load
          else
            Sound.play_buzzer
            return
          end
        end
        $game_temp.last_file_index = @last_slot_index
      end
      #--------------------------------------------------------------------------
      # * Create Filename
      #     file_index : save file index (0-3)
      #--------------------------------------------------------------------------
      def make_filename(file_index)
        return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index + 1).to_s }
      end
      #--------------------------------------------------------------------------
      # * Select File With Newest Timestamp
      #--------------------------------------------------------------------------
      def latest_file_index
        latest_index = 0
        latest_time = Time.at(0)
        (1..MAX_SAVE_SLOT).each do |i|
          file_name = make_filename(i - 1)
          next if !@window_slotdetail.file_exist?(i)
          file_time = File.mtime(file_name)
          if file_time > latest_time
            latest_time = file_time
            latest_index = i - 1
          end
        end
        return latest_index
      end
    
    class Window_SlotList < Window_Command
      #--------------------------------------------------------------------------
      # * Draw Item
      #--------------------------------------------------------------------------
      def draw_item(index, enabled = true)
        rect = item_rect(index)
        rect.x += 4
        rect.width -= 8
        icon_index = 0
        self.contents.clear_rect(rect)
        if $scene.window_slotdetail.file_exist?(index + 1)
          icon_index = Wora_NSS::SAVED_SLOT_ICON
        else
          icon_index = Wora_NSS::EMPTY_SLOT_ICON
        end
        if !icon_index.nil?
          rect.x -= 4
          draw_icon(icon_index, rect.x, rect.y, enabled) # Draw Icon
          rect.x += 26
          rect.width -= 20
        end
        self.contents.clear_rect(rect)
        self.contents.font.color = normal_color
        self.contents.font.color.alpha = enabled ? 255 : 128
        self.contents.draw_text(rect, @commands[index])
      end
      
      def cursor_down(wrap = false)
        if @index < @item_max - 1 or wrap
          @index = (@index + 1) % @item_max
        end
      end
    
      def cursor_up(wrap = false)
        if @index > 0 or wrap
          @index = (@index - 1 + @item_max) % @item_max
        end
      end
    end
    
    class Window_NSS_SlotDetail < Window_Base
      include Wora_NSS
      def initialize
        super(160, 56, 384, 360)
        @data = []
        @exist_list = []
        @bitmap_list = {}
        @map_name = []
      end
      
      def dispose
        dispose_tilemap
        super
      end
    
      def draw_data(slot_id)
        contents.clear # 352, 328
        dispose_tilemap
        load_save_data(slot_id) if @data[slot_id].nil?
        if @exist_list[slot_id]
          save_data = @data[slot_id]
          # DRAW SCREENSHOT
         contents.fill_rect(0,30,352,160, MAP_BORDER)
         if SCREENSHOT_IMAGE
          if save_data['ss']
            bitmap = get_bitmap(save_data['ss_path'])
            rect = Rect.new((Graphics.width-348)/2,(Graphics.height-156)/2,348,156)
            contents.blt(2,32,bitmap,rect)
          end
         else 
          if SWAP_TILE and $game_switches[SWAP_TILE_SWITCH]
          create_swaptilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
          else
          create_tilemap(save_data['gamemap'].data, save_data['gamemap'].display_x,
          save_data['gamemap'].display_y)
          end
         end
          if DRAW_GOLD
            # DRAW GOLD
            gold_textsize = contents.text_size(save_data['gamepar'].gold).width
            goldt_textsize = contents.text_size(GOLD_TEXT).width  
            contents.font.color = system_color
            contents.draw_text(0, 0, goldt_textsize, WLH, GOLD_TEXT)
            contents.font.color = normal_color
            contents.draw_text(goldt_textsize, 0, gold_textsize, WLH, save_data['gamepar'].gold)  
           if DRAW_TEXT_GOLD == false
            gold_textsize = 0
            goldt_textsize = 0    
           else
            contents.draw_text(goldt_textsize + gold_textsize, 0, 200, WLH, Vocab::gold)
           end
          end
          if DRAW_PLAYTIME
            # DRAW PLAYTIME
            hour = save_data['total_sec'] / 60 / 60
            min = save_data['total_sec'] / 60 % 60
            sec = save_data['total_sec'] % 60
            time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
            pt_textsize = contents.text_size(PLAYTIME_TEXT).width
            ts_textsize = contents.text_size(time_string).width
            contents.font.color = system_color
            contents.draw_text(contents.width - ts_textsize - pt_textsize, 0,
            pt_textsize, WLH, PLAYTIME_TEXT)
            contents.draw_text(goldt_textsize + gold_textsize,0,200,WLH, Vocab::gold)
            contents.font.color = normal_color
            contents.draw_text(0, 0, contents.width, WLH, time_string, 2)
          end
          if DRAW_LOCATION
            # DRAW LOCATION
            lc_textsize = contents.text_size(LOCATION_TEXT).width
            mn_textsize = contents.text_size(save_data['map_name']).width
            contents.font.color = system_color
            contents.draw_text(0, 190, contents.width, WLH, LOCATION_TEXT)
            contents.font.color = normal_color
            contents.draw_text(lc_textsize, 190, contents.width, WLH, save_data['map_name'])
          end
            # DRAW FACE & Level & Name
            save_data['gamepar'].members.each_index do |i|
              actor = save_data['gameactor'][save_data['gamepar'].members[i].id]
              face_x_base = (i*80) + (i*8)
              face_y_base = 216
              lvn_y_plus = 10
              lv_textsize = contents.text_size(actor.level).width
              lvt_textsize = contents.text_size(LV_TEXT).width
            if DRAW_FACE
              # Draw Face
              contents.fill_rect(face_x_base, face_y_base, 84, 84, FACE_BORDER)
              draw_face(actor.face_name, actor.face_index, face_x_base + 2,
              face_y_base + 2, 80)
            end
            if DRAW_LEVEL
              # Draw Level
              contents.font.color = system_color
              contents.draw_text(face_x_base + 2 + 80 - lv_textsize - lvt_textsize,
              face_y_base + 2 + 80 - WLH + lvn_y_plus, lvt_textsize, WLH, LV_TEXT)
              contents.font.color = normal_color
              contents.draw_text(face_x_base + 2 + 80 - lv_textsize,
              face_y_base + 2 + 80 - WLH + lvn_y_plus, lv_textsize, WLH, actor.level)
            end
            if DRAW_NAME
              # Draw Name
              contents.draw_text(face_x_base, face_y_base + 2 + 80 + lvn_y_plus - 6, 84,
              WLH, actor.name, 1)
            end
          end
        else
          contents.draw_text(0,0, contents.width, contents.height - WLH, EMPTY_SLOT_TEXT, 1)
       end
      end
      
      def load_save_data(slot_id)
        file_name = make_filename(slot_id)
        if file_exist?(slot_id) or FileTest.exist?(file_name)
          @exist_list[slot_id] = true
          @data[slot_id] = {}
          # Start load data
          file = File.open(file_name, "r")
          @data[slot_id]['time'] = file.mtime
          @data[slot_id]['char'] = Marshal.load(file)
          @data[slot_id]['frame'] = Marshal.load(file)
          @data[slot_id]['last_bgm'] = Marshal.load(file)
          @data[slot_id]['last_bgs'] = Marshal.load(file)
          @data[slot_id]['gamesys'] = Marshal.load(file)
          @data[slot_id]['gamemes'] = Marshal.load(file)
          @data[slot_id]['gameswi'] = Marshal.load(file)
          @data[slot_id]['gamevar'] = Marshal.load(file)
          @data[slot_id]['gameselfvar'] = Marshal.load(file)
          @data[slot_id]['gameactor'] = Marshal.load(file)
          @data[slot_id]['gamepar'] = Marshal.load(file)
          @data[slot_id]['gametro'] = Marshal.load(file)
          @data[slot_id]['gamemap'] = Marshal.load(file)
          @data[slot_id]['total_sec'] = @data[slot_id]['frame'] / Graphics.frame_rate
          if SCREENSHOT_IMAGE
          @data[slot_id]['ss_path'] = file_name.gsub(/\..*$/){'_ss'} + IMAGE_FILETYPE
          @data[slot_id]['ss'] = FileTest.exist?(@data[slot_id]['ss_path'])
          end
          @data[slot_id]['map_name'] = get_mapname(@data[slot_id]['gamemap'].map_id)
          file.close
        else
          @exist_list[slot_id] = false
          @data[slot_id] = -1
        end
      end
    
      def make_filename(file_index)
        return SAVE_PATH + SAVE_FILE_NAME.gsub(/\{ID\}/i) { (file_index).to_s }
      end
      
      def file_exist?(slot_id)
        return @exist_list[slot_id] if !@exist_list[slot_id].nil?
        @exist_list[slot_id] = FileTest.exist?(make_filename(slot_id))
        return @exist_list[slot_id]
      end
      
      def get_bitmap(path)
        if !@bitmap_list.include?(path)
          @bitmap_list[path] = Bitmap.new(path)
        end
      return @bitmap_list[path]
      end
      
     def get_mapname(map_id)
        if @map_data.nil?
          @map_data = load_data("Data/MapInfos.rvdata")
        end
       if @map_name[map_id].nil?
         if MAP_NO_NAME_LIST.include?(map_id) and $game_switches[MAP_NO_NAME_SWITCH]
           @map_name[map_id] = MAP_NO_NAME
         else
           @map_name[map_id] = @map_data[map_id].name
         end  
           MAP_NAME_TEXT_SUB.each_index do |i|
           @map_name[map_id].sub!(MAP_NAME_TEXT_SUB[i], '')
           @mapname = @map_name[map_id]
         end 
       end
        return @map_name[map_id] 
     end  
      
      def create_tilemap(map_data, ox, oy)
        @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
        @viewport.z = self.z
        @tilemap = Tilemap.new(@viewport)
        @tilemap.bitmaps[0] = Cache.system("TileA1")
        @tilemap.bitmaps[1] = Cache.system("TileA2")
        @tilemap.bitmaps[2] = Cache.system("TileA3")
        @tilemap.bitmaps[3] = Cache.system("TileA4")
        @tilemap.bitmaps[4] = Cache.system("TileA5")
        @tilemap.bitmaps[5] = Cache.system("TileB")
        @tilemap.bitmaps[6] = Cache.system("TileC")
        @tilemap.bitmaps[7] = Cache.system("TileD")
        @tilemap.bitmaps[8] = Cache.system("TileE")
        @tilemap.map_data = map_data
        @tilemap.ox = ox / 8 + 99
        @tilemap.oy = oy / 8 + 90
      end
      
        def create_swaptilemap(map_data, ox, oy)
        @viewport = Viewport.new(self.x + 2 + 16, self.y + 32 + 16, 348,156)
        @viewport.z = self.z
        @tilemap = Tilemap.new(@viewport)
        
        tile1 = Cache_Swap_Tiles.swap($tileA1 + ".png") rescue nil
        tile2 = Cache_Swap_Tiles.swap($tileA2 + ".png") rescue nil
        tile3 = Cache_Swap_Tiles.swap($tileA3 + ".png") rescue nil
        tile4 = Cache_Swap_Tiles.swap($tileA4 + ".png") rescue nil
        tile5 = Cache_Swap_Tiles.swap($tileA5 + ".png") rescue nil
        tile6 = Cache_Swap_Tiles.swap($tileB + ".png") rescue nil
        tile7 = Cache_Swap_Tiles.swap($tileC + ".png") rescue nil
        tile8 = Cache_Swap_Tiles.swap($tileD + ".png") rescue nil
        tile9 = Cache_Swap_Tiles.swap($tileE + ".png") rescue nil
        
    if $tileA1 != nil
    @tilemap.bitmaps[0] = tile1
    else
    @tilemap.bitmaps[0] = Cache.system("TileA1")
    end
    
    if $tileA2 != nil
    @tilemap.bitmaps[1] = tile2
    else
    @tilemap.bitmaps[1] = Cache.system("TileA2")
    end
    
    if $tileA3 != nil
    @tilemap.bitmaps[2] = tile3  
    else
    @tilemap.bitmaps[2] = Cache.system("TileA3")
    end  
    
    if $tileA4 != nil
    @tilemap.bitmaps[3] = tile4
    else
    @tilemap.bitmaps[3] = Cache.system("TileA4")
    end
    
    if $tileA5 != nil
    @tilemap.bitmaps[4] = tile5  
    else
    @tilemap.bitmaps[4] = Cache.system("TileA5")
    end
    
    if $tileB != nil
    @tilemap.bitmaps[5] = tile6
    else
    @tilemap.bitmaps[5] = Cache.system("TileB")  
    end  
    
    if $tileC != nil
    @tilemap.bitmaps[6] = tile7
    else
    @tilemap.bitmaps[6] = Cache.system("TileC")
    end  
    
    if $tileD != nil
    @tilemap.bitmaps[7] = tile8
    else
    @tilemap.bitmaps[7] = Cache.system("TileD")  
    end
    
    if $tileE != nil
    @tilemap.bitmaps[8] = tile9
    else
    @tilemap.bitmaps[8] = Cache.system("TileE")  
    end
      
        @tilemap.map_data = map_data
        @tilemap.ox = ox / 8 + 99
        @tilemap.oy = oy / 8 + 90
    end
      
      def dispose_tilemap
        unless @tilemap.nil?
          @tilemap.dispose
          @tilemap = nil
        end
      end
    end
    end
    
    class Scene_Title < Scene_Base
      def check_continue
        file_name = Wora_NSS::SAVE_PATH + Wora_NSS::SAVE_FILE_NAME.gsub(/\{ID\}/i) { '*' }
        @continue_enabled = (Dir.glob(file_name).size > 0)
      end
    end
    
    class Scene_Map < Scene_Base
      alias wora_nss_scemap_ter terminate
      def terminate
        Wora_NSS.shot(Wora_NSS::SAVE_PATH + 'temp')
        wora_nss_scemap_ter
      end
    end
    #======================================================================
    # END - NEO SAVE SYSTEM by Woratana
    #======================================================================


    Демка (внезапно, на русском!): Скачать (1.56 Мб)

  7. #7
    Новичок Аватар для x_SLEYPNIR
    Информация о пользователе
    Регистрация
    27.06.2010
    Адрес
    Электросталь
    Сообщений
    21
    Репутация: 0 Добавить или отнять репутацию

    По умолчанию

    Ну как обычно Мефис молодец ^^,

  8. #8
    Хранитель Форума Аватар для Валера
    Информация о пользователе
    Регистрация
    15.04.2008
    Адрес
    Москва
    Сообщений
    14,006
    Записей в дневнике
    3
    Репутация: 166 Добавить или отнять репутацию

    По умолчанию

    Если молодец, надо в подпись записать.

    Спойлер И как тебе не стыдно-то, а, Валера?:


    Оборона форта: http://rghost.ru/8kLGxFtD2
    Сделать, чтоб все происходило, как я хочу, - вот, собственно, и весь мейкер!
    Адский Рейд: http://rpgmaker.su/vbdownloads.php?d...downloadid=106

  9. #9
    Маститый Аватар для Рыб
    Информация о пользователе
    Регистрация
    12.11.2008
    Адрес
    [ДАННЫЕ УДАЛЕНЫ]
    Сообщений
    1,421
    Записей в дневнике
    50
    Репутация: 55 Добавить или отнять репутацию

    По умолчанию

    Мемфис, ты почаще посты раскуривай - нам есть чего перенимать в технике курения))
    Twitch <- Тут иногда делаю вид, что умею играть или работать, в прямом эфире
    GitLab <- Тут иногда делаю вид, что умею программировать
    Github <- Еще какая-то дичь, тут иногда появляется, но с мукером не связана
    Notion<- Тут иногда делаю вид что умею планировать

  10. #10
    Авторитет Аватар для Hosse
    Информация о пользователе
    Регистрация
    23.03.2010
    Адрес
    Королёв
    Сообщений
    1,603
    Записей в дневнике
    54
    Репутация: 28 Добавить или отнять репутацию

    По умолчанию

    кто раскупоривает, а кто раскуривает О_о
    Творчество, никак с играми не связанное:
    https://vk.com/amjee
    https://vk.com/r2space
    Моя рожа и всякий рэпчик живьём: https://www.instagram.com/rap_amjeenickyry/

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Neo Save System