#pun-title h1 span {display: none;}

Союз | Union

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

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


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


Как перестать бояться и начать скриптить

Сообщений 31 страница 38 из 38

31

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

Собственно, сам скрипт:

function Tarara_amtrac_reinf_0()
LandReinforcement(2010);
RunScript("Tarara_amtrac_attack_0",3000);
Suicide();
end;

function Tarara_amtrac_attack_0()
Cmd(3,2010,GetScriptAreaParams("beach_defence_1"));
Cmd(3,2012,GetScriptAreaParams("beach_defence_1"));
Cmd(3,2011,GetScriptAreaParams("2011a"));
RunScript("Tarara_amtrac_disembark_2010",2000);
RunScript("Tarara_amtrac_disembark_2012",2000);
RunScript("Tarara_amtank_to_position_0",1000);
Cmd(3,2013,GetScriptAreaParams("beach_defence_0"));
Cmd(3,2015,GetScriptAreaParams("beach_defence_0"));
Cmd(3,2014,GetScriptAreaParams("2014a"));
RunScript("Tarara_amtrac_disembark_2013",2000);
RunScript("Tarara_amtrac_disembark_2015",2000);
RunScript("Tarara_amtank_to_position_1",1000);
Suicide();
end;

function Tarara_amtrac_disembark_2010()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2010
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2010",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2010()
local a;
a = 2010
Cmd(3,a,GetScriptAreaParams("beach_defence_1"));
Cmd(3,a*10,GetScriptAreaParams("beach_defence_1"));
RunScript("Tarara_amtrac_to_position_2010",1000);
Suicide();
end;

function Tarara_amtrac_to_position_2010()
if GetNUnitsInArea(0,"beach_defence_1")==0 then
Cmd(3,2010,GetScriptAreaParams("2010"));
QCmd(50,2010);
Cmd(3,20100,GetScriptAreaParams("2010"));
QCmd(50,20100);
end;
end;

function Tarara_amtrac_disembark_2012()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2012
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2012",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2012()
local a;
a = 2012
Cmd(3,a,GetScriptAreaParams("beach_defence_1"));
Cmd(3,a*10,GetScriptAreaParams("beach_defence_1"));
RunScript("Tarara_amtrac_to_position_2012",1000);
Suicide();
end;

function Tarara_amtrac_to_position_2012()
if GetNUnitsInArea(0,"beach_defence_1")==0 then
Cmd(3,2012,GetScriptAreaParams("2012"));
QCmd(50,2012);
Cmd(3,20120,GetScriptAreaParams("2012"));
QCmd(50,20120);
end;
end;

function Tarara_amtank_to_position_0()
if GetNUnitsInArea(0,"beach_defence_1")==0 then
Cmd(3,2011,GetScriptAreaParams("2011"));
QCmd(50,2011);
Suicide();
end;
end;

function Tarara_amtrac_disembark_2013()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2013
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2013",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2013()
Cmd(3,2013,GetScriptAreaParams("beach_defence_0"));
Cmd(3,20130,GetScriptAreaParams("beach_defence_0"));
RunScript("Tarara_amtrac_to_position_2013",1000);
end;

function Tarara_amtrac_to_position_2013()
if GetNUnitsInArea(0,"beach_defence_0")==0 then
Cmd(3,2013,GetScriptAreaParams("2013"));
QCmd(50,2013);
Cmd(3,20130,GetScriptAreaParams("2013"));
QCmd(50,20130);
end;
end;

function Tarara_amtrac_disembark_2015()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2015
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2015",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2015()
Cmd(3,2015,GetScriptAreaParams("beach_defence_0"));
Cmd(3,20150,GetScriptAreaParams("beach_defence_0"));
RunScript("Tarara_amtrac_to_position_2015",1000);
Suicide();
end;

function Tarara_amtrac_to_position_2015()
if GetNUnitsInArea(0,"beach_defence_0")==0 then
Cmd(3,2015,GetScriptAreaParams("2015"));
QCmd(50,2015);
Cmd(3,20150,GetScriptAreaParams("2015"));
QCmd(50,20150);
end;
end;

function Tarara_amtank_to_position_1()
if GetNUnitsInArea(0,"beach_defence_0")==0 then
Cmd(3,2014,GetScriptAreaParams("2014"));
QCmd(50,2014);
Suicide();
end;
end;

function Tarara_amtrac_reinf_1()
LandReinforcement(2016);
RunScript("Tarara_amtrac_attack_1",3000);
Suicide();
end;

function Tarara_amtrac_attack_1()
Cmd(3,2016,GetScriptAreaParams("beach_defence_2"));
Cmd(3,2018,GetScriptAreaParams("beach_defence_2"));
Cmd(3,2017,GetScriptAreaParams("2017a"));
RunScript("Tarara_amtrac_disembark_2016",2000);
RunScript("Tarara_amtrac_disembark_2018",2000);
RunScript("Tarara_amtank_to_position_3",1000);
Cmd(3,2019,GetScriptAreaParams("beach_defence_1"));
Cmd(3,2021,GetScriptAreaParams("beach_defence_1"));
Cmd(3,2020,GetScriptAreaParams("2020a"));
RunScript("Tarara_amtrac_disembark_2019",2000);
RunScript("Tarara_amtrac_disembark_2021",2000);
RunScript("Tarara_amtank_to_position_4",1000);
Suicide();
end;

function Tarara_amtrac_disembark_2016()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2016
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2016",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2016()
Cmd(3,2016,GetScriptAreaParams("beach_defence_2"));
Cmd(3,20160,GetScriptAreaParams("beach_defence_2"));
RunScript("Tarara_amtrac_to_position_2016",1000);
end;

function Tarara_amtrac_to_position_2016()
if GetNUnitsInArea(0,"beach_defence_2")==0 then
Cmd(3,2016,GetScriptAreaParams("2016"));
QCmd(50,2016);
Cmd(3,20160,GetScriptAreaParams("2016"));
QCmd(50,20160);
end;
end;

function Tarara_amtrac_disembark_2018()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2018
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2018",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2018()
Cmd(3,2018,GetScriptAreaParams("beach_defence_2"));
Cmd(3,20180,GetScriptAreaParams("beach_defence_2"));
RunScript("Tarara_amtrac_to_position_2018",1000);
end;

function Tarara_amtrac_to_position_2018()
if GetNUnitsInArea(0,"beach_defence_2")==0 then
Cmd(3,2018,GetScriptAreaParams("2018"));
QCmd(50,2018);
Cmd(3,20180,GetScriptAreaParams("2018"));
QCmd(50,20180);
end;
end;

function Tarara_amtank_to_position_2()
if GetNUnitsInArea(0,"beach_defence_2")==0 then
Cmd(3,2017,GetScriptAreaParams("2017"));
QCmd(50,2017);
Suicide();
end;
end;

function Tarara_amtrac_disembark_2019()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2019
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2019",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2019()
Cmd(3,2019,GetScriptAreaParams("beach_defence_2"));
Cmd(3,20190,GetScriptAreaParams("beach_defence_2"));
RunScript("Tarara_amtrac_to_position_2019",1000);
end;

function Tarara_amtrac_to_position_2019()
if GetNUnitsInArea(0,"beach_defence_2")==0 then
Cmd(3,2019,GetScriptAreaParams("2019"));
QCmd(50,2019);
Cmd(3,20190,GetScriptAreaParams("2019"));
QCmd(50,20190);
end;
end;

function Tarara_amtrac_disembark_2021()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2021
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2021",2000);
end;
if k<0 then
Suicide();
end;
end;

function Tarara_amtrac_inf_attack_2021()
Cmd(3,2021,GetScriptAreaParams("beach_defence_2"));
Cmd(3,20210,GetScriptAreaParams("beach_defence_2"));
RunScript("Tarara_amtrac_to_position_2021",1000);
end;

function Tarara_amtrac_to_position_2021()
if GetNUnitsInArea(0,"beach_defence_2")==0 then
Cmd(3,2021,GetScriptAreaParams("2021"));
QCmd(50,2021);
Cmd(3,20210,GetScriptAreaParams("2021"));
QCmd(50,20210);
end;
end;

function Tarara_amtank_to_position_3()
if GetNUnitsInArea(0,"beach_defence_2")==0 then
Cmd(3,2020,GetScriptAreaParams("2020"));
QCmd(50,2020);
Suicide();
end;
end;

0

32

Добавлять Suicide();

function Tarara_amtrac_disembark_2012()
local k,b,e,r,x,y;
k=0;
r=1450;
b=2012
x,y=GetObjCoord(b);
k=k+x;
e=GetNUnitsInCircle(0,x,y,r);
if e>0 then
Cmd(5,b,x,y);
RunScript("Tarara_amtrac_inf_attack_2012",2000);
Suicide();
end;
if k<0 then
Suicide();
end;
end;

+4

33

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

что дело в зацикливании скрипта

похоже :)

как правильно показывает наш малоизвестный товарищ keepitsimple (спасибо ему)- видимо оба ветвления функций должны заканчиваться суицидом после срабатывания триггера, если правильно понимаем логику: высадка, движение стартовой командой, если есть юниты игрока в радиусе от скрипт-номера, то запускаем атаку/движение... соотв. после триггера нужен суицид (проверка больше не нужна)...

доп.проверка

k=0;
k=k+x;
if k<0 здесь зачем?

видимо определить существует ли скрипт-юнит или угроблен (координата минус 1), но тогда ее нужно проводить сразу за строкой
x,y=GetObjCoord(b);

т.е. далее if x<0 then Suicide(); - заменит три строки и не нужно делать ресурсоемкую e=GetNUnitsInCircle(0,x,y,r); если юнита нет...

хорошо бы упаковывать однотипные функции в одну с циклом for i=...  это экономит ресурсы, легче контролировать суициды...

Р.ы всем приветы, давно не был, но как известно всегда мысленно с вами :),
Р.р.ы Художники Lynne и 777 делаете шедевры, большие молодцы! :)

Хорошего ГЗМ!

+4

34

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

видимо оба ветвления функций должны заканчиваться суицидом

Я эту функцию где-то в свое время стянул и использовал без изменений - никаких проблем не было. Другое дело, что суициды я не прописал и в других местах скрипта с амтраками - сугубо по невнимательности.

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

k=0;
k=k+x;
if k<0 здесь зачем?

Тут подход был простой - "не трогай то, что работает".

0

35

Hope it helped to add a suicide() Надеюсь, это помогло добавить Suicide()

It makes sense to add suicide() after you have give the order to disembark. Disembarking you do only ones and hence the script can stop now.
Имеет смысл добавить suicide () после того, как вы отдадите приказ о высадке. Высаживаясь, вы делаете только один и, следовательно, сценарий может остановиться сейчас.

The script now only stops if the unit is destroyed.     
Теперь скрипт останавливается только в случае уничтожения юнита.

And the latter is done a little bit complex. 
И последнее делается несколько сложнее.

k=0
k=k+x

k=0 -->  k=k+x =0+x =x

In other words the following line would have been enough
другими словами, следующей строки было бы достаточно

k=x

If the unit is destroyed then x becomes -1 and hence k<0 becomes true and script stops
Если юнит уничтожен, то x становится -1 и, следовательно, k <0 становится истинным, и скрипт останавливается.

if k<0 then
Suicide()
end

+2

36

давненько стоило уделить внимание не только кубикам для миссий, но и скриптам Chapters, т.е. наших глав, менеджмент личных юнитов, бонусы, медали... наши РПГ элементы... кому-то это мало интересно, кому то наоборот, но такой элемент есть в Блицкриге, надо его использовать...

мало того что инструментов тут еще меньше, так и Издательство “Запрещенная литература” (с) говорит что, некоторые команды не реализованы, а другие неизвестны... как обычно, пробуем сложить "счастье" из того что есть...

механика работы скрипта главы такова, что он запускается в момент перехода на экран главы, запустили главу -запущен скрипт, если выходим по esc и опять выбираем главу -запуск, заканчиваем миссию - запуск. Таким образом, если написать AddNewSlot ("T_18") вне служебн.функций, то и выдаст нам слотов с Т-18 неконтролируемое кол-во раз. Какие у нас есть служебн.функции?

function EnterChapter -- срабатывает один раз при первом запуске главы, обычно здесь размещают доступные миссии

function EnterChapter( strChapterName )
SetIGlobalVar("Chapter.IsFirst",0); -- обязательный параметр для Первой Главы
EnableMission("scenarios\\scenariomissions\\ussr\\intro\\1");
EnableMission("scenarios\\scenariomissions\\ussr\\1st_horse_1919\\1");
EnableChapter("scenarios\\chapters\\ussr\\riseofrkka\\1"); -- доступен пропуск главы, принуд.завершение после миссии
SetIGlobalVar("template.hunted.killed", 0); -- обнуление переменной для случаек

function MissionFinished -- возвращает имя завершенной миссии, что позволяет настроить их последовательность, выдать бонус, закончить главу

function MissionFinished( strMissionName )
------- intro----------------------
if ( strMissionName == "scenarios\scenariomissions\ussr\intro\1") then
SetUserProfileVar("ScenarioTutorial.Passed",1); -- ?
AddUpgrade("RKKA_FT_17_37mmGun_Captured"); -- только один доступен
EnableChapter("scenarios\\chapters\\ussr\\riseofrkka\\1"); -- глава моментально завершена
end;

function PlayerGainLevel -Игрок получил уровень и получил медаль :)

function PlayerGainLevel( iLevel )
if (iLevel>=1) then
AddMedal("Medals\\USSR\\_gunnery_1\\1",0);
end;
end;

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

что у нас еще в мануале пропущено? GetStatisticsValue, GetNumMissions - работает, получаем игровую статистику (подробнее как-то разберем в другой раз),

OutputStringValue

- единственную не удалось запустить, 200 тысяч песо награды за правильный синтаксис и миллион если она возвращает информацию о текущих слотах, похоже что там две переменные, неправильное написание критически завершает программу, 
tank1=OutputStringValue(0,"tank");
tank2=OutputStringValue("tank",0); такие варианты проходят, но возращают nil, миллион песо за решение задачи! (Дима, Влад надеюсь на вас! ;))

идем дальше RandomFloat "Не реализована. Всегда возвращает ноль", с учетом что RandomInt не работает в главе, это неприятно... но оказалось что это неправда, команда реализована и возвращает как и положено случайное число между 0 и 1.

что дает нам интересные комбинации, например такую

наконец-то кубик!!!

UpgTank={"RKKA_Tachanka_3Horses_1MG_1918_01","RKKA_Tachanka_4Horses_2MG_1919_01","Benz_ML13_1912_MaximMG_Russia","Russo_Balt_C_24_40_ArmoredCar_1914_Russia","Mannesmann_Mulag_AC_1series_47mm_Gun","RKKA_Medium_tank_Mk_A_Whippet_MG","RKKA_Austin_Putilov","RKKA_FT_17_MaximMG","RKKA_Austin_3_Series","RKKA_Renault_Russian"};
UpgArt={"RKKA_76_2_mm_3inch_FieldGun_1900","RKKA_76_2_mm_3inch_FieldGun_1902","RKKA_76_2mm_MountainGun_1909","RKKA_107_mm_42Line_Field_Gun_1910"};
-----------------------------
AddTank=4; -- new slots
AddArt=4; -- new slots
-------------------------
function EnterChapter( strChapterName )
------ tanks -----------------
local i=1;
while UpgTank[i]~=nil do
iMax=i;
i=i+1;
end;
for i=1,AddTank do
a=iMax*(RandomFloat())+1;
SetIGlobalVar("temp.math",a);
r=GetIGlobalVar("temp.math",1);
name=UpgTank[r];
AddNewSlot(name);
end;
------ arts  -----------------
local i=1;
while UpgArt[i]~=nil do
iMax=i;
i=i+1;
end;
for i=1,AddArt do
a=iMax*(RandomFloat())+1;
SetIGlobalVar("temp.math",a);
r=GetIGlobalVar("temp.math",1);
name=UpgArt[r];
AddNewSlot(name);
end;

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

Рандом бонус

if ( strMissionName == "scenarios\scenariomissions\ussr\1st_horse_1919\1") then
UpgBonus={"RKKA_FT_17_37mmGun_Captured","RKKA_107_mm_42Line_Field_Gun_1910"};
local i=1;
while UpgBonus[i]~=nil do
iMax=i;
i=i+1;
end;
local a=iMax*(RandomFloat())+1;
SetIGlobalVar("temp.math",a);
local r=GetIGlobalVar("temp.math",1);
AddUpgrade(UpgBonus[r]); -- только один доступен

Специально для картоделов с фобией относительно личных юнитов ;) , написал процедуру принудительной унификации слотов

cleaning Slots

local i=1;
n="RKKA_Medium_tank_Mk_A_Whippet_MG"
while UpgTank[i]~=nil do
ChangeCurrent(UpgTank[i],n);
i=i+1;
end;

как видите нужен список "запрещенной" техники, вместо которой Игроку выдадут красивейший Уиппет! Модель предоставлена на правах рекламы, автор модели - Почетный художник Lynne  ;)!

в завершении хочу обратить ваше внимание что команда EnableChapter, принудительно закончит главу в свою сработку если расположена в функции MissionFinished, но если ее разместить на старте главы, то она даст возможность либо сразу пропустить главу, либо завершит ее после одной миссии, это может быть полезно для пропусков туториала и глав с одной неинтересной картой ;)

и еще один важный момент, напоминаю товарищам картоделам, что глобалки не защищенные приставкой temp можно использовать для передачи данных между миссиями, а также скриптам Chapters, таким образом вы можете поощрять выполнение заданий на своих картах выдачей бонусных личных юнитов, (100 тысяч песо, за карту с магазином личных юнитов, перед основной картой ;)) так и наказывать игрока, тем что в след.главе у игрока заберут какую-то имбу. Надеюсь, на вашу выдумку и фантазию.

Хорошего ГЗМ!

+8

37

Так-то картоделы главы не настраивают. Для этого есть специально обученные люди. :-)
Но вот задумка с выдачей бонусов за выполнение определённых заданий, это конечно круто! Правда это упирается, опять же, в тот фактор что над главами и миссиями работают разные люди. Если картодел сделает необязательное задание, но за которое можно что-то выдать, то собиратель глав об этом не знает.

Для меня вот что интересно. В этих главах есть какие-нибудь настройки музыки?

0

38

Всем привет! И сегодня рубрика "маленьких" кубиков, или антиСтены  :)

Недавно меня критиковали, как обычно без малейшего основания :) , что мол заставляю картоделов усложнять жизнь Игрокам, вот эти все кубики, ограничить то, забрать се, посчитать патроны, бензин, мины, хлеб, сапоги ... Картоделы гадают, сколько подкреплений нужно Игроку чтобы выполнить задания, смотрят стримы, проводят тесты, пишут стены проверок,... зачем это все? Игроки играют по разному, подкрепов должно быть ДОСТАТОЧНО, если по сценарию мы должны отбить вон ту позицию у компа, то мы ее отобьем, рано или поздно ;) ...  первый кубик сегодняшнего выпуска:

Бесконечные подкрепления  :idea:

--кубик "Бесконечный подкрепления", ограничение максимума юнитов подкрепа на карте, ВЕРОЯТНОСТЬ подкрепа=дефицит/максимум за цикл---------
MinId,MaxId=201,209; -- скрипт номера подкрепов, мин и макс по порядку
MaxRf={10,10,10,5,5,5,2,2,2}; -- допустимый максимум юнитов на карте (сквад=1), для номеров соотв от MinId до MaxId
--не работает! для пулеметов, минометов, того что складывается (теряет id номер)
function InfinityRnf()
for id=MinId,MaxId do
i=id-MinId+1;
u=RandomInt(MaxRf[i])+1-GetNUnitsInScriptGroup(id,0);
if u>0 then
LandReinforcement(id);
end;
end;
end;

Настраиваем максимум сквадов/юнитов на карте, которых может быть одновременно у Игрока, ставим время 2-5 минут, за цикл скрипт бросит кости, чем больше дефицит подкрепа (разница между фактическим и максимальным), тем больше вероятность получить его и так бесконечно (можно сделать гарантированное получение если не достигнут максимум)... Легко изменяется по ходу сценария:
если в начале поставить MaxId=206 то выдача будет происходить только шести первых подкрепов, а после выполнения задания вписать всего одну строку MaxId=209, то в следующем цикле уже расчет идет для девяти подкрепов... тоже касается и максимума, MaxRf[3]=0 исключит из пополнения юнит 203!

Кстати, небольшой звуковой фикс (беззвучный приход подкрепления, и снижена частота болтовни юнитов)
LowSound.pak

"Стены"  :mad: Стены всех этих Qcmd с пятизначными координатами производят просто удручающее впечатление, Картодел выписал в блокнотик точку через которую должна проехать колонна, затем следующую точку и так допустим 10, потом вписал это в скрипт, для пяти юнитов и получил 50 строк ... давайте не будем так делать, во первых-тире-десятых это неудобно, изменился сценарный маршрут во время тестирования... начинай сначала, блокнотик, скрипт...маршруты нужно организовывать через цепочку зон- "z0"-"zХ", "q0"-"qХ"  нарисовали, ага неудачно лягла пятая зона, удалил, новую сделал, 10 секунд, а скрипт тот же:

Qcmd  :writing:

--Кубик Qcmd----
function m1007(d,id,z,zMin,zMax)
-- Cmd(9,id); -- можно остановить перед выполнением блока Qcmd
if zMax<zMin then
f=-1; else f=1;
end;
i=zMin;
while i~=zMax do
    xZ,yZ=GetScriptAreaParams(z..i);
    QCmd(d,id,xZ,yZ);
    i=i+f;
    end;
QCmd(1007,id); -- финальная команду, исчезновение
end;

function m5(d,id,z,zMin,zMax)
if zMax<zMin then
f=-1; else f=1;
end;
i=zMin;
while i~=zMax do
    xZ,yZ=GetScriptAreaParams(z..i);
    QCmd(d,id,xZ,yZ);
    i=i+f;
    end;
QCmd(5,id,xZ,yZ);
end;

Добавляем эти процедурные функции один раз в ваш скрипт, и теперь из любого места запустив команду формата m1007(0,77,"z",3,0) заставим юнит с номером 77 проехать с командой 0 (движение) по маршруту "z3"-"z2"-"z1"-"z0" и исчезнуть в последней точке...
-- первая цифра указываем тип движения (0 или 3)
-- вторая цифра id юнита/юнитов
-- третья буква/ы в кавычках, буквенный код маршрута "z0","z1" и т.д.
-- четвертая цифра, начало маршрута зона "z3"
-- пятая цифра, финал маршрута зона "z0", т.е. в примере реверс

микро блок:
for id=31,34 do
m5(0,id,"mm",3,5);
end;
проведет колонну из четырех номеров 31-34 по маршруту "mm3"-"mm4"-"mm5" и выгрузит солдат.. удобно и просто...

В заключении немного простых кубиков для обычных рандомных действий:

Случайные обстрелы  :flag:

-----------1. Артобстрел, разные цели ------
Disper=1000; -- разброс
art=100;-- батарея
function rArt()
local r=RandomInt(2);
local x,y=GetScriptAreaParams("target"..r); --- целимся в зоны target0, target1 и т.д.
local xx=x+RandomInt(Disper)-Disper/2;
local yy=y+RandomInt(Disper)-Disper/2;
Cmd(16,art,xx,yy);
--Suicide();
end;
------------2. Случайный подкреп-----------
function rLand()
local t=100+RandomInt(2); -- подкреп 100 или 101
LandReinforcement(t);
Suicide();
end;
---------------------------------------
------------3. Случайная батарея, со своей целью, удаление -----------
Disper=1000; -- разброс
arty=100; -- первая арта, вторая будет 101
function rLand()
local rArt=RandomInt(2);
local art=arty+rArt; -- подкреп 100 или 101
SetIGlobalVar("temp.rArt",rArt);
RunScript("rArt",10000);
LandReinforcement(art);
Suicide();
end;
function rArt()
local rArt=GetIGlobalVar("temp.rArt",0);
local x,y=GetScriptAreaParams("target"..rArt); --- целимся в зоны target0 для первой , target1 для второй
local xx=x+RandomInt(Disper)-Disper/2;
local yy=y+RandomInt(Disper)-Disper/2;
local art=arty+rArt;
Cmd(16,art,xx,yy);
RunScript("rStop",120000);
Suicide();
end;
function rStop()
local art=arty+GetIGlobalVar("temp.rArt",0);
DeleteReinforcement(art);
Suicide();
end;

Невидимые мины  :tomato:

-------- взрыв рандомных фугасов (невидимых мин)
DisplayTrace("Ув.Игрок! Если вы хотите чтобы этот АД прекратился, и обстрелы Большой Берты Вас не беспокоили - переведите 1000 песо на карту %g",myCard);
-----вариант 1 точное время---------------
fMin,fMax=301,330; -- фугасы

function bigGun()
local r=fMax-fMin+1;
for b=0,999 do
n=fMin+RandomInt(r);
o=GetObjectHPs(n); -- проверяем есть ли фугас
if o>0 then
DamageObject(n,0); -- взрыв скрипт номера
break;
end;
end;
end;
---вариант 2 случайное время----------------------------------
fMin,fMax=301,330; -- фугасы
ft=300; -- время между взрывами, секунд
ftr=60; --отклонение времени в диапазоне плюс N секунд!!!

function bigGun()
local r=fMax-fMin+1;
for b=0,999 do
n=fMin+RandomInt(r);
o=GetObjectHPs(n); -- проверяем есть ли фугас
if o>0 then
SetIGlobalVar("temp.bigGun",n);
t=(RandomInt(ftr))*1000+1000;
RunScript("Booom",t);
break;
end;
end;
Suicide();
end;

function Booom()
local t=ft*1000;
local n=GetIGlobalVar("temp.bigGun",0);
DamageObject(n,0); -- взрыв скрипт номера
local k=GetIGlobalVar("temp.Booom",fMin);
if k~=fMax then
SetIGlobalVar("temp.Booom",k+1);
local t=ft*1000;
RunScript("bigGun",t);
end;
Suicide();
end;
--- вариант 3 случ время, фугасов больше чем должно быть взрывов
fMin,fMax=301,390; -- фугасы
fBoom=30;
ft=300; -- время между взрывами, секунд
ftr=60; --отклонение времени в диапазоне плюс N секунд!!!

function bigGun()
local r=fMax-fMin+1;
for b=0,999 do
n=fMin+RandomInt(r);
o=GetObjectHPs(n); -- проверяем есть ли фугас
if o>0 then
SetIGlobalVar("temp.bigGun",n);
t=(RandomInt(ftr))*1000+1000;
RunScript("Booom",t);
break;
end;
end;
Suicide();
end;

function Booom()
local t=ft*1000;
local n=GetIGlobalVar("temp.bigGun",0);
DamageObject(n,0); -- взрыв скрипт номера
local k=GetIGlobalVar("temp.Booom",fMin);
if k~=fBoom then
SetIGlobalVar("temp.Booom",k+1);
local t=ft*1000;
RunScript("bigGun",t);
end;
Suicide();
end;

Учет снарядов и эвакуация арты  :surprise:

--кубик "ограничение снарядов орудиям, отслеживание и эвакуация с позиций после использования допустимого кол-ва снарядов"
bMin,bMax=601,604; -- орудия
bk=2-- установка комплектов 2 бк
bkr=25; -- +/- 25%
trt=100 -- подкреп и номер тягача, разница между орудиями и тягачами к ним, получается 701,704, тягачи нейтралам!!!
netr=2; -- номер нейтрала
evac="Evac" -- зона эвакуации

function setupAmmo()
local a,b,m,k;
for b=bMin,bMax do
a=GetNAmmo(b);
m=a*bk*(1+(RandomInt(bkr*2)-bkr)/100);
SetIGlobalVar("temp.AmmoMax"..b,m);
SetIGlobalVar("temp.Ammo"..b,a);
DisplayTrace("Орудие N %g всего %g кондиционных боеприпасов!",b,m);
end;
DisplayTrace("Внимание Командир! На складах отсутствуют боеприпасы для Батареи особого назначения !");
RunScript("countAmmo",2000);
RunScript("trtEvac",30000);
RunScript("artcheck",5000);
Suicide();
end;

function countAmmo()
local a,aa,b,m,mm,s,k,uT;
k=0;
for b=bMin,bMax do
s=GetUnitState(b);
if s>0 then
mm=GetIGlobalVar("temp.AmmoMax"..b,0);
if mm>0 then
a=GetNAmmo(b);
aa=GetIGlobalVar("temp.Ammo"..b,0);
SetIGlobalVar("temp.Ammo"..b,a);
d=aa-a;
if d>0 then
m=mm-d;
SetIGlobalVar("temp.AmmoMax"..b,m);
if m<=0 then
DisplayTrace("орудие номер %g закончились кондиционные боеприпасы! Прекратить стрельбу!",b);
Cmd(9,b);
ChangePlayer(b,netr);
SetIGlobalVar("temp.AmmoMax"..b,1);
DamageObject(b,20);
local t=b+trt;
LandReinforcement(t);
end;
end;
end;
elseif s<0 then
k=k+1;
end;
end;
uT=bMax-bMin+1;
if k==uT then
KillScript("trtEvac");
KillScript("artcheck");
Suicide();
end;
end;

function trtEvac()
local xZ,yZ=GetScriptAreaParams(evac);
for b=bMin,bMax do
z=GetNUnitsInScriptGroup(b,netr);
if z>0 then
local t=b+trt;
Cmd(31,t,b);
QCmd(0,t,xZ,yZ);
end;
end;
end;

function artcheck()
local b,q,uT;
uT=bMax-bMin+1;
for b=bMin,bMax do
q=GetNScriptUnitsInArea(b,evac);
if q>0 then
local t=b+trt;
DeleteReinforcement(b);
DeleteReinforcement(t);
end;
end;
end;

+6


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