[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 7 из 7
  • «
  • 1
  • 2
  • 5
  • 6
  • 7
Архив - только для чтения
Форум » Гильдии » Гильдия картоделов » Вопросы по скриптам и динам. скриптам.
Вопросы по скриптам и динам. скриптам.
AlexandrVДата: Пятница, 20.06.2014, 14:01 | Сообщение # 91
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
StatHouseTypeCount

Это как понимать а получения просто кооличество всех зданий у игрока нет возможности.
Это значит  что делать свой цикл для того чтобы получить все здания у игрока или AI
 
andreusДата: Пятница, 20.06.2014, 16:12 | Сообщение # 92
Sir James Vagabond
Группа: Администраторы
Сообщений: 3876
Награды: 21
Репутация: 391
Статус: Offline
Цитата AlexandrV ()
StatHouseTypeCount Это как понимать а получения просто кооличество всех зданий у игрока нет возможности.
Это значит  что делать свой цикл для того чтобы получить все здания у игрока или AI


HousesCount := length(States.PlayerGetAllHouses(aPlayer))

чудеса да и только)


 
AlexandrVДата: Пятница, 20.06.2014, 16:43 | Сообщение # 93
Воитель
Группа: Проверенные
Сообщений: 1320
Награды: 4
Репутация: 33
Статус: Offline
States.PlayerGetAllHouses а что это возвращает
 
andreusДата: Пятница, 20.06.2014, 16:49 | Сообщение # 94
Sir James Vagabond
Группа: Администраторы
Сообщений: 3876
Награды: 21
Репутация: 391
Статус: Offline
Цитата AlexandrV ()
States.PlayerGetAllHouses а что это возвращает

возвращает ИД всех зданий игрока как массив


 
StoneДата: Суббота, 04.10.2014, 09:40 | Сообщение # 95
Группа: Удаленные





Как сделать захват здания для игрока 1 с условием, что у здания меньше 100 жизней и в радиусе 1 клетки есть войска игрока 1?
 
JeryДата: Воскресенье, 05.10.2014, 17:37 | Сообщение # 96
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Используешь событие OnHouseDamaged, оттуда получаешь houseID. По houseID проверяешь все что нужно про здание, в частности проверка на кол-во здоровья делается через HouseTypeMaxHealth - HouseDamage. HouseDamage принимает houseId, а HouseTypeMaxHealt принимает тип здания, который можно узнать через houseID использовав функцию HouseType.
Далее пойдут сложности с определением радиуса одной клетки. Дом это прямоугольник, и этот прямоугольник напрямую скриптами получить нельзя. Если немного ослабить условие захвата например в радиусе 5 клеток от входа, то задача сильно упрощается. Можно использовать HousePositionX HousePositionY получить координаты входа, и затем просто пройтись циклом по всем клеткам в радиусе 5 и посмотреть есть ли там интересующий воин GroupAt или юнит UnitAt. Чтобы передать здание от одного владельца другому придется разрушить старое здание и построить его заново для другого владельца. Для разрушения здания HouseDestroy, для постройки GiveHouse. Постройке здания может помешать его окупант который останется после разрушения, так что с ним тоже что-то нужно сделать =)

Все аргументы и возвращаемые значения функций смотри здесь

PS. Суть я описал. Сам скрипт писать не буду, функции которые точно пригодятся я описал. Это не единственный способ решения, некоторые части можно сделать по другому. Если есть вопросы по поводу приведенных функций, то ответы есть по ссылке. Если есть вопросы по алгоритму, то задавай.


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

Сообщение отредактировал Jery - Воскресенье, 05.10.2014, 17:42
 
StoneДата: Понедельник, 06.10.2014, 15:46 | Сообщение # 97
Группа: Удаленные





Цитата Jery ()
Используешь событие OnHouseDamaged, оттуда получаешь houseID. По houseID проверяешь все что нужно про здание, в частности проверка на кол-во здоровья делается через HouseTypeMaxHealth - HouseDamage. HouseDamage принимает houseId, а HouseTypeMaxHealt принимает тип здания, который можно узнать через houseID использовав функцию HouseType.Далее пойдут сложности с определением радиуса одной клетки. Дом это прямоугольник, и этот прямоугольник напрямую скриптами получить нельзя. Если немного ослабить условие захвата например в радиусе 5 клеток от входа, то задача сильно упрощается. Можно использовать HousePositionX HousePositionY получить координаты входа, и затем просто пройтись циклом по всем клеткам в радиусе 5 и посмотреть есть ли там интересующий воин GroupAt или юнит UnitAt. Чтобы передать здание от одного владельца другому придется разрушить старое здание и построить его заново для другого владельца. Для разрушения здания HouseDestroy, для постройки GiveHouse. Постройке здания может помешать его окупант который останется после разрушения, так что с ним тоже что-то нужно сделать =)

Все аргументы и возвращаемые значения функций смотри здесь

PS. Суть я описал. Сам скрипт писать не буду, функции которые точно пригодятся я описал. Это не единственный способ решения, некоторые части можно сделать по другому. Если есть вопросы по поводу приведенных функций, то ответы есть по ссылке. Если есть вопросы по алгоритму, то задавай.
 
Цитата Jery ()
Используешь событие OnHouseDamaged, оттуда получаешь houseID. По houseID проверяешь все что нужно про здание, в частности проверка на кол-во здоровья делается через HouseTypeMaxHealth - HouseDamage. HouseDamage принимает houseId, а HouseTypeMaxHealt принимает тип здания, который можно узнать через houseID использовав функцию HouseType.Далее пойдут сложности с определением радиуса одной клетки. Дом это прямоугольник, и этот прямоугольник напрямую скриптами получить нельзя. Если немного ослабить условие захвата например в радиусе 5 клеток от входа, то задача сильно упрощается. Можно использовать HousePositionX HousePositionY получить координаты входа, и затем просто пройтись циклом по всем клеткам в радиусе 5 и посмотреть есть ли там интересующий воин GroupAt или юнит UnitAt. Чтобы передать здание от одного владельца другому придется разрушить старое здание и построить его заново для другого владельца. Для разрушения здания HouseDestroy, для постройки GiveHouse. Постройке здания может помешать его окупант который останется после разрушения, так что с ним тоже что-то нужно сделать =)

Все аргументы и возвращаемые значения функций смотри здесь

PS. Суть я описал. Сам скрипт писать не буду, функции которые точно пригодятся я описал. Это не единственный способ решения, некоторые части можно сделать по другому. Если есть вопросы по поводу приведенных функций, то ответы есть по ссылке. Если есть вопросы по алгоритму, то задавай.

Большое спасибо! Скрипт написал, стал проверять в СкриптВалидаторе, пишет, что 2 ошибки вот в этом фрагменте:

procedure OnHouseDamaged (aHouseID, aAttackerIndex: integer);
begin
T:= States.HouseType (aHouseID);
MH:= States.HouseTypeMaxHealth (aHouseID);
 <Unknown identifier
D:= States.HouseDamage (aHouseID);
RD:= MH-D;
X:= States.HousePositionX (aHouseID);
Y:= States.HousePositionY (aHouseID);
< Unknown identifier
Все проверил на 2 раза, вроде бы нигде нет ошибок... подскажешь, из-за чего это?
В скриптах я пока новичок smile

PS: T - type (дома)
MH - MaxHealth
D - Damage (текущий)
RD - остаток жизни
X - X
Y - Y


Сообщение отредактировал Stone - Понедельник, 06.10.2014, 15:49
 
JeryДата: Вторник, 07.10.2014, 22:15 | Сообщение # 98
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Прикладывай весь скрипт файлом. Этот кусок без остального скрипта не имеет смысла, хотя бы потому что нет объявления всех используемых переменных. В частности может MH и Y ты забыл объявить=)
Так же обрати внимание на требуемую версию у каждой функции, она написана в левом столбце таблицы. Валидатор может быть для старой версии ремейка, в которой еще нет используемых тобой функций.

PS. Сокращать вот так названия это плохой стиль. Нужно писать так чтобы любой другой понял назначения переменных без легенды.


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

Сообщение отредактировал Jery - Вторник, 07.10.2014, 22:18
 
JeryДата: Среда, 08.10.2014, 01:48 | Сообщение # 99
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Код
MH:= States.HouseTypeMaxHealth (aHouseID);

Здесь должно быть так:
Код
MH:= States.HouseTypeMaxHealth (T);

Эта функция принимает не конкретный дом а тип дома.


«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
StoneДата: Среда, 08.10.2014, 10:15 | Сообщение # 100
Группа: Удаленные





Jery,
привет, решил сделать, чтобы захват здания для игрока 1 происходил при атаке здания солдатами игрока 1 и повреждении здания более чем на 200 едениц. вверху приветствие при старте и спаун варваров.
procedure OnMissionStart;
begin //приветствие
Actions.ShowMsg(0, 'Приветствие.');
end;
procedure OnTick;
var
j: Integer;
begin //варвары
j:= States.HouseAt (148,10);
if (States.GameTime mod 900 = 0) and (States.HouseOwner (j) = 3)
then
if (States.GameTime mod 900 = 0)
then
Actions.GiveGroup (3, 23, 129, 19, 4, 12, 4)
end;
procedure OnHouseDamaged (aHouseID: Integer; aAttackerIndex: Integer);
var
T, D, X, Y, O: Integer;
begin
D:= States.HouseDamage (aHouseID);
X:= States.HousePositionX (aHouseID);
O:= States.GroupOwner (aAttackerIndex);
Y:= States.HousePositionY (aHouseID);
T:= States.HouseType (aHouseID);
if (States.HouseDamage (aHouseID)) > 200 then begin
if (States.GroupOwner (aAttackerIndex)) = 0 then begin
Actions.HouseDestroy (aHouseID, True);
Actions.GiveHouse (0,(States.HouseType (aHouseID)), X,Y);
Actions.ShowMsg(0, 'Приветствие.');
end;
end;

end;

Ошибок как бы нет, но в игре здание не хочет появляться и сообщение "Приветствие" тоже не дается 2 раз...
Также сделал сначала с переменными, но с ними не работало, поэтому в if сделал напрямую.
Версия ремейка r5503.


Сообщение отредактировал Stone - Среда, 08.10.2014, 10:23
 
JeryДата: Среда, 08.10.2014, 11:11 | Сообщение # 101
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
OnHouseDamaged есть только с версии 5882. В 5503 его нужно мастерить самому через OnTick и PlayerGetAllHouses или использовать конкретный заранее известный дом и в OnTick смотреть за его уроном. Код совсем плохой, один и тот же if проверяется два раза, делаются локальные переменные а потом не используются =)

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

Сообщение отредактировал Jery - Среда, 08.10.2014, 11:13
 
StoneДата: Среда, 08.10.2014, 11:20 | Сообщение # 102
Группа: Удаленные





Понял, а где можно скачать новую версию 5882?
 
JeryДата: Среда, 08.10.2014, 18:02 | Сообщение # 103
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Можно собрать самому.

«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)
 
KromДата: Четверг, 09.10.2014, 12:50 | Сообщение # 104
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
Stone, или отправить заявку на включение в список бета-тестировщиков на

Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
StoneДата: Четверг, 09.10.2014, 13:08 | Сообщение # 105
Группа: Удаленные





Jery, Krom, понял, это значит бета. Будем ждать выхода, а пока - воспользуемся доступными командами.

Jery, еще раз спасибо за объяснения smile
 
Форум » Гильдии » Гильдия картоделов » Вопросы по скриптам и динам. скриптам.
  • Страница 7 из 7
  • «
  • 1
  • 2
  • 5
  • 6
  • 7
Поиск: