http://scintilla.org/SciTE.html
Языковые пакеты
https://code.google.com/p/scite-files/wiki/Translations
Благодарю!!
Союз | Union |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » Союз | Union » Картостроение и скриптовка » "Школа картоделов"
http://scintilla.org/SciTE.html
Языковые пакеты
https://code.google.com/p/scite-files/wiki/Translations
Благодарю!!
Ребят, я вот сделал карту и хотел бы научиться скрипты делать. Пособия скачал, смотрел, но многое не понятно, может поможете в этом нелегком деле(кто хорошо разбирается в этом). Мне нужен скрипт плохой погоды чтобы в самом начале миссии авиация была запрещена и шел дождь- но потом после выполнения первого задания она появилась как у меня так и в немцев (вся кроме десанта).
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)
Я подцепил его в map editоr и хотел проверить, но он не работает, не могу найти проблему.
Зачем второй раз прописана function Init() ?
Вот эти строки:
function Init()
RunScript("MoveCar", 3000);
end;
хотел бы научиться скрипты делать. Пособия скачал, смотрел, но многое не понятно, может поможете...
Мне нужен скрипт плохой погоды чтобы в самом начале миссии авиация была запрещена и шел дождь- но потом после выполнения первого задания она появилась
По поводу выложенных скриптов, точнее только некольких функций.
Элементарная логика(как прописано в функции ИНИТ):
функция DisableAvia срабатывает через 2 секунды после начала игры (комп может успеть выпустить разведчика)
функция DisplayL - срабатывает через 2 секунды - высвечивается текст что прибыл лейтенант, но его еще нет на карте, т.к. еще не сработала функция высадки подкрепления этого лейтенанта
функция Move_Truck - срабатывает через 3 секунды, дает задачу передвигаться юниту (офицеру-лейтенанту), а этого лейтенанта (проприсан в высадке подкрепа) еще на карте нет - функция не работает, поэтому и возможные отладки погоды не работают
функция Reinf101 - только через 6 секунд на карту прибудет этот лейтенант, естественно, задания о перемещении он уже не получит, в нужную точку он не переместится, условия его перемещения работать уже не будут.
ИТОГИ ПОДВЕДЕМ: исправить время запуска функций (появления-высадки офицера, потом его перемещения и т.д.)
И еще. Если это хоть как то поможет, то пожалуйста, убери подпись Черномырдина - ............(мне она очень..... "не нравится").
Отредактировано yersinia (2015-09-10 22:11:57)
Спасибо, я только учусь, много еще не понятно. Не ну а сами функции правильны. нет орф. ошибок. Я карту сделал вот скрипты учусь самостоятельно делать.
Это вы мне у меня нет этой подписи.
function Init()
RunScript( "DisableAvia", 500);
RunScript( "Reinf101", 2000);
RunScript( "DisplayLt", 4000);
Run Script( "Move_Truck",6000)
end;
А если так!?
Отредактировано sid (2015-09-10 22:18:34)
Не ну а сами функции правильны
Эту цитату следует понимать как: "забыл алфавит, падежов припомнил только два"? - шутка, не обижайся.
Там еще в выложенном тобою сообщении есть:
LandReinforcement(101); - лейтенант Залесский
В такой прописи скрипт работать не будет, потому что после команды (перед "лейтенант...") стоит только одно тире(дефис), а их нужно не меньше двух
Комментарий, т.е. любые буквы, слова, знаки и т.п., которые не относятся к скриптам, должны иметь вначале не менее двух знаков дефиса(тире), т.е не менее --(двух! таких знаков).
А еще для лучшего понимания, точнее ускорения обучения, открой скрипт любой рабочей миссии, самый короткий, и "представь", как он работает. Возможно, это поможет в освоении принципов написания скриптов.
Вопрос, а как сделать скрипт разведки: что бы разведчик с лейтенантом разведали три точки обороны противника, а потом выдало задание 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)
А как сделать что бы пехота высаживалась(подкрепление) на карту сразу на марше.?
А как сделать что бы пехота высаживалась(подкрепление) на карту сразу на марше.?
Кликаешь два раза по скваду, в выпавшей табличке последнее значение "formation" меняешь на "movement" - в игре они будут "на марше"
как сделать скрипт разведки ...Какие ошибки!?
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)
А как можно сделать скрипт: взятие в плен офицера. Если да, то узнали ценную информацию от него(например освободить пленных), если убили - то продолжение миссии. ??
Отредактировано sid (2015-10-01 15:56:42)
взятие пленного офицера
Это как? Он уже пленный, а его ещё взять надо? Или имеется ввиду взять в плен офицера?
Вообще не очень конкретно выражаете свои желания. Можно по разному устроить такое:
1. Назначить скриптовый номер юниту и сделать его "нейтральным" игроком, рядом с тем местом, где он стоит или находится в здании создать скриптовую зону и, при достижении игроком этой зоны, сделать его юнитом игрока и надписи, типа"здаёмсу-у"...
2. Не давать этому офицеру "нейтральной" принадлежности, а остальное почти всё также, тогда с большой долеё вероятности, что его грохнут, при взятии объекта или зоны.
Пленных также, можно посадить в здания, сделать зону и в скрипте прописать условие, что при нахождении в этой зоне юнитов игрока, или при истреблении в этой зоне юнитов противника, юниты, считающиеся пленными станут "принадлежать" игроку...
Вообще, это не самые сложные скрипты, главное понять чего конкретно надо.
Приветствую! Такой вопрос: можно ли прописать снайпера так, чтобы он стрелял не по всем подряд юнитам игрока, а только лишь по тем, которые имеют заданный ID? Реально ли вообще? Пробовал сделать так:
GiveCommand(1, SniperID, VictimID);
Здесь SniperID - ID снайпера, VictimID - ID жертвы.
Но после выполнению функции снайпер начинает лупить по всем подряд, кто находится в зоне поражения, а жертву не трогает почему-то.
Это нужно, чтобы реализовать уничтожение снайпером ком. состава, когда, например, снайпер лежит в засаде и не отсвечивает до тех пор, пока рядом с ним (в радиусе его обстрела) не появляется офицер противника.
Офицер может быть не один, между ним и снайпером могут находиться другие юниты. Важно, чтобы первый выстрел был строго по офицеру. Дальнейшие действия роли не играют. Может кто-нибудь в той или иной мере сталкивался с такой задачей? Поделитесь секретом, пожалуйста
можно ли прописать снайпера так, чтобы он стрелял... только лишь по тем, которые имеют заданный 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)
Если не сложно, проверь скрипт на пробной карте.
Проверил, как Вы советовали. Эффект тот же. Дело в том, что снайпер отказывается атаковать юнита с определенным 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 не входит в зону. При этом огонь открывается также, как и в предыдущем случае, по всем подряд.
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)
LandReinforcement(1); -- Снайпер появляется на карте А ПОД №1 ПРОПИСАН НОМЕР СНАЙПЕРА 100? если снайпер имеет №100, а в свитке "подкрепления"
он прописан как 1, то этот снайпер будет существовать изначально, без всякой высадки подкрепа.
Сейчас специально проверил - снайпер высаживается как подкреп.
local n; -- задана переменная локальная, ей не присвоено никакого значения, она пока никак не работает
Этой переменной не нужно начальное значение. Перед ее использованием в функции ей всегда присваивается значение (строка n = GetNScriptUnitsInArea(200,"ZoneTest0")).
if (GetNUnitsInScriptGroup(100,1) == 0)then -- если юнитов в группе №100 Врага(1 - значение единица-враг!!)
Совершенно верно. Так и снайпер №100 управляется компьютером (номер 1). Это не мой снайпер. Своим снайпером я и сам управлять могу (и назначать ему цели). Нужно именно снайпера под управлением компьютера заскриптовать.
Потому там и стоит 1. Получается, что если этот снайпер погибает, то дальнейший скрипт не имеет смыла. Поэтому ф-ция сразу и убивается за ненадобностью.
А потом идет непонятный знак: ~= 0, он означает: "равно не равно нулю" (как в украинском анекдоте: так чи срав чи ні?) в смысле:так равно или не равно?
Это означает "не равно". Т.е. условие будет истинным, если количество юнитов №200 в зоне ZoneTest0 не равно нулю.
Я наверное, немного неправильно озвучил начальные условия задачи. Отсюда и непонятки. Исправляюсь.
Дано: Снайпер под управлением компьютера №100. Офицер под управлением игрока №200. Отряд пехоты под управлением игрока (скриптовый номер не назначен).
Задача: Реализовать уничтожение офицера №200 снайпером №100, как только тот появится в зоне его видимости. При этом одновременно в зоне поражения могут находиться другие юниты игрока (отряд пехоты).
Нужно, чтобы снайпер под управлением компьютера определил наличие нужного юнита на дистанции поражения и попытался его уничтожить. Невзирая на всех остальных.
...начальные условия задачи...Нужно, чтобы снайпер под управлением компьютера определил наличие нужного юнита...
Да, это меняет дело... будем работать... интересная задача...
будем работать... интересная задача...
Я тут грешным делом подумал сделать вот как. В определенные моменты времени снайпер "сканирует" зону на наличие в ней интересных ему юнитов противника (офицеры, генералы т.д.). Если юнит в зоне поражения присутствует, то он убивается через команду DamageObject(iScriptID,0). Игроку в этот момент выводится сообщение о том, что снайпер уничтожил одного из его подопечных. Игрок уже сам просчитывает обстоятельства происшествия и прочесывает местность. Если за некоторый промежуток времени снайпера нашли, его уничтожают. Если нет, снайпер уходит - исчезает через команду DeleteReinforcement(iScriptID). Типо сменил позицию. Получается, конечно, через одно место. Но зато работать будет. И еще один минус данного метода - нет выстрела, юнит убивается сам. Но пока это единственное результативное действие, которое мне видится...
это единственное результативное действие,...
Да, это так. Все другие потуги скриптами усовершенствовать движок менее эффективны...
Там еще один нюанс, к ранее изложенным скриптовым стараниям: если нужно уничтожить офицера, который находится в составе взвода, то этого офицера никак не возможно отграничить никакой функцией и посыланием к скриптовому номеру, потому что скриптовый номер придается всему взводу. Следовательно снайпер стреляет весь взвод под указанным №.
А для отстрела офицеров (генералов и др. особых юнитов) их нужно будет рисовать на карте только как отдельные взводы, единичных офицеров...
если нужно уничтожить офицера, который находится в составе взвода
Извините, что встреваю в вашу беседу, я тут почитал ваши комментарии и осмелюсь предложить, а если заскриптовать взвод чтобы она сразу же
расформировался и потом присвоить скриптовый номер офицеру для его первого уничтожения ну и по алгоритму всех остальных.?
если нужно уничтожить офицера, который находится в составе взвода, то этого офицера никак не возможно отграничить никакой функцией
Следовательно снайпер стреляет весь взвод под указанным №.
Совершенно верно. Будем считать, что офицеры в составе взвода снайпера не интересуют - слишком мал чин.
А для отстрела офицеров (генералов и др. особых юнитов) их нужно будет рисовать на карте только как отдельные взводы, единичных офицеров...
Такие юниты уже есть в моде и им можно присваивать скриптовые номера. На игровой процесс они, конечно, влияют мало. Но для передачи атмосферы реальных боевых действий, для антуража очень даже подходят.
Я сейчас делаю карту на тему Зимней войны. Уже все отрисовал, вплотную занимаюсь скриптами. Как сделаю, залью на форум в виде отдельной миссии. Так вот во время той войны проблема снайперов в РККА стояла очень остро. Советские командиры носили светлые полушубки и сильно выделялись на фоне остальных бойцов. Этим, естественно, пользовались финские снайперы, которые выкашивали ком. состав РККА с невиданной скоростью. Именно этот момент я и хотел реализовать в миссии.
Извините, что встреваю в вашу беседу, я тут почитал ваши комментарии и осмелюсь предложить, а если заскриптовать взвод чтобы она сразу же
расформировался и потом присвоить скриптовый номер офицеру для его первого уничтожения ну и по алгоритму всех остальных.?
А какой командой можно присвоить скриптовый номер? Как обратиться именно к этому юниту?
А какой командой можно присвоить скриптовый номер? Как обратиться именно к этому юниту?
Два клика на любом юните в редакторе, в выпавшей, в результате этого, табличке, два клика на строчке Script ID и пиши туда какой надо. Любой, главное самому не запутаться потом в номерах
Два клика на любом юните в редакторе, в выпавшей, в результате этого, табличке, два клика на строчке Script ID и пиши туда какой надо. Любой, главное самому не запутаться потом в номерах
Это все понятно. Но речь немного о другом:
а если заскриптовать взвод чтобы она сразу же расформировался и потом присвоить скриптовый номер офицеру для его первого уничтожения
Т.е. поступило предложение уже в игровом процессе расформировать взвод и только потом присвоить офицеру скриптовый номер.
Ну, значит не понял сути вопроса.
Как сделать то, о чем идет речь, то я не знаю... возможен ли такой скрипт вообще. Моё предложение в данной ситуации в этом фрагменте игры использовать сквады без офицеров, а офицера придать им отдельно и ему уже и присвоить этот номер. Тогда будет всё проще и в игре наглядно получится.
Моё предложение в данной ситуации в этом фрагменте игры использовать сквады без офицеров, а офицера придать им отдельно и ему уже и присвоить этот номер. Тогда будет всё проще и в игре наглядно получится.
Я тоже так думаю. Теперь осталось заставить снайпера стрелять только по этим офицерам
Тут надо поэкспериментировать с этим:
"Команды юнитам
1, № атакующего, № атакуемого — атаковать юнита (только одного!)"
Это выписка из "Учебника по Lua". Получается, что Cmd (1, 100, 200); это дана команда атаковать юниту № 100, снайперу, юнит № 200, офицера, только одного!
Если надо не одного офицера, а нескольких то надо ещё QCmd (1, 100, 300); и т.п. то есть другой офицер уже с № 300 (ну или любым желаемым)
Попробуйте
Получается, что Cmd (1, 100, 200); это дана команда атаковать юниту № 100, снайперу, юнит № 200, офицера, только одного!
Если надо не одного офицера, а нескольких то надо ещё QCmd (1, 100, 300); и т.п. то есть другой офицер уже с № 300 (ну или любым желаемым)
Попробуйте
Пробовал уже. Не работает эта команда. Снайпер начинает стрелять по тому, кто к нему ближе стоит на данный момент, а не того, кто прописан в команде как атакуемый.
Вы здесь » Союз | Union » Картостроение и скриптовка » "Школа картоделов"