[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Архив - только для чтения
Форум » Гильдии » Гильдия картоделов » Вопросы по скриптам и динам. скриптам.
Вопросы по скриптам и динам. скриптам.
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.


«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
Alexandr_5Дата: Пятница, 31.01.2014, 10:20 | Сообщение # 37
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 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() в паскале же есть такое?

 
Alexandr_5Дата: Суббота, 01.02.2014, 15:43 | Сообщение # 43
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 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, этим практика и отличается от теории wink

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


Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Форум » Гильдии » Гильдия картоделов » Вопросы по скриптам и динам. скриптам.
Поиск: