Перейти к основному содержимому
The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.

Перегрузка поведения по умолчанию

Сортировка​

Если вы хотите, чтобы ваша разблокировка была на самом верху меню, выставите свойства SortingOrder и SortingIndex.

Разблокировки сначала сортируются по своим SortingOrder, затем по своим состояниям (разблокирована, доступна для покупки, доступна и заблокирована), и затем по своим SortingIndex. Вы можете проигнорировать сортировку по состоянию, выставив IgnoreStateSorting на true.

Вот пример того как это работает:

  • SortingOrder = -400:
    • Unlocked:
      • SortingIndex = -3;
      • SortingIndex = 1;
      • SortingIndex = 2;
    • Purchasable:
      • ...
    • Available:
      • ...
    • Locked:
      • ...
  • SortingOrder = -3:
    • ...
  • SortingOrder = 0 (ванильные разблокировки идут тут):
    • ...
  • SortingOrder = 1:
    • ...
  • SortingOrder = 500:
    • ...
предупреждение

Меню может стать странным или даже крашнуться, если не у всех разблокировок на текущем SortingOrder IgnoreStateSorting стоит на одном и том же значении. Так что убедитесь, что у всех других разблокировок IgnoreStateSorting стоит на true тоже.

Перегружаемые методы​

UnlockWrapper​

UnlockWrapper.cs
// вызывается когда разблокировка инициализируется и интегрируется в игру
public virtual void SetupUnlock() { }

// вызывается довольно часто для определения, можно ли открыть её прямо сейчас
public virtual void UpdateUnlock()
{
if ((Unlock.nowAvailable = !Unlock.unlocked && CanBeUnlocked()) && UnlockCost is 0)
gc.unlocks.DoUnlockForced(Name, Type);
}

// определяет можно ли открыть разблокировку прямо сейчас
public virtual bool CanBeUnlocked() => UnlockCost > -1
&& Unlock.prerequisites.TrueForAll(c => gc.sessionDataBig.unlocks.Exists(u => u.unlockName == c && u.unlocked));

// получает сырое название разблокировки, без богатого текста, стоимостей и значений
public virtual string GetName() => gc.nameDB.GetName(Name, Unlock.unlockNameType);

// получает сырое описание разблокировки, без богатого текста, стоимостей и значений
public virtual string GetDescription() => gc.nameDB.GetName(Name, Unlock.unlockDescriptionType);

// получает изображение разблокировки (отображается в меню)
public virtual Sprite GetImage() => RogueFramework.ExtraSprites.TryGetValue(Name, out Sprite image) ? image;
Совет от профи

Вы можете посмотреть как эти методы реализованы в исходном коде RogueLibs.

DisplayedUnlock​

DisplayedUnlock.cs
// вызывается при обновлении кнопки. `UpdateUnlock` вызывается прямо перед этим.
public virtual void UpdateButton() => UpdateButton(IsEnabled, UnlockButtonState.Selected, UnlockButtonState.Normal);

protected void UpdateButton(bool isEnabledOrSelected, UnlockButtonState selected, UnlockButtonState normal)
{
Text = GetFancyName();
State = IsUnlocked ? isEnabledOrSelected ? selected : normal
: Unlock.nowAvailable && UnlockCost > -1 ? UnlockButtonState.Purchasable
: UnlockButtonState.Locked;
}

// вызывается при нажатии кнопки. Смотрите реализации других разблокировок.
public abstract void OnPushedButton();

// получает "красивое" название разблокировки, с богатым текстом, стоимостями и очками
public virtual string GetFancyName()
{
/* Куча всего, смотрите исходный код RogueLibs */
}

// получает "красивое" описание разблокировки, с богатым текстом, несовместимыми разблокировками, требованиями и рекоммендациями
public virtual string GetFancyDescription()
{
/* Куча всего, смотрите исходный код RogueLibs */
}
Совет от профи

Вы можете посмотреть как эти методы реализованы в исходном коде RogueLibs.

Примеры​

Допустим, вы хотите сделать предмет под названием Подарок, и у него есть 3 разных спрайта.

Во-первых, вам надо создать класс разблокировки наследующий от ItemUnlock:

PresentUnlock.cs
public class PresentUnlock : ItemUnlock
{
}

Теперь вы можете перегрузить метод GetImage класса DisplayedUnlock:

PresentUnlock.cs
public class PresentUnlock : ItemUnlock
{
public override Sprite GetImage()
{
int rnd = new System.Random().Next(3) + 1;
return gc.gameResources.itemDic[$"Present{rnd}"];
}
}

Потом просто используйте вашу кастомную разблокировку в инициализации кастомного предмета:

Present.cs
public class Present : CustomItem, IItemUsable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomItem<Present>()
.WithName(new CustomNameInfo("Present"))
.WithDescription(new CustomNameInfo("Open it!"))
.WithSprite(Properties.Resources.Present)
.WithUnlock(new PresentUnlock
{
UnlockCost = 5,
CharacterCreationCost = 3,
LoadoutCost = 3
});
}
}

The project's repository is archived as part of the GitHub Archive Program. RogueLibs' code and the documentation will no longer be updated.