Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

MS Custom Movement + New Mode 07 + Caterpillar Walking

Medina Stories Custom Movement System Version: 1.1.0
By: Juan J. Sánchez

Introduction

This script combines MGCaladtogel's New Mode 07 script and Fukuyama's Caterpillar Walking script, along with my custom movement system, allowing more frames, eight directions, sneaking, dashing, idle animation, custom stances, and much more. It works with both custom and standard character sets. It now features Kristovski's Add-on, which adjusts the game controls in accordance with the rotation of the camera, allowing for a pseudo-3D experience.

Features

  • Movement in four and eight directions
    Any standard amount of frames
    MGCaladtogel's New Mode 07 script compatibility
    Fukuyama's Caterpillar Walking script compatibility
    Kristovski's Add-on for MGCaladtogel's New Mode 07 (adjustment of game controls in accordance to the rotation of the camera)
    Simultaneous compatibility with both custom and standard character sets
    Standing frame
    Idle animation
    Custom stances for every direction (i.e., looking clockwise, looking counter clockwise, sitting, sitting looking clockwise, sitting looking counter clockwise, etc.)
    Dashing
    Sneaking
    Custom animations for every direction (frames, looping and speed can be customized)

Video

http://www.youtube.com/watch?v=7DJzZRpyV-A

Screenshots

MSCMS_001.jpg

MSCMS_002.jpg


Demo

Medina Stories Custom Movement System v1.1.0 Demo
Medina Stories Custom Movement System v1.0.0 Demo

Script

MGCaladtogel's New Mode 07 script
MGCmode7.dll file
Fukuyama's Caterpillar Walking script

Medina Stories Custom Movement System
Ruby:
#==============================================================================

# ** Movement

#------------------------------------------------------------------------------

#  This module contains global variables and classes.

#==============================================================================

 

module MOVEMENT

  #--------------------------------------------------------------------------

  # * General Configuration

  #     DIR8_ENABLED : 8 directions input enabled

  #     SUFFIX       : suffix for custom character sets

  #     DIRECTIONS   : standard number of directions

  #--------------------------------------------------------------------------

  DIR8_ENABLED = true

  SUFFIX       = '_custom'

  DIRECTIONS   = 8

    #----------------------------------------------------------------------

    # ** Stances

    #     STANCE_IDLE        : idle

    #     STANCE_LOOKING_CW  : looking clockwise

    #     STANCE_LOOKING_CCW : looking counter clockwise

    #     STANCE_SITTING     : sitting

    #     STANCE_SITTING_CW  : sitting looking clockwise

    #     STANCE_SITTING_CCW : sitting looking counter clockwise

    #----------------------------------------------------------------------

    STANCE_IDLE        = 1

    STANCE_LOOKING_CW  = 9

    STANCE_LOOKING_CCW = 10

    STANCE_SITTING     = 12

    STANCE_SITTING_CW  = 11

    STANCE_SITTING_CCW = 13

    #----------------------------------------------------------------------

    # ** Frames

    #     TOTAL_FRAMES        : total number of frames

    #     FRAMES              : standard number of frames

    #     STAND_FRAME_ENABLED : standing frame enabled

    #----------------------------------------------------------------------

    TOTAL_FRAMES        = 13

    FRAMES              = 8

    STAND_FRAME_ENABLED = true

    #----------------------------------------------------------------------

    # ** Idle Animation

    #     IDLE_ENABLED      : idle stance enabled

    #     IDLE_TIME         : idle stance time delay

    #     IDLE_FRAMES       : idle stance standard number of frames

    #     IDLE_LOOP_ENABLED : idle stance loop enabled

    #     IDLE_SPEED        : idle stance speed

    #----------------------------------------------------------------------

    IDLE_ENABLED      = true

    IDLE_TIME         = 200

    IDLE_FRAMES       = 8

    IDLE_LOOP_ENABLED = true

    IDLE_SPEED        = 2

  #--------------------------------------------------------------------------

  # * Action Configuration

  #     SPEED_NORMAL : normal speed

  #     SPEED_DASH   : dash speed

  #     SPEED_SNEAK  : sneak speed

  #--------------------------------------------------------------------------

  SPEED_NORMAL = 3

  SPEED_DASH   = 4

  SPEED_SNEAK  = 1

    #----------------------------------------------------------------------

    # ** Buttons

    #     DASH_BUTTON  : key for dashing

    #     SNEAK_BUTTON : key for sneaking

    #----------------------------------------------------------------------

    DASH_BUTTON  = Input::Z

    SNEAK_BUTTON = Input::Y

end

 

 

#==============================================================================

# ** Game_Character

#------------------------------------------------------------------------------

#  This class deals with characters. It's used as a superclass for the

#  Game_Player and Game_Event classes.

#==============================================================================

 

class Game_Character  

  #--------------------------------------------------------------------------

  # * Modules

  #--------------------------------------------------------------------------

  include MOVEMENT                        # MOVEMENT module

  #--------------------------------------------------------------------------

  # * Public Instance Variables

  #--------------------------------------------------------------------------

  attr_reader   :step_anime               # character step flag

  attr_reader   :walk_anime               # character movement flag

  attr_reader   :stop_count               # number of steps left

  attr_accessor :dashing                  # dashing flag

  attr_accessor :sneaking                 # sneaking flag

  attr_accessor :waiting                  # waiting flag

  attr_accessor :looking_cw               # looking clockwise flag

  attr_accessor :looking_ccw              # looking counter clockwise flag

  attr_accessor :sitting                  # sitting flag

  attr_accessor :sitting_cw               # sitting clockwise flag

  attr_accessor :sitting_ccw              # sitting counter clockwise flag

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    return update_custom_anim if @animating

    if jumping?

      update_jump

    elsif moving?

      update_move

    else

      update_stop

    end

    if @anime_count > 18 - @move_speed * 2

      if not @step_anime and @stop_count > 0

        @pattern = @original_pattern

      else

        if @character_name.include?(SUFFIX)

          @pattern = ((@pattern + 1 ) % FRAMES)

        else

          @pattern = ((@pattern + 1 ) % 4)

        end

      end

      @anime_count = 0

    end

    if @wait_count > 0

      @wait_count -= 1

      return

    end

    if @move_route_forcing

      move_type_custom

      return

    end

    return if @starting or lock?

    if @stop_count > (40 - @move_frequency * 2) * (6 - @move_frequency)

      case @move_type

      when 1  # Random

        move_type_random

      when 2  # Approach

        move_type_toward_player

      when 3  # Custom

        move_type_custom

      end

    end

  end

  #--------------------------------------------------------------------------

  # * Move Lower Left

  #--------------------------------------------------------------------------  

  def move_lower_left(turn_enabled = true)

    if turn_enabled

      turn_downleft

    end

    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or

       (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))

      @x -= 1

      @y += 1

      increase_steps

    end

  end

  #--------------------------------------------------------------------------

  # * Move Lower Right

  #--------------------------------------------------------------------------  

  def move_lower_right(turn_enabled = true)

    if turn_enabled

      turn_downright

    end

    if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or

      (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))

      @x += 1

      @y += 1

      increase_steps

    end

  end

  #--------------------------------------------------------------------------

  # * Move Upper Left

  #--------------------------------------------------------------------------  

  def move_upper_left(turn_enabled = true)

    if turn_enabled

      turn_upleft

    end

    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or

      (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))

      @x -= 1

      @y -= 1

      increase_steps

    end

  end

  #--------------------------------------------------------------------------

  # * Move Upper Left

  #--------------------------------------------------------------------------  

  def move_upper_right(turn_enabled = true)

    if turn_enabled

      turn_upright

    end

    if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or

      (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))

      @x += 1

      @y -= 1

      increase_steps

    end

  end

  #--------------------------------------------------------------------------

  # * Move Random

  #--------------------------------------------------------------------------

  def move_random

    case rand(8)

    when 0  # Move down

      move_down(false)

    when 1  # Move left

      move_left(false)

    when 2  # Move right

      move_right(false)

    when 3  # Move up

      move_up(false)

    when 4  # Move lower left

      move_lower_left

    when 5  # Move lower right

      move_lower_right

    when 6  # Move upper left

      move_upper_left

    when 7  # Move upper right

      move_upper_right

    end

  end

  #--------------------------------------------------------------------------

  # * Move Toward Player

  #--------------------------------------------------------------------------

  def move_toward_player

    sx = @x - $game_player.x

    sy = @y - $game_player.y

    return if sx == 0 and sy == 0

    abs_sx = sx.abs

    abs_sy = sy.abs

    if abs_sx == abs_sy

      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1

    end

    move_down                   if sy < 0

    move_left        if sx > 0

    move_right       if sx < 0

    move_up                     if sy > 0

    move_lower_left  if sx > 0 and sy < 0

    move_lower_right if sx < 0 and sy < 0

    move_upper_left  if sx > 0 and sy > 0

    move_upper_right if sx < 0 and sy > 0

  end

  #--------------------------------------------------------------------------

  # * Move Away From Player

  #--------------------------------------------------------------------------

  def move_away_from_player

    sx = @x - $game_player.x

    sy = @y - $game_player.y

    return if sx == 0 and sy == 0

    abs_sx = sx.abs

    abs_sy = sy.abs

    if abs_sx == abs_sy

      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1

    end

    move_down                    if sy > 0    

    move_left         if sx < 0 

    move_right        if sx > 0 

    move_up                      if sy < 0

    move_lower_left   if sx < 0 and sy > 0

    move_lower_right  if sx > 0 and sy > 0

    move_upper_left   if sx < 0 and sy < 0

    move_upper_right  if sx > 0 and sy < 0

  end  

  #--------------------------------------------------------------------------

  # * Turn Upper Left

  #--------------------------------------------------------------------------  

  def turn_upleft

    unless @direction_fix

      if DIRECTIONS == 8

        @direction = 7

      else

        @direction = (@direction == 6 ? 4 : @direction == 2 ? 8 : @direction)

      end      

    end

    @stop_count = 0

  end

  #--------------------------------------------------------------------------

  # * Turn Uppper Right

  #--------------------------------------------------------------------------  

  def turn_upright

    unless @direction_fix

      if DIRECTIONS == 8

        @direction = 9

      else

        @direction = (@direction == 4 ? 6 : @direction == 2 ? 8 : @direction)

      end

    end

    @stop_count = 0

  end

  #--------------------------------------------------------------------------

  # * Turn Lower Left

  #--------------------------------------------------------------------------  

  def turn_downleft

    unless @direction_fix

      if DIRECTIONS == 8

        @direction = 1

      else

        @direction = (@direction == 6 ? 4 : @direction == 8 ? 2 : @direction)        

      end

    end

    @stop_count = 0

  end

  #--------------------------------------------------------------------------

  # * Turn Lower Right

  #--------------------------------------------------------------------------  

  def turn_downright

    unless @direction_fix

      if DIRECTIONS == 8

        @direction = 3

      else

        @direction = (@direction == 4 ? 6 : @direction == 8 ? 2 : @direction)

      end

    end

  end

  #--------------------------------------------------------------------------

  # * Set Custom Animation

  #--------------------------------------------------------------------------

  def set_custom_anim

    return if @animating

    @total_frames = FRAMES

    @total_frames = IDLE_FRAMES       if @waiting

    @loop_enabled = false

    @loop_enabled = IDLE_LOOP_ENABLED if @waiting

    @anim_speed   = 1

    @anim_speed   = IDLE_SPEED        if @waiting

    @frame_count  = @total_frames

    @anim_wait    = 0

    @pattern      = 0

    @animating    = true

  end  

  #--------------------------------------------------------------------------

  # * Frame Update (custom animation)

  #--------------------------------------------------------------------------

  def update_custom_anim

    update_jump if jumping?

    if @anim_wait >= 8

      @pattern = ((@pattern + 1 ) % @total_frames)

      @frame_count -= 1

      @anim_wait = 0

    end

    @anim_wait += @anim_speed if @anim_wait < 18 - @move_speed * 2

    if @frame_count == 0

      if @loop_enabled == true

        @frame_count = @total_frames

      else

        end_custom_anim

      end

      return

    end

  end

  #--------------------------------------------------------------------------

  # * End Custom Animation

  #--------------------------------------------------------------------------

  def end_custom_anim

    @animating = false

    @waiting   = false if @waiting

  end

end

 

 

#==============================================================================

# ** Game_Player

#------------------------------------------------------------------------------

#  This class handles the player. Its functions include event starting

#  determinants and map scrolling. Refer to "$game_player" for the one

#  instance of this class.

#==============================================================================

 

class Game_Player < Game_Character

  #--------------------------------------------------------------------------

  # * Modules

  #--------------------------------------------------------------------------

  include MOVEMENT                        # MOVEMENT module

  #--------------------------------------------------------------------------

  # * Invariables

  #--------------------------------------------------------------------------

  @@idle_time = 0

  #--------------------------------------------------------------------------

  # * Public Instance Variables

  #--------------------------------------------------------------------------

  attr_accessor :idle_time                # idle time

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    @idle_time = @@idle_time

    unless $game_system.map_interpreter.running? or $game_temp.message_window_showing 

      @dashing  = false

      @sneaking = false

      trigger_d unless DASH_BUTTON  == nil

      trigger_s unless SNEAK_BUTTON == nil

      unless @dashing or @sneaking

        @move_speed = SPEED_NORMAL

      end

    end

    last_moving = moving?

    unless moving? or $game_system.map_interpreter.running? or

           @move_route_forcing or $game_temp.message_window_showing  

        if DIR8_ENABLED == true

          case Input.dir8

          when 2  # Move down

            move_down

          when 4  # Move left

            move_left

          when 6  # Move right

            move_right

          when 8  # Move up

            move_up

          when 1  # Move lower left

            move_lower_left

          when 3  # Move lower right

            move_lower_right

          when 7  # Move upper left

            move_upper_left

          when 9  # Move upper right

            move_upper_right

          end

          if IDLE_ENABLED

            if Input.dir8 == 0

              @@idle_time += 1 unless @waiting

              trigger_w if @@idle_time == IDLE_TIME

            else

              @@idle_time = 0

              @waiting = false

              end_custom_anim

            end

          end

        else

          case Input.dir4

          when 2  # Move down

            move_down

          when 4  # Move left

            move_left

          when 6  # Move right

            move_right

          when 8  # Move up

            move_up

          end

          if IDLE_ENABLED

            if Input.dir4 == 0

              @@idle_time += 1 unless @waiting

              trigger_w if @@idle_time == IDLE_TIME

            else

              @@idle_time = 0

              @waiting = false

              end_custom_anim

            end

          end

        end

      end

    last_real_x = @real_x

    last_real_y = @real_y

    super

    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y

      $game_map.scroll_down(@real_y - last_real_y)

    end

    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X

      $game_map.scroll_left(last_real_x - @real_x)

    end

    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X

      $game_map.scroll_right(@real_x - last_real_x)

    end

    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y

      $game_map.scroll_up(last_real_y - @real_y)

    end

    unless moving?

      if last_moving

        result = check_event_trigger_here([1,2])

        if result == false

          unless $DEBUG and Input.press?(Input::CTRL)

            if @encounter_count > 0

              @encounter_count -= 1

            end

          end

        end

      end

      if Input.trigger?(Input::C)

        check_event_trigger_here([0])

        check_event_trigger_there([0,1,2])

      end

    end

  end

  #----------------------------------------------------------------------

  # * Trigger Processing: Dash

  #----------------------------------------------------------------------  

  def trigger_d

    return if (DIR8_ENABLED ? Input.dir8 == 0 : Input.dir4 == 0)    

    return if Input.press?(SNEAK_BUTTON)

    if Input.press?(DASH_BUTTON)

      @dashing    = true

      @move_speed = SPEED_DASH

    end    

  end

  #----------------------------------------------------------------------

  # * Trigger Processing: Sneak

  #----------------------------------------------------------------------  

  def trigger_s

    return if (DIR8_ENABLED ? Input.dir8 == 0 : Input.dir4 == 0)

    return if Input.press?(DASH_BUTTON)

    if Input.press?(SNEAK_BUTTON)

      @sneaking   = true

      @move_speed = SPEED_SNEAK

    end

  end

  #----------------------------------------------------------------------

  # * Trigger Processing: Idle

  #----------------------------------------------------------------------  

  def trigger_w

    @@idle_time = 0

    @waiting    = true

    self.set_custom_anim

  end

end

 

 

#==============================================================================

# ** Sprite_Character

#------------------------------------------------------------------------------

#  This sprite is used to display the character.It observes the Game_Character

#  class and automatically changes sprite conditions.

#==============================================================================

 

class Sprite_Character < RPG::Sprite

  #--------------------------------------------------------------------------

  # * Modules

  #--------------------------------------------------------------------------

  include MOVEMENT                        # MOVEMENT module

  #--------------------------------------------------------------------------

  # * Frame Update

  #--------------------------------------------------------------------------

  def update

    super

    if @tile_id != @character.tile_id or

       @character_name != @character.character_name or

       @character_hue != @character.character_hue

      @tile_id = @character.tile_id

      @character_name = @character.character_name

      @character_hue = @character.character_hue

      if @tile_id >= 384

        self.bitmap = RPG::Cache.tile($game_map.tileset_name,

          @tile_id, @character.character_hue)

        self.src_rect.set(0, 0, 32, 32)

        self.ox = 16

        self.oy = 32

      else

        self.bitmap = RPG::Cache.character(@character.character_name,

          @character.character_hue)

        if @character.character_name.include?(SUFFIX)

          if STAND_FRAME_ENABLED

            @cw = bitmap.width / (TOTAL_FRAMES + 1)

          else

            @cw = bitmap.width / TOTAL_FRAMES

          end

          @ch = bitmap.height / DIRECTIONS

        else

          @cw = bitmap.width / 4

          @ch = bitmap.height / 4

        end

        self.ox = @cw / 2

        self.oy = @ch

      end

    end

    self.visible = (not @character.transparent)

    if @tile_id == 0

      if @character.character_name.include?(SUFFIX)

        if not @character.step_anime and @character.stop_count > 0

          if @character.waiting

            sx = (@character.pattern + STANCE_IDLE) * @cw

          else

            sx = @character.pattern * @cw

          end

        else

          if STAND_FRAME_ENABLED

            sx = (@character.pattern + 1) * @cw

          else

            sx = @character.pattern * @cw

          end

        end

      else

        sx = @character.pattern * @cw

      end

      sx = STANCE_LOOKING_CW  * @cw if @character.looking_cw

      sx = STANCE_LOOKING_CCW * @cw if @character.looking_ccw

      sx = STANCE_SITTING     * @cw if @character.sitting

      sx = STANCE_SITTING_CW  * @cw if @character.sitting_cw

      sx = STANCE_SITTING_CCW * @cw if @character.sitting_ccw

      if @character.character_name.include?(SUFFIX)

        if DIRECTIONS == 8

          value = (@character.direction == 7 or @character.direction == 9) ? 3 : 1

          sy = (@character.direction - value) * @ch

        else

          sy = (@character.direction - 2) / 2 * @ch

        end

      else

        sy = (@character.direction - 2) / 2 * @ch

      end

      self.src_rect.set(sx, sy, @cw, @ch)

    end

    self.x = @character.screen_x

    self.y = @character.screen_y

    self.z = @character.screen_z(@ch)

    self.opacity = @character.opacity

    self.blend_type = @character.blend_type

    self.bush_depth = @character.bush_depth

    if @character.animation_id != 0

      animation = $data_animations[@character.animation_id]

      animation(animation, true)

      @character.animation_id = 0

    end

  end

end

MGCaladtogel's New Mode 07 / MS Custom Movement Patch
Ruby:
#==============================================================================

# ** Sprite_Character

#------------------------------------------------------------------------------

#  This sprite is used to display the character.It observes the Game_Character

#  class and automatically changes sprite conditions.

#==============================================================================

 

class Sprite_Character < RPG::Sprite

  #--------------------------------------------------------------------------

  # * Modules

  #--------------------------------------------------------------------------

  include MOVEMENT                        # MOVEMENT module

  #--------------------------------------------------------------------------

  # * Aliased methods (F12 compatibility)

  #--------------------------------------------------------------------------

  if !@already_aliased

    alias update_neoM7_sprite_character update

    @already_aliased = true

  end

  #--------------------------------------------------------------------------

  # * Update

  #--------------------------------------------------------------------------

  def update

    if !$game_system.neoM7

      update_neoM7_sprite_character

      return

    end

    super

    if @tile_id != @character.tile_id or

       @character_name != @character.character_name or

       @character_hue != @character.character_hue

      @tile_id = @character.tile_id

      @character_name = @character.character_name

      @character_hue = @character.character_hue

      if @tile_id >= 384

        self.bitmap = RPG::Cache.tile($game_map.tileset_name,

          @tile_id, @character.character_hue)

        self.src_rect.set(0, 0, 32, 32)

        self.ox = 16

        self.oy = 32

      else

        self.bitmap = RPG::Cache.character(@character.character_name,

          @character.character_hue)

        if @character.character_name.include?(SUFFIX)

          if STAND_FRAME_ENABLED

            @cw = bitmap.width / (TOTAL_FRAMES + 1)

          else

            @cw = bitmap.width / TOTAL_FRAMES

          end

          @ch = bitmap.height / DIRECTIONS

        else

          @cw = bitmap.width / 4

          @ch = bitmap.height / 4

        end

        self.ox = @cw / 2

        self.oy = @ch

      end

    end

    self.visible = (not @character.transparent)

    if @tile_id == 0

      if @character.character_name.include?(SUFFIX)

        if not @character.step_anime and @character.stop_count > 0

          if @character.waiting

            sx = (@character.pattern + STANCE_IDLE) * @cw

          else

            sx = @character.pattern * @cw

          end

        else

          if STAND_FRAME_ENABLED

            sx = (@character.pattern + 1) * @cw

          else

            sx = @character.pattern * @cw

          end

        end

      else

        sx = @character.pattern * @cw

      end

      sx = STANCE_LOOKING_CW  * @cw if @character.looking_cw

      sx = STANCE_LOOKING_CCW * @cw if @character.looking_ccw

      sx = STANCE_SITTING     * @cw if @character.sitting

      sx = STANCE_SITTING_CW  * @cw if @character.sitting_cw

      sx = STANCE_SITTING_CCW * @cw if @character.sitting_ccw

      if @character.character_name.include?(SUFFIX)

        if DIRECTIONS == 8

          dir = (@character.direction == 7 or @character.direction == 9) ? 3 : 1

          current_dir = (@character.direction - dir)

          theta = $scene.spriteset.tilemap.theta rescue 0

          if $scene.spriteset != nil and $scene.spriteset.tilemap.is_a?(Tilemap_neoM7)

            dir_list = [0, 1, 2, 5, 6, 7, 4, 3]

            current_dir = dir_list[(dir_list.index(current_dir % 8) + ((theta + 22.5) % 360) / 45) % 8]

          end

          sy = current_dir * @ch

        else

          current_dir = (@character.direction - 2) / 2

          theta = $scene.spriteset.tilemap.theta rescue 0

          if $scene.spriteset != nil and $scene.spriteset.tilemap.is_a?(Tilemap_neoM7)

            dir_list = [0, 2, 3, 1]

            current_dir = dir_list[(dir_list.index(current_dir % 4) + ((theta + 45) % 360) / 90) % 4]

          end

          sy = current_dir * @ch

        end

      else

        current_dir = (@character.direction - 2) / 2

        theta = $scene.spriteset.tilemap.theta rescue 0

        if $scene.spriteset != nil and $scene.spriteset.tilemap.is_a?(Tilemap_neoM7)

          dir_list = [0, 2, 3, 1]

          current_dir = dir_list[(dir_list.index(current_dir % 4) + ((theta + 45) % 360) / 90) % 4]

        end

        sy = current_dir * @ch

      end

      self.src_rect.set(sx, sy, @cw, @ch)

      self.length = @cw

      self.height = @ch

    end

    x_intermediate = @character.screen_x

    y_intermediate = @character.screen_y - 4

    if $game_system.neoM7_loop

      diff_y = ($game_player.y - @character.y).to_i

      offset_y = ($game_map.height << 5) * (diff_y >= 0 ?

      (diff_y / ($game_map.height >> 1)) :

      (diff_y / ($game_map.height >> 1)) + 1)

      diff_x = ($game_player.x - @character.x).to_i

      offset_x = ($game_map.width << 5) * (diff_x >= 0 ?

      (diff_x / ($game_map.width >> 1)) :

      (diff_x / ($game_map.width >> 1)) + 1)

      neoM7_character(x_intermediate + offset_x, y_intermediate + offset_y)

    else

      neoM7_character(x_intermediate, y_intermediate)

    end

    if !on_screen_x(x) or !on_screen_y(y)

      self.opacity = 0

      return

    end

    neoM7_zoom(x, y)

    self.opacity = 255

    self.z = 4 * y

    self.y -= 32 * @character.height * zoom_y

    self.blend_type = @character.blend_type

    self.bush_depth = @character.bush_depth

    if @character.animation_id != 0

      animation = $data_animations[@character.animation_id]

      animation(animation, true)

      @character.animation_id = 0

    end

  end

end

Fukuyama's Caterpillar Walking / MS Custom Movement Patch
Ruby:
#==============================================================================

# ** Movement

#------------------------------------------------------------------------------

#  Caterpillar movement of actor is carried out on map.

#==============================================================================

 

module Train_Actor

  #============================================================================

  # ** Game_Party_Actor

  #----------------------------------------------------------------------------

  #  This class handles the party train actors. Its functions include event

  #  starting determinants and map scrolling.

  #============================================================================

  

  class Game_Party_Actor < Game_Character

    #------------------------------------------------------------------------

    # * Modules

    #------------------------------------------------------------------------

    include MOVEMENT                        # MOVEMENT module

    #------------------------------------------------------------------------

    # * Move Lower Left

    #------------------------------------------------------------------------

    def move_lower_left(turn_enabled = true)

      if turn_enabled

        turn_downleft

      end

      if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 4)) or

         (passable?(@x, @y, 4) and passable?(@x - 1, @y, 2))

        @x -= 1

        @y += 1

        increase_steps

      end

    end

    #------------------------------------------------------------------------

    # * Move Lower Right

    #------------------------------------------------------------------------

    def move_lower_right(turn_enabled = true)

      if turn_enabled

        turn_downright

      end

      if (passable?(@x, @y, 2) and passable?(@x, @y + 1, 6)) or

        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 2))

        @x += 1

        @y += 1

        increase_steps

      end

    end

    #------------------------------------------------------------------------

    # * Move Upper Left

    #------------------------------------------------------------------------

    def move_upper_left(turn_enabled = true)

      if turn_enabled

        turn_upleft

      end

      if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 4)) or

        (passable?(@x, @y, 4) and passable?(@x - 1, @y, 8))

        @x -= 1

        @y -= 1

        increase_steps

      end

    end

    #------------------------------------------------------------------------

    # * Move Upper Right

    #------------------------------------------------------------------------

    def move_upper_right(turn_enabled = true)

      if turn_enabled

        turn_upright

      end

      if (passable?(@x, @y, 8) and passable?(@x, @y - 1, 6)) or

        (passable?(@x, @y, 6) and passable?(@x + 1, @y, 8))

        @x += 1

        @y -= 1

        increase_steps

      end

    end

    #------------------------------------------------------------------------

    # * Frame Update

    #------------------------------------------------------------------------

    if @train_patch_stack.nil?

      @train_patch_stack = true

      alias train_patch_update update

      def update

        train_patch_update

        @dashing   = $game_player.dashing

        @sneaking  = $game_player.sneaking

        @waiting   = $game_player.waiting

        @idle_time = nil if !@waiting

        if @waiting && @character_name.include?(SUFFIX)

          @idle_time = $game_player.idle_time if @idle_time == nil

          @idle_time += 1

          if @idle_time == IDLE_TIME

            @idle_time = 0

            @waiting   = true

            self.set_custom_anim

          end

        end

        self.end_custom_anim if !@waiting

      end

    end

  end

end

Kristovski's Add-on
Ruby:
#============================================================================

# Add-on for H-Mode7 Engine

# V.1.1 - 10/01/2011

# Author : MGC

#

# This add-on reorients the direction controls when the map is rotated.

# This is a request from Kristovki.

#============================================================================

module Input

  #--------------------------------------------------------------------------

  # * Aliased methods (F12 compatibility)

  #--------------------------------------------------------------------------

  class << self

    if !@already_aliased

      alias dir4_neoM7_input dir4

      alias dir8_neoM7_input dir8

      @already_aliased = true

    end

  end

  #--------------------------------------------------------------------------

  # * Dir4

  #--------------------------------------------------------------------------

  Left = [6, 2, 8, 4]

  def self.dir4

    unless $game_system.neoM7

      return dir4_neoM7_input

    end

    input_value = dir4_neoM7_input

    unless input_value == 0

      case $game_system.neoM7_theta

      when 45...135

        camera_direction = 4

      when 135...225

        camera_direction = 2

      when 225...315

        camera_direction = 6

      else

        camera_direction = 8

      end

      case camera_direction

      when 2

        input_value = 10 - input_value

      when 4

        input_value = 10 - Left[(input_value >> 1) - 1]

      when 6

        input_value = Left[(input_value >> 1) - 1]

      when 8

        input_value = input_value

      end

    end

    return input_value

  end

  #--------------------------------------------------------------------------

  # * Dir8 - V.1.1

  #--------------------------------------------------------------------------

  Dir8_Index = [0, 5, 4, 3, 6, 0, 2, 7, 0, 1]

  Dir8_Left = [8, 9, 6, 3, 2, 1, 4, 7]

  def self.dir8

    unless $game_system.neoM7

      return dir8_neoM7_input

    end

    input_value = dir8_neoM7_input

    unless input_value == 0

      offset = (($game_system.neoM7_theta + 23) / 45) % 8

      input_value = Dir8_Left[(Dir8_Index[input_value] + offset) % 8]

    end

    return input_value

  end

end

Drawing Actor Graphic / MS Custom Movement Patch
Ruby:
#==============================================================================

# ** Window_Base

#------------------------------------------------------------------------------

#  This class is for all in-game windows.

#==============================================================================

 

class Window_Base < Window

  #--------------------------------------------------------------------------

  # * Modules

  #--------------------------------------------------------------------------

  include MOVEMENT                        # MOVEMENT module

  #--------------------------------------------------------------------------

  # * Draw Actor Graphic

  #     actor : actor

  #     x     : draw spot x-coordinate

  #     y     : draw spot y-coordinate

  #--------------------------------------------------------------------------

  def draw_actor_graphic(actor, x, y)

    bitmap = RPG::Cache.character(actor.character_name, actor.character_hue)

    if actor.character_name.include?(SUFFIX)

      if STAND_FRAME_ENABLED

        cw = bitmap.width / (TOTAL_FRAMES + 1)

      else

        cw = bitmap.width / TOTAL_FRAMES

      end

      ch = bitmap.height / DIRECTIONS

    else

      cw = bitmap.width / 4

      ch = bitmap.height / 4

    end    

    src_rect = Rect.new(0, 0, cw, ch)

    self.contents.blt(x - cw / 2, y - ch / 2, bitmap, src_rect)

  end

end

Instructions

Copy the scripts in the same order they were posted. The script, Medina Stories Custom Movement System, works as a stand-alone script. If you add MGCaladtogel's New Mode 07 script, you must add the MGCaladtogel's New Mode 07 / MS Custom Movement Patch. Remember to add the MGCmode7.dll file in your game folder if using MGCaladtogel's New Mode 07 script. If you add Fukuyama's Caterpillar Walking script, you must add the Fukuyama's Caterpillar Walking / MS Custom Movement Patch. Kristovski's Add-on allows you to change game controls in accordance to the rotation of the camera. The Draw Actor Graphic / MS Custom Movement Patch is necessary to fix an error in standard menus. If you are using custom menus, you might not need this patch.

The script works with almost any character set. You can configure the character set in the MOVEMENT module at the beginning of the Medina Stories Custom Movement System script. Every custom character set must have a suffix which can be defined in the MOVEMENT module. The standard suffix is "_custom". You can use the following character set from the MMORPG Ragnarok Online to test the script.

test_custom.png


Configuring and activating custom stances

Step 1. In the MOVEMENT module, under General Configuration, in the subsection Stances, add a variable with the frame number of your stance. The variable name should be written in capital letters and should be easy to remember. The standard name is "STANCE_<NAME>". For the purpose of teaching, I shall be using the name "STANCE_SITTING".

Ruby:
STANCE_SITTING = 1

Step 2. In the Game_Character class, under Public Instance Variables, add an attribute accessor with the same name as your stance. The attribute accessor name should be written in lower case letters. If your variable name is "STANCE_SITTING", your attribute accessor name should be "sitting".

Ruby:
attr_accessor :sitting

Step 3. In the Sprite_Character class, under update method, add the following code in line 582. If using MGCaladtogel's New Mode 07 / MS Custom Movement Patch, do this in the patch in line 78. This concludes the configuration of custom stances.

Ruby:
sx = STANCE_SITTING  * @cw if @character.sitting

Step 4. To activate a custom stance for a given character, event or player, in Event Commands, under Move Event..., under Script..., add the following code.

Ruby:
self.sitting = true

Step 5. To inactivate a custom stance for a given character, event or player, in Event Commands, under Move Event..., under Script..., add the following code.

Ruby:
self.sitting = false

Configuring and activating custom animations

Step 1. In the MOVEMENT module, under General Configuration, in the subsection Stances, add a variable with the initial frame number of your animation. The variable name should be written in capital letters and should be easy to remember. The standard name is "STANCE_<NAME>". For the purpose of teaching, I shall be using the name "STANCE_ATTACKING".

Ruby:
STANCE_ATTACKING = 1

Step 2. In the MOVEMENT module, under General Configuration, make a new subsection and add the following variables: <NAME>_FRAMES, <NAME>_LOOP_ENABLED and <NAME>_SPEED. The first variable determines how many frames the animation has. The second variable determines whether the animation stops or whether it plays in an infinite loop. The third variable determines the animation speed, from 1, the slowest speed, to 8, the fastest speed.

Ruby:
#----------------------------------------------------------------------

# ** Attacking Animation

#     ATTACKING_FRAMES       : attacking stance standard number of frames

#     ATTACKING_LOOP_ENABLED : attacking stance loop enabled

#     ATTACKING_SPEED        : attacking stance speed

#----------------------------------------------------------------------

ATTACKING_FRAMES       = 8

ATTACKING_LOOP_ENABLED = true

ATTACKING_SPEED        = 2

Step 3. In the Game_Character class, under Public Instance Variables, add an attribute accessor with the same name as your animation. The attribute accessor name should be written in lower case letters. If your variable name is "STANCE_ATTACKING", your attribute accessor name should be "attacking".

Ruby:
attr_accessor :attacking

Step 4. In the Game_Character class, under set_custom_anim method, add the following code at the beginning of the method, after the variables have been declared.

Ruby:
@total_frames = FRAMES

@total_frames = ATTACKING_FRAMES       if @attacking

@loop_enabled = false

@loop_enabled = ATTACKING_LOOP_ENABLED if @attacking

@anim_speed   = 1

@anim_speed   = ATTACKING_SPEED        if @attacking

Step 5. In the Game_Character class, under end_custom_anim method, add the following code at the end of the method.

Ruby:
@attacking = false if @attacking

Step 6. In the Sprite_Character class, under update method, add the following code in line 582. If using MGCaladtogel's New Mode 07 / MS Custom Movement Patch, do this in the patch in line 78. This concludes the configuration of custom animations.

Ruby:
sx = (@character.pattern + STANCE_ATTACKING) if @character.attacking

Step 7. To activate a custom animation for a given character, event or player, in Event Commands, under Move Event..., under Script..., add the following code.

Ruby:
self.attacking = true

self.set_custom_anim

Step 8. To inactivate a custom animation for a given character, event or player, in Event Commands, under Move Event..., under Script..., add the following code.

Ruby:
self.end_custom_anim

Compatibility

Not SDK compatible.

The script rewrites the following classes: Game_Character, Game_Player and Sprite_Character. MGCaladtogel's New Mode 07 script and Fukuyama's Caterpillar Walking script rewrite classes of their own.

The script assumes all characters, both events and players, have the same amount of directions. When using characters with different amount of directions, movement might become funny.

There seems to be an error with MGCaladtogel's New Mode 07 script. When looping a map, vertical sprites become unstable. You might want to avoid vertical sprites in looped maps, such as world maps.

Please inform me of any other compatibility issues.

Credits and Thanks

All credits for the Medina Stories Custom Movement System go to Juan J. Sánchez. Do not credit me as medinastories, Medina, Medina Stories, or any other variation of these names.

The New Mode 07 script and Kristovski's Add-on were written by MGCaladtogel. The Caterpillar Walking script was written by Fukuyama. I do not count with permissions to distribute the aforementioned scripts.

The character set provided, obtained from the MMORPG Ragnarok Online, is property of Gravity Co., LTD.

Special thanks go to DerVVulfman, whose scripts I edited to write my own. For a similar insight into custom movement, I suggest searching for DerVVulfman's Eight Directions & More Frames script.

Author's Notes

This script was designed for my RPG Maker XP project, Medina Stories. I first had the idea to make this script a couple of years ago upon encountering MGCaladtogel's New Mode 07 script. When I further analyzed DerVVulfman's Eight Directions & More Frames script, I decided to write my own script, specially designed for MMORPG Ragnarok Online character sets. After writing the Medina Stories Custom Movement System script, I then wrote the Fukuyama's Caterpillar Walking / MS Custom Movement Patch. Then I wrote the MGCaladtogel's New Mode 07 / MS Custom Movement Patch. Finally, I wrote the Draw Actor Graphic / MS Custom Movement Patch.

Terms and Conditions

Free for Commercial Use. Must include the scripter's name.
 
I still need to add a demo and to explain how to set up and activate custom stances and animations. The latter, unfortunately, is complicated and requires scripting. It's not terribly complicated, but it's definitely not recommended for anyone who doesn't know Ruby programming language.

EDIT: The demo is done. Since the last time I created an event system, RPG Maker 2000 was still popular, the demo works erratically, even though the system works perfectly. If anyone has any problems at all setting up a custom stance or animation, please let me know, and I will help you.
 
Oh geeze, it's that time of the year again. (That time is refering to the period where scripters happily release scripts with lots and lots of constants in it for random kids putting it in their 08/15 projects, rejoicing from 5000 functions that the didn't really need, but now that they got it will try to include. Especially mysterious, as you said you have to know RGSS to use the script - something's wrong there!)

Ranting aside, it's an interesting bunch of scripts... the preview screenshot looks pretty decent and visually attractive even with default graphics and the drag queen, but that might just be me, as I like RO graphics. The script itself is alright-if-not-perfectly documented, but you're definately able to find your way through it (especially since all movement systems more or less share the same architechture). The constants I don't like as much (that's right, still fighting!), but whatever floats your boat. You also have a lot of strange method names, such as 'trigger_d' - that you definately want to change, in my opinion.
You got a few inconsistancies with what most people write when writing RMVXP scripts, like capitalizing the module names, or including modules elsewhere. That makes it harder to read through your script in case you want to adjust something to your liking, so if that's something you care about, you might want to change that.
Other than that, it's written better than a lot of scripts I've seen... some fine tuning on the scripting style should make a pretty decent scripting fella out of you.

On a somewhat random side note, your RO sprite alignment seems a bit off... I can explain it to you in detail if you want (per PM though, not gonna spam your thread ^^), but basically, you have to align them by the head, then adjust the individual frames vertically by 1 pixel up or down. As I said, if you don't know what I'm talking about, ask for a more detailed explanation, please.
 
BlueScope":213h256s said:
On a somewhat random side note, your RO sprite alignment seems a bit off... I can explain it to you in detail if you want (per PM though, not gonna spam your thread ^^), but basically, you have to align them by the head, then adjust the individual frames vertically by 1 pixel up or down. As I said, if you don't know what I'm talking about, ask for a more detailed explanation, please.

I know the horizontal alignment is off by a few pixels, specially when walking sideways. The vertical alignment, believe it or not, is perfectly well aligned.The master file, which is perfectly aligned, it's based on a 256x256 grid. When I transposed it, the program moved the horizontal frames slightly. I've learned the only good way of doing this is taking your time.

I apologize for the many variables and functions in this script. Quite sincerely, the script was designed specifically for MMORPG Ragnarok Online character sets. Also, I don't believe you need to know RGSS to make the script work. But if you were to add custom animations or poses, you would probably need to know, at the very least, what is a variable.

You know, in high school I took Computer Science courses and learned Java. Ruby I've been learning over the years, but I still don't know what the language formalities. Could you give me some pointers?
 
The second screen you posted there is an example of where you should apply full settings to your Mode7 setup, meaning the map will scroll through the entire screen, not showing any horizon or anything. It looks like your characters are standing on the edge of the world, which I don't think is intended.

As far as scripting style goes... it's basically a matter of personal preference combined with what's common. Stuff like module/class names are identical in almost every script (e.g. Scene_Base, instead of SCENE_BASE or scenebase), and so are variables (e.g. @example_variable, not @examplevariable or @exampleVariable) and constants (e.g. THIS_IS_A_CONSTANT, not This_Is_A_Constant or ThisIsAConstant).
As I said, doing it differently doesn't make your script bad at all, however it makes it less understandable and possibly confusing. In conjunction with bad method/module/class/variable names, you'll have the problem of identifying stuff very soon. For example, SHOP might be a constant (my assumption), a class, a module, a local variable or a method of an included class/module... you see, it get's confusing ^^ (which is why Scene_Shop wold be a much better name and is instantly recognizeable).
Note that proper naming helps, but SCENE_SHOP still looks like a constant that might hold a boolean to activate/deactivate the shop, or something (while you shouldn't change constants at runtime, Ruby allows you to do so, so you have an additional uncertainty factor).

There's thousands of other things, but really... asking someone else for how you should do it won't work. Instead, like you said, get some pointers here and there, and create your own style. Personally, my priorities are on a well-understandable and 80% efficient code (meaning if there's a slightly more efficient way, but only a handful people know what that is, I'll use the a but less efficient way). Think of your priorities, and work accordingly. Some stuff like what I hinted you on before you should pay attention to, though - you'll quickly loose focus yourself otherwise.
Always keep in mind that not everything a language allows you to do is actually a good thing to do - think PHP (you don't have to put a semicolon after the very last line of code) or CSS (again, last element of your current definition doesn't need a closing semicolon). Ruby allows you to use semicolons as line seperators, however using them is actually not too smart unless for the very last day of development, where you can replace all your line breaks with these to cut your scripts down in size.

You'll figure something out ^^
 
Bummer. I thought this script would be more popular. I made it thinking that other people might actually use it, but I guess it's a script one too many. That is, it's been done before, perhaps not as nicely and well-documented, perhaps not these three particular scripts put together, but it's been done nonetheless.

Will have to see if my Final Fantasy XIII Menu script is a bigger deal. I think I'll release it on stages, since it's actually a bunch of very different classes and scenes bundled together.
 
I can only suggest you the same thing I suggested plague a while ago: Host your projects somewhere you can track the downloads (own webspace, or box.net, which is my favourite hoster), and see how many people actually download it and are interested in it. Not everyone leaves a comment, so judging upon posts left is not really the way to go if you ask me... especially these days, where the scripting-interested part of the community went south over the winter and never came back.
Also, you made it for yourself, so no reason to be disappointed - you need it anyways ^^

Most importantly, keep your chin up ^^
 
I had this idea one time.. where.. you could use a mode 7 map as the battle background... basically.. you would walk around with a more overhead view, then the screen would zoom in and the ground would bend back in kinda this sort of perspective up close as a battle backdrop.
I even had this idea for some how using something like this to make first person dungeons like in Phantasy Star 1
 
MGCaladtogel, the creator of the Mode 07 script, is currently working on a new version of the script called H-Mode 07. This is more like real 3D, but created with a 2D editor. It's very promising and I think would best suit your ideas. He also made a First Person Labyrinth Engine (FPLE) and an isometric engine. Behemoth, on the other hand, made a ray-casting engine, similar to MGCaladtogel's FPLE. He even made a Doom-like first person shooter, The Corps. I believe the project has a thread in the projects forum. You would be surprised how good it is.

http://www.youtube.com/watch?v=KlaGXR7dyy0

As for my script, I doubt it would do anything for your needs. Actually, I doubt any of these engines would at all be useful in battle, simply because these engines alter the Scene_Map class, which extends to a bunch of other classes such as Game_Actor, Game_Party, Game_Event, and Spriteset_Map, which have absolutely nothing to do with battle engines, which alter the Scene_Battle class.

That is to say, your Phantasy Star idea has been realized, by the FPLE and Behemoth's raycasting script, but your battle add-on idea would be difficult to accomplish, unless the battle took place in the map, like in most action games. It definitely can be done. I'm not suggesting I would do it, but I'm letting you know it's possible.
 
I update the script and the demo.

The script now features Kristovski's Add-on, which is a patch MGCaladtogel wrote for H-Mode 07 that reorients the game controls in accordance to the rotation of the camera. That is to say, if your character is looking down, and you rotate your camera 180º so that your character is looking up, if you press it will look as if your character is going up when in reality he's going down on the map.

I know this is difficult to understand. That's why I made a new demo, featuring the add-on. Try it out.
 
Dude this is a really nice script you have going here and im sure a lot of people will find it useful.

I personally havent downloaded the script but I have a few questions:

do you have to use every feature or can you just use the zoom feature or the 8 directional movement by themselves?

Does it lag like the video or is that just the video?
 
You definitely don't have to use all features together, and the script doesn't lag, at least on my PC.

EDIT: Actually, you'll notice the script has a lot of patches and add-ons. If you want to use the New Mode 7, you need the New Mode 7 patch, and so on.
 

Taylor

Sponsor

This is probably really bad of me because I've only just dug out RMXP after months of not using it, and are still downloading this demo...

But I remember that this Mode7 script had about two or three major issues. One specifically I wonder about is the auto-tiles one. If the frame-count of the autotiles did not match Grasslands (first one has 4, others 1) then the script would crash.

I'm wondering if that's been sorted?
 
First and foremost, I did not write the New Mode 7 script. MGCaladtogel did. However, I do believe in this last version he managed to sort out various issues. He's an active member at http://www.save-point.org, if you care to ask him personally. I would also like to point out that what I did write is the movement script, and a patch for the New Mode 7 script. If you have any questions regarding these, I would be more than happy to answer them for you.

EDIT: Personally, I don't use autotiles. But I did some research for you, and there does seem to be a bug with animated autotiles. This can be avoided by not using the [A] tag. However, your autotiles won't be animated.

Check the original thread at:
http://www.save-point.org/showthread.php?tid=2313
 
I've downloaded everything from Angevon, and I'm trying to put together my own sprite sheets using your "Custom Movement" script as a stand alone.

I did the math, and according to the 1050 x 784 sample you posted in the first post, the dimensions of each frame should be 75 x 98, but when I try to make a template, I end up with extra space at the edges of the picture.

Could you possibly tell me the correct dimensions for each frame? Are the idle and sitting stances different dimensions from the movement frames?

Thanks in advance, this script is great, and your game looks like it's going to be very nice looking. :D

(I'm also interested in using your License Board, but I don't have any questions about that yet.)
 
The answer is quite simple, the frames should be as small as possible. I, myself, am not spriter, and also have difficulty with this process. The simplest way is to use an image editing software, such as Adobe Photoshop, and figure out which pose has the largest width, and which pose has the largest height.
 
As I'm not sure that answers the question, lemme give you a hand... what you/Luminescense want to know is the size of one frame, however there's no such value. The spritesheet gets cut in several pieces, depending on the setup within the script that you can take yourself.
The default setup looks like:

[ Idle ][ 8x Walking ][ Looking Right ][ Looking Left ][ Sitting, Looking Right ][ Sitting ][ Sitting, Looking Left ]

That equals a number of 14 frames in each row, so whichever width your file might have, it'd get sliced in 14 columns (and 8 rows, if you use 8-way). For a sheet width of 1050, that is indeed 75px, so what I think happened is that you aligned the sprites wrong. If you got RO sprites, it's easiest to align them by the head, both vertically and horizontally.
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top