Сейчас 19:10:00 Пятница, 7 февраля, 2025 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Вопрос] Автоматизированный перегруз define-ов
HexingДата: Воскресенье, 01 Апреля 2012, 18:58:08 | Сообщение # 1
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
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
Блокировки:
Текстмакрос, не?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Воскресенье, 01 Апреля 2012, 19:07:11 | Сообщение # 3
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
чёрт бы вас побрал Ватсон, именно! Это же очевидно! Спасибо ^_^

 

Ty3uKДата: Воскресенье, 01 Апреля 2012, 19:08:11 | Сообщение # 4
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Да не за что, обращайтесь :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Воскресенье, 01 Апреля 2012, 19:10:14 | Сообщение # 5
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
а может пример? не могу сообразить как запилить, vjass азбука под рукой, ссылок не надо

 

Ty3uKДата: Воскресенье, 01 Апреля 2012, 19:11:01 | Сообщение # 6
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
А вот тут жди драгона или ника, я в этом не шарю

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Воскресенье, 01 Апреля 2012, 19:12:13 | Сообщение # 7
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
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
Блокировки:
Почему бы не вынести функцию, в которой ты будешь давать массиву значения?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Воскресенье, 01 Апреля 2012, 19:17:48 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
видимо придётся, просто хотелось в одну строчку чтобы влезало перечислением... ладно, спасибо, может драгон или ник что посоветуют

 

SirNikolasДата: Понедельник, 02 Апреля 2012, 11:33:47 | Сообщение # 10
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Нет, макросы в 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
Блокировки:
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
Блокировки:
Извиняюсь, жутко накосячил. Все, что я написал, работало так на старом AdicHelper'е. Теперь define'ы и макросы не являются взаимозаменяемыми. Можно лишь опускать скобки при вызове текстмакроса без аргументов.

 

HexingДата: Понедельник, 02 Апреля 2012, 12:33:15 | Сообщение # 13
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
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
Блокировки:
Связный список?

Добавлено (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
Блокировки:
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
Блокировки:
Бтв, мне кто-нибудь может объяснить, для чего можно использовать текстмакросы? Не хочу отдельную тему создавать :)

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Понедельник, 02 Апреля 2012, 16:58:30 | Сообщение # 17
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
Ty3uK, скажем так, vJass, cJass, макросы, дефайны, структуры и всё это нужно лишь для того, чтобы меньше кода писать ручками buba

Добавлено (02 Апрель 2012, 16:58:30)
---------------------------------------------
ой куда текст полетел омг


 

SirNikolasДата: Понедельник, 02 Апреля 2012, 16:58:34 | Сообщение # 18
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Связный список.
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
Блокировки:
И во что это транслируется?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

HexingДата: Понедельник, 02 Апреля 2012, 17:07:19 | Сообщение # 20
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
ааа, понял, спасибо огромное, SirNikolas!

 

SirNikolasДата: Понедельник, 02 Апреля 2012, 17:07:41 | Сообщение # 21
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
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
Блокировки:
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
Блокировки:
И парсер подставляет их в код в том месте, где они вызваны? Или что? D:

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Понедельник, 02 Апреля 2012, 17:13:28 | Сообщение # 24
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ty3uK)
И парсер подставляет их в код в том месте, где они вызваны?
Ну да.

В том примере с циферками можно сделать еще проще:
Code
#for i(0, 3)
    //...
#endfor


 

Ty3uKДата: Понедельник, 02 Апреля 2012, 17:16:03 | Сообщение # 25
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Окей, мне тогда для этого проще Адика юзать- привычнее :)

Добавлено (02 Апрель 2012, 17:16:03)
---------------------------------------------
Спасибо за разъяснение, Ник :3


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2025 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz