Files
OldThink/Content.Server/Changeling/ChangelingRuleSystem.cs

246 lines
8.3 KiB
C#
Raw Normal View History

using System.Linq;
using Content.Server.Antag;
using Content.Server.GameTicking;
using Content.Server.GameTicking.Rules;
using Content.Server.GameTicking.Rules.Components;
using Content.Server.Mind;
using Content.Server.Objectives;
using Content.Server.Roles;
2024-03-27 19:30:19 +07:00
using Content.Shared._White.Mood;
using Content.Shared.Changeling;
using Content.Shared.GameTicking;
2024-03-27 19:30:19 +07:00
using Content.Shared.NPC.Systems;
using Content.Shared.Objectives.Components;
using Content.Shared.Roles;
2024-03-27 19:30:19 +07:00
using Robust.Server.Player;
using Robust.Shared.Random;
using Robust.Shared.Timing;
namespace Content.Server.Changeling;
public sealed class ChangelingRuleSystem : GameRuleSystem<ChangelingRuleComponent>
{
[Dependency] private readonly AntagSelectionSystem _antagSelection = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
[Dependency] private readonly MindSystem _mindSystem = default!;
[Dependency] private readonly SharedRoleSystem _roleSystem = default!;
[Dependency] private readonly ObjectivesSystem _objectives = default!;
[Dependency] private readonly ChangelingNameGenerator _nameGenerator = default!;
2024-03-27 19:30:19 +07:00
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
private const int PlayersPerChangeling = 15;
private const int MaxChangelings = 4;
private const float ChangelingStartDelay = 3f * 60;
private const float ChangelingStartDelayVariance = 3f * 60;
private const int ChangelingMaxDifficulty = 5;
private const int ChangelingMaxPicks = 20;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<RoundStartAttemptEvent>(OnStartAttempt);
SubscribeLocalEvent<RulePlayerJobsAssignedEvent>(OnPlayersSpawned);
SubscribeLocalEvent<PlayerSpawnCompleteEvent>(HandleLatejoin);
SubscribeLocalEvent<RoundRestartCleanupEvent>(ClearUsedNames);
SubscribeLocalEvent<ChangelingRuleComponent, ObjectivesTextGetInfoEvent>(OnObjectivesTextGetInfo);
SubscribeLocalEvent<ChangelingRoleComponent, GetBriefingEvent>(OnGetBriefing);
}
protected override void Added(EntityUid uid, ChangelingRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args)
{
base.Added(uid, component, gameRule, args);
gameRule.MinPlayers = PlayersPerChangeling;
}
private void OnGetBriefing(Entity<ChangelingRoleComponent> ent, ref GetBriefingEvent args)
{
args.Append(Loc.GetString("changeling-role-briefing-short"));
}
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
protected override void ActiveTick(
EntityUid uid,
ChangelingRuleComponent component,
GameRuleComponent gameRule,
float frameTime)
{
base.ActiveTick(uid, component, gameRule, frameTime);
2024-03-27 19:30:19 +07:00
if (component.SelectionStatus < ChangelingRuleComponent.SelectionState.Started &&
component.AnnounceAt < _gameTiming.CurTime)
{
DoChangelingStart(component);
2024-03-27 19:30:19 +07:00
component.SelectionStatus = ChangelingRuleComponent.SelectionState.Started;
}
}
private void OnStartAttempt(RoundStartAttemptEvent ev)
{
2024-03-27 19:30:19 +07:00
TryRoundStartAttempt(ev, Loc.GetString("changeling-title"));
}
2024-03-27 19:30:19 +07:00
private void OnPlayersSpawned(RulePlayerJobsAssignedEvent ev)
{
var query = QueryActiveRules();
while (query.MoveNext(out _, out var changeling, out _))
{
var delay = TimeSpan.FromSeconds(ChangelingStartDelay +
_random.NextFloat(0f, ChangelingStartDelayVariance));
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
2024-03-27 19:30:19 +07:00
changeling.AnnounceAt = _gameTiming.CurTime + delay;
2024-03-27 19:30:19 +07:00
changeling.SelectionStatus = ChangelingRuleComponent.SelectionState.ReadyToStart;
}
}
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
2024-03-27 19:30:19 +07:00
private void HandleLatejoin(PlayerSpawnCompleteEvent ev)
{
2024-03-27 19:30:19 +07:00
var query = QueryActiveRules();
while (query.MoveNext(out _, out var changeling, out _))
{
2024-03-27 19:30:19 +07:00
if (changeling.TotalChangelings >= MaxChangelings)
continue;
2024-03-27 19:30:19 +07:00
if (!ev.LateJoin)
continue;
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
2024-03-27 19:30:19 +07:00
if (!_antagSelection.IsPlayerEligible(ev.Player, changeling.ChangelingPrototypeId))
continue;
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
2024-03-27 19:30:19 +07:00
// Before the announcement is made, late-joiners are considered the same as players who readied.
if (changeling.SelectionStatus < ChangelingRuleComponent.SelectionState.Started)
continue;
2024-03-27 19:30:19 +07:00
var target = PlayersPerChangeling * changeling.TotalChangelings + 1;
var chance = 1f / PlayersPerChangeling;
if (ev.JoinOrder < target)
{
chance /= (target - ev.JoinOrder);
}
else
{
chance *= ev.JoinOrder + 1 - target;
}
if (chance > 1)
chance = 1;
if (_random.Prob(chance))
{
MakeChangeling(ev.Mob, changeling);
}
}
2024-03-27 19:30:19 +07:00
}
2024-03-27 19:30:19 +07:00
private void ClearUsedNames(RoundRestartCleanupEvent ev)
{
_nameGenerator.ClearUsed();
}
2024-03-27 19:30:19 +07:00
private void OnObjectivesTextGetInfo(
EntityUid uid,
ChangelingRuleComponent comp,
ref ObjectivesTextGetInfoEvent args)
{
2024-03-27 19:30:19 +07:00
args.Minds = comp.ChangelingMinds;
args.AgentName = Loc.GetString("changeling-round-end-agent-name");
}
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
2024-03-27 19:30:19 +07:00
private void DoChangelingStart(ChangelingRuleComponent component)
{
var eligiblePlayers =
_antagSelection.GetEligiblePlayers(_playerManager.Sessions, component.ChangelingPrototypeId);
2024-03-27 19:30:19 +07:00
if (eligiblePlayers.Count == 0)
{
return;
}
2024-03-27 19:30:19 +07:00
var changelingsToSelect =
_antagSelection.CalculateAntagCount(_playerManager.PlayerCount, PlayersPerChangeling, MaxChangelings);
2024-03-27 19:30:19 +07:00
var selectedChangelings = _antagSelection.ChooseAntags(changelingsToSelect, eligiblePlayers);
2024-03-27 19:30:19 +07:00
foreach (var changeling in selectedChangelings)
{
MakeChangeling(changeling, component);
}
}
public void AdminMakeChangeling(EntityUid entity)
{
var changelingRule = EntityQuery<ChangelingRuleComponent>().FirstOrDefault();
if (changelingRule == null)
{
GameTicker.StartGameRule("Changeling", out var ruleEntity);
changelingRule = Comp<ChangelingRuleComponent>(ruleEntity);
}
if (HasComp<ChangelingRuleComponent>(entity))
return;
MakeChangeling(entity, changelingRule);
}
2024-03-27 19:30:19 +07:00
public bool MakeChangeling(EntityUid changeling, ChangelingRuleComponent rule, bool giveObjectives = true)
{
if (!_mindSystem.TryGetMind(changeling, out var mindId, out var mind))
{
return false;
}
if (HasComp<ChangelingRoleComponent>(mindId))
{
2024-03-27 19:30:19 +07:00
Log.Error($"Player {mind.CharacterName} is already a changeling.");
return false;
}
var briefing = Loc.GetString("changeling-role-greeting");
2024-03-27 19:30:19 +07:00
_antagSelection.SendBriefing(changeling, briefing, null, rule.GreetSoundNotification);
rule.ChangelingMinds.Add(mindId);
_roleSystem.MindAddRole(mindId, new ChangelingRoleComponent
{
2024-03-27 19:30:19 +07:00
PrototypeId = rule.ChangelingPrototypeId
}, mind);
// Change the faction
2024-03-27 19:30:19 +07:00
_npcFaction.RemoveFaction(changeling, "NanoTrasen", false);
_npcFaction.AddFaction(changeling, "Changeling");
2024-03-27 19:30:19 +07:00
EnsureComp<ChangelingComponent>(changeling, out var readyChangeling);
readyChangeling.HiveName = _nameGenerator.GetName();
2024-03-27 19:30:19 +07:00
Dirty(changeling, readyChangeling);
RaiseLocalEvent(changeling, new MoodEffectEvent("TraitorFocused"));
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
if (!giveObjectives)
return true;
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
var difficulty = 0f;
for (var pick = 0; pick < ChangelingMaxPicks && ChangelingMaxDifficulty > difficulty; pick++)
{
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
var objective = _objectives.GetRandomObjective(mindId, mind, "ChangelingObjectiveGroups");
if (objective == null)
continue;
[Tweak] Много всякого. В основном генокрады. (#79) * tweak: Снижено дополнительное тк за войну 40 -> 20 * add: репутация больше не влияет на выпадение антажки * fix: фикс награды карго на лазеры * tweak: игроков на 1 генокрада 10 -> 15. * tweak: максимум генокрадов 5 -> 4 * tweak: Время регенерации генокрада 20 -> 60 секунд * add: переводы для генокрадов * tweak: убить папку Miracle * add: переводы сущностей генокрадов * tweak: снижение эффективности и цены мешков с адреналином * fix: опечатка * add: еще переводики * fix: теперь броня линга не замедляет навсегда * tweak: измеено получение очков за генокрадов Больше нельзя получать очки за поглощение людей. Теперь их можно получать только за поглощение других генокрадов. Это также повышает максимальный запас химикатов на 40 * add: жало извлечения днк для генокрада * add: перезарядка способностей снаряжения генокрада * tweak: правильное расположение иконок способностей генокрада * add: способность биоразложения для генокрада * fix: фикс иконок * add: последние детали переводов * add: никаких больше воров пацифистов
2024-02-16 01:07:59 +07:00
_mindSystem.AddObjective(mindId, mind, objective.Value);
2024-03-27 19:30:19 +07:00
var adding = Comp<ObjectiveComponent>(objective.Value).Difficulty;
difficulty += adding;
Log.Debug($"Added objective {ToPrettyString(objective):objective} with {adding} difficulty");
}
return true;
}
}