Вопросы по скриптам и динам. скриптам.
|
Jery | Дата: Четверг, 30.01.2014, 17:18 | Сообщение # 31 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| У группы нет такого параметра как координаты точки где она находится. Группа это отряд юнитов, у каждого из них своя координата. Чтобы следить за позицией конкретного юнита можно использовать States.UnitPositionX(id) и States.UnitPositionY(id) с параметром интересующего юнита. Чтобы следить за конкретной точкой можно использовать States.GroupAt(x,y) и States.UnitAt(x,y), которые возвращают id группы или юнита находящегося в данный момент в точке с координатами x,y.
Ну и эти States надо использовать в if, а не создавать какие-то процедуры. Процедуры типа On****() нужны для событий.
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
|
|
| |
|
happy_end | Дата: Четверг, 30.01.2014, 17:52 | Сообщение # 32 |
Воин
Группа: Проверенные
Сообщений: 101
Награды: 1
Репутация: 31
Статус: Offline
| Jery, ну вот смотри тогда, мне нужно чтоб когда любой юнит из моих имеющихся пришел в определенную точку на карте (так сказать встал на нее) нужно чтоб происходило какое-либо действие (скажем мне дали ресурсы или произошла победа). Я об этом хотел нписать в предыдущем вопросе
KaM Remake
|
|
| |
|
Jery | Дата: Четверг, 30.01.2014, 19:51 | Сообщение # 33 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| В этом случае удобнее использовать States.UnitAt(x,y) или States.GroupAt(x,y) и проверять каждый тик игры. Нужно писать что-то подобное: Код procedure OnTick(); begin CheckMyPoints(); end;
procedure CheckMyPoints(); var groupId : integer; begin groupId := States.GroupAt(x,y); {х,у твоя точка} if( groupId<>-1) { -1 будет если в точке нет никакой группы} begin {тут твои действия и дополнительная проверка того что это нужная группа(нужного игрока, или нужного типа)} end end; Если я наврал где-то с точками с запятой, то извиняйте на паскале не пишу=) Если точек много то имеет смысл забить их в массив и вызывать GroupAt в цикле, чтобы не делать сотню строчек для каждой точки=)
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
Сообщение отредактировал Jery - Четверг, 30.01.2014, 19:57 |
|
| |
|
iBia | Дата: Четверг, 30.01.2014, 21:33 | Сообщение # 34 |
Копейщик
Группа: Проверенные
Сообщений: 62
Награды: 0
Репутация: 10
Статус: Offline
| Я в программировании ни ухом ни рылом, так шо уповаю на вашу помощь >_>
тут мне пишут: [Error]ONHOUSEDESTROYED(27:6): Type mismatch Код var Barbarian1, Barbarian2, Barbarian3, Barbarian4, Barbarian5, Barbarian6 : Integer; procedure OnHouseDestroyed(aHouseID: Integer); begin if States.HouseDestroyed(States.HouseAt(80,156)) = true then Actions.PlayerAllianceChange(3, 8, true, false); Actions.PlayerAllianceChange(5, 8, true, false); Actions.PlayerAllianceChange(0, 8, true, true); Actions.PlayerAllianceChange(1, 8, true, true); Actions.PlayerAllianceChange(2, 8, true, true); Actions.PlayerAllianceChange(4, 8, true, true); Actions.PlayerAllianceChange(6, 8, true, true); Actions.PlayerAllianceChange(7, 8, true, true); Actions.ShowMsg(3,'O_o o_o o_O'); Actions.ShowMsg(5,'o_O O_O O_o'); Barbarian1 := Actions.GiveGroup(8, 23, 180, 176, 5, 10, 0); Barbarian2 := Actions.GiveGroup(8, 23, 180, 172, 5, 10, 0); Barbarian3 := Actions.GiveGroup(8, 23, 180, 168, 5, 10, 0); Barbarian4 := Actions.GiveGroup(8, 23, 180, 164, 5, 10, 0); Barbarian5 := Actions.GiveGroup(8, 23, 180, 160, 5, 10, 0); Barbarian6 := Actions.GiveGroup(8, 23, 180, 156, 5, 10, 0); Actions.GroupOrderWalk(Barbarian1, 38, 203, 5); Actions.GroupOrderWalk(Barbarian2, 38, 203, 5); Actions.GroupOrderWalk(Barbarian3, 38, 203, 5); Actions.GroupOrderWalk(Barbarian4, 113, 230, 5); Actions.GroupOrderWalk(Barbarian5, 113, 230, 5); Actions.GroupOrderWalk(Barbarian6, 113, 230, 5); end;
Как сократить писанины по глобальным переменным одинаково типа? Я так понимаю задать переменную с массивом, но как должно это выглядеть?
Код var Barbarian: Array[1..6] of Integer; ******* Barbarian[1] := Actions.GiveGroup(8, 23, 180, 176, 5, 10, 0); Barbarian[2] := Actions.GiveGroup(8, 23, 180, 172, 5, 10, 0); Barbarian[3] := Actions.GiveGroup(8, 23, 180, 168, 5, 10, 0); Barbarian[4] := Actions.GiveGroup(8, 23, 180, 164, 5, 10, 0); Barbarian[5] := Actions.GiveGroup(8, 23, 180, 160, 5, 10, 0); Barbarian[6] := Actions.GiveGroup(8, 23, 180, 156, 5, 10, 0); Как лучше всего задавать условие по уничтоженной постройке?
Код if States.HouseDestroyed(States.HouseAt(80,156)) = true then или Код if (States.HouseType(aHouseID) = 11) and States.HouseOwner(aHouseID) <> 8 then во втором случае мне пишут: Type mismatch жалуясь на "then".
Как использовать эту функцию? По какому принципу она пашет? Код GroupOrderAttackHouse(Barbarian, 11) Можно ли указывать на существующие здания/юнита и конвертировать их в локальную переменную? Глобальные переменные остаются на всю игру, а что происходит с локальными? Нужно ли их как-нибудь обнулять, удалять и т.д. ?_?
Есть ли какой-нибудь гайд/статья/форум по полному контролю ИИ через динамические скрипты? Ибо misson editor у меня пашет только 03 бета версии (так как другие не переваривают максимальный размер мапы T_T).
|
|
| |
|
Jery | Дата: Четверг, 30.01.2014, 22:07 | Сообщение # 35 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| OnHouseDestroyed(aHouseId : integer; aDestroyerIndex: integer); выделенного красным не хватает.
Цитата iBia ( ) Как сократить писанины по глобальным переменным одинаково типа? Я так понимаю задать переменную с массивом, но как должно это выглядеть? Это не всегда можно сделать, здесь у тебя прослеживается сдвиг на -4 по координате это можно использовать, чтобы сделать цикл.
Код procedure InitGlobals(); var iterator: integer; begin for iterator := 1 to 6 do begin Barbarian [iterator]:= Actions.GiveGroup(8,23,180,180-iterator*4, 5, 10, 0); end; end; Вызывать это там где тебе нужно создавать группы.
Как всегда я мог где-то не поставить точку с запятой.
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
Сообщение отредактировал Jery - Четверг, 30.01.2014, 23:05 |
|
| |
|
Jery | Дата: Четверг, 30.01.2014, 22:18 | Сообщение # 36 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| Цитата iBia ( ) Как лучше всего задавать условие по уничтоженной постройке? Здесь смотря что нужно. Можно по разному.Цитата iBia ( ) во втором случае мне пишут: Type mismatch жалуясь на "then". Здесь по вырезке не понятно.
Цитата iBia ( ) Как использовать эту функцию? По какому принципу она пашет? Код GroupOrderAttackHouse(Barbarian, 11)
Можно ли указывать на существующие здания/юнита и конвертировать их в локальную переменную? Глобальные переменные остаются на всю игру, а что происходит с локальными? Нужно ли их как-нибудь обнулять, удалять и т.д. ?_? Тут и нужно использовать существующую группу и существующее здание. Если у тебя barbarian это массив то ты забыл указать индекс какой конкретно барбариан тебе нужен их у тебя 6 в массиве. Что такое 11 я не знаю, но это явно неправильное использование этой функции. Потому что houseId нужно узнавать по ходу игры, заранее он не известен. Для этого подойдут любые функции возвращающие houseId.
Локальные переменные видны и существуют внутри блока begin - end перед которым объявлены, после выхода за этот блок их использовать нельзя.
Почти все в скриптах имеет тип integer (houseID, unitID, groupID - тоже интеджеры) и соответственно может храниться в переменных типа integer.
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
|
|
| |
|
AlexandrV | Дата: Пятница, 31.01.2014, 10:20 | Сообщение # 37 |
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
| У меня вопрос. Код Var TextSripterAlexandrV:Array[0..6] of String; Procedure OnTick; Begin TextSripterAlexandrV[0]:='[$00FF00]<'; TextSripterAlexandrV[1]:='[$00FF00]>'; TextSripterAlexandrV[2]:='[$FF0000]Script'; TextSripterAlexandrV[3]:='[$D37543]='; TextSripterAlexandrV[4]:='[$FF0000]Colors'; If States.HouseWareBlocked(States.HouseAt(5,169),27) then TextSripterAlexandrV[5]:='[$FFFFFF]Показать Текст' else TextSripterAlexandrV[5]:='[$FFFFFF]'; If States.HouseWareBlocked(States.HouseAt(5,169),26) then TextSripterAlexandrV[6]:='' else TextSripterAlexandrV[6]:=''; Actions.OverlayTextAppend(0,TextSripterAlexandrV[0]+TextSripterAlexandrV[2]+TextSripterAlexandrV[3] +TextSripterAlexandrV[5]+TextSripterAlexandrV[1]); end;
Код Unsupported global variable type 28 () версия ремейка - KaM_Remake_6136_Nightly
Сообщение отредактировал AlexandrV - Пятница, 31.01.2014, 10:22 |
|
| |
|
happy_end | Дата: Пятница, 31.01.2014, 11:06 | Сообщение # 38 |
Воин
Группа: Проверенные
Сообщений: 101
Награды: 1
Репутация: 31
Статус: Offline
| 11 - я так понимаю это склад имеется ввиду
KaM Remake
|
|
| |
|
iBia | Дата: Пятница, 31.01.2014, 21:56 | Сообщение # 39 |
Копейщик
Группа: Проверенные
Сообщений: 62
Награды: 0
Репутация: 10
Статус: Offline
| Можно ли тут задерживать ход действий? Есть ли какой-нибудь Wait, Timer, Pause и т.п. ?_?
Если одновременно послать два отряда в одну и туже точку то они так и будут толпиться, выталкивая друг друга, у этой позиции т_Т из-за чего ИИ не может отдать им последующие приказы они ведь занятые люди...
Как игроков делать враждебными? о_О Если юзать PlayerAllianceChange с Compliment - True и Allied - False то они должны быть взаимно враждебными? У меня так не хотят =(
|
|
| |
|
Jery | Дата: Пятница, 31.01.2014, 22:52 | Сообщение # 40 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| Цитата iBia ( ) Как игроков делать враждебными? о_О Если юзать PlayerAllianceChange с Compliment - True и Allied - False то они должны быть взаимно враждебными? У меня так не хотят =( Насколько я помню там был какой-то баг который уже фиксанули, нужно ждать новую версию ремейка.
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
|
|
| |
|
Jery | Дата: Пятница, 31.01.2014, 23:09 | Сообщение # 41 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| Цитата iBia ( ) Можно ли тут задерживать ход действий? Есть ли какой-нибудь Wait, Timer, Pause и т.п. ?_? Вручную велосипедь, нет тут такого.Цитата iBia ( ) Если одновременно послать два отряда в одну и туже точку то они так и будут толпиться, выталкивая друг друга, у этой позиции т_Т из-за чего ИИ не может отдать им последующие приказы они ведь занятые люди... Здесь хз сомневаюсь что будут проблемы=)
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
|
|
| |
|
iBia | Дата: Суббота, 01.02.2014, 14:36 | Сообщение # 42 |
Копейщик
Группа: Проверенные
Сообщений: 62
Награды: 0
Репутация: 10
Статус: Offline
| А как же Delay(x); или Sleep() в паскале же есть такое?
|
|
| |
|
AlexandrV | Дата: Суббота, 01.02.2014, 15:43 | Сообщение # 43 |
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
| iBia, Pascal script это движок паскаля там не все что в оригинальном паскале.
|
|
| |
|
Jery | Дата: Воскресенье, 02.02.2014, 03:04 | Сообщение # 44 |
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
| Цитата iBia ( ) А как же Delay(x); или Sleep() в паскале же есть такое? Нужно делать велосипед, этих функций в скриптах нет и быть не должно. Какую-то общую систему с таймерами сделать на скриптах очень проблематично(мне кажется), стандартных функций связанных с таймерами нет. Но ты всегда можешь внести конкретное предложение того что тебе нужно. В каждом конкретном случае сделать имитацию таймера довольно просто, но если у тебя таких случаев очень много то придется писать большой объем кода=)
Изначально когда только обсуждалась идея введения скриптов я упоминал и таймеры, и регионы, но так как я не картодел и они никому не были нужны их до сих пор нет. На самом деле сейчас отсутствует множество всяких теоретически нужных функций.
«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
|
|
| |
|
Krom | Дата: Понедельник, 03.02.2014, 00:13 | Сообщение # 45 |
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
| Jery, этим практика и отличается от теории
Таймер сделать скорее всего не получится, ведь тогда внутрь надо передавать функцию, а паскаль скрипт такого вроде не умеет. Проще эмулировать используя обычный таймер и систему тэгов
Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
|
|
| |
|