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.

Super Simple Vehicle System & World Map

Introduction
This is a vehicle system that is similar to the Final Fantasy system. In this system, you get vehicles (a canoe, ship, and dragon), the world tileset for Aveyond 2 (free to use in freeware games), and some autotiles.

Demo
You can download the demo here: DOWNLOAD VEHICLE SYSTEM DEMO HERE

Screenshot
world_F87.png


Script
You really should download the demo, becuase this system uses a mixture of script, map events, common events, variables, and switches. However, if you think you can figure it out on your own, here is the vehicle system script:
Code:
 

class Game_Character

  def passable?(x, y, d)

    

    # Get new coordinates

    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)

    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)

    

    # If coordinates are outside of map

    unless $game_map.valid?(new_x, new_y)

      return false

    end

    

    # If through is ON

    if @through

      return true

    end

        

    # If unable to leave first move tile in designated direction

    unless $game_map.passable?(x, y, d, self)

      return false

    end

    

    # If unable to enter move tile in designated direction

    unless $game_map.passable?(new_x, new_y, 10 - d)

      return false

    end

        

    #check terrain for vehicle

    check_terrain(new_x, new_y)    

      

    # Loop all events

    for event in $game_map.events.values

      # If event coordinates are consistent with move destination

      if event.x == new_x and event.y == new_y

        @state = true

        # If through is OFF

        unless event.through

          # If self is event

          if self != $game_player

            return false

          end

          # With self as the player and partner graphic as character

          if event.character_name != ""

            return false

          end

        end

      end

    end

    

    if @state == false

      return false

    end      

    

    # If player coordinates are consistent with move destination

    if $game_player.x == new_x and $game_player.y == new_y

      # If through is OFF

      unless $game_player.through

        # If your own graphic is the character

        if @character_name != ""

          return false

        end

      end

    end

      

    

    return true

    

  end

  

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

  # * Check the terrain for the vehicle

  #   @terrain (0=none, 1=river, 2=ocean, 3=air, 4=ground)

  #   @vehicle (0=foot, 1=canoe, 2=boat, 3=dragon)

  #   @state (true=passable tile, false=unpassable tile)

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

  def check_terrain(new_x, new_y)  

    @state = false

    @terrain = $game_map.terrain_tag(new_x, new_y)

    @vehicle = $game_variables[1]

    

    @state = true if @vehicle == 0 && @terrain == 4  #foot & ground

    @state = true if @vehicle == 1 && @terrain == 3  #canoe & river

    @state = true if @vehicle == 2 && @terrain == 2  #boat & ocean

    @state = true if @vehicle == 3                   #dragon

    @state = true if @terrain == 0

  end

 

end

 

class Game_Player < Game_Character

  

  alias in_vehicle_alias update

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

  # * Memorize actor graphic

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

  def actor_memorize

    @actor_name = $game_actors[1].character_name

    @actor_hue = $game_actors[1].character_hue

    @battler_name = $game_actors[1].battler_name

    @battler_hue = $game_actors[1].battler_hue

    return true

  end

 

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

  # * Restore actor graphic

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

  def actor_restore

    actor = $game_actors[1]

    actor.set_graphic(@actor_name.to_s, @actor_hue, @battler_name.to_s, @battler_hue)

    $game_player.refresh

    return true

  end    

  

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

  # * Enter a vehicle

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

  def enter_vehicle(type)

    

    $game_system.menu_disabled = true

    $game_system.save_disabled = true    

    

    if type != "dragon"

      @through = true

      move_forward

      @through = false    

    end

    

    actor_memorize

    actor = $game_actors[1]    

    actor.set_graphic(type, @actor_hue, @battler_name.to_s, @battler_hue) 

    

    $game_switches[1] = false    #Canoe Off     

    $game_switches[2] = false    #Boat Off     

    $game_switches[3] = false    #Dragon Off         

    

    if type == "canoe"

      $game_variables[1] = 1       #set terrian

      $game_switches[1] = true    #Canoe On

      Audio.bgm_play("Audio/BGM/047-Positive05", 100, 100) #play canoe music

  

    elsif type == "boat"

      $game_variables[1] = 2       #set terrian

      $game_switches[2] = true    #Boat On      

      Audio.bgm_play("Audio/BGM/046-Positive04", 100, 100) #play ship music

      

    elsif type == "dragon"

      $game_variables[1] = 3       #set terrian

      $game_switches[3] = true    #Dragon On  

      Audio.bgm_play("Audio/BGM/045-Positive03", 100, 100) #play dragon music

      

    end

    

    $game_player.refresh

    $game_map.refresh

    

    return true

  end

 

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

  # * Enter a vehicle

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

  def exit_vehicle

 

    $game_system.menu_disabled = false    

    $game_system.save_disabled = false

    

    if @terrain == 4

            

      if $game_switches[1] == true      #getting off canoe

        canoe = $game_map.events[1]     #get canoe event

        canoe.moveto(x, y)              #move to player's x, y coords

        $game_switches[1] = false       #Canoe Off   

        $game_variables[2] = x          #set canoe x coord

        $game_variables[3] = y          #set canoe y coord

        @through = true

        move_forward

        @through = false          

        

      elsif $game_switches[2] == true   #getting off boat

        boat = $game_map.events[2]      #get boat event

        boat.moveto(x, y)               #move to player's x, y coords        

        $game_switches[2] = false       #Boat Off    

        $game_variables[4] = x          #set boat x coord

        $game_variables[5] = y          #set boate y coord  

        @through = true

        move_forward

        @through = false                  

        

      elsif $game_switches[3] == true   #getting off dragon

        dragon = $game_map.events[3]    #get dragon event

        dragon.moveto(x, y)             #move to player's x, y coords        

        $game_switches[3] = false       #Dragon Off    

        $game_variables[6] = x          #set dragon x coord

        $game_variables[7] = y          #set dragon y coord        

      end

      

      # get off vehicle

      actor_restore

    

      # reset terrain

      $game_variables[1] = 0           

    

      # play walking music

      Audio.bgm_play("Audio/BGM/044-Positive02", 100, 100) #play music

      

      $game_player.refresh  

      $game_map.refresh    

    

    end

  

  end 

  

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

  # * Frame Update

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

  def update

    in_vehicle_alias

    # if not on ground terrain, check for boat exit

    if $game_variables[1] != 0

      if Input.trigger?(Input::C)

        exit_vehicle

      end   

    end

  end

 

end

 

Add An Additional Vehicle
1. Create a switch for your new vehicle. Call it "using vehicle" (replace vehicle with the name of your vehicle).

2. Create two variables for your vehicle. Call them "vehicle x" and "vehicle y" (replace vehicle with the name of your vehicle).

3. Add an event on your map for your new vehicle. Set it up to look like the other vehicle events. Modify the switches on the event so that they are for your vehicle, not the dragon, canoe, or boat vehicle. Modify the script call in the event so that it is for your vehicle. For example:
Code:
 

$game_player.enter_vehicle("hovercraft")

 

4. Put your vehicle sprite in your project's "characters" folder. Make sure that the name of the vehicle is exactly what you specified in step 3. For example, hovercraft.png

5. Get a peice of paper and write down the slot numbers for your switch, your variables, and the event you created for your vehicle. You will need to reference them later in your code.

6. Open the script editor and go to the Vehicle Script section.

7. In def check_terrain, add a new if statement for your vehicle. For example:
Code:
 

    @state = true if @vehicle == 4 && @terrain == 5  #hovercraft & swamp

 

8. In def enter_vehicle, add the switch you created for your vehicle to the list. For example:
Code:
 

    $game_switches[283] = false    #turn off the "using hovercraft" switch 

 

9. In def enter_vehicle, add a new if statement for your vehicle. For example:
Code:
 

    elsif type == "hovercraft"

      $game_variables[1] = 5       #set terrian

      $game_switches[4] = true    #Hovercraft On  

      Audio.bgm_play("Audio/BGM/045-Positive03", 100, 100)

 

10. In def exit_vehicle, add a new if statement for your vehicle. For example:
Code:
 

      elsif $game_switches[4] == true   #getting off hovercraft

        dragon = $game_map.events[4]  #get hovercraft event

        dragon.moveto(x, y)                 #move to player's x, y coords        

        $game_switches[4] = false        #turn "using hovercraft" off    

        $game_variables[8] = x             #set hovercraft x coord

        $game_variables[9] = y             #set hovercraft y coord    

 

Credits
SephirothSpawn: I made this script after studying SephirothSpawn's (mr. talented!) vehicle script.
DerVVulfman: Enhancing the system!

Bugs
If you find a bug, let me know! I'm crazy busy right now, but I will try to fix any problems. Or, if an advanced scripter wants to take over this project, feel free to do so (again, i'm crazy busy with work). There are some gotchas with this system:
1. Don't use terrain flags on any map but your world map. (if you do, put an if statement in the code so that the vehicle system only works with your world map.
2. If you use a tileset background for an event on your world map, your vehicle will go over it. Use an empty character sprite if you run into problems.
 

KAIRE

Member

That's good, is there anyway to make the map loop? By the way, the dragon(air-ship) manage to get into the ice-cave. Is that how it's suppost to be?
 
The dragon can also take the boat... and when it comes out it does not seem to fly anymore (it gets stopped by the trees)... and secondly another dragon in the map appears.
Maybe you should disable the possibility of taking a vehicle when already on a vehicle.
However i like it.
 
Fixed! You can no longer fly into a cave, nor will the dragon land on the ship.

I could make the map loop, but I think that is for another script. There is one available, right?

:)
 
Sure, just add a speed call into your script. Put it in the enter_vehicle and exit_vehicle methods. I'm not quite sure what the call is off the top of my head. Anyone else know?
 
I see the issue.

The problem occurs as you exit the vehicle. When you do, the character doesn't stay 'directly' under the vehicle, but takes a step forward... crossing terrain impassible borders (as it were). Boarding a vehicle doesn't create an issue (even though the vessel also moves forward one tile) as the vessel follows its own terrain rules. But leaving a vehicle with this problem could cause a problem.

While the 'forward step' feature would work fine with vehicles such as boats and ships (cosmetically as well as technically), you may wish to have a separate 'exit vehicle' system for air-based vessels.

Or an option for such by the end-user's choice.
 
Theres still an issue with the vehicles. I was in the dragon, got in the canoe from it, the canoe went on land, i got back in the dragon, then I went to its island and got out and I was in the canoe, and the canoe could only go on land. Plus the bugs with other maps I read about I don't think I will be using this which is a bummer because I like it...
 
well, this really isn't an issue, but when you are using a vehicle, the menu shows a vehicle instead of the main characters graphic. anyway to prevent this? or should i just disable the menu while in a vehicle?
 
Okay, I just fixed the canoe and menu problems. You can no longer enter the canoe (you fly over it), and the menu won't open when you are in a vehicle. :)

(I just got crazy busy with work, but I will add a speed boost to the dragon and map wrapping in a week, since I'll need this for my game as well.)
 
Hey sorry if this is a really easy thing I messed up on doing but I am having problems with the script when I put it into my own game. after I put it in and hopefully put the terrian tags on right I got in the canoe and noticed I can go through the ship but thats not a big problem but the big one I have is after I've been in the canoe everytime I get off onto land It turns my character graphic into a canoe.

So if you could please help me that would be great :D
If you need anymore info or maybe a screenshot or something let me know.
 
I found another bug... this is sorta like the canoe problem except it gets messed up with the boat too.

Land the dragon one tile next to the boat or canoe (so you're under the dragon and next to the boat). Face the boat and press the action key-- you should ride the dragon. Then if you land the dragon you become the boat! And you can run around on land as the boat and access the menu. It's nothing major, but still bad for gameplay.
 

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