Hey, SoggyDog
replace pathfinder.ahk with this one:
/**********************************************************************
PFADFINDER + LEVELEDITOR - Pre ALPHA
ver 0.1
coded by IsNull - 01.01.2009
TODO:
-----------
- easy save current map
***********************************************************************
*/
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
#SingleInstance, force
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
SetBatchLines, -1
;---------------------------------------------------------------------------------------
#Include, %A_ScriptDir%\INCLUDE\AStar.ahk
#Include, %A_ScriptDir%\INCLUDE\pfadfinder.dialoge.ahk
;----------------
;-------------------
G_BEGEHBAR := " "
G_WALL_UD := "X"
G_TARGET := "T"
G_PLAYER := "1"
;-------------------------------------------
ver := "0.3 ALPHA"
SkinPath := A_Temp
;-------------------------------------------
;Copy immages into temp:
Loop,%A_ScriptDir%\gfx\*.*
{
SplitPath,A_LoopFileFullPath,Filename
FileCopy, %A_LoopFileFullPath%, %SkinPath%\%Filename%, 0
}
;-------------------------------------------
Loop, %0%
p%a_index% := %A_index%
If(p1 != ""){
IfNotExist, %p2%
{
MsgBox,16,ERROR, Die Map konnte nicht gefunden werden!`n%p2%(file missing)
p1 := ""
}else{
filename := p2
}
}
If(p1 != "astar"){
OnMessage(0x200, "WM_MOUSEMOVE")
Gui, 1:default
Gui, Color, white
GUI, add, EDIT, vwith w50 yP+30 x10 h20,10
GUI, add, EDIT, vhight w50 yp xP+70 h20,10
GUI, add, Button, gCreateMAP xp+60 yp, [.create]
GUI, add, text, x10 yp+50 w100,Brush:
GUI, add, DDl, x10 yp+20 w120 vDDL_BRUSH gCHANGE_BRUSH,Begehbar|WALL UD||PLAYER|TARGET
GUi, font, s10,courier
GUI, add, EDIT, x10 yp+50 w300 h300 vMAP_DUMP
GUi, font,
Menu, FileMenu, Add, &Open Map Ctrl+O, MenuFileOpen ; See remarks below about Ctrl+O.
Menu, FileMenu, Add, &Export Map Ctrl+E, MenuFileExport
Menu, FileMenu, Add, &SHOW Map Ctrl+S, MenuFileSHOW
Menu, MenuA_STAR, Add, WALK, MenuA_STAR
Menu, FileMenu, Add, E&xit, MenuHandler
Menu, HelpMenu, Add, &About, MenuAbout
Menu, MyMenuBar, Add, &MAP, :FileMenu ; Attach the two sub-menus that were created above.
Menu, MyMenuBar, Add, &A-Star, :MenuA_STAR
Menu, MyMenuBar, Add, &Help, :HelpMenu
Gui, Menu, MyMenuBar
Gui, show, h420 w320 ,Labyrint Leveleditor %ver%
GUI, +LastFound
Dock_HostID := WinExist()
Gosub, CHANGE_BRUSH
}else{
FileRead, map, %p2%
IMPORT_MAP(map)
CreateGUI(G_DIMENSION_W,G_DIMENSION_H,1)
Gosub, RUN_ASTAR
}
IF(p1 = "load"){
FileRead, map, %p2%
IMPORT_MAP(map)
CreateGUI(G_DIMENSION_W,G_DIMENSION_H,1)
}
return
;####################################################################
MenuHandler:
ExitApp
return
/*
#IfWinActive, Level Map
Up::
Down::
Left::
Right::
If(p1 = "astar"){
Return
}
MOVE_PLAYER(A_ThisLabel)
return
*/
MenuA_STAR:
cmd = "%A_ScriptDir%\%A_ScriptName%" astar "%filename%"
FileDelete, %A_Temp%\run.bat
FileAppend, % cmd, %A_Temp%\run.bat
run, %A_Temp%\run.bat,,Hide
return
RUN_ASTAR:
LOAD_leveL(EXPORT_MAP())
FieldCNT := GameH * GameW
SplashImage, %A_ScriptDir%\gfx\astar_spalsh.jpg, , calculating path,, A* Calculation
myway := astar()
SplashImage , OFF
If(!myway){
msgbox,64,Warnung, Leider existiert keine Möglichkeit, das Ziel zu erreichen.
return
}
WALK_WAY(myway)
cmd = "%A_ScriptDir%\%A_ScriptName%" load "%filename%"
FileDelete, %A_Temp%\run.bat
FileAppend, % cmd, %A_Temp%\run.bat
run, %A_Temp%\run.bat,,Hide
return
WALK_WAY(WAY){
global
cycle := 300 ;ms
Loop, parse, WAY, },{
{
If(A_LoopField = ""){
Continue
}
MOVE_PLAYER(A_LoopField)
sleep, % cycle
}
}
MenuAbout:
msg := "Create easy Labyrint-Levelmaps and let the Tool find a path from Player to Target. Core of this Project is the A*-Algorythm.`n`nThe "
. "pathfinding A* (A-Star) Algorythm search the optimal path. Then, the Script will show it with animations.`n`nCoded by IsNull 2009"
. "`n::Librarys::`n`n"
. "`tDock `t`tby majkinetor`t`tver 1.0`n"
. "`tBin Array `tby derRaphael`t`tver RC2`n"
. "`tastar `t`tby IsNull + Lexikos`tver " astar_ver
HNDL := DIALOGE_SPAN(msg)
sleep, 7000
DIALOGE_SPAN_KILL(HNDL)
return
;-------------------------------------------
MenuFileSHOW:
GUI, 1:Default
GuiControl,,MAP_DUMP, % EXPORT_MAP()
GUI, 2:Default
return
MenuFileExport:
map_dump := EXPORT_MAP()
FileSelectFile,filename, S,%a_scriptdir%\MAPS,Speichern sie die Map,*.map
If("map" != substr(filename,strlen(filename)-2)){
filename .= ".map"
}
FileDelete, % filename
FileAppend, % map_dump, % filename
run, notepad.exe %filename%
return
MenuFileOpen:
FileSelectFile,filename, ,%a_scriptdir%\MAPS,Wählen sie die zu öffnende Map,*.map
FileRead, map_dump, % filename
IMPORT_MAP(map_dump)
CreateGUI(G_DIMENSION_W,G_DIMENSION_H,1)
return
/************************************************
Parst den MAP-Array und schreibt eine ASCII-MAP
*************************************************
*/
EXPORT_MAP(){
global
x := 1, y := 1
map_dump := ""
Loop, % G_DIMENSION_H
{
Loop, % G_DIMENSION_W
{
map_dump .= GMAP_X%x%Y%y%
x += 1
}
x := 1
y += 1
map_dump .= "`n"
}
return, map_dump
} ;**********************************************
/***************************************************
Importiert eine ASCII-MAP und schreibt sie in den
MAP-ARRAY
****************************************************
*/
IMPORT_MAP(map_dump){
global
xCRD := 1
yCRD := 1
G_DIMENSION_W := 0
G_DIMENSION_H := 0
Loop, parse, map_dump, `n, `r
{
If(A_LoopField = ""){
Continue
}
Loop, parse, A_LoopField
{
GMAP_X%xCRD%Y%yCRD% := A_LoopField
xCRD += 1
}
yCRD += 1
UPDATEMAX(G_DIMENSION_H,yCRD)
UPDATEMAX(G_DIMENSION_W,xCRD)
xCRD := 1
}
G_DIMENSION_W -= 1
G_DIMENSION_H -= 1
return, 1
} ;************************************************
UPDATEMAX(byref var,val){
IF(var = ""){
var := val
}else If (var < val){
var := val
}
}
CHANGE_BRUSH:
GUi, submit, nohide
If(DDL_BRUSH = "WALL UD"){
G_PIC := SkinPath "\wall.bmp"
G_SIGN := G_WALL_UD
}else if (DDL_BRUSH = "Begehbar"){
G_PIC := SkinPath "\begehbar.bmp"
G_SIGN := G_BEGEHBAR
}else if (DDL_BRUSH = "PLAYER"){
G_PIC := SkinPath "\player.bmp"
G_SIGN := G_PLAYER
}else if (DDL_BRUSH = "TARGET"){
G_PIC := SkinPath "\TARGET.bmp"
G_SIGN := G_TARGET
}
return
CreateMAP:
Gui, submit, NoHide
CreateGUI(with,hight)
return
GuiClose:
Exitapp
return
/*********************************************************************
Erstellt ein neues GUI
**********************************************************************
*/
CreateGUI(w,h,load = 0){
global
;----------------
Fwith := Fhight := 20
XPOS := 10
YPOS := 10
xCRD := 1
yCRD := 1
EDITOR_NAME := "Level Map (" w " x " h ")"
G_DIMENSION_W := w
G_DIMENSION_H := h
;----------------
Gui, 2:Default
Gui, destroy
Gui, Color, black
FeldNr := 1
Loop, % G_DIMENSION_H
{
Loop, % G_DIMENSION_W
{
;erstelle neues, leeres Spielfeld
Gui, add, Picture, w%Fwith% h%Fhight% vFELD%FeldNr% hwndFELDID%FeldNr% x%XPOS% y%YPOS%, %SkinPath%\begehbar.bmp
If(!load){
GMAP_X%xCRD%Y%yCRD% := G_BEGEHBAR
}else{
Type_ := GMAP_X%xCRD%Y%yCRD%
If(Type_ = "X"){
GuiControl,,FELD%FeldNr%, %SkinPath%\wall.bmp
}else if (Type_ = " "){
GuiControl,,FELD%FeldNr%, %SkinPath%\begehbar.bmp
}else if (Type_ = "T"){
GuiControl,,FELD%FeldNr%, %SkinPath%\TARGET.bmp
CURRENT_TARGET_X := xCRD
CURRENT_TARGET_Y := yCRD
}else if (Type_ = "1"){
GuiControl,,FELD%FeldNr%, %SkinPath%\player.bmp
CURRENT_PLAYER_X := xCRD
CURRENT_PLAYER_Y := yCRD
}
}
GFNr_X%xCRD%Y%yCRD% := FeldNr
%FeldNr%_COORD := xCRD "|" yCRD
XPOS += 21
++xCRD
++FeldNr
}
YPOS += 21
XPOS := 10
yCRD += 1
xCRD := 1
}
Gui, add, StatusBar,,
SB_SetParts(100)
SB_SetText("Map loaded", 2)
Gui, show, , % EDITOR_NAME
Gui,+Lastfound
GUI_ID := WinExist()
Dock(GUI_ID, "1,0,10, 0,0,0")
} ;******************************************************************
/********************************************************************
section_
0 = UPDATE FULL MAP
1 = UPDATE PLAYER RANGE
2 = UPDATE TARGET RANGE
*********************************************************************
*/
UPDATE_GUI(section_ = 0){
global
xCRD := 1
yCRD := 1
FeldNr := 1
Gui, 2:Default
Loop, % G_DIMENSION_H
{
Loop, % G_DIMENSION_W
{
Ignore_ := false
IF(section_ = 1){
If(like_one(CURRENT_PLAYER_Y,yCRD) AND like_one(CURRENT_PLAYER_X,xCRD)){
;sind ähnlich
}else{
Ignore_ := true
}
}else IF(section_ = 2){
If(like_one(CURRENT_TARGET_Y,yCRD) AND like_one(CURRENT_TARGET_X,xCRD)){
;sind ähnlich
}else{
Ignore_ := true
}
}
If(!Ignore_){
Type_ := GMAP_X%xCRD%Y%yCRD%
If(Type_ = "X"){
GuiControl,,FELD%FeldNr%, %SkinPath%\wall.bmp
}else if (Type_ = " "){
GuiControl,,FELD%FeldNr%, %SkinPath%\begehbar.bmp
}else if (Type_ = "T"){
GuiControl,,FELD%FeldNr%, %SkinPath%\TARGET.bmp
CURRENT_TARGET_X := xCRD
CURRENT_TARGET_Y := yCRD
}else if (Type_ = "1"){
GuiControl,,FELD%FeldNr%, %SkinPath%\player.bmp
CURRENT_PLAYER_X := xCRD
CURRENT_PLAYER_Y := yCRD
}else{
GuiControl,,FELD%FeldNr%, %SkinPath%\begehbar.bmp
}
}
GFNr_X%xCRD%Y%yCRD% := FeldNr
%FeldNr%_COORD := xCRD "|" yCRD
++xCRD
++FeldNr
}
yCRD += 1
xCRD := 1
}
}
/********************************
*********************************
*/
like_one(z1,z2){
IF(z1 = z2){
return, 1
}else if (z1 = (z2 + 1)){
return, 1
}else if (z1 = (z2 - 1)){
return, 1
}else{
return, 0
}
} ;******************************
GETFieldNr02(x,y){
global
return, GFNr_X%x%Y%y%
}
GetFieldCoord(FNr){
global
Return, %FNr%_COORD
}
SETField(typ,FNr,G_PIC){
global
If(FNr = ""){
return, 0
}
GuiControl,,FELD%NR%, %G_PIC%
cc := GetFieldCoord(FNr)
pos := RegExMatch(cc,"([0-9]*)\|([0-9]*)",out)
If(!pos){
return, 0
}
GMAP_X%out1%Y%out2% := typ
return, 1
}
MOVE_PLAYER(DIRECTION){
global
If((CURRENT_PLAYER_X = "") OR (CURRENT_PLAYER_Y = "")){
return
}
STOP_SCAN := true
new_posx := CURRENT_PLAYER_X
new_posy := CURRENT_PLAYER_Y
If(DIRECTION = "UP"){
new_posy -= 1
}else if (DIRECTION = "DOWN"){
new_posy += 1
}else if (DIRECTION = "LEFT"){
new_posx -= 1
}else if (DIRECTION = "RIGHT"){
new_posx += 1
}else{
msgbox,16,ERROR, % "UNKNOWN Direction: " DIRECTION
}
If((new_posx < 1) OR (new_posy < 1)){
return
}
If((new_posx > G_DIMENSION_W) OR (new_posy > G_DIMENSION_H)){
return
}
ZielFeld := GMAP_X%new_posx%Y%new_posy%
If(ZielFeld = "X"){
SoundBeep, 500,500
return
}
NEW_PLAYER_FIELD := GETFieldNr02(new_posx,new_posy)
SET_PLAYER(NEW_PLAYER_FIELD)
STOP_SCAN := false
If (ZielFeld = "T"){
MsgBox,64,Gratualtion, Ziel erreicht :)
}
}
SET_PLAYER(FNr){
global
;Akutelle Playercoord ermitteln:
cc := GetFieldCoord(FNr)
RegExMatch(cc,"([0-9]*)\|([0-9]*)",a)
If(a1 = CURRENT_PLAYER_X) AND (a2 = CURRENT_PLAYER_Y){
Return
}
;löschen des alten Players
OLDPL_NR := GETFieldNr02(CURRENT_PLAYER_X,CURRENT_PLAYER_Y)
SETField(G_BEGEHBAR,OLDPL_NR,SkinPath "\begehbar.bmp")
UPDATE_GUI(1)
CURRENT_PLAYER_X := a1
CURRENT_PLAYER_Y := a2
PNr_current := GETFieldNr02(CURRENT_PLAYER_X,CURRENT_PLAYER_Y)
SETField(G_PLAYER,PNr_current,SkinPath "\player.bmp")
UPDATE_GUI(1)
}
SET_TARGET(FNr){
global
;Akutelle Playercoord ermitteln:
cc := GetFieldCoord(FNr)
RegExMatch(cc,"([0-9]*)\|([0-9]*)",a)
If(a1 = CURRENT_TARGET_X) AND (a2 = CURRENT_TARGET_Y){
Return
}
;löschen des alten Players
OLDPL_NR := GETFieldNr02(CURRENT_TARGET_X,CURRENT_TARGET_Y)
SETField(G_BEGEHBAR,OLDPL_NR,SkinPath "\begehbar.bmp")
UPDATE_GUI(2)
CURRENT_TARGET_X := a1
CURRENT_TARGET_Y := a2
TNr_current := GETFieldNr02(CURRENT_TARGET_X,CURRENT_TARGET_Y)
SETField(G_TARGET,TNr_current,SkinPath "\TARGET.bmp")
UPDATE_GUI(2)
}
/**************************************
*
***************************************
*/
WM_MOUSEMOVE(){
global
If(STOP_SCAN){
return
}
MouseGetPos,, , OutputVarWin, OutputVarControl
If(OutputVarWin != GUI_ID){
return, 1
}
NR := substr(OutputVarControl,strlen("static") + 1)
SB_SetText("Field: " NR, 1)
If(GetKeyState("LButton")){
Gui,submit, nohide
if (DDL_BRUSH = "PLAYER"){
SET_PLAYER(NR)
}else if (DDL_BRUSH = "TARGET"){
SET_TARGET(NR)
}else{
SETField(G_SIGN,NR,G_PIC)
}
Gosub, MenuFileSHOW
}
If(GetKeyState("RButton")){
SETField(G_BEGEHBAR,NR,SkinPath "\begehbar.bmp")
}
return, 1
}
#Include, %A_ScriptDir%\INCLUDE\dock.ahk
Hope it works