Союз | Union

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Союз | Union » Картостроение и скриптовка » Скрипты


Скрипты

Сообщений 151 страница 180 из 345

151

moskvich написал(а):

Да, ты оказался прав. Прошу меня извинить за ложную тревогу. Действительно один американец-засранец улегся во дворе м/д кустами. Прочесал все и не нашел его. Да и расположился он на приличном расстоянии от отмеченной зоны в городе.

Чтобы избежать подобных недоразумений пользуйся Password("Panzerklein"); ChangeWarFog(1);

+1

152

Jukov написал(а):

Чтобы избежать подобных недоразумений пользуйся Password("Panzerklein"); ChangeWarFog(1);

Спасибо.
Теперь другая забота. После третьего задания миссия завершилась, а четвертое задание так и не открылось, и не было запланированных контратак союзников с фланга, что очень обидно.

Отредактировано moskvich (2010-01-28 23:27:00)

0

153

Есть такая проблема: по условиям миссии Виттманн должен выжить. Однако, все мои юниты (игра за немцев) появляются на карте в качестве подкреплений и получается таким образом, что какое-то непродолжительное время (1 может быть 2 секунды) в начале миссии на карте Виттманна нет, скрипт (нижеприведенный) срабатывает и миссия проиграна. Парни, подскажите пожалуйста, может быть здесь есть какое-то решение, чтобы условие выживания Виттманна сохранить?

function Wittman()
if GetNUnitsInScriptGroup(1) < 1 then
DisplayTrace("Wittmann must survive");
Loose();
end;
end;

0

154

moskvich написал(а):

function Wittman()
if GetNUnitsInScriptGroup(1) < 1 then
DisplayTrace("Wittmann must survive");
Loose();
end;
end;

Как вариант запустить этот скрипт одновременно с приходом подкрепления, где он(Витман) есть, либо при запуске скрипта в Function init при запуске  RunScript("Wittman") поставь задержку побольше. скажем RunScript("Wittman", 50000), это самое простое решение без изысканий.

+1

155

scorpion_ss_ написал(а):

Как вариант запустить этот скрипт одновременно с приходом подкрепления, где он(Витман) есть, либо при запуске скрипта в Function init при запуске  RunScript("Wittman") поставь задержку побольше. скажем RunScript("Wittman", 50000), это самое простое решение без изысканий.

Спасибо, действительно все гениальное просто. Буду пробовать.

0

156

Увы, всетаки миссия проиграна, если увеличить время, а Виттманн жив. (скрин1)
Если запустить скрипт вместе с подкреплением. то карта практически пуста.(скрин2)
Прямо беда.

0

157

Попробуй в условии прописать ==0  вместо <1
и сделай задержку в 10000 или 15000 после прихода подкрепа
Подкреп обычно появляется в течении 1-5 секунд в зависимости от величины, а за оставшиеся 10-15сек, я думаю, его не убьют.

Не понял первый скрин. Если Виттман жив, то как тогда сработал скрипт поражения?

0

158

moskvich написал(а):

Увы, всетаки миссия проиграна, если увеличить время, а Виттманн жив. (скрин1)
Если запустить скрипт вместе с подкреплением. то карта практически пуста.(скрин2)
Прямо беда.

Москвич, давай сделаем проще выкладвай скрипт :flag:

0

159

simeo написал(а):

и сделай задержку в 10000 или 15000 после прихода подкрепа
Подкреп обычно появляется в течении 1-5 секунд в зависимости от величины, а за оставшиеся 10-15сек, я думаю, его не убьют.
Не понял первый скрин. Если Виттман жив, то как тогда сработал скрипт поражения?

В том-то и дело, что Виттманн живой, а поражение выдано. Пробовал его даже откатить назад, чтобы не подорвался на мине, та же байда.
Время тоже увеличивал, поражение выдается как раз через промежуток времени задержки.
Вот собственно сам фай Lua (Виттманна убрал), может быть ставлю задачу в неподобающем месте?

function Beginnend1()

LandReinforcement(101);
LandReinforcement(102);
         EnableAviation(0,4);
         EnableAviation(0,3);
         EnableAviation(0,2);
         EnableAviation(0,1);
       
----------------------------------------------------------

function Objective0()
if (  GetNUnitsInArea(1, "fangxian1") == 0) or(  GetNUnitsInArea(1, "fangxian2") == 0)or(  GetNUnitsInArea(1, "fangxian3") == 0) or(  GetNUnitsInArea(1, "fangxian4") == 0) or(  GetNUnitsInArea(1, "fangxian5") == 0)then
    SetIGlobalVar("temp.template00.objective.0", 1);
    ObjectiveChanged(0, 1);
   
                RunScript("Reinf201", 6000);
        RunScript( "RevealObjective1", 15000);
    Suicide();
        end;
end;

-------------------------------------------------------

function Objective1()
if ( GetNUnitsInArea(1, "fangxian11") == 0) or(  GetNUnitsInArea(1, "fangxian12") == 0)or(  GetNUnitsInArea(1, "fangxian10") == 0) then
    SetIGlobalVar("temp.template00.objective.1", 1);
    ObjectiveChanged(1, 1);
           
            RunScript("Reinf202", 6000);
            RunScript( "RevealObjective2", 60000);
    RunScript( "RevealObjective3", 120000);
    RunScript( "RevealObjective4", 180000);
         EnableAviation(1,4);
         
         EnableAviation(1,2);
         EnableAviation(1,1);
     Cmd(36,2002,1,GetScriptAreaParams("fangxian10"));
        
    Suicide();
end;
end;

function Objective2()
if (  GetNUnitsInArea(1, "bujizhan") == 0) then
    SetIGlobalVar("temp.template00.objective.2", 1);
    ObjectiveChanged(2, 1);
     EnableAviation(1,1);
    Suicide();
end;
end;

function Objective3()
if (GetNUnitsInArea(1, "hill540") == 0) then
    SetIGlobalVar("temp.template00.objective.3", 1);
    ObjectiveChanged(3, 1);
              RunScript("jieshu", 6000);
    Suicide();
end;
end;

function Objective4()
if ( GetNUnitsInArea(0, "shizilukou") >= 10) then
    SetIGlobalVar("temp.template00.objective.4", 1);
    ObjectiveChanged(4, 1);
    LandReinforcement(103)

                RunScript( "Reinf220",1000);
   
    RunScript( "Reinf221",300000);
   
    RunScript( "Reinf222",600000);
   
    RunScript( "Reinf223",1200000);
   
    RunScript( "Reinf224",1800000);
   
    RunScript( "Reinf225",2400000);
   
        Suicide();
                end;
end;

---------------------------------------   

function jieshu()

KillScript ("Reinf303");
KillScript ("Reinf304");
KillScript ("Reinf305");
KillScript ("Reinf306");
KillScript ("Reinf307");

 
end;

--------------------------------
function ToLoose()
if ( GetNUnitsInArea(1, "shibu") >= 1) then 
    Loose();
    Suicide();
end;
end;

-----------------------

function ToWin()
if ( GetNUnitsInArea(1, "bujizhan") == 0) then
    Win(0);
    Suicide();
end;
end;

---------------------------

function RevealObjective0()
if ( GetIGlobalVar("temp.template00.objective.0", 0) == 0) then
    ObjectiveChanged(0, 0);
    Suicide();
else Suicide(); end;
end;

function RevealObjective1()
if ( GetIGlobalVar("temp.template00.objective.1", 0) == 0) then
    ObjectiveChanged(1, 0);
    Suicide();
else Suicide(); end;
end;

function RevealObjective2()
if ( GetIGlobalVar("temp.template00.objective.2", 0) == 0) then
    ObjectiveChanged(2, 0);
    Suicide();
else Suicide(); end;
end;

function RevealObjective3()
if ( GetIGlobalVar("temp.template00.objective.3", 0) == 0) then
    ObjectiveChanged(3, 0);
    LandReinforcement(1);
    Suicide();
else Suicide(); end;
end;

function RevealObjective4()
if ( GetIGlobalVar("temp.template00.objective.4", 0) == 0) then
    ObjectiveChanged(4, 0);
    Suicide();
else Suicide(); end;
end;

---------------------------

function Reinf201()

    LandReinforcement(201);
                Suicide();
end;

function Reinf202()
    LandReinforcement(202);
               
                Suicide();
end;

function Reinf220()
    LandReinforcement(222);
                LandReinforcement(226);
                Suicide();
end;

function Reinf221()
    LandReinforcement(221);
    LandReinforcement(222);     
                Suicide();
end;

function Reinf222()
    LandReinforcement(222);
    LandReinforcement(220);
    LandReinforcement(225);
             Suicide();
end;

function Reinf223()
    LandReinforcement(222);
    LandReinforcement(224);
    LandReinforcement(226);
             Suicide();
end;

function Reinf224()
    LandReinforcement(221);
    LandReinforcement(224);
    LandReinforcement(225);
             Suicide();
end;

function Reinf225()
    LandReinforcement(222);
    LandReinforcement(226);
    LandReinforcement(220);
   
             Suicide();
end;

----------------------------
function Reinf303()
    LandReinforcement(303);
             Suicide();
end;

function Reinf304()
    LandReinforcement(304);
             Suicide();
end;
function Reinf305()
    LandReinforcement(304);
    LandReinforcement(303);
             Suicide();
end;

function Reinf306()
                LandReinforcement(304);
    LandReinforcement(305);
             Suicide();
end;

function Reinf307()
                LandReinforcement(303);
                LandReinforcement(304);
    LandReinforcement(305);
             Suicide();
end;
-----------------------------------

function Init()
    SwitchWeatherAutomatic (3);
       
        RunScript("Beginnend1",1000);
       
        RunScript( "Objective0", 2000);
        RunScript( "Objective1", 2000);
RunScript( "Objective2", 2000);
RunScript( "Objective3", 2000);
RunScript( "Objective4", 2000);
RunScript( "Reinf304", 1200000);
RunScript( "Reinf305", 2400000);
        RunScript( "Reinf306", 3000000);
RunScript( "Reinf307", 3600000);
RunScript( "RevealObjective0", 2000);
        RunScript( "ToWin", 4000);
RunScript( "ToLoose", 4000);
end;

______________________________________________________________________________________________________________________

В других миссиях скрипт Виттманна срабатывает идеально. Проверено неоднократно.

0

160

moskvich

function ToLoose()
if ( GetNUnitsInArea(1, "shibu") >= 1) then 
    Loose();
    Suicide();
end;
end;

Обратил внимание - поражение засчитывается не из-за гибели Витмана(юнита) а от наличия в определённой зоне вражеских юнитов.
Если игра за немцев, то нахождение в этой зоне двух красноармейцев автоматически ведёт к проигрышу

Для того, чтобы выигрыш или проигрыш миссии зависел от жизни/смерти Витманна, нужно переписывать скрипт/ добавлять ещё одну функцию поражения, где прописать условия его гибели.

Это то что видно глубоко неисследуя скрипт

0

161

simeo написал(а):

Обратил внимание - поражение засчитывается не из-за гибели Витмана(юнита) а от наличия в определённой зоне вражеских юнитов.
Если игра за немцев, то нахождение в этой зоне двух красноармейцев автоматически ведёт к проигрышу

Да, игра за немцев и ты правильно заметил, что при условии нахождения бойцов РККА в зоне "shibu" (область вокруг церкви на карте) миссия будет провалена. Но проблема в том, что:
- этих бойцов там нет (это по крайней мере видно на миникарте)
- без внесения в скрипт задач по Виттманну (то, что он должен выжить) сообщение о поражении не выдается и миссия проходима до победы. Проблемы возникают только при добавлении в скрипт задачи по Виттманну.

simeo написал(а):

Для того, чтобы выигрыш или проигрыш миссии зависел от жизни/смерти Витманна, нужно переписывать скрипт/ добавлять ещё одну функцию поражения, где прописать условия его гибели.

Вот такое добавление может служить условием проигрыша мисии в случае гибели Виттманна?

function Wittman()
if GetNUnitsInScriptGroup(1) < 1 then
DisplayTrace("Wittmann must survive");
Loose();
end;
end;

По крайней мере в 2-х других миссиях это работает безупречно. Время задержки увеличивал до 10 секунд.

0

162

moskvich

Может, если все группы и скриптовые номера правильно прописаны в редакторе, а также в скрипте в Init или в теле другой функции
Правда, я бы исправил на ==0 и задержка должна быть не менее 10 сек

Или как вариант дополнить эти две функции поражения убивающей функцией (на всякий случай)
ну примерно так

function Init()
    SwitchWeatherAutomatic (3);
       
        RunScript("Beginnend1",1000);
       
        RunScript( "Objective0", 2000);
        RunScript( "Objective1", 2000);
RunScript( "Objective2", 2000);
RunScript( "Objective3", 2000);
RunScript( "Objective4", 2000);
RunScript( "Reinf304", 1200000);
RunScript( "Reinf305", 2400000);
RunScript( "Reinf306", 3000000);
RunScript( "Reinf307", 3600000);
RunScript( "RevealObjective0", 2000);
RunScript( "ToWin", 4000);
RunScript( "ToLoose", 4000);
RunScript( "Reinf1", 4000);
end;

function Reinf1()
LandReinforcement(1);
RunScript("Wittman",10000);
end;

function Wittman()
if GetNUnitsInScriptGroup(1) == 0 then
DisplayTrace("Wittmann must survive");
KillScript("ToLoose");
Loose();
end;
end;

function ToLoose()
if ( GetNUnitsInArea(1, "shibu") >= 1) then
KillScript("Wittman");
Loose();
Suicide();
end;
end;

Ну примерно так, на мой дилетантский  взгляд
Вроде должно работать, а так просто надо проверять

+1

163

simeo
Спасибо за консультацию, буду пробовать.

0

164

Чтобы не городить огород, я обычно объединяю функции победы и поражения в одну:

function TobeDefeatedWin()
if GetNUnitsInArea(1,"shibu")>0 then Loose(); Suicide(); end;
if GetNUnitsInArea(1,"bujizhan")==0 then Win(0); Suicide(); end;
end;

+1

165

Jukov написал(а):

Чтобы не городить огород, я обычно объединяю функции победы и поражения в одну:
function TobeDefeatedWin()
if GetNUnitsInArea(1,"shibu")>0 then Loose(); Suicide(); end;
if GetNUnitsInArea(1,"bujizhan")==0 then Win(0); Suicide(); end;
end;

Cпасибо, надо попробовать и такой вариант.

0

166

Возникла мысль реализовать покидание экипажем подбитой машины. Но из-за малого опыта в скриптовке хочу посоветоваться с опытными людьми возможно ли это реализовать средствами блицкриговского Луа. Алгоритм скрипта такой:

1) функция бесконечно проверяет все юниты на количество очков ХП;
2) как только ХП какого-либо юнита стает равным 0 (то есть он погиб), функция проверяет его принадлежность к классу (танк, грузовик и т.д.) и задает значение переменной, по которой будет определяться количество людей в экипаже (если это пехотинец, то 0);
3) функция определяет координаты юнита, и выбрасывает в непосредственной близости и случайном направлении "экипаж", то есть несколько танкистов (в зависимости от класса юнита) и случайным образом назначает им количество ХП (имитация ранений)

0

167

alfahamsin
Очень сложно и нереализуемо
Реально несколько другое:
1. проверка существует ли юнит или нет
2. Если нет, тогда подкреп в ПРЕДПОЛАГАЕМУЮ зону - экипаж танкистов

Но размер скрипта возврастёт в разы, нужно скриптовый номер присваивать всем танкам и ИГРА не может определять координаты объекта

Т.о. применение такой функции возможно, когда точно известно место боестолкновения.

0

168

russkit написал(а):

Хочу переделать собственно уже готовую карту, добавить в неё что бы противник в определенную точку и через определенное время бесконечно выбрасывал воздушный десант.

Непроверял, но попробуй добавить в скрипт вот это:

function Desant()
Cmd (22,10000, 1, x, y ); -- где x,y - координаты места высадки
end;

function Init() -- следующие строки необходио добавить в старую функцию Init
RunScript("Desant",время в милисекундах);
end;

0

169

simeo написал(а):

ИГРА не может определять координаты объекта

Игра не может определять координаты подбитого юнита. Но мы можем хранить где-нибудь в массиве координаты юнита и постоянно их обновлять, пока он живой. Тем самым будем примерно знать где он сдох.

0

170

вот нашёл и решил добавить в коллекцию скриптов
Скрипт из Курска
Пример атаки двумя танками с танковым десантом и ссаживания десанта на виду игрока:
Два танка с номерами 400 и 401 и танковым десантом 410 и 411 атакуют зону "х"

function AttacK12()                                                                             
Cmd(3,400, GetScriptAreaParams("x"));                               
Cmd(3,401, GetScriptAreaParams("x"));
SetIGlobalVar( "AttacK12", 1);
RunScript("Deb1",5000);
RunScript("Deb2",5000);                             
end;

function Deb1()
local x,y = GetObjCoord(400);
if (GetNUnitsInCircle(1,x,y,1200) > 0) then
Cmd(5,400,x,y); QCmd(3,400, GetScriptAreaParams("x"))
RunScript( "charge410", 3000);
Suicide();
end;
end;

1200 радиус зоны, соответствует примерно 20 тайлам в редакторе, т.е находится на границе зоны прямой видимости игрока
Не знаю, величина эта постоянная или зависит от размера карты, это легко проверить в редакторе, по VIS координатам

function charge410()
if (GetIGlobalVar( "AttacK12", 0) == 0) then
Cmd(3,410,GetScriptAreaParams("x"));
Suicide();
else
Cmd(3,410,GetScriptAreaParams("y"));
Suicide();
end;
end;

function Deb2()
local x,y = GetObjCoord(401);
if (GetNUnitsInCircle(1,x,y,1200) > 0) then
Cmd(5,401,x,y); QCmd(3,401, GetScriptAreaParams("x"))
RunScript( "charge411", 3000);
Suicide();
end;
end;

function charge411()
if (GetIGlobalVar( "AttacK12", 0) == 0) then
Cmd(3,411,GetScriptAreaParams("x"));
Suicide();
else
Cmd(3,411,GetScriptAreaParams("y"));
Suicide();
end;
end;

в этом скрипте условие, если войска неприятеля существует, то AI атакует пехотой, если нет, то пехота отступает в зону "у"

0

171

--Cmd(CALL_BOMBERS, Aviation_iScriptID, iParty, x, y)

Вот не могу никак найти инфу. Где брать мне Aviation_iScriptID для новой карты  :question:

0

172

vlad_82 написал(а):

--Cmd(CALL_BOMBERS, Aviation_iScriptID, iParty, x, y)

Вот не могу никак найти инфу. Где брать мне Aviation_iScriptID для новой карты  :question:

Если не ошибаюсь, то скриптовый номер авиации всегда равен 10000.

0

173

в некоторых скриптах встречал 9999, тоже работает, я пробовал

0

174

Скрипт топливной заправки

Предупреждения:
Скрипт получается очень большой и есть необходимость давать скриптовый номер каждой подвижной единице, будь то танк или грузовик
Кроме того, нужно помнить, что если в пылу битвы у вас встанут танки, то это может вызвать раздражение у игрока, т.е. пользоваться им нужно разумно

Необходимо содать ещё одну игровую сторону, 2, т.е игроков будет три
0 - игрок, 1 - комп, 2 - юниты имеющие сторону игрока, но не подчиняющиеся ему, 3- нейтральные юниты

заправляется юнит 1010 бензовозом 505, время можно варьировать

function a0()        остановка юнита 1010,  у которого кончилось топливо
ChangePlayer (1010, 2);
Suicide();
end;

function a1()       бензовоз 505 игрок подводит как можно ближе к юниту 1010, бензовоз меняет сторону
local x,y = GetObjCoord(505);
if (GetNUnitsInCircle(2,x,y,300) > 0) then
ChangePlayer (505, 2);
RunScript("FullFuel1010",5000);
RunScript("a2",10000);
Suicide();
end;
end;

function a2()         
ChangePlayer (505, 0);
RunScript("a1",15000);
Suicide();
end;

function FullFuel1010()
local x,y = GetObjCoord(1010);
if (GetNUnitsInCircle(2,x,y,400) > 0)then
ChangePlayer (1010, 0);
DisplayTrace("Машина заправлена");
Suicide();
end;
end;

+5

175

simeo написал(а):

Скрипт топливной заправки

Вот это да! simeo Я просто поражен :cool:
Таким образом, можно сделать так что все юниты,
периодически, будут требовать топливозаправщик?
Потрясающе!

0

176

Magister Militum

Тут трудность в том, что в Блице невозможно заложить пробег юнита, а только время. Т.е если он после заправки стоял, то недоумение вызовет, если у него снова кончится топливо. Поэтому этот скрипт годится для использования не для каждой миссии, а специально заточенных под топливо и поэтому редких.
Это только от маппера будет зависит. В принципе скрипт совсем не сложный и нагрузки большой не вызывает, в миссии Суомуссалми у меня штук 30 юнитов без топлива остаются.

Есть ещё одна тонкость - если два юнита останутся без топлива достаточно близко, то они самозаправятся :-)
Поэтому расстояние между юнитами делать как можно ближе
if (GetNUnitsInCircle(2,x,y,300) > 0) then   например 150 или 100, то ту одна тонкость ещё - из-за рельефа иногда невозможно достаточно близко подвести бензовоз к юниту.

Но гарантировано срабатывает в 95% :-)

0

177

simeo написал(а):

. Т.е если он после заправки стоял, то недоумение вызовет, если у него снова кончится топливо.

Понятно, все равно великолепно.
Актуально применять для карт где бронетанковые подразделения действуют наступательно.
Сразу игроку будет понятно, что "топливо - это кровь войны" :D

0

178

simeo написал(а):

Тут трудность в том, что в Блице невозможно заложить пробег юнита, а только время.

А если задать кроме параметра времени, скажем некоторую скриптовую область (просто узкий прямоугольник от края карты до края), по достижении которой будет выдано сообщение :"Топливо боевой единицы на нуле". А через некоторое время (уже не продолжительное) или при достижении следующей скриптовой области включится предложенный тобою скрипт. При таком варианте имхо можно учесть (в известном смысле, не абсолютно конечно) и время и расстояния.
Игрока вероятно не должно смущать, что скажем танк стоящий неподвижно, через некоторое время остался без горючего, поскольку в боевых условиях двигатель все равно работает (необходим маневр). За исключением быть может нахождения в ремонте, тылу или засаде. Так что наличие "топлива" в игре вполне оправдано.

0

179

moskvich

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

0

180

Тогда надо учитывать еще рельеф местности,который изобилует разными преградами,в момент объезда которых,танк может встать и подставить борт вшивой пушчонке.А еще он иногда пятится не так ,как хотелось бы.Плюс в некоторых миссиях огромное количество БТ-все время убивать на заправку?А еще и не во всех есть основные склады-ручная заправка обеспечена...Это конечно интересная "фишка"-но пока для нее очень много минусов.

0


Вы здесь » Союз | Union » Картостроение и скриптовка » Скрипты