![](/images/design_new/tl.png) |
|
![](/images/design_new/tr.png) |
|
[Вопрос] Автоматизированный перегруз define-ов
|
|
Hexing | Дата: Воскресенье, 01 Апреля 2012, 18:58:08 | Сообщение # 1 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| Code define setAr(ar, i1, c1) = { DROP[ar].ITEM_TYPES[0] = i1; DROP[ar].ITEM_CHANCE[0] = c1; } define setAr(ar, i1, c1, i2, c2) = { DROP[ar].ITEM_TYPES[0] = i1; DROP[ar].ITEM_CHANCE[0] = c1; DROP[ar].ITEM_TYPES[1] = i2; DROP[ar].ITEM_CHANCE[1] = c2; } define setAr(ar, i1, c1, i2, c2, i3, c3) = { DROP[ar].ITEM_TYPES[0] = i1; DROP[ar].ITEM_CHANCE[0] = c1; DROP[ar].ITEM_TYPES[1] = i2; DROP[ar].ITEM_CHANCE[1] = c2; DROP[ar].ITEM_TYPES[2] = i3; DROP[ar].ITEM_CHANCE[2] = c3; } define setAr(ar, i1, c1, i2, c2, i3, c3, i4, c4) = { DROP[ar].ITEM_TYPES[0] = i1; DROP[ar].ITEM_CHANCE[0] = c1; DROP[ar].ITEM_TYPES[1] = i2; DROP[ar].ITEM_CHANCE[1] = c2; DROP[ar].ITEM_TYPES[2] = i3; DROP[ar].ITEM_CHANCE[2] = c3; DROP[ar].ITEM_TYPES[3] = i4; DROP[ar].ITEM_CHANCE[3] = c4; } define setAr(ar, i1, c1, i2, c2, i3, c3, i4, c4, i5, c5) = { DROP[ar].ITEM_TYPES[0] = i1; DROP[ar].ITEM_CHANCE[0] = c1; DROP[ar].ITEM_TYPES[1] = i2; DROP[ar].ITEM_CHANCE[1] = c2; DROP[ar].ITEM_TYPES[2] = i3; DROP[ar].ITEM_CHANCE[2] = c3; DROP[ar].ITEM_TYPES[3] = i4; DROP[ar].ITEM_CHANCE[3] = c4; DROP[ar].ITEM_TYPES[4] = i5; DROP[ar].ITEM_CHANCE[4] = c5; }
struct CreepDrop { int array ITEM_TYPES; real array ITEM_CHANCE; int ITEM_TOTAL; }
void initDrop() { CreepDrop array DROP; DROP[0] = CreepDrop.create(); setAr(0, '', 10.0, '', 10.0, '', 15.0, '', 25.0, '', 15.0); DROP[0].ITEM_TOTAL = 5; }
void CreepDrop() { unit u = GetTriggerUnit(); real x = GetUnitX(u); real y = GetUnitY(u); int ut = GetUnitTypeId(u); int i = 0; int ui; real drops = 1.0; real seed = GetRandomReal(0.0, 100.0); if(ut == 'nban' or ut == 'n00L') { ui = 0; } else if(ut == 'nbrg') { ui = 1; } else if(ut == 'nrog') { ui = 2; } else if(ut == 'n004') { ui = 3; } whilenot(i==DROP[ui].ITEM_TOTAL) { if(GetRandomReal(0.0, 100.0)*drops <= DROP[ui].ITEM_CHANCE[i]) { CreateItem(DROP[ui].ITEM_TYPES[i], x, y); drops = drops*1.5; } i++; } } собственно недаписанная система дропа, не хочу юзать системки в которых всё это красиво добавляется тригами или функами, мне дефайны сойдут, а можно будет еще и 'item' коды вынести в define-названия, будет норм, так вот вопрос: вместо того чтобы перегружать define setAr() миллион раз в зависимости от кол-ва агрументов, есть ли способ сделать это иначе? Типа func(a, b, ...) ?
Сообщение отредактировал Hexing - Воскресенье, 01 Апреля 2012, 18:59:15 |
|
|
|
Ty3uK | Дата: Воскресенье, 01 Апреля 2012, 19:06:16 | Сообщение # 2 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| Текстмакрос, не?
|
|
|
|
Hexing | Дата: Воскресенье, 01 Апреля 2012, 19:07:11 | Сообщение # 3 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| чёрт бы вас побрал Ватсон, именно! Это же очевидно! Спасибо
|
|
|
|
Ty3uK | Дата: Воскресенье, 01 Апреля 2012, 19:08:11 | Сообщение # 4 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| Да не за что, обращайтесь
|
|
|
|
Hexing | Дата: Воскресенье, 01 Апреля 2012, 19:10:14 | Сообщение # 5 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| а может пример? не могу сообразить как запилить, vjass азбука под рукой, ссылок не надо
|
|
|
|
Ty3uK | Дата: Воскресенье, 01 Апреля 2012, 19:11:01 | Сообщение # 6 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| А вот тут жди драгона или ника, я в этом не шарю
|
|
|
|
Hexing | Дата: Воскресенье, 01 Апреля 2012, 19:12:13 | Сообщение # 7 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| Code void initDrop() { CreepDrop array DROP; DROP[0] = CreepDrop.create(); setAr(0, 'pmna', 7.0, 'penr', 8.0, 'ward', 1.0, 'ratc', 5.0, 'manh', 25.0); DROP[0].ITEM_TOTAL = 5; } суть в том, что одной строчкой описываешь массивы вероятностей и самих предметов которые могут выпасть к сожалению это не с++ чтоб написать int array a = {10, 20 ,30 ,50 ,0}, приходится возиться с дефайнамиДобавлено (01 Апрель 2012, 19:12:13) --------------------------------------------- okay
|
|
|
|
Ty3uK | Дата: Воскресенье, 01 Апреля 2012, 19:14:05 | Сообщение # 8 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| Почему бы не вынести функцию, в которой ты будешь давать массиву значения?
|
|
|
|
Hexing | Дата: Воскресенье, 01 Апреля 2012, 19:17:48 | Сообщение # 9 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| видимо придётся, просто хотелось в одну строчку чтобы влезало перечислением... ладно, спасибо, может драгон или ник что посоветуют
|
|
|
|
SirNikolas | Дата: Понедельник, 02 Апреля 2012, 11:33:47 | Сообщение # 10 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки: ![](/scripts/images/ic_info.gif)
| Нет, макросы в cJASS переделываются в те же самые define'ы (ну, почти). А помещать одни define'ы внутрь других нельзя.
Насчет "ну, почти": если есть объявление:Code define abc = DoNothing() , его можно вызвать следующими способами:Code abc//Стиль cJass //! runtextmacro abc()//Стиль vJass //! runtextmacro abc//Адаптация vJass под cJass Но если abc объявлено как макрос, первый способ приведет к ошибке.Quote (Hexing) Code if(ut == 'nban' or ut == 'n00L') { ui = 0; } else if(ut == 'nbrg') { ui = 1; } else if(ut == 'nrog') { ui = 2; } else if(ut == 'n004') { ui = 3; } elseif слитно же.Quote (Hexing) setAr(0, '', 10.0, '', 10.0, '', 15.0, '', 25.0, '', 15.0); И оно работает? С пустыми одинарными кавычками?
|
|
|
|
Hexing | Дата: Понедельник, 02 Апреля 2012, 12:14:15 | Сообщение # 11 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| Quote (SirNikolas) elseif слитно же. угу Quote (SirNikolas) И оно работает? С пустыми одинарными кавычками? нет, код только начал писать, а я когда набросок кода делаю, он мега кривой, а потом уже фиксю Quote (SirNikolas) Насчет "ну, почти": если есть объявление: Code define abc = DoNothing() , его можно вызвать следующими способами: Code abc//Стиль cJass //! runtextmacro abc()//Стиль vJass //! runtextmacro abc//Адаптация vJass под cJass Но если abc объявлено как макрос, первый способ приведет к ошибке. интересно, спс Quote (SirNikolas) А помещать одни define'ы внутрь других нельзя. грустька сделал отдельной функцией, всем спасибо
|
|
|
|
SirNikolas | Дата: Понедельник, 02 Апреля 2012, 12:27:38 | Сообщение # 12 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки: ![](/scripts/images/ic_info.gif)
| Извиняюсь, жутко накосячил. Все, что я написал, работало так на старом AdicHelper'е. Теперь define'ы и макросы не являются взаимозаменяемыми. Можно лишь опускать скобки при вызове текстмакроса без аргументов.
|
|
|
|
Hexing | Дата: Понедельник, 02 Апреля 2012, 12:33:15 | Сообщение # 13 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| Quote (SirNikolas) Извиняюсь, жутко накосячил. Все, что я написал, работало так на старом AdicHelper'е. Теперь define'ы и макросы не являются взаимозаменяемыми. Можно лишь опускать скобки при вызове текстмакроса без аргументов. ок получилось так: Code struct Drop { int array ITEM_TYPES[10]; real array ITEM_CHANCE[10]; int ITEM_TOTAL = 0; method addItem takes int it, real chance returns nothing this.ITEM_TYPES[this.ITEM_TOTAL]=it; this.ITEM_CHANCE[this.ITEM_TOTAL]=chance; this.ITEM_TOTAL++; endmethod }
Drop drop, DROP_1;
void initDrop() { DROP_1 = Drop.create(); DROP_1.addItem('manh', 7.0); DROP_1.addItem('manh', 8.0); DROP_1.addItem('manh', 1.0); DROP_1.addItem('manh', 5.0); DROP_1.addItem('manh', 25.0); // CreepDrop array DROP; //DROP[0] = CreepDrop.create(); //setAr(0, 'pmna', 7.0, 'penr', 8.0, 'ward', 1.0, 'ratc', 5.0, 'manh', 25.0); //DROP[0].ITEM_TOTAL = 5; }
void CreepDrop() { unit u = GetTriggerUnit(); int ut = GetUnitTypeId(u); real x = GetUnitX(u); real y = GetUnitY(u); int i = 0; real drops = 1.0; drop = DROP_1; if(ut == 'nban' or ut == 'n00L') { //default } elseif(ut == 'nbrg') { //ui = 1; } elseif(ut == 'nrog') { //ui = 2; } elseif(ut == 'n004') { //ui = 3; } whilenot(i==drop.ITEM_TOTAL) { if(GetRandomReal(0.0, 100.0)*drops <= drop.ITEM_CHANCE[i]) { CreateItem(drop.ITEM_TYPES[i], x, y); drops = drops*1.5; } i++; } u=null; } а можно както сделать, чтобы в локальных массивах в структуре было оптимальное кол-во элементов? не везде дроп-список из 10 шмоток будет же
|
|
|
|
SirNikolas | Дата: Понедельник, 02 Апреля 2012, 12:54:38 | Сообщение # 14 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки: ![](/scripts/images/ic_info.gif)
| Связный список? Добавлено (02 Апрель 2012, 12:53:29) ---------------------------------------------
Code //! textmacro DeclareList takes type struct List_$type$ { $type$ value; thistype next = 0; }; //! endtextmacro Добавлено (02 Апрель 2012, 12:54:38) ---------------------------------------------
Quote (Hexing) method addItem takes int it, real chance returns nothing ... endmethod void addItem(int it, real chance) { ... }
|
|
|
|
Hexing | Дата: Понедельник, 02 Апреля 2012, 16:42:56 | Сообщение # 15 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| Quote (SirNikolas) void addItem(int it, real chance) { ... } угу, тото он у меня void method() не проглатывал, спс
Quote (SirNikolas) /! textmacro DeclareList takes type struct List_$type$ { $type$ value; thistype next = 0; }; //! endtextmacro не могу сообразить как это применить?
|
|
|
|
Ty3uK | Дата: Понедельник, 02 Апреля 2012, 16:48:16 | Сообщение # 16 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| Бтв, мне кто-нибудь может объяснить, для чего можно использовать текстмакросы? Не хочу отдельную тему создавать
|
|
|
|
Hexing | Дата: Понедельник, 02 Апреля 2012, 16:58:30 | Сообщение # 17 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| Ty3uK, скажем так, vJass, cJass, макросы, дефайны, структуры и всё это нужно лишь для того, чтобы меньше кода писать ручками ![buba](http://warcraft3ft.info/image/smiles/buba.gif) Добавлено (02 Апрель 2012, 16:58:30) --------------------------------------------- ой куда текст полетел омг
|
|
|
|
SirNikolas | Дата: Понедельник, 02 Апреля 2012, 16:58:34 | Сообщение # 18 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки: ![](/scripts/images/ic_info.gif)
| Связный список.Code //! textmacro DeclarePair takes T1, T2 struct pair_$T1$_$T2$ { $T1$ first; $T2$ second; }; //! endtextmacro //! textmacro DeclareList takes type struct List_$type$ { $type$ value; thistype next = 0; }; //! endtextmacro
//! runtextmacro DeclarePair("int", "real") //! runtextmacro DeclareList("pair_int_real")
struct Drop { List_pair_int_real items = 0;
//Деструктор класса void destroy() { whilenot items == 0 { items.value.destroy(); items.destroy(); items = items.next; } deallocate(); }
void addItem(int it, real chance) { List_pair_int_real l = items; if l == 0 { items = List_pair_int_real.create(); items.value = pair_int_real.create(); items.value.first = it; items.value.second = chance; } else { whilenot l.next == 0 { l = l.next; } l.next = List_pair_int_real.create(); l.next.value = pair_int_real.create(); l.next.value.first = it; l.next.value.second = chance; } } };
|
|
|
|
Ty3uK | Дата: Понедельник, 02 Апреля 2012, 17:03:56 | Сообщение # 19 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| И во что это транслируется?
|
|
|
|
Hexing | Дата: Понедельник, 02 Апреля 2012, 17:07:19 | Сообщение # 20 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| ааа, понял, спасибо огромное, SirNikolas!
|
|
|
|
SirNikolas | Дата: Понедельник, 02 Апреля 2012, 17:07:41 | Сообщение # 21 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки: ![](/scripts/images/ic_info.gif)
| Quote (Ty3uK) Бтв, мне кто-нибудь может объяснить, для чего можно использовать текстмакросы? Например, как я написал выше, в качестве шаблонов C++ (создание структур-контейнеров произвольных типов (вспоминаем Dictionary )). Либо мы хотим сделать практически одинаковые действия (три - четыре строки) четыре раза. Функцию делать неохота, цикл тоже. А в развернутом виде мозолит глаза. И вот решение:Code //! textmacro LibraryName__ForLazyUs takes someArg //... //! endtextmacro //! runtextmacro LibraryName__ForLazyUs("0") //! runtextmacro LibraryName__ForLazyUs("1") //! runtextmacro LibraryName__ForLazyUs("2") //! runtextmacro LibraryName__ForLazyUs("3")
|
|
|
|
Hexing | Дата: Понедельник, 02 Апреля 2012, 17:08:07 | Сообщение # 22 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки: ![](/scripts/images/ic_info.gif)
| p.s. Code public class Node { private int element; private Node next; public int getElement(){ return element; } public void setElement(int e){ element = e; } public Node getNext() { return next; } public void setNext(Node n) { next = n; } } гораздо легче для восприятия, помогает понять суть
|
|
|
|
Ty3uK | Дата: Понедельник, 02 Апреля 2012, 17:08:57 | Сообщение # 23 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| И парсер подставляет их в код в том месте, где они вызваны? Или что? D:
|
|
|
|
SirNikolas | Дата: Понедельник, 02 Апреля 2012, 17:13:28 | Сообщение # 24 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки: ![](/scripts/images/ic_info.gif)
| Quote (Ty3uK) И парсер подставляет их в код в том месте, где они вызваны? Ну да.
В том примере с циферками можно сделать еще проще:Code #for i(0, 3) //... #endfor
|
|
|
|
Ty3uK | Дата: Понедельник, 02 Апреля 2012, 17:16:03 | Сообщение # 25 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки: ![](/scripts/images/ic_info.gif)
| Окей, мне тогда для этого проще Адика юзать- привычнее ![:)](http://warcraft3ft.info/image/smiles/smile.gif) Добавлено (02 Апрель 2012, 17:16:03) --------------------------------------------- Спасибо за разъяснение, Ник :3
|
|
|
|
|
|
![](/images/design_new/bl.png) |
|
![](/images/design_new/br.png) |
|
|