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