Here it is, just input these four scripts above main (in order!) -
I edited everything and wrote the Scene_Map addition, the path finder was not done by me, I just removed the SDK dependancy for it because I know you all would flame me if I didn't :P
Just for clarification, once again, the only thing I actualy wrote is the Scene_Map addition. I rewrote the Mouse Coordinates script, but the part of it that makes it work was by Guedez.
Mouse Coordinates -
#==================================================================
# GMUS Guedez Mouse Use System
# Version: 1.0
# Released: 26/5/2006 Last Update: 1/6/2006
# Thx to: Cadafalso, Near Fantastica, and some guys from asylum!
# EDITED BY TSUNOKIETTE (to get neccesary parts only)
#==================================================================
$getCursorPos = Win32API.new("user32", "GetCursorPos", ['P'], 'V')
class Mouse_Coordinates
attr_reader :x
attr_reader :y
def initialize
@x = get_pos('x')
@y = get_pos('y')
end
def update
@x = get_pos('x')
@y = get_pos('y')
end
#==============================Thx to: Cadafalso===================
def get_pos(coord_type)
lpPoint = " " * 8 # store two LONGs
$getCursorPos.Call(lpPoint)
x,y = lpPoint.unpack("LL") # get the actual values
if coord_type == 'x'
return x
elsif coord_type == 'y'
return y
end
end
#==================================================================
end
Input -
#======================================
# ? Keyboard Script
#---------------------------------------------------------------------------
# ?By: Cybersam
# Date: 25/05/05
# Version 4
# EDITED BY TSUNOKIETTE (to get neccesary parts only)
#======================================
module Kboard
#--------------------------------------------------------------------------
$RMouse_BUTTON_L = 0x01 # left mouse button
$RMouse_BUTTON_R = 0x02 # right mouse button
$RMouse_BUTTON_M = 0x04 # middle mouse button
$RMouse_BUTTON_4 = 0x05 # 4th mouse button
$RMouse_BUTTON_5 = 0x06 # 5th mouse button
#--------------------------------------------------------------------------
GetKeyState = Win32API.new("user32","GetAsyncKeyState",['i'],'i')
GetKeyboardState = Win32API.new("user32","GetKeyState",['i'],'i')
GetSetKeyState = Win32API.new("user32","SetKeyboardState",['i'],'i')
#--------------------------------------------------------------------------
module_function
#--------------------------------------------------------------------------
def keyb(rkey)
if GetKeyState.call(rkey) != 0
return 1
end
return 0
end
#--------------------------------------------------------------------------
def keyboard(rkey)
GetKeyState.call(rkey) & 0x01 == 1 #
end
#--------------------------------------------------------------------------
def key(rkey, key = 0)
GetKeyboardState.call(rkey) & 0x01 == key #
end
end
Path Finder (not done by me) -
#==============================================================================
# Path Finding
#==============================================================================
# Near Fantastica
# Version 1
# 29.11.05
#==============================================================================
# Lets the Player or Event draw a path from an desonation to the source. This
# method is very fast and because the palthfinding is imbeded into the Game
# Character the pathfinding can be inturputed or redrawn at any time.
#==============================================================================
# Player :: $game_player.find_path(x,y)
# Event Script Call :: self.event.find_path(x,y)
# Event Movement Script Call :: self.find_path(x,y)
#-----
# SDK DEPENDANCY REMOVED BY TSUNOKIETTE (SUE ME)
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
alias nf_pf_game_character_initialize initialize
alias nf_pf_game_character_update update
#--------------------------------------------------------------------------
attr_accessor :map
attr_accessor :runpath
#--------------------------------------------------------------------------
def initialize
nf_pf_game_character_initialize
@map = nil
@runpath = false
end
#--------------------------------------------------------------------------
def update
run_path if @runpath == true
nf_pf_game_character_update
end
#--------------------------------------------------------------------------
def run_path
return if moving?
step = @map[@x,@y]
if step == 1
@map = nil
@runpath = false
return
end
dir = rand(2)
case dir
when 0
move_right if @map[@x+1,@y] == step - 1 and step != 0
move_down if @map[@x,@y+1] == step - 1 and step != 0
move_left if @map[@x-1,@y] == step -1 and step != 0
move_up if @map[@x,@y-1] == step - 1 and step != 0
when 1
move_up if @map[@x,@y-1] == step - 1 and step != 0
move_left if @map[@x-1,@y] == step -1 and step != 0
move_down if @map[@x,@y+1] == step - 1 and step != 0
move_right if @map[@x+1,@y] == step - 1 and step != 0
end
end
#--------------------------------------------------------------------------
def find_path(x,y)
sx, sy = @x, @y
result = setup_map(sx,sy,x,y)
@runpath = result[0]
@map = result[1]
@map[sx,sy] = result[2] if result[2] != nil
end
#--------------------------------------------------------------------------
def clear_path
@map = nil
@runpath = false
end
#--------------------------------------------------------------------------
def setup_map(sx,sy,ex,ey)
map = Table.new($game_map.width, $game_map.height)
map[ex,ey] = 1
old_positions = []
new_positions = []
old_positions.push([ex, ey])
depth = 2
depth.upto(100){|step|
loop do
break if old_positions[0] == nil
x,y = old_positions.shift
return [true, map, step] if x == sx and y+1 == sy
if $game_player.passable?(x, y, 2) and map[x,y + 1] == 0
map[x,y + 1] = step
new_positions.push([x,y + 1])
end
return [true, map, step] if x-1 == sx and y == sy
if $game_player.passable?(x, y, 4) and map[x - 1,y] == 0
map[x - 1,y] = step
new_positions.push([x - 1,y])
end
return [true, map, step] if x+1 == sx and y == sy
if $game_player.passable?(x, y, 6) and map[x + 1,y] == 0
map[x + 1,y] = step
new_positions.push([x + 1,y])
end
return [true, map, step] if x == sx and y-1 == sy
if $game_player.passable?(x, y, 8) and map[x,y - 1] == 0
map[x,y - 1] = step
new_positions.push([x,y - 1])
end
end
old_positions = new_positions
new_positions = []
}
return [false, nil, nil]
end
end
class Game_Map
#--------------------------------------------------------------------------
alias pf_game_map_setup setup
#--------------------------------------------------------------------------
def setup(map_id)
pf_game_map_setup(map_id)
$game_player.clear_path
end
end
class Game_Player
def update_player_movement
$game_player.clear_path if Input.dir4 != 0
# Move player in the direction the directional button is being pressed
case Input.dir4
when 2
move_down
when 4
move_left
when 6
move_right
when 8
move_up
end
end
end
class Interpreter
#--------------------------------------------------------------------------
def event
return $game_map.events[@event_id]
end
end
Scene_Map Addition (still place above main!) -
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs map screen processing.
#==============================================================================
class Scene_Map
include? Kboard
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias main_orig main
def main
@mouse_coordinates = Mouse_Coordinates.new
main_orig
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
alias update_orig update
def update
update_orig
# Update Mouse Coordinates
@mouse_coordinates.update
if Kboard.keyboard($RMouse_BUTTON_L)
# Get current coordinates
real_coord_x = @mouse_coordinates.x
real_coord_y = @mouse_coordinates.y
# Get column and row
tile_coord_x = real_coord_x / 32
tile_coord_y = real_coord_y / 32
# Get rid of the variance of 8 * 6
# ( 0 being the origin )
tile_coord_x -= 8
tile_coord_y -= 6
# If Negative Set to 0 for Safety
tile_coord_x = 0 unless tile_coord_x > -1
tile_coord_y = 0 unless tile_coord_y > -1
# Move
$game_player.find_path(tile_coord_x,tile_coord_y)
end
end
end
TRUE credit is in the comments at the top of each script.
eerrrrrrrrr there is one problem the caracter never stopes right on the mouse
Here's how to fix it, first replace the Scene_Map addition with this -
#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
# This class performs map screen processing.
#==============================================================================
class Scene_Map
include? Kboard
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
alias main_orig main
def main
@mouse_coordinates = Mouse_Coordinates.new
main_orig
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
alias update_orig update
def update
update_orig
# Update Mouse Coordinates
@mouse_coordinates.update
if Kboard.keyboard($RMouse_BUTTON_R)
# Get current coordinates
real_coord_x = @mouse_coordinates.x
real_coord_y = @mouse_coordinates.y
# Get column and row
tile_coord_x = real_coord_x / 32
tile_coord_y = real_coord_y / 32
print "Column : [#{tile_coord_x}] Row : [#{tile_coord_y}]"
end
end
end
This is what we call a method for testing the script, this is what is going to help us fix your problem.
Next, start a test play, and *obviously* choose new game. Then what you want to do is RIGHT CLICK the top left tile (all the way in the top left corner) and a window will pop up.
It should say something like -
Column : [8] Row : [6]
The numbers in the brackets will be what we call the "variance".
Take note of these numbers.
Now replace the Scene_Map addition with the original found in my first post.
Find this part in it -
# Get rid of the variance of 8 * 6
# ( 0 being the origin )
tile_coord_x -= 8
tile_coord_y -= 6
Replace the top number with the number you got for the column and the bottom number with the number you got for the row.
This should solve your problem.
If it doesn't or you don't understand anything I've said, say so and I'll try to help.
- Tsuno Out
Did you place all of the additions directly above Main? Including the Scene_Map addition?
B/c if you did, then I don't understand why you're getting that error.
If you look at the top of the Scene_Map addition, you'll see this
class Scene_Map
include? Kboard
the
include? Kboard
part makes sure that the script knows what I'm talking about when I say Kboard, and it should be able to use it.
Maybe if you put the scripts into the script editor out of order?
hmm, path finder, i have 1 A* path finder, for both 4 & 8 direction, simple but faster than one by near
#===============================================================================
# A* Path Finding
# credits: ngoa ho
# http://www.ngoaho.net- ngoaho91@yahoo.com.vn
#===============================================================================
class Path_Finding
def look_around
@open_list = []
for d in [2,4,6,8,1,3,7,9]
@open_list.push(d) if $game_map.passable?(@curent_node[0],@curent_node[1],d)
end
check_black_list
end
def go_back_a_node
@black_list.push(@curent_node)
@move_list.delete_at(-1)
@curent_node = @move_list[-1]
end
def get_range(dir)
case dir
when 1,2,3
node_y = @curent_node[1] + 1
when 7,8,9
node_y = @curent_node[1] - 1
else
node_y = @curent_node[1]
end
case dir
when 1,4,7
node_x = @curent_node[0] - 1
when 3,6,9
node_x = @curent_node[0] + 1
else
node_x = @curent_node[0]
end
x = (@goal_node[0] - node_x).abs
y = (@goal_node[1] - node_y).abs
return Math.sqrt(x**2+y**2)
end
def check_black_list
test_node = @curent_node
for i in 0..@open_list.size - 1
d = @open_list[i]
case d
when 1,2,3
test_node[1] += 1
when 7,8,9
test_node[1] -= 1
end
case d
when 1,4,7
test_node[0] -= 1
when 3,6,9
test_node[0] += 1
end
@open_list.delete_at(i) if @black_list.include?(test_node)
end
end
def get_best_node
min = -1
best_node = nil
for i in 0..@open_list.size - 1
n = get_range(@open_list[i])
if min == -1
min = n
best_node = @open_list[i]
else
if n < min
min = n
best_node = @open_list[i]
end
end
end
case best_node
when 1,2,3
@curent_node[1] += 1
when 7,8,9
@curent_node[1] -= 1
end
case best_node
when 1,4,7
@curent_node[0] -= 1
when 3,6,9
@curent_node[0] += 1
end
return best_node
end
def find_path(start,goal)
return [] if start == goal
# init array
@start_node = start
@curent_node = start
@goal_node = goal
@black_list = []
@move_list = []
# time limit, anti lag
start_time = Time.now
limit = $api.read_option("path_finding_time_limit").to_i
begin
loop do
if Time.now - start_time >= limit
break
end
look_around # check surrounding node
while @open_list == [] and @curent_node != @start_node# if no possible path
go_back_a_node
look_around
end
@move_list.push(get_best_node)# go to node closet to goal node
break if @curent_node == @goal_node# find goal node !
end
rescue Hangup
break
end
return @move_list
end
end
add it in main
$path_finding = Path_Finding.new
find path like this
@paths = $path_finding.find_path([now_x,now_y],[dest_x,dest_y])
** i can't write in unicode