Добавлен Clamp,
опубликован
Пример базы данных, позволяющей узнавать броню любого юнита или героя с учётом внесённых в базу предметов и показателей ловкости. Также учитываются способности, повышающие броню.
Код
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;AbilAM[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;AbilAM[MaxAID][4]=0;MaxAID++}
define AddAbilDB(a,b,c)={AbilID[MaxAID]=a;AbilAM[MaxAID][1]=b;AbilAM[MaxAID][2]=c;AbilAM[MaxAID][3]=0;AbilAM[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)
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
Clamp
11 лет назад
0
Не самое изящное решение, но для ~100 юнитов, ~50 абилок и ~30 предметов (сколько обычно и есть в АоСах и/или аренах) вполне ок.
Этот комментарий удален
Чтобы оставить комментарий, пожалуйста, войдите на сайт.