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

Создаём кастомную особенность

Класс CustomTrait​

Чтобы сделать кастомную особенность, создайте класс наследующий от CustomTrait:

MyCustomTrait.cs
public class MyCustomTrait : CustomTrait
{
/* ... */
}

Вам надо реализовать только 2 метода:

MyCustomTrait.cs
public class MyCustomTrait : CustomTrait
{
public override void OnAdded() { /* ... */ }
public override void OnRemoved() { /* ... */ }
}

OnAdded вызывается когда особенность добавлена персонажу, и OnRemoved вызывается когда она убрана с персонажа.

Обновление​

Вы можете сделать свою особенность обновляемой, реализовав интерфейс ITraitUpdateable:

MyCustomTrait.cs
public class MyCustomTrait : CustomTrait, ITraitUpdateable
{
public void OnUpdated(TraitUpdatedArgs e) { /* ... */ }
}

OnUpdated работает как Update в Unity, но с выставляемым интервалом (по умолчанию, 1 секунда):

    public void OnUpdated(TraitUpdatedArgs e)
{
e.UpdateDelay = 0.5f; // 2 обновления в секунду
/* ... */
}

Инициализация​

Просто вызовите метод CreateCustomTrait с типом своей особенности в качестве параметра:

MyCustomTrait.cs
public class MyCustomTrait : CustomTrait
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomTrait<MyCustomTrait>();
}
}
примечание

Смотрите подробнее об атрибуте RLSetup здесь.

Вы можете выставить название и описание своей особенности с помощью методов WithName и WithDescription:

MyCustomTrait.cs
public class MyCustomTrait : CustomTrait
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomTrait<MyCustomTrait>()
.WithName(new CustomNameInfo("My Custom Trait"))
.WithDescription(new CustomNameInfo("My Custom Trait is very cool and does a lot of great stuff"));
}
}

То же самое можно сделать и со спрайтами и разблокировками:

MyCustomTrait.cs
public class MyCustomTrait : CustomTrait
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomTrait<MyCustomTrait>()
.WithName(new CustomNameInfo("My Custom Trait"))
.WithDescription(new CustomNameInfo("My Custom Trait is very cool and does a lot of great stuff"))
// спрайт будет отображаться только в меню (необязательно)
.WithSprite(Properties.Resources.MyCustomTrait)
.WithUnlock(new TraitUnlock { UnlockCost = 10, CharacterCreationCost = 5 });
}
}

Свойства разблокировок​

Вы можете использовать следующие свойства при инициализации TraitUnlock:

СвойствоПо умолчаниюОписание
UnlockCost0Стоимость разблокировки особенности, в наггетсах. Если выставлено на 0, разблокируется автоматически, как только все требования открыты.
CharacterCreationCost1Стоимость особенности в Редакторе персонажей, в очках.
IsAvailabletrueОпределяет, доступна ли особенность в Меню особенностей и при новом уровне. Выставьте на false, если трейт отрицательный.
IsAvailableInCCtrueОпределяет, доступна ли особенность в Редакторе персонажей.
CancellationsОпределяет какие особенности несовместимы с этой особенностью.
PrerequisitesОпределяет какие разблокировки должны быть разблокированы, чтобы открыть эту особенность.
RecommendationsПросто показывает эти разблокировки в отдельном разделе Рекомендации в меню.

Другие свойства не должны использоваться во время инициализации.

Примеры​

using System;

namespace RogueLibsCore.Test
{
public class Smoker : CustomTrait, ITraitUpdateable
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomTrait<Smoker>()
.WithName(new CustomNameInfo("Smoker"))
.WithDescription(new CustomNameInfo("Randomly cough, alerting enemies"))
.WithUnlock(new TraitUnlock { CharacterCreationCost = -4 });

RogueLibs.CreateCustomName("Smoker_Cough1", NameTypes.Dialogue, new CustomNameInfo("*Cough*"));
RogueLibs.CreateCustomName("Smoker_Cough2", NameTypes.Dialogue, new CustomNameInfo("*Cough* *CouGH*"));
RogueLibs.CreateCustomName("Smoker_Cough3", NameTypes.Dialogue, new CustomNameInfo("*coUGH* *COUgh*"));
}

public override void OnAdded() { }
public override void OnRemoved() { }
public void OnUpdated(TraitUpdatedArgs e)
{
e.UpdateDelay = 5f;

int rnd = new Random().Next(0, 5);
if (rnd == 0)
{
rnd = new Random().Next(3) + 1;
Owner.SayDialogue($"Smoker_Cough{rnd}");
gc.audioHandler.Play(Owner, VanillaAudio.AgentAnnoyed);

Noise noise = gc.spawnerMain.SpawnNoise(Owner.tr.position, 1f, Owner, "Attract", Owner);
noise.distraction = true;
}
}
}
}

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