это каждые 10 сек, отдавать приказы единице, при этом проверять расстояние между целью и нападающим. Если R[m] > R[t] || 500. aoe, то нападаем, иначе ничего не делаем.
это приказывать опр. отрядам двигаться, нападать или стоять, в зависимости от положения дела на поле брани, если слишком много передвигаются, то часть будет просто стоять и ждать, другая нападать, третья просто передвигаться. Можно конечно так же спроверкой расстояния, только если меньше расстояние то сразу ринуться атаковать в чистую, при этом не приказывается вообще если orderid != 0 или имеет stop, attack, smart.
Чуть не забыл, ты же ещё четкий список целей для каждого отряда не делал. Можно ещё Targets запилить для каждой волны, чтобы строго шли к цели, пока та не сдохнет. Можно даже конечно по опр. кол-во мобов из отряда дать по цели например на отряд из 30 лучников .5 или 10 целей.
Chosen2, это просто пример, правда был другой вариант, но случайно удалил карту с ним, когда перестанавливал вар.
Base
globals
//
constant integer MAX_BOTTLES = 12
//
unit Duos = null
unit newUnit = null
player NPC = Player(3)
player DPC = Player(0)
boolean waveoff = true
boolean array check
boolean array check2[100][100]
boolean array offps
real array SPAWN_X
real array SPAWN_Y
integer RAND = 0
hashtable H = InitHashtable()
group G = CreateGroup()
timer T = null
integer DELICACY_EASY = 1
integer DELICACY_NORMAL = 2
integer DELICACY_HARD = 3
integer DELICACY_PEDANAR = 4
integer DELICACY_VOLKOEB = 5
integer DELICACY_SELECTED = 1
string EF_DUOS_Q = "Abilities\\Weapons\\BrewmasterMissile\\BrewmasterMissile.mdl"
real MXX = 5301.6
real MIX = -5527.5
real MXY = 5066.
real MIY = -5516.9
endglobals
library Functional
function IsAlive takes unit u returns boolean
return IsUnitType( u, UNIT_TYPE_DEAD ) == false and GetWidgetLife(u) > 0. and u != null
endfunction
function PS takes string soundName returns nothing
local sound snh = CreateSound(soundName, false, false, true, 12700, 12700, "")
call StartSound(snh)
call KillSoundWhenDone(snh)
set snh = null
endfunction
function IsNT takes unit good, unit bad returns boolean
return IsUnitType(bad,UNIT_TYPE_STRUCTURE)==false and IsUnitEnemy(bad, GetOwningPlayer(good)) == true and IsAlive(bad) and GetUnitAbilityLevel(bad,1097625443) == 0 and GetUnitAbilityLevel(bad,1097691750) == 0
endfunction
function FAU takes unit u, string effname returns nothing
call DestroyEffect(AddSpecialEffectTarget( effname, u, "origin" ))
endfunction
function FAR takes real x, real y, string effname returns nothing
call DestroyEffect(AddSpecialEffect( effname, x, y ))
endfunction
function X takes real x returns real
if x > MXX then
return MXX
endif
if x < MIX then
return MIX
endif
return x
endfunction
function Y takes real y returns real
if y > MXY then
return MXY
endif
if y < MIY then
return MIY
endif
return y
endfunction
function PZ takes real h, real d, real x returns real
return ( 4 * h / d ) * ( d - x ) * ( x / d )
endfunction
function dc takes real x, real y, real xx, real yy returns real
return SquareRoot( (x - xx) * (x - xx) + (y - yy) * (y - yy) )
endfunction
function Ang takes real x, real y, real cx, real cy returns real
return Atan2( y - cy, x - cx )
endfunction
function SetTriggerCustomValue takes integer ttype, trigger t returns nothing
call SaveInteger( H, GetHandleId(t), StringHash("TRIGG"), ttype )
endfunction
function GetTriggerCustomValue takes trigger t returns integer
return LoadInteger( H, GetHandleId(t), StringHash("TRIGG") )
endfunction
function ClearTriggerCutomValues takes trigger t returns nothing
call FlushChildHashtable( H, GetHandleId(t) )
endfunction
function SetTimerCustomValue takes integer ttype, timer t returns nothing
call SaveInteger( H, GetHandleId(t), StringHash("TIMER"), ttype )
endfunction
function GetTimerCustomValue takes timer t returns integer
return LoadInteger( H, GetHandleId(t), StringHash("TIMER") )
endfunction
function ClearTimerCutomValues takes timer t returns nothing
call FlushChildHashtable( H, GetHandleId(t) )
endfunction
function NewTimer takes real tm, code callback returns timer
set T = CreateTimer()
call TimerStart( T, tm, true, callback )
return T
endfunction
function InitResources takes nothing returns nothing
set SPAWN_X[0] = -4035.4
set SPAWN_Y[0] = 3906.5
set SPAWN_X[1] = -4802.8
set SPAWN_Y[1] = 1891.3
set SPAWN_X[2] = -1478.
set SPAWN_Y[2] = 2050.4
set SPAWN_X[3] = -524.5
set SPAWN_Y[3] = -3289.3
set SPAWN_X[4] = 4734.6
set SPAWN_Y[4] = -5115.2
set SPAWN_X[5] = 4295.7
set SPAWN_Y[5] = 1532.1
set SPAWN_X[6] = -382.3
set SPAWN_Y[6] = 4611.5
set SPAWN_X[7] = -159.5
set SPAWN_Y[7] = -5215.
set SPAWN_X[8] = -397.4
set SPAWN_Y[8] = -2952.6
set SPAWN_X[9] = -4575.9
set SPAWN_Y[9] = -4164.5
endfunction
function NewUnit takes player wp, integer ui, real cx, real cy, real uf returns unit
set newUnit = CreateUnit(wp,ui,cx,cy,uf)
return newUnit
endfunction
function GetNewUnit takes nothing returns unit
return newUnit
endfunction
function RandSpawnXY takes nothing returns nothing
set RAND = GetRandomInt(0,9)
endfunction
function GetRandSpawnX takes nothing returns real
return SPAWN_X[RAND]
endfunction
function GetRandSpawnY takes nothing returns real
return SPAWN_Y[RAND]
endfunction
function GetRandSpawnFace takes nothing returns real
return GetRandomReal(0.,359.)
endfunction
endlibrary
WaveSet
struct Wave
integer wavecount = 0
integer waveclose = 0
integer wunittype = 0
group unitstack = null
integer stack = 0
real time = 0.
boolean isRun = false
timer waveTimer = null
method destroy takes nothing returns nothing
call ClearTimerCutomValues(.waveTimer)
call DestroyTimer(.waveTimer)
call DestroyGroup(.unitstack)
set .unitstack = null
call .deallocate()
set waveoff = true
call BJDebugMsg("|cffFF9900SYSTEM MESSAGE|r: Wave End")
endmethod
method ReleaseUnit takes unit u returns nothing
call GroupRemoveUnit(.unitstack,u)
endmethod
static method wavemove takes nothing returns nothing
local unit e = GetEnumUnit()
if GetUnitCurrentOrder(e) != 851983 then
call IssuePointOrderById( e, 851983, GetWidgetX(Duos), GetWidgetY(Duos) )
call RemoveGuardPosition(e)
endif
set e = null
endmethod
static method callback takes nothing returns nothing
local thistype this = GetTimerCustomValue(GetExpiredTimer())
local integer st = 0
local real tt = 0.
if .wavecount == .waveclose and FirstOfGroup(.unitstack) == null then
call .destroy()
else
if FirstOfGroup(.unitstack) == null then
if .wavecount < .waveclose then
set .wavecount = .wavecount + 1
endif
loop
exitwhen tt == .time
loop
exitwhen st == .stack
call RandSpawnXY()
call GroupAddUnit( .unitstack, NewUnit( NPC, .wunittype, GetRandSpawnX(), GetRandSpawnY(), GetRandSpawnFace()) )
call SetUnitUserData( GetNewUnit(), 30 ) // код моба волны
set st = st + 1
endloop
set tt = tt + .5
endloop
set st = 0
set tt = 0.
else
call ForGroup( .unitstack, function thistype.wavemove )
endif
endif
endmethod
method wavelaunch takes nothing returns nothing
if .isRun == false then
set .isRun = true
set .waveTimer = NewTimer( 1., function thistype.callback )
call SetTimerCustomValue( this ,.waveTimer )
endif
endmethod
static method create takes integer maxwave, integer typewave, integer delicacy returns thistype
local thistype this = thistype.allocate()
set .wavecount = 0
set .waveclose = maxwave
set .wunittype = typewave
set .unitstack = CreateGroup()
set .stack = 25 + (5 * delicacy )
if delicacy < 4 then
set .time = .5 // (0.5 times = 1 wave 1 times = double wave )
else
set .time = 1.
endif
set .isRun = false
set waveoff = false
call .wavelaunch()
return this
endmethod
endstruct
globals
Wave Twave
endglobals
function Trig_WaveI_Actions takes nothing returns nothing
endfunction
//===========================================================================
function InitTrig_WaveSet takes nothing returns nothing
set gg_trg_WaveSet = CreateTrigger( )
call TriggerAddAction( gg_trg_WaveSet, function Trig_WaveI_Actions )
endfunction
WavesDeathUnreg
function Trig_WavesDeathUnreg_Actions takes nothing returns nothing
local unit d = GetDyingUnit()
if GetUnitUserData(d) == 30 then
call SetUnitUserData(d,0)
call Twave.ReleaseUnit(d)
set d = null
endfunction
//===========================================================================
function InitTrig_WavesDeathUnreg takes nothing returns nothing
set gg_trg_WavesDeathUnreg = CreateTrigger( )
call TriggerAddAction( gg_trg_WavesDeathUnreg, function Trig_WavesDeathUnreg_Actions )
call TriggerRegisterPlayerUnitEvent( gg_trg_WavesDeathUnreg, NPC, EVENT_PLAYER_UNIT_DEATH, null )
endfunction
"Одинокой горе" лавы не хватило до победы, Амон Сул так себе. Озерный город не дотянул до озёрного города, печаль. Минас Моргул неплохо кстати особенно на тему повелителя душ, ведьм и крепости тёмных сил, но маловато готичности. Остальные с пивком потянут, хотя город гавань ничего так.
BrEd Pitt, немного поправил текст. Не с той версии заготовок скопировал. Сон всегда бывает абы"черти-что". Не всегда он бывает ясен, однако нетуманность его протекает редко..
очертание дынек, я подумаю.
Да, с пропорциями я тоже подумаю)
Надеюсь, вы сделаете её как можно более женственной, при этом останется женская отвага во взгляде, который будет показывать её решимость и готовность ко битве.
KingMaximax, не могу говорить за всех, конечно, но лично я крайне рад, что меня не пытались научить АСМ в качестве первого языка.
Я лишь предлагал как вариант его. Ну для начало же можно и простенькие для понимания принципов, а потом уже на сложные. Хотя велосипедствовать тоже вредно, но порой некоторым нужен свой велосипед, покуда есть платные. Подходящий под своё мышление, и для воплощения своих идей яп, не так уж просто найти. Не потому, что их много, а потому, что может измениться идея, или появится новая задумка, и бывает так, в одном она легко осуществима, а в этом тяжело.
KingMaximax, про то насколько чист и оптимален код написанный нубом на ассемблере я даже спорить не хочу
Причём здесь новичок? Я не говорю же "Ага прочитали написали и обделалися", а обо правильном использовании, как опора понимания взаимодействия программа-устройство. Хотя скорее тут самое важное будет "Дизассемблирование и отладка", "Максимальная гибкость при работе с аппаратными ресурсами.", "Оптимизация программ по скорости выполнения.". Хотя ему врядли пока пригодится в ближайшее время.
Можно просто использовать заготовку на основе особого фильра, и управлять при помощи дамми юнита. В Ткоке есть подобие диалога, когда нажимаешь на npc.
Для дамика сделать иконки типа 1 2 3 4, A B C D, или I, II III IV. Использовать в инвентаре как предметы-кнопки или на общей панели приказ,. где у даммика не отображаются стандартные приказы.
В общем там Blp файл или Tga с альфа каналом, где обрамление диалога прозрачно, DisplayText с различными манипуляциями, дами и способности\Предметы для выбора варианта ответа. Как-то так.
Облегчу задачу для нашего вопросителя: Выживаемость, навык, ум. Разве нет специальных сайтов по подобному вопросу, где описаны всевозможное виды характеристик?
Если у вас не анло-язычный jpng, а xgm'ский(5d), то это бесполезно. Всегда будет ночь, лучше попробуйте новую сборку jpng: Jass New Gen Pack - Rebuild 1.3 , надеюсь поможет.
Мне кажется он просто опыт набивает, нормальный человек уже давно сам всё проверил.
Сударь ClotPh, не соблаговолите задавать вопросы на те задачи, которые вы не можете разрешить сам за правду, оные требуют более дельного и детального обсуждения. Хватит уже абузить опыт.
KingMaximax, а причём тут сложнее?
и чем же полезен ассемблер?
Чистой оптимизацией, и код чище кстати. Вдобавок, он помогает выявлять куда более глубокие проблемы. А так же важных да более сложных операций, которые могут потребоваться для определённых задач, которые должны быть быстрыми, чем даст нам интерпретатор или комипилятор т.го. или иноно яп. Хотя я ничего не имею против того же lisp'a или питона. А вообще неплохо было автору определиться какой ему именно нужен яп и под какие задачи, я решил что ему просто нужно понимать принцип программирования или что-то во этом духе. Однако можно и в кросс.
а смысл учить то что проще если потом всеравно придётся переучиваться?
только время теряешь
но если так хочешь яп для изучения программирования то советую lisp
по нему есть хорошая книга SICP
Тогда уж ассемблер, это куда сложнее и полезнее. Тогда любой яп будет подвластен новоиспечённому само злому гению.
Лучше начинать с простых, типа Basic, QBasic или Visual Basic. А потом переходить на более сложные, кстати jass схож со синтаксисом basic, почти...Но jass это не то, что нужно для изучения.
Тут лучше jass заклинание "Молнии" сделать, т.е. исккуственного молнию, которая будет поражать, как ты хочешь. Это можно провернуть с хеш-таблицей, или структуры. А применение такого рода без jass-подменок труден, ловкое смена владельца не катит. Разве, что через даммик, но и он может подвести. По этому лучше jass, или триггеры, как нравитсо.
Вот при помощи жассовой молнии, можно как сделать? Особую переменную, которая определяет стиль применения способности, от себя или под контролем вражеских чар. Да мы меняем тогда во этом случае владельца, потом забиваем в данные, что целью не может быть кастер и враги, но могут быть друзья. Молния поражает союзников, а для врага ещё и опыт, если союзник цели был убит. Правда, это довольно много пилить столько jass заклинаний, похожих даже на стандарт. Но это будет стоить того, может пригодится и для других операций.
Если я правильно понял, чтобы он кастовал и чтобы у него абилка перезаряжалась, что-то вроде некой подлости, да? Ну тут только jass пот и кровь.
Игра года! Осталось побольше примочек во движок варика, с добавлением более крутых видов абилок. Ещё больше характеристик в UI, больше видов энергии!
Осталось ещё заставлять героя реалистичн, ходить по воздуху, особенно ввысь, чтобы мочить драконов и пр. летающую нечисть. Неплохо бы ещё клифы крошить, не только декор.
Если честно нарисовано интересно, даже хорошо, но немного не хватает женственности Аллерии, она через-чур мужественно. А так тянет на 10 из 10. Просто ощущение, что это эльф-мужик похожий на неё.
Кстати, очертание дынек будет?
Ред. Волчачка
» WarCraft 3 / Проблема с ИИ
» Он вам не клоун! / 7 вещей от которых мы отказались
ZlaYa1000,
Вот мне интересно, кто заставил козырёк форума съехать?
» Он вам не клоун! / 7 вещей от которых мы отказались
» WarCraft 3 / Лучший способ отправить юнитов в атаку
» WarCraft 3 / Лучший способ отправить юнитов в атаку
» WarCraft 3 / Лучший способ отправить юнитов в атаку
Chosen2, а вообще лучше систему, могу пример на vJass:e скинуть.. Есть одна заготовка.
» WarCraft 3 / Конкурс ландшафтеров Средиземья завершен!
» Кузня Волчачки / Потрошение XGM: Хроники Белых Цепей
» 2D Арт / Alleria
» WarCraft 3 / Jass как первый ЯП?
» WarCraft 3 / Jass как первый ЯП?
» WarCraft 3 / Система диалогов
В общем там Blp файл или Tga с альфа каналом, где обрамление диалога прозрачно, DisplayText с различными манипуляциями, дами и способности\Предметы для выбора варианта ответа. Как-то так.
» Icons Library / Icons Library
» WarCraft 3 / Система атрибутов
» WarCraft 3 / Не отображается декорация
Ред. Волчачка
» WarCraft 3 / Как сделать день в редакторе?
Ред. Волчачка
» WarCraft 3 / Вовремя сменить владельца, чтобы союзник надамажил союзника
Сударь ClotPh, не соблаговолите задавать вопросы на те задачи, которые вы не можете разрешить сам за правду, оные требуют более дельного и детального обсуждения. Хватит уже абузить опыт.
» WarCraft 3 / Jass как первый ЯП?
» WarCraft 3 / Jass как первый ЯП?
» WarCraft 3 / Jass как первый ЯП?
» WarCraft 3 / type key
» WarCraft 3 / Вовремя сменить владельца, чтобы союзник надамажил союзника
» Edemium / Edemium – Trailer
Осталось ещё заставлять героя реалистичн, ходить по воздуху, особенно ввысь, чтобы мочить драконов и пр. летающую нечисть. Неплохо бы ещё клифы крошить, не только декор.
» 2D Арт / Alleria
Кстати, очертание дынек будет?
» Кузня Волчачки / Вкусняшка [1.2]