Difference between revisions of "Robot gallery"

From Bitfighter
Line 29: Line 29:
 
'''JUST AS IMPORTANT'''
 
'''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:
 
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:
 +
<source lang="lua">
 
   if(bot:getTime() == 0) then return end
 
   if(bot:getTime() == 0) then return end
 +
</source>
 
as the first line of your getMove() function will fix the problem.
 
as the first line of your getMove() function will fix the problem.
  

Revision as of 05:25, 19 June 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

-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
--
-- 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
--
-- Works with Bitfighter 011 alpha 2
--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- This is called by the robot's idle routine each tick. 
-- This function must be present for the robot to work!
 
function getMove()
 
    local loc = bot:getLoc()
    local items = bot:findGlobalItems(TestItemType) -- Find a TestItem
 
    local minDist = 999999
    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 itemLoc = closestItem:getLoc()
 
    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 
        dest = itemLoc
        dest:setxy(itemLoc:x() + orbitRadius * math.cos(orbitAng),
        itemLoc:y() + orbitRadius * math.sin(orbitAng))
    else
        dest = itemLoc
        orbitAng = botLoc:angleTo(dest)
    end
 
    bot:setThrustToPt(dest)     -- travel towards calculated point
 
    bot:setAngle(botLoc:angleTo(itemLoc))
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
 
 
-- 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