Добавлен , опубликован

Что это?

Дополнительная кампания для WarCraft 3: Frozen Throne. Версия игры: 1.30. Исполнена в "классической" манере. До пяти карт. От одного до двух часов игры.

Когда будет готово?

Осень 2019 или позже. Но уже можно потестировать первую главу!

Сюжет.

Незадолго после восхождения Короля-лича, его могучий слуга, лич Кел'Тузад, занялся сохранением и укреплением власти Плети в мире.
Коварный лич назначил множество чудовищных заданий своим культистам. Одним из них, было осквернение героя каменных великанов, который мирно дремал под землями Калимдора. Выполнение этого задания было поручено Осквернителю по имени Волгоф. Ему предстояло пересечь океан и принести с собой чуму проклятых.

Видео из игры (спасибо ~Bergi_Bear).

Снимки.

Что уже готово?

Вступительный ролик, первая глава, система смены заклинаний, два заклинания героя, одно заклинание войск. Пока только на английском языке!

Изменения

1.1.0wip

  1. Исправил ошибку с сохранением игры в первой главе.
  2. Добавил два новых заклинания для заклинаний школы нечестивости: Extinguish Life, Amalgamation.

Принять участие в тестировании.

`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
22
5 лет назад
0
Добавил заклинание 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 
Загруженные файлы
0
22
5 лет назад
0
Сегодня-завтра размещу первую главу для открытого тестирования.
0
22
5 лет назад
0
Не сумел довести до ума в прошлую неделю. Однако работал довольно много над кампанией. В этом месяце точно первую главу выпущу. Уже вообщем можно и поиграть. Создаю копию здесь, на всякий.
Загруженные файлы
0
22
5 лет назад
0
Выставляю первую главу на проверку. Смотрите главную страницу.
Bump, на случай если при открытии ресурса он не появился в ленте.
Загруженные файлы
0
32
5 лет назад
0
Ну что ж сыграл, очень всё классно, дошел до каменных ворот и решил сохраниться, потому что было очень тяжело контролить пустынников, чтобы они по очереди дефали корабль, потом аурой некра хилял корбаль, я как то затупил и мне его оч. не плохо продамажили его, но возле ворот я решил сохраниться и игра вылетела, а так всё не дурно...
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Всё оч. приятно и атмосферно, но меня жутко бесила погрузка в корабль дефолтная (она всегда меня бесила, тем что не сразу срабатывает просто все стоят и за 20 секунд не не погрузиться куда не тыкай, а иногда и нормально, в общем корабль жутко бесил)
предложение
Сделать скилл на область, чтобы корабль затягивал всех союзников к себе на борт. для таких про как я, что вроде на таймер смотрят, но всё равно не успевают погрузиться за 5-10 секунд XD
3
22
5 лет назад
3
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Да. Ещё они могут построить склеп и сделать вурдалаков.
но меня жутко бесила погрузка в корабль
Да, согласен. Я думал сделать по-другому, чтобы корабль плыл сам. Однако, в карте есть 4 секрета, и 2 скрытых подкрепления, которые могут быть получены только с кораблём. Не говоря о том что можно уклоняться от некоторых врагов только кораблём и защищать раненные юниты погрузкой.
Сделать скилл на область, чтобы корабль затягивал всех союзников к себе на борт.
Я подумаю. Но пока думаю оставлю как есть. Сама по себе волна никого не убьёт.
возле ворот я решил сохраниться и игра вылетела
Это скорее из-за 1.30. У меня подобных проблем небыло.
Bergi_Bear,
Кстати можно нескольким пустынникам приказать защищать юнит одновременно. Они будут отмирать по одному.
0
26
5 лет назад
0
Указывайте, пожалуйста, версию варика, как для карт. Потому что кампания не под 1.26а, при этом и не под 1.30, судя по комментариям.
0
22
5 лет назад
0
8gabriel8,
Дополнительная кампания для WarCraft 3: Frozen Throne. Последняя версия игры.
0
26
5 лет назад
0
Это где указано? На этой странице не нашёл

Ой, нашёл)
0
32
5 лет назад
0
8gabriel8, С такой же проблемой столкнулся "Последняя", но хорошо, что у меня было всё не обходимое
0
9
5 лет назад
0
Вылетает когда пытаюсь сохранится на сложности MAD, боюсь без сохранений сложно пройти...
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.