Союз | Union

Объявление

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

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


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


"Школа картоделов"

Сообщений 571 страница 600 из 1223

571

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

http://scintilla.org/SciTE.html
Языковые пакеты
https://code.google.com/p/scite-files/wiki/Translations

Благодарю!!

0

572

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

0

573

DisplayTrace ("Дождливое утро 16 сентября 1943 года. 6:30 по местному времени. Ярцевское направление.");

function DisableAvia()
             DisableAviation (1, 0);
             DisableAviation (1, 1);
             DisableAviation (1, 2);             
             DisableAviation (1, 3);
             DisableAviation (1, 4);
             DisableAviation (0, 0);
             DisableAviation (0, 1);
             DisableAviation (0, 2);             
             DisableAviation (0, 3);
             DisableAviation (0, 4);
     Suicide();
end;

function Reinf101()
LandReinforcement(101); -- лейтенант Залесский
Suicide();
end;

function DisplayLt()
DisplayTrace("Прибыл старший лейтенант Залесский".);
Suicide();
end;

function Move(101)
  QCmd (0, 101, GetScriptAreaParams ("WP1"));
  QCmd (0, 101, GetScriptAreaParams ("WP2"));
  QCmd (0, 101, GetScriptAreaParams ("WP3"));
  QCmd (0, 101, GetScriptAreaParams ("WP4"));
  QCmd (0, 101, GetScriptAreaParams ("WP5"));
  QCmd (0, 101, GetScriptAreaParams ("WP6"));
  QCmd (0, 101, GetScriptAreaParams ("WP7"));
  QCmd (0, 101, GetScriptAreaParams ("WP8"));
  Suicide ();
end;

function MoveTruck()
  Move (101);
  Suicide();
end;

function Init()
           RunScript( "DisableAvia", 500);
   RunScript( "Reinf101", 2000);
   RunScript( "DisplayLt", 4000);
   Run Script( "MoveTruck",6000)

end;

Отредактировано sid (2015-09-11 10:59:30)

0

574

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

Я подцепил его в map editоr и хотел проверить, но он не работает, не могу найти проблему.

Зачем второй раз прописана function Init() ?
Вот эти строки:
function Init()
RunScript("MoveCar", 3000);
end;

0

575

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

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

По поводу выложенных скриптов, точнее только некольких функций.
Элементарная логика(как прописано в функции ИНИТ):
функция DisableAvia срабатывает через 2 секунды после начала игры (комп может успеть выпустить разведчика)
функция DisplayL - срабатывает через 2 секунды - высвечивается текст что прибыл лейтенант, но его еще нет на карте, т.к. еще не сработала функция высадки подкрепления этого лейтенанта
функция Move_Truck - срабатывает через 3 секунды, дает задачу передвигаться юниту (офицеру-лейтенанту), а этого лейтенанта (проприсан в высадке подкрепа)  еще на карте нет - функция не работает, поэтому и возможные отладки погоды не работают
функция Reinf101 - только через 6 секунд на карту прибудет этот лейтенант, естественно, задания о перемещении он уже не получит, в нужную точку он не переместится, условия его перемещения работать уже не будут.
ИТОГИ ПОДВЕДЕМ: исправить время запуска функций (появления-высадки офицера, потом его перемещения и т.д.)
И еще. Если это хоть как то поможет, то пожалуйста, убери подпись Черномырдина - ............(мне она очень..... "не нравится").

Отредактировано yersinia (2015-09-10 22:11:57)

0

576

Спасибо, я только учусь, много еще не понятно.  Не ну а сами функции правильны. нет орф. ошибок. Я карту сделал вот скрипты учусь самостоятельно делать.
Это вы мне у меня нет этой подписи.

function Init()
           RunScript( "DisableAvia", 500);
   RunScript( "Reinf101", 2000);
           RunScript( "DisplayLt", 4000);
           Run Script( "Move_Truck",6000)

end;
А если так!?

Отредактировано sid (2015-09-10 22:18:34)

0

577

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

Не ну а сами функции правильны

Эту цитату следует понимать как: "забыл алфавит, падежов припомнил только два"? - шутка, не обижайся.
Там еще в выложенном тобою сообщении есть:
LandReinforcement(101); - лейтенант Залесский
В такой прописи скрипт работать не будет, потому что после команды (перед "лейтенант...") стоит только одно тире(дефис), а их нужно не меньше двух
Комментарий, т.е. любые буквы, слова, знаки и т.п., которые не относятся к скриптам, должны иметь вначале не менее двух знаков дефиса(тире), т.е не менее --(двух! таких знаков).
А еще для лучшего понимания, точнее ускорения обучения, открой скрипт любой рабочей миссии, самый короткий, и "представь", как он работает. Возможно, это поможет в освоении принципов написания скриптов.

0

578

Вопрос, а как сделать скрипт разведки: что бы разведчик с лейтенантом разведали три точки обороны противника, а потом выдало задание 1 например приступить у штурму при городка города.

function Objective0()
ObjectiveChanged(0, 1);
DisplayTrace("Пошли, Семеныч, разведаем обстановку!"); 
function AlarmZone()
local A_USE_SPYGLASS = 29
QCmd(A_USE_SPYGLASS, 102 ,GetScriptAreaParams("SpugglassZone1"));
if GetNUnitsInArea(0,"SpugglassZone1")>0 then Cmd(29,102,"SpugglassZone1");
Suicide();
end;
end;

function Init()
RunScript("Objective0",7000);
RunScript("AlarmZone",9000);
end;

Какие ошибки!?

Отредактировано sid (2015-09-11 21:36:15)

0

579

А как сделать что бы пехота высаживалась(подкрепление) на карту сразу на марше.?

0

580

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

А как сделать что бы пехота высаживалась(подкрепление) на карту сразу на марше.?

Кликаешь два раза по скваду, в выпавшей табличке последнее значение "formation" меняешь на "movement" - в игре они будут "на марше"

+1

581

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

как сделать скрипт разведки ...Какие ошибки!?

Ошибки

function Objective0()
ObjectiveChanged(0, 1);
DisplayTrace("Пошли, Семеныч, разведаем обстановку!");  --дальше идет новая функция, а в этой нет самоубийства Suicide(); и конца end;
                                                                                          функция и весь скрипт не сработает

function AlarmZone()
local A_USE_SPYGLASS = 29
QCmd(A_USE_SPYGLASS, 102 ,GetScriptAreaParams("SpugglassZone1")); --сразу задана следующая команда (QCmd), нужно первую: Cmd
                                                                                                             --команда "смотреть в бинокль", юниты посмотрят в указаную зону,
                                                                                                                не сходя с места
                                                                                                               (а в предыдущем тексте Пошли, Семеныч...

if GetNUnitsInArea(0,"SpugglassZone1")>0 then Cmd(29,102,"SpugglassZone1"); --"Если юнитов в зоне "SpugglassZone1" больше нуля..
                                                                                                                          А ведь по предыдущей
                                                                                                                          команде они должны только смотреть в эту зону,
                                                                                                                          а не перемещаться туда,
                                                                                                                          т.е. условие никогда не сработает
Suicide();
end;
end;

function Init()
RunScript("Objective0",7000);
RunScript("AlarmZone",9000);
end;

Отредактировано yersinia (2015-09-29 19:33:43)

0

582

А как можно сделать скрипт: взятие в плен офицера. Если да, то  узнали ценную информацию от него(например освободить пленных), если убили - то продолжение миссии. ??

Отредактировано sid (2015-10-01 15:56:42)

0

583

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

взятие пленного офицера

Это как? Он уже пленный, а его ещё взять надо?  :) Или имеется ввиду взять в плен офицера?
Вообще не очень конкретно выражаете свои желания. Можно по разному устроить такое:
1. Назначить скриптовый номер юниту и сделать его "нейтральным" игроком, рядом с тем местом, где он стоит или находится в здании создать скриптовую зону и, при достижении игроком этой зоны, сделать его юнитом игрока и надписи, типа"здаёмсу-у"...
2. Не давать этому офицеру "нейтральной" принадлежности, а остальное почти всё также, тогда с большой долеё вероятности, что его грохнут, при взятии объекта или зоны.
Пленных также, можно посадить в здания, сделать зону и в скрипте прописать условие, что при нахождении в этой зоне юнитов игрока, или при истреблении в этой зоне юнитов противника, юниты, считающиеся пленными станут "принадлежать" игроку...
Вообще, это не самые сложные скрипты, главное понять чего конкретно надо.

0

584

Приветствую! Такой вопрос: можно ли прописать снайпера так, чтобы он стрелял не по всем подряд юнитам игрока, а только лишь по тем, которые имеют заданный ID? Реально ли вообще? Пробовал сделать так:
GiveCommand(1, SniperID, VictimID);
Здесь SniperID - ID снайпера, VictimID - ID жертвы.
Но после выполнению функции снайпер начинает лупить по всем подряд, кто находится в зоне поражения, а жертву не трогает почему-то.
Это нужно, чтобы реализовать уничтожение снайпером ком. состава, когда, например, снайпер лежит в засаде и не отсвечивает до тех пор, пока рядом с ним (в радиусе его обстрела) не появляется офицер противника.
Офицер может быть не один, между ним и снайпером могут находиться другие юниты. Важно, чтобы первый выстрел был строго по офицеру. Дальнейшие действия роли не играют. Может кто-нибудь в той или иной мере сталкивался с такой задачей? Поделитесь секретом, пожалуйста :rolleyes:

0

585

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

можно ли прописать снайпера так, чтобы он стрелял... только лишь по тем, которые имеют заданный ID? Реально ли вообще?

Имеется мнение, что это возможно. Это касается не только снайперов, но и бронебойщиков (если им задать свой скриптовый номер). При выполнении указанной функции (а выполняется она только один раз, если в конце функции стоит слово "Суицид") снайперу никаких команд не выдается, вот он и стреляет всех подряд. В функции нужно ввести два условия без "суицида", тогда функция будет инициироваться бесконечно. Чтобы не загружать программу (скрипты, движок), нужно ввести и третье условие. Например:

примерный скрипт

RunScript("bronebojchik",2000); ---время должно быть небольшим, чтобы наш   
                                   бронебойщик не успевал отвлекаться
                                   на другие цели

function bronebojchik()
if (GetNUnitsInScriptGroup(100)>0)then ---если бронебойщики №100 не убиты, то
Cmd(1,100,200);                           стрелять только по врагу №200
end;

if (GetNScriptUnitsInArea(200,"vidno")==0)then -- если в зоне "vidno"
Cmd(9,100);                                        врага №200 нет, то отставить
end;                                               все действия

if (GetNUnitsInScriptGroup(100)==0)or
       (GetNUnitsInScriptGroup(200)==0)then ---если наших бронебойщиков убили
Suicide();                                  или они уничтожили всех врагов №200 
end;                                        то функция убивается
end;

Зону "vidno" нарисовать на карте круглой, которая соответствует дальности стрельбы нашего юнита №100. Это в том случае, если он сидит в окопе или в доме.
Если он на открытой местности, то по идее будет сам передвигаться по всей карте, приближаясь к врагу №200.
   Если не сложно, проверь скрипт на пробной карте.

Отредактировано yersinia (2015-11-04 16:30:25)

0

586

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

Если не сложно, проверь скрипт на пробной карте.

Проверил, как Вы советовали. Эффект тот же. Дело в том, что снайпер отказывается атаковать юнита с определенным ID. Вместо этого начинает палить во всех подряд. Вот мой скрипт:

Код:
function Init()	
	RunScript("Test", 3000);
end;

function Test()
	DisplayTrace("Старт!");	
	LandReinforcement(1);    -- Снайпер появляется на карте
	RunScript("Kill", 5000);	
	Suicide();
end;

function Kill()
	local n;
	
	if (GetNUnitsInScriptGroup(100,1) == 0)then 
	    Suicide();    -- Снайпер убит
	end; 
	
	DisplayTrace("Kill!");
	
	n = GetNScriptUnitsInArea(200,"ZoneTest0");
	DisplayTrace("n = %g", n);	
	
	if (n ~= 0) then
	    DisplayTrace("Снайпер!");
	    Cmd(1, 100, 200);    -- В зоне поражения присутствует юнит с номером 200. Огонь!
	end;
end;

Если юнит с ID = 200 присутствует в зоне ZoneTest0 сразу же после запуска ф-ции Kill, снайпер стреляет. Только не в того, в кого нужно.
Если юнита №200 в зоне нет, снайпер молчит. До тех пор, пока №200 не входит в зону. При этом огонь открывается также, как и в предыдущем случае, по всем подряд.

0

587

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

LandReinforcement(1);    -- Снайпер появляется на карте

Данный скрипт читается программой так(высвечивающиеся надписи пропускаются):

LandReinforcement(1);    --
Снайпер появляется на карте А ПОД №1 ПРОПИСАН НОМЕР СНАЙПЕРА 100? если снайпер имеет №100, а в свитке "подкрепления"
он прописан как 1, то этот снайпер будет существовать изначально, без всякой высадки подкрепа.
....запустить функцию Kill
Далее:
function Kill()
local n;     
-- задана переменная локальная, ей не присвоено никакого значения, она пока никак не работает

if (GetNUnitsInScriptGroup(100,1) == 0)then  -- если юнитов в группе №100 Врага(1 - значение единица-враг!!) №100 равно нулю, то далее 

функция убивается и ничего в нижепрописанных командах не происходит- функция уже убита(!)
Но если скриптовый №100 это твой снайпер, то зачем его обозначать как №100 вражеский?
(т.е. второе значение после запятой как 1?). Получается, зачем эта функция вообще нужна,
если она заведомо убивается и ничего никогда не делает).

Затем:
n = GetNScriptUnitsInArea(200,"ZoneTest0");
--переменной присваивается значение: количество юнитов №200 в зоне "ZoneTest0"

Далее: if (n ~= 0) then
--если n(количество юнитов 200 в даной зоне) ...
А потом идет непонятный знак: ~= 0, он означает: "равно не равно нулю" (как в украинском анекдоте: так чи срав чи ні?) в смысле:так равно или не равно?

и далее команда:№100 атаковать № 200.
Эта команда сработает, если ммеется юнит №100 игрока (0-ноль, а не 1один) и юнит № 200, а также не "убъется" функция в первоначальном условии - "если юнитов врага (1) №100 равно нулю".

Извини за многословие; идея интересная. Будет время, придумаем как решить эту задачу.

Отредактировано yersinia (2015-11-05 22:47:12)

0

588

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

LandReinforcement(1);    -- Снайпер появляется на карте А ПОД №1 ПРОПИСАН НОМЕР СНАЙПЕРА 100? если снайпер имеет №100, а в свитке "подкрепления"
                                                                                    он прописан как 1, то этот снайпер будет существовать изначально, без всякой высадки подкрепа.

Сейчас специально проверил - снайпер высаживается как подкреп.

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

local n;      -- задана переменная локальная, ей не присвоено никакого значения, она пока никак не работает

Этой переменной не нужно начальное значение. Перед ее использованием в функции ей всегда присваивается значение (строка n = GetNScriptUnitsInArea(200,"ZoneTest0")).

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

if (GetNUnitsInScriptGroup(100,1) == 0)then  -- если юнитов в группе №100 Врага(1 - значение единица-враг!!)

Совершенно верно. Так и снайпер №100 управляется компьютером (номер 1). Это не мой снайпер. Своим снайпером я и сам управлять могу (и назначать ему цели). Нужно именно снайпера под управлением компьютера заскриптовать.
Потому там и стоит 1. Получается, что если этот снайпер погибает, то дальнейший скрипт не имеет смыла. Поэтому ф-ция сразу и убивается за ненадобностью.

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

А потом идет непонятный знак: ~= 0, он означает: "равно не равно нулю" (как в украинском анекдоте: так чи срав чи ні?) в смысле:так равно или не равно?

Это означает "не равно". Т.е. условие будет истинным, если количество юнитов №200 в зоне ZoneTest0 не равно нулю.

Я наверное, немного неправильно озвучил начальные условия задачи. Отсюда и непонятки. Исправляюсь.
Дано: Снайпер под управлением компьютера №100. Офицер под управлением игрока №200. Отряд пехоты под управлением игрока (скриптовый номер не назначен).
Задача: Реализовать уничтожение офицера №200 снайпером №100, как только тот появится в зоне его видимости. При этом одновременно в зоне поражения могут находиться другие юниты игрока (отряд пехоты).
Нужно, чтобы снайпер под управлением компьютера определил наличие нужного юнита на дистанции поражения и попытался его уничтожить. Невзирая на всех остальных.

0

589

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

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

Да, это меняет дело... будем работать... интересная задача...

0

590

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

будем работать... интересная задача...

Я тут грешным делом подумал сделать вот как. В определенные моменты времени снайпер "сканирует" зону на наличие в ней интересных ему юнитов противника (офицеры, генералы  т.д.). Если юнит в зоне поражения присутствует, то он убивается через команду DamageObject(iScriptID,0). Игроку в этот момент выводится сообщение о том, что снайпер уничтожил одного из его подопечных. Игрок уже сам просчитывает обстоятельства происшествия и прочесывает местность. Если за некоторый промежуток времени снайпера нашли, его уничтожают. Если нет, снайпер уходит - исчезает через команду DeleteReinforcement(iScriptID). Типо сменил позицию. Получается, конечно, через одно место. Но зато работать будет. И еще один минус данного метода - нет выстрела, юнит убивается сам. Но пока это единственное результативное действие, которое мне видится...

0

591

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

это единственное результативное действие,...

Да, это так. Все другие потуги скриптами усовершенствовать движок менее эффективны...
Там еще один нюанс, к ранее изложенным скриптовым стараниям: если нужно уничтожить офицера, который находится в составе взвода, то этого офицера никак не возможно отграничить никакой функцией и посыланием к скриптовому номеру, потому что скриптовый номер придается всему взводу. Следовательно снайпер стреляет весь взвод под указанным №.
А для отстрела офицеров (генералов и др. особых юнитов) их нужно будет рисовать на карте только как отдельные взводы, единичных офицеров...

0

592

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

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

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

0

593

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

если нужно уничтожить офицера, который находится в составе взвода, то этого офицера никак не возможно отграничить никакой функцией

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

Следовательно снайпер стреляет весь взвод под указанным №.

Совершенно верно. Будем считать, что офицеры в составе взвода снайпера не интересуют - слишком мал чин.

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

А для отстрела офицеров (генералов и др. особых юнитов) их нужно будет рисовать на карте только как отдельные взводы, единичных офицеров...

Такие юниты уже есть в моде и им можно присваивать скриптовые номера. На игровой процесс они, конечно, влияют мало. Но для передачи атмосферы реальных боевых действий, для антуража очень даже подходят.
Я сейчас делаю карту на тему Зимней войны. Уже все отрисовал, вплотную занимаюсь скриптами. Как сделаю, залью на форум в виде отдельной миссии. Так вот во время той войны проблема снайперов в РККА стояла очень остро. Советские командиры носили светлые полушубки и сильно выделялись на фоне остальных бойцов. Этим, естественно, пользовались финские снайперы, которые выкашивали ком. состав РККА с невиданной скоростью. Именно этот момент я и хотел реализовать в миссии.

0

594

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

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

А какой командой можно присвоить скриптовый номер? Как обратиться именно к этому юниту?

0

595

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

А какой командой можно присвоить скриптовый номер? Как обратиться именно к этому юниту?

Два клика на любом юните в редакторе, в выпавшей, в результате этого, табличке, два клика на строчке Script ID и пиши туда какой надо. Любой, главное самому не запутаться потом в номерах

0

596

Алекс написал(а):

Два клика на любом юните в редакторе, в выпавшей, в результате этого, табличке, два клика на строчке Script ID и пиши туда какой надо. Любой, главное самому не запутаться потом в номерах

Это все понятно. Но речь немного о другом:

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

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

Т.е. поступило предложение уже в игровом процессе расформировать взвод и только потом присвоить офицеру скриптовый номер.

0

597

Ну, значит не понял сути вопроса.
Как сделать то, о чем идет речь, то я не знаю... возможен  ли такой скрипт вообще. Моё предложение в данной ситуации в этом фрагменте игры использовать сквады без офицеров, а офицера придать им отдельно и ему уже и присвоить этот номер. Тогда будет всё проще и в игре наглядно получится.

0

598

Алекс написал(а):

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

Я тоже так думаю. Теперь осталось заставить снайпера стрелять только по этим офицерам :dontknow:

0

599

Тут надо поэкспериментировать с этим:

"Команды юнитам
1, № атакующего, № атакуемого — атаковать юнита (только одного!)"

Это выписка из "Учебника по Lua". Получается, что Cmd (1, 100, 200);  это дана команда атаковать юниту № 100, снайперу, юнит № 200, офицера, только одного!
Если надо не одного офицера, а нескольких то надо ещё QCmd (1, 100, 300); и т.п. то есть другой офицер уже с № 300 (ну или любым желаемым)
Попробуйте

0

600

Алекс написал(а):

Получается, что Cmd (1, 100, 200);  это дана команда атаковать юниту № 100, снайперу, юнит № 200, офицера, только одного!
Если надо не одного офицера, а нескольких то надо ещё QCmd (1, 100, 300); и т.п. то есть другой офицер уже с № 300 (ну или любым желаемым)
Попробуйте

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

0


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