Доработка вампира и мелочи (#598)

* init

* fix vampire polymorph

* fix vampire metabolizm

* upd

* теперь при бане будет указываться номер раунда, хд

* fix

* fix

* fix locale

* change speed

* new nukeops shuttle

* FULLY FIX EBANY VAMPIRE OBJECTIVES

* fix faction

* fix drank objective

* try fix status icon

* fix changelings

* fix zombie faction

* vampire status icon fix

* upd roadmap

* vampire blood amount alert

* drain objective up

* upd

* upd
This commit is contained in:
Rinary 2024-11-13 03:02:57 +02:00 committed by GitHub
parent 3e8c1f6321
commit 977e8baaea
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 6010 additions and 106 deletions

View file

@ -1,25 +1,42 @@
using System.Linq;
using Content.Client.Alerts;
using Content.Client.UserInterface.Systems.Alerts.Controls;
using Content.Shared.StatusIcon;
using Content.Shared.StatusIcon.Components;
using Content.Shared.Vampire;
using Content.Shared.Vampire.Components;
using Content.Shared.StatusIcon.Components;
using Robust.Client.GameObjects;
using Robust.Shared.Prototypes;
namespace Content.Client.Vampire;
public sealed partial class VampireSystem : EntitySystem
public sealed class VampireSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<VampireComponent, GetStatusIconsEvent>(GetVampireIcon);
SubscribeLocalEvent<VampireIconComponent, GetStatusIconsEvent>(GetVampireIcon);
SubscribeLocalEvent<VampireAlertComponent, UpdateAlertSpriteEvent>(OnUpdateAlert);
}
private void GetVampireIcon(Entity<VampireComponent> ent, ref GetStatusIconsEvent args)
{
var iconPrototype = _prototype.Index(ent.Comp.StatusIcon);
private void GetVampireIcon(EntityUid uid, VampireIconComponent component, ref GetStatusIconsEvent args)
{
var iconPrototype = _prototype.Index(component.StatusIcon);
args.StatusIcons.Add(iconPrototype);
}
private void OnUpdateAlert(EntityUid uid, VampireAlertComponent component, ref UpdateAlertSpriteEvent args)
{
if (args.Alert.ID != component.BloodAlert)
return;
var sprite = args.SpriteViewEnt.Comp;
var blood = Math.Clamp(component.BloodAmount, 0, 999);
sprite.LayerSetState(VampireVisualLayers.Digit1, $"{(blood / 100) % 10}");
sprite.LayerSetState(VampireVisualLayers.Digit2, $"{(blood / 10) % 10}");
sprite.LayerSetState(VampireVisualLayers.Digit3, $"{blood % 10}");
}
}

View file

@ -43,6 +43,7 @@ namespace Content.IntegrationTests.Tests
"/Maps/Shuttles/cargo.yml",
"/Maps/Shuttles/emergency.yml",
"/Maps/Shuttles/infiltrator.yml",
"/Maps/_Sunrise/Shuttles/infiltrator.yml",
};
private static readonly string[] GameMaps =

View file

@ -222,7 +222,8 @@ public sealed partial class BanManager : IBanManager, IPostInjectInit
("name", targetName),
("ip", addressRangeString),
("hwid", hwidString),
("reason", reason));
("reason", reason),
("round", roundId == null ? Loc.GetString("server-ban-unknown-round") : roundId));
_sawmill.Info(logMessage);
_chat.SendAdminAlert(logMessage);

View file

@ -5,6 +5,7 @@ using Content.Server.Mind;
using Content.Server.Objectives;
using Content.Server.Roles;
using Content.Server.Vampire;
using Content.Shared.Alert;
using Content.Shared.Vampire.Components;
using Content.Shared.NPC.Prototypes;
using Content.Shared.NPC.Systems;
@ -25,6 +26,7 @@ public sealed partial class VampireRuleSystem : GameRuleSystem<VampireRuleCompon
{
[Dependency] private readonly MindSystem _mind = default!;
[Dependency] private readonly AntagSelectionSystem _antag = default!;
[Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly SharedRoleSystem _role = default!;
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
[Dependency] private readonly ObjectivesSystem _objective = default!;
@ -82,6 +84,8 @@ public sealed partial class VampireRuleSystem : GameRuleSystem<VampireRuleCompon
// make sure it's initial chems are set to max
var vampireComponent = EnsureComp<VampireComponent>(target);
EnsureComp<VampireIconComponent>(target);
var vampireAlertComponent = EnsureComp<VampireAlertComponent>(target);
var interfaceComponent = EnsureComp<UserInterfaceComponent>(target);
if (HasComp<UserInterfaceComponent>(target))
@ -99,6 +103,7 @@ public sealed partial class VampireRuleSystem : GameRuleSystem<VampireRuleCompon
_vampire.AddStartingAbilities(vampire);
_vampire.MakeVulnerableToHoly(vampire);
_alerts.ShowAlert(vampire, vampireAlertComponent.BloodAlert);
Random random = new Random();

View file

@ -22,6 +22,7 @@ using Content.Shared.Interaction;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Components;
using Content.Shared.Popups;
using Content.Shared.Polymorph;
using Content.Shared.Prying.Components;
using Content.Shared.Stealth.Components;
using Content.Shared.Store.Events;
@ -324,10 +325,29 @@ public sealed partial class VampireSystem
}
private void PolymorphSelf(Entity<VampireComponent> vampire, string? polymorphTarget)
{
if (polymorphTarget == null)
if (string.IsNullOrEmpty(polymorphTarget))
return;
var prototypeId = polymorphTarget switch
{
"MobMouse" => "VampireMouse",
"mobBatVampire" => "VampireBat",
_ => null
};
_polymorph.PolymorphEntity(vampire, polymorphTarget);
if (prototypeId == null)
{
Logger.Warning($"Unknown polymorph target: {polymorphTarget}. Polymorph operation aborted.");
return;
}
if (!_prototypeManager.TryIndex<PolymorphPrototype>(prototypeId, out var prototype))
{
Logger.Warning($"Unknown prototype: {prototypeId}. Polymorph operation aborted.");
return;
}
_polymorph.PolymorphEntity(vampire, prototype);
}
private void BloodSteal(Entity<VampireComponent> vampire)
{
@ -652,7 +672,7 @@ public sealed partial class VampireSystem
if (_mind.TryGetMind(entity, out var mindId, out var mind))
if (_mind.TryGetObjectiveComp<BloodDrainConditionComponent>(mindId, out var objective, mind))
objective.BloodDranked += entity.Comp.TotalBloodDrank;
objective.BloodDranked = entity.Comp.TotalBloodDrank;
//Slurp
_audio.PlayPvs(entity.Comp.BloodDrainSound, entity.Owner, AudioParams.Default.WithVolume(-3f));

View file

@ -12,14 +12,13 @@ public sealed partial class VampireSystem
private void InitializeObjectives()
{
SubscribeLocalEvent<BloodDrainConditionComponent, ObjectiveGetProgressEvent>(OnBloodDrainGetProgress);
}
private void OnBloodDrainGetProgress(EntityUid uid, BloodDrainConditionComponent comp, ref ObjectiveGetProgressEvent args)
{
var target = _number.GetTarget(uid);
if (target != 0)
if (target > 0)
args.Progress = MathF.Min(comp.BloodDranked / target, 1f);
else args.Progress = 1f;
}

View file

@ -75,6 +75,7 @@ public sealed partial class VampireSystem : EntitySystem
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly MetabolizerSystem _metabolism = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
[Dependency] private readonly SharedVampireSystem _vampire = default!;
private Dictionary<string, EntityUid> _actionEntities = new();
@ -214,16 +215,19 @@ public sealed partial class VampireSystem : EntitySystem
private void OnVampireBloodChangedEvent(EntityUid uid, VampireComponent component, VampireBloodChangedEvent args)
{
if (TryComp<VampireAlertComponent>(uid, out var alertComp))
_vampire.SetAlertBloodAmount(alertComp,_vampire.GetBloodEssence(uid).Int());
EntityUid? newEntity = null;
EntityUid entity = default;
// Mutations
if (GetBloodEssence(uid) >= FixedPoint2.New(50) && !_actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(50) && !_actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
{
_action.AddAction(uid, ref newEntity, VampireComponent.MutationsActionPrototype);
if (newEntity != null)
_actionEntities[VampireComponent.MutationsActionPrototype] = newEntity.Value;
}
else if (GetBloodEssence(uid) < FixedPoint2.New(50) && _actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(50) && _actionEntities.TryGetValue(VampireComponent.MutationsActionPrototype, out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -235,7 +239,7 @@ public sealed partial class VampireSystem : EntitySystem
//Hemomancer
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBloodSteal", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBloodSteal", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
{
_action.AddAction(uid, ref newEntity , "ActionVampireBloodSteal");
if (newEntity != null)
@ -247,7 +251,7 @@ public sealed partial class VampireSystem : EntitySystem
}
}
}
else if (GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBloodSteal", out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBloodSteal", out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -257,7 +261,7 @@ public sealed partial class VampireSystem : EntitySystem
_actionEntities.Remove("ActionVampireBloodSteal");
}
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireScreech", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireScreech", out entity) && component.CurrentMutation == VampireMutationsType.Hemomancer)
{
_action.AddAction(uid, ref newEntity , "ActionVampireScreech");
if (newEntity != null)
@ -269,7 +273,7 @@ public sealed partial class VampireSystem : EntitySystem
}
}
}
else if (GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireScreech", out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireScreech", out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -281,7 +285,7 @@ public sealed partial class VampireSystem : EntitySystem
//Umbrae
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireGlare", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireGlare", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
{
_action.AddAction(uid, ref newEntity , "ActionVampireGlare");
if (newEntity != null)
@ -293,7 +297,7 @@ public sealed partial class VampireSystem : EntitySystem
}
}
}
else if (GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireGlare", out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireGlare", out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -303,7 +307,7 @@ public sealed partial class VampireSystem : EntitySystem
_actionEntities.Remove("ActionVampireGlare");
}
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity) && component.CurrentMutation == VampireMutationsType.Umbrae)
{
_action.AddAction(uid, ref newEntity , "ActionVampireCloakOfDarkness");
if (newEntity != null)
@ -315,7 +319,7 @@ public sealed partial class VampireSystem : EntitySystem
}
}
}
else if (GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireCloakOfDarkness", out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -327,7 +331,7 @@ public sealed partial class VampireSystem : EntitySystem
//Gargantua
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireUnnaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireUnnaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
{
var vampire = new Entity<VampireComponent>(uid, component);
@ -336,7 +340,7 @@ public sealed partial class VampireSystem : EntitySystem
_actionEntities["ActionVampireUnnaturalStrength"] = vampire;
}
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireSupernaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireSupernaturalStrength", out entity) && component.CurrentMutation == VampireMutationsType.Gargantua)
{
var vampire = new Entity<VampireComponent>(uid, component);
@ -347,7 +351,7 @@ public sealed partial class VampireSystem : EntitySystem
//Bestia
if (GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBatform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(200) && !_actionEntities.TryGetValue("ActionVampireBatform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
{
_action.AddAction(uid, ref newEntity , "ActionVampireBatform");
if (newEntity != null)
@ -359,7 +363,7 @@ public sealed partial class VampireSystem : EntitySystem
}
}
}
else if (GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBatform", out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(200) && _actionEntities.TryGetValue("ActionVampireBatform", out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -369,7 +373,7 @@ public sealed partial class VampireSystem : EntitySystem
_actionEntities.Remove("ActionVampireBatform");
}
if (GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireMouseform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
if (_vampire.GetBloodEssence(uid) >= FixedPoint2.New(300) && !_actionEntities.TryGetValue("ActionVampireMouseform", out entity) && component.CurrentMutation == VampireMutationsType.Bestia)
{
_action.AddAction(uid, ref newEntity , "ActionVampireMouseform");
if (newEntity != null)
@ -381,7 +385,7 @@ public sealed partial class VampireSystem : EntitySystem
}
}
}
else if (GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireMouseform", out entity))
else if (_vampire.GetBloodEssence(uid) < FixedPoint2.New(300) && _actionEntities.TryGetValue("ActionVampireMouseform", out entity))
{
if (!TryComp(uid, out ActionsComponent? comp))
return;
@ -391,17 +395,6 @@ public sealed partial class VampireSystem : EntitySystem
_actionEntities.Remove("ActionVampireMouseform");
}
}
private FixedPoint2 GetBloodEssence(EntityUid vampire)
{
if (!TryComp<VampireComponent>(vampire, out var comp))
return 0;
if (!comp.Balance.TryGetValue(VampireComponent.CurrencyProto, out var val))
return 0;
return val;
}
private void DoSpaceDamage(Entity<VampireComponent> vampire)
{

View file

@ -38,8 +38,8 @@ public sealed partial class ChangelingComponent : Component
/// The status icon corresponding to the Changlings.
/// </summary>
[DataField, ViewVariables(VVAccess.ReadOnly)]
public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "HivemindFaction";
[DataField("changelingStatusIcon")]
public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "HivemindFaction";
#endregion

View file

@ -10,7 +10,7 @@ public sealed partial class LayingDownComponent : Component
public float StandingUpTime { get; set; } = 1f;
[DataField, AutoNetworkedField]
public float SpeedModify { get; set; } = 0.4f;
public float SpeedModify { get; set; } = 0.25f;
[DataField, AutoNetworkedField]
public bool AutoGetUp;

View file

@ -0,0 +1,24 @@
using Content.Shared.Vampire.Components;
using Content.Shared.FixedPoint;
namespace Content.Shared.Vampire;
public sealed class SharedVampireSystem : EntitySystem
{
public FixedPoint2 GetBloodEssence(EntityUid vampire)
{
if (!TryComp<VampireComponent>(vampire, out var comp))
return 0;
if (comp.Balance != null && comp.Balance.TryGetValue(VampireComponent.CurrencyProto, out var val))
return val;
return 0;
}
public void SetAlertBloodAmount(VampireAlertComponent component, int amount)
{
component.BloodAmount = amount;
Dirty(component.Owner, component);
}
}

View file

@ -0,0 +1,15 @@
using Content.Shared.Alert;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared.Vampire.Components;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class VampireAlertComponent : Component
{
[DataField("vampireBloodAlert")]
public ProtoId<AlertPrototype> BloodAlert { get; set; } = "VampireBlood";
[DataField, AutoNetworkedField]
public int BloodAmount = 0;
}

View file

@ -75,9 +75,6 @@ public sealed partial class VampireComponent : Component
[ValidatePrototypeId<VampirePowerProtype>]
public static readonly string DrinkBloodPrototype = "DrinkBlood";
[DataField, ViewVariables(VVAccess.ReadOnly)]
public ProtoId<StatusIconPrototype> StatusIcon { get; set; } = "VampireFaction";
/// <summary>
/// Total blood drank, counter for end of round screen
@ -251,6 +248,14 @@ public enum VampireMutationUiKey : byte
Key
}
[NetSerializable, Serializable]
public enum VampireVisualLayers : byte
{
Digit1,
Digit2,
Digit3
}
/*[Serializable, NetSerializable]
public enum VampirePowerKey : byte
{

View file

@ -0,0 +1,12 @@
using Content.Shared.StatusIcon;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
namespace Content.Shared.Vampire.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class VampireIconComponent : Component
{
[DataField("vampireStatusIcon")]
public ProtoId<FactionIconPrototype> StatusIcon { get; set; } = "VampireFaction";
}

View file

@ -43,16 +43,6 @@ blood-cult-name = Культ крови (Нар`Си)
blood-cult-desc = Культ который идёт за богом Нар`Си, цель культа призвать своего покровителя который позже уничтожит станцию.
economy-name = Экономика
economy-desc = Добавление денег, зарплаты, почта будет давать деньги а вендоматы будут брать деньги за еду.
extend-med-name = Расширение мед. отдела
extend-med-desc = Добавление новых механик, ролей.
pathologist-name = Паталогоанатом
pathologist-desc = Новая роль мед.отдела. Задача которой следить за моргом.
arena-name = Арена для призраков
arena-desc = Арена где призраки могут занять своё время что-бы не летать по станции в ожидании конца раунда.
limbo-name = Лимбо
limbo-desc = Отдельный мирок для призраков где нет правил.
taipan-name = Тайпан
taipan-desc = Отдельная станция синдиката с своими задачами на смену.
##########
# 2025 #
@ -88,6 +78,16 @@ plasmamens-name = Раса плазмаменов
plasmamens-desc = Раса крутых плазменных чувачков.
centcomm-update-name = Обновление ЦК
centcomm-update-desc = Обновление карты центрального коммандования и возможное обновление ролей.
extend-med-name = Расширение мед. отдела
extend-med-desc = Добавление новых механик, ролей.
pathologist-name = Паталогоанатом
pathologist-desc = Новая роль мед.отдела. Задача которой следить за моргом.
arena-name = Арена для призраков
arena-desc = Арена где призраки могут занять своё время что-бы не летать по станции в ожидании конца раунда.
limbo-name = Лимбо
limbo-desc = Отдельный мирок для призраков где нет правил.
taipan-name = Тайпан
taipan-desc = Отдельная станция синдиката с своими задачами на смену.
##########
# 2026 #

View file

@ -44,6 +44,7 @@ uplink-clothing-backpack-syndie-siar52-name = Набор SIAR-52
uplink-clothing-backpack-syndie-siar52-desc = Включает в себя пулемёт SIAR-52 и два магазина патрон.
uplink-weapon-syndie-laser-minigun-name = UVL-21 «Виверна»
uplink-weapon-syndie-laser-gun-name = S-13 «Чёрная мамба»
uplink-weapon-bauer-127-name = винтовка Bauer SR-127
## Cyborgs

View file

@ -69,10 +69,11 @@ ban-panel-permanent = Постоянный
ban-panel-ip-hwid-tooltip = Оставьте пустым и установите флажок ниже, чтобы использовать данные последнего подключения
ban-panel-severity = Тяжесть:
# Ban string
server-ban-string = { $admin } создал бан на сервере с уровнем строгости { $severity }, который истекает { $expires } для [{ $name }, { $ip }, { $hwid }], с причиной: { $reason }
server-ban-string = { $admin } создал бан на сервере с уровнем строгости { $severity }, который истекает { $expires } для [{ $name }, { $ip }, { $hwid }], с причиной: { $reason }, раунд: { $round }
ban-panel-erase = Стереть сообщения в чате и игрока из раунда
server-ban-string-never = никогда
server-ban-string-no-pii = { $admin } установил серверный бан { $severity } тяжести, который истечёт { $expires } у { $name } с причиной: { $reason }
server-ban-string-no-pii = { $admin } установил серверный бан { $severity } тяжести, который истечёт { $expires } у { $name } с причиной: { $reason }, раунд: { $round }
server-ban-unknown-round = Неизвестный
cmd-ban_exemption_get-arg-player = <player>
# Kick on ban
ban-kick-reason = You have been banned

View file

@ -1749,7 +1749,7 @@ entities:
- type: GridFill
addComponents:
- type: NukeOpsShuttle
path: /Maps/Shuttles/infiltrator.yml
path: /Maps/_Sunrise/Shuttles/infiltrator.yml # Sunrise-edit
- uid: 2481
components:
- type: Transform

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,22 @@
- type: alert
id: VampireBlood
icons:
- sprite: /Textures/Interface/Alerts/blood_counter.rsi
state: background
alertViewEntity: AlertVampireBloodSpriteView
name: alerts-vampire-blood-name
description: alerts-vampire-blood-desc
- type: entity
id: AlertVampireBloodSpriteView
categories: [ HideSpawnMenu ]
components:
- type: Sprite
sprite: /Textures/Interface/Alerts/blood_counter.rsi
layers:
- map: [ "enum.AlertVisualLayers.Base" ]
- map: [ "enum.VampireVisualLayers.Digit1" ]
offset: -0.35, 0
- map: [ "enum.VampireVisualLayers.Digit2" ]
offset: -0.150, 0
- map: [ "enum.VampireVisualLayers.Digit3" ]

View file

@ -1033,6 +1033,7 @@
- DetectiveArmorVest
- DetectiveCoat
- DetectiveCoatGrey
- DetectiveCoatDark # Sunrise-edit
- type: loadoutGroup
id: SecurityCadetJumpsuit

View file

@ -124,7 +124,7 @@
- type: Objective
icon:
sprite: Interface/Actions/actions_vampire.rsi
state: deathsembrace
state: survive_icon
- type: entity
parent: [BaseVampireObjective, BaseLivingObjective]
@ -162,10 +162,10 @@
- type: Objective
icon:
sprite: Interface/Actions/actions_vampire.rsi
state: fangs_extended
state: blood_drain_icon
- type: NumberObjective
min: 100
max: 500
min: 300
max: 600
title: objective-condition-drain-title
description: objective-condition-drain-description
- type: BloodDrainCondition

View file

@ -188,6 +188,13 @@
revertOnDeath: false
#Vampire
- type: polymorph
id: VampireMouse
configuration:
entity: MobMouse
revertOnDeath: true
revertOnCrit: true
- type: polymorph
id: VampireBat
configuration:

View file

@ -478,6 +478,9 @@
- !type:OrganType
type: Animal
shouldHave: false
- !type:OrganType
type: Vampire
shouldHave: false
type: Local
visualType: MediumCaution
messages: [ "generic-reagent-effect-sick" ]
@ -488,11 +491,17 @@
- !type:OrganType
type: Animal
shouldHave: false
- !type:OrganType
type: Vampire
shouldHave: false
- !type:HealthChange
conditions:
- !type:OrganType
type: Animal
shouldHave: false
- !type:OrganType
type: Vampire
shouldHave: false
damage:
types:
Poison: 1
@ -501,6 +510,9 @@
- !type:OrganType
type: Animal
shouldHave: true
- !type:OrganType
type: Vampire
shouldHave: true
reagent: Protein
amount: 0.5

View file

@ -66,11 +66,13 @@
- type: factionIcon
id: VampireFaction
isShaded: true
priority: 11
locationPreference: Left
showTo:
components:
- ShowAntagIcons
- Vampire
- VampireIcon
icon:
sprite: /Textures/Interface/Misc/job_icons.rsi
state: Vampire

View file

@ -0,0 +1,11 @@
- type: entity
parent: ClothingBackpackDuffelSyndicateBundle
id: ClothingBackpackDuffelSyndicateFilledBauer
name: Bauer-127 bundle
description: "The iconic Bauer-127 magazine rifle with 2 raspy magazines in the set."
components:
- type: StorageFill
contents:
- id: WeaponRifleBauer127
- id: MagazineBauer127Extended
- id: MagazineBauer127Extended

View file

@ -232,6 +232,22 @@
whitelist:
tags:
- NukeOpsUplink
- type: listing
id: UplinkWeaponBauer127
name: uplink-weapon-bauer-127-name
productEntity: ClothingBackpackDuffelSyndicateFilledBauer
description: uplink-weapon-bauer-127-name
icon: { sprite: _Sunrise/Objects/Weapons/Guns/Snipers/bauer127/big.rsi, state: icon }
cost:
Telecrystal: 18
categories:
- UplinkWeaponry
conditions:
- !type:StoreWhitelistCondition
whitelist:
tags:
- NukeOpsUplink
- type: listing
id: UplinkHardsuitSyndieCommander

View file

@ -0,0 +1,4 @@
- type: loadout
id: DetectiveCoatDark
equipment:
outerClothing: ClothingOuterCoatDetectiveDark

View file

@ -54,21 +54,16 @@
name: Full Translation Of Everything
desc: translation of all the items, menus. In order to simplify gameplay.
state: Complete
night-vision:
id: night-vision
name: Night Vision
desc: NVD, night vision in some animals/race.
state: Complete
mechs:
id: mechs
name: Mechs
desc: Controlled mechanoids, created to work in difficult places, as well as in facilitating the transportation of goods and other tasks where man himself can not cope.
state: Partial
state: Complete
ipc:
id: ipc
name: IPC
desc: A race of intelligent machines, in reworking.
state: Partial
state: InProgress
blob:
id: blob
name: Blob
@ -109,44 +104,24 @@
name: Economy
desc: Adding money, wages, the post office will give money and vendomats will take money for food.
state: InProgress
2025:
name: 2025
goals:
extend-med:
id: extend-med
name: Medical Department Expansion
desc: Adding new mechanics, roles.
state: Planned
pathologist:
id: pathologist
name: Pathologist
desc: A new role for the medical department. To keep an eye on the morgue.
state: Planned
arena:
id: arena
name: Ghosts Arena
desc: An arena where ghosts can occupy their time so they don't have to fly around the station waiting for the end of the round.
state: Planned
limbo:
id: limbo
name: Limbo
desc: A separate world for ghosts where there are no rules.
state: Planned
taipan:
id: taipan
name: Taipan
desc: A separate syndicate station with its own shift tasks.
state: Planned
2025:
name: 2025
goals:
mail:
id: mail
name: Mail
desc: Sending parcels to different parts of the station for which the station will receive money.
state: InProgress
state: Partial
ai:
id: ai
name: AI
desc: A new artificial intelligence profession aimed at helping the station destroy itself?
state: Partial
mail:
id: mail
name: Mail
desc: Sending parcels to different parts of the station for which the station will receive money.
state: InProgress
borer:
id: borer
name: Brainworm
@ -202,10 +177,20 @@
name: A race of plasmamens
desc: A race of cool plasma dudes.
state: Planned
centcomm-update:
id: centcomm-update
name: Centcomm Update
desc: Central Command map update and possible role update.
arena:
id: arena
name: Ghosts Arena
desc: An arena where ghosts can occupy their time so they don't have to fly around the station waiting for the end of the round.
state: Planned
limbo:
id: limbo
name: Limbo
desc: A separate world for ghosts where there are no rules.
state: Planned
taipan:
id: taipan
name: Taipan
desc: A separate syndicate station with its own shift tasks.
state: Planned
2026:
name: 2026

View file

@ -75,6 +75,8 @@
- Passive
- PetsNT
- Revolutionary
- Changeling
- Vampire
- type: npcFaction
id: Revolutionary
@ -98,4 +100,6 @@
- NanoTrasen
- Syndicate
- Zombie
- Revolutionary
- Revolutionary
- Changeling
- Xeno

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

View file

@ -54,6 +54,12 @@
},
{
"name": "fullpotential"
},
{
"name": "survive_icon"
},
{
"name": "blood_drain_icon"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -0,0 +1,73 @@
{
"version": 1,
"license": "CLA",
"copyright": "SUNRISE",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "background",
"delays": [
[
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1,
0.1
]
]
},
{
"name": "0"
},
{
"name": "1"
},
{
"name": "2"
},
{
"name": "3"
},
{
"name": "4"
},
{
"name": "5"
},
{
"name": "6"
},
{
"name": "7"
},
{
"name": "8"
},
{
"name": "9"
}
]
}