Difference between revisions of "Robot gallery"

From Bitfighter
(OrbitBot)
Line 34: Line 34:
 
as the first line of your getMove() function will fix the problem.
 
as the first line of your getMove() function will fix the problem.
  
==OrbitBot==
 
 
<source lang="lua">
 
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
 
--
 
--
 
-- OrbitBot, a simple robot that finds the nearest TestItem and orbits it
 
-- OrbitBot, a simple robot that finds the nearest TestItem and orbits it
-- Note that this relies on line-of-sight navigation, so only good for open  
+
-- Note that this relies on line-of-sight navigation, so only good for open levels
-- levels
+
 
--
 
--
-- Works with Bitfighter 011 alpha 2
+
-- !!! WILL ONLY WORK WITH RELEASE VERSION OF BITFIGHTER 011 AND ABOVE !!!
 
--
 
--
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
Line 51: Line 47:
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
-- This is called by the robot's idle routine each tick.  
+
-- This is called by the robot's idle routine each tick.
 
-- This function must be present for the robot to work!
 
-- This function must be present for the robot to work!
  
 
function getMove()
 
function getMove()
  
     local loc = bot:getLoc()
+
     if(targetItem == nil) then
    local items = bot:findGlobalItems(TestItemType) -- Find a TestItem
+
        targetItem = findClosest(bot:findGlobalItems(TestItemType))
 +
    end
  
     local minDist = 999999
+
     if(targetItem == nil) then return end
    local closestItem = nil
+
    local found = false
+
  
    for indx, item in ipairs(items) do -- Iterate over our list
 
        -- Use distSquared because it is less computationally expensive
 
        -- and works great for comparing distances
 
        local d = loc:distSquared(item:getLoc()) -- Dist btwn robot and item
 
 
        if(d < minDist) then -- Is it the closest yet?
 
            closestItem = item
 
            minDist = d
 
        end
 
    end
 
 
    -- closestItem will be nil if the bot can't find any.  This may happen
 
    -- if the level has no TestItems, or if they are beyond the robot's
 
    -- range to know about them.
 
    if(closestItem == nil) then
 
        return
 
    end
 
  
 
     local botLoc = bot:getLoc()
 
     local botLoc = bot:getLoc()
     local itemLoc = closestItem:getLoc()
+
     local itemLoc = targetItem:getLoc()
  
     dist = botLoc:distanceTo(itemLoc)
+
     local dist = botLoc:distanceTo( itemLoc )
  
 
     -- Here we use the getTime() function to make the motion look smooth.
 
     -- Here we use the getTime() function to make the motion look smooth.
Line 91: Line 69:
  
 
     -- .0015 determined experimentally
 
     -- .0015 determined experimentally
 +
    orbitAng = orbitAng + .0015 * bot:getTime()
  
    orbitAng = orbitAng + .0015 * bot:getTime()
 
  
 
     local dest
 
     local dest
   
+
 
     if(dist <= orbitRadius * 1.1) then  
+
     if( dist <= orbitRadius * 1.1 ) then   -- Close enough to enter orbit
 
         dest = itemLoc
 
         dest = itemLoc
         dest:setxy(itemLoc:x() + orbitRadius * math.cos(orbitAng),
+
         dest:setxy( itemLoc:x() + orbitRadius * math.cos (orbitAng),
        itemLoc:y() + orbitRadius * math.sin(orbitAng))
+
                    itemLoc:y() + orbitRadius * math.sin (orbitAng) )
     else
+
        if( not isInOrbit ) then
 +
            orbitAng = botLoc:angleTo( dest ) - math.pi / 2
 +
        end   
 +
       
 +
        isInOrbit = true
 +
                   
 +
     else                                   -- Travel directly toward object
 
         dest = itemLoc
 
         dest = itemLoc
         orbitAng = botLoc:angleTo(dest)
+
         orbitAng = botLoc:angleTo( dest )
 +
        isInOrbit = false
 
     end
 
     end
  
     bot:setThrustToPt(dest)     -- travel towards calculated point
+
     bot:setThrustToPt( dest )                 -- Travel towards calculated point
 
+
     bot:setAngle( botLoc:angleTo( itemLoc) ) -- Aim ship that way too
     bot:setAngle(botLoc:angleTo(itemLoc))
+
 
end
 
end
  
Line 119: Line 103:
  
 
function getName()
 
function getName()
     return("OrbitBot")
+
     return( "OrbitBot")
 
end
 
end
  
Line 128: Line 112:
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
 
-- Setup code here: this is run once when the robot is initialized, and
 
-- Setup code here: this is run once when the robot is initialized, and
-- any variables set here will persist throughout the robot's life. These
+
-- any variables set here will persist throughout the robot's life. These
 
-- variables can be accessed from various functions defined in this file.
 
-- variables can be accessed from various functions defined in this file.
 
-------------------------------------------------------------------------------
 
-------------------------------------------------------------------------------
-- Global variables
+
-- Global variables must be declared here before they can be used elsewhere
 
+
 
+
-- Other initialization code
+
logprint("Hello, I'm " .. getName())  -- Print a message to the game log
+
orbitRadius = 300                      -- How far from object will we orbit?
+
 
orbitAng = 0
 
orbitAng = 0
 
+
orbitRadius = 300
</source>
+
isInOrbit = false
 +
targetItem = nil

Revision as of 05:55, 6 October 2009

For reference information on how these robots work, see the Programming Robots section.

IMPORTANT: In order for these bots to work with Bitfighter 011 alpha 2, you will need to update the file "robot_helper_functions.lua" in your Bitfighter install folder. Replace the file's contents with the following:

bot = LuaRobot(Robot) -- This is a reference to our bot.
 
 
function getFiringSolution(item)
    if(item == nil) then
        return nil
    end
 
    type = item:getClassID()
    if(type == nil) then
        return nil
    end
 
    return bot:getFiringSolution(type, item)
end
 
 
function logprint(msg)
    bot:logprint(msg)
end

JUST AS IMPORTANT In 011 alpha 2, there is a bug in setThrustToPt() that can cause Bitfighter to hang. It will be fixed in alpha 3. Inserting the line:

   if(bot:getTime() == 0) then return end

as the first line of your getMove() function will fix the problem.



-- -- OrbitBot, a simple robot that finds the nearest TestItem and orbits it -- Note that this relies on line-of-sight navigation, so only good for open levels -- -- !!! WILL ONLY WORK WITH RELEASE VERSION OF BITFIGHTER 011 AND ABOVE !!! --






-- This is called by the robot's idle routine each tick. -- This function must be present for the robot to work!

function getMove()

   if(targetItem == nil) then
       targetItem = findClosest(bot:findGlobalItems(TestItemType))
   end
   if(targetItem == nil) then return end


   local botLoc = bot:getLoc()
   local itemLoc = targetItem:getLoc()
   local dist = botLoc:distanceTo( itemLoc )
   -- Here we use the getTime() function to make the motion look smooth.
   -- If we just advanced orbitAng by a fixed amount each frame, it would
   -- appear jerky, as each frame is a slightly different length.
   -- .0015 determined experimentally
   orbitAng = orbitAng + .0015 * bot:getTime()


   local dest
   if( dist <= orbitRadius * 1.1 ) then    -- Close enough to enter orbit
       dest = itemLoc
       dest:setxy( itemLoc:x() + orbitRadius * math.cos (orbitAng),
                   itemLoc:y() + orbitRadius * math.sin (orbitAng)  )
       if( not isInOrbit ) then
           orbitAng = botLoc:angleTo( dest ) - math.pi / 2
       end    
       
       isInOrbit = true
                   
   else                                    -- Travel directly toward object
       dest = itemLoc
       orbitAng = botLoc:angleTo( dest )
       isInOrbit = false
   end
   bot:setThrustToPt( dest )                 -- Travel towards calculated point
   bot:setAngle( botLoc:angleTo( itemLoc) )  -- Aim ship that way too

end







-- This function is called once and should return the robot's name

function getName()

   return( "OrbitBot")

end






-- Setup code here: this is run once when the robot is initialized, and -- any variables set here will persist throughout the robot's life. These -- variables can be accessed from various functions defined in this file.


-- Global variables must be declared here before they can be used elsewhere orbitAng = 0 orbitRadius = 300 isInOrbit = false targetItem = nil