[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 7
  • «
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • »
Архив - только для чтения
Форум » Гильдии » Гильдия картоделов » Вопросы по скриптам и динам. скриптам.
Вопросы по скриптам и динам. скриптам.
JeryДата: Четверг, 14.11.2013, 11:51 | Сообщение # 16
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Он похоже имеет в виду чтобы была анимация как созданный юнит выходит из любого здания.

«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
KromДата: Четверг, 14.11.2013, 15:24 | Сообщение # 17
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
Jery, такой фишки нет и не планируется. Подождем автора вопроса с разъяснениями )

Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
AlexandrVДата: Воскресенье, 17.11.2013, 16:27 | Сообщение # 18
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
Он похоже имеет в виду чтобы была анимация как созданный юнит выходит из любого здания.
Да именно это я и имел в виду. Просто если ставить юнита в любом месте все равно его появления из неоткуда выглядит плохо.
Помогите пожалуйста с скриптом.


Скажите че не так почему массив который должен содержать ID юнитов ну короче текст постоянно такой выводится
Заполненно ячеек[0 из 101] даже при тренировки новых юнитов.
А изначально он пишет так
Заполненно ячеек[0 из 100]
 
JeryДата: Воскресенье, 17.11.2013, 20:06 | Сообщение # 19
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Сказать где ошибка в этой простыне с именами ARRAY_MASSIV_VECTOR_SEQUENCE_POSLEDOVATELNOST_SORTIROVATJ я не могу, во-первых потому что там есть какие-то странные три точки в 3х местах, а во-вторых черт ногу сломит без форматирования и нормальных названий(или хотя бы комментариев). И еще мне интересно одновременное присутствие переменной IntArrayArmy и функции GetArrayArmyAL, а так же их абсолютная несвязность. Мне не хочется тебе помогать. Я тебе дал ссылку на готовый код нормальной сортировки, но ты вставил сортировку пузырьком, вполне возможно что она обеспечит тебе лютый лаг и в твою карту будет невозможно играть. Я объяснил, что сортировка здесь вообще не нужна, но тебе наплевать.

PS.код еще тот конечно, в одном месте используется High в другом Length. В итоге получаем вывод что массив из 100 ячеек потом из 101 замечательно =)
PS2. Вангую, что ошибка в том что у IntArrayArmy начальное значение 1, и эта строчка заботливо выкинута из кода и заменена тремя точками=) Не быть тебе программистом.


«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)

Сообщение отредактировал Jery - Воскресенье, 17.11.2013, 20:15
 
AlexandrVДата: Воскресенье, 17.11.2013, 22:17 | Сообщение # 20
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
Jery, 3 точки означает код который не имеет отношения к ошибки

Цитата Jery ()
Я объяснил, что сортировка здесь вообще не нужна

Как обойтись без сортировки если учесть что будут удаляться ID юнитов из массива.
Вот код который ты мне дал
Код
// Реализация на языке pascal
// Если раскомментировать строки кода, начинающиеся с "//",
// то получится реализация с одной рекурсивной ветвью, в которой
// меньшая часть разделённого массива сортируется рекурсивным вызовом,
// а бо'льшая - в цикле, что гарантирует глубину рекурсии не более lg(N).
procedure qSort(var ar: array of real);
   // Вложенная функция сортировки для рекурсивного вызова
   // Нужна, чтобы не передавать в вызов основной функции границы массива
   procedure sort(var ar: array of real; low, high: integer);
   var i, j: integer;
       m, wsp: real;
   begin
     // repeat
       i:=low; j:=high; m:=ar[(i+j) div 2]; // Взятие среднего опорного элемента
       repeat
         while ar[i]<m do Inc(i);  
         while ar[j]>m do Dec(j);  
         if i<=j then begin
           wsp:=ar[i]; ar[i]:=ar[j]; ar[j]:=wsp;
           Inc(i); Dec(j);
          end;
       until i>j;
     // if (j - low) < (high - i) then begin  
       if low<j then sort(ar, low, j);
     // low := i;
     //   end  
     // else begin
       if i<high then sort(ar, i, high);
     // high := j;
     // end;  
     //until low = high;
   end;
begin
   sort(ar, 0, High(ar));
end;

Но эта сортировка от меньшего к большему а надо от большего к меньшему.


Сообщение отредактировал AlexandrV - Воскресенье, 17.11.2013, 22:40
 
JeryДата: Воскресенье, 17.11.2013, 23:06 | Сообщение # 21
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Цитата AlexandrV ()
Но эта сортировка от меньшего к большему а надо от большего к меньшему.
У меня просто нет слов.
Цитата AlexandrV ()
Jery, 3 точки означает код который не имеет отношения к ошибки
Ты вообще сообщения полностью читаешь или через строчку? Где инициализация IntArrayArmy? Какое у нее начальное значение? Не имеет отношения к ошибке...


«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
AlexandrVДата: Воскресенье, 17.11.2013, 23:08 | Сообщение # 22
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
Цитата Jery ()
У меня просто нет слов.

Непонял тебя. Нежели от большего к меньшему.
Переделал код
Код
procedure sort(var ar: array of Integer; low, high: integer);
var i, j: integer;
   m, wsp: Integer;
begin
   // repeat
   i:=low;  
   j:=high;  
   m:=ar[(i+j) div 2]; // Взятие среднего опорного элемента
   repeat
     while ar[i]<m do Inc(i);  
     while ar[j]>m do Dec(j);  
     if i<=j then begin
       wsp:=ar[i]; ar[i]:=ar[j]; ar[j]:=wsp;
       Inc(i); Dec(j);
     end;
   until i>j;
   // if (j - low) < (high - i) then begin  
   if low<j then sort(ar, low, j);
   // low := i;
   //   end  
   // else begin
   if i<high then sort(ar, i, high);
   // high := j;
   // end;  
   //until low = high;
end;

procedure qSort(var ar: array of Integer);
   // Вложенная функция сортировки для рекурсивного вызова
   // Нужна, чтобы не передавать в вызов основной функции границы массива
begin
   sort(ar, 0, High(ar));
end;

Function GetArray_Low_Menjwe_High(var ar: array of Integer):TArrayArmy;
Var i:Integer;
begin
   For i:= 0 to High(ar) do
   if ar[i] = -1 then
   begin
     result := asFalse;
     exit;
   end  
   else  
   if ar[i] > ar[i - 1] then
   begin
     result := asError;
     exit;
   end;
   result := asTrue;
end;
 
JeryДата: Воскресенье, 17.11.2013, 23:14 | Сообщение # 23
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Все же не полностью сообщения читаешь.

«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
AlexandrVДата: Понедельник, 18.11.2013, 03:43 | Сообщение # 24
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
Цитата Jery ()
Все же не полностью сообщения читаешь.


Код
procedure sort(var ar: array of Integer; low, high: integer);
var i, j: integer;
     m, wsp: Integer;
begin
     // repeat
     i:=low;    
     j:=high;    
     m:=ar[(i+j) div 2]; // Взятие среднего опорного элемента
     repeat
       while ar[i]<m do Inc(i);    
       while ar[j]>m do Dec(j);    
       if i<=j then begin
         wsp:=ar[i]; ar[i]:=ar[j]; ar[j]:=wsp;
         Inc(i); Dec(j);
       end;
     until i>j;
     // if (j - low) < (high - i) then begin    
     if low<j then sort(ar, low, j);
     // low := i;
     //   end    
     // else begin
     if i<high then sort(ar, i, high);
     // high := j;
     // end;    
     //until low = high;
end;

procedure qSort(var ar: array of Integer);
     // Вложенная функция сортировки для рекурсивного вызова
     // Нужна, чтобы не передавать в вызов основной функции границы массива
begin
     sort(ar, 0, High(ar));
end;

Function GetArray_Low_Menjwe_High(var ar: array of Integer):TArrayArmy;
Var i:Integer;
begin
     For i:= 0 to High(ar) do
     if ar [i]= -1 then
     begin
       result := asFalse;
       exit;
     end    
     else    
     if ar [i]> ar[i - 1] then
     begin
       result := asError;
       exit;
     end;
     result := asTrue;
end;

SetLength(ArrayMasivArmy1,101);
     For i:=0 to high(ArrayMasivArmy1) do
       ArrayMasivArmy1[i]:=-1;

Это пока весь код имеющий отношения к сортировке и т.п
Мне пока не нравиться 3 процедура. Нужно ее переделать чтобы возвращало
asTrue - если все ячейки <> -1
asFalse - если последняя ячейка = -1
asError если нужна сортировка тоесть если идет где не попадя -1, где не попадя id номер юнита


Сообщение отредактировал AlexandrV - Понедельник, 18.11.2013, 03:45
 
JeryДата: Понедельник, 18.11.2013, 04:07 | Сообщение # 25
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Извини, но я готов тебе голову оторвать. Настолько непробиваемых людей я еще не видел.

«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
AlexandrVДата: Четверг, 28.11.2013, 16:21 | Сообщение # 26
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
Jery, Объясни че не так. Почему не нужна сортировка если юниты будут умирать и их нужно удалять будет из массива. также нужно исключить кавардак чтобы небыло где не попадя -1

Добавлено (23.11.2013, 17:11)
---------------------------------------------
Код
Type   
    TActivLefels=(AlkPobeda, AlkNeactiv, AlkActiv);
Var
    TextKing:String;
    ActivLefels:Array[0..3] of TActivLefels;
    GoalMisioon:TActivLefels;
    goalStr:String;
    GlawGoalStr:String;
    ColorsMission:Array[0..6] of string;
    VremBools:Array[0..2] of Boolean;//Временная переменная для того чтобы произвести действия 1 раз или в определенные моменты
Событие тик игры
Var
    vremInt:Integer;//Временная переменная для сохранения времени
Begin
...
If ActivLefels[1] = AlkActiv then begin
  If States.HouseResourceAmount(States.HouseAt(84,50),2) < 100 then begin
    goalStr:=ColorsMission[0]+'<$60> '+ColorsMission[1]+'<$66>'+ColorsMission[2]+'<$61>'+ColorsMission[3]+IntToStr(States.HouseResourceAmount(States.HouseAt(84,50),2))+' <$65> <$68>'+ColorsMission[2]+'<$62>';
  end;
  If States.HouseResourceAmount(States.HouseAt(84,50),2) >= 100 then begin
    If VremBools[2] then begin
      vremInt:=States.GameTime;
   VremBools[2]:=False;
    end;
    if States.GameTime < 300+vremInt then
      goalStr:=ColorsMission[0]+'<$60> '+ColorsMission[1]+'<$64>'+ColorsMission[2]+'<$61>'+ColorsMission[3]+IntToStr(States.HouseResourceAmount(States.HouseAt(84,50),2))+' <$65> <$68>'+ColorsMission[2]+'<$62> '+ColorsMission[5]+'<$67>';
    If States.GameTime = 300+vremInt then begin
      ActivLefels[2]:=AlkActiv;
   CountAtack:=5;
      ActivLefels[1]:=AlkPobeda;
    end;   
  end;
   end;
...


Изменил код и теперь он мне достигает 100 и выдает Цель выполнена но все равно не переходит к этой цели
Код
If ActivLefels[2] = AlkNeactiv then
     TextKing:=ColorsMission[0]+'<$46> <$47>';
   If (ActivLefels[2] = AlkActiv)And(CountAtack>0) then begin
  If VremBools[0] then begin
    Repeat
   IDKing:=States.GroupMember(Actions.GiveGroup(0,NoDeadTypesUnit[8],LocatPersX[0],LocatPersY[0],5,1,1),0);
    until IDKing>=0;
    VremBools[0]:=False;
  end;
  If TimerInterv[0]<=0 then begin
    Repeat
   IdGroupArmyAI:=Actions.GiveGroup(3,NoDeadTypesUnit[9],LocatPersX[1],LocatPersY[1],2,6,3);
    until IdGroupArmyAI>=0;
    VremBools[1]:=true;
    TimerInterv[0]:=5000;
     end else
    TimerInterv[0]:=TimerInterv[0]-1;
  If TimerInterv[1]<=0 then begin
    Actions.GroupOrderAttackUnit(IdGroupArmyAI,IDKing);
    TimerInterv[1]:=3000;
  end else
    TimerInterv[1]:=TimerInterv[1]-1;
  If (States.GroupDead(IdGroupArmyAI))And(VremBools[1]) then begin
    CountAtack:=CountAtack-1;
    VremBools[1]:=False;
  end;
  goalStr:=ColorsMission[0]+'<$60> <$72> '+IntToStr(CountAtack)+' <$73>';
  TextKing:=ColorsMission[0]+'<$46> '+IntToStr(States.UnitHunger(IDKing))+' <$44>';
  TextCountAtack:=ColorsMission[0]+'<$75> '+IntToStr(CountAtack)+' <$73>';
  TextTimerInterv:=ColorsMission[0]+'<$74> '+IntToStr(TimerInterv);
   end;

Добавлено (28.11.2013, 16:21)
---------------------------------------------
Скрипт исправил но почемута задержка не работает


Код
If ActivLefels[1] = AlkActiv then begin
  If States.HouseResourceAmount(States.HouseAt(84,50),2) < 100 then begin
    goalStr:=ColorsMission[0]+'<$60> '+ColorsMission[1]+'<$66>'+ColorsMission[2]+'<$61>'+ColorsMission[3]+IntToStr(States.HouseResourceAmount(States.HouseAt(84,50),2))+' <$65> <$68>'+ColorsMission[2]+'<$62>';
  end;
  If States.HouseResourceAmount(States.HouseAt(84,50),2) >= 100 then begin
    If VremBools[2] then begin
      vremInt:=States.GameTime;
   VremBools[2]:=False;
    end;
    if (States.GameTime < vremInt+500)and(not VremBools[2]) then
      goalStr:=ColorsMission[0]+'<$60> '+ColorsMission[1]+'<$64>'+ColorsMission[2]+'<$61>'+ColorsMission[3]+IntToStr(States.HouseResourceAmount(States.HouseAt(84,50),2))+' <$65> <$68>'+ColorsMission[2]+'<$62> '+ColorsMission[5]+'<$67>';
    If (States.GameTime >= vremInt+500)and(not VremBools[2]) then begin
      ActivLefels[2] := AlkActiv;
   CountAtack:=5;
      ActivLefels[1]:=AlkPobeda;
    end;   
  end;
   end;

Он мне сразу переходит к следующей цели не делая задержку
Код
If TimerInterv[1]<=0 then begin
    Actions.GroupOrderAttackUnit(IdGroupArmyAI,IDKing);
    TimerInterv[1]:=3000;
  end else
    TimerInterv[1]:=TimerInterv[1]-1;

Он сразу начинает атаку хотя тут TimerInterv[1] изначально указано 3000


Сообщение отредактировал AlexandrV - Воскресенье, 24.11.2013, 18:25
 
klinok415Дата: Воскресенье, 08.12.2013, 06:54 | Сообщение # 27
Бунтарь
Группа: Проверенные
Сообщений: 7
Награды: 1
Репутация: 3
Статус: Offline
Всем привет, я прочитал но так и не понял, как же все таки их делать, а самое главное где!

Добавлено (08.12.2013, 06:54)
---------------------------------------------
Скрипты эти!

 
JeryДата: Воскресенье, 08.12.2013, 08:05 | Сообщение # 28
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Делать их в блокноте или любом другом текстовом редакторе, который делает txt файлы. Затем эти txt файлы нужно сохранить под расширением .script (просто переименовать из .txt в .script) и поместить в папку с твоей картой. Ну и нужно чтобы имя файла со скриптом совпадало с именем карты.

«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
KromДата: Воскресенье, 08.12.2013, 11:05 | Сообщение # 29
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
klinok415, за рабочими примерами - смотри учебные миссии и кампании - там примитив. Более сложные скрипты в некоторых картах для сетевой игры. (Можно запустить поиск *.script в папке игры и смотреть скрипты в Блокноте)

Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
happy_endДата: Воскресенье, 08.12.2013, 11:06 | Сообщение # 30
Воин
Группа: Проверенные
Сообщений: 101
Награды: 1
Репутация: 31
Статус: Offline
Надо prcedure или states сделать или и то и другое на то, когда игрок (группа) приходит в определенную точку (x,y). То есть к примеру
if States.Posittion(128, 143) OR States.Position(52, 253) then Actions......   или же
procedure OnPosition(X, Y: Integer); begin if X = 128 AND Y = 143 then Actions..... end;
ну и тут же наверное стоит еще указывать индекс игрока, дабы не для всех игроков это действие было доступным


KaM Remake

Сообщение отредактировал happy_end - Четверг, 30.01.2014, 16:53
 
Форум » Гильдии » Гильдия картоделов » Вопросы по скриптам и динам. скриптам.
  • Страница 2 из 7
  • «
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • »
Поиск: