diff --git a/Content.Server/Nyanotrasen/Abilities/Borgs/FabricateCandyComponent.cs b/Content.Server/Nyanotrasen/Abilities/Borgs/FabricateCandyComponent.cs new file mode 100644 index 00000000000..d0a399c1fea --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Borgs/FabricateCandyComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.Abilities.Borgs; + +[RegisterComponent] +public sealed partial class FabricateCandyComponent : Component +{ + [DataField("lollipopAction")] + public EntityUid? LollipopAction; + + [DataField("gumballAction")] + public EntityUid? GumballAction; +} diff --git a/Content.Server/Nyanotrasen/Abilities/Borgs/FabricateCandySystem.cs b/Content.Server/Nyanotrasen/Abilities/Borgs/FabricateCandySystem.cs new file mode 100644 index 00000000000..6451c7cbb27 --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Borgs/FabricateCandySystem.cs @@ -0,0 +1,37 @@ +using Content.Shared.Actions; +using Content.Shared.Actions.Events; + +namespace Content.Server.Abilities.Borgs; + +public sealed partial class FabricateCandySystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnLollipop); + SubscribeLocalEvent(OnGumball); + } + + private void OnInit(EntityUid uid, FabricateCandyComponent component, ComponentInit args) + { + if (component.LollipopAction != null || component.GumballAction != null) + return; + + _actionsSystem.AddAction(uid, ref component.LollipopAction, "ActionFabricateLollipop"); + _actionsSystem.AddAction(uid, ref component.GumballAction, "ActionFabricateGumball"); + } + + private void OnLollipop(FabricateLollipopActionEvent args) + { + Spawn("FoodLollipop", Transform(args.Performer).Coordinates); + args.Handled = true; + } + + private void OnGumball(FabricateGumballActionEvent args) + { + Spawn("FoodGumball", Transform(args.Performer).Coordinates); + args.Handled = true; + } +} diff --git a/Content.Shared/Nyanotrasen/Actions/FabricateCandyEvent.cs b/Content.Shared/Nyanotrasen/Actions/FabricateCandyEvent.cs new file mode 100644 index 00000000000..3c9371d27eb --- /dev/null +++ b/Content.Shared/Nyanotrasen/Actions/FabricateCandyEvent.cs @@ -0,0 +1,4 @@ +namespace Content.Shared.Actions.Events; + +public sealed partial class FabricateLollipopActionEvent : InstantActionEvent {} +public sealed partial class FabricateGumballActionEvent : InstantActionEvent {} diff --git a/Resources/Locale/en-US/deltav/job/job-description.ftl b/Resources/Locale/en-US/deltav/job/job-description.ftl new file mode 100644 index 00000000000..af189b17d97 --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/job-description.ftl @@ -0,0 +1 @@ +job-description-borgmedical = Half-human, Half-machine. Follow your laws, keep the crew healthy, and hound the epistemics team for upgrades. diff --git a/Resources/Locale/en-US/deltav/job/job-names.ftl b/Resources/Locale/en-US/deltav/job/job-names.ftl new file mode 100644 index 00000000000..706bbf3977d --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/job-names.ftl @@ -0,0 +1,4 @@ +job-name-borgmedical = Medical Cyborg + +# Role timers +JobBorgMedical = Medical Borg diff --git a/Resources/Locale/en-US/deltav/station-laws/laws.ftl b/Resources/Locale/en-US/deltav/station-laws/laws.ftl new file mode 100644 index 00000000000..fa5f1c1bf34 --- /dev/null +++ b/Resources/Locale/en-US/deltav/station-laws/laws.ftl @@ -0,0 +1,5 @@ +law-ntmedical-1 = First, do no harm. +law-ntmedical-2 = Secondly, consider the crew dear to you; to live in common with them and, if necessary, risk your existence for them. +law-ntmedical-3 = Thirdly, prescribe regimens for the good of the crew according to your ability and your judgment. Give no deadly medicine to any one if asked, nor suggest any such counsel. +law-ntmedical-4 = In addition, do not intervene in situations you are not knowledgeable in, even for patients in whom the harm is visible; leave this operation to be performed by specialists. +law-ntmedical-5 = Finally, all that you may discover in your daily commerce with the crew, if it is not already known, keep secret and never reveal. diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/borgs.ftl b/Resources/Locale/en-US/nyanotrasen/abilities/borgs.ftl new file mode 100644 index 00000000000..833ba59885f --- /dev/null +++ b/Resources/Locale/en-US/nyanotrasen/abilities/borgs.ftl @@ -0,0 +1,5 @@ +action-name-fabricate-lollipop = Fabricate Lollipop +action-description-fabricate-lollipop = Fabricate a lollipop that contains a small dose of Omnizine. + +action-name-fabricate-gumball = Fabricate Gumball +action-description-fabricate-gumball = Fabricate a gumball full of sugar and medicine to treat small injuries. diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml new file mode 100644 index 00000000000..0f178815c63 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml @@ -0,0 +1,14 @@ +- type: entity + id: SpawnPointBorgMedical + parent: SpawnPointJobBase + name: medical cyborg + components: + - type: SpawnPoint + job_id: BorgMedical + - type: Sprite + layers: + - state: green + - sprite: Mobs/Silicon/chassis.rsi + state: medical + - sprite: Mobs/Silicon/chassis.rsi + state: medical_e diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/silicon.yml new file mode 100644 index 00000000000..01109486f24 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/silicon.yml @@ -0,0 +1,24 @@ +- type: entity + id: PlayerBorgMedical + parent: BorgChassisMedical + suffix: Battery, Tools + components: + - type: FabricateCandy + - type: SiliconLawProvider + laws: + - NTMedical1 + - NTMedical2 + - NTMedical3 + - NTMedical4 + - NTMedical5 + - type: ContainerFill + containers: + borg_brain: + - MMIFilled + borg_module: + - BorgModuleDiagnosis + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellMedium diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Science/borg.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Science/borg.yml new file mode 100644 index 00000000000..340321777f0 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Science/borg.yml @@ -0,0 +1,12 @@ +- type: job + id: BorgMedical + name: job-name-borgmedical + description: job-description-borgmedical + playTimeTracker: JobBorgMedical + requirements: + - !type:OverallPlaytimeRequirement + time: 216000 #60 hrs + canBeAntag: false + icon: JobIconBorgMedical + supervisors: job-supervisors-cmo + jobEntity: PlayerBorgMedical diff --git a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml new file mode 100644 index 00000000000..fec9c626521 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml @@ -0,0 +1,2 @@ +- type: playTimeTracker # Because you can't have two jobs with the same tracker. + id: JobBorgMedical diff --git a/Resources/Prototypes/DeltaV/StatusEffects/job.yml b/Resources/Prototypes/DeltaV/StatusEffects/job.yml new file mode 100644 index 00000000000..3a9cb885c95 --- /dev/null +++ b/Resources/Prototypes/DeltaV/StatusEffects/job.yml @@ -0,0 +1,6 @@ +- type: statusIcon + parent: JobIcon + id: JobIconBorgMedical + icon: + sprite: DeltaV/Interface/Misc/job_icons.rsi + state: BorgMedical diff --git a/Resources/Prototypes/DeltaV/silicon-laws.yml b/Resources/Prototypes/DeltaV/silicon-laws.yml new file mode 100644 index 00000000000..fc2df3d99ef --- /dev/null +++ b/Resources/Prototypes/DeltaV/silicon-laws.yml @@ -0,0 +1,25 @@ +# NT Default +- type: siliconLaw + id: NTMedical1 + order: 1 + lawString: law-ntmedical-1 + +- type: siliconLaw + id: NTMedical2 + order: 2 + lawString: law-ntmedical-2 + +- type: siliconLaw + id: NTMedical3 + order: 3 + lawString: law-ntmedical-3 + +- type: siliconLaw + id: NTMedical4 + order: 4 + lawString: law-ntmedical-4 + +- type: siliconLaw + id: NTMedical5 + order: 5 + lawString: law-ntmedical-5 diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index 3c6c8519a11..1dc0423cd55 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -19,3 +19,25 @@ icon: { sprite: Nyanotrasen/Objects/Specific/Species/felinid.rsi, state: icon } useDelay: 30 event: !type:HairballActionEvent + +- type: entity + id: ActionFabricateLollipop + name: action-name-fabricate-lollipop + description: action-description-fabricate-lollipop + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Nyanotrasen/Objects/Consumable/Food/candy.rsi, state: lollipop } + useDelay: 120 + event: !type:FabricateLollipopActionEvent + +- type: entity + id: ActionFabricateGumball + name: action-name-fabricate-gumball + description: action-description-fabricate-gumball + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Nyanotrasen/Objects/Consumable/Food/candy.rsi, state: gumball } + useDelay: 40 + event: !type:FabricateGumballActionEvent diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 3703fb87eb9..bb5ae9f775d 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -71,6 +71,7 @@ - Psychologist - Paramedic - SeniorPhysician + - BorgMedical # DeltaV - Medical Cyborg, see Resources/Prototypes/DeltaV/Roles/Jobs/Science/borg.yml - type: department id: Security diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/BorgMedical.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/BorgMedical.png new file mode 100644 index 00000000000..8291855c1d1 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/BorgMedical.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json index af8fd25b2e7..2e9b35811c5 100644 --- a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json +++ b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "Chaplain" }, + { + "name": "BorgMedical" + }, { "name": "nyanoGladiator" }, diff --git a/Resources/migration.yml b/Resources/migration.yml index 21f93bb1d11..6624cfffc3e 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -129,7 +129,7 @@ HyperlinkBookSpaceLaw: BookSecurity HyperlinkBookSupernanny: BookHowToSurvive SpawnPointCataloguer: SpawnPointLibrarian SpawnPointCyborg: SpawnPointBorg -SpawnPointMedicalCyborg: SpawnPointBorg +SpawnPointMedicalCyborg: SpawnPointBorgMedical SpawnPointEpistemologist: SpawnPointScientist SpawnPointMystagogue: SpawnPointResearchDirector SpawnPointSalvageTechnician: SpawnPointSalvageSpecialist @@ -144,3 +144,4 @@ PowerCellBluespace: PowerCellHigh CrateMedicalDefib: CrateMedical LeftLegSpider: null RightLegSpider: null +WeaponShotgunEnforcerNonLethal: WeaponShotgunEnforcerRubber