Сейчас 02:24:31 Пятница, 29 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Система] FICS
Ty3uKДата: Пятница, 23 Марта 2012, 09:55:48 | Сообщение # 1
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Прошу шарящих людей оценить код и сказать, где я дурак и можно ли проще. Структуры прошу не предлагать =/ Заранее всем спасибо. Если кто-то не сможет понять принцип работы - я объясню.
Code
define <trigger gg_trg_FICS_Core = null>;

library Core initializer Init
{

       include "cj_types_priv.j";

       define
       {
           private minBound = -2147483647
           private maxBound = 2147483647
           <dbg>(s) = BJDebugMsg(s)
       };

       private constant hashtable hash = InitHashtable();
       private int itemIndex = -2147483647;
       private int recipeIndex = 1;
       private bool isLastItemPicked = true;
          
//                    Aditional functions                            //

       private void SimError (player p, string msg)
       {
           sound s = CreateSoundFromLabel("InterfaceError",false,false,false,10,10);
           if GetLocalPlayer() == p
           {
               ClearTextMessages();
               DisplayTimedTextToPlayer(p,.52,-1.,2.,"|cffffcc00"+msg+"|r");
               StartSound(s);
               KillSoundWhenDone(s);
           };
           flush locals;
       };
          
       private string B2S(bool b)
       {
           if b
           {
               return "true";
           else
               return "false";
           };
       };

       private int getNormalItemType(int dummy)
       {
           for(int i=minBound;i<itemIndex;i++)
           {
               if LoadInteger(hash, i, 0) == dummy
               {
                   return LoadInteger(hash, i, 1)
               };
           };
           return 0;
       };
          
       private int getDefaultCharges(int dummy)
       {
           for(int i=minBound;i<itemIndex;i++)
           {
               if LoadInteger(hash, i, 0) == dummy
               {
                   return LoadInteger(hash, i, 2)
               };
           };
           return 0;
       };
          
       private int getDummyItemType(int normal)
       {
           for(int i=minBound;i<itemIndex;i++)
           {
               if LoadInteger(hash, i, 1) == normal
               {
                   return LoadInteger(hash, i, 0)
               };
           };
           return 0;
       };
          
       private bool haveEmptySlot(unit u)
       {
           for(int i=0;i<=5;i++)
           {
               if UnitItemInSlot(u, i) == null {return true};
           };
           return false;
       };
          
       private int recipeGetComponent(int recipe)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if LoadInteger(hash, i, 0) == recipe {return LoadInteger(hash, i, 1)};
           };
           return 0;
       };
          
       private int recipeGetCount(int recipe)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if LoadInteger(hash, i, 0) == recipe {return LoadInteger(hash, i, 2)};
           };
           return 0;
       };
          
       private int recipeGetFullItem(int recipe)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if LoadInteger(hash, i, 0) == recipe {return LoadInteger(hash, i, 3)};
           };
           return 0;
       };
          
       private bool isItemRecipe(int id)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if id == LoadInteger(hash, i, 0) {return true};
           };
           return false;
       };
          
       private bool isItemNormal(int id)
       {
           for(int i=minBound;i<=itemIndex;i++)
           {
               if id == LoadInteger(hash, i, 1) {return true};
           };
           return false;
       };
          
       private bool isRecipeOnetype(int recipe)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if recipe == LoadInteger(hash, i, 0) {return LoadBoolean(hash, i, -1)};
           };
           return false;
       };
          
       private bool isItemComponent(int component)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if LoadBoolean(hash, i, -1) && LoadInteger(hash, i, 1) == component {return true};
           };
           return false;
       };
          
       private bool isRecipeSaved(int recipe)
       {
           for(int i=0;i<=recipeIndex;i++)
           {
               if LoadInteger(hash, i, 0) == recipe {return true};
           };
           return false;
       };
          
       private bool isItemSaved(int it)
       {
           for(int i=minBound;i<=itemIndex;i++)
           {
               if LoadInteger(hash, i, 0) == it {return true};
           };
           return false;
       };
          
       private bool isRecipeCompleted(unit u, int recipe, bool empty)
       {
           int component = recipeGetComponent(recipe), count = recipeGetCount(recipe), full = recipeGetFullItem(recipe), curCount = 0;
           for(int i=0;i<6;i++)
           {
               if GetItemTypeId(UnitItemInSlot(u, i)) == component {curCount++};
           };
           if !empty && !isLastItemPicked && curCount == count - 1 {curCount++};
           flush locals;
           return curCount == count
       };
          
//                    Main functions                            //
          
       private bool modifyCharges(unit u, int id, int startCharges, bool empty)
       {
           item it, t;
           int charges = 0;
           if startCharges > 0
           {
               t = CreateItem(id, GetWidgetX(u), GetWidgetY(u));
               for(int i=0;i<=5;i++)
               {
                   it = UnitItemInSlot(u, i);
                   if GetItemTypeId(it) == id {charges += GetItemCharges(it); RemoveItem(it)};
               };
               SetItemCharges(t, charges);
               if !empty {SetItemCharges(t, charges+startCharges)};
               UnitAddItem(u, t);
           };
           flush locals;
           if charges > 0 {return true};
           return false;
       };
          
       private void saveItem(int dummy, int normal, int defaultCharges)
       {
           if !isItemSaved(dummy) && itemIndex < 0
           {
               SaveInteger(hash, itemIndex, 0, dummy);
               SaveInteger(hash, itemIndex, 1, normal);
               SaveInteger(hash, itemIndex, 2, defaultCharges);
               itemIndex++;
           };
       };
          
       private void saveOnetypeRecipe(int recipe, int component, int count, int full)
       {
           if !isRecipeSaved(recipe) && recipeIndex <= maxBound
           {
               SaveBoolean(hash, recipeIndex, -1, true);
               SaveInteger(hash, recipeIndex, 0, recipe);
               SaveInteger(hash, recipeIndex, 1, component);
               SaveInteger(hash, recipeIndex, 2, count);
               SaveInteger(hash, recipeIndex, 3, full);
               recipeIndex++;
           };
       };
          
       private void makeOnetypeRecipe(unit u, int recipe)
       {
           int component = recipeGetComponent(recipe), full = recipeGetFullItem(recipe);
           item t;
           for(int i=0;i<6;i++)
           {
               t = UnitItemInSlot(u, i);
               if GetItemTypeId(t) == component {RemoveItem(t)};
           };
           UnitAddItemById(u, full);
           DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Items\\AIam\\AIamTarget.mdl", GetWidgetX(u), GetWidgetY(u)));
           flush locals;
       };
          
       private void InitDatabase()
       {
           saveItem('I000', 'rat6', 0);
           saveItem('I002', 'clfm', 0);
           saveItem('I003', 'clsd', 0);
           saveItem('I004', 'pghe', 5);
           saveItem('I005', 'pgma', 10);
           saveOnetypeRecipe('rat6', 'rat6', 5, 'ratc');
       };
          
       private bool Act()
       {
           unit u = GetTriggerUnit();
           int id = GetItemTypeId(GetManipulatedItem()), normal = getNormalItemType(id);
           bool empty = haveEmptySlot(u);
           isLastItemPicked = isItemNormal(id);
           DisableTrigger(GetTriggeringTrigger());
           if empty {UnitAddItemById(u, normal)};
           if isItemNormal(id) && isItemComponent(id) && isRecipeCompleted(u, id, empty)
           {
               makeOnetypeRecipe(u, id);
           elseif isItemNormal(id)
               modifyCharges(u, id, getDefaultCharges(getDummyItemType(id)), empty);
           elseif isItemComponent(normal) && isRecipeCompleted(u, normal, empty)
               makeOnetypeRecipe(u, normal)
           elseif !isItemComponent(normal)
               modifyCharges(u, normal, getDefaultCharges(id), empty);
           elseif !empty
               CreateItem(normal, GetWidgetX(u), GetWidgetY(u));
               SimError(GetTriggerPlayer(), "Inventory is full.");
           };
           EnableTrigger(GetTriggeringTrigger());
           flush locals;
           return false;
       };
          
       private void Init()
       {
           trigger t = CreateTrigger();
           for(int i=0;i<12;i++)
           {
               TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_PICKUP_ITEM, null);
           };
           InitDatabase();
           TriggerAddCondition(t, Condition(function Act));
           flush locals;
           dbg("5 когтей для сборки рецепта\nКучу бутылок для теста сложения зарядов.\nВсе работает даже при полном инвентаре");
       };
          
};
В данный момент система умеет корректно складывать заряды (в том числе при полном инвентаре) и собирать однотипные предметы в рецепт (тоже при полном инвентаре)


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


Сообщение отредактировал Ty3uK - Пятница, 23 Марта 2012, 10:06:03
 

[DUОS]Дата: Пятница, 23 Марта 2012, 12:45:28 | Сообщение # 2
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
Ty3uK,
Прошу шарящих людей писать на шарящем Jass2, а то это обучение слишком далеко зашло уже.


НУ И ЧТО ТЕПЕРЬ?


Кликайте на дракошку ;)
 

Ty3uKДата: Пятница, 23 Марта 2012, 12:46:13 | Сообщение # 3
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
[DUОS], я еще и половины всего не узнал

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


Сообщение отредактировал Ty3uK - Пятница, 23 Марта 2012, 12:46:24
 

DreiiДата: Пятница, 23 Марта 2012, 18:05:29 | Сообщение # 4
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
FICS дуоса на сджассе\вджассе?

 

Ty3uKДата: Пятница, 23 Марта 2012, 18:24:05 | Сообщение # 5
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Quote (Ty3uK)
FICS (попытка написать нечто похожее)


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

DragoNДата: Пятница, 23 Марта 2012, 21:51:02 | Сообщение # 6
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (|DUОS|)

Прошу шарящих людей писать на шарящем Jass2, а то это обучение слишком далеко зашло уже.

lol


El Psy Congroo
 

Ty3uKДата: Пятница, 23 Марта 2012, 21:51:48 | Сообщение # 7
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Драгон, что скажешь, код не говно?

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

FaionДата: Суббота, 24 Марта 2012, 16:25:24 | Сообщение # 8
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Нафиг после конструкий if , циклов и после объявления функций ставишь ";" то >_< Нафиг вообще ставишь? Очевидно что ты не юзер других языков, дотнетов и прочих. Ради понта что ли?=)

А так вроде норм.


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

DreiiДата: Суббота, 24 Марта 2012, 17:16:42 | Сообщение # 9
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Faion, вроде новый адик требует ;

 

Ty3uKДата: Суббота, 24 Марта 2012, 17:31:54 | Сообщение # 10
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Не требует, просто привычка. Никаких понтов, мне больше делать нечего

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

FaionДата: Суббота, 24 Марта 2012, 17:44:58 | Сообщение # 11
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
Quote (Dreii)
Faion, вроде новый адик требует ;


Сомневаюсь. ";" это тот же "\n" как бэ. Нет необходимости его "требовать"


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

Ty3uKДата: Воскресенье, 25 Марта 2012, 09:35:23 | Сообщение # 12
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Привык в яваскрипте так писать, вот и все

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

SirNikolasДата: Понедельник, 26 Марта 2012, 18:09:47 | Сообщение # 13
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Я не понял, оно что, не работает для рецептов, состоящих из разнотипных компонентов?

 

Ty3uKДата: Понедельник, 26 Марта 2012, 18:19:38 | Сообщение # 14
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Пока да

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

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

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