Вопросы по скриптам и динам. скриптам.
|
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 |
|
| |
|