Сегодня был поставлен уже четвёртый по счёту дизайн сайта Ternox.com. На сей раз этот дизайн посвящён тематике StarCraft 2. Впрочем, это далеко не означает, что сайт будет исключительно по игростроению этой игры. Вовсе нет. Личное мнение: Стиль получился однозначно удачнее и светлее предыдущего. Исправлены кое-какие недоработки старого дизайна, а также оптимизирована загрузка сайта. Хотя нет предела совершенству, поэтому буду стремиться к лучшему.
Что нового в 4.0: - Реформирован раздел StarCraft 2 - Добавлены новые надписи под названием сайта в шапке - Шапка теперь включает мини-профиль и отличную форму входа - Новая, более мягкая цветовая гамма
и многое другое...Ждём отзывов, багов и предложений по Ternox 4.1 С уважением ко всем пользователям, Администрация T-Corp.
Название:Full-Inventory Crafting System Авторы:bowser499 aka [DUOS] and SirNikolas Тип исполнения:JASS2 and cJass Тестовая карта:Присутствует Минимальный патч:Любой
Одна из нашумевших наработок, которую мало кто доводил до конца конкретно на JASS2. Из-за крайней сложности её создания решил выложить, так как это решит много вопросов, с этим связанных.
Возможности:
Сбор при полном инвентаре (рецепты максимум до 7 слотов);
Сбор с участием идентичных предметов;
Смена иконки предмета из магазина и предмета в инвентаре (покупаешь рецепт с иконкой сборного предмета - в инвентарь идет свиток);
Смена предмета на деактивированный предмет (любой, кто берет предмет, не принадлежащий ему, не получает свойств предмета);
Сложение "зарядов" предметов (банка с 3 зарядами + банка с 8 зарядами = банка с 11 зарядами).
База данных предметов и рецептов формируется по следующему принципу:
1. Создаются в РО три копии одного и того же предмета:
Normal (обычный предмет, находится у купившего)
Rune (используется мгновенно, находится в магазине и лежит на земле)
Disabled (находится у того, кто "украл" предмет)
2. Rune-копии добавляются в магазины. 3. В триггере инициализации регистрируются предметы путем вызова для каждого FICS_Register(rawNormal, rawRune, rawDisabled, goldCost, lumberCost). Каждому предмету дается порядковый номер, начиная с единицы. 4. После заполнения всех предметов вызывается функция FICS_Proceed(). 5. Наконец, составляется список рецептов. Вызывается функция FICS_RegisterN(resultId, id0, id1, ..., idN), где N - количество ингредиентов, а resultId, id0, id1, ..., id6 - порядковые номера предметов.
Импорт наработки:
Версия JASS2: 1. Скопируйте основной код карты FICS v1.5.w3x в основной код своей карты. 2. Скопируйте триггер "FICS". 3. Скопируйте все переменные (для облегчения задачи можно скопировать, а затем удалить триггер "FICS variables", если включено автоматическое создание переменных).
Версия cJass: 1. Скопируйте триггер "FICS cJass" (и разблокируйте его).
private constant timer T = CreateTimer(); private item Dropped[ ]; private int DropNum[ ], Temp[21]; private int DropCount = 0; private int Ids[ ], Num[ ], Length = 0; private int Items[500][5], Recipes[256][8]; private int ItemCount = 0, RecipeCount = 0; private int FirstList[ ], LastList[ ]; private int Recipe[ ], Next[ ], ListCount = 0; private bool Flag = true;
public int Register(int id, int rune, int dis, int gcost, int lcost) { ItemCount++; Ids [Length]= id; Ids[Length + 1] = rune; Ids[Length + 2] = dis; Num [Length]= ItemCount; Num[Length + 1] = ItemCount; Num[Length + 2] = ItemCount; Length += 3; Items[ItemCount][0] = id; Items[ItemCount][1] = rune; Items[ItemCount][2] = dis; Items[ItemCount][3] = gcost; Items[ItemCount][4] = lcost; return ItemCount; }
//Сортировка расческой public void Proceed() { int jump = Length; bool end = true; whilenot jump == 1 && end { if jump > 1 { jump = R2I(jump * .802); } end = true; for (int i = 0; i + jump < Length; i++) { if Ids [i]> Ids[i + jump] { int t = Ids[i]; Ids [i]= Ids[i + jump]; Ids[i + jump] = t; t = Num[i]; Num [i]= Num[i + jump]; Num[i + jump] = t; end = false; } } } }
private int BinSearch(int id) { int first = 0, last = Length; if id >= Ids[0] && id <= Ids[last - 1] { whilenot first >= last { int mid = (first + last) / 2; if id <= Ids [mid]{ last = mid; } else { first = mid + 1; } } if id == Ids [last]{ return Num[last]; } } return 0; }
public void Register7(int result, int i0, int i1, int i2, int i3, int i4, int i5, int i6) { #for j(0, 6) Temp [j]= i##j; #endfor RecipeCount++; //Записываем в Recipes сортированные по невозрастанию индексы for (int i = 0) { if Temp [i]> 0 { if Temp[i]:LastList == 0 || Temp[i]:LastList:Recipe != RecipeCount { ListCount++; if Temp[i]:LastList == 0 { Temp[i]:FirstList = ListCount; } else { Temp[i]:LastList:Next = ListCount; } Temp[i]:LastList = ListCount; Temp[i]:LastList:Recipe = RecipeCount; Temp[i]:LastList:Next = 0; } int j = i; whilenot j == 0 || Recipes[RecipeCount][j - 1] >= Temp [i]{ Recipes[RecipeCount] [j]= Recipes[RecipeCount][j - 1]; j--; } Recipes[RecipeCount] [j]= Temp[i]; } exitwhen i == 6; i++; } Recipes[RecipeCount][7] = result; }
public void Register6(int result, int i0, int i1, int i2, int i3, int i4, int i5) { Register7(result, i0, i1, i2, i3, i4, i5, 0); }
public void Register5(int result, int i0, int i1, int i2, int i3, int i4) { Register6(result, i0, i1, i2, i3, i4, 0); }
public void Register4(int result, int i0, int i1, int i2, int i3) { Register5(result, i0, i1, i2, i3, 0); }
public void Register3(int result, int i0, int i1, int i2) { Register4(result, i0, i1, i2, 0); }
public void Register2(int result, int i0, int i1) { Register3(result, i0, i1, 0); }
//Бесполезная штука, в общем-то, но такое тоже возможно public void Register1(int result, int i0) { Register2(result, i0, 0); }