Dota2 AI 简易开发教程(二)——英雄出装及其相关功能

本文是Dota2 AI开发系列教程的第二篇,重点讲解英雄出装系统的实现,包括购买装备逻辑、信使控制、在神秘商店和边路商店购买的处理,以及出装配置的示例。
摘要由CSDN通过智能技术生成

距离上一篇教程也过去一个多月了,是时候写一篇新教程了。上一篇文章主要介绍了如何选择阵容和技能的使用,在这一篇文章中,我们将介绍如何配置英雄出装和其相关的一些模块。

勘误

首先先纠正一下上一篇文章中的一些错误,在选择阵容部分,下面的table.remove函数中出现了一个错误,bad argument #2 to ‘remove’ (number expected, got string),就是第二个参数应该为数字而不是字符串。这个错误将导致已选择的英雄不能从英雄列表中移除,从而会选择出重复的英雄。

function Think()
    for i,id in pairs(GetTeamPlayers(GetTeam())) 
    do
        if(IsPlayerBot(id) and (GetSelectedHeroName(id)=="" or GetSelectedHeroName(id)==nil))
        then
            local num=hero_pool_my[RandomInt(1, #hero_pool_my)]     --取随机数
            SelectHero( id, num );      --在保存英雄名称的表中,随机选择出AI的英雄
            table.remove(hero_pool_my,num)      --移除这个英雄
        end
    end
end

所以中间几行应该修改为,这样从表中才能正确移除已经选择的英雄

            local i=RandomInt(1, #hero_pool_my)     --取随机数
            local heroname=hero_pool_my[i]      --获取英雄的名称
            SelectHero( id, heroname );     --在保存英雄名称的表中,随机选择出AI的英雄
            table.remove(hero_pool_my,i)        --移除这个英雄

出装系统简介

官方开发者维基中有着这样的说明:

物品购买
如果你只想重写在购买物品时的决策,你可以在文件名为item_purchase_generic.lua的文件中实现如下函数:
ItemPurchaseThink() - 每帧被调用。负责物品购买。
你也可以仅重写某个特定英雄的物品购买逻辑,比如火女(Lina),写在文件名为item_purchase_lina.lua的文件中。

dota 2 beta\game\dota\scripts\vscripts\bots_example V社的示例文件中,我们可以找到item_purchase_lina.lua文件,这就是为火女配置出装的文件。
打开这个文件,我们可以看到:

--这个表用来记录AI出装的顺序
local tableItemsToBuy = { 
                "item_tango",
                "item_tango",
                "item_clarity",
                "item_clarity",
                "item_branches",
                "item_branches",
                "item_magic_stick",
                "item_circlet",
                "item_boots",
                "item_energy_booster",
                "item_staff_of_wizardry",
                "item_ring_of_regen",
                "item_recipe_force_staff",
                "item_point_booster",
                "item_staff_of_wizardry",
                "item_ogre_axe",
                "item_blade_of_alacrity",
                "item_mystic_staff",
                "item_ultimate_orb",
                "item_void_stone",
                "item_staff_of_wizardry",
                "item_wind_lace",
                "item_void_stone",
                "item_recipe_cyclone",
                "item_cyclone",
            };


------------------------------------------------------------------------------------------

--用来实现基本的物品购买函数
function ItemPurchaseThink()

    local npcBot = GetBot();

    if ( #tableItemsToBuy == 0 )
    then
        npcBot:SetNextItemPurchaseValue( 0 );
        return;
    end

    local sNextItem = tableItemsToBuy[1];

    npcBot:SetNextItemPurchaseValue( GetItemCost( sNextItem ) );    --用于默认AI的相关函数

    if ( npcBot:GetGold() >= GetItemCost( sNextItem ) )         --判断金钱是否足够
    then
        npcBot:Action_PurchaseItem( sNextItem );                --购买物品
        table.remove( tableItemsToBuy, 1 );
    end

end

大家注意到,在上面那个记录出装顺序的表中,物品的名称似乎和平时用的有所区别,其实也可以在这个页面找到。

在上面这个函数中,V社为我们提供了购买物品的基本函数,但是这只能实现在泉水的商店中购买物品,如果要去神秘商店和边路商店购买物品怎么办呢?如果要配置多种出装风格应该怎么办?如何控制信使去购买物品?那就需要靠我们自己实现了。而且如果要配置物品出装,那么需要手动填写每一个配方。不过在V社最近的api更新之后,添加了一个函数GetItemComponents(sItemName),可以直接获取物品的配方。

下面,我们开始在V社的基本函数上逐渐添加更多的功能。

在神秘商店和边路商店购买装备

由于物品购买是一个通用的功能,所以我们可以在item_purchase_generic.lua中编写函数,以便重复调用。在默认AI的框架下,有两个模式用于物品购买secret_shop和side_shop,我们需要通过在主函数中控制前往神秘商店和边路商店购买物品。(尽管将选择前往哪个商店的功能耦合在一个函数中不好。更好的方法是在其它两个模式中重新编写GetDesire()函数。)

在游戏中,一个能在神秘商店购买的物品必定不能在基地商店购买,而边路商店的物品则有可能来自于其他商店。所以便能通过IsItemPurchasedFromSideShop(sNextItem)和IsItemPurchasedFromSecretShop(sNextItem )函数来判断一个物品能在哪被购买,进而决定下一个物品的购买位置。

        if(npcBot.secretShopMode~=true and npcBot.sideShopMode ~=true)
        then
            
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值