Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: New Magic system for WoG
DF2 :: ФОРУМЫ > Игровые форумы > Heroes of Might & Magic III > Архив разделов форума Heroes III
Страницы: 1, 2, 3
Д'якон
Тогда обратимся к товарищу Berserkerу. Может он добавит этот навык отдельной опцией в Феникса. Я тогда за выходные доведу до ума скрипт. А, Berserker?
Berserker
К сожалению, врядли:

1) Я почти не использую опций
2) Я уже решил строго выполнить за выходные намеченный план.
3) Используй макросы и можешь любой скрипт под Мод писать, это не сложно.

Делается это так, в битве ты перехватываешь используемы заклы через !?BG0, далее проверяешь, а обладает ли человек (если человек!!! ИИ трогать - себе во вред) обладает нужными навыками, то ОК, иначе запрещаем каст и выводим месагу.

P.S Я общеал за выходные написать прогу для переменных и констант (примитивную пока), так что $уже смело можно юзать$.
Д'якон
Скрипт уже написан - повторю.
Цитата(Д'якон @ 07 Sep 2007, 10:56)
Вот 1-й скрипт.
Для изучения магии необходимо иметь не только мудрость, но и некоторые другие навыки определенного ур-ня.
Например, для изучения ускорения - необходимо иметь мудрость, логистику и магию воздуха.

!#FU1234:Px1/x2/x3/x4/x5;
  // x1 - номер хаклинания
  // х2 - 1-й навык, который необходим для изучения магии (кроме мудрости). В основном это должна быть одна из базовых магий;
  // х3 - ур-нь навыка;
  // x4 - 2-й навык;
  // х5 - ур-нь 2-го навыка.



!?FU1234
!!SSx1:F?y1;
!!OW:A-1/?y2;
!!HEy2:Mx1/?y3;
!!HEy2:Sx2/?y4;
!!HEy2:Sx4/?y5;
!!if&y3=1/y4=>x3/y5=>x5:;
  !!SSx1:Fy1;
!!el:;
  !!SSx1:F0;
!!en;
Berserker
Это не полноценный скрипт. Он ничего не делает - это раз. Во-вторых, заклы убирать не дело!!! Их может давать свиток или арт!
Д'якон
Уговорил. Вот
ZVSE
_WARNING_#1=IMPORTANT! This file is not in a plain text format. NEVER use any editor except ERM_S for making any kind of changes!
ERMS_PoweredBy=ERM Scripter v. 2004.10.5.945
ERMS_ScriptDate=8.9(September).2007
!?BGO;
!!BG:A?v4;
!!BG:S?v2;
!!FU1234:Pх1/х2/х3/х4/х5;
// x1 - номер хаклинания
// х2 - 1-й навык, который необходим для изучения магии (кроме мудрости). В основном это должна быть одна из базовых магий;
// х3 - ур-нь навыка;
// x4 - 2-й навык;
// х5 - ур-нь 2-го навыка.

!!BG&v3=1:A0;
!?FU1234
!!VRv3:S0;
!!if&x1=v2/v4=1:;
!!BG:H?y1;
!!HEy1:Sx2/?y4;
!!HEy1:Sx4/?y5;
!!if&y4<x3:;
!!VRv3:S1;
!!en;
!!if&y5<x5:;
!!VRv3:S1;
!!en;
!!en;

Фигово только что в книге отображються не используемые заклинания
Д'якон
А что отвечает за появление заклинаний в книге? Это свойство книги, или мудрости, или это отдельная функция в принципе.
Demiurg
Цитата(Д'якон @ 08 Sep 2007, 18:33)
А что отвечает за появление заклинаний в книге? Это свойство книги, или мудрости, или это отдельная функция в принципе.

Наличие данного заклинания у героя и все.
Д'якон
В смысле?. Если допустим герой не эксперт мудрости, то при посещении гильдии магов у него в не появится закл в книге.
Berserker
Дьякон, ну что значит вот это:
!!FU1234:Pх1/х2/х3/х4/х5; ???

Функцию надо вызывать с конкретными параметрами и вообще, логики не прослеживается. Кроме того, функцию вовсе необязательно занимать, всё можно прямо в !!BG0: сделать.

Далее, непонятное условие к неглобальной переменной v3 и прочее. Ты сперва тестируй на всех случаях свои скрипты smile.gif

Далее, !!BG:H?y1; - некорректно , точнее только Драколич употреьляет так, хотя при опускании параметра стороны считается 0 по умолчанию (левый герой), но ведь не редко человек и справа, а ИИ слева!!!

И прочее.
Demiurg
Цитата(Д'якон @ 08 Sep 2007, 20:02)
В смысле?. Если допустим герой не эксперт мудрости, то при посещении гильдии магов у него в  не появится закл в книге.

Не так. При посещении гильдии без Мудрости герой не получит это заклинание. А в книге оно не появится потому, что его не будет у героя.
Д'якон
Ну Berserker, ты меня удивляешь, по крайней мере первым вопросом:
Дьякон, ну что значит вот это:
!!FU1234:Pх1/х2/х3/х4/х5; ???
Распишу еще раз.
// x1 - номер хаклинания (например, слепота -62)
// х2 - 1-й навык, который необходим для изучения магии (кроме мудрости). В основном это должна быть одна из базовых магий;(например,магия воздуха-15)
// х3 - ур-нь навыка;(базовая магия воздуха - 1)
// x4 - 2-й навык;(орлиный глаз - 11)
// х5 - ур-нь 2-го навыка. (базовый орлиный глаз -1)

Так запускаешь эту функцию для каждого закла, только возможно так будет немногог быстрее:

!!FU1234&v2=x1:Pх1/х2/х3/х4/х5; где в v2 хранится номер используемого в данный момент закла.


Это шаблон, куда подставляются конкретные данные заклинания.
Понятно?

Далее v3, может я и некорректно сделал, но v3 приравнивается 1, если отсутствует какой-нибудь из необходимых навыков, в результате чего прекращается действие.

Скрипт этот тестировал, не на всех случаях, но тестировал.
!!BG:H?y1 - я так понял, что здесь заносится номер героя, существа которого ходят в данный момент. Будь то ИИ или человек. Т.е. скрипт действует для всех (хоть ИИ этого и не "понимает").

Еще вопросы?

Добавлено ([mergetime]1189287865[/mergetime]):
Цитата(Demiurg @ 08 Sep 2007, 19:16)
Цитата(Д'якон @ 08 Sep 2007, 20:02)
В смысле?. Если допустим герой не эксперт мудрости, то при посещении гильдии магов у него в  не появится закл в книге.

Не так. При посещении гильдии без Мудрости герой не получит это заклинание. А в книге оно не появится потому, что его не будет у героя.


Ну и конечно запретить герою получить заклинание нельзя, да? Я знаю что флаг 0 для заклинания не отображает его в книге, будь оно выучено, от арта или от свитка. Вот только убирается оно из книг у всех. И с восстонавлением потом проблемы.
Итог: нельзя ли это свойство как-то юзать?
Berserker
Повторюсь - это не рабочий скрипт и как ты его тестировал?
2) для ИИ непонимание выльется в зависание, если он захочет кодовать закл. (вроде Хорн писал, что нельзя забирать или давать заклы уже во время битвы).
Demiurg
Цитата(Berserker @ 09 Sep 2007, 20:17)
2) для ИИ непонимание выльется в зависание, если он захочет кодовать закл. (вроде Хорн писал, что нельзя забирать или давать заклы уже во время битвы).

Horn ошибся. Его, как разработчика TE, интересует мультиплеерный вариант. И, не зная про !!HE-10 и !!HE-20, он думал, что он не сможет давать и отнимать заклинания в сетевой битве.
Д'якон
Это не серьезно, ведь ты даже не тестировал. Протестируй, пожалуйста и найди баги, если сможешь.

Я тестил так: для ледяной стрелы поставил необходимые навыки базовая удача и базовая балистика. (т.е. вместо
х1 - 16;
х2-9;
х3-1;
х4-10;
х5 -1;

Поставил на карте двух героев (своего и ИИ). Обоим дал книгу и армию, но компу не дал необходимых навыков для использования стрелы. Далее я нападал на компа и давал ему таекое право. Не зависло ни разу.

Попробуй сначала.
Berserker
Дьякон, но ведь это шаблон, а не готовый скрипт. Юзер не должен подстовлять чего-то, согласись. Сделай полный вариант для всех заклов и без использования глобальных переменных.

З.Ы И без использования функций. Тогда твой скрипт будет совместим с любыми версиями мода и других скриптов.
Demiurg
Цитата(Berserker @ 09 Sep 2007, 23:52)
И без использования функций. Тогда твой скрипт будет совместим с любыми версиями мода и других скриптов.

Бывает еще логическая несовместимость. dry.gif
Berserker
Да, но тут её почти не может быть, по крайней мере с уже существующими скриптами.
Д'якон
ОК. Постараюсь. Но не знаю получится ли без глобальных.
Berserker
Я уже почти закончил SCVS, а как обойтись я тебе помогу.
Д'якон
Ну без глобальных переменных обошелся, а вот без функции....
Моих знаний ЕРМ и фантазии не хватило

!?BGO;
!!FU1234:Px1/x2/x3/x4/x5;
!?FU1234
!!BG:A?y6;
!!BG:S?y7;
!!VRv3:S0;
!!if&x1=y7/y6=1:;
!!BG:H?y1;
!!HEy1:Sx2/?y4;
!!HEy1:Sx4/?y5;
!!if&y4<x3:;
!!IF:V1/0;
!!en;
!!if&y5<x5:;
!!IF:V1/1;
!!en;
!!en;
!!BG&1/y6=1:A0;

Думал вместо функции обращаться к какой нибудь текстовой таблице или .ini файлу, но не знаю как и получится ли.


Добавлено ([mergetime]1189847539[/mergetime]):
Можно добавить еще месагу, после отмены действия, и изменить описание заклов.
Demiurg
Моя все же считает, что лучше перед боем убирать заклинание из книги, чем отменять действие.
Д'якон
ОК, попробую убрать закл из книги. Вопрос только, после боя заклы возвращать или нет (если они допустим были выучены в гильдии)?

Ну и если на то пошло, то лучше не давать заклинание вообще герою без нужных навыков.
Demiurg
Цитата(Д'якон @ 15 Sep 2007, 13:30)
Ну и если на то пошло, то лучше не давать заклинание вообще герою без нужных навыков.

Если сможешь все проконтролировать, то да.
Д'якон
Ну вот скрипт для убирания заклов из книги перед боем:

!?BA0;
!!FU1234:Px1/x2/x3/x4/x5;
!!IF:V2/1;
!!FU1234:Px1/x2/x3/x4/x5;

!?FU1234
!!IF:V1/0;
!!BA&-2:H0/?y1;
!!BA&2:H1/?y1;
!!HEy1:Sx2/?y4 Sx4/?y5;
!!if&y4<x3:;
!!IF:V1/1;
!!en;
!!if&y5<x5:;
!!IF:V1/1;
!!en;
!!HEy1&1:Mx1/0;
!!IF:V2/0;
gamecreator
имхо, надо возвращать. имхо, идея в том, что герой выучил закл, а юзать без навыков не может
Д'якон
Пришлось попариться но вот:

Код
!?BA0;
!!FU1234:Px1/x2/x3/x4/x5;
!!IF:V2/1;
!!FU1234:Px1/x2/x3/x4/x5;


!?FU1234
!!IF:V1/0;
!!BA&-2:H0/?y1;
!!BA&2:H1/?y1;
!!VRy6:Sx1;
!!IF:Wy1;
!!HEy1:Mx1/?wx1;
!!HEy1:Sx2/?y4 Sx4/?y5;
!!if&y4<x3:;
  !!IF:V1/1;
!!en;
!!if&y5<x5:;
  !!IF:V1/1;
!!en;
!!HEy1&1:Mx1/0;
!!IF:V2/0;

!?BA1;
!!DO1235/0/69/1:P;
!?FU1235;
!!BA:H0/?y1;
!!BA:H1/?y2;
!!IF:Wy1;
!!HEy1&wx16=1:Mx16/1;
!!IF:Wy2;
!!HEy2&wx16=1:Mx16/1;
Demiurg
Если честно, то это бред.
Например, переменной w0 не существует.
Во-вторых использовать на 1 скрипт 69 w-переменных???
Д'якон
Согласен, но w0 в принципе и не нужно использовать, боевые заклинания начинаются с 10-го. И не 69 тогда а 59, для каждого героя.
Много, согласен. А как по-другому вернуть закл?
Д'якон
Вот третий вариант, по смыслу наверно лучший а вот по времени обработки судить Вам

Код
!?TL0;

!!DO1234/0/155/1:Px1/x2/x3/x4/x5;

!?FU1234
!!IF:V1/0;
!!HEx16:O?y1;
!!FU&y1=-1:E;
!!HEx16&y1>-1:Sx2/?y2 Sx4/?y3;
!!if&y2<x3:;
  !!IF:V1/1;
!!en;

!!if&y3<x5:;
  !!IF:V1/1;
!!en;

!!HEx16&1:Mx1/0;


Попрошу только без "Если честно, то это бред", а то такие фразы отбивают желание чем либо заниматься. Эта фраза была бы к месту, если бы я кому-нибудь чего-нибудь навязывал.
Demiurg
Цитата(Д'якон @ 15 Sep 2007, 17:40)
Много, согласен. А как по-другому вернуть закл?

Учим матчасть)
Одна переменная - 32 бита. Это означает, что в ней мы можем хранить информацию о наличии у героя 32 заклинаний.
Д'якон
Во-первых, я матчасть не учил (не специализируюсь в этой области).
Во-вторых, все равно не знаю как эти 32бита реализовать на практике.
Berserker
31 бит, ибо у ЕРМ баг с изменением 32-го бита, приходится вручную умножать на -1, в общем рутина.

1) напиши функцию для возведения 2-ки в указанную степень
2) бит устанавливается так:

!!VRy1:|1; установили первый бит
!!VRy1:|2; установили второй бит
!!VRy1:|4; установили третий бит

!!VRy1:&4; Проверка на 3-й бит

!!VRy1:&-3; сняли третий бит

вроде так
Demiurg
Цитата(Berserker @ 15 Sep 2007, 22:02)
!!VRy1:&-3; сняли третий бит

Только не 3ий, а 2ой.
устанавливать |(2^x)
удалять &(2^xX-1)
X-1 - инвертирует все биты. Нетрудно проверить, что для степенй 2ки это равнозначно добавить 1 и следом умножить на -1.
gamecreator
а как действует удаление способом с отр. числом?
Demiurg
Цитата(gamecreator @ 16 Sep 2007, 08:59)
а как действует удаление способом с отр. числом?

Известно как)
Чтобы удалить 3ий бит, необходимо сделать "логическое И" с числом у которого на 3ей позиции стоит 0, а на всех остальных единица. "И" с единицей не меняет бит. "И" с нулем обнуляет бит.
Чтобы посмотреть, что из себя представляют отрицательные числа достаточно стандартного виндошного калькулятора. В нем в расширенном режиме есть переход в 2ичную систему счисления.
Д'якон
!!VRy1:&4; Проверка на 3-й бит

И как узнать что бит установлен, куда заносится ответ?
Demiurg
Открой хелп по ERM, ресивер !!VR, практически в самом низу.

LOGICAL BIT OPERATIONS

&# Check or remove specific bit of a variable
& does a logical AND on the bits of a variable and can be used to check if a specific bit has been set. For example, to test if the variable v1 has the 5th bit (16) set, use: !!VRv1:&16; v1 will be set to 16 if bit 5 is set and 0 if it isn't. This can be very useful when checking monster flags.
Example:
!!BRx16:F?i; read flags
!!VRi:&33554432; just look at waiting bit
!!IF&i>0:M^This stack is waiting.^;
You can also clear (remove) a specific bit without touching the other bits in a variable. To do so, use the negative minus one of the bit value you wish to remove. For example, to remove the 5th bit (16), use -17, e.g., !!VRv1:&-17;
To check or unset several bits at once sum their values. E.g. to remove 4th(8), 3rd(4) and 1st(1) bits use &-14 ( =-1*(8+3+1)-1 ).
To check them use &13.
|# Set a specific bit of a variable
| does a logical OR on the bits of a variable and can be used to set a specific bit without changing the other bits. For example, to set the 6th bit (32) for v1, use: !!VRv1:|32;
If v1 already had this bit set, nothing is changed. If it didn't, it now has this bit set. This can be very useful for adding new flags to a monster if you don't know which ones it already has, and in fact, this is really the only completely safe way to do so.
To set several bits at once sum their values. E.g. to set 5th(16) and 3rd(4) bits use |20
X$ Does a logical XOR on a bits of a variable
E.g. X-1 will invert bits of a variable.
To check for difference between two variables use syntax :VR@:X$ , where @ is variable which is one of variables to compare and also will keep the result of comparison. $ is second comparing variable.
Example:
Say v1=163 (10100011) and v2=106 (01101010). Then after
!!VRv1:Xv2; v2 is still 106.
1 0 1 0 0 0 1 1
0 1 1 0 1 0 1 0
XOR - - - - - - - -
1 1 0 0 1 0 0 1
So v1=201 (11001001)
gamecreator
а я и не знал что можно XOR сделать в ЕРМ
Д'якон
Не могу понять почему в у10 не заносится значение х3 из функции 1236
Код
!?BA0;
!!FU1234:P16/9/1/10/1;
!!IF:V2/1;
!!FU1234:P16/9/1/10/1;


!?FU1234
!!IF:V1/0;
!!BA&-2:H0/?y1;
!!BA&2:H1/?y1;
!!VRy6:Sx1;
!!HEy1:Sx2/?y4 Sx4/?y5 Mx1/?y7;
!!if&y4<x3:;
  !!IF:V1/1;
!!en;
!!if&y5<x5:;
  !!IF:V1/1;
!!en;
!!HEy1&1:Mx1/0;
!!IF:V2/0;
!!if&y7=1/x1>9/x1<42:;
!!VRy8:S1;
!!DO1236/10/41/1:Py8/x1/?y10;
!!IF:Wy1;
!!VRw1:|y10;
!!VRw1:|&y10;
!!en;
!!if&y7=1/x1>42/x1<60;
!!VRy8:S1;
!!DO1236/10/41/1:Py8/x1/?y10;
!!VRw2:|y10;
!!en;


!?FU1236;
!!if&x2>x16/x2<41:;
!!VRx1:+x1;
!!VRx3:Sx1;


И все же мне кажется, что скрипт через !?TL, самый оптимальный. А?
Berserker
1) y-переменные не прокатят, юзай v2
2) правильно: !!VRvx2:...
Д'якон
2 Berserker
Тут вопрос на счет скрипта с !?TL; Что ты думаешь о времени его выполнения
Berserker
в каком смысле?стоит ли его нагружать? если имелось ввиду это, то лучше его не юзать.
Д'якон
Имелось ввиду:

Код
!?TL0;

!!DO1234/0/155/1:Px1/x2/x3/x4/x5;

!?FU1234
!!IF:V1/0;
!!HEx16:O?y1;
!!FU&y1=-1:E;
!!HEx16&y1>-1:Sx2/?y2 Sx4/?y3;
!!if&y2<x3:;
 !!IF:V1/1;
!!en;

!!if&y3<x5:;
 !!IF:V1/1;
!!en;

!!HEx16&1:Mx1/0;


Не будет ли этот скрипт слишком долгим по времени исполнения на больших картах?
gamecreator
немного оптимизировал код
Код
!?FU1234
!!IF:V1/0;
!!BA&-2:H0/?y1;
!!BA&2:H1/?y1;
!!VRy6:Sx1;
!!HEy1:Sx2/?y4 Sx4/?y5 Mx1/?y7;
!!if|y4<x3|y5<x5:;
  !!IF:V1/1;
!!en;
!!HEy1&1:Mx1/0;
!!IF:V2/0;
!!VRy8:S1;
!!DO1236/10/41/1:Py8/x1/?y10;
!!if&y7=1/x1>9/x1<42:;
!!IF:Wy1;  \\почему тут определяется герой...
!!VRw1:|y10;
!!en;
!!if&y7=1/x1>42/x1<60;
!!VRw2:|y10;  \\...а тут нет?
!!en;


!?FU1236;
!!if&x2>x16/x2<41:;
!!VRx1:+x1;
!!VRx3:Sx1;
!!en;


Добавлено ([mergetime]1190138835[/mergetime]):
просьба ответить на вопрос в коментах кода
Д'якон
Потому что
!!IF:Wy1; - нужно поставить перед !!if
Berserker
1) Нет почти таких задач, которые требовали загрузки ежесекундного таймера.

2) Будет.
Д'якон
Помогите. Объясните в чем дело? Вопрос написан в коде.
Код
!?BA0;
!!FU1234:P16/9/1/10/1;
!!IF:V2/1;
!!FU1234:P16/9/1/10/1;


!?FU1234
!!IF:V1/0;
!!BA&-2:H0/?y1;
!!BA&2:H1/?y1;
!!HEy1:Sx2/?y4 Sx4/?y5 Mx1/?y7;
!!if&y4<x3|y5<x5:;
  !!IF:V1/1;
!!en;
!!HEy1&1:Mx1/0;
!!IF:Wy1;
!!if&y7=1/x1>9/x1<41:;
!!VRy8:S1;
!!VRx1:-10;
!!DO1236/10/40/1:Py8/x1;
!!VRw1:|v1;
!!VRw1:&v1; - 1случай
!!IF:M^%W1^; - проверяем какой бит записан для магии №16 - 64
!!en;
!!if&y7=1/x1>41/x1<60;
!!VRy8:S1;
!!VRx1:-41;
!!DO1236/41/69/1:Py8/x1;
!!VRw2:|v1;
!!en;
!!IF:V2/0;

!?FU1236;
!!if&x2>0:;
!!VRx1:+x1;
!!VRx2:-1;
!!en;
!!VRv1:Sx1;








!?BA1;

!!DO1235/10/69/1:P;

!?FU1235;
!!BA:H0/?y1;
!!BA:H1/?y2;
!!if&x16>9/x16<41:;
!!VRy8:S1;
!!VRy9:Sx16;
!!VRy9:-10;
!!DO1236/10/40/1:Py8/y9;
!!IF:M^%V1^; - проверяем как изменяется v1 - нормально. но когда доходит до 64 то......
!!IF:Wy1;
!!VRw1:&v1; - 2-ой случай
!!IF:M^%W1^;....... выдает 0, почему?????
!!HEw1&w1=v1:Mx16/1;
!!VRw1&w1=v1:Xw1;
!!en;
gamecreator
потому что у w1 и v1 нет общих битов. как например у 2 и 5.
Д'якон
Не понял.
Хорошо, спрошу по-другому. Почему в первом случае (см. предыдущий пост) работает, а во втором нет, хотя v1 и там и там имеет одно и то же значение.
gamecreator
потому что ты присвоил w1 биты v1 и w1, т.е. v1 входит в w1.
таблица в помощь:
Код
OR            AND            XOR
0 OR 0 = 0    0 AND 0 = 0    0 XOR 0 = 0
0 OR 1 = 1    0 AND 1 = 0    0 XOR 1 = 1
1 OR 0 = 1    1 AND 0 = 0    1 XOR 0 = 1
1 OR 1 = 1    1 AND 1 = 1    1 XOR 1 = 0

в ЕРМ:
OR=!!VR#:|$;
AND=!!VR#:&$;
XOR=!!VR#:X$;

Добавлено ([mergetime]1190474592[/mergetime]):
короче говоря, | - побитовое или (сложение), & - побитовое и (умножение), XOR - это или отнять и
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.