Перейти к основному содержимому
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.