function BuilderAbilityEffect takes unit b, integer id returns nothing
local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
// SelectBarracks Faction 1
if id == p.faction1.builder_icon0 then
if p.isLocalPlayer then
call ClearSelection()
call SelectUnit(p.barracks, true)
endif
if p.current_barracks_faction != p.faction1 then
call p.swapFactionInBarracks()
endif
return
endif
// SelectBarracks Faction 2
if id == p.faction2.builder_icon1 then
if p.isLocalPlayer then
call ClearSelection()
call SelectUnit(p.barracks, true)
endif
if p.current_barracks_faction != p.faction2 then
call p.swapFactionInBarracks()
endif
return
endif
// SelectAltar
if (id == p.herodata.builder_icon or id == BuilderSelectAltar) and p.isLocalPlayer then
call ClearSelection()
call SelectUnit(p.altar, true)
endif
endfunction
function BarracksAbilityEffect takes unit b, integer id returns nothing
local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
// MinionSpawn
if Minion.hire(p, id) then
return
endif
// SelectBlacksmith
if id == BarracksSelectBlacksmith then
if p.isLocalPlayer then
call ClearSelection()
call SelectUnit(p.blacksmith, true)
endif
if p.current_barracks_faction != p.current_blacksmith_faction then
call p.swapFactionInBlacksmith()
endif
return
endif
// SelectAltar
if id == BarracksSelectAltar and p.isLocalPlayer then
call ClearSelection()
call SelectUnit(p.altar, true)
return
endif
// SelectCapm
if id == BarracksSelectCamp and p.isLocalPlayer then
call ClearSelection()
call SelectUnit(p.merccamp, true)
return
endif
// SwapFaction
if id == SwapFaction then
call p.swapFactionInBarracks()
endif
endfunction
function BlacksmithAbilityEffect takes unit b, integer id returns nothing
local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
// MinionUpgrades
if Minion.makeUpgrade(p, id) then
return
endif
// SwapFaction
if id == SwapFaction then
call p.swapFactionInBlacksmith()
return
endif
// MHU
if id == BlacksmithMHU then
call UpgradeMinionHealth(p)
endif
endfunction
function AltarAbilityEffect takes unit b, integer id returns nothing
local CustomPlayer p = GetCustomPlayer(GetOwningPlayer(b))
// Hero selection
if id == p.faction1.herodata.altar_icon0 then
call UnitRemoveAbility(b, p.faction2.herodata.altar_icon1)
call p.addHero(p.faction1.herodata)
return
endif
if id == p.faction2.herodata.altar_icon1 then
call UnitRemoveAbility(b, p.faction1.herodata.altar_icon0)
call p.addHero(p.faction2.herodata)
return
endif
// Ability selection
if p.changeHeroAbilityByRawCode(id) then
return
endif
// Upgrades
if Minion.makeUpgrade(p, id) then
return
endif
endfunction
function MercCampAbilityEffect takes unit b, integer id returns nothing
call Minion.hire(GetCustomPlayer(GetOwningPlayer(b)), id)
endfunction
function TowerAbilityEffect takes Tower caster, integer id, integer target returns nothing
// Sell
if id == TowerAbilSell or id == TowerAbilDestroy then
call caster.sell()
return
endif
// Upgrade
if id == TowerAbilUpgrade then
call Tower.upgradeTower(caster)
return
endif
// ExpGenerator
if id == AbilExpGenerator.AbilSelectTower then
call AbilExpGenerator.selectTowerAll(caster.abil, target)
endif
endfunction
function Trig_PlayerAbilityEffect_Actions takes nothing returns nothing
local integer id = GetSpellAbilityId()
local unit u = GetSpellAbilityUnit()
local integer caster = GetUnitUserData(u)
local integer target = GetUnitUserData(GetSpellTargetUnit())
local integer T = GetUnitTypeId(u)
if T == BuilderId then
call BuilderAbilityEffect(u, id)
elseif T == BarracksId then
call BarracksAbilityEffect(u, id)
elseif T == BlacksmithId then
call BlacksmithAbilityEffect(u, id)
elseif T == AltarId then
call AltarAbilityEffect(u, id)
elseif T == MercCampId then
call MercCampAbilityEffect(u, id)
elseif IsUnitTower(u) then
call TowerAbilityEffect(caster, id, target)
endif
set u = null
endfunction
function InitTrig_PlayerAbilityEffect takes nothing returns nothing
set gg_trg_PlayerAbilityEffect = CreateTrigger()
call TriggerAddAction(gg_trg_PlayerAbilityEffect, function Trig_PlayerAbilityEffect_Actions)
endfunction
Endcast
function TowerAbilityEndcast takes Tower caster, integer id returns nothing
local TowerAbility abil = caster.abil
// FocusedAttack
if abil.getType() == AbilFocusedAttack.typeid then
call AbilFocusedAttack.returnNormalProjectile(abil, id)
return
endif
// ChillingAttack
if abil.getType() == AbilChillingAttack.typeid then
call AbilChillingAttack.returnNormalProjectile(abil, id)
return
endif
// LightningAttack
if abil.getType() == AbilLightningAttack.typeid then
call AbilLightningAttack.returnNormalProjectile(abil, id)
return
endif
// ExpGenerator
if abil.getType() == AbilExpGenerator.typeid then
call AbilExpGenerator.changeModeAll(abil, id)
endif
endfunction
function MinionAbilityEndcast takes Minion m, integer id returns nothing
// Stop
if id == MinionAbilStop then
call Minion.stopOrder(m.owner)
return
endif
// Sell
if id == MinionAbilSell or id == MinionAbilUnchallenge then
call m.sell()
endif
endfunction
function Trig_PlayerAbilityEndcast_Actions takes nothing returns nothing
local integer id = GetSpellAbilityId()
local unit u = GetSpellAbilityUnit()
local integer caster = GetUnitUserData(u)
if IsUnitTower(u) or IsUnitTowerAttacker(u) then
call TowerAbilityEndcast(caster, id)
elseif IsUnitMinion(u) then
call MinionAbilityEndcast(caster, id)
endif
set u = null
endfunction
function InitTrig_PlayerAbilityEndcast takes nothing returns nothing
set gg_trg_PlayerAbilityEndcast = CreateTrigger()
call TriggerAddAction(gg_trg_PlayerAbilityEndcast, function Trig_PlayerAbilityEndcast_Actions)
endfunction
Тут всё зависит от того, какая карта.
Если куча-куча спелов, то стоит сохранять в хеш по любому парент ключу и равкоду спела как чайлд ключу функцию, которая запускает спел. Функция может не принимать аргументов, всё необходимое можно будет достать изнутри. Во время срабатывания спела достаётся это функция и запускается через .evaluate() или .execute().
flushlocals
также нет клоунского ограничения на объявление переменных в начале функции
Это не имеет никакого отношения в синтаксису.
В cJass есть whilenot, do - whilenot и препроцессорные штуки include, define и enum и прочие препроцессорные директивы, инкремент и декремент. У ZINC препроцессор такой же, как и у vJass, есть циклы for и while. Также отличается определение функций. На этом синтаксические отличия заканчиваются. В обоих одинаковые логические операторы, не нужно писать local, set и call, блоки определяются скобками. Тем самым бóльшая часть кода будет идентична с точки зрения подсветки и автодополнения.
И очень классно ты переделал вот это.
на самом деле cJass мало чем отличается от ZINC по синтаксису
Vlod, на самом деле cJass мало чем отличается от ZINC по синтаксису (только дурацким void). TESH не поддерживает ZINC, но автор может добавить поддержку (ровно как и поддержку Lua).
Это имеет отношение к типу-массиву, но не к двумерному. Я же спрашивал как раз про двумерный массив.
Как я и написал, лучше перенести двумерный массив в Расширенную индексацию. Там хотя бы пример использования есть. И заодно добавить, что width * height не может быть больше общего лимита в 408 000 (это также есть в оригинале, но там ошибка, Вексориан забыл дописать один ноль).
Расширенная индексация доступна двумерным массивам. В этом случае
GetLocalPlayer, как будто в случае не расширенной индексации .size будет возвращать что-то другое. Он всегда возвращает .width * .height, не зависимо от того, расширена индексация или нет.
Ну за с++ я ничего не хотел говорить, там просто есть толковый пример, который можно перенести на джасс
Нет, нельзя. Это ВООБЩЕ разные языки. И уж тем более, что в JASS нет ключевого static, оно есть только в vJass, который также не имеет никакого отношения к C++.
Расширенная индексация доступна двумерным массивам. В этом случае, атрибут size будет содержать размер в виде произведения ширины и высоты массива
Во-первых, он всегда будет содержать произведение высоты на ширину. Во-вторых, не понятно, почему такой хороший пример использования двумерных массивов делает тут, а не в Массивы. Рекомендую в Массивы оставить только про структуру-массив и тип-массив, а двумерные полностью перенести сюда, как и сделано в оригинале.
Добавляя ключевое слово static к глобальной переменной, мы определяем её как внутреннюю, то есть такую, которую нельзя экспортировать и использовать в других файлах
Могут, но там есть нюансы. Как минимум часть вещей нужно будет писать на понятном для vJass синтаксисе. Если при этом использовать синтаксис cJass, появляется проблема читаемости.
Я никогда не использовал cJass из-за каких-то проблем с ним (AdicHelper зависал из-за какой-то ерунды). Автор TESH 2.0 не добавлял поддержку cJass, потому что никто не просил, и вряд ли будет - cJass сейчас юзает несколько человек. А мне важнее настройка подсветки и добавление своих функций, чем cJass, которым я не пользуюсь.
Тут всё ещё можно использовать cJass, просто, как и написал, адекватной подсветки не будет.
» WarCraft 3 / Мы ждали этого так долго - обновление лаунчера Battle.net 😌
» WarCraft 3 / Замена модели юнита или альтернативы
Есть ещё тёмный.
» WarCraft 3 / Мы ждали этого так долго - обновление лаунчера Battle.net 😌
» WarCraft 3 / Как лучше организовать обработку кастов?
» WarCraft 3 / Как лучше организовать обработку кастов?
Если куча-куча спелов, то стоит сохранять в хеш по любому парент ключу и равкоду спела как чайлд ключу функцию, которая запускает спел. Функция может не принимать аргументов, всё необходимое можно будет достать изнутри. Во время срабатывания спела достаётся это функция и запускается через .evaluate() или .execute().
» WarCraft 3 / не могу зайти в jass
Ред. PT153
» WarCraft 3 / JNGP: Rebuild от PT153
» WarCraft 3 / JNGP: Rebuild от PT153
» WarCraft 3 / 15. Массивы
Ред. PT153
» WarCraft 3 / JNGP: Rebuild от PT153
» WarCraft 3 / 15. Массивы
Ред. PT153
» WarCraft 3 / 19. Расширенная индексация
Ред. PT153
» WarCraft 3 / Отличия static от глобальной переменной
Ред. PT153
» WarCraft 3 / 19. Расширенная индексация
Ред. PT153
» WarCraft 3 / 15. Массивы
» WarCraft 3 / Набор людей для работы над проектом.
» WarCraft 3 / Набор людей для работы над проектом.
» WarCraft 3 / Отличия static от глобальной переменной
» WarCraft 3 / Набор людей для работы над проектом.
Ред. PT153
» WarCraft 3 / Проблема с воскрешением героев
Ред. PT153
» WarCraft 3 / Проблема с воскрешением героев
Ред. PT153
» WarCraft 3 / Проблема с воскрешением героев
» WarCraft 3 / Проблема с воскрешением героев
» WarCraft 3 / Структуры и хэш-таблица
Ред. PT153
» WarCraft 3 / JNGP: Rebuild от PT153