Пример базы данных по броне юнитов

Published
Пример базы данных, позволяющей узнавать броню любого юнита или героя с учётом внесённых в базу предметов и показателей ловкости. Также учитываются способности, повышающие броню.
» Код
library ArmorDB initializer Init
{
    private int array UnitID
    private real array UnitAM
    private int MaxUID = 0
    private int array ItemID
    private real array ItemAM
    private int MaxIID = 0
    private int array AbilID
    private real array AbilAM[1000][4]
    private int MaxAID = 0
    private constant real ArmorPerAgility = 0.3     //from constants
    private constant real ArmorPenAgility = -2.0    //from constants
    
    define AddUnitDB(a,b)={UnitID[MaxUID]=a;UnitAM[MaxUID]=b;MaxUID++}
    define AddItemDB(a,b)={ItemID[MaxIID]=a;ItemAM[MaxIID]=b;MaxIID++}
    define AddAbilDB(a,b,c,d,e)={AbilID[MaxAID]=a;AbilAM[MaxAID][1]=b;AbilAM[MaxAID][2]=c;AbilAM[MaxAID][3]=d;A​bilAM[MaxAID][4]=e;MaxAID++}
    define AddAbilDB(a,b,c,d)={AbilID[MaxAID]=a;AbilAM[MaxAID][1]=b;AbilAM[MaxAID][2]=c;AbilAM[MaxAID][3]=d;Abi​lAM[MaxAID][4]=0;MaxAID++}
    define AddAbilDB(a,b,c)={AbilID[MaxAID]=a;AbilAM[MaxAID][1]=b;AbilAM[MaxAID][2]=c;AbilAM[MaxAID][3]=0;AbilA​M[MaxAID][4]=0;MaxAID++}
    define AddAbilDB(a,b)={AbilID[MaxAID]=a;AbilAM[MaxAID][1]=b;AbilAM[MaxAID][2]=0;AbilAM[MaxAID][3]=0;AbilAM[​MaxAID][4]=0;MaxAID++}
    
    private void BaseSet()
    {
        AddUnitDB('zero',0)
        AddItemDB('zero',0)
        AddAbilDB('zero',0,0,0,0)
        
        //units         for heroes it is armor which set in object editor
        AddUnitDB('Hpal',2)
        AddUnitDB('Hmkg',1)
        
        //items
        AddItemDB('rde1',2)
        AddItemDB('rde2',3)
        AddItemDB('rde3',4)
    
        //abilities
        AddAbilDB('AHad',1.5,3.0,4.5)
    }

    private int integral(real a)    //математическое округление
    {
        if(a>=0)
        {
            return(R2I(a+.5))
        }
        if(a <0)
        {
            return(R2I(a-.5))
        }
        return R2I(a)
    }
    
    private int GetIID(int RCode)
    {
        int i = 0
        loop
        {
            if(ItemID[i]==RCode)
            {
                return i
            }
            exit i==MaxIID
            i++
        }
        return 0
    }
    
    private int GetAID(int RCode)
    {
        int i = 0
        loop
        {
            if(AbilID[i]==RCode)
            {
                return i
            }
            exit i==MaxAID
            i++
        }
        return 0
    }
    
    private int GetUID(int RCode)
    {
        int i = 0
        loop
        {
            if(UnitID[i]==RCode)
            {
                return i
            }
            exit i==MaxUID
            i++
        }
        return 0
    }
    
    private real GetUnitArmorByAbils(unit u)
    {
        int i = 1
        real s = 0
        loop
        {
            if(GetUnitAbilityLevel(u, AbilID[i])>0)
            {
                s = s + AbilAM[i][GetUnitAbilityLevel(u, AbilID[i])]
            }
            exit i==MaxAID
            i++
        }
        return s
    }
    
    private real GetUnitArmorEx(unit u)
    {
        return UnitAM[GetUID(GetUnitTypeId(u))]
    }
    
    private real GetItemArmorEx(item u)
    {
        return ItemAM[GetIID(GetItemTypeId(u))]
    }

    real GetUnitArmor(unit u)
    {
        real am = 0
        int i = 0
        real byabil = GetUnitArmorByAbils(u)
        if(IsHeroUnitId(GetUnitTypeId(u)))
        {
            loop
            {
                if(UnitItemInSlot(u,i)!=null)
                {
                    am = am + GetItemArmorEx(UnitItemInSlot(u,i))
                }
                exit i == 6
                i++
            }
            return integral(GetUnitArmorEx(u) + ArmorPenAgility + GetHeroAgi(u,false)*ArmorPerAgility) + am + (GetHeroAgi(u,true)-GetHeroAgi(u,false))*ArmorPerAgility + byabil
        }
        return GetUnitArmorEx(u) + byabil
    }
    
    private void Init()
    {
        BaseSet()
    }
}
real GetUnitArmor(unit u)


Views: 806

Clamp #1 - 9 years ago 0
Голосов: +0 / -0
Не самое изящное решение, но для ~100 юнитов, ~50 абилок и ~30 предметов (сколько обычно и есть в АоСах и/или аренах) вполне ок.
Это сообщение удалено