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

Что это?

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

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

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

Сюжет.

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

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

Снимки.

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

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

Изменения

1.1.0wip

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

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

`
ОЖИДАНИЕ РЕКЛАМЫ...
24
Что мешает разрабатывать в блоге, или хранить на яндексе?
22
хочу использовать систему заданий
И облачные сервисы не подразумевают ведения changelog'ов.
22
Потерял исходники (опять). Осталось только то что на сайте. Выпуск откладывается.
22
Репозиторий Git на BitBucket. Использую скрипты чтобы паковать архив кампании. В будущем расширю чтобы упростить глобализацию.
git clone https://vladyslavbondatzohoeu@bitbucket.org/vladyslavbondatzohoeu/plaguebringergame.git
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
Сегодня-завтра размещу первую главу для открытого тестирования.
22
Не сумел довести до ума в прошлую неделю. Однако работал довольно много над кампанией. В этом месяце точно первую главу выпущу. Уже вообщем можно и поиграть. Создаю копию здесь, на всякий.
Загруженные файлы
22
Выставляю первую главу на проверку. Смотрите главную страницу.
Bump, на случай если при открытии ресурса он не появился в ленте.
Загруженные файлы
33
Ну что ж сыграл, очень всё классно, дошел до каменных ворот и решил сохраниться, потому что было очень тяжело контролить пустынников, чтобы они по очереди дефали корабль, потом аурой некра хилял корбаль, я как то затупил и мне его оч. не плохо продамажили его, но возле ворот я решил сохраниться и игра вылетела, а так всё не дурно...
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Всё оч. приятно и атмосферно, но меня жутко бесила погрузка в корабль дефолтная (она всегда меня бесила, тем что не сразу срабатывает просто все стоят и за 20 секунд не не погрузиться куда не тыкай, а иногда и нормально, в общем корабль жутко бесил)
предложение
Сделать скилл на область, чтобы корабль затягивал всех союзников к себе на борт. для таких про как я, что вроде на таймер смотрят, но всё равно не успевают погрузиться за 5-10 секунд XD
22
Пока писал понял, а послушники могут же чинить корабль? а то я их вообще оставил на берегу...
Да. Ещё они могут построить склеп и сделать вурдалаков.
но меня жутко бесила погрузка в корабль
Да, согласен. Я думал сделать по-другому, чтобы корабль плыл сам. Однако, в карте есть 4 секрета, и 2 скрытых подкрепления, которые могут быть получены только с кораблём. Не говоря о том что можно уклоняться от некоторых врагов только кораблём и защищать раненные юниты погрузкой.
Сделать скилл на область, чтобы корабль затягивал всех союзников к себе на борт.
Я подумаю. Но пока думаю оставлю как есть. Сама по себе волна никого не убьёт.
возле ворот я решил сохраниться и игра вылетела
Это скорее из-за 1.30. У меня подобных проблем небыло.
Bergi_Bear,
Кстати можно нескольким пустынникам приказать защищать юнит одновременно. Они будут отмирать по одному.
26
Указывайте, пожалуйста, версию варика, как для карт. Потому что кампания не под 1.26а, при этом и не под 1.30, судя по комментариям.
22
8gabriel8,
Дополнительная кампания для WarCraft 3: Frozen Throne. Последняя версия игры.
26
Это где указано? На этой странице не нашёл

Ой, нашёл)
33
8gabriel8, С такой же проблемой столкнулся "Последняя", но хорошо, что у меня было всё не обходимое
9
Вылетает когда пытаюсь сохранится на сложности MAD, боюсь без сохранений сложно пройти...
26
А вот это интересная фича, когда сложность не позволяет сохраниться)
Но предпочёл бы, чтобы загрузки сохранений на этой сложности приводили к мгновенному поражению.
22
Это баг. Пойду исправлять.
Кстати буду признателен за несколько снимков из игры.
26
Bergi_Bear, мы регулярно просим кампании Эфирии потестировать на видео, чтобы увидеть, с какими непредвиденными проблемами могут столкнуться игроки, как они отреагируют на разные фичи, в каких местах есть некритические проблемы, о которых тестер мог бы простым текстом не сообщить, потому что просто обошёл её, но на самом деле этой проблемы вообще быть не должно. Так что обязательно сними видео с комментариями без умолку, о чём в игре думаешь. Хоть видос посмотрю, раз поиграть не судьба)
33
8gabriel8, какое ответственное задание
P.S. проверь личку
22
8gabriel8,
Да, извиняюсь за проблемы с патчем. Изначально я делал используя возможности только старых патчей, надеясь на совместимость. Однако, при попытке сохранить карту или кампанию в другой версии скрипты просто перестают работать. Даже переписывать их заново не помогает. Поэтому я плюнул пока. К тому же, заклинание Shadowfiend "Void Shield" для идеальной работы полагается на функцию из 1.30.
Управляющие обновите лого пожалуйста. xgm.guru/p/plague18/task-2 xgm.guru/files/1766/204534/comments/379284/100x100.png
33
В общем всё таки прошёл я эту часть, ну что сказать, это очень тяжелая борьбы, кривых рук, дефолтного управления и и некоторых дефолтных механик, например погрузки.
Предложение: нужен звук дзынь, например когда на таймере осталось 10 секунд, и пора залазить в корабль.
Хотя, как я говорил ранее и 20 секунд бывает мало, чтобы погрузиться, и это основная сложность
Не столько сильно понятно куда идти карта невероятно ограмная, и мне кажется это не к чему, я хотел бы её поисследовать, но передумал ибо это заняло бы вечность с такой скоростью
Предложение: перереботать карту, убрав лишние места, которые просто для красоты и создают размер, но это по желанию автора
Не очень ясно куда идти и в каком порядке, нужны какие то индикаторы, я вот например вообще не понял, зачем заходил в первый город наг, ради колодца маны? МНЕ ЖИЗНЬ НУЖНА!
Предложение: сделать все дополнительные нычки дополнительным заданием и указать где они на карте, а то как-то не дружелюбно, а основную цель желательно МИГАТЬ!
Волны: А это самое клёвое, что есть в карте, но можно подправить врезание в берег, чтобы убрать дёрганье у юнита.
Предложение: Проверять точку впереди и прекращать двигать, если уже некуда (особенно корабля касается)
Проходимость корабля по воде... Я НЕ ПОНЯЛ ГДЕ КОРАБЛЬ МОЖЕТ ПРОЙТИ а где нет, но это наверное мои проблемы, о невозможности определения мелкой воды...
Предложение: Обязательно! сделать безопасные точки более явными, например меня крайне огорчало когда я вроде бы на земле стоял а меня всё равно дамажило водой и уносило...., это снова не юзерфрендли....
И наверное нужны какие-то диалоги еще при заходе на новые точки и на получение юнитов, не хватило для атмосферности...
Сложность очень высокая, может она конечно показалась высокой для меня, но я дастаточно хардкорный игрок и хорошо играю в сложные игры, но, боюсь, что для некоторых вообще захочется включить читы и ливнуть, а это провал для карты... Надо добавить дружелюбности в карту, но саму сложность оставить, иначе потеряется соль
P.s Сорь за ошибки
22
  1. Будет медленное изменение тумана и покачивание камеры, и возможно звук волны, перед тем как волна накрывает.
  2. Фонтан даёт и жизнь и ману. Более того, в этом месте открывается дополнительное заклинание.
  3. Я сделаю промежуточные цели открытыми на карте, по мере прохождения.
  4. Я пробовал убрать дёргание, но пока не получалось.
  5. Я думал как сделать безопасные места более явными. Вроде добавил пену и белую дымку там где опасно, но видимо этого недостаточно. Может тупо отмечу какими мигающими эффектами границу.
Диалоги может добавлю. Там есть звуковые эффекты для засад и спасаемые некроманты благодарят. Я наверное сделаю это дополнительным заданием тоже. Но секреты оставлю секретами. Кстати самый первый недосекрет тоже включает реплику от главного героя.
Что касается сложности, да, карта слишком сложная. Я буду упрощать.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.