From b59c41e6e275e03f4c943fff636c9f743835d7bd Mon Sep 17 00:00:00 2001 From: Alexander Terp Date: Sat, 17 Apr 2021 13:13:14 +1000 Subject: [PATCH] 1.3.0: Prepare project to go open source - Add MIT License. - Change notes.md to README.md and make it more descriptive. - Extract todos into TODO.md. - Add .csproj to .gitignore, since it contains computer-specific information that is likely not helpful for others. - Minor code cleanup: mainly replacing "VM" with "ViewModel". - Re-arranging repo structure for clarity (putting additional things into /src/). --- .gitignore | 4 + LICENSE.txt | 21 ++ README.md | 37 +++ TODO.md | 13 ++ notes.md | 57 ----- repo-images/exact-fraction-example.PNG | Bin 0 -> 44949 bytes src/ArmyArrowCounter/AacMissionBehavior.cs | 13 +- src/ArmyArrowCounter/AacUiApplier.cs | 7 +- src/ArmyArrowCounter/ArmyArrowCounter.csproj | 213 ------------------ src/ArmyArrowCounter/ArrowCounter.cs | 4 +- src/ArmyArrowCounter/ArrowRecountTriggerer.cs | 8 +- src/ArmyArrowCounter/Config.cs | 11 +- src/ArmyArrowCounter/EventLogger.cs | 22 +- src/ArmyArrowCounter/Main.cs | 5 +- .../Properties/AssemblyInfo.cs | 1 - src/ArmyArrowCounter/VMs/AacVmFactory.cs | 35 --- src/ArmyArrowCounter/VMs/ExactFractionVM.cs | 21 -- .../AacVM.cs => viewmodels/AacViewModel.cs} | 10 +- .../viewmodels/AacViewModelFactory.cs | 27 +++ .../viewmodels/ExactFractionViewModel.cs | 16 ++ .../ExactPercentViewModel.cs} | 10 +- .../NearestWrittenViewModel.cs} | 11 +- .../NearestXPercentViewModel.cs} | 10 +- {GUI => src/GUI}/Brushes/ArmyArrowCounter.xml | 0 {GUI => src/GUI}/Prefabs/ArmyArrowCounter.xml | 0 SubModule.xml => src/SubModule.xml | 0 {config => src/config}/config.xml | 0 27 files changed, 159 insertions(+), 397 deletions(-) create mode 100644 LICENSE.txt create mode 100644 README.md create mode 100644 TODO.md delete mode 100644 notes.md create mode 100644 repo-images/exact-fraction-example.PNG delete mode 100644 src/ArmyArrowCounter/ArmyArrowCounter.csproj delete mode 100644 src/ArmyArrowCounter/VMs/AacVmFactory.cs delete mode 100644 src/ArmyArrowCounter/VMs/ExactFractionVM.cs rename src/ArmyArrowCounter/{VMs/AacVM.cs => viewmodels/AacViewModel.cs} (73%) create mode 100644 src/ArmyArrowCounter/viewmodels/AacViewModelFactory.cs create mode 100644 src/ArmyArrowCounter/viewmodels/ExactFractionViewModel.cs rename src/ArmyArrowCounter/{VMs/ExactPercentVM.cs => viewmodels/ExactPercentViewModel.cs} (64%) rename src/ArmyArrowCounter/{VMs/NearestWrittenVM.cs => viewmodels/NearestWrittenViewModel.cs} (85%) rename src/ArmyArrowCounter/{VMs/NearestXPercentVM.cs => viewmodels/NearestXPercentViewModel.cs} (70%) rename {GUI => src/GUI}/Brushes/ArmyArrowCounter.xml (100%) rename {GUI => src/GUI}/Prefabs/ArmyArrowCounter.xml (100%) rename SubModule.xml => src/SubModule.xml (100%) rename {config => src/config}/config.xml (100%) diff --git a/.gitignore b/.gitignore index 7bc2289..c70949e 100644 --- a/.gitignore +++ b/.gitignore @@ -353,3 +353,7 @@ healthchecksdb MigrationBackup/ # End of https://www.gitignore.io/api/visualstudio + +# Additional for ArmyArrowCounter + +**/*.csproj diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..c82823a --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Alexander Terp + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a0e15f9 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# Army Arrow Counter + +## Overview + +This is the repo for a [Mount & Blade II: Bannerlord](https://store.steampowered.com/app/261550/Mount__Blade_II_Bannerlord/) mod named Army Arrow Counter. It's a simple utility mod which counts the amount of ammunition your army has remaining, updating a small UI counter element in the bottom left of the screen (example below). The mod is hosted and downloadable on Nexus Mods [here](https://www.nexusmods.com/mountandblade2bannerlord/mods/448), with over 10,000 downloads! +More about the mod and its gameplay effects/options can be read on the Nexus page - this repo focuses more on the development side. + +ui-example + +## Repository Structure + +- When packaged, ArmyArrowCounter (AAC) has the following structure: + - `bin` + - `Win64_Shipping_Client` + - Contains all the DLL(s) for the mod. + - Is not located in this repo - these are generated when the project is built. + - `config` + - Contains custom AAC config. + - This corresponds exactly to the `/src/config` folder in this repository. + - `GUI` + - Contains Bannerlord xml files configuring the presence/positions/formatting, etc of the UI counter. + - This corresponds exactly to the `/src/GUI` folder in this repository. + - `SubModule.xml` + - Contains AAC mod/module metadata for Bannerlord to process. + - This corresponds exactly to the `/src/SubModule.xml` file in this repository. +- `/src/` (unsurprisingly) contains the source code, along with the above-mentioned folders/files. + +## Contributions + +### Issues / Bug Reports + +These are more than welcome! I monitor both the Nexus "Bugs" and "Posts" tabs, but I am also happy to receive reports here on Github. + +### Bug Fixes / Feature Implementations / Pull Requests + +Happy to receive these as well! I apologize in advance for when you dive into the code - I am not a C# developer, so it's very likely that I am breaking a bunch of rules/conventions of C# and misusing features - I'd be ecstatic for these cases to be pointed out and corrected! +About pull-requests, I may ask questions around the in-game testing that has been done, and I may request code style/design changes if deemed necessary. For features which I have not endorsed, it's likely a good idea to contact me first before implementing them, to avoid any denials/reworks! diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..8f0706f --- /dev/null +++ b/TODO.md @@ -0,0 +1,13 @@ +# Todo List + +- Optionally support ModLib/OptionScreen/whatever is standard to provide in-game settings, instead of the `config.xml` file. +- Add toggle hotkey. +- Count only solders under your command (?) +- Add unit tests. +- Put tasks in this list into Github issues. + +## Bug List + +- Fix bug: Fleeing allies in hideouts don't subtract arrows when removed. +- Lost sieges sometimes end with non-0/0 counts? +- Team-killing an archer does not appear to get counted correctly. \ No newline at end of file diff --git a/notes.md b/notes.md deleted file mode 100644 index 9dedb49..0000000 --- a/notes.md +++ /dev/null @@ -1,57 +0,0 @@ -# Army Arrow Counter - -## Todo List - -- Optionally support ModLib or OptionScreen or whatever to provide in-game settings. -- Add toggle hotkey. -- Count only solders under your command (?) -- Open source. - -## Bug List - -- KeyNotFoundException -- Fix bug: Fleeing allies in hideouts don't subtract arrows when removed. -- Crashes after you die with "Control your allies after death". -- Lost sieges sometimes end with non-0/0 counts? - -## Customization - -### Counter Type - -#### EXACT_FRACTION - -- e.g. 1258 / 1721 - -#### NEAREST_100_FRACTION - -- e.g. ~1300 / ~1700 - -#### EXACT_PERCENT - -- e.g. 73% - -#### NEAREST_10_PERCENT - -- e.g. ~70% - -#### NEAREST_20_PERCENT - -- e.g. ~80% - -#### NEAREST_25_PERCENT - -- e.g. ~75% - -#### NEAREST_WRITTEN - -- "Your army has %s ammunition remaining. -- Replace with %s with: - - all - [100%, 100%] - - almost all - [87.5%, 100%) - - about three quarters - [71%, 87.5%) - - about two thirds - [58.5%, 71%) - - about half - [41.5%, 58.5%) - - about one third - [29%, 41.5%) - - about one quarter - [12.5%, 29%) - - almost no - (0%, 12.5%) - - no - [0%, 0%] diff --git a/repo-images/exact-fraction-example.PNG b/repo-images/exact-fraction-example.PNG new file mode 100644 index 0000000000000000000000000000000000000000..ccca6f8faad7827c78e724ba082068f485b6a9c3 GIT binary patch literal 44949 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 literal 0 HcmV?d00001 diff --git a/src/ArmyArrowCounter/AacMissionBehavior.cs b/src/ArmyArrowCounter/AacMissionBehavior.cs index c86cd94..9bb3905 100644 --- a/src/ArmyArrowCounter/AacMissionBehavior.cs +++ b/src/ArmyArrowCounter/AacMissionBehavior.cs @@ -1,7 +1,7 @@ -using TaleWorlds.Core; +using System; +using TaleWorlds.Core; using TaleWorlds.Library; using TaleWorlds.MountAndBlade; -using System; namespace ArmyArrowCounter { @@ -23,13 +23,12 @@ class AacMissionBehavior : MissionBehaviour private ArrowCounter ArrowCounter; private ArrowRecountTriggerer ArrowRecountTriggerer; private AacUiApplier AacUiApplier; - //private EventLogger EventLogger; - public AacMissionBehavior() { + public AacMissionBehavior() + { ArrowCounter = new ArrowCounter(this); ArrowRecountTriggerer = new ArrowRecountTriggerer(this, ArrowCounter); - AacUiApplier = new AacUiApplier(this, AacVmFactory.Create(ArrowCounter)); - //EventLogger = new EventLogger(this, ArrowCounter); + AacUiApplier = new AacUiApplier(this, AacViewModelFactory.Create(ArrowCounter)); } public override MissionBehaviourType BehaviourType => MissionBehaviourType.Other; @@ -125,7 +124,7 @@ public override void OnAgentShootMissile(Agent shooterAgent, EquipmentIndex weap public override void OnItemPickup(Agent agent, SpawnedItemEntity item) { base.OnItemPickup(agent, item); - + if (!IsActivated) { return; diff --git a/src/ArmyArrowCounter/AacUiApplier.cs b/src/ArmyArrowCounter/AacUiApplier.cs index c7723a9..a61b774 100644 --- a/src/ArmyArrowCounter/AacUiApplier.cs +++ b/src/ArmyArrowCounter/AacUiApplier.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using TaleWorlds.Engine.GauntletUI; using TaleWorlds.Engine.Screens; -using TaleWorlds.Engine.GauntletUI; using TaleWorlds.Library; namespace ArmyArrowCounter diff --git a/src/ArmyArrowCounter/ArmyArrowCounter.csproj b/src/ArmyArrowCounter/ArmyArrowCounter.csproj deleted file mode 100644 index ed2b693..0000000 --- a/src/ArmyArrowCounter/ArmyArrowCounter.csproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - - Debug - AnyCPU - {0F99042F-21DE-4594-B170-3B13BF4EEE8B} - Library - Properties - ArmyArrowCounter - ArmyArrowCounter - v4.7.2 - 512 - true - - - true - full - false - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\Modules\ArmyArrowCounter\bin\Win64_Shipping_Client\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.AchievementSystem.dll - - - False - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.BattlEye.Client.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.CampaignSystem.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.CampaignSystem.ViewModelCollection.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Core.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Core.ViewModelCollection.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.AccessProvider.Epic.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.AccessProvider.GDK.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.AccessProvider.GOG.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.AccessProvider.Steam.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.AccessProvider.Test.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Diamond.ChatSystem.Library.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.DotNet.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.DotNet.AutoGenerated.dll - - - False - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Engine.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Engine.AutoGenerated.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Engine.GauntletUI.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.GauntletUI.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.GauntletUI.Data.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.GauntletUI.ExtraWidgets.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.GauntletUI.PrefabSystem.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.GauntletUI.TooltipExtensions.dll - - - False - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.InputSystem.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Library.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.LinQuick.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Localization.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.ModuleManager.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.AutoGenerated.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.Diamond.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.GauntletUI.Widgets.dll - - - False - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.Helpers.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.Launcher.Steam.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.MountAndBlade.ViewModelCollection.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.NavigationSystem.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Network.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.ObjectSystem.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.PlatformService.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.PlatformService.Epic.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.PlatformService.GOG.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.PlatformService.Steam.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.PlayerServices.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.PSAI.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.SaveSystem.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Starter.DotNetCore.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.Starter.Library.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.TwoDimension.dll - - - H:\Games\Steam\steamapps\common\Mount & Blade II Bannerlord\bin\Win64_Shipping_Client\TaleWorlds.TwoDimension.Standalone.dll - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ArmyArrowCounter/ArrowCounter.cs b/src/ArmyArrowCounter/ArrowCounter.cs index aabe180..bae26cf 100644 --- a/src/ArmyArrowCounter/ArrowCounter.cs +++ b/src/ArmyArrowCounter/ArrowCounter.cs @@ -77,7 +77,7 @@ private void OnAllyPickedUpAmmo(Agent agent, SpawnedItemEntity item) internal void CountAllAlliedAgents(bool countRemainingArrows = false) { - foreach (Agent agent in AacMissionBehavior.Mission.Agents) // todo: can instead get player's MBTeam an iterate through friendly agents directly + foreach (Agent agent in AacMissionBehavior.Mission.Agents) // todo: can instead maybe get player's MBTeam an iterate through friendly agents directly { if (Utils.IsPlayerAlly(agent, AacMissionBehavior.PlayerAgent)) { @@ -131,7 +131,7 @@ internal void AddAgent(Agent agent, bool countRemaining = false) if (countRemaining) { remainingAmmo = CalculateRemainingAmmo(agent); - } + } else { remainingAmmo = maxAmmo; diff --git a/src/ArmyArrowCounter/ArrowRecountTriggerer.cs b/src/ArmyArrowCounter/ArrowRecountTriggerer.cs index bb26011..5fc7ffa 100644 --- a/src/ArmyArrowCounter/ArrowRecountTriggerer.cs +++ b/src/ArmyArrowCounter/ArrowRecountTriggerer.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using TaleWorlds.MountAndBlade; namespace ArmyArrowCounter @@ -13,7 +9,7 @@ class ArrowRecountTriggerer private AacMissionBehavior aacMissionBehavior; private ArrowCounter arrowCounter; - + private short removalsUntilNextRecount = 1; private bool active = false; @@ -65,7 +61,7 @@ private short CalculateRemovalsUntilNextRecount() { return 1; } - + return (short) Math.Max(Math.Ceiling(PROPORTION_OF_TROOPS__TO_DIE_BEFORE_RECOUNT * numAllies.Value), 1); } } diff --git a/src/ArmyArrowCounter/Config.cs b/src/ArmyArrowCounter/Config.cs index 2db2ceb..d9c5c70 100644 --- a/src/ArmyArrowCounter/Config.cs +++ b/src/ArmyArrowCounter/Config.cs @@ -1,11 +1,6 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Xml; -using System.Xml.Linq; using TaleWorlds.Library; namespace ArmyArrowCounter @@ -53,7 +48,8 @@ private static void Load() { Utils.LogWithColor(Utils.RED, "AAC ERROR: Expected to find config file located at '{0}', but could not. Using default config.", CONFIG_FILE_SUB_PATH); return; - } catch (XmlException e) + } + catch (XmlException e) { Utils.LogWithColor(Utils.RED, "AAC ERROR: Invalid config file '{0}'. Received exception: {1} Using default config.", CONFIG_FILE_SUB_PATH, e.Message); return; @@ -74,7 +70,8 @@ private static void Load() { Utils.LogWithColor(Utils.RED, "AAC ERROR: Invalid {0}: '{1}'. Defaulting to {2}.", COUNTER_TYPE_XML_NAME, node.InnerText, DEFAULT_COUNTER_TYPE); } - } else if (node.Name == PREFIX_XML_NAME) + } + else if (node.Name == PREFIX_XML_NAME) { foundPrefix = true; _Config.Prefix = node.InnerText; diff --git a/src/ArmyArrowCounter/EventLogger.cs b/src/ArmyArrowCounter/EventLogger.cs index 1b0111f..35317ba 100644 --- a/src/ArmyArrowCounter/EventLogger.cs +++ b/src/ArmyArrowCounter/EventLogger.cs @@ -1,23 +1,23 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using TaleWorlds.MountAndBlade; +using TaleWorlds.MountAndBlade; namespace ArmyArrowCounter { + /** For debugging. Intended use is to add the following line to AacMissionBehavior's constructor and to make this a property of it: + * EventLogger = new EventLogger(this, ArrowCounter); + * + * Comment in/out whatever logs you want in this class's constructor. + */ class EventLogger { public EventLogger(AacMissionBehavior aacMissionBehavior, ArrowCounter arrowCounter) { - aacMissionBehavior.AllyAgentBuiltEvent += OnAllyAgentBuilt; - aacMissionBehavior.AllyAgentRemovedEvent += OnAllyAgentRemoved; + //aacMissionBehavior.AllyAgentBuiltEvent += OnAllyAgentBuilt; + //aacMissionBehavior.AllyAgentRemovedEvent += OnAllyAgentRemoved; //aacMissionBehavior.AllyFiredMissileEvent += OnAllyFiredMissile; - aacMissionBehavior.BattleStartEvent += OnBattleStart; - aacMissionBehavior.SiegeBattleStartEvent += OnSiegeBattleStart; - aacMissionBehavior.PlayerBuiltEvent += OnPlayerBuilt; + //aacMissionBehavior.BattleStartEvent += OnBattleStart; + //aacMissionBehavior.SiegeBattleStartEvent += OnSiegeBattleStart; + //aacMissionBehavior.PlayerBuiltEvent += OnPlayerBuilt; //arrowCounter.RemainingArrowsUpdateEvent += OnRemainingArrowsUpdate; //arrowCounter.MaxArrowsUpdateEvent += OnMaxArrowsUpdate; } diff --git a/src/ArmyArrowCounter/Main.cs b/src/ArmyArrowCounter/Main.cs index 5b53908..498d54f 100644 --- a/src/ArmyArrowCounter/Main.cs +++ b/src/ArmyArrowCounter/Main.cs @@ -1,5 +1,4 @@ -using System; -using TaleWorlds.MountAndBlade; +using TaleWorlds.MountAndBlade; namespace ArmyArrowCounter { @@ -20,7 +19,7 @@ protected override void OnBeforeInitialModuleScreenSetAsRoot() public override void OnMissionBehaviourInitialize(Mission mission) { - + if (mission == null) { return; diff --git a/src/ArmyArrowCounter/Properties/AssemblyInfo.cs b/src/ArmyArrowCounter/Properties/AssemblyInfo.cs index 07b1adb..4630da0 100644 --- a/src/ArmyArrowCounter/Properties/AssemblyInfo.cs +++ b/src/ArmyArrowCounter/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following diff --git a/src/ArmyArrowCounter/VMs/AacVmFactory.cs b/src/ArmyArrowCounter/VMs/AacVmFactory.cs deleted file mode 100644 index 272d169..0000000 --- a/src/ArmyArrowCounter/VMs/AacVmFactory.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Linq; -using TaleWorlds.Library; - -namespace ArmyArrowCounter -{ - class AacVmFactory - { - public static ViewModel Create(ArrowCounter arrowCounter) - { - switch(Config.Instance().CounterType) - { - case CounterType.NEAREST_WRITTEN: - return new NearestWrittenVM(arrowCounter); - case CounterType.EXACT_PERCENT: - return new ExactPercentVM(arrowCounter); - case CounterType.NEAREST_10_PERCENT: - return new NearestXPercentVM(arrowCounter, 10); - case CounterType.NEAREST_20_PERCENT: - return new NearestXPercentVM(arrowCounter, 20); - case CounterType.NEAREST_25_PERCENT: - return new NearestXPercentVM(arrowCounter, 25); - case CounterType.EXACT_FRACTION: - default: - return new ExactFractionVM(arrowCounter); - } - } - } -} diff --git a/src/ArmyArrowCounter/VMs/ExactFractionVM.cs b/src/ArmyArrowCounter/VMs/ExactFractionVM.cs deleted file mode 100644 index 5080394..0000000 --- a/src/ArmyArrowCounter/VMs/ExactFractionVM.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using TaleWorlds.Library; - -namespace ArmyArrowCounter -{ - class ExactFractionVM : AacVM - { - public ExactFractionVM(ArrowCounter arrowCounter) : base(arrowCounter) - { - } - - protected override string GetArrowCounterText() - { - return String.Format("{0} / {1}", ArrowCounter.RemainingArrows, ArrowCounter.MaxArrows); - } - } -} diff --git a/src/ArmyArrowCounter/VMs/AacVM.cs b/src/ArmyArrowCounter/viewmodels/AacViewModel.cs similarity index 73% rename from src/ArmyArrowCounter/VMs/AacVM.cs rename to src/ArmyArrowCounter/viewmodels/AacViewModel.cs index 8cfe557..a52b5c4 100644 --- a/src/ArmyArrowCounter/VMs/AacVM.cs +++ b/src/ArmyArrowCounter/viewmodels/AacViewModel.cs @@ -1,17 +1,13 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using TaleWorlds.Library; namespace ArmyArrowCounter { - abstract class AacVM : ViewModel - { + abstract class AacViewModel : ViewModel + { protected ArrowCounter ArrowCounter; - public AacVM(ArrowCounter arrowCounter) + public AacViewModel(ArrowCounter arrowCounter) { ArrowCounter = arrowCounter; arrowCounter.RemainingArrowsUpdateEvent += OnArrowCountUpdated; diff --git a/src/ArmyArrowCounter/viewmodels/AacViewModelFactory.cs b/src/ArmyArrowCounter/viewmodels/AacViewModelFactory.cs new file mode 100644 index 0000000..9d5a88d --- /dev/null +++ b/src/ArmyArrowCounter/viewmodels/AacViewModelFactory.cs @@ -0,0 +1,27 @@ +using TaleWorlds.Library; + +namespace ArmyArrowCounter +{ + class AacViewModelFactory + { + public static ViewModel Create(ArrowCounter arrowCounter) + { + switch (Config.Instance().CounterType) + { + case CounterType.NEAREST_WRITTEN: + return new NearestWrittenViewModel(arrowCounter); + case CounterType.EXACT_PERCENT: + return new ExactPercentViewModel(arrowCounter); + case CounterType.NEAREST_10_PERCENT: + return new NearestXPercentViewModel(arrowCounter, 10); + case CounterType.NEAREST_20_PERCENT: + return new NearestXPercentViewModel(arrowCounter, 20); + case CounterType.NEAREST_25_PERCENT: + return new NearestXPercentViewModel(arrowCounter, 25); + case CounterType.EXACT_FRACTION: + default: + return new ExactFractionViewModel(arrowCounter); + } + } + } +} diff --git a/src/ArmyArrowCounter/viewmodels/ExactFractionViewModel.cs b/src/ArmyArrowCounter/viewmodels/ExactFractionViewModel.cs new file mode 100644 index 0000000..3fbd250 --- /dev/null +++ b/src/ArmyArrowCounter/viewmodels/ExactFractionViewModel.cs @@ -0,0 +1,16 @@ +using System; + +namespace ArmyArrowCounter +{ + class ExactFractionViewModel : AacViewModel + { + public ExactFractionViewModel(ArrowCounter arrowCounter) : base(arrowCounter) + { + } + + protected override string GetArrowCounterText() + { + return String.Format("{0} / {1}", ArrowCounter.RemainingArrows, ArrowCounter.MaxArrows); + } + } +} diff --git a/src/ArmyArrowCounter/VMs/ExactPercentVM.cs b/src/ArmyArrowCounter/viewmodels/ExactPercentViewModel.cs similarity index 64% rename from src/ArmyArrowCounter/VMs/ExactPercentVM.cs rename to src/ArmyArrowCounter/viewmodels/ExactPercentViewModel.cs index 96f1fa6..d1cd7a0 100644 --- a/src/ArmyArrowCounter/VMs/ExactPercentVM.cs +++ b/src/ArmyArrowCounter/viewmodels/ExactPercentViewModel.cs @@ -1,16 +1,12 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ArmyArrowCounter { - class ExactPercentVM : AacVM - { + class ExactPercentViewModel : AacViewModel + { private static readonly string REPORT_FORMAT = "{0:P0}"; - public ExactPercentVM(ArrowCounter arrowCounter) : base(arrowCounter) + public ExactPercentViewModel(ArrowCounter arrowCounter) : base(arrowCounter) { } diff --git a/src/ArmyArrowCounter/VMs/NearestWrittenVM.cs b/src/ArmyArrowCounter/viewmodels/NearestWrittenViewModel.cs similarity index 85% rename from src/ArmyArrowCounter/VMs/NearestWrittenVM.cs rename to src/ArmyArrowCounter/viewmodels/NearestWrittenViewModel.cs index 3f115bd..c1710cc 100644 --- a/src/ArmyArrowCounter/VMs/NearestWrittenVM.cs +++ b/src/ArmyArrowCounter/viewmodels/NearestWrittenViewModel.cs @@ -1,18 +1,14 @@ using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using TaleWorlds.Core; -using TaleWorlds.Library; namespace ArmyArrowCounter { - class NearestWrittenVM : AacVM + class NearestWrittenViewModel : AacViewModel { private static readonly string REPORT_FORMAT = "{0} ammunition remaining."; - public NearestWrittenVM(ArrowCounter arrowCounter) : base(arrowCounter) + public NearestWrittenViewModel(ArrowCounter arrowCounter) : base(arrowCounter) { } @@ -67,7 +63,8 @@ protected override string GetArrowCounterText() if (Config.Instance().Prefix.IsEmpty()) { return char.ToUpper(formattedString.First()) + formattedString.Substring(1); - } else + } + else { return formattedString; } diff --git a/src/ArmyArrowCounter/VMs/NearestXPercentVM.cs b/src/ArmyArrowCounter/viewmodels/NearestXPercentViewModel.cs similarity index 70% rename from src/ArmyArrowCounter/VMs/NearestXPercentVM.cs rename to src/ArmyArrowCounter/viewmodels/NearestXPercentViewModel.cs index f87b615..807f8df 100644 --- a/src/ArmyArrowCounter/VMs/NearestXPercentVM.cs +++ b/src/ArmyArrowCounter/viewmodels/NearestXPercentViewModel.cs @@ -1,19 +1,15 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ArmyArrowCounter { - class NearestXPercentVM : AacVM - { + class NearestXPercentViewModel : AacViewModel + { private static readonly string REPORT_FORMAT = "~{0}%"; private static readonly int TO_PERCENT = 100; private readonly int RoundTo; - public NearestXPercentVM(ArrowCounter arrowCounter, int roundTo) : base(arrowCounter) + public NearestXPercentViewModel(ArrowCounter arrowCounter, int roundTo) : base(arrowCounter) { RoundTo = roundTo; } diff --git a/GUI/Brushes/ArmyArrowCounter.xml b/src/GUI/Brushes/ArmyArrowCounter.xml similarity index 100% rename from GUI/Brushes/ArmyArrowCounter.xml rename to src/GUI/Brushes/ArmyArrowCounter.xml diff --git a/GUI/Prefabs/ArmyArrowCounter.xml b/src/GUI/Prefabs/ArmyArrowCounter.xml similarity index 100% rename from GUI/Prefabs/ArmyArrowCounter.xml rename to src/GUI/Prefabs/ArmyArrowCounter.xml diff --git a/SubModule.xml b/src/SubModule.xml similarity index 100% rename from SubModule.xml rename to src/SubModule.xml diff --git a/config/config.xml b/src/config/config.xml similarity index 100% rename from config/config.xml rename to src/config/config.xml