22

» Осквернитель / Осквернитель

Добавил заклинание Corpse Gas. Указанная дружественная нежить становится бомбой которая взрывается через 5 секунд. Урон зависит от здоровья дружественного юнита и уровня способности. Время отслеживается плавающим текстом.
globals 
  constant real SCG_DELAY = 5.0 
  constant real SCG_UPDATE_TIMEOUT = 0.1

  constant integer CORPSE_GAS = 'A600'

  unit array SCGCasters
  real array SCGDuration
  effect array SCGEffects
  integer array SCGLevel
  texttag array SCGIndicators
  unit array SCGTargets

  group SCGVictims
  integer SCGTargetsQuantity
endglobals 

function SCGOnExplosionCallback takes nothing returns nothing 
endfunction 

function spellCorpseGas takes unit c, unit t, integer lvl returns nothing
  local integer i = SCGTargetsQuantity
  local texttag indicator = null

  if (i >= JASS_MAX_ARRAY_SIZE) or (null == c) or (null == t) or (lvl < 1) then
    return
  endif


  set SCGCasters[i] = c
  set SCGEffects[i] = AddSpecialEffectTarget("Abilities\\Spells\\NightElf\\TargetArtLumber\\TargetArtLumber.mdl", t, "origin")
  set SCGTargets[i] = t
  set SCGDuration[i] = SCG_DELAY
  set indicator = CreateTextTagUnitBJ(I2S(R2I(SCG_DELAY)), t, 0.0, 8.0, 100.0, 100.0, 100.0, 0)
  set SCGIndicators[i] = indicator
  set SCGLevel[i] = lvl
  set SCGTargetsQuantity = SCGTargetsQuantity + 1
endfunction 

function SCGOnCastCallback takes nothing returns nothing 
  local unit caster = GetSpellAbilityUnit() 

  local integer spellLevel = GetUnitAbilityLevel(caster, CORPSE_GAS) 

  call spellCorpseGas(caster, GetSpellTargetUnit(), spellLevel) 

  set caster = null 
endfunction 

function SCGUpdateCallback takes nothing returns nothing 
  local integer i = SCGTargetsQuantity
  local unit u = null
  local unit f = null
  local boolean mustBeDestroyed = false
  local real dmg = 0.0

  loop 
    exitwhen i <= 0
    set i = i - 1
    set u = SCGTargets[i] 
    if IsUnitAliveBJ(u) then
      /* update visuals */
      set SCGDuration[i] = SCGDuration[i] - SCG_UPDATE_TIMEOUT
      call SetTextTagTextBJ(SCGIndicators[i], I2S(R2I(SCGDuration[i])), 8.0)
      call SetTextTagPosUnitBJ(SCGIndicators[i], SCGTargets[i], 0.0)
      if SCGDuration[i] <= 2.0 then
        call SetTextTagColorBJ(SCGIndicators[i], 100.0, 0.0, 0.0, 0.0)
      endif
      /* end update visuals */

      /* explode when needed */
      if SCGDuration[i] <= 0.0 then 
	call GroupClear(SCGVictims)
	call GroupEnumUnitsInRangeCounted(SCGVictims, GetUnitX(u), GetUnitY(u), 512.0, null, 6)

	set dmg = (30.0 + 30.0 * I2R(SCGLevel[i])) * (GetUnitState(SCGTargets[i], UNIT_STATE_LIFE) / 300.0)

        call SetUnitExploded(SCGTargets[i], true)
        call UnitDamageTargetBJ(SCGCasters[i], SCGTargets[i], 300.0, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_DISEASE)
	call SetUnitExploded(SCGTargets[i], false)

	call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl", SCGTargets[i], "origin"))
	loop
	  set f = FirstOfGroup(SCGVictims)
	  exitwhen null == f
	  if not IsUnitType(f, UNIT_TYPE_UNDEAD) and IsUnitAliveBJ(f) and GetUnitAbilityLevel(f, 'Avul') == 0 then
	    call UnitDamageTargetBJ(SCGCasters[i], f, dmg, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_DISEASE)
	    if dmg > 60.0 then
	      call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Undead\\DeathCoil\\DeathCoilSpecialArt.mdl", f, "origin"))
	    endif
	  endif
	  call GroupRemoveUnit(SCGVictims, f)
	endloop
      endif 
      /* end explode if needed */
    endif 

    /* cleanup */
    set mustBeDestroyed = IsUnitDeadBJ(u) or SCGDuration[i] <= 0.0
    if mustBeDestroyed then 
      call DestroyTextTag(SCGIndicators[i])
      call DestroyEffect(SCGEffects[i])

      set SCGTargetsQuantity = SCGTargetsQuantity - 1

      set SCGCasters[i] = SCGCasters[SCGTargetsQuantity]
      set SCGDuration[i] = SCGDuration[SCGTargetsQuantity]
      set SCGEffects[i] = SCGEffects[SCGTargetsQuantity]
      set SCGIndicators[i] = SCGIndicators[SCGTargetsQuantity]
      set SCGLevel[i] = SCGLevel[SCGTargetsQuantity]
      set SCGTargets[i] = SCGTargets[SCGTargetsQuantity] 

      set SCGCasters[SCGTargetsQuantity] = null
      set SCGEffects[SCGTargetsQuantity] = null
      set SCGIndicators[SCGTargetsQuantity] = null
      set SCGTargets[SCGTargetsQuantity] = null 
    endif 
    /* end cleanup */
  endloop 

  set u = null 
  set f = null
endfunction 

function SCGOnCastFilter takes nothing returns boolean
  local boolean result = true 
  set result = CORPSE_GAS == GetSpellAbilityId() and result
  set result = GetSpellTargetUnit() != null and result
  set result = IsUnitType(GetSpellTargetUnit(), UNIT_TYPE_UNDEAD) and result
  return result
endfunction

function initSpellCorpseGas takes nothing returns nothing 
  local trigger t = CreateTrigger() 
  local timer updateTimer = CreateTimer()

  set SCGTargetsQuantity = 0
  set SCGVictims = CreateGroup()

  call TimerStart(updateTimer, SCG_UPDATE_TIMEOUT, true, function SCGUpdateCallback) 

  call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_CAST)
  call TriggerAddCondition(t, Condition(function SCGOnCastFilter))	
  call TriggerAddAction(t, function SCGOnCastCallback) 
 
  set t = null 
endfunction 
Загруженные файлы
22

» Осквернитель / Осквернитель

Репозиторий Git на BitBucket. Использую скрипты чтобы паковать архив кампании. В будущем расширю чтобы упростить глобализацию.
git clone https://vladyslavbondatzohoeu@bitbucket.org/vladyslavbondatzohoeu/plaguebringergame.git
22

» Осквернитель / Осквернитель

Потерял исходники (опять). Осталось только то что на сайте. Выпуск откладывается.
22

» WarCraft 3 / Вселенная WarCraft

Nosferoh,
Ну, они знакомы давно. Ещё Кенариус контактировал с минотаврами но Войны Древних, а таурены в своё время пытались поймать Малорна. Возможно, минотавры объединялись с Ночными Эльфами против кентавров.
Попрошу источники.
22

» WarCraft 3 / Пара элементарных вопросов

Нету функции возвращающей урон юнита.
Если очень нужно, придется прибегнуть к мемхаку или писать свою систему нанесения урона.
+
Возможно в новой версии игры ввели, не уверен. Не использую последнюю версию поскольку не могу заставить JNGP работать в таком случае.
22

» Повелитель Бездны / Повелитель Бездны

Version 3.
Changelog.
  1. Replaced first three spells of Pit Lord.
  2. Fixed bug with optional quest in second map. Now only civilians count as sacrifices. Changed the reward also.

Добавлю русскую версию позже. Я потерял файлы локализации.
Загруженные файлы
22

» Fa_losophy / XGMolution

Я так понял Raised предлагает сделать фильтрование ресурсов по тегам. Сейчас можно только выбрать все ресурсы содержащие один определённый тег.
22

» Fa_losophy / XGMolution

Должен сказать что поиск по сайту слабый. Я попользовался им неделю как его выпустили, и с тех пор для поиска по сайту использую сторонние поисковики.
22

» Дневник Сильваны / Как использовать все место на карте?

Нужно больше информации о том как манипулировать вниманием игрока. Как дать понять игроку куда идти? Как интересно спрятать тайники? Как создать ощущение пространства (обычно делается с помощью разницы высот)? Как донести тему местности (хотя это больше про эстетику).
22

» WarCraft 3 / Галерея скриншотов ландшафта

Да, я почерпнул приём создания "темы" для игры прежде механик из литературы (Game Design Lenses, кажется). Что-то должно быть написано конкретно о дизайне уровней. Ищу дальше.
22

» WarCraft 3 / Галерея скриншотов ландшафта

koloff,
То что Вы предлагаете имеет смысл для микродекоринга. Вопрос был:
Меня интересует именно механики, а не эстетика.
Например, как обыграть комнату с боссом? Где поставить тайники? Откуда должны нападать враги? И так далее. Избавиться от arbitrary geometry.
22

» WarCraft 3 / Галерея скриншотов ландшафта

Немного не в тему, но я всё таки спрошу. Поделитесь какой литературой на тему дизайна уровней, пожалуйста. Меня интересует именно механики, а не эстетика. Пока что собираю отдельные рецепты по крупицам со всей Сети. Должно же быть что-то связное где-то.
22

» Дневник Сильваны / Послушник

Любопытно. По снимку, если бы не анимации, так на послушника вовсе не похоже.
22

» WarCraft 3 / vJass: импортировать несколько скриптов.

Сделал так:
include "scriptA.j"
include "scriptB.j"
vJass и cJass включены. Предварительно добавил файлы в "D:\games\Jass New Gen Pack Rebuild\AdicHelper\lib". Я не могу хранить файлы в той же папке что и карта из-за того как устроен сборщик кампаний.
Заработало. Спасибо.
22

» WarCraft 3 / vJass: импортировать несколько скриптов.

Да. Почему это важно?
+
Ещё включен сборщик кампаний, но это не должно иметь значение. К тому же, мне обязательно чтобы это работало со сборщиком.
22

» World of Warcraft Modding / Импорт ИИ на карте

ИИ скрипт добавляется в архив карты, как любой другой импортируемый файл. Изменения сделанные на исходном скрипте никак не отразятся на том файле которых запакован в архив карты.
К тому же, ИИ созданные с помощью WE импортируются в двух шагах.
22

» Осквернитель / Осквернитель

хочу использовать систему заданий
И облачные сервисы не подразумевают ведения changelog'ов.
22

» WarCraft 3 / vJass: как перебрать все экземпляры структуры?

То есть thistype(3) вернёт мне третий экземлпяр, если он существует? В смысле индекс экземпляра, то есть 3.
22

» WarCraft 3 / vJass: как перебрать все экземпляры структуры?

pro100master:
тогда делай переменную приватную и он обрашать будет только внутри библиотек... извне будет ошибка
Суть в том чтобы избежать повторения кода. А именно алгоритм стэка.
Что значит следующее:
((код
thistype(0)
))
Здесь сказано что это ключевое слово, но не функция.