No, the AI I developed was quite simple. I chose a state based method allowing the NPC to sort out its first task and when finished move onto the next. Each one of these tasks can be programmed separately and allows for quite complex assortments.
As for the programming of randomly created objects, it's quite easy really. The SeedRnd function is your friend. Here's an example: Use keys 1-5 to create a "random" planet...
1. Target a station 2. Go to within 120 units of target 3. Dock with station 4. wait for 200 seconds 5. undock 6. choose random system 7. go to system -------- 1. choose random trader ship 2. go to within 60 units of trader ship 3. attack until target = dead 4. choose more tasks
Method update() Local i:Task=Task(currentTasks.first()) If i Select i.mode Case "choose random station" target = randomStation() taskComplete() Case "go to " If distanceToTarget > 50 flyTo(target.x,target.y) Else taskComplete() EndIf Case "undock" undockShip() taskComplete() Case "wait" If MilliSecs()-waitStart > waitTime taskComplete() EndIf End Select EndIf End Method
As for the programming of randomly created objects, it's quite easy really. The SeedRnd function is your friend. Here's an example: Use keys 1-5 to create a "random" planet...
Rem Consider worms. The levels were procedurally produced from a number. This means you could create the same level again by just remembering the number. It also means that you don't have to save each level. RndSeed is a function that tells blitzmax to produce the same result for random functions See example below... Check the Output EndRem Graphics 640,480,0 While KeyHit(KEY_ESCAPE)=0 Cls txt.DrawTxt(0,0) If KeyHit(KEY_1) createAPlanet(1) If KeyHit(KEY_2) createAPlanet(2) If KeyHit(KEY_3) createAPlanet(3) If KeyHit(KEY_4) createAPlanet(4) If KeyHit(KEY_5) createAPlanet(MilliSecs()) DrawText "1,2,3,4,5",0,GraphicsHeight()-25 Flip Delay 1 Wend End Function createAPlanet(seed) SeedRnd(seed) ' any 'rnd' or 'rand' call after this will produce the same result. Local atmosphereType$[]=["gas","harsh","lush","barren","jungle","tropical","temperate","desert"] Local sunType$[]=["white","red","yellow","blue","dwarf","giant","black hole"] txt.clear() txt.AddTxt("Generating planet from seed "+seed,255,0,0) txt.AddTxt("Atmosphere: "+atmosphereType[Rand(0,atmosphereType.length-1)]) txt.AddTxt("Population: "+Rnd(0,4.5)+" Billion") txt.AddTxt("Sun Type: "+sunType[Rand(0,sunType.length-1)]) txt.AddTxt("") SeedRnd(MilliSecs()) ' re-randomise so future rnd and rand will be that, random. End Function Type Txt Global txtList:TList = CreateList() Field content$ Field red%, green%, blue% Function clear() txt.txtList.clear() End Function Function AddTxt(content$, red% = 255, green% = 255, blue% = 255, limit = 10) Local t:Txt = New Txt t.content = content t.red = red t.green = green t.blue = blue txtList.AddLast t DebugLog content If txt.txtList.Count() > limit Then txt.txtList.RemoveFirst() End Function Function DrawTxt(x% = 20, y% = 20, yStep% = 20) For Local t:Txt = EachIn txt.txtList SetColor t.red, t.green, t.blue DrawText t.content,x,y y :+ yStep Next SetColor 255,255,255 End Function End Type