Skip to content

Commit

Permalink
йохохо и бутылка молока (#857)
Browse files Browse the repository at this point in the history
## Описание PR
<!-- Что вы изменили в этом пулл реквесте? -->
добавила пиратов мидраунд ивентом

Yar har fiddle de de
Being a pirate is alright with me
Do what you want 'cause a pirate is free
You are a pirate
Yo ho ahoy and avast
Being a pirate is really badass
Hang the black flag at the end of the mast
You are a pirate

## Почему / Баланс
<!-- Почему оно было изменено? Ссылайтесь на любые обсуждения или
вопросы здесь. Пожалуйста, обсудите, как это повлияет на игровой баланс.
-->
разнообразие в мидраунд

## Медиа
<!--
Пулл реквесты, которые вносят внутриигровые изменения (добавление
одежды, предметов, новых возможностей и т.д.), должны содержать медиа,
демонстрирующие изменения.
Небольшие исправления/рефакторы не требуют медиа.

Если Вы не уверены в том, что Ваш пулл реквест требует медиа, спросите
мейнтейнера.
-->

## Требования
<!--
В связи с наплывом ПР'ов нам необходимо убедиться, что ПР'ы следуют
правильным рекомендациям.

Пожалуйста, уделите время прочтению, если делаете пулл реквест (ПР)
впервые.

Отметьте поля ниже, чтобы подтвердить, что Вы действительно видели их
(поставьте X в скобках, например [X]):
-->
- [x] Я прочитал(а) и следую [Руководство по созданию пулл
реквестов](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
Я понимаю, что в противном случае мой ПР может быть закрыт по усмотрению
мейнтейнера.
- [x] Я добавил скриншоты/видео к этому пулл реквесту, демонстрирующие
его изменения в игре, **или** этот пулл реквест не требует демонстрации
в игре

**Чейнджлог**
<!--
Здесь Вы можете заполнить журнал изменений, который будет автоматически
добавлен в игру при мердже Вашего пулл реквест.

Чтобы игроки узнали о новых возможностях и изменениях, которые могут
повлиять на их игру, добавьте запись в журнал изменений.

Не считайте суффикс типа записи (например, add) "частью" предложения:
плохо: - add: новый инструмент для инженеров
хорошо: - add: добавлен новый инструмент для инженеров

Помещение имени после символа 🆑 изменит имя, которое будет
отображаться в журнале изменений (в противном случае будет
использоваться ваше имя пользователя GitHub).
Например: 🆑 AruMoon
-->

🆑 Ratyyy

- add: На часть секторов заметно участились нападения космических
пиратов!

---------

Co-authored-by: Jungar <[email protected]>
Co-authored-by: KashRas2 <[email protected]>
Co-authored-by: Eugeny <[email protected]>
Co-authored-by: Unlumination <[email protected]>
  • Loading branch information
5 people authored Dec 30, 2024
1 parent 8fe09e1 commit 12ebc9c
Show file tree
Hide file tree
Showing 39 changed files with 5,691 additions and 9 deletions.
3 changes: 2 additions & 1 deletion Content.IntegrationTests/Tests/PostMapInitTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ public sealed class PostMapInitTest
"/Maps/Shuttles/cargo.yml",
"/Maps/Shuttles/emergency.yml",
"/Maps/Shuttles/infiltrator.yml",
"/Maps/ADTMaps/Shuttles/pirate.yml", //ADT edit
// ADT-New-Year-Start
"/Maps/ADTMaps/ADTStations/NewYear/adt_centcom.yml",
"/Maps/ADTMaps/ADTStations/NewYear/adt_centcom.yml"
// ADT-New-Year-End
};

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using Robust.Shared.Audio;

namespace Content.Server.GameTicking.Rules.Components;

[RegisterComponent, Access(typeof(PiratesRuleSystem))]
public sealed partial class PiratesRuleComponent : Component
{
[ViewVariables]
public List<EntityUid> Pirates = new();
[ViewVariables]
public EntityUid PirateShip = EntityUid.Invalid;
[ViewVariables]
public HashSet<EntityUid> InitialItems = new();
[ViewVariables]
public double InitialShipValue;

/// <summary>
/// Path to antagonist alert sound.
/// </summary>
[DataField("pirateAlertSound")]
public SoundSpecifier PirateAlertSound = new SoundPathSpecifier(
"/Audio/Ambience/Antag/pirate_start.ogg",
AudioParams.Default.WithVolume(4));

[DataField]
public string PiratesShuttlePath = "Maps/ADTMaps/Shuttles/ERT_base.yml";
}
100 changes: 100 additions & 0 deletions Content.Server/ADT/GameTicking/Rules/PiratesRuleSystem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
using Content.Server.Cargo.Systems;
using Content.Server.GameTicking.Rules.Components;
using Content.Shared.Mind;
using Robust.Server.GameObjects;
using Robust.Server.Maps;
using Robust.Shared.Map;
using Robust.Shared.Utility;
using Content.Shared.GameTicking.Components;

namespace Content.Server.GameTicking.Rules;

/// <summary>
/// This handles the Pirates minor antag, which is designed to coincide with other modes on occasion.
/// </summary>
public sealed class PiratesRuleSystem : GameRuleSystem<PiratesRuleComponent>
{
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly PricingSystem _pricingSystem = default!;
[Dependency] private readonly MapLoaderSystem _map = default!;


/// <inheritdoc/>
public override void Initialize()
{
base.Initialize();

}

protected override void Started(EntityUid uid, PiratesRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args)
{
base.Started(uid, component, gameRule, args);

var shuttleMap = _mapManager.CreateMap();
var options = new MapLoadOptions { LoadMap = true };

if (!_map.TryLoad(shuttleMap, component.PiratesShuttlePath, out var shuttle, options))
return;
component.PirateShip = shuttle[0];

component.InitialShipValue = _pricingSystem.AppraiseGrid(component.PirateShip, uid =>
{
component.InitialItems.Add(uid);
return true;
});

}
protected override void AppendRoundEndText(EntityUid uid, PiratesRuleComponent component, GameRuleComponent gameRule, ref RoundEndTextAppendEvent args)
{
if (Deleted(component.PirateShip))
{
// Major loss, the ship somehow got annihilated.
args.AddLine(Loc.GetString("pirates-no-ship"));
}
else
{
List<(double, EntityUid)> mostValuableThefts = new();
var comp1 = component;
var finalValue = _pricingSystem.AppraiseGrid(component.PirateShip, uid =>
{
foreach (var mindId in component.Pirates)
{
if (TryComp(mindId, out MindComponent? mind) && mind.CurrentEntity == uid)
return false; // Don't appraise the pirates twice, we count them in separately.
}

return true;
}, (uid, price) =>
{
if (comp1.InitialItems.Contains(uid))
return;
mostValuableThefts.Add((price, uid));
mostValuableThefts.Sort((i1, i2) => i2.Item1.CompareTo(i1.Item1));
if (mostValuableThefts.Count > 5)
mostValuableThefts.Pop();
});

foreach (var mindId in component.Pirates)
{
if (TryComp(mindId, out MindComponent? mind) && mind.CurrentEntity is not null)
finalValue += _pricingSystem.GetPrice(mind.CurrentEntity.Value);
}

var score = finalValue - component.InitialShipValue;

args.AddLine(Loc.GetString("pirates-final-score", ("score", $"{score:F2}")));
args.AddLine(Loc.GetString("pirates-final-score-2", ("finalPrice", $"{finalValue:F2}")));

args.AddLine("");
args.AddLine(Loc.GetString("pirates-most-valuable"));

foreach (var (price, obj) in mostValuableThefts)
{
args.AddLine(Loc.GetString("pirates-stolen-item-entry", ("entity", obj), ("credits", $"{price:F2}")));
}

if (mostValuableThefts.Count == 0)
args.AddLine(Loc.GetString("pirates-stole-nothing"));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,10 @@ ghost-role-information-carpcat-rules =
Вы [bold]должны слушаться и помогать[/bold] ядерным оперативникам в выполнении своей задачи и кусать наглых сотрудников станции.
ghost-role-information-mini-spider-name = Паучок
ghost-role-information-mini-spider-description = Маленький паучок, почему бы вам не отправиться на охоту за очередной мышкой?
ghost-role-information-pirate-rules = Вы [color=red]НЕ[/color] помните свою прошлую жизнь. Сделайте все, чтобы наполнить трюм золотом, начиная с торговли и заканчивая кровавой бойней. Слушайтесь своего капитана и делайте все, чтобы спасти ему жизнь.
ghost-role-information-captain-pirate-name = Капитан пиратов
ghost-role-information-captain-pirate-description = Вы - Капитан судна космических Пиратов! Руководите бандой головорезов, и заберите у космических крыс то, что они так не хотят вам отдавать! Ну или банально не сыграйте в ящик.
ghost-role-information-captain-pirate-rules = Вы [color=red]НЕ[/color] помните свою прошлую жизнь. Сделайте все, чтобы наполнить трюм золотом, начиная с торговли и заканчивая кровавой бойней. Веди свою команду, мой друг, ЙАРРР!
ghost-role-information-pirate-firstmate-name = Юнга
ghost-role-information-pirate-firstmate-description = Вы - Юнга на судне космических Пиратов. Ваша задача выполнять все отвратительные на ваш взгляд приказы Пиратов и Капитана, стараясь не сойти с ума на дне кружки Грога.
ghost-role-information-pirate-firstmate-rules = Вы [color=red]НЕ[/color] помните свою прошлую жизнь. Сделайте все, чтобы наполнить трюм золотом, начиная с торговли и заканчивая кровавой бойней. Слушайтесь своего капитана или [color=red]станьте[/color] новым.
1 change: 1 addition & 0 deletions Resources/Locale/ru-RU/ADT/communications/terror.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
terror-pirate = Внимание экипажу! Похоже, кто-то со станции неожиданно вышел на связь с пиратским флотом в ближнем космосе.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
pirates-no-ship = При неизвестных обстоятельствах корабль пиратов был полностью уничтожен.
pirates-final-score = Пираты успешно украли товара на {$score} космобаксов.
pirates-final-score-2 = Безделушек, в общей сложности на {$finalPrice} космобаксов.
pirates-most-valuable = Самыми ценными украденными вещами были:
pirates-stolen-item-entry = {$entity} с ценой в ({$credits} космобаксов)
pirates-stole-nothing = - Пираты украли абсолютно ничего. [color=red][bold]Стыд и позор.[/bold][/color]
roles-antag-pirate-objective = Украдите все ценное с этого одурманенного большого корабля... э-э... станции.
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,72 @@ uplink-blackmail-bundle-desc = Набор для относительно эфф
uplink-syndicate-helmet-name = шлем спецназа
uplink-syndicate-helmet-desc = Очень прочный шлем, широко используемый военизированными организациями. Его украшает ужасный узор из красных и чёрных полос. Да пребудет с вами робаст.
uplink-pirate-cannonball-name = пушечное ядро
uplink-pirate-cannonball-desc = Обычное пушечное ядро.
uplink-pirate-grapeshot-name = картечь
uplink-pirate-grapeshot-desc = Картечное ядро для пушки.
uplink-pirate-sawn-name = обрез
uplink-pirate-sawn-desc = Против всякой шелупони. Использует патроны калибра .50 ружейный.
uplink-pirate-revolver-name = пиратский револьвер
uplink-pirate-revolver-desc = Странный дульнозарядный револьвер, который использовали пираты. Использует патроны калибра .45 магнум.
uplink-pirate-hand-cannon-name = пиратская пушка
uplink-pirate-hand-cannon-desc = Кабум!
uplink-pirate-outer-armor-podwars-name = броня Броненосец II
uplink-pirate-outer-armor-podwars-desc = Переделанный бронескафандр Броненосец II, реликвия войн подов.
uplink-pirate-helmet-armor-podwars-name = шлем Броненосец II
uplink-pirate-helmet-armor-podwars-desc = Переделанный шлем Броненосец II, реликвия войн подов.
uplink-pirate-outer-armor-captain-name = куртка капитана
uplink-pirate-outer-armor-captain-desc = Капитанская торжественная куртка, инкрустированная золотом.
uplink-pirate-ion-rifle-name = ионная винтовка
uplink-pirate-ion-rifle-desc = Ионно-электрическая разрушительная винтовка, специально разработана против мехов и боргов.
uplink-pirate-svalinn-name = лазерный пистолет Свалинн
uplink-pirate-svalinn-desc = Дешёвый и широко распространённый лазерный пистолет.
uplink-pirate-laser-name = старомодный лазерный бластер
uplink-pirate-laser-desc = Оружие, использующее свет, усиленный излучением радиации.
uplink-pirate-cutter-name = улучшенный плазменный резак
uplink-pirate-cutter-desc = Инструмент шахтеров, предназначенный для расчистки горных пород. Обладает усовершенствованной батареей и усиленной концентрирующей линзой.
uplink-pirate-microreactor-name = микрореакторная батарея
uplink-pirate-microreactor-desc = Стандартизированный перезаряжаемый микрореактор. Имеет пониженную ёмкость, но медленно заряжается сама по себе.
uplink-pirate-pirate-name = костлявый пират
uplink-pirate-pirate-desc = Лучший помощник любого капитана - скелет без шкафа!
uplink-pirate-cannon-name = пушка пиратского корабля
uplink-pirate-cannon-desc = Кабум!
uplink-pirate-granade-name = разрывная граната
uplink-pirate-granade-desc = Граната, создающая небольшой но разрушительный взрыв.
uplink-pirate-emp-granade-name = ЭМИ граната
uplink-pirate-emp-granade-desc = Граната, предназначенная для поражения электрических систем.
uplink-pirate-milk-name = молоко
uplink-pirate-milk-desc = Пей молоко - кости будут крепче стали!
uplink-pirate-cow-name = корова
uplink-pirate-cow-desc = Бесконечный источник молока.
uplink-pirate-bullet-proof-name = пуленепробиваемый жилет
uplink-pirate-bullet-proof-desc = Тяжёлый бронежилет типа III, способный защитить владельца от традиционного метательного оружия и взрывчатки в незначительной степени.
uplink-pirate-bullet-magnum-name = спидлодер .44 магнум
uplink-pirate-bullet-magnum-desc = Идеален для твоему револьверу!
uplink-pirate-lethal-shot-name = раздатчик ружейных патронов
uplink-pirate-lethal-shot-desc = Полная коробка летальных ружейных патронов.
uplink-ion-rifle-name = ионная винтовка
uplink-ion-rifle-desc = Винтовка разработанная для оперативного выведения из строя вражеского электрооборудования.
Expand All @@ -111,12 +177,12 @@ uplink-night-vision-desc = Прибор, позволяющий лучше ви
uplink-nukiesShield-name = двуручный штурмовой щит
uplink-nukiesShield-desc = Массивный и опасный, двуручный щит из элитных материалов для лучшей защиты, имеет несколько рядов пластин, а также несколько шипов на основе щита.
uplink-omnizinpizza-name = коробка с пиццей синдиката
uplink-omnizinpizza-desc = Это коробка, с самой обычной пиццей внутри, это именно то, что используют элитные агенты для перекуса между стрельбой с капитаном, и кражей Иана.
uplink-ADTModularGrenadeBundle-name = набор модульных гранат
uplink-ADTModularGrenadeBundle-desc = Содержит материалы для создания двух модульных пенных гранат. Распыляемый в пене реагент нужно достать самому.
uplink-omnizinpizza-name = коробка с пиццей Синдиката
uplink-omnizinpizza-desc = Это коробка с самой обычной пиццей внутри. Именно то, что используют элитные агенты для перекуса между перестрелками с Капитаном и кражей Иана.
uplink-attachmentsbundle-name = Набор оружейных модулей
uplink-attachmentsbundle-description = Комплект из вертикальной рукояти, лазерного целеуказателя, коллиматорного и оптического прицелов.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
ent-ADTPiratePiastr1 = пиастр
.desc = Самая ЯРРРР валюта!
.suffix = 1
ent-ADTPiratePiastr1000 = пиастр
.desc = Самая ЯРРРР валюта!
.suffix = 1000
ent-ADTBasePirateStore = магазин "Портовая крыса"
.desc = Лавка портовой крысы. Все необходимые для грабежа и налётов товары, высшего качества и свежести, украденные прямо из космических портов всех мегакорпораций!
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@ ent-ADTComputerShuttleSalvage = консоль управления утилиз
ent-ADTComputerSecShuttle = консоль управления шаттлом службы безопасности
.desc = Используется для пилотирования шаттлом службы безопасности.
ent-ADTComputerPalletConsolePirate = пиратская консоль продаж
.desc = Продаёт за пиастры.
1 change: 1 addition & 0 deletions Resources/Locale/ru-RU/ADT/store/currency.ftl
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
store-currency-display-Piastre = Пиастр
4 changes: 2 additions & 2 deletions Resources/Locale/ru-RU/ghost/roles/ghost-role-component.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -248,8 +248,8 @@ ghost-role-information-blackmarketeer-name = Торговец чёрного р
ghost-role-information-blackmarketeer-description = Заключайте сделки или беритесь за непосильную работу, чтобы к концу смены собрать самые интересные предметы.
ghost-role-information-cossack-name = Древний путешественник
ghost-role-information-cossack-description = Из истории, потерянной во времени, вы попадаете в наш век.
ghost-role-information-pirate-name = Космический пират
ghost-role-information-pirate-description = Агх, дружище! Собирайте крутые трофеи, но старайтесь избегать службы безопасности и утилизаторов!
ghost-role-information-pirate-name = Пират
ghost-role-information-pirate-description = Вы - Архаичный Пират. Постарайтесь собрать как можно больше блестящих побрякушек!
ghost-role-information-pirate-captain-name = Капитан космических пиратов
ghost-role-information-pirate-captain-description = Агх, дружище! Ты здесь главный, и тебе нужно разработать план, как заполучить эту сочную добычу с помощью крючка или мошенничества. Только постарайтесь избегать службы безопасности и утилизаторов!
ghost-role-information-disaster-victim-name = Жертва катастрофы
Expand Down
Loading

0 comments on commit 12ebc9c

Please sign in to comment.