Add project files.

This commit is contained in:
Lohikar 2017-11-17 10:17:34 -06:00
parent 501225291b
commit 91d580e21f
20 changed files with 1742 additions and 0 deletions

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>

View file

@ -0,0 +1,19 @@
<Application x:Class="AuroraRecordGenerator.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:AuroraRecordGenerator"
StartupUri="RecordEditor.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- MahApps.Metro resource dictionaries. Make sure that all file names are Case Sensitive! -->
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" />
<!-- Accent and AppTheme setting -->
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

View file

@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace AuroraRecordGenerator
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
}
}

View file

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{2E1295C2-7BD9-454E-B13E-8A22448DD5F6}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>AuroraRecordGenerator</RootNamespace>
<AssemblyName>AuroraRecordGenerator</AssemblyName>
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Humanizer, Version=2.1.0.0, Culture=neutral, PublicKeyToken=979442b78dfc278e, processorArchitecture=MSIL">
<HintPath>..\packages\Humanizer.Core.2.1.0\lib\netstandard1.0\Humanizer.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="MahApps.Metro, Version=1.3.0.0, Culture=neutral, PublicKeyToken=f4fb5a3c4d1e5b4f, processorArchitecture=MSIL">
<HintPath>..\packages\MahApps.Metro.1.3.0\lib\net45\MahApps.Metro.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="protobuf-net, Version=2.1.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
<HintPath>..\packages\protobuf-net.2.1.0\lib\net451\protobuf-net.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Windows.Interactivity, Version=4.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\MahApps.Metro.1.3.0\lib\net45\System.Windows.Interactivity.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="GeneratedResultWindow.xaml.cs">
<DependentUpon>GeneratedResultWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Record.cs" />
<Compile Include="RecordFormatter.cs" />
<Compile Include="RecordFormatterGenerationMethods.cs" />
<Compile Include="Types.cs" />
<Compile Include="Utility.cs" />
<Page Include="GeneratedResultWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="RecordEditor.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="RecordEditor.xaml.cs">
<DependentUpon>RecordEditor.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<AppDesigner Include="Properties\" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -0,0 +1,23 @@
<controls:MetroWindow x:Class="AuroraRecordGenerator.GeneratedResultWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:AuroraRecordGenerator"
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
mc:Ignorable="d"
Title="Generated Records" Height="500" Width="850" TitleCaps="False">
<Grid>
<TabControl Margin="10">
<TabItem Header="Employment">
<TextBox x:Name="EmploymentBox" IsReadOnly="True" IsUndoEnabled="False" AutoWordSelection="True" FontFamily="Times New Roman"/>
</TabItem>
<TabItem Header="Medical">
<TextBox x:Name="MedicalBox" IsReadOnly="True" IsUndoEnabled="False" AutoWordSelection="True" FontFamily="Times New Roman"/>
</TabItem>
<TabItem Header="Security">
<TextBox x:Name="SecurityBox" IsReadOnly="True" IsUndoEnabled="False" AutoWordSelection="True" FontFamily="Times New Roman"/>
</TabItem>
</TabControl>
</Grid>
</controls:MetroWindow>

View file

@ -0,0 +1,18 @@
namespace AuroraRecordGenerator
{
public partial class GeneratedResultWindow
{
public GeneratedResultWindow()
{
InitializeComponent();
}
public GeneratedResultWindow(Record record) : this()
{
var formatter = new RecordFormatter(record);
EmploymentBox.Text = formatter.EmploymentRecords;
MedicalBox.Text = formatter.MedicalRecords;
SecurityBox.Text = formatter.SecurityRecords;
}
}
}

View file

@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("AuroraRecordGenerator")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AuroraRecordGenerator")]
[assembly: AssemblyCopyright("Copyright © 2016")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
//In order to begin building localizable applications, set
//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file
//inside a <PropertyGroup>. For example, if you are using US english
//in your source files, set the <UICulture> to en-US. Then uncomment
//the NeutralResourceLanguage attribute below. Update the "en-US" in
//the line below to match the UICulture setting in the project file.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
//(used if a resource is not found in the page,
// or application resource dictionaries)
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
//(used if a resource is not found in the page,
// app, or any theme specific resource dictionaries)
)]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AuroraRecordGenerator.Properties
{
/// <summary>
/// A strongly-typed resource class, for looking up localized strings, etc.
/// </summary>
// This class was auto-generated by the StronglyTypedResourceBuilder
// class via a tool like ResGen or Visual Studio.
// To add or remove a member, edit your .ResX file then rerun ResGen
// with the /str option, or rebuild your VS project.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Returns the cached ResourceManager instance used by this class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AuroraRecordGenerator.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Overrides the current thread's CurrentUICulture property for all
/// resource lookups using this strongly typed resource class.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View file

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View file

@ -0,0 +1,30 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AuroraRecordGenerator.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}

View file

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

View file

@ -0,0 +1,117 @@
using System;
using ProtoBuf;
namespace AuroraRecordGenerator
{
[ProtoContract]
public class Record
{
// Defaults defined here will automatically populate the form on program load
[ProtoMember(1)]
public string FirstName { get; set; } = string.Empty;
[ProtoMember(2)]
public string MiddleName { get; set; } = string.Empty;
[ProtoMember(3)]
public string LastName { get; set; } = string.Empty;
[ProtoMember(4)]
public string NameSuffix { get; set; } = string.Empty;
[ProtoMember(5, IsRequired = true)]
public SpeciesType Species { get; set; } = SpeciesType.Human;
[ProtoMember(6, IsRequired = true)]
public GenderType Gender { get; set; }
[ProtoMember(7)]
public DateTime BirthDate { get; set; } = DateTime.Parse("1/1/2458");
[ProtoMember(8)]
public double? CharHeight { get; set; } = 170;
[ProtoMember(9)]
public double? Weight { get; set; } = 70;
[ProtoMember(10)]
public string SkinColor { get; set; } = string.Empty;
[ProtoMember(11)]
public string EyeColor { get; set; } = string.Empty;
[ProtoMember(12)]
public string DistinguishingFeatures { get; set; } = string.Empty;
[ProtoMember(13)]
public string HairColor { get; set; } = string.Empty;
[ProtoMember(14)]
public string EmployedAs { get; set; } = string.Empty;
[ProtoMember(15)]
public string Citizenship { get; set; } = string.Empty;
// 16 & 17 used to be PictureUrl and PictureCredit, now unused.
[ProtoMember(18)]
public string Clearance { get; set; } = string.Empty;
[ProtoMember(19)]
public string MedicalPublicRecord { get; set; } = string.Empty;
[ProtoMember(20)]
public string MedicalHistory { get; set; } = string.Empty;
[ProtoMember(21)]
public string MedicalNotes { get; set; } = string.Empty;
[ProtoMember(22)]
public string MedicalPsychHistory { get; set; } = string.Empty;
[ProtoMember(23)]
public string MedicalPsychNotes { get; set; } = string.Empty;
[ProtoMember(24)]
public bool NoBorg { get; set; } = false;
[ProtoMember(25)]
public bool NoClone { get; set; } = false;
[ProtoMember(26)]
public bool NoRevive { get; set; } = false;
[ProtoMember(27)]
public bool NoProsthetic { get; set; } = false;
[ProtoMember(28)]
public string MedicalPrescriptions { get; set; } = string.Empty;
[ProtoMember(29)]
public string SecurityPublicRecord { get; set; } = string.Empty;
[ProtoMember(30)]
public string SecurityRecords { get; set; } = string.Empty;
[ProtoMember(31)]
public string SecurityNotes { get; set; } = string.Empty;
[ProtoMember(32)]
public string EmploymentPublicRecord { get; set; } = string.Empty;
[ProtoMember(33)]
public string EmploymentExperience { get; set; } = string.Empty;
[ProtoMember(34)]
public string EmploymentPreNtEmployment { get; set; } = string.Empty;
[ProtoMember(35)]
public string EmploymentFormalEducation { get; set; } = string.Empty;
[ProtoMember(36)]
public string EmploymentNtEmploymentHistory { get; set; } = string.Empty;
[ProtoMember(37)]
public string EmploymentSkills { get; set; } = string.Empty;
}
}

View file

@ -0,0 +1,385 @@
<controls:MetroWindow x:Class="AuroraRecordGenerator.RecordEditor"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:AuroraRecordGenerator"
xmlns:system="clr-namespace:System;assembly=mscorlib"
xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
mc:Ignorable="d"
Title="Aurora Character Records Generator" Height="563" Width="719.583"
TitleCharacterCasing="Normal" Loaded="WindowLoaded">
<controls:MetroWindow.Resources>
<!-- Species Combobox Data Source -->
<ObjectDataProvider x:Key="SpeciesEnum" MethodName="GetValues" ObjectType="{x:Type system:Enum}">
<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:SpeciesType" />
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
<ObjectDataProvider x:Key="SubspeciesEnum" MethodName="GetSpeciesOptions" ObjectType="{x:Type local:RecordEditor}"/>
</controls:MetroWindow.Resources>
<Grid>
<TabControl Margin="0,10,0,44.96" controls:TabControlHelper.IsUnderlined="True">
<!-- General Character Information -->
<TabItem Header="General">
<ScrollViewer>
<StackPanel>
<GroupBox Header="Basic Information" controls:ControlsHelper.ContentCharacterCasing="Normal"
Height="240">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="260" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBox Height="26"
Margin="10,26,5,0"
TextWrapping="Wrap" VerticalAlignment="Top"
ToolTip="Your character's first name. Required."
Text="{Binding Path=FirstName}" controls:TextBoxHelper.Watermark="Urist" />
<TextBox Height="26"
Margin="0,26,0,0"
TextWrapping="Wrap"
ToolTip="Your character's middle name. Optional." Grid.Column="1"
HorizontalAlignment="Left" Width="120" VerticalAlignment="Top"
Text="{Binding Path=MiddleName}" />
<TextBox Height="26"
Margin="125,26,0,0"
TextWrapping="Wrap" VerticalAlignment="Top"
ToolTip="Your character's last name. Required." Grid.Column="1"
Text="{Binding Path=LastName}" controls:TextBoxHelper.Watermark="McScientist" />
<TextBlock Grid.Column="0" Margin="10,10,10,0" TextWrapping="Wrap"
Text="First"
VerticalAlignment="Top" Height="16" />
<TextBlock HorizontalAlignment="Left" Margin="0,10,0,0" TextWrapping="Wrap"
Text="Middle (Optional)" VerticalAlignment="Top" Grid.Column="1"
Height="15.96" Width="120"/>
<TextBlock Margin="125,10,10,0" TextWrapping="Wrap"
Text="Last"
VerticalAlignment="Top" Grid.Column="1" Height="15.96"/>
<TextBox Height="26"
Margin="5,26,10.5,0" TextWrapping="Wrap"
ToolTip="Your character's name suffix, if present. Optional." Grid.Column="2"
VerticalAlignment="Top"
Text="{Binding Path=NameSuffix}" controls:TextBoxHelper.Watermark="the Third" />
<TextBlock HorizontalAlignment="Left" Margin="5,10,0,0" TextWrapping="Wrap"
Text="Suffix (Optional)" VerticalAlignment="Top" Grid.Column="2"
Height="15.96" Width="150" />
<TextBlock Grid.Column="0" Margin="10,57,10,0" TextWrapping="Wrap"
Text="Species"
VerticalAlignment="Top" Height="15.96"/>
<ComboBox Grid.Column="0" x:Name="SpeciesCombo" Margin="10,73,5,0"
VerticalAlignment="Top"
ItemsSource="{Binding Source={StaticResource SpeciesEnum}}"
ToolTip="Your character's species. Required."
SelectionChanged="SpeciesSelectChanged" Height="26"/>
<TextBlock HorizontalAlignment="Left" Margin="0,57,0,0" TextWrapping="Wrap"
Text="Gender"
VerticalAlignment="Top" Grid.Column="1" Height="15.96" Width="120"/>
<ComboBox x:Name="GenderCombo" HorizontalAlignment="Left" Margin="0,73,0,0"
VerticalAlignment="Top" Width="120"
ToolTip="Your character's gender. Does not apply to Dionae and IPCs."
Grid.Column="1" Height="26">
<ComboBoxItem Content="Male" />
<!-- Define here instead of loading from enum as we don't want NotApplicable listed -->
<ComboBoxItem Content="Female" />
</ComboBox>
<DatePicker Margin="125,73,0,0" VerticalAlignment="Top"
SelectedDateFormat="Short" DisplayDateEnd="2470-01-01"
DisplayDateStart="1955-01-01" DisplayDate="2458-01-01" Grid.Column="1"
Height="26"
SelectedDate="{Binding Path=BirthDate}" />
<TextBlock Margin="125,57,40.96,0" TextWrapping="Wrap" Text="Date of Birth"
VerticalAlignment="Top" Grid.Column="1" Height="15.96" />
<TextBlock Grid.Column="0" Margin="10,0,0,34" TextWrapping="Wrap" Text="Clearance"
VerticalAlignment="Bottom" HorizontalAlignment="Left" />
<TextBox Height="23" Margin="10,0,0,8" TextWrapping="Wrap"
VerticalAlignment="Bottom" Grid.ColumnSpan="2"
Grid.Column="0"
controls:TextBoxHelper.Watermark="Staff (Research, Xenobiology), Command (Research)"
Text="{Binding Path=Clearance}" />
<TextBlock HorizontalAlignment="Left" Margin="0,0,0,81"
TextWrapping="Wrap" Text="Employed As" VerticalAlignment="Bottom" Grid.Column="1" />
<TextBox Height="23" Margin="0,0,0,55" TextWrapping="Wrap"
VerticalAlignment="Bottom" controls:TextBoxHelper.Watermark="Xenobiologist"
Text="{Binding Path=EmployedAs}" HorizontalAlignment="Left" Width="260" Grid.Column="1" />
<TextBox Grid.Column="2" Height="23" Margin="5,73,10.5,0"
TextWrapping="Wrap" VerticalAlignment="Top" controls:TextBoxHelper.Watermark="Sol Alliance"
Text="{Binding Path=Citizenship}" />
<TextBlock Grid.Column="2" HorizontalAlignment="Left" Margin="5,57,0,0" TextWrapping="Wrap" Text="Citizenship" VerticalAlignment="Top" />
<ComboBox Grid.Column="0" x:Name="SubSpeciesCombo" Margin="10,120,5,0"
VerticalAlignment="Top"
ToolTip="Your character's species. Required."
SelectionChanged="SpeciesSelectChanged" Height="26"
/>
<TextBlock Grid.Column="0" Margin="10,104,10,0" TextWrapping="Wrap"
Text="Subtype/Ethnicity"
VerticalAlignment="Top" Height="16"
/>
</Grid>
</GroupBox>
<GroupBox Header="Appearance" controls:ControlsHelper.ContentCharacterCasing="Normal">
<Grid Height="125">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="550" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap"
VerticalAlignment="Top" Text="Height (cm)" />
<controls:NumericUpDown Grid.Column="0"
Value="{Binding Path=CharHeight}"
HorizontalAlignment="Left" Margin="10,26,0,0"
Minimum="10" Maximum="400" HideUpDownButtons="True" Width="1"
StringFormat="N1" VerticalAlignment="Top"
HorizontalContentAlignment="Center" />
<controls:NumericUpDown Grid.Column="0"
Value="{Binding Path=Weight}"
HorizontalAlignment="Left" Margin="77.033,26,0,0"
Minimum="10" Maximum="100" HideUpDownButtons="True" Width="1"
StringFormat="N1" VerticalAlignment="Top"
HorizontalContentAlignment="Center" />
<TextBlock Grid.Column="0" HorizontalAlignment="Left" Margin="77.033,10,0,0"
TextWrapping="Wrap"
VerticalAlignment="Top" Text="Weight (kg)" />
<TextBlock Grid.Column="0" HorizontalAlignment="Left" Margin="144.033,10,0,0"
TextWrapping="Wrap"
Text="Skin/Body Color" VerticalAlignment="Top" />
<TextBox Grid.Column="0" Height="23"
Margin="144.033,25.96,261.967,0" TextWrapping="Wrap" VerticalAlignment="Top"
ToolTip="The color of your character's skin/scales/fur/chassis. Not applicable for Dionae."
d:LayoutOverrides="HorizontalAlignment" Text="{Binding Path=SkinColor}" />
<TextBlock Grid.Column="0" HorizontalAlignment="Left" Margin="10,57,0,52"
TextWrapping="Wrap"
Text="Distinguishing Features" d:LayoutOverrides="Height" />
<TextBox Grid.Column="0" Height="23"
Margin="10,0,0,26" Text="{Binding Path=DistinguishingFeatures}"
TextWrapping="Wrap" VerticalAlignment="Bottom" />
<TextBox Grid.Column="0" Height="23"
Margin="0,25.96,136.967,0"
TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Right"
Width="120" d:LayoutOverrides="HorizontalAlignment"
Text="{Binding Path=HairColor}" />
<TextBlock Grid.Column="0" Margin="0,10,203.403,0" TextWrapping="Wrap"
Text="Hair Color"
VerticalAlignment="Top" HorizontalAlignment="Right"
d:LayoutOverrides="HorizontalAlignment" />
<TextBox Grid.Column="0" HorizontalAlignment="Right"
Margin="0,25.96,0,0"
TextWrapping="Wrap" Width="131.967" Height="26" VerticalAlignment="Top"
Text="{Binding Path=EyeColor}" />
<TextBlock Grid.Column="0" HorizontalAlignment="Right" Margin="0,10,81.957,0"
TextWrapping="Wrap"
Text="Eye Color" VerticalAlignment="Top" />
</Grid>
</GroupBox>
</StackPanel>
</ScrollViewer>
</TabItem>
<!-- Employment Information -->
<TabItem Header="Employment">
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="0" />
</Grid.RowDefinitions>
<GridSplitter Grid.Row="0" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="1" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="2" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="3" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="4" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="5" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Public Record"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True" Grid.Row="0"
ToolTip="Public employment notes posted on security and medical records. One per line."
d:LayoutOverrides="VerticalAlignment" Text="{Binding Path=EmploymentPublicRecord}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Experience"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True" Grid.Row="1"
ToolTip="Jobs/departments worked with NT. One per line."
d:LayoutOverrides="VerticalAlignment" Text="{Binding Path=EmploymentExperience}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.Watermark="Pre-NanoTrasen Employment History"
controls:TextBoxHelper.UseFloatingWatermark="True" Grid.Row="2"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="Jobs/experience from before NT employment. One per line."
Text="{Binding Path=EmploymentPreNtEmployment}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" Grid.Row="3"
controls:TextBoxHelper.Watermark="Formal Education"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="History with employment with NT. One per line, should be in format &quot;Year Description&quot;."
Text="{Binding Path=EmploymentFormalEducation}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" Grid.Row="4"
controls:TextBoxHelper.Watermark="NanoTrasen Employment History"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="Formal education completed or in-progress. One per-line."
Text="{Binding Path=EmploymentNtEmploymentHistory}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap"
controls:TextBoxHelper.Watermark="Trained-in/Skills" Grid.Row="5"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
Text="{Binding Path=EmploymentSkills}"
ToolTip="Training or Skills your character has. Anything marked as &quot;Trained&quot; or &quot;Professional&quot; in character skills should go here, along with any amatur skills of note." />
</Grid>
</ScrollViewer>
</TabItem>
<!-- Medical Information -->
<TabItem Header="Medical">
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60" />
<!-- Checkboxes -->
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="0" />
</Grid.RowDefinitions>
<!-- Opt-Outs -->
<Grid Grid.Row="0" ToolTip="If the character wishes to not be cloned.">
<CheckBox Content="Do Not Clone" HorizontalAlignment="Left"
Margin="10,10,0,0" VerticalAlignment="Top" />
<CheckBox Content="No Prosthetics"
HorizontalAlignment="Left" Margin="10,33,0,0" VerticalAlignment="Top"
ToolTip="If the character should not be fitted with prosthetics." />
<CheckBox Content="Do Not Borgify" HorizontalAlignment="Left"
Margin="136,10,0,0" VerticalAlignment="Top"
ToolTip="If the character should not be borged." />
<CheckBox Content="Do Not Resuscitate"
HorizontalAlignment="Left" Margin="136,33,0,0" VerticalAlignment="Top"
ToolTip="If the character should not be revived." />
</Grid>
<!-- whee, user-resizable stuff is fun! Not. -->
<GridSplitter Grid.Row="1" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="2" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="3" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="4" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="5" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="6" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Public Record"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="Public medical notes posted on employment and security records. One per line."
Grid.Row="1" VerticalScrollBarVisibility="Auto"
Text="{Binding Path=MedicalPublicRecord}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True" TextWrapping="Wrap"
controls:TextBoxHelper.Watermark="Medical History"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
VerticalScrollBarVisibility="Auto"
ToolTip="Dated list of operations, surgeries, checkups of note, etc. One per line."
Grid.Row="2" Text="{Binding Path=MedicalHistory}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True" TextWrapping="Wrap"
controls:TextBoxHelper.Watermark="Medical Notes"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
VerticalScrollBarVisibility="Auto"
ToolTip="Notes about physical/medical health. One per line." Grid.Row="3"
Text="{Binding Path=MedicalNotes}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Psychiatric History"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
VerticalScrollBarVisibility="Auto"
ToolTip="Dated records of psych evals and other psychological events." Grid.Row="4"
Text="{Binding Path=MedicalPsychHistory}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Psychiatric Notes"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
VerticalScrollBarVisibility="Auto"
ToolTip="Notes about mental/psychiatric health. One per line." Grid.Row="5"
Text="{Binding Path=MedicalPsychNotes}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Prescriptions"
controls:TextBoxHelper.UseFloatingWatermark="True"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
VerticalScrollBarVisibility="Auto"
ToolTip="Notes regarding assigned prescriptions. One per line." Grid.Row="6"
Text="{Binding Path=MedicalPrescriptions}" />
</Grid>
</ScrollViewer>
</TabItem>
<!-- Security Information -->
<TabItem Header="Security">
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="122" MinHeight="60" />
<RowDefinition Height="0" />
</Grid.RowDefinitions>
<GridSplitter Grid.Row="0" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="1" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<GridSplitter Grid.Row="2" Grid.ColumnSpan="1" HorizontalAlignment="Stretch"
VerticalAlignment="Bottom" Margin="0" Height="10" />
<TextBox Grid.Row="0" Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Public Record"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="Public security notes added to employment and medical records. One per line."
Text="{Binding Path=SecurityPublicRecord}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Records"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="List of charges, dated if possible. One per line." Grid.Row="1"
Text="{Binding Path=SecurityRecords}" />
<TextBox Margin="0,10,0,10" AcceptsReturn="True"
TextWrapping="Wrap" controls:TextBoxHelper.Watermark="Notes"
controls:TextBoxHelper.UseFloatingWatermark="True" VerticalScrollBarVisibility="Auto"
controls:TextBoxHelper.IsSpellCheckContextMenuEnabled="True"
ToolTip="Any things security should keep in mind when dealing with you. One per line."
Grid.Row="2" Text="{Binding Path=SecurityNotes}" />
</Grid>
</ScrollViewer>
</TabItem>
</TabControl>
<!-- Footer -->
<Grid Height="45" VerticalAlignment="Bottom">
<Button Content="Open" HorizontalAlignment="Left" Margin="10,9.66,0,10" Width="75"
d:LayoutOverrides="Height" Click="OpenContent" />
<Button Content="Save" HorizontalAlignment="Left" Margin="90,10,0,9.66" Width="75"
d:LayoutOverrides="Height" Click="SaveContent" />
<Button Content="Save As" HorizontalAlignment="Left" Margin="170,10,0,9.66"
Width="75" d:LayoutOverrides="Height" Click="SaveContentAs" />
<Button Content="Generate" HorizontalAlignment="Right" Margin="0,10.3,10,9.66"
Width="75" d:LayoutOverrides="Height" Click="GenerateRecord" />
</Grid>
</Grid>
</controls:MetroWindow>

View file

@ -0,0 +1,151 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using MahApps.Metro.Controls.Dialogs;
using System.Collections.Generic;
using System.Linq;
namespace AuroraRecordGenerator
{
/// <summary>
/// Interaction logic for RecordEditor.xaml
/// </summary>
public partial class RecordEditor
{
public RecordEditor()
{
// Initialize the record object used for storage and generation
Data = new Record();
DataContext = Data;
ProtoBuf.Serializer.PrepareSerializer<GenderType>();
ProtoBuf.Serializer.PrepareSerializer<SpeciesType>();
ProtoBuf.Serializer.PrepareSerializer<Record>();
InitializeComponent();
SubSpeciesCombo.ItemsSource = GetSpeciesOptions();
}
private Record Data { get; set; }
private string _currentFilePath;
private void SpeciesSelectChanged(object sender, SelectionChangedEventArgs e)
{
if (SpeciesCombo.SelectionBoxItem == null)
return;
var type = (SpeciesType) SpeciesCombo.SelectedValue;
switch (type)
{
// non-gendered species
case SpeciesType.Diona:
case SpeciesType.IPC:
case SpeciesType.Vaurca:
Debug.WriteLine("Disabled GenderCombo, type is " + type);
GenderCombo.IsEnabled = false;
GenderCombo.Text = "N/A";
break;
// gendered species
case SpeciesType.Human:
case SpeciesType.Skrell:
case SpeciesType.Tajara:
case SpeciesType.Unathi:
Debug.WriteLine("Enabled GenderCombo, type is " + type);
GenderCombo.IsEnabled = true;
break;
case SpeciesType.None:
break;
default:
throw new ArgumentOutOfRangeException();
}
SubSpeciesCombo.ItemsSource = GetSpeciesOptions(type);
}
private void WindowLoaded(object sender, RoutedEventArgs e)
{
SpeciesCombo.SelectedIndex = 0;
}
private void GenerateRecord(object sender, RoutedEventArgs e)
{
// THIS IS IT
var wnd = new GeneratedResultWindow(Data);
wnd.Show();
}
private async void SaveContent(object sender, RoutedEventArgs e)
{
if (string.IsNullOrWhiteSpace(_currentFilePath))
SaveContentAs(null, null);
else
{
// have a path, attempt to save to it
if (!File.Exists(_currentFilePath))
{
switch (
await
this.ShowMessageAsync("File Error",
"Current file missing, renamed or deleted. Do you want to save as another name?",
MessageDialogStyle.AffirmativeAndNegative))
{
case MessageDialogResult.Negative:
_currentFilePath = null;
return;
case MessageDialogResult.Affirmative:
SaveContentAs(null, null);
return;
default:
throw new ArgumentOutOfRangeException();
}
}
var fs = File.Open(_currentFilePath, FileMode.Truncate);
ProtoBuf.Serializer.Serialize(fs, Data);
}
}
private void OpenContent(object sender, RoutedEventArgs e)
{
var dialog = new Microsoft.Win32.OpenFileDialog
{
AddExtension = true,
CheckFileExists = true,
CheckPathExists = true,
Filter = "Character Profiles (*.ss13prof)|*.ss13prof|All Files (*.*)|*.*"
};
if (!(dialog.ShowDialog() ?? false)) return;
var fs = File.Open(dialog.FileName, FileMode.Open);
Data = ProtoBuf.Serializer.Deserialize<Record>(fs);
_currentFilePath = dialog.FileName;
// So WPF updates bindings
DataContext = Data;
}
private void SaveContentAs(object sender, RoutedEventArgs e)
{
var dialog = new Microsoft.Win32.SaveFileDialog
{
AddExtension = true, CheckPathExists = true, Filter = "Character Profiles (*.ss13prof)|*.ss13prof|All Files (*.*)|*.*"
};
if (!(dialog.ShowDialog() ?? false)) return;
var fs = File.Open(dialog.FileName, FileMode.Create);
ProtoBuf.Serializer.Serialize(fs, Data);
_currentFilePath = dialog.FileName;
}
public static IList<string> GetSpeciesOptions()
{
return Enum.GetValues(typeof(SpeciesSubType)).Cast<SpeciesSubType>().Select(item => Utility.SubspeciesNiceName(item)).ToList();
}
public static IList<string> GetSpeciesOptions(SpeciesType limitTo)
{
return Enum.GetValues(typeof(SpeciesSubType)).Cast<SpeciesSubType>().Select(item => Utility.SubspeciesNiceName(item)).ToList();
}
}
}

View file

@ -0,0 +1,166 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AuroraRecordGenerator
{
internal partial class RecordFormatter
{
public Record TargetRecord
{
get { return _targetRecord; }
set
{
UpdateSplitRecords();
MakeCommonRecords();
_lastRecordHash = value.GetHashCode();
_targetRecord = value;
}
}
public RecordFormatter(Record r)
{
_targetRecord = r;
UpdateSplitRecords();
MakeCommonRecords();
_lastRecordHash = r.GetHashCode();
}
private Record _targetRecord;
private int? _lastRecordHash;
private IList<string> _medicalPublicRecord;
private IList<string> _medicalHistory;
private IList<string> _medicalNotes;
private IList<string> _medicalPsychHistory;
private IList<string> _medicalPsychNotes;
private IList<string> _medicalPrescriptions;
private IList<string> _securityPublicRecord;
private IList<string> _securityRecords;
private IList<string> _securityNotes;
private IList<string> _employmentPublicRecord;
private IList<string> _employmentExperience;
private IList<string> _employmentPreNtEmployment;
private IList<string> _employmentFormalEducation;
private IList<string> _employmentNtEmployment;
private IList<string> _employmentSkills;
private void UpdateSplitRecords()
{
if (_targetRecord == null)
{
_targetRecord = new Record();
}
// Medical
_medicalPublicRecord = _targetRecord.MedicalPublicRecord?.LineSplit();
_medicalHistory = _targetRecord.MedicalHistory?.LineSplit();
_medicalNotes = _targetRecord.MedicalNotes?.LineSplit();
_medicalPsychHistory = _targetRecord.MedicalPsychHistory?.LineSplit();
_medicalPsychNotes = _targetRecord.MedicalPsychNotes?.LineSplit();
_medicalPrescriptions = _targetRecord.MedicalPrescriptions?.LineSplit();
// security
_securityPublicRecord = _targetRecord.SecurityPublicRecord?.LineSplit();
_securityRecords = _targetRecord.SecurityRecords?.LineSplit();
_securityNotes = _targetRecord.SecurityNotes?.LineSplit();
// employment
_employmentPublicRecord = _targetRecord.EmploymentPublicRecord?.LineSplit();
_employmentExperience = _targetRecord.EmploymentExperience?.LineSplit();
_employmentPreNtEmployment = _targetRecord.EmploymentPreNtEmployment?.LineSplit();
_employmentFormalEducation = _targetRecord.EmploymentFormalEducation?.LineSplit();
_employmentNtEmployment = _targetRecord.EmploymentNtEmploymentHistory?.LineSplit();
_employmentSkills = _targetRecord.EmploymentSkills?.LineSplit();
// flush the record cache so they're regenerated
_commonRecords = null;
_medicalRecordGenerated = null;
_securityRecordGenerated = null;
_employmentRecordGenerated = null;
}
public string EmploymentRecords
{
get
{
//if (_employmentRecordGenerated.IsEmpty())
MakeEmploymentRecords();
return _employmentRecordGenerated;
}
}
private string _employmentRecordGenerated;
public string MedicalRecords
{
get
{
//if (_medicalRecordGenerated.IsEmpty())
MakeMedicalRecords();
return _medicalRecordGenerated;
}
}
private string _medicalRecordGenerated;
public string SecurityRecords
{
get
{
//if (_securityRecordGenerated.IsEmpty())
MakeSecurityRecords();
return _securityRecordGenerated;
}
}
private string _securityRecordGenerated;
private string _commonRecords;
/// <summary>
/// Writes the <see cref="string"/> form of a record section to the specified <see cref="StringBuilder"/>, as long as there's entries to write.
/// </summary>
/// <param name="builder">The <see cref="StringBuilder"/> to write to.</param>
/// <param name="header">The title for the section.</param>
/// <param name="entries">The entries of this section.</param>
private static void WriteSectionIfAny(ref StringBuilder builder, string header, IList<string> entries)
{
if (entries == null || !entries.Any() || entries[0].Trim().Length == 0)
return;
builder.AppendLine(header);
builder.AppendLine(entries.FormatAsList());
}
/// <summary>
/// Writes the <see cref="string"/> form of a record section to the specified <see cref="StringBuilder"/>, as long as there's entries to write.
/// Inserts a newline before the section.
/// </summary>
/// <param name="builder">The <see cref="StringBuilder"/> to write to.</param>
/// <param name="header">The title for the section.</param>
/// <param name="entries">The entries of this section.</param>
private static void WritePrefixedSectionifAny(ref StringBuilder builder, string header, IList<string> entries)
{
builder.AppendLine();
WriteSectionIfAny(ref builder, header, entries);
}
private string MakeNameLine()
{
var builder = new StringBuilder("Name: ");
builder.Append(_targetRecord.FirstName);
builder.Append(_targetRecord.MiddleName.SpaceIfValue());
builder.Append($" {_targetRecord.LastName}");
builder.Append(_targetRecord.NameSuffix.SpaceIfValue());
return builder.ToString();
}
private static void MakeMedicalNote(ref StringBuilder b, string s) =>
b.AppendLine($" - {s}");
}
}

View file

@ -0,0 +1,196 @@
using System.Linq;
using System.Text;
using Humanizer;
namespace AuroraRecordGenerator
{
internal partial class RecordFormatter
{
private void MakeCommonRecords()
{
var record = new StringBuilder();
record.AppendLine("/// PUBLIC RECORD ///");
record.AppendLine(MakeNameLine());
record.AppendLine($"Date of Birth: {_targetRecord.BirthDate.ToString("MMMM")} {_targetRecord.BirthDate.Day.Ordinalize()}, {_targetRecord.BirthDate.Year}");
record.AppendLine($"Species: {_targetRecord.Species.Humanize()}");// might fuck up the names
record.AppendLine(_targetRecord.Species.HasGender()
? $"Gender: {_targetRecord.Gender.Humanize()}"
: "Gender: Not Applicable.");
record.AppendLine($"Citizenship: {_targetRecord.Citizenship.IfEmpty("None.")}");
record.AppendLine($"Clearance Level: {_targetRecord.Clearance.IfEmpty("Not Specified")}");
record.AppendLine($"Employed As: {_targetRecord.EmployedAs.IfEmpty("Assistant")}");
if (_targetRecord.CharHeight != null)
record.AppendLine($"Height: {_targetRecord.CharHeight} cm ({Utility.CmToFeet(_targetRecord.CharHeight.Value)})");
if (_targetRecord.Weight != null)
record.AppendLine($"Weight: {_targetRecord.Weight} kg ({Utility.KgToLb(_targetRecord.Weight ?? 0)})");
record.AppendLine();
// identifying features
// TODO: identifying features
// general notes
WriteSectionIfAny(ref record,
"General Notes:",
_employmentPublicRecord);
WriteSectionIfAny(ref record,
"Medical Notes:",
_medicalPublicRecord);
WriteSectionIfAny(ref record,
"Security Notes:",
_securityPublicRecord);
_commonRecords = record.ToString();
}
private void MakeEmploymentRecords()
{
var recordText = new StringBuilder();
if (_commonRecords.IsEmpty())
MakeCommonRecords();
recordText.Append(_commonRecords);
if (!_employmentExperience.Any() &&
!_employmentFormalEducation.Any() &&
!_employmentNtEmployment.Any() &&
!_employmentPreNtEmployment.Any() &&
!_employmentPublicRecord.Any() &&
!_employmentSkills.Any())
{
recordText.AppendLine("/// NO EMPLOYMENT RECORD FOUND ///");
}
else
{
recordText.AppendLine("/// EMPLOYMENT RECORD ///");
recordText.AppendLine();
WriteSectionIfAny(ref recordText,
"Experience:",
_employmentExperience);
WriteSectionIfAny(ref recordText,
"Formal Education History:",
_employmentFormalEducation);
WriteSectionIfAny(ref recordText,
"Pre-NanoTrasen Employment History:",
_employmentPreNtEmployment);
WriteSectionIfAny(ref recordText,
"NanoTrasen Employment History:",
_employmentNtEmployment);
WriteSectionIfAny(ref recordText,
"Trained in the following:",
_employmentSkills);
}
_employmentRecordGenerated = recordText.ToString();
}
private void MakeMedicalRecords()
{
var recordText = new StringBuilder();
if (_commonRecords.IsEmpty())
MakeCommonRecords();
recordText.Append(_commonRecords);
// TODO: make this less horrible
if (!_medicalHistory.Any() &&
!_medicalNotes.Any() &&
!_medicalPsychHistory.Any() &&
!_medicalPsychNotes.Any() &&
!_medicalPrescriptions.Any() &&
!TargetRecord.NoBorg &&
!TargetRecord.NoClone &&
!TargetRecord.NoProsthetic &&
!TargetRecord.NoRevive)
{
recordText.AppendLine("/// NO MEDICAL RECORD FOUND ///");
}
else
{
recordText.AppendLine("/// MEDICAL RECORD ///");
recordText.AppendLine();
recordText.AppendLine(
" The following information is protected by doctor-patient confidentiality laws. Do not release without patient's consent.\n");
if (TargetRecord.NoBorg || TargetRecord.NoClone || TargetRecord.NoProsthetic || TargetRecord.NoRevive)
{
recordText.AppendLine("IMPORTANT NOTES:");
if (TargetRecord.NoBorg)
MakeMedicalNote(ref recordText, "DO NOT BORGIFY");
if (TargetRecord.NoClone)
MakeMedicalNote(ref recordText, "DO NOT CLONE");
if (TargetRecord.NoProsthetic)
MakeMedicalNote(ref recordText, "DO NOT INSTALL PROSTHETICS");
if (TargetRecord.NoRevive)
MakeMedicalNote(ref recordText, "DO NOT REVIVE");
recordText.AppendLine();
}
WriteSectionIfAny(ref recordText,
"Notes:",
_medicalNotes);
WriteSectionIfAny(ref recordText,
"Medical History:",
_medicalHistory);
WriteSectionIfAny(ref recordText,
"Psychiatric Notes:",
_medicalPsychNotes);
WriteSectionIfAny(ref recordText,
"Psychiatric History:",
_medicalPsychHistory);
WriteSectionIfAny(ref recordText,
"Prescriptions:",
_medicalPrescriptions);
}
_medicalRecordGenerated = recordText.ToString();
}
private void MakeSecurityRecords()
{
var recordText = new StringBuilder();
if (_commonRecords.IsEmpty())
MakeCommonRecords();
recordText.Append(_commonRecords);
if (!_securityRecords.Any() && !_securityNotes.Any())
{
recordText.AppendLine("/// NO SECURITY RECORD FOUND ///");
}
else
{
recordText.AppendLine("/// SECURITY RECORD ///");
recordText.AppendLine();
WriteSectionIfAny(ref recordText,
"Notes:",
_securityNotes);
WriteSectionIfAny(ref recordText,
"Record:",
_securityRecords);
}
_securityRecordGenerated = recordText.ToString();
}
}
}

View file

@ -0,0 +1,66 @@
using System;
using ProtoBuf;
namespace AuroraRecordGenerator
{
[ProtoContract]
public enum SpeciesType
{
[ProtoEnum]
None = 0,
[ProtoEnum]
Human,
[ProtoEnum]
Skrell,
[ProtoEnum]
Tajara,
[ProtoEnum]
Unathi,
[ProtoEnum]
Vaurca,
[ProtoEnum]
Diona,
[ProtoEnum]
IPC
}
[ProtoContract]
public enum SpeciesSubType
{
[ProtoEnum]
None = 0,
[ProtoEnum]
MsaiTajara,
[ProtoEnum]
ZhanTajara,
[ProtoEnum]
VaurcaWorker,
[ProtoEnum]
VaurcaWarrior,
[ProtoEnum]
IpcShell,
[ProtoEnum]
IpcG1Industrial
}
[ProtoContract]
public enum GenderType
{
[ProtoEnum]
NotApplicable = 0,
[ProtoEnum]
Male,
[ProtoEnum]
Female
}
public static class Info
{
/// <summary>
/// The current in-character date.
/// </summary>
public static DateTime IcDate => new DateTime(2458,
DateTime.Now.Month,
DateTime.Now.Day);
}
}

View file

@ -0,0 +1,135 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace AuroraRecordGenerator
{
public static class Utility
{
/// <summary>
/// Splits a string into an array of strings.
/// </summary>
/// <param name="source">The string to split.</param>
/// <param name="predictedSplitLen">How large each string probably will be. Specify to theoretically improve performance.</param>
/// <param name="splitValues">Array of chars to split on.</param>
/// <returns></returns>
public static IEnumerable<string> LazySplit(this string source, int predictedSplitLen, params char[] splitValues)
{
var builder = predictedSplitLen <= 0
? new StringBuilder()
: new StringBuilder(predictedSplitLen);
foreach (var c in source)
{
if (splitValues.Contains(c))
{
// split off string
var result = builder.ToString();
builder.Clear();
yield return result;
}
builder.Append(c);
}
}
/// <summary>
/// Splits a string into an array of strings.
/// </summary>
/// <param name="source">The string to split.</param>
/// <param name="splitValues">Array of chars to split on.</param>
/// <returns></returns>
public static IEnumerable<string> LazySplit(this string source, params char[] splitValues) =>
source.LazySplit(-1, splitValues);
/// <summary>
/// Splits a string into an array of strings.
/// </summary>
/// <param name="source">The string to split.</param>
/// <param name="predictedSplitLen">How large each string probably will be. Specify to theoretically improve performance.</param>
/// <param name="splitValue">Char to split on.</param>
/// <returns></returns>
public static IEnumerable<string> LazySplit(this string source, int predictedSplitLen, char splitValue)
{
var builder = predictedSplitLen <= 0
? new StringBuilder()
: new StringBuilder(predictedSplitLen);
foreach (var c in source)
{
if (c == splitValue)
{
// split off string
var result = builder.ToString();
builder.Clear();
yield return result;
}
builder.Append(c);
}
}
public static IList<string> LineSplit(this string source) =>
source.Split('\n').Where(item => item.Trim().Length != 0).ToList();
public static string CmToFeet(double cm)
{
return "0'0\"";
}
public static string KgToLb(double kg) => $"{Math.Round(kg * 2.2046, 2)} lb";
/// <summary>
/// Returns <paramref name="val"/> and a trailing space if val is not whitespace, <see cref="string.Empty"/> otherwise.
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public static string SpaceIfValue(this string val) => string.IsNullOrWhiteSpace(val) ? string.Empty : " " + val + " ";
public static string IfEmpty(this string target, string fallback) =>
target.IsEmpty() ? fallback : target;
public static bool IsEmpty(this string val) => string.IsNullOrWhiteSpace(val);
public static string FormatAsList(this IEnumerable<string> target) =>
target.Aggregate(new StringBuilder(), (b, s) => b.AppendLine($" - {s.Trim()}")).ToString();
public static string Repeat(this string target, int repeatNum)
{
var builder = new StringBuilder(target.Length*repeatNum);
for (var i = 0; i < repeatNum; i++)
builder.Append(target);
return builder.ToString();
}
/// <summary>
/// Returns true if the specified species has gender.
/// </summary>
/// <param name="species"></param>
/// <returns></returns>
public static bool HasGender(this SpeciesType species) =>
!(species == SpeciesType.Diona || species == SpeciesType.IPC || species == SpeciesType.Vaurca);
public static string SubspeciesNiceName(SpeciesSubType species)
{
switch (species)
{
case SpeciesSubType.MsaiTajara:
return "M'sai";
case SpeciesSubType.ZhanTajara:
return "Zhan-Khazan";
case SpeciesSubType.VaurcaWorker:
return "Worker (Type A)";
case SpeciesSubType.VaurcaBreeder:
return "Warrior (Type B)";
case SpeciesSubType.IpcShell:
return "Shell Frame";
case SpeciesSubType.IpcG1Industrial:
return "Industrial Frame";
default:
return Enum.GetName(typeof(SpeciesSubType), species);
}
}
}
}

View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Humanizer.Core" version="2.1.0" targetFramework="net452" />
<package id="MahApps.Metro" version="1.3.0" targetFramework="net452" />
<package id="protobuf-net" version="2.1.0" targetFramework="net452" />
</packages>