From 15cdb3f3d3a1abf2e6afe0268578cc5ee833d384 Mon Sep 17 00:00:00 2001
From: Tony Bark <35226681+tonytins@users.noreply.github.com>
Date: Fri, 15 May 2026 11:09:57 -0400
Subject: [PATCH 1/2] Swapped combo boxes for lists boxes
---
CyberBits/CyberBits.csproj | 1 +
CyberBits/ViewModels/ViewModelBase.cs | 47 +++++++++++++++++++----
CyberBits/Views/MainWindow.axaml | 54 ++++++++++++++++-----------
3 files changed, 72 insertions(+), 30 deletions(-)
diff --git a/CyberBits/CyberBits.csproj b/CyberBits/CyberBits.csproj
index c4b89b3..d98e0b8 100644
--- a/CyberBits/CyberBits.csproj
+++ b/CyberBits/CyberBits.csproj
@@ -3,6 +3,7 @@
WinExe
net10.0
enable
+ LatestMajor
app.manifest
true
diff --git a/CyberBits/ViewModels/ViewModelBase.cs b/CyberBits/ViewModels/ViewModelBase.cs
index 73d0d35..3d616ef 100644
--- a/CyberBits/ViewModels/ViewModelBase.cs
+++ b/CyberBits/ViewModels/ViewModelBase.cs
@@ -5,31 +5,62 @@ namespace CyberBits.ViewModels;
public partial class ViewModelBase : ObservableObject
{
- public ObservableCollection Genitals { get; } = ["Cock", "Pussy"];
+ public ObservableCollection GenitalsList { get; } = ["Cock", "Pussy"];
- public ObservableCollection Models { get; } =
+ public ObservableCollection ModelsList { get; } =
[
"Au Natural",
- "Les Americaines"
+ "Les Americaines",
+ "La Grand Chungus",
+ "Veini Vici",
+ "Das Banane",
+ "The Ace Custom"
];
- public ObservableCollection Styles { get; } =
+ public ObservableCollection AestheticsList { get; } =
[
"Bioware",
- "Cyberware"
+ "Cyberware",
+ "Roboware",
+ "Holoware"
];
- public ObservableCollection Cyberware { get; } =
+ public ObservableCollection CyberwareList { get; } =
[
"Piercings",
- "Datajack"
+ "Datajack",
+ "Censor Field",
+ "Laser Sight",
+ "AI-Controlled Booster Module",
+ "Second Bladder",
+ "Map Hack",
+ "Monowire Blade",
+ "Projectile Launcher"
+ ];
+
+ public ObservableCollection PubesList { get; } =
+ [
+ "The Baldie",
+ "The Peach",
+ "The Landing Strip",
+ "The Peek-a-Boo",
+ "The Rectangle",
+ "The Bar Code",
+ "The Heart",
+ "The Lighting Bolt",
+ "The Neat Triangle",
+ "The Forest",
+ "The Jungle",
+ "The Breath of the Wild"
];
[ObservableProperty] private string? _selectedBits;
[ObservableProperty] private string? _selectedModels;
- [ObservableProperty] private string? _selectedStyles;
+ [ObservableProperty] private string? _selectedAesthetics;
[ObservableProperty] private string? _selectedCyberware;
+
+ [ObservableProperty] private string? _selectedPubes;
}
diff --git a/CyberBits/Views/MainWindow.axaml b/CyberBits/Views/MainWindow.axaml
index ee68ff6..adf846b 100644
--- a/CyberBits/Views/MainWindow.axaml
+++ b/CyberBits/Views/MainWindow.axaml
@@ -29,35 +29,45 @@
+
+
-
-
-
-
+
+
+
+
+
-
-
-
-
+ Margin="5"
+ Height="110" />
From 247b738eccad4595cf7a14ee72902f88bcb3fa5d Mon Sep 17 00:00:00 2001
From: Tony Bark <35226681+tonytins@users.noreply.github.com>
Date: Fri, 15 May 2026 13:39:25 -0400
Subject: [PATCH 2/2] Slight refractor
- Added balls and butt options
- Renamed Resources to Data
- Addons is now Universal (although probably going to be renamed to Common next)
- Bits was renamed Genitals
- Genital selection uses enums
---
.editorconfig | 14 ++++++
CyberBits/Assets/game_die.png | Bin 0 -> 9353 bytes
CyberBits/Bits.cs | 17 -------
CyberBits/CyberBits.csproj | 12 +++--
CyberBits/Data/cock.json | 21 +++++++++
CyberBits/Data/pussy.json | 20 +++++++++
CyberBits/Data/universal.json | 39 ++++++++++++++++
CyberBits/DataFiles.cs | 8 ++++
CyberBits/Genitals.cs | 33 ++++++++++++++
CyberBits/ImageHelper.cs | 2 +-
CyberBits/ResourceFiles.cs | 8 ----
CyberBits/Resources/addons.json | 6 ---
CyberBits/Resources/cock.json | 16 -------
CyberBits/Resources/pussy.json | 12 -----
CyberBits/ViewModels/ViewModelBase.cs | 29 ++++++++++--
CyberBits/Views/MainWindow.axaml | 61 +++++++++++++++++--------
CyberBits/Views/MainWindow.axaml.cs | 62 +++++++++++++++++++++++---
17 files changed, 268 insertions(+), 92 deletions(-)
create mode 100644 CyberBits/Assets/game_die.png
delete mode 100644 CyberBits/Bits.cs
create mode 100644 CyberBits/Data/cock.json
create mode 100644 CyberBits/Data/pussy.json
create mode 100644 CyberBits/Data/universal.json
create mode 100644 CyberBits/DataFiles.cs
create mode 100644 CyberBits/Genitals.cs
delete mode 100644 CyberBits/ResourceFiles.cs
delete mode 100644 CyberBits/Resources/addons.json
delete mode 100644 CyberBits/Resources/cock.json
delete mode 100644 CyberBits/Resources/pussy.json
diff --git a/.editorconfig b/.editorconfig
index 3e6adb7..a52bb32 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -43,6 +43,20 @@ dotnet_naming_rule.consts_must_be_all_caps.severity = warning
dotnet_naming_rule.consts_must_be_all_caps.symbols = const_fields
dotnet_naming_rule.consts_must_be_all_caps.style = all_caps
+
+# Turn off the naming style that enforces an underscore prefix for private fields
+dotnet_naming_style.underscore_prefix_style.capitalization = camel_case
+dotnet_naming_style.underscore_prefix_style.required_prefix = _
+
+# Remove the rule that ties the naming style to private fields
+dotnet_naming_rule.private_fields_underscore_rule.severity = none
+dotnet_naming_rule.private_fields_underscore_rule.symbols = private_fields
+dotnet_naming_rule.private_fields_underscore_rule.style = underscore_prefix_style
+
+# Symbol group for private fields (so the rule can be disabled)
+dotnet_naming_symbols.private_fields.applicable_kinds = field
+dotnet_naming_symbols.private_fields.applicable_accessibilities = private
+
# Formatting
csharp_new_line_before_open_brace = all
csharp_indent_case_contents = true
diff --git a/CyberBits/Assets/game_die.png b/CyberBits/Assets/game_die.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f4404b78ca8cf25ee10cce8a865fe3392cfe0ae
GIT binary patch
literal 9353
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
c
-
-
-
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
diff --git a/CyberBits/Data/cock.json b/CyberBits/Data/cock.json
new file mode 100644
index 0000000..345a28f
--- /dev/null
+++ b/CyberBits/Data/cock.json
@@ -0,0 +1,21 @@
+{
+ "image": "avares://CyberBits/Assets/cock.jpg",
+ "feat": "Aim Piss",
+ "model": [
+ "Au Natural",
+ "Les Americaines",
+ "La Grand Chungus",
+ "Veini Vici",
+ "Das Banane",
+ "The Ace Custom"
+ ],
+ "extra": [
+ "Hairy",
+ "Dangly",
+ "Asymmetrical",
+ "Bulbous",
+ "Doubled",
+ "Wrinkly",
+ "Cyber"
+ ]
+}
diff --git a/CyberBits/Data/pussy.json b/CyberBits/Data/pussy.json
new file mode 100644
index 0000000..ab57ac3
--- /dev/null
+++ b/CyberBits/Data/pussy.json
@@ -0,0 +1,20 @@
+{
+ "image": "avares://CyberBits/Assets/pussy.jpg",
+ "feat": "Boom of the Mother Godness",
+ "model": [
+ "The Shy Sharon",
+ "The Proud Priscilla",
+ "The Matronly Miriam",
+ "The Stretchy Sandra",
+ "The Outer Olivia"
+ ],
+ "extra": [
+ "Huge",
+ "Hooded",
+ "Bright",
+ "Shifted",
+ "Hard",
+ "Expansive",
+ "Cyber"
+ ]
+}
diff --git a/CyberBits/Data/universal.json b/CyberBits/Data/universal.json
new file mode 100644
index 0000000..0a0b6e3
--- /dev/null
+++ b/CyberBits/Data/universal.json
@@ -0,0 +1,39 @@
+{
+ "aesthetic": [
+ "Bioware",
+ "Cyberware",
+ "Roboware",
+ "Holoware"
+ ],
+ "cyberware": [
+ "Piercings",
+ "Datajack",
+ "Censor Field",
+ "Laser Sight",
+ "AI-Controlled Booster Module",
+ "Second Bladder",
+ "Map Hack",
+ "Monowire Blade",
+ "Projectile Launcher"
+ ],
+ "pubes": [
+ "The Baldie",
+ "The Peach",
+ "The Landing Strip",
+ "The Peek-a-Boo",
+ "The Rectangle",
+ "The Bar Code",
+ "The Heart",
+ "The Lighting Bolt",
+ "The Neat Triangle",
+ "The Forest",
+ "The Jungle",
+ "The Breath of the Wild"
+ ],
+ "butt":
+ [
+ "Big",
+ "Round",
+ "Firm"
+ ]
+}
diff --git a/CyberBits/DataFiles.cs b/CyberBits/DataFiles.cs
new file mode 100644
index 0000000..5bb1277
--- /dev/null
+++ b/CyberBits/DataFiles.cs
@@ -0,0 +1,8 @@
+namespace CyberBits;
+
+public struct DataFiles
+{
+ public const string COCK_JSON = "/Data/cock.json";
+ public const string PUSSY_JSON = "Data/pussy.json";
+ public const string UNIVERSAL_JSON = "Data/universal.json";
+}
diff --git a/CyberBits/Genitals.cs b/CyberBits/Genitals.cs
new file mode 100644
index 0000000..5a91bb0
--- /dev/null
+++ b/CyberBits/Genitals.cs
@@ -0,0 +1,33 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace CyberBits;
+
+public enum Genitals
+{
+ COCK,
+ PUSSY
+}
+
+public record GenitalModel(
+ [property: JsonPropertyName("image")]
+ string Image,
+ [property: JsonPropertyName("feat")]
+ string Feat,
+ [property: JsonPropertyName("model")]
+ string[] Model,
+ [property: JsonPropertyName("aesthetic")]
+ string[] Aesthetic,
+ [property: JsonPropertyName("extra")]
+ string[] Extra // Balls or Clits
+ );
+
+public record UniversalModel(
+ [property: JsonPropertyName("aesthetic")]
+ string[] Aesthetic,
+ [property: JsonPropertyName("cyberware")]
+ string[] Cyberware,
+ [property: JsonPropertyName("pubes")]
+ string[] Pubes,
+ [property: JsonPropertyName("butt")]
+ string[] Butt
+);
diff --git a/CyberBits/ImageHelper.cs b/CyberBits/ImageHelper.cs
index 808204b..06781f5 100644
--- a/CyberBits/ImageHelper.cs
+++ b/CyberBits/ImageHelper.cs
@@ -16,7 +16,7 @@ public static class ImageHelper
return new Bitmap(AssetLoader.Open(resourceUri));
}
- public static async Task LoadFromWeb(Uri url)
+ public static async Task LoadFromWebAsync(Uri url)
{
try
{
diff --git a/CyberBits/ResourceFiles.cs b/CyberBits/ResourceFiles.cs
deleted file mode 100644
index 09d3c03..0000000
--- a/CyberBits/ResourceFiles.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace CyberBits;
-
-public struct ResourceFiles
-{
- public const string COCK_JSON = "Resources/cock.json";
- public const string PUSSY_JSON = "Resources/pussy.json";
- public const string ADDONS_JSON = "Resources/addons.json";
-}
diff --git a/CyberBits/Resources/addons.json b/CyberBits/Resources/addons.json
deleted file mode 100644
index 3f038b0..0000000
--- a/CyberBits/Resources/addons.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "cyberware": [
- "Piercings",
- "Datajack"
- ]
-}
diff --git a/CyberBits/Resources/cock.json b/CyberBits/Resources/cock.json
deleted file mode 100644
index b11d20b..0000000
--- a/CyberBits/Resources/cock.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "image": "avares://CyberBits/Assets/cock.jpg",
- "feat": "Aim Piss",
- "model": [
- "Au Natural",
- "Les Americaines"
- ],
- "style": [
- "Bioware",
- "Cyberware"
- ],
- "cyberware": [
- "Piercings",
- "Datajack"
- ]
-}
diff --git a/CyberBits/Resources/pussy.json b/CyberBits/Resources/pussy.json
deleted file mode 100644
index 3608721..0000000
--- a/CyberBits/Resources/pussy.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "image": "avares://CyberBits/Assets/pussy.jpg",
- "feat": "Boom of the Mother Godness",
- "model": [
- "Au Natural",
- "Les Americaines"
- ],
- "style": [
- "Bioware",
- "Cyberware"
- ]
-}
diff --git a/CyberBits/ViewModels/ViewModelBase.cs b/CyberBits/ViewModels/ViewModelBase.cs
index 3d616ef..732a5ea 100644
--- a/CyberBits/ViewModels/ViewModelBase.cs
+++ b/CyberBits/ViewModels/ViewModelBase.cs
@@ -1,11 +1,12 @@
-using System.Collections.ObjectModel;
+using System;
+using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
namespace CyberBits.ViewModels;
public partial class ViewModelBase : ObservableObject
{
- public ObservableCollection GenitalsList { get; } = ["Cock", "Pussy"];
+ public Genitals[] GenitalOptions { get; } = Enum.GetValues();
public ObservableCollection ModelsList { get; } =
[
@@ -54,7 +55,25 @@ public partial class ViewModelBase : ObservableObject
"The Breath of the Wild"
];
- [ObservableProperty] private string? _selectedBits;
+ public ObservableCollection ExtrasList { get; } =
+ [
+ "Hairy",
+ "Dangly",
+ "Asymmetrical",
+ "Bulbous",
+ "Doubled",
+ "Wrinkly",
+ "Cyber"
+ ];
+
+ public ObservableCollection ButtsList { get; } =
+ [
+ "Big",
+ "Round",
+ "Firm"
+ ];
+
+ [ObservableProperty] private Genitals _selectedBits = Genitals.COCK;
[ObservableProperty] private string? _selectedModels;
@@ -63,4 +82,8 @@ public partial class ViewModelBase : ObservableObject
[ObservableProperty] private string? _selectedCyberware;
[ObservableProperty] private string? _selectedPubes;
+
+ [ObservableProperty] private string? _selectedExtras;
+
+ [ObservableProperty] private string? _selectedButt;
}
diff --git a/CyberBits/Views/MainWindow.axaml b/CyberBits/Views/MainWindow.axaml
index adf846b..d03aad9 100644
--- a/CyberBits/Views/MainWindow.axaml
+++ b/CyberBits/Views/MainWindow.axaml
@@ -3,8 +3,8 @@
xmlns:vm="using:CyberBits.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="720" d:DesignHeight="430"
- Width="720" Height="430" CanResize="False"
+ mc:Ignorable="d" d:DesignWidth="700" d:DesignHeight="520"
+ Width="700" Height="520" CanResize="False"
ExtendClientAreaToDecorationsHint="True"
x:Class="CyberBits.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
@@ -25,49 +25,72 @@
Text="CyberBits" >
-
+
-
-
-
+
-
+
-
+
+
+
-
+
+
-
+
+
+
diff --git a/CyberBits/Views/MainWindow.axaml.cs b/CyberBits/Views/MainWindow.axaml.cs
index 3569087..50032c7 100644
--- a/CyberBits/Views/MainWindow.axaml.cs
+++ b/CyberBits/Views/MainWindow.axaml.cs
@@ -1,29 +1,77 @@
using System;
+using System.IO;
+using System.Reflection;
+using System.Text.Json;
using Avalonia.Controls;
namespace CyberBits.Views;
public partial class MainWindow : Window
{
+ string? AppPath => Path.GetDirectoryName(Assembly.GetAssembly(typeof(MainWindow))?.Location);
+
public MainWindow()
{
InitializeComponent();
- VersionBox.Text = $"v{AppConsts.VERSION}";
+ try
+ {
+ var univieralFile = File.ReadAllText($"{AppPath}//{DataFiles.UNIVERSAL_JSON}");
+ var univieralData = JsonSerializer.Deserialize(univieralFile);
+
+ PubesItems.ItemsSource = univieralData?.Pubes;
+ CyberwareItems.ItemsSource = univieralData?.Cyberware;
+ AestheticsItems.ItemsSource = univieralData?.Aesthetic;
+ ButtOptions.ItemsSource = univieralData?.Butt;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ throw;
+ }
+
+#if DEBUG
+ VersionBox.Text = $"{AppConsts.VERSION}-{ThisAssembly.Git.Commit}";
+#else
+ VersionBox.Text = AppConsts.VERSION;
+#endif
+
+ }
+
+ void GenitalSwap(string image, string data)
+ {
+
+ try
+ {
+ var genitalFile = File.ReadAllText($"{AppPath}//{data}");
+ var genitalData = JsonSerializer.Deserialize(genitalFile);
+ var genitalImage = ImageHelper.LoadFromResource(new Uri(image));
+
+ BitsImage.Source = genitalImage;
+ ModelItems.ItemsSource = genitalData?.Model;
+ ExtraItems.ItemsSource = genitalData?.Extra;
+ }
+ catch (Exception e)
+ {
+ Console.WriteLine(e);
+ throw;
+ }
}
private void SelectedBitsControl_OnSelectionChanged(object? sender, SelectionChangedEventArgs e)
{
+ var appPath = Path.GetDirectoryName(Assembly.GetAssembly(typeof(MainWindow))?.Location);
+
switch (BitSelection.SelectionBoxItem)
{
- case "Pussy":
- var pussy = ImageHelper.LoadFromResource(new Uri("avares://CyberBits/Assets/pussy.jpg"));
- BitsImage.Source = pussy;
+ case Genitals.PUSSY:
+ GenitalSwap("avares://CyberBits/Assets/pussy.jpg", DataFiles.PUSSY_JSON);
+ ExtrasText.Text = "Clits";
break;
- case "Cock":
- var cock = ImageHelper.LoadFromResource(new Uri("avares://CyberBits/Assets/cock.jpg"));
- BitsImage.Source = cock;
+ case Genitals.COCK:
+ GenitalSwap("avares://CyberBits/Assets/cock.jpg", DataFiles.COCK_JSON);
+ ExtrasText.Text = "Balls";
break;
}
}