10

» WarCraft 3 / Библиотека функций

  1. Работа с локами легко переделывается под рабту с координатами
  2. Не использовал все прелести vJ, т.к. писал именно для "newbies"(c), а vJ у них как правило нет
  3. Прилепить аргумент наносящего урон юнита - элементарно
  4. А что за "вторая булеан", коль не секрет?
ADOLF, прошу ткнуть меня носом, где описана правильная работа с группами
10

» WarCraft 3 / Библиотека функций

Функция урона по линии.
DamageLine(a, b, w, dmg, ranged)
a - точка начала линии
b - точка конца линии
w - ширина линии (чем меньше тем точнее)
dmg - наносимый урон
ranged - true, если урон считается дальним боем, false, если нет.
Код Jass
function DamageLine takes location a, location b, real w, real dmg, boolean ranged returns nothing
    local integer i = 0
    local real aX = GetLocationX(a)
    local real bX = GetLocationX(b)
    local real aY = GetLocationY(a)
    local real bY = GetLocationY(b)
    local real dist = SquareRoot((bX - aX) * (bX - aX) + (bY - aY) * (bY - aY))
    local real angle = 57.295827908 * Atan2(bY - aY, bX - aX)
    local group g = CreateGroup()
    local group tg = CreateGroup()
    local unit u
    loop
    exitwhen i > 2*dist/w
        call GroupEnumUnitsInRange(g, aX, aY, w, null)
        loop
            set u = FirstOfGroup(g)
            if (IsUnitInGroup(u, tg) == false) then
                call UnitDamageTarget(u, u, dmg, true, ranged, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            endif
            call GroupAddUnit(tg, u)
            call GroupRemoveUnit(g, u)
        exitwhen u == null
        endloop
        set aX = aX + w/2 * Cos(angle * 0.01745327)
        set aY = aY + w/2 * Sin(angle * 0.01745327)
        set i = i + 1
    endloop
    call DestroyGroup(g)
    call DestroyGroup(tg)
    set g = null
    set u = null
endfunction
Код cJass
void DamageLine(location a, location b, real w, real dmg, boolean ranged) {
    int i = 0
    real aX = GetLocationX(a), bX = GetLocationX(b)
    real aY = GetLocationY(a), bY = GetLocationY(b)
    real dist = SquareRoot((bX - aX) * (bX - aX) + (bY - aY) * (bY - aY))
    real angle = 57.295827908 * Atan2(bY - aY, bX - aX)
    group g = CreateGroup(), tg = CreateGroup()
    unit u
    loop {
    exitwhen i>2*dist/w
        GroupEnumUnitsInRange(g, aX, aY, w, null)
        loop {
            u = FirstOfGroup(g)
            if !IsUnitInGroup(u, tg) {
                UnitDamageTarget(u, u, dmg, true, ranged, ConvertAttackType(5), ConvertDamageType(4), ConvertWeaponType(0))
            }
            GroupAddUnit(tg, u)
            GroupRemoveUnit(g, u)
        exitwhen u==null
        }
        aX+=w/2 * Cos(angle * 0.01745327)
        aY+=w/2 * Sin(angle * 0.01745327)
        i++
    }
    DestroyGroup(g)
    DestroyGroup(tg)
    g = null
    tg = null
    u = null
}
10

» StarCraft 2 / Карты из беты с AI

А чем если не секрет отличаются *(3x)* от *(1x)*?? Скорость? Сложностью?
10

» StarCraft 2 / Mapster TD

оо Может вернусь в <s>большой спорт</s> картостроительство ^^ Но только с выходом официального СЕ, лучше подождать имхо