Ну, написанный код тоже задает вероятность. Примерно в 1% (т.е. если случайное число получится строго равным 10).
Отредактировано yuritch (2011-01-17 12:21:31)
Союз | Union |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Союз | Union » Картостроение и скриптовка » Скрипты
Ну, написанный код тоже задает вероятность. Примерно в 1% (т.е. если случайное число получится строго равным 10).
Отредактировано yuritch (2011-01-17 12:21:31)
RandomInt(100)<=10
Вероятность можно задать разными способами, кому как нравится
Вероятность можно задать разными способами, кому как нравится
Можно. Я лишь указал, так как ИМХО так удобнее. Сразу видишь величину в процентах, с которыми вероятность чаще всего оперирует.
Можно конечно и "по молдовански" сделать, меняя цифру в скобках. Это уже дело вкуса и профессионализма.
Вот такая функция может быть полезна картоделам, например, с ее помощью можно получить на карте мост в полу-разрушенном виде, в чем может возникнуть необходимость для антуража:
- выставляет объекту(юниту) заданное количество HPs
function SetScriptObjectsHPs (scriptid,newhp)
local hps = GetObjectsHPs(scriptid);
if (hps - newhp ~=0) then
DamageObject(scriptid,hps-newhp);
end;
end;
отбив окоп у врага сталкиваешся с контратакой, враг дойдя до окопа там тупит!!! Зная сей затуп враг тупо уничтожается артой.
Для скриптоделов -какой скрипт можно использовать для посадки пехоты после движения (вражеская пехота атакует позиции и после атаки садится в отбитые траншеи) в окоп (по примеру приведенной ситуации)
какой скрипт можно использовать для посадки пехоты после движения (вражеская пехота атакует позиции и после атаки садится в отбитые траншеи) в окоп
Команда "Enter"(6).
Выглядит так:
Cmd(3,100,11250,12350); - взвод со скриптовым номером 100 следует в режиме атаки к точке x,y
QCmd(6,100,1000); - взвод со скриптовым номером 100 садится в окоп со скриптовым номером 1000.
То есть сегменту окопа куда будет садится пехота надо присвоить номер, и направлять пехоту нужно поближе к этому окопу(координаты x,y в первой строчке). То же самое и для посадки в здание.
если давать двойную команду, то между ними возникает пауза - добежали, застыли, потом сели в окоп
Можно просто сразу направить их в окоп
Насчет паузы, - такая пауза может возникать если в скваде имеются разные виды пехоты, с разной скоростью движения(например, пулеметчик идет медленнее, чем простой солдат), а взвод будет выполнять команду посадки, когда весь сквад будет в непосредственной близости к указанной траншее. Однако, учитывая то, что все это происходит во время атаки, то эта мини-пауза получается вообще незаметной(еще не факт, что все они добегут живыми до этого окопа).
А также может возникнуть необходимость, когда пехота сначала атакует какую-то зону, а уже потом бежит(если кто остался в живых) и садится в окоп, который находится в стороне от зоны атаки. Поэтому я и указал последовательность команд. Ну это все уже на усмотрение картодела, в каждом конкретном случае.
Вот как пример использования этих команд:
function Kontra19()
local A_Swarm = 3;
local A_Enter = 6;
local A_Leave = 7;
local a = GetNUnitsInScriptGroup(691)+GetNUnitsInScriptGroup(692)+GetNUnitsInScriptGroup(693)+GetNUnitsInScriptGroup(694)+GetNUnitsInScriptGroup(695)+GetNUnitsInScriptGroup(696);
if (a <= 3) then
Cmd(7,742,10283,9825);
QCmd(3,742,11215,8650);
QCmd(6,742,1159);
Cmd(7,743,10395,9820);
QCmd(3,743,11365,8685);
QCmd(6,743,1160);
Cmd(7,744,10480,9825);
QCmd(3,744,11955,8110);
QCmd(6,744,1161);
Cmd(7,745,10600,9820);
QCmd(3,745,12080,8225);
QCmd(6,745,1162);
Cmd(7,745,10700,9885);
QCmd(3,745,12095,8480);
QCmd(6,745,1152);
Cmd(7,746,11330,9995);
QCmd(3,746,11860,9465);
QCmd(3,746,12160,8590);
QCmd(6,746,1163);
ChangeFormation(742,3);
ChangeFormation(743,3);
ChangeFormation(744,3);
ChangeFormation(745,3);
ChangeFormation(746,3);
RunScript("Kontra20",3000);
Suicide();
end;
end;
когда в траншее первого рубежа остается меньше половины обороняющейся там пехоты, пехота выходит из траншеи второго рубежа и атакует траншею первого рубежа, с посадкой в нее(атакует врага если он к тому времени уже занял траншею, а если там еще свои, то просто присоединяется к ним и продолжает обороняться вместе с ними)
Пауза всегда возникает между командами, юнит становится в относительно-начальную позицию для выполнения следующей команды.
Промежуток времени небольшой, но для пехоты может быть фатальным, при наличии плотного огня, поэтому если расстояние небольшое, то лучше сразу давать конечную команду
войти/выйти в окоп/здание, потому как эффекта атаки на небольшом расстоянии будет абсолютно небольшой и перекроется убытком от огня
Вот, сразу появилась тема для обсуждений. Спасибо мужчины за образцы, буду пробовать оба варианта (кстати по паузе -для меня лично не критично, ждать друг друга не будут, у меня все пехотинцы по одному, отделения редко использую).
Отредактировано alex (2011-04-05 02:59:52)
народ, подскажите имеет ли значение пробел между RunScript и скобкой или между другой ф-цией или скобкой? заранее благодарен
народ, подскажите имеет ли значение пробел между RunScript и скобкой или между другой ф-цией или скобкой? заранее благодарен
Имеет. Его быть не должно. После названия ф-ции (RunScript тоже ф-ция) сразу же скобки.
теперь понятно почему скрипт не работал...спасибо
Убедительная просьба к знающим проверить мой скрипт на наличие ошибок в ф-циях т.к. сам уже много раз проверял и ничего не нашёл(скрипт довольно небольшой, всего 180 строчек, скачать можно тут)
Убедительная просьба к знающим проверить мой скрипт
Сбрось карту и сценарий, для которых написан скрипт. Завтра (5 мая) постараюсь проверить.
Да, и укажи, на какой основе сделана карта (БК, мод, GZM и т.п.)
Карта делалась на основе ГЗМ 7.50.1 (саму карту скинул в ЛС)
Для ИС-3.
1) Функцию Init нужно написать с большой "I".
2) Зону "baranovichi" везде прописать с маленькой буквы, то есть везде одинаково.
Напиши, если игра заведется.
Да, а что это за ЛС, куда скинута карта?
И еще. В отладочной функции замени активацию чит-режима на @Password( "www.dtf.ru" ), если карта для ГЗМ.
Отредактировано yersinia (2011-05-05 20:55:20)
1) Функцию Init нужно написать с большой "I".
2) Зону "baranovichi" везде прописать с маленькой буквы, то есть везде одинаково. И еще. В отладочной функции замени активацию чит-режима на @Password( "www.dtf.ru" ), если карта для ГЗМ.
Учту, щас попробую.
Да, а что это за ЛС, куда скинута карта?
ЛС-личные сообщения(вверху есть пункт "Сообщения")
Напиши, если игра заведется.
Скрипт заработал, спасибо вам большое!
Вопрос для мастеров скрипта - как сделать зоны (участки карты) постоянно просматриваемые противником, даже при его отсутствии в данной зоне (не везде приемлимы снайперы в засаде).
Отредактировано alex (2011-06-30 00:17:01)
(GetNUnitsInArea(0, "xxx") > 0)
скрипт учитывает каждого пехотинца (не сквад) отдельно
как сделать зоны (участки карты) постоянно просматриваемые противником, даже при его отсутствии в данной зоне (не везде приемлимы снайперы в засаде).
Можно использовать функцию ViewZone (“Name”, iParam)
(при iParam = 1 открывает туман в области круглой сценарной зоны "Name"; при iParam = 0 закрывает туман)
Зона открывается и для той и для другой стороны. Однако, для того чтобы ИИ(противник) не просто наблюдал юнитов игрока в освещенной зоне, а еще и предпринимал какие-то действия, например вел артобстрел по юнитам игрока при входе их в эту зону, можно создать "поверх" этой зоны оборонительную зону для ИИ(в тулзе AISetting) и дать его юнитам соответствующие команды, например стартовые в редакторе. Тогда при входе юнитов игрока в эту зону пушки ИИ будут открывать по ним огонь, а иначе просто молча будут наблюдать. Вобщем могут быть разные варианты.
Можно использовать функцию ViewZone
Спасибо Ilyaka за пример! Щас буду пробовать варианты.
Мне вот для какой ситуации нужен этот скрипт. На скриншоте - пересохшее русло реки должны пересечь войска игрока, русло на месте перехода заминированно. И вот по идее под огнем противника (2 миномета 80мм) саперы должны разминировать участок, а потом его должна проскочить техника - место переправы должно быть видно компу. Я уже ввел новых юнитов - наблюдателей (они гражданские по виду, но с параметрами снайперов, безоружны и игрок замечает их только когда на них буквально наступит (если они в засаде)), но даже эти наблюдатели не помогают, ведь то место, с которого они ведут наблюдение перекрывается частично растительностью (размещать ближе к переправе не получится, накроет своим же огнем) - выход один сделать зону постоянно доступную для просмотра компу, если даже в ней нет его юнитов.
Отредактировано alex (2011-06-30 16:47:00)
Ну в принципе для данной ситуации, то что я описал вполне может подойти. Можно прописать чтобы зона открывалась только когда туда войдут саперы и закрывалась когда их там не будет. Или можно обойтись и без открытия этой зоны, да и без наблюдателей тоже, можно просто прописать условие когда при проникновении в обозначенную зону саперов, минометы будут вести обстрел по этой зоне, и прекращать когда там никого не будет. Или совместить. И т.п. Вобщем тут варианты могут быть разные, это уже на твое усмотрение.
Может кто то в курсе, каким образом записывать и считывать информацию из файлов в нашем lua
Топчусь где то около, но понять не могу.
Вот ссылки кому интересно, на справочники по операторам lua
Поправьте меня если я неправ.
Если мы берем функцию GetNUnitsInArea() то каждый солдат в кваде, это отдельная единица, а когда берем функцию GetNUnitsInScriptGroup(), то отдельной единицей будет являтся сам квад целиком, без учета кол-ва бойцов в нем, ведь так?
Вопрос для меня стал актуален, потому что мне необходимо проконтролировать пооголовье пехоты не по взводам а именно в целом, по общему количеству пехотинцев.
Кто может конкретно объяснить плюсы организации патруля вот таким способом:
function EINSDT135()
local ScriptAreas = {};
ScriptAreas[135] = "MZENSK_2";
local coeffs = {};
coeffs[135] = 100000;
local delays = {};
delays[135] = 7000;
local ACTION_SWARM = 3;
local PatrolID = 135;
local vector = {x = 0, y = 0};
local center = {x = 0, y = 0};
if ( GetNUnitsInScriptGroup(PatrolID) <= 0) then Suicide(); end;
center.x, center.y = GetScriptAreaParams( ScriptAreas[PatrolID] ); -- center of patrol area
if ( GetNUnitsInScriptGroup(PatrolID) >= 1) then
vector.x, vector.y = GetObjCoord(PatrolID); -- starting coordinates
vector.x = vector.x - center.x; -- relative vector
vector.y = vector.y - center.y;
vector = norm( vector );
vector.x = vector.x * coeffs[PatrolID];
vector.y = vector.y * coeffs[PatrolID];
SetIGlobalVar( "temp.got.coords" .. PatrolID, 1);
SetIGlobalVar( "temp.ccw" .. PatrolID, RandomInt(2));
else
vector.x = GetFGlobalVar( "temp.vector" .. PatrolID .. ".x", 0);
vector.y = GetFGlobalVar( "temp.vector" .. PatrolID .. ".y", 0);
end;
local ccw = GetIGlobalVar( "temp.ccw" .. PatrolID, 0);
vector = rot45( vector, ccw );
if (CheckMapBounds( vector, center ) == 1) then -- if coord is out of map bounds
ccw = 1 - ccw;
SetIGlobalVar( "temp.ccw" .. PatrolID, ccw );
vector = rot90( vector, ccw ); -- then rotate vector back
end;
Cmd (ACTION_SWARM, PatrolID, vector.x + center.x, vector.y + center.y);
SetFGlobalVar( "temp.vector" .. PatrolID .. ".x", vector.x);
SetFGlobalVar( "temp.vector" .. PatrolID .. ".y", vector.y);
RunScript( "EINSDT135", delays[PatrolID] + RandomInt(4000));
Suicide();
end;
function CheckMapBounds( ...)
local vec = arg[1];
local center = arg[2];
local xmax, ymax = GetMapSize(); -- get map bounds
if ( ((vec.x + center.x) <= 0) or ((vec.y + center.y) <= 0) or ((vec.x + center.x) >= xmax) or ((vec.y + center.y) >= ymax)) then
return 1;
end;
return 0;
end;
function rot90( ... )
local vec = arg[1];
local ccw = arg[2];
if ( ccw == 0) then
ccw = -1;
else
ccw = 1;
end;
local x1 = vec.y * ccw;
local y1 = vec.x * ( -ccw);
return {x = x1, y = y1};
end;
function rot45( ... )
local sqrt2div2 = 0.7071;
local vec = arg[1];
local ccw = arg[2];
if ( ccw == 0) then
ccw = -1;
else
ccw = 1;
end;
local x1 = vec.x * sqrt2div2 + vec.y * ccw * sqrt2div2;
local y1 = vec.x * (- ccw * sqrt2div2) + vec.y * sqrt2div2;
return {x = x1, y = y1};
end;
function norm( ... )
local vec = arg[1];
local len1 = len (vec);
local x1 = vec.x / len1;
local y1 = vec.y / len1;
return {x = x1, y = y1};
end;
function len( ... )
local vec = arg[1];
return sqrt( vec.x * vec.x + vec.y * vec.y );
end;
function sqrt( x)
local ITNUM = 4;
local sp = 0
local i = ITNUM;
local inv = 0;
local a, b;
if ( x <= 0) then return 0; end;
if ( x < 1) then
x = 1 / x;
inv = 1;
end;
while ( x > 5) do
sp = sp + 1;
x = x / 5;
end;
a = 2;
-- Newtonian algorithm
while (i > 0) do
b = x / a;
a = a + b;
a = a * 0.5;
i = i - 1;
end;
--
while ( sp > 0) do
sp = sp - 1;
a = a * 4;
end;
if ( inv == 1) then
a = 1 / a;
end;
return a;
end;
Вот как пример использования этих команд:
function Kontra19()
local A_Swarm = 3;
local A_Enter = 6;
local A_Leave = 7;
local a = GetNUnitsInScriptGroup(691)+GetNUnitsInScriptGroup(692)+GetNUnitsInScriptGroup(693)+GetNUnitsInScriptGroup(694)+GetNUnitsInScriptGroup(695)+GetNUnitsInScriptGroup(696);
if (a <= 3) then
Cmd(7,742,10283,9825);
QCmd(3,742,11215,8650);
QCmd(6,742,1159);
Cmd(7,743,10395,9820);
QCmd(3,743,11365,8685);
QCmd(6,743,1160);
Cmd(7,744,10480,9825);
- и далее "пачки" команд по аналогии вышецитированным.
Относительно вашего поста № 218 (10-месячной давности, прочитал только сегодня). Имеет ли смысл устанавливать локальные переменные (кроме "local a" в приведенном примере), если в функции, где они объявлены, не используются? (лишняя нагрузка на систему и т.п.).
Но главное, почему я обратился к старому сообщению. Интереснейшая фишка: если пехота сидит в окопе или здании, а ей нужно, в какой-то момент игры, пойти атаковать противника, то можно не давать команду № 7 ("покинуть задние или окоп"). Задав пехоте первую команду № 3 ("следовать в боевой готовности") пехота без команды № 7 сама выходит из здания или окопа и идет с атакой в заданную точку (но не ссаживается с танка!). Проверено несколько раз на пробных картах.
Объясните пожалуйста, какие x,y надо подставлять в AskClient (“SetCamera(x, y)”) пробовал и скриптовые ,и VIS координаты, результат не тот.
Отредактировано ИС 3 (2012-02-18 20:11:04)
ИС 3
Это вообще криво работает и желательно не использовать
Нужно ставить скриптовые координаты
Вы здесь » Союз | Union » Картостроение и скриптовка » Скрипты