Here's what I managed to hammer out.
The idea behind the game is that your sims will wander around, minding their own business, but you can influence their actions somewhat - for example, say "build this there!" and a couple will march over and build it. Features:
- A* Pathfinding
- Build buildings (actually only one type of building)
Yeah, it's still a little glitchy, and pretty simple as far as gameplay xD.
sync on : sync rate 60
set display mode 1024,768,32
randomize timer()
hide mouse
set text font "arial black"
set text size 16
textheight=text height("TestString")
`======= Variable Setup ===============
`Used in FreeSprite function, to account for "theoretical" sprites
global FreeSpriteCounter
FreeSpriteCounter=4
`Screen divided into tiles for pathfinding, building
global TilesX
global TilesY
TilesX=screen width()/10
TilesY=screen height()/10
`Images
#Constant SimBaseImage 1
#Constant GrassImage 2
#Constant CrosshairsImage 3
#Constant ToolbarImage 4
#Constant ShrinkButtonImage 5
#Constant EnlargeButtonImage 6
#Constant WarehouseImage 7
`Sprites
#Constant CrosshairsSprite 1
#Constant ToolbarSprite 2
#Constant ShrinkButtonSprite 3
#Constant PlacementSprite 4
`Types
`In array Sims(0), info about each sim
type Sim
Name as string
LastName as string
Sex as boolean `1=M, 0=F
Skin as integer
SpriteNo as integer
TargetX as integer
TargetY as integer
PathStart as integer
PathEnd as integer
Target as integer
PositionX as float
PositionY as float
TileX as integer
TileY as integer
endtype
type AStarNode
ParentX as integer
ParentY as integer
Closed as boolean
F as integer
H as integer
G as integer
endtype
type Waypoint
XPos as integer
YPos as integer
endtype
`In array BuildingBases(0), info about buildings one could build
type BuildingBase
Name as string
XSize as integer
YSize as integer
WoodCost as integer
TotalHealth as integer
ImageNo as integer
ClickOn as integer `Img
ClickOff as integer `Img
ClickOnBad as integer `Img
ClickOffBad as integer `Img
SpriteNo as integer
endtype
`In array Buildings(0), info about each individual building
type Building
SpriteNo as integer
Health as float
BuildingType as integer
XPos as integer
YPos as integer
endtype
`Store building base data
DIM BuildingBases(1) as BuildingBase
BuildingBases(1).Name="Warehouse"
BuildingBases(1).XSize=8
BuildingBases(1).YSize=7
BuildingBases(1).WoodCost=5
BuildingBases(1).TotalHealth=100
BuildingBases(1).ImageNo=WarehouseImage
`Other arrays for info
DIM Buildings(0) as Building
DIM Sims(0) as Sim
DIM Paths(0) as Waypoint
`Name data for sims
NumberMFirsts=12
NumberFFirsts=9
NumberLasts=7
DIM MFirstNames$(NumberMFirsts)
DIM FFirstNames$(NumberFFirsts)
DIM LastNames$(NumberLasts)
`Used to store pathfinding and building info
DIM ScreenPaths(TilesX,TilesY)
`0=Empty
`1=BuiltOn
`2=UnderConstruction
`101+=BuildingOn
`Different possible skin colors (African, white)
DIM SkinColors(1) as dword
SkinColors(0)=rgb(230,213,172)
SkinColors(1)=rgb(155,123,49)
`Duh
gosub DIMNames
`Priorities of each action, play will change
BuildPriority=50
RepairPriority=20
FoodPriority=30
`Resources
wood=5
food=10
metal=0
`Adjustables
buildspeed as float
buildspeed=0.25
`======= Media Setup ==================
set image colorkey 1,1,1
gosub LOADMEDIA
ink rgb(230,230,230),0
set text font "arial"
set text size 10
`======= Setup Starting Colony ========
for c=1 to 5
skincolor=rnd(1)
array insert at bottom Sims(0)
Sims(array count(Sims(0))).Name=MFirstNames$(rnd(NumberMFirsts))
Sims(array count(Sims(0))).Sex=1
Sims(array count(Sims(0))).LastName=LastNames$(rnd(NumberLasts))
Sims(array count(Sims(0))).Skin=skincolor
Sims(array count(Sims(0))).SpriteNo=FreeSprite()
array insert at bottom Sims(0)
Sims(array count(Sims(0))).Name=FFirstNames$(rnd(NumberFFirsts))
Sims(array count(Sims(0))).Sex=0
Sims(array count(Sims(0))).LastName=Sims(array count(Sims(0))-1).LastName
Sims(array count(Sims(0))).Skin=skincolor
Sims(array count(Sims(0))).SpriteNo=FreeSprite()
next c
for c=1 to array count(Sims(0))
sprite Sims(c).SpriteNo,c*40+10,100,SimBaseImage
set sprite diffuse Sims(c).SpriteNo,rgbr(SkinColors(Sims(c).Skin)),rgbg(SkinColors(Sims(c).Skin)),rgbb(SkinColors(Sims(c).Skin))
Sims(c).PositionX=sprite x(Sims(c).SpriteNo)
Sims(c).PositionY=sprite y(Sims(c).SpriteNo)
Sims(c).TargetX=Sims(c).PositionX/10
Sims(c).TargetY=Sims(c).PositionY/10
next c
`======================================
`====== MAIN LOOOOP ===================
do
cls
sprite CrosshairsSprite,mousex(),mousey(),CrosshairsImage
`Tile grass across screen
for x=0 to screen width()/100
for y=0 to screen height()/100
paste image GrassImage,x*100,y*100
next y
next x
`Pathfind and move
gosub ControlSims
`Display all kinds of stuff the user needs
gosub ControlInformation
`Goes to a subroutine when clicked
if clicked=0 and mouseclick()=1
clicked=1
gosub Mouseclicks
endif
if mouseclick()=0 then clicked=0
`Debug Info
if controlkey()=1
for x=1 to TilesX
line x*10,0,x*10,screen height()
next x
for y=1 to TilesY
line 0,y*10,screen width(),y*10
next y
for x=0 to 102
for y=0 to 76
if ScreenPaths(x,y)<>0 then text x*10+2,y*10,str$(ScreenPaths(x,y))
next y
next x
for c=1 to array count(Sims(0))
text Sims(c).TargetX*10,Sims(c).TargetY*10+10,"H"
text Sims(c).TileX*10,Sims(c).TileY*10-10,"L"
for d=Sims(c).PathStart to Sims(c).PathEnd
text 100*c,10*(d-Sims(c).PathStart+1),str$(Paths(d).XPos)+" , "+str$(Paths(d).YPos)
next d
next c
for c=1 to array count(Buildings(0))
hide sprite Buildings(c).SpriteNo
next c
endif
if controlkey()=0
for c=1 to array count(Buildings(0))
show sprite Buildings(c).SpriteNo
next c
endif
sync
loop
`====== ==== ====== ===================
`======================================
ControlSims:
for c=1 to array count(Sims(0))
TileX=sprite x(Sims(c).SpriteNo)/10
TileY=sprite y(Sims(c).SpriteNo)/10
TargetX=Sims(c).TargetX
TargetY=Sims(c).TargetY
movex=0
movey=0
`Determine movement direction
if TileX<TargetX
movex=1
endif
if TileX>TargetX
movex=-1
endif
if TileY<TargetY
movey=1
endif
if TileY>TargetY
movey=-1
endif
if TileY=TargetY
movey=0
endif
if TileX=TargetX
movex=0
endif
if Sims(c).Target=0
`Reassign Sim's targets
for x=0 to 102
for y=0 to 76
if ScreenPaths(x,y)>100
Sims(c).Target=ScreenPaths(x,y)
endif
next y
next x
if Sims(c).Target>100
AstarFindPath(c,Sims(c).Target-100)
endif
else
`======= Move sim =======
collide=0
tempx#=Sims(c).PositionX
tempy#=Sims(c).PositionY
if movex<>0 and movey<>0
`Move less diagonally
inc tempx#,0.4*movex
inc tempy#,0.4*movey
else
`Move more horizontally
inc tempx#,0.56*movex
inc tempy#,0.56*movey
endif
`Check if new position collides with another sim
for d=c+1 to array count(Sims(0))
if tempx#/10=Sims(d).TileX and tempy#/10=Sims(d).TileY
collide=1
endif
next d
if collide=0 and Sims(c).TargetX>0
Sims(c).PositionX=tempx#
Sims(c).PositionY=tempy#
endif
if TileX=TargetX and TileY=TargetY
if Paths(Sims(c).PathStart).XPos>0
Sims(c).TargetX=Paths(Sims(c).PathStart).XPos
Sims(c).TargetY=Paths(Sims(c).PathStart).YPos
array insert at element Paths(0),Sims(c).PathEnd
array delete element Paths(0),Sims(c).PathStart
else
Sims(c).TargetX=-1
endif
endif
sprite Sims(c).SpriteNo,Sims(c).PositionX,Sims(c).PositionY,SimBaseImage
`======= Sim Build =======
if Sims(c).TargetX=-1 and Sims(c).Target>100
targetbuilding=Sims(c).Target-100
targetbuildingtype=Buildings(targetbuilding).BuildingType
buildingmaxhealth=BuildingBases(targetbuildingtype).TotalHealth
inc Buildings(targetbuilding).Health,buildspeed
buildingcurrenthealth#=Buildings(targetbuilding).Health
if buildingcurrenthealth#>=buildingmaxhealth
Buildings(targetbuilding).Health=buildingmaxhealth
Sims(c).Target=0
for x=0 to BuildingBases(targetbuildingtype).xsize-1
for y=0 to BuildingBases(targetbuildingtype).ysize-1
ScreenPaths(x+Buildings(targetbuilding).XPos,y+Buildings(targetbuilding).YPos)=1
next y
next x
endif
alpha=(buildingcurrenthealth#/buildingmaxhealth)*255
set sprite alpha Buildings(targetbuilding).SpriteNo,alpha
endif
endif
Sims(c).TileX=Sims(c).PositionX/10
Sims(c).TileY=Sims(c).PositionY/10
next c
return
ControlInformation:
`Mouseover sims - display info
for c=1 to array count(Sims(0))
if mousex()<sprite x(Sims(c).SpriteNo)+10 and mousex()>sprite x(Sims(c).SpriteNo)
if mousey()<sprite y(Sims(c).SpriteNo)+10 and mousey()>sprite y(Sims(c).SpriteNo)
text mousex()+5,mousey()+5,Sims(c).Name+" "+Sims(c).LastName
text mousex()+5,mousey()+15,str$(Sims(c).TargetX)
text mousex()+5,mousey()+25,str$(Sims(c).TargetY)
endif
endif
next c
`Mouseover building buttons - color properly
for c=1 to array count(BuildingBases(0))
if mousex()>820 and mousex()<820+text width(BuildingBases(c).Name) and mousey()>70+c*textheight and mousey()<70+(c+1)*textheight
if Wood>=BuildingBases(c).WoodCost
sptemp=BuildingBases(c).ClickOn
else
sptemp=BuildingBases(c).ClickOnBad
endif
else
if Wood>=BuildingBases(c).WoodCost
sptemp=BuildingBases(c).ClickOff
else
sptemp=BuildingBases(c).ClickOffBad
endif
endif
sprite BuildingBases(c).SpriteNo,820,70+c*textheight,sptemp
next c
`When placing a building, displays and checks legality
if placing>0
bad=0
mousetilex=mousex()/10
mousetiley=mousey()/10
sprite PlacementSprite,mousetilex*10-10,mousetiley*10-10,BuildingBases(placing).ImageNo
for x=-1 to BuildingBases(placing).XSize-2
for y=-1 to BuildingBases(placing).YSize-2
if mousetilex+x>102 or mousetiley+y>76
bad=1
else
if mousetilex<=1 or mousetiley<=1
bad=1
else
if ScreenPaths(mousetilex+x,mousetiley+y)<>0 then bad=1
endif
endif
next y
next x
if bad=1
set sprite diffuse PlacementSprite,200,100,100
else
set sprite diffuse PlacementSprite,255,255,255
endif
endif
return
Mouseclicks:
`Place a building if one is being placed and can be
if placing>0 and bad=0
delete sprite PlacementSprite
mousetilex=mousex()/10
mousetiley=mousey()/10
for x=-1 to BuildingBases(placing).xsize-2
for y=-1 to BuildingBases(placing).ysize-2
ScreenPaths(x+mousetilex,y+mousetiley)=2
next y
next x
array insert at bottom Buildings(0)
tempno=array count(Buildings(0))
ScreenPaths(mousetilex-1,mousetiley-1)=tempno+100
Buildings(tempno).SpriteNo=FreeSprite()
sprite Buildings(tempno).SpriteNo,mousetilex*10-10,mousetiley*10-10,BuildingBases(placing).ImageNo
set sprite alpha Buildings(tempno).SpriteNo,0
Buildings(tempno).Health=1
Buildings(tempno).BuildingType=placing
Buildings(tempno).XPos=mousetilex-1
Buildings(tempno).YPos=mousetiley-1
placing=0
endif
`Control shrinking/enlarging of toolbar
if mousex()>915 and mousey()>2 and mousex()<945 and mousey()<22
if sprite image(ShrinkButtonSprite)=ShrinkButtonImage
sprite ShrinkButtonSprite,915,2,EnlargeButtonImage
hide sprite ToolbarSprite
for c=1 to array count(BuildingBases(0))
hide sprite BuildingBases(c).SpriteNo
next c
else
sprite ShrinkButtonSprite,915,2,ShrinkButtonImage
show sprite ToolbarSprite
for c=1 to array count(BuildingBases(0))
show sprite BuildingBases(c).SpriteNo
next c
endif
endif
`Control pressing of build buttons
if sprite image(ShrinkButtonSprite)=ShrinkButtonImage
for c=1 to array count(BuildingBases(0))
if wood>=BuildingBases(c).WoodCost and placing=0
if mousex()>820 and mousex()<820+text width(BuildingBases(c).Name) and mousey()>70+c*textheight and mousey()<70+(c+1)*textheight
placing=c
endif
endif
next c
endif
`Sim selection might go here
return
DIMNames:
MFirstNames$(0)="John"
MFirstNames$(1)="Brian"
MFirstNames$(2)="Alex"
MFirstNames$(3)="Kevin"
MFirstNames$(4)="Chris"
MFirstNames$(5)="Joe"
MFirstNames$(6)="Sam"
MFirstNames$(7)="Tim"
MFirstNames$(8)="Tom"
MFirstNames$(9)="Gary"
MFirstNames$(10)="Greg"
MFirstNames$(11)="Bruce"
MFirstNames$(12)="Tony"
FFirstNames$(0)="Ashley"
FFirstNames$(1)="Isabel"
FFirstNames$(2)="Jenny"
FFirstNames$(3)="Mary"
FFirstNames$(4)="Anne"
FFirstNames$(5)="Jane"
FFirstNames$(6)="Sally"
FFirstNames$(7)="Suzzie"
FFirstNames$(8)="Elizabeth"
FFirstNames$(9)="Katie"
LastNames$(0)="Samuelson"
LastNames$(1)="Miller"
LastNames$(2)="Jones"
LastNames$(3)="Jeffries"
LastNames$(4)="Owens"
LastNames$(5)="Smith"
LastNames$(6)="Cook"
LastNames$(7)="Reynolds"
return
`By IanM
function FillCircle( CX as integer, CY as integer, R as integer )
local x as integer
local y as integer
local i as integer
local s as integer
lock pixels
s=R*0.70710678 : ` this number is sin(45) - precalculate!
box CX-s, CY-s, CX+s+1, CY+s+1
s=s+1 : ` Faster than 'inc s'?
i=R*R
for y=s to R
x=sqrt( i-(y*y) )
` Draw top and bottom
box CX-x, CY-y, CX+x+1, CY-y+1
box CX-x, CY+y, CX+x+1, CY+y+1
` Draw left and right
box CX-y, CY-x, CX-y+1, CY+x+1
box CX+y, CY-x, CX+y+1, CY+x+1
next y
unlock pixels
endfunction
function FreeSprite()
inc FreeSpriteCounter
tempno=FreeSpriteCounter
repeat
inc tempno
until sprite exist(tempno)=0
endfunction tempno
function FreeImage()
repeat
inc tempno
until image exist(tempno)=0
endfunction tempno
LOADMEDIA:
`Create sim, white so skin color is easily changed with diffuse
create bitmap 1,100,100
set current bitmap 1
cls rgb(1,1,1)
ink rgb(0,0,0),0
FillCircle(5,5,5)
ink rgb(255,255,255),0
FillCircle(5,5,4)
get image SimBaseImage,0,0,10,10,1
`Random grass
cls rgb(0,128,0)
for x=0 to 100
for y=0 to 99
if rnd(10)=5
dot x,y,rgb(0,200,0)
dot x,y+1,rgb(0,160,0)
endif
next y
next x
get image GrassImage,0,0,100,100
`Crosshairs (mouse image)
cls rgb(1,1,1)
ink rgb(200,200,200),0
line 5,0,5,10
line 0,5,10,5
get image CrosshairsImage,0,0,10,10,1
sprite CrosshairsSprite,mousex(),mousey(),CrosshairsImage
set sprite alpha CrosshairsSprite,200
offset sprite CrosshairsSprite,5,5
set sprite priority CrosshairsSprite,2
`Big toolbar on the right
delete bitmap 1
create bitmap 1,201,601
set current bitmap 1
cls rgb(107,107,107)
ink rgb(134,134,134),0
line 0,0,198,0
line 0,0,0,598
line 0,598,198,598
line 0,597,198,597
line 198,0,198,597
line 197,0,197,597
ink rgb(80,80,80),0
line 3,3,196,3
line 3,4,196,4
line 3,3,3,596
line 4,3,4,596
line 0,599,200,599
line 0,600,200,600
line 199,0,199,600
line 200,1,200,600
dot 200,0,rgb(1,1,1)
dot 0,600,rgb(1,1,1)
get image ToolbarImage,0,0,201,601,1
sprite ToolbarSprite,800,24,ToolbarImage
set sprite alpha ToolbarSprite,200
set sprite priority ToolbarSprite,1
`Shrink/enlarge toolbar buttons
delete bitmap 1
create bitmap 1,31,21
set current bitmap 1
cls rgb(107,107,107)
ink rgb(134,134,134),0
line 0,0,0,18
line 1,0,1,18
line 0,0,28,0
line 0,1,28,1
line 18,0,18,28
line 17,0,17,28
line 0,28,18,28
line 0,27,18,27
ink rgb(80,80,80),0
line 3,3,26,3
line 3,4,26,4
line 3,3,3,16
line 4,3,4,16
line 0,19,30,19
line 1,20,30,20
line 29,0,29,20
line 30,0,30,20
dot 30,0,rgb(1,1,1)
dot 0,20,rgb(1,1,1)
ink rgb(0,0,0),0
line 9,13,15,7
line 9,12,15,6
line 15,6,21,12
line 15,7,21,13
get image ShrinkButtonImage,0,0,30,20,1
ink rgb(107,107,107),0
box 8,5,22,14
ink rgb(0,0,0),0
line 9,7,15,13
line 9,6,15,12
line 15,12,21,6
line 15,13,21,7
get image EnlargeButtonImage,0,0,30,20,1
delete bitmap 1
sprite ShrinkButtonSprite,915,2,ShrinkButtonImage
set sprite priority ShrinkButtonSprite,1
set sprite alpha ShrinkButtonSprite,200
`Warehouse building image
create bitmap 1,80,70
ink rgb(0,0,0),0
box 0,0,80,70
ink rgb(231,231,211),0
box 1,1,79,69
ink rgb(0,0,0),0
box 5,5,75,65
ink rgb(95,95,95),0
box 6,6,74,64
ink rgb(192,192,192),0
box 8,8,74,64
ink rgb(148,148,148),0
for c=10 to 61 step 3
line 8,c,74,c
next c
get image WarehouseImage,0,0,80,70,1
delete bitmap 1
set current bitmap 0
`Texts for building buildings (go in toolbar)
for c=1 to array count(BuildingBases(0))
cls rgb(1,1,1)
ink rgb(200,0,0),0
text 0,0,BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)
BuildingBases(c).ClickOnBad=FreeImage()
get image BuildingBases(c).ClickOnBad,0,0,text width(BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)),textheight,1
cls rgb(1,1,1)
ink rgb(0,150,0),0
text 0,0,BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)
BuildingBases(c).ClickOn=FreeImage()
get image BuildingBases(c).ClickOn,0,0,text width(BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)),textheight,1
cls rgb(1,1,1)
ink rgb(200,100,100),0
text 0,0,BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)
BuildingBases(c).ClickOffBad=FreeImage()
get image BuildingBases(c).ClickOffBad,0,0,text width(BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)),textheight,1
cls rgb(1,1,1)
ink rgb(100,200,100),0
text 0,0,BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)
BuildingBases(c).ClickOff=FreeImage()
get image BuildingBases(c).ClickOff,0,0,text width(BuildingBases(c).Name+" - "+str$(BuildingBases(c).WoodCost)),textheight,1
BuildingBases(c).SpriteNo=FreeSprite()
sprite BuildingBases(c).SpriteNo,820,100+c*textheight,BuildingBases(c).ClickOffBad
set sprite priority BuildingBases(c).SpriteNo,2
next c
return
function AStarFindPath(SimID,TargetObject)
DIM Open(TilesX,TilesY) as AStarNode
Open(Sims(SimID).TileX,Sims(SimID).TileY).ParentX=-1
Open(Sims(SimID).TileX,Sims(SimID).TileY).ParentY=-1
Open(Sims(SimID).TileX,Sims(SimID).TileY).F=999999998
TempXSize=BuildingBases(Buildings(TargetObject).BuildingType).XSize
TempYSize=BuildingBases(Buildings(TargetObject).BuildingType).YSize
TempXPos=Buildings(TargetObject).XPos
TempYPos=Buildings(TargetObject).YPos
repeat
`Find open tile with least F rating
curF=999999999
for x=1 to TilesX
for y=1 to TilesY
if Open(x,y).F<curF and Open(x,y).F>0 and Open(x,y).Closed=0
curx=x
cury=y
curF=Open(x,y).F
endif
next y
next x
Open(curx,cury).Closed=1
`Check and open tiles around the selected
failed=1
for x=-1 to 1
for y=-1 to 1
if x<>0 or y<>0
if curx+x<TilesX and cury+y<TilesY and curx+x>0 and cury+y>0
if ScreenPaths(curx+x,cury+y)=2 or ScreenPaths(curx+x,cury+y)=0 and Open(curx+x,cury+y).Closed<>1
failed=0
`If already open and G is better, reassign parent to current and recalc G and F
`Else, add to open list and record necessary
if Open(curx+x,cury+y).F>0
if Open(curx+x,cury+y).G>Open(curx,cury).G+10+(4*abs(x)*abs(y))
Open(curx+x,cury+y).ParentX=curx
Open(curx+x,cury+y).ParentY=cury
Open(curx+x,cury+y).G=Open(curx,cury).G+10+(4*abs(x)*abs(y))
Open(curx+x,cury+y).F=Open(curx+x,cury+y).G+Open(curx+x,cury+y).H
endif
else
Open(curx+x,cury+y).ParentX=curx
Open(curx+x,cury+y).ParentY=cury
Open(curx+x,cury+y).G=10+(4*abs(x)*abs(y))+Open(curx,cury).G
Open(curx+x,cury+y).H=10*(abs(x+curx-TempXPos-TempXSize/2)+abs(cury+y-TempYPos-TempYSize/2))
Open(curx+x,cury+y).F=Open(curx+x,cury+y).G+Open(curx+x,cury+y).H
endif
endif
endif
endif
next y
next x
`Check if we've reached the target
for x=-1 to TempXSize-2
text (TempXPos+x)*10,(TempYPos-1)*10,"H"
text (TempXPos+x)*10,(TempYPos+TempYSize-2)*10,"H"
if Open(TempXPos+x,TempYPos-1).ParentX<>0
ReachedTarget=1
EndNodeX=TempXPos+x
EndNodeY=TempYPos-1
endif
if Open(TempXPos+x,TempYPos+TempYSize-2).ParentX<>0
ReachedTarget=1
EndNodeX=TempXPos+x
EndNodeY=TempYPos+TempYSize-2
endif
next x
for y=-1 to TempYSize-2
text (TempXPos-1)*10,(TempYPos+y)*10,"H"
text (TempXPos+TempXSize-2)*10,(TempYPos+y)*10,"H"
if Open(TempXPos-1,TempYPos+y).ParentX<>0
ReachedTarget=1
EndNodeX=TempXPos-1
EndNodeY=TempYPos+y
endif
if Open(TempXPos+TempXSize-2,TempYPos+y).ParentX<>0
ReachedTarget=1
EndNodeX=TempXPos+TempXSize-2
EndNodeY=TempYPos+y
endif
next x
remstart
`Debug
for x=1 to TilesX
for y=1 to TilesY
if Open(x,y).ParentX>0
if Open(x,y).Closed=1
text x*10,y*10,"X"
else
text x*10-3,y*10,str$(Open(x,y).F)
endif
endif
if Open(x,y).ParentX<0 then text x*10,y*10,"S"
next y
next x
sync
wait key
remend
until ReachedTarget=1 or failed>0
`Save Path
if failed=0
array insert at bottom Paths(0)
Sims(SimID).PathStart=array count(Paths(0))
repeat
remstart
`Debug
text 10,10,str$(Sims(SimID).PathStart)
text 10,20,str$(array count(Paths(0)))
for x=1 to TilesX
for y=1 to TilesY
if x=tempx and y=tempy
text x*10,y*10,"@"
else
if Open(x,y).ParentX>0
if Open(x,y).Closed=1
text x*10,y*10,"X"
else
text x*10,y*10,"O"
endif
endif
if Open(x,y).ParentX<0 then text x*10,y*10,"S"
endif
next y
next x
sync
wait key
remend
if Open(EndNodeX,EndNodeY).ParentX<>-1
array insert at element Paths(0),Sims(SimID).PathStart
Paths(Sims(SimID).PathStart).XPos=Open(EndNodeX,EndNodeY).ParentX
Paths(Sims(SimID).PathStart).YPos=Open(EndNodeX,EndNodeY).ParentY
NEndNodeX=Open(EndNodeX,EndNodeY).ParentX
EndNodeY=Open(EndNodeX,EndNodeY).ParentY
EndNodeX=NEndNodeX
endif
until Open(EndNodeX,EndNodeY).ParentX=-1
Sims(SimID).PathEnd=array count(Paths(0))
Sims(SimID).TargetX=Paths(Sims(SimID).PathStart).XPos
Sims(SImID).TargetY=Paths(Sims(SimID).PathStart).YPos
array insert at bottom Paths(0)
array delete element Paths(0),Sims(SimID).PathStart
endif
if failed=1 then Sims(SimID).Target=0
UNDIM Open(0,0)
endfunction
