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

Создаём кастомную катастрофу

Вы можете создавать свои кастомные катастрофы при помощи класса CustomDisaster, предоставляемый RogueLibs. Вы можете настроить название, описание катастрофы и оба сообщения, отображающиеся в начале уровня. И, конечно же, вы можете определить условия, при которых катастрофа может (или должна) случиться, и что происходит в начале и в течение этой катастрофы. Также, вы можете быстро и просто создать мутатор убирающий катастрофу из пула.

Класс CustomDisaster

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

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
/* ... */
}

Вам нужно реализовать 3 метода:

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
public override void Start() { /* ... */ }
public override void Finish() { /* ... */ }
public override IEnumerator? Updating() { /* ... */ }
}

Start вызывается когда катастрофа начинается. Finish вызывается когда катастрофа заканчивается.

Методы Start и Finish

Эти методы вызываются между уровнями, так что некоторые штуки могут быть недоступны на момент их вызова.

Updating возвращает корутину обновления катастрофы. Она начинается после оповещения о катастрофе. Она останавливается автоматически, когда катастрофа заканчивается. Если вашей катастрофе не надо обновляться, можете просто вернуть null.

Условия катастрофы

Если вы хотите чтобы ваша катастрофа появлялась только под определёнными условиями, переопределите метод Test:

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
public override bool Test()
{
// например, если это уровень Парка
return CurrentDistrict == 2;
}
}
к сведению

CustomDisaster предоставляет несколько полезных свойств для этого:

  • CurrentDistrict - индекс района текущего уровня. (0 - Трущобы, 1 - Завод, 2 - Парк, 3 - Деловой центр, 4 - Пригород, 5 - Деревня Мэра)
  • CurrentFloor - индекс этажа текущего уровня в районе. (0, 1 или 2 в обычном прохождении, и 0 или 1 с мутатором "Быстрая игра")
  • CurrentLevel - индекс текущего уровня. (0-2 - Трущобы, 3-5 - Завод, 6-8 - Парк, 9-11 - Деловой центр, 12-14 - Пригород, 15 - Деревня Мэра) (или 0-1, 2-3, 4-5, 6-7, 8-9, 10 с Быстрой игрой), и больше в Бесконечной игре)

И, если вы хотите чтобы катастрофа точно появилась на уровне, переопределите метод TestForced.

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
public override bool TestForced()
{
// например, если на уровне есть Мэр
return gc.agentList.Exists(a => a.agentName === VanillaAgents.Mayor);
}
}
Текущие ограничения

На данный момент, TestForced не может заставить катастрофу появиться на уровне без катастроф. Он только работает на уровнях, у которых обычно есть катастрофы: *-3 (или *-2 с Быстрой игрой), или каждый уровень с мутатором Катастрофы на каждом уровне.

Настройки катастрофы

Обычно, игрок не может телепортироваться во время катастроф, но вы можете это изменить, переопределив свойство AllowTeleport:

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
public override bool AllowTeleport => true;
}

Свойство вызывается постоянно, так что вы можете изменять возвращаемое значение со временем.

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

Просто вызовите метод CreateCustomDisaster с типом своей катастрофы в качестве параметра:

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

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

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

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

Также, вы можете добавить два сообщения (они отображаются одновременно, на двух строчках):

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomDisaster<MyCustomDisaster>()
.WithName(new CustomNameInfo("My Custom Disaster"))
.WithDescription(new CustomNameInfo("My Custom Disaster is very cool and does a lot of great stuff"))
.WithMessage(new CustomNameInfo("My Custom Disaster!"))
.WithMessage(new CustomNameInfo("Watch out for... uh, something dangerous!"));
}
}
к сведению

Вы можете создать мутатор убирающий катастрофу автоматически:

MyCustomDisaster.cs
public class MyCustomDisaster : CustomDisaster
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomDisaster<MyCustomDisaster>()
.WithName(new CustomNameInfo("My Custom Disaster"))
.WithDescription(new CustomNameInfo("My Custom Disaster is very cool and does a lot of great stuff"))
.WithMessage(new CustomNameInfo("My Custom Disaster!"))
.WithMessage(new CustomNameInfo("Watch out for... uh, something dangerous!"))
.WithRemovalMutator();
}
}

Примеры

Простая катастрофа, дающая всем Воскрешение сразу после оповещения.

using System.Collections;

namespace RogueLibsCore.Test
{
public class NewHealthOrder : CustomDisaster
{
[RLSetup]
public static void Setup()
{
RogueLibs.CreateCustomDisaster<NewHealthOrder>()
.WithName(new CustomNameInfo
{
English = "New Health Order",
})
.WithDescription(new CustomNameInfo
{
English = "Where is this line used?!",
})
.WithMessage(new CustomNameInfo
{
English = "N.H.O. - New Health Order",
})
.WithMessage(new CustomNameInfo
{
English = "Resurrection for everyone!",
})
.WithRemovalMutator();
}

public override void Start() { }
public override void Finish() { }

public override IEnumerator Updating()
{
foreach (Agent agent in gc.agentList)
if (!agent.dead && !agent.electronic && !agent.inhuman)
{
agent.statusEffects.AddStatusEffect(VanillaEffects.Resurrection, false);
}
yield break;
}
}
}

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