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

Тема: Игра по типу "The Banner Saga", или мои влажные мечты.

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

    Rainbow Игра по типу "The Banner Saga", или мои влажные мечты.

    Здесь было написано нечто постыдное и ныне уже не актуальное.
    Последний раз редактировалось Jetlend; 27.12.2016 в 22:10.

  2. #2
    Познающий Аватар для Kolhe
    Информация о пользователе
    Регистрация
    06.11.2012
    Адрес
    Омск
    Сообщений
    470
    Репутация: 27 Добавить или отнять репутацию

    По умолчанию

    Добро пожаловать.

    Разрешении экрана
    Core-скрипт моего любимого Yanfly (ссылка) умеет достаточно "умно" менять разрешение. Кроме того имеет много других полезных для любой игры функций. [163-164 строка]
    Расширении тайлов
    Не совсем понимаю, что вы имеете ввиду.
    Приятном глазу меню
    Лучше движка для кастомизации HUD-ов, чем Luna Engine не видал. Он очень удобен и позволяет изменить вообще все и как хочешь. Но требует хотя бы минимальных знаний rgss.
    Поддержке курсора
    Лучший, на мой взгляд:
    Спойлер :
    Код:
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # v1.10 by Shaz
    #----------------------------------------------------------------------------
    # This is a conversion of the XP Mouse script by Near Fantastica and
    # SephirothSpawn modified by Amaranth Games, to run under VX Ace.
    #----------------------------------------------------------------------------
    # To Install:
    # Copy and paste into a new slot in materials, below all other scripts
    #----------------------------------------------------------------------------
    # To Customize:
    # Add keyword icon index pairs to the ICON hash (below this documentation).  
    # Each of the keywords can be used in an event comment to make the mouse
    # cursor change into that icon when hovering over the event.
    #----------------------------------------------------------------------------
    # To Use:
    # Add the following comment to an event page:
    #   <mouse icon [x y] [name]>
    #   where icon is the keyword from the ICON hash below
    #   x and y are the offsets to override player movement (optional)
    #   name is the text to display next to the icon when hovering over the event (optional)
    #
    # Examples:
    # <mouse fight>
    #   will change the cursor into the 'fight' icon when over the event
    # <mouse touch 0 1>
    #   will change the cursor into the 'touch' icon when over the event, and
    #   make the player walk to the tile below the event when the mouse button is
    #   clicked
    # <mouse talk Gloria>
    #   will change the cursor into the 'talk' icon and display the name Gloria
    # <mouse talk 0 2 Henry Smith>
    #   will change the cursor into the 'talk' icon and display the name Henry Smith,
    #   and when the mouse button is clicked, the player will walk to the tile
    #   two below the event (good to use for shops where there's a counter in between)
    #
    # To force pathfinding on the player or an event, simply add a move route with
    # the player or event as the subject, with a Script command, and call
    # find_path(x, y) where x and y are the coordinates of the tile you want to move to
    # Examples:
    # Set Move Route (Player): Script: find_path(5, 8)
    #   will make the player find a path to tile 5, 8
    # Set Move Route (This Event): Script: find_path(10, 5)
    #   will make the event find a path to tile 10, 5
    #
    # NOTE: The path will be ATTEMPTED.  If there is no path TO that exact tile,
    # a path to an adjacent tile will be attempted.  If no path is found there
    # either, no movement will occur.
    # If a route is found, the player or event will begin moving towards it.  But
    # if their path is blocked while they are moving, movement will be cancelled.
    #----------------------------------------------------------------------------
    # Author's Notes:
    # This script should work with any RTP script.
    # I do not guarantee that it will work with ANY other script (especially anything
    # that overrides player or event movement, such as pixel movement scripts, or
    # custom window scripts).
    #
    # Script OVERWRITES the following methods:
    # Game_Map.setup_starting_map_event
    # Game_Map.setup_autorun_common_event
    #
    # If you have other scripts that ALIAS these methods, this mouse script should 
    # be placed above them.
    #----------------------------------------------------------------------------
    # Terms:
    # Use in free and commercial games
    # Credit: Near Fantastica, SephirothSpawn, Amaranth Games, Shaz
    #----------------------------------------------------------------------------
    # Versions:
    # 1.0  -  6 Sept 2013 - initial release
    # 1.02 -  7 Sept 2013 - fixed crash when loading games saved prior to adding script
    #                     - fixed player gets stuck on impassable area on world map
    #                       when clicking while leaving air ship
    # 1.03 -  8 Sept 2013 - fixed actor moving to diagonal tile instead of adjacent
    # 1.04 - 10 Sept 2013 - fixed vehicle pathfinding on world map
    #                     - fixed event trigger when no path found
    # 1.05 - 14 Sept 2013 - tweaked accessing of tilemap offset
    # 1.06 -  3 Nov  2013 - disabled mouse movement when waiting for NPC move route
    #                     - fixed events not triggering after player finishes walking
    # 1.07 -  6 Nov  2013 - slow down mouse scrolling, and don't loop save files
    # 1.08 - 24 Nov  2013 - cater for YEA Core large resolution with too-small maps
    #                     - fixed early event activation bug introduced in 1.06
    #                     - replaced calc of Windows_Selectable boundaries with item_rect
    #                     - added ability to completely disable mouse
    # 1.09 - 21 Dec  2013 - fixed mouse re-enable when calling common events
    # 1.10 -  6 Apr  2014 - add interaction for top part of > 32pixel high event
    #                     - activate an event without walking up to it
    #                       (add <autoactivate> comment at top of event page)
    #                     - arrow keys override mouse movement when pathfinding
    #                     - ignore mouse in menus when using keyboard
    #                     - make player walk to counter opposite shopkeepers
    #============================================================================
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Mouse Sprite
    #============================================================================
    
    
    # Add/remove/change icon names here.  The icon name is what will be used in the
    # event <mouse ...> command to show a different mouse icon when hovering over
    # the event.  These MUST be in lower case here!
    ICON = {'arrow' => 386, 'talk' => 4, 'look' => 3, 'fight' => 116,
            'touch' => 491, 'exit' => 121}
    DEFAULT_ICON = 'arrow'
    
    class Sprite_Mouse < Sprite
      #--------------------------------------------------------------------------
      # * Initialization
      #--------------------------------------------------------------------------
      def initialize
        super
        self.z = 10100
        self.ox = 4
        update
        @dummy = Bitmap.new(32, 32)
        self.bitmap = Bitmap.new(32, 32)
        @enabled = true
        @ignored = false
      end
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      def update
        return if !@enabled
        super
        if !SceneManager.scene.nil?
          if !Mouse.position.nil?
            mx, my = *Mouse.position
            if @cursor == DEFAULT_ICON
              self.x = mx unless mx.nil?
            else
              self.x = [mx, Graphics.width - self.bitmap.width].min unless mx.nil?
            end
            self.y = my unless my.nil?
          end
          if @scene != SceneManager.scene.class || Mouse.trigger?
            @scene = SceneManager.scene.class
            set_bitmap
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Set Bitmap
      #--------------------------------------------------------------------------
      def set_bitmap(cursor = DEFAULT_ICON, text = nil)
        if @ignored
          cursor = DEFAULT_ICON
          text = nil
        end
          
        if @cursor != cursor || @text != text
          @cursor = cursor
          @text = text
          item_cursor = ICON[cursor]
          rect = Rect.new(item_cursor % 16 * 24, item_cursor / 16 * 24, 24, 24)
          if @text.nil?
            self.bitmap = Bitmap.new(24, 32)
            self.bitmap.blt(0, 0, Cache.system('Iconset'), rect) 
          else
            w = @dummy.text_size(@text).width
            h = @dummy.font.size
            bitmap = Bitmap.new(26 + w, [32, h+2].max)
            bitmap.font.size = @dummy.font.size
            bitmap.font.shadow = true
            if self.x + 26 + w > Graphics.width
              bitmap.draw_text(0, 0, w, h, @text)
              bitmap.blt(w, 0, Cache.system('Iconset'), rect)
            else
              bitmap.blt(0, 0, Cache.system('Iconset'), rect) 
              bitmap.draw_text(26, 0, w, h, @text)
            end
            self.bitmap = bitmap
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Update Event Cursors
      #--------------------------------------------------------------------------
      def update_event_cursors
        # Remove mouse icon and text if we're off the grid
        if Mouse.grid.nil?
          set_bitmap
          return
        end
        # Set cursor and text according to event
        x, y = *Mouse.grid
        event = $game_map.lowest_mouse_event_xy(x, y)
        unless event.nil? && y < 410
          if !event.mouse_icon.nil? || !event.mouse_text.nil?
            set_bitmap(event.mouse_icon, event.mouse_text)
            return
          end
        end
        # default bitmap if not over an event
        set_bitmap 
      end
      #--------------------------------------------------------------------------
      # * Enable Mouse
      #--------------------------------------------------------------------------
      def enabled=(value)
        @enabled = value
        self.visible = value
      end
      #--------------------------------------------------------------------------
      # * Mouse Enabled?
      #--------------------------------------------------------------------------
      def enabled?
        @enabled
      end
      #--------------------------------------------------------------------------
      # * Ignore Mouse
      #--------------------------------------------------------------------------
      def ignored=(value)
        @ignored = value
      end
      #--------------------------------------------------------------------------
      # * Mouse Ignored?
      #--------------------------------------------------------------------------
      def ignored?
        @ignored
      end
    end
    
    $mouse = Sprite_Mouse.new
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Mouse Module
    #============================================================================
    
    
    #==============================================================================
    # ** Mouse Module
    #------------------------------------------------------------------------------
    #  by Near Fantastica and SephirothSpawn
    #  adapted and converted to VX Ace by Shaz
    #==============================================================================
    module Mouse
      #--------------------------------------------------------------------------
      # * Mouse to Input Triggers
      #   key => Input::KeyCONSTANT (key: 0 - left, 1 - middle, 2 - right)
      #--------------------------------------------------------------------------
      Mouse_to_Input_Triggers = {0 => Input::C, 1 => Input::B, 2 => Input::A}
      #--------------------------------------------------------------------------
      # * API Declarations
      #--------------------------------------------------------------------------
      GAKS = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i')
      GSM = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')
      Cursor_Pos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
      Scr2cli = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i')
      Client_rect = Win32API.new('user32', 'GetClientRect', %w(l p), 'i')
      Findwindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')
      Readini = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')
      ShowCursor = Win32API.new('user32', 'ShowCursor', 'i', 'l')
      #--------------------------------------------------------------------------
      # * Module Variables
      #--------------------------------------------------------------------------
      @triggers = [[0, 1], [0, 2], [0, 4]]
      @old_pos = 0
      @pos_i = 0
      @sys_cursor_visible = false
      #--------------------------------------------------------------------------
      # * Mouse Grid Position
      #--------------------------------------------------------------------------
      def self.grid
        return nil if @pos.nil?
        mx, my = SceneManager.scene.instance_variable_get(:@spriteset).tilemap_offset
        x = (@pos[0] + mx) / 32
        y = (@pos[1] + my) / 32
        return [x, y]
      end
      #--------------------------------------------------------------------------
      # * Mouse Position
      #--------------------------------------------------------------------------
      def self.position
        return @pos.nil? ? [0, 0] : @pos
      end
      #--------------------------------------------------------------------------
      # * Mouse Global Position
      #--------------------------------------------------------------------------
      def self.global_pos
        pos = [0, 0].pack('ll')
        return Cursor_Pos.call(pos) == 0 ? nil : pos.unpack('ll')
      end
      #--------------------------------------------------------------------------
      # * Screen to Client
      #--------------------------------------------------------------------------
      def self.screen_to_client(x=0, y=0)
        pos = [x, y].pack('ll')
        return Scr2cli.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll')
      end
      #--------------------------------------------------------------------------
      # * Mouse Position
      #--------------------------------------------------------------------------
      def self.pos
        gx, gy = global_pos
        x, y = screen_to_client(gx, gy)
        
        # Test boundaries
        begin
          if (x >= 0 && y >= 0 && x <= Graphics.width && y <= Graphics.height)
            return x, y
          else
            return -20, -20
          end
        rescue
          return 0, 0
        end
      end
      #--------------------------------------------------------------------------
      # * Update Mouse Position
      #--------------------------------------------------------------------------
      def self.update
        old_pos = @pos
        @pos = self.pos
        
        # Has mouse been moved?
        if old_pos != @pos
          Input.method = :mouse
        end
        
        # Which mouse to show - custom, or system?
        if $mouse.enabled? == @sys_cursor_visible
          @sys_cursor_visible = !@sys_cursor_visible
          ShowCursor.call(@sys_cursor_visible ? 1 : 0)
        end
        
        return if !$mouse.enabled?
        
        # Leaving / Entering Range?
        if old_pos != [-20, -20] && @pos == [-20, -20] # leaving range
          ShowCursor.call(1)
        elsif old_pos == [-20, -20] && @pos != [-20, -20] # entering range
          ShowCursor.call(0)
        end
        
        # Update Triggers
        for i in @triggers
          n = GAKS.call(i[1])
          if [0, 1].include?(n)
            i[0] = (i[0] > 0 ? i[0] * -1 : 0)
          else
            i[0] = (i[0] > 0 ? i[0] + 1 : 1)
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Trigger?
      #   id : 0:Left, 1:Right, 2:Center
      #--------------------------------------------------------------------------
      def self.trigger?(id = 0)
        if pos != [-20, -20]
          return @triggers[id][0] == 1
        end
        return false
      end
      #--------------------------------------------------------------------------
      # * Repeat?
      #   id : 0:Left, 1:Right, 2:Center
      #--------------------------------------------------------------------------
      def self.repeat?(id = 0)
        return @triggers[id][0] > 0 && @triggers[id][0] % 5 == 1 
      end
      #--------------------------------------------------------------------------
      # * Hwnd
      #--------------------------------------------------------------------------
      def self.hwnd
        if @hwnd.nil?
          title = "\0" * 256
          Readini.call('Game', 'Title', '', title, 255, '.\\Game.ini')
          title.delete!("\0")
          @hwnd = Findwindow.call('RGSS Player', title) 
          ShowCursor.call(0)
        end
        return @hwnd
      end
      #--------------------------------------------------------------------------
      # * Client Size
      #--------------------------------------------------------------------------
      def self.client_size
        rect = [0, 0, 0, 0].pack('l4')
        Client_rect.call(self.hwnd, rect)
        return rect.unpack('l4')[2..3]
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Input
    #============================================================================
    
    
    class << Input
      #--------------------------------------------------------------------------
      # * Public Instance Variables
      #--------------------------------------------------------------------------
      attr_accessor :method
      #--------------------------------------------------------------------------
      # * Alias Listings
      #--------------------------------------------------------------------------
      alias :seph_mouse_input_update :update
      alias :seph_mouse_input_trigger? :trigger?
      alias :seph_mouse_input_repeat? :repeat?
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      def update
        $mouse.update
        Mouse.update
        seph_mouse_input_update
        # Are we using the mouse or the keyboard?
        @method = :keyboard if dir4 != 0 || dir8 != 0
      end
      #--------------------------------------------------------------------------
      # * Trigger? Test
      #--------------------------------------------------------------------------
      def trigger?(constant)
        return true if seph_mouse_input_trigger?(constant)
        if $mouse.enabled? && !Mouse.pos.nil?
          if Mouse::Mouse_to_Input_Triggers.has_value?(constant)
            return true if Mouse.trigger?(Mouse::Mouse_to_Input_Triggers.index(constant))
          end
        end
        return false
      end
      #--------------------------------------------------------------------------
      # * Repeat? Test
      #--------------------------------------------------------------------------
      def repeat?(constant)
        return true if seph_mouse_input_repeat?(constant)
        if $mouse.enabled? && !Mouse.pos.nil?
          if Mouse::Mouse_to_Input_Triggers.has_value?(constant)
            return true if Mouse.repeat?(Mouse::Mouse_to_Input_Triggers.index(constant))
          end
        end
        return false
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Map
    #============================================================================
    
    
    class Spriteset_Map
      #--------------------------------------------------------------------------
      # * Tilemap Offset
      #--------------------------------------------------------------------------
      def tilemap_offset
        if $imported && $imported["YEA-CoreEngine"]
          [@tilemap.ox - @viewport1.rect.x, @tilemap.oy - @viewport1.rect.y]
        else
          [@tilemap.ox, @tilemap.oy]
        end
      end
    end
    
    class Game_Map
      #--------------------------------------------------------------------------
      # * Detect/Set Up Starting Map Event
      #--------------------------------------------------------------------------
      def setup_starting_map_event
        event = @events.values.find {|event| event.starting }
        event.clear_starting_flag if event
        @interpreter.setup(event.list, event.id, event.trigger_in?([0,1,2,3])) if event
        event
      end
      #--------------------------------------------------------------------------
      # * Detect/Set Up Autorun Common Event
      #--------------------------------------------------------------------------
      def setup_autorun_common_event
        event = $data_common_events.find do |event|
          event && event.autorun? && $game_switches[event.switch_id]
        end
        @interpreter.setup(event.list, 0, true) if event
        event
      end
      #--------------------------------------------------------------------------
      # * Get ID of Lowest Mouse-enabled Event at Designated Coordinates
      #--------------------------------------------------------------------------
      def lowest_mouse_event_xy(x, y)
        list = events_xy(x, y) + events_xy(x, y+1)
        list.sort! {|a, b| b.y - a.y}
        evt = nil
        list.each do |event|
          if (event.pos?(x, y) || (event.pos?(x, y+1) && event.height > 32)) &&
            (evt.nil? || event.y > evt.y)
            evt = event
            break
          end
        end
        return evt
      end
    end
    
    class Scene_Map
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      alias shaz_mouse_scene_map_update update
      def update
        $mouse.update_event_cursors
        shaz_mouse_scene_map_update
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Event
    #============================================================================
    
    
    module RPG
      class Event
        class Page
          #--------------------------------------------------------------------
          # * Public Instance Variables
          #--------------------------------------------------------------------
          attr_reader :mouse_icon
          attr_reader :mouse_text
          attr_reader :mouse_position
          attr_reader :mouse_autoactivate
          #--------------------------------------------------------------------
          # * Build Stats
          #--------------------------------------------------------------------
          def build_stats
            # Mouse icons (icon mandatory, others optional)
            # <mouse icon destx desty name>
            @mouse_icon = nil
            @mouse_text = nil
            @mouse_position = [0, 0]
            @mouse_autoactivate = false
            # look for mouse instructions
            list.each do |command|
              if [108, 408].include?(command.code)
                comment = command.parameters[0]
                  case comment
                  when /<mouse/i
                    params = /<mouse (.*)>/i.match(comment)[1].split(' ')
                    @mouse_icon = params.shift
                    if params.size > 1 && params[0] =~ /\d+/ && params[1] =~ /\d+/
                      @mouse_position = [params.shift.to_i, params.shift.to_i]
                    end
                    if params.size > 0
                      @mouse_text = params.join(' ')
                    end
                  when /<autoactivate>/
                    @mouse_autoactivate = true
                  end
              end #if
            end #do
          end #def
        end
      end
    end
    
    class Game_Event < Game_Character
      #--------------------------------------------------------------------------
      # * Public Instance Variables
      #--------------------------------------------------------------------------
      attr_reader   :mouse_icon
      attr_reader   :mouse_text
      attr_reader   :mouse_position
      attr_reader   :mouse_autoactivate
      #--------------------------------------------------------------------------
      # * Start Event
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_event_start start
      def start
        $game_player.start_event(@id) if !empty?
        shaz_mouse_game_event_start
      end
      #--------------------------------------------------------------------------
      # * Clear Event Page Settings
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_event_clear_page_settings clear_page_settings
      def clear_page_settings
        shaz_mouse_game_event_clear_page_settings
        @mouse_icon = nil
        @mouse_text = nil
        @mouse_position = [0, 0]
        @mouse_autoactivate = false
        @height = 0
      end
      #--------------------------------------------------------------------------
      # * Set Up Event Page Settings
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_event_setup_page_settings setup_page_settings
      def setup_page_settings
        shaz_mouse_game_event_setup_page_settings
        @page.build_stats
        @mouse_icon         = @page.mouse_icon
        @mouse_text         = @page.mouse_text
        @mouse_position     = @page.mouse_position
        @mouse_autoactivate = @page.mouse_autoactivate
        set_size
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Character
    #============================================================================
    
    
    class Game_CharacterBase
      attr_reader :height                            # Height of character bitmap
      #--------------------------------------------------------------------------
      # * Initialize Public Member Variables
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_characterbase_init_public_members init_public_members
      def init_public_members
        shaz_mouse_game_characterbase_init_public_members
        @height = 0
      end
      #--------------------------------------------------------------------------
      # * Change Graphics
      #     character_name  : new character graphic filename
      #     character_index : new character graphic index
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_characterbase_set_graphic set_graphic
      def set_graphic(character_name, character_index)
        shaz_mouse_game_characterbase_set_graphic(character_name, character_index)
        set_size
      end
      #--------------------------------------------------------------------------
      # * Set character width/height size
      #--------------------------------------------------------------------------
      def set_size
        bw = Cache.character(@character_name).width
        bh = Cache.character(@character_name).height
        sign = @character_name[/^[\!\$]./]
        if sign && sign.include?('$')
          @width = bw / 3
          @height = bh / 4
        else
          @width = bw / 12
          @height = bh / 8
        end
      end
      #--------------------------------------------------------------------------
      # * Detect Collision with Event
      #--------------------------------------------------------------------------
      def collide_with_events?(x, y)
        $game_map.events_xy_nt(x, y).any? do |event|
          self != event && (event.normal_priority? || self.is_a?(Game_Event))
        end
      end
      #--------------------------------------------------------------------------
      # * Detect Collision with Vehicle
      #--------------------------------------------------------------------------
      def collide_with_vehicles?(x, y)
        !self.is_a?(Game_Player) && ($game_map.boat.pos_nt?(x, y) || $game_map.ship.pos_nt?(x, y))
      end
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_characterbase_update update
      def update
        run_path if @runpath
        shaz_mouse_game_characterbase_update
      end
      #--------------------------------------------------------------------------
      # * Run Path
      #--------------------------------------------------------------------------
      def run_path
        return if moving?
        @step = @map.nil? || @map[@x, @y].nil? ? 0 : @map[@x, @y] - 1
        if @step < 1
          clear_path
        else
          x, y = @x, @y
          dirs = []
          dirs.push(6) if @map[@x+1, @y] == @step && passable?(@x, @y, 6)
          dirs.push(2) if @map[@x, @y+1] == @step && passable?(@x, @y, 2)
          dirs.push(4) if @map[@x-1, @y] == @step && passable?(@x, @y, 4)
          dirs.push(8) if @map[@x, @y-1] == @step && passable?(@x, @y, 8)
          while dirs.size > 0
            dir = dirs.delete_at(rand(dirs.size))
            move_straight(dir)
            break if x != @x || y != @y
          end
          # clear the path if we couldn't move
          clear_path if x == @x && y == @y
        end
      end
      #--------------------------------------------------------------------------
      # * Find Path
      #--------------------------------------------------------------------------
      def find_path(x, y)
        sx, sy = @x, @y
        @tx, @ty = x, y
        result = setup_map(sx, sy)
        @runpath = result[0]
        @map = result[1]
        @map[sx, sy] = result[2] if result[2] != nil
      end
      #--------------------------------------------------------------------------
      # * Clear Path
      #--------------------------------------------------------------------------
      def clear_path
        @map = nil
        @runpath = false
      end
      #--------------------------------------------------------------------------
      # * Setup Map
      #--------------------------------------------------------------------------
      def setup_map(sx, sy)
        map = Table.new($game_map.width, $game_map.height)
        update_counter = 0
        map[@tx, @ty] = 1
        old_positions = [[@tx, @ty]]
        new_positions = []
        
        # if tile is impassable, but CAN move to adjacent tiles, use the adjacent tiles instead
        if (!passable?(@tx, @ty, 2) && !passable?(@tx, @ty, 4) &&
          !passable?(@tx, @ty, 6) && !passable?(@tx, @ty, 8)) ||
          $game_map.events_xy_nt(@tx, @ty).any? { |evt| evt.normal_priority? && evt != self }
          old_positions = []
          
          # Can we move from the destination tile in any direction?
          if map_passable?(@tx, @ty, 2)
            map[@tx, @ty+1] = 1
            old_positions.push([@tx, @ty+1])
          end
          if map_passable?(@tx, @ty, 8)
            map[@tx, @ty-1] = 1
            old_positions.push([@tx, @ty-1])
          end
          if map_passable?(@tx, @ty, 4)
            map[@tx-1, @ty] = 1
            old_positions.push([@tx-1, @ty])
          end
          if map_passable?(@tx, @ty, 6)
            map[@tx+1, @ty] = 1
            old_positions.push([@tx+1, @ty])
          end
          
          # If not, can we at least move up to the destination tile?
          if old_positions.size == 0
            if map_passable?(@tx-1,@ty,6)
              map[@tx-1,@ty] = 1
              old_positions.push([@tx-1,@ty])
            end
            if map_passable?(@tx+1,@ty,4) 
              map[@tx+1,@ty] = 1
              old_positions.push([@tx+1,@ty])
            end
            if map_passable?(@tx,@ty-1,2)
              map[@tx,@ty-1] = 1
              old_positions.push([@tx,@ty-1])
            end
            if map_passable?(@tx,@ty+1,8)
              map[@tx,@ty+1] = 1
              old_positions.push([@tx,@ty+1])
            end
          end
        end
        
        # If there are any counters, can we move to the tile on the other side?
        if map_passable?(@tx-2,@ty,6) && $game_map.counter?(@tx-1,@ty)
          map[@tx-2,@ty] = 1
          old_positions.push([@tx-2,@ty])
        end
        if map_passable?(@tx+2,@ty,4) && $game_map.counter?(@tx+1,@ty)
          map[@tx+2,@ty] = 1
          old_positions.push([@tx+2,@ty])
        end
        if map_passable?(@tx,@ty-2,2) && $game_map.counter?(@tx,@ty-1)
          map[@tx,@ty-2] = 1
          old_positions.push([@tx,@ty-2])
        end
        if map_passable?(@tx,@ty+2,2) && $game_map.counter?(@tx,@ty+1)
          map[@tx,@ty+2] = 1
          old_positions.push([@tx,@ty+2])
        end
        
        
        depth = 2
        depth.upto(100) { |step|
          break if old_positions[0].nil?
          @step = step
          loop do
            break if old_positions[0].nil?
            x, y = old_positions.shift
            return [true, map, @step-1] if x == sx && y == sy
            if map[x, y + 1] == 0 && passable?(x, y, 2)
              map[x, y + 1] = @step
              new_positions.push([x, y + 1])
            end
            if map[x - 1, y] == 0 && passable?(x, y, 4)
              map[x - 1, y] = @step
              new_positions.push([x - 1, y])
            end
            if map[x + 1, y] == 0 && passable?(x, y, 6)
              map[x + 1, y] = @step
              new_positions.push([x + 1, y])
            end
            if map[x, y - 1] == 0 && passable?(x, y, 8)
              map[x, y - 1] = @step
              new_positions.push([x, y - 1])
            end
            # Update graphics? (to reduce lag)
            update_counter += 1
            if update_counter > 50
              Graphics.update
              update_counter = 0
            end
          end
          old_positions = new_positions
          new_positions = []
        }
        return [false, nil, nil]
      end
    end  
    
    class Game_Character < Game_CharacterBase
      #--------------------------------------------------------------------------
      # * Force Move Route
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_character_force_move_route force_move_route
      def force_move_route(move_route)
        clear_path
        shaz_mouse_game_character_force_move_route(move_route)
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Player
    #============================================================================
    
    
    class Game_Player < Game_Character
      #--------------------------------------------------------------------------
      # * Trigger Map Event
      #     triggers : Trigger array
      #     normal   : Is priority set to [Same as Characters] ?
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_player_start_map_event start_map_event
      def start_map_event(x, y, triggers, normal)
        @started_events = []
        shaz_mouse_game_player_start_map_event(x, y, triggers, normal)
      end
      #--------------------------------------------------------------------------
      # * Start Event
      #--------------------------------------------------------------------------
      def start_event(event_id)
        @started_events = [] if @started_events.nil?
        @started_events.push(event_id)
      end
      #--------------------------------------------------------------------------
      # * Processing of Movement via Input from Directional Buttons
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_player_move_by_input move_by_input
      def move_by_input
        if Input.dir4 > 0
          clear_path
          shaz_mouse_game_player_move_by_input
        else
          # Move by mouse input
          if !$game_message.busy? && !$game_message.visible && !@move_route_forcing &&
            !@vehicle_getting_on && !@vehicle_getting_off && 
            Mouse.trigger?(0) && !Mouse.grid.nil? && !$mouse.ignored?
            mx, my = *Mouse.grid
            # turn in direction
            if (@x - mx).abs >= (@y - my).abs
              set_direction(@x > mx ? 4 : 6)
            else
              set_direction(@y > my ? 8 : 2)
            end
            # find path
            @event = $game_map.lowest_mouse_event_xy(mx, my)
            if @event.nil?
              find_path(mx, my)
            elsif @event.mouse_autoactivate
              @event.start
              @started_events = []
              clear_path
            else
              find_path(@event.x + @event.mouse_position[0], 
                @event.y + @event.mouse_position[1])
            end
          end
        end
      end
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_player_update update
      def update
        shaz_mouse_game_player_update
        update_pathfinding if !@event.nil? && !moving?
      end
      #--------------------------------------------------------------------------
      # * Check event after pathfinding
      #--------------------------------------------------------------------------
      def update_pathfinding
        if @map.nil? || @map[@x, @y] <= 1
          dir = @x < @event.x ? 6 : @x > @event.x ? 4 : @y < @event.y ? 2 : @y > @event.y ? 8 : 0
          # Face event and trigger it (only if not triggered by start_map_event)
          turn_toward_character(@event) if !@event.pos?(@x, @y)
          if !@started_events.include?(@event.id) && !@map.nil? && !in_airship?
            @event.start 
            @started_events = []
          end
          clear_path
        end
      end
      #--------------------------------------------------------------------------
      # * Clear Path
      #--------------------------------------------------------------------------
      def clear_path
        @event = nil
        super
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Interpreter
    #============================================================================
    
    
    class Game_Interpreter
      #--------------------------------------------------------------------------
      # * Event Setup
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_interpreter_setup setup
      def setup(list, event_id = 0, lock_player = false)
        shaz_mouse_game_interpreter_setup(list, event_id)
        @lock_player = lock_player
      end
      #--------------------------------------------------------------------------
      # * Execute
      #--------------------------------------------------------------------------
      alias shaz_mouse_game_interpreter_run run
      def run
        $mouse.ignored = true if @lock_player
        shaz_mouse_game_interpreter_run
        $mouse.ignored = false if @lock_player
      end
    end
    
    
    
    
    
    
    #============================================================================
    # SUPER SIMPLE MOUSE SCRIPT
    # Windows
    #============================================================================
    
    
    class Window_Selectable < Window_Base
      #--------------------------------------------------------------------------
      # * Frame Update
      #--------------------------------------------------------------------------
      alias shaz_mouse_window_selectable_update update
      def update
        shaz_mouse_window_selectable_update
        process_mouse_handling if Input.method == :mouse
      end
      #--------------------------------------------------------------------------
      # * Mouse Movement Processing
      #--------------------------------------------------------------------------
      def process_mouse_handling
        return unless $mouse.enabled? && cursor_movable?
        # Add a delay to prevent too-fast scrolling
        @delay = @delay ? @delay + 1 : 0
        return if @delay % 3 > 0
        
        mx, my = *Mouse.position
        vx = self.viewport ? self.x - self.viewport.ox + self.viewport.rect.x : self.x
        vy = self.viewport ? self.y - self.viewport.oy + self.viewport.rect.y : self.y
        if mx.between?(vx, vx + self.width) &&
          my.between?(vy, vy + self.height)
          mx -= vx 
          mx -= padding
          my -= vy 
          my -= padding
          my += oy 
          for i in 0 ... item_max
            rect = item_rect(i)
            if mx.between?(rect.x, rect.x + rect.width) &&
              my.between?(rect.y, rect.y + rect.height)
              last_index = @index
              select(i)
              if @index != last_index
                Sound.play_cursor 
              end
              break
            end
          end
        end
      end
    end  
    
    class Window_NameInput < Window_Selectable
      #--------------------------------------------------------------------------
      # * Mouse Movement Processing
      #--------------------------------------------------------------------------
      def process_mouse_handling
        return unless $mouse.enabled?
        # Add a delay to prevent too-fast scrolling
        @delay = @delay ? @delay + 1 : 0
        return if @delay % 3 > 0
        
        mx, my = *Mouse.position
        vx = (self.viewport ? self.x - self.viewport.ox + self.viewport.rect.x : self.x) + padding
        vy = (self.viewport ? self.y - self.viewport.oy + self.viewport.rect.y : self.y) + padding
        if mx.between?(vx, vx + self.width - padding * 2) &&
          my.between?(vy, vy + self.height - padding * 2)
          mx -= vx 
          my -= vy 
          x = (mx > 5*32+16 ? mx-16 : mx) / 32 
          y = my / line_height
          last_index = @index
          @index = y * 10 + x
          Sound.play_cursor if @index != last_index
        end
      end
    end
    
    class Scene_File < Scene_MenuBase
      #--------------------------------------------------------------------------
      # * Update Cursor
      #--------------------------------------------------------------------------
      alias shaz_mouse_scene_file_update_cursor update_cursor
      def update_cursor
        shaz_mouse_scene_file_update_cursor
        process_mouse_handling if Input.method == :mouse
      end
      #--------------------------------------------------------------------------
      # * Mouse Movement Processing
      #--------------------------------------------------------------------------
      def process_mouse_handling
        return unless $mouse.enabled?
        # Add a delay to prevent too-fast scrolling
        @delay = @delay ? @delay + 1 : 0
        return if @delay % 3 > 0
        
        mx, my = *Mouse.position
        vx = @savefile_viewport.ox + mx
        vy = @savefile_viewport.oy + my
        last_index = @index
        new_index = vy / savefile_height
        if @index != new_index
          if new_index > @index
            cursor_down(false)
          else
            cursor_up(false)
          end
          Sound.play_cursor
          @savefile_windows[last_index].selected = false
          @savefile_windows[@index].selected = true
        end
      end
    end

    Музыкальном сопровождении
    Посмотреть здесь. Для начала. Не устроит, еще чего предложу.

    С боевой системой немного подождите.

    Up.
    Посмотрел на эту "сагу". Подобную боевую систему проще всего будет воплотить с помощью Gubid Tactical Battle System , ибо эта система имеет самый широкий функционал для тактических боевок. Но, к сожалению, вероятнее всего она будет конфликтовать с очень многими сторонними скриптами.
    Последний раз редактировалось Kolhe; 20.03.2015 в 18:52.


  3. #3
    Маститый Аватар для Элрик
    Информация о пользователе
    Регистрация
    09.09.2010
    Сообщений
    1,284
    Записей в дневнике
    47
    Репутация: 24 Добавить или отнять репутацию

    По умолчанию

    Один вопрос, который очень-очень важен. Какие у тебя познания в рпгмейкере вообще?

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

    По умолчанию

    Здесь было написано нечто постыдное и ныне уже не актуальное.
    Последний раз редактировалось Jetlend; 27.12.2016 в 22:11.

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

    По умолчанию

    Здесь было написано нечто постыдное и ныне уже не актуальное.
    Последний раз редактировалось Jetlend; 27.12.2016 в 22:11.

  6. #6
    Местный Аватар для SethNsk
    Информация о пользователе
    Регистрация
    25.03.2010
    Сообщений
    243
    Записей в дневнике
    7
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    Вроде типичная тема "Хочу то, не знаю что", но так оформлена и преподнесена что хочется помочь.

  7. #7
    Местный Аватар для SethNsk
    Информация о пользователе
    Регистрация
    25.03.2010
    Сообщений
    243
    Записей в дневнике
    7
    Репутация: 12 Добавить или отнять репутацию

    По умолчанию

    По спрайтам тебе поможет Victor Engine - Multi Frames. Но можно и в ручную поковырять, если есть минимальное понимание и не важна гибкость настройки.

  8. #8
    Познающий Аватар для Kolhe
    Информация о пользователе
    Регистрация
    06.11.2012
    Адрес
    Омск
    Сообщений
    470
    Репутация: 27 Добавить или отнять репутацию

    По умолчанию

    Вообще для такого мейкер не очень подходит. Какие-нибудь Юнити или Констракты лучше бы подошли.
    В целом, мейкер и так обрабатывает подобные изображения. Для доп. анимаций можно посмотреть эти скрипты:

    Character Control;
    Character Effects;
    Diagonal Movement;
    Multi Frames;
    Pixel Movement;

    Следует помнить, что они не работают без ядра Виктора (ссылка).

    Вы нам лучше свою графику покидайте, чтобы понятнее было.


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

    По умолчанию

    Здесь было написано нечто постыдное и ныне уже не актуальное.
    Последний раз редактировалось Jetlend; 27.12.2016 в 22:11.

  10. #10
    Познающий Аватар для Kolhe
    Информация о пользователе
    Регистрация
    06.11.2012
    Адрес
    Омск
    Сообщений
    470
    Репутация: 27 Добавить или отнять репутацию

    По умолчанию

    Такентай в принципе с головой бы подошел
    Ну так используйте. В чем проблема?
    засунуть саговские наработки в сеттинг рпг мейкера
    Спойлер :


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

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

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

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

Метки этой темы

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

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

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Игра по типу &quot;The Banner Saga&quot;, или мои влажные мечты.