From 95d4d1782d45e126d83f4cd53364399529fb6b04 Mon Sep 17 00:00:00 2001 From: mt224244 Date: Mon, 6 Apr 2020 01:08:07 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=97=E3=83=AC=E3=82=A4=E3=83=A4=E3=83=BC?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E8=A1=A8=E7=A4=BA=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=20=E8=8B=A5=E5=B9=B2=E3=81=AE?= =?UTF-8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF=E3=83=AA=E3=83=B3?= =?UTF-8?q?=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 +- TUSB_ProgressViewer/App.xaml | 1 + TUSB_ProgressViewer/Controls/DataViewer.xaml | 60 +++ .../Controls/DataViewer.xaml.cs | 28 ++ .../Controls/EndSpawnerProgress.xaml | 10 +- .../Controls/IslandCompleteProgress.xaml | 14 +- .../Controls/IslandPointer.xaml | 24 -- TUSB_ProgressViewer/Models/Coordinate.cs | 11 + TUSB_ProgressViewer/Models/Island.cs | 11 +- TUSB_ProgressViewer/Models/IslandsData.cs | 119 ++++++ TUSB_ProgressViewer/Models/Player.cs | 58 +++ TUSB_ProgressViewer/Models/ScoreData.cs | 81 ++++ TUSB_ProgressViewer/Models/Spawner.cs | 7 + TUSB_ProgressViewer/Models/SpawnersData.cs | 333 +++++++++++++++ TUSB_ProgressViewer/Models/World.cs | 398 ++---------------- .../Properties/AssemblyInfo.cs | 4 +- TUSB_ProgressViewer/Resources/book.png | Bin 0 -> 733 bytes TUSB_ProgressViewer/Resources/bow.png | Bin 0 -> 668 bytes .../Resources/carrot_on_a_stick.png | Bin 0 -> 746 bytes TUSB_ProgressViewer/Resources/iron_sword.png | Bin 0 -> 680 bytes TUSB_ProgressViewer/Resources/snowball.png | Bin 0 -> 714 bytes .../Resources/wolf_spawn_egg.png | Bin 0 -> 919 bytes .../Styles/DataViewerStyles.xaml | 67 +++ .../Styles/LoadingViewStyle.xaml | 5 +- .../TUSB_ProgressViewer.csproj | 24 +- ...essViewModel.cs => DataViewerViewModel.cs} | 11 +- .../ViewModels/EndSpawnerProgressViewModel.cs | 20 - .../ViewModels/MainWindowViewModel.cs | 25 -- TUSB_ProgressViewer/Views/MainWindow.xaml | 24 +- 29 files changed, 876 insertions(+), 484 deletions(-) create mode 100644 TUSB_ProgressViewer/Controls/DataViewer.xaml create mode 100644 TUSB_ProgressViewer/Controls/DataViewer.xaml.cs create mode 100644 TUSB_ProgressViewer/Models/IslandsData.cs create mode 100644 TUSB_ProgressViewer/Models/Player.cs create mode 100644 TUSB_ProgressViewer/Models/ScoreData.cs create mode 100644 TUSB_ProgressViewer/Models/SpawnersData.cs create mode 100644 TUSB_ProgressViewer/Resources/book.png create mode 100644 TUSB_ProgressViewer/Resources/bow.png create mode 100644 TUSB_ProgressViewer/Resources/carrot_on_a_stick.png create mode 100644 TUSB_ProgressViewer/Resources/iron_sword.png create mode 100644 TUSB_ProgressViewer/Resources/snowball.png create mode 100644 TUSB_ProgressViewer/Resources/wolf_spawn_egg.png create mode 100644 TUSB_ProgressViewer/Styles/DataViewerStyles.xaml rename TUSB_ProgressViewer/ViewModels/{IslandCompleteProgressViewModel.cs => DataViewerViewModel.cs} (50%) delete mode 100644 TUSB_ProgressViewer/ViewModels/EndSpawnerProgressViewModel.cs diff --git a/README.md b/README.md index 39401e8..a73e437 100644 --- a/README.md +++ b/README.md @@ -1 +1,24 @@ -# TUSB ProgressViewer \ No newline at end of file +# TUSB ProgressViewer + +The Unusual SkyBlockという配布ワールドの攻略進捗等を確認できるツールです + +![](https://user-images.githubusercontent.com/25514849/78503623-cadb5300-77a2-11ea-9552-c48ea654ef3a.png) + +## 動作確認済みTUSBバージョン + +- v12.0.9 +- v12.0.8 + +## 機能 + +- どの島を攻略したかの可視化 +- エンドの未破壊スポナーの可視化 +- プレイヤーの各職業レベルの確認 + +## 使い方 + +右上のTUSBアイコンが付いたボタンからTUSBのワールドフォルダを選択すると、ワールドが読み込まれ情報が表示されます + +## ライセンス + +[MIT](LICENSE) diff --git a/TUSB_ProgressViewer/App.xaml b/TUSB_ProgressViewer/App.xaml index df83bbf..c4cc253 100644 --- a/TUSB_ProgressViewer/App.xaml +++ b/TUSB_ProgressViewer/App.xaml @@ -11,6 +11,7 @@ + diff --git a/TUSB_ProgressViewer/Controls/DataViewer.xaml b/TUSB_ProgressViewer/Controls/DataViewer.xaml new file mode 100644 index 0000000..c619aec --- /dev/null +++ b/TUSB_ProgressViewer/Controls/DataViewer.xaml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TUSB_ProgressViewer/Controls/DataViewer.xaml.cs b/TUSB_ProgressViewer/Controls/DataViewer.xaml.cs new file mode 100644 index 0000000..4e30a71 --- /dev/null +++ b/TUSB_ProgressViewer/Controls/DataViewer.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace TUSB_ProgressViewer.Controls +{ + /// + /// DataViewer.xaml の相互作用ロジック + /// + public partial class DataViewer : UserControl + { + public DataViewer() + { + InitializeComponent(); + } + } +} diff --git a/TUSB_ProgressViewer/Controls/EndSpawnerProgress.xaml b/TUSB_ProgressViewer/Controls/EndSpawnerProgress.xaml index a04217d..2b054f6 100644 --- a/TUSB_ProgressViewer/Controls/EndSpawnerProgress.xaml +++ b/TUSB_ProgressViewer/Controls/EndSpawnerProgress.xaml @@ -3,14 +3,8 @@ xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:behavior="clr-namespace:TUSB_ProgressViewer.Behaviors" - xmlns:vm="clr-namespace:TUSB_ProgressViewer.ViewModels" - mc:Ignorable="d"> - - - + xmlns:model="clr-namespace:TUSB_ProgressViewer.Models"> @@ -29,7 +23,7 @@ Height="{Binding ActualHeight, ElementName=map}" HorizontalAlignment="Center" VerticalAlignment="Center" - ItemsSource="{Binding Spawners}"> + ItemsSource="{Binding Source={x:Static model:SpawnersData.Spawners}}"> diff --git a/TUSB_ProgressViewer/Controls/IslandCompleteProgress.xaml b/TUSB_ProgressViewer/Controls/IslandCompleteProgress.xaml index e5407ec..c32be8a 100644 --- a/TUSB_ProgressViewer/Controls/IslandCompleteProgress.xaml +++ b/TUSB_ProgressViewer/Controls/IslandCompleteProgress.xaml @@ -2,15 +2,7 @@ x:Class="TUSB_ProgressViewer.Controls.IslandCompleteProgress" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:d="http://schemas.microsoft.com/expression/blend/2008" - xmlns:local="clr-namespace:TUSB_ProgressViewer.Controls" - xmlns:controls="clr-namespace:TUSB_ProgressViewer.Controls" - xmlns:vm="clr-namespace:TUSB_ProgressViewer.ViewModels" - mc:Ignorable="d"> - - - + xmlns:model="clr-namespace:TUSB_ProgressViewer.Models"> @@ -23,7 +15,7 @@ Height="{Binding ActualHeight, ElementName=map}" HorizontalAlignment="Center" VerticalAlignment="Center" - ItemsSource="{Binding Islands}"> + ItemsSource="{Binding Source={x:Static model:IslandsData.Islands}}"> @@ -32,7 +24,7 @@ - + diff --git a/TUSB_ProgressViewer/Controls/IslandPointer.xaml b/TUSB_ProgressViewer/Controls/IslandPointer.xaml index 5088f6d..654c140 100644 --- a/TUSB_ProgressViewer/Controls/IslandPointer.xaml +++ b/TUSB_ProgressViewer/Controls/IslandPointer.xaml @@ -58,29 +58,5 @@ - diff --git a/TUSB_ProgressViewer/Models/Coordinate.cs b/TUSB_ProgressViewer/Models/Coordinate.cs index 5398e9d..175cddc 100644 --- a/TUSB_ProgressViewer/Models/Coordinate.cs +++ b/TUSB_ProgressViewer/Models/Coordinate.cs @@ -11,8 +11,19 @@ namespace TUSB_ProgressViewer.Models /// public class Coordinate { + /// + /// X座標 + /// public int X { get; } + + /// + /// Y座標 + /// public int Y { get; } + + /// + /// Z座標 + /// public int Z { get; } public Coordinate(int x, int y, int z) diff --git a/TUSB_ProgressViewer/Models/Island.cs b/TUSB_ProgressViewer/Models/Island.cs index c69c182..c5863a1 100644 --- a/TUSB_ProgressViewer/Models/Island.cs +++ b/TUSB_ProgressViewer/Models/Island.cs @@ -1,5 +1,6 @@ using OrangeNBT.World.Anvil; using Prism.Mvvm; +using Reactive.Bindings; using System; using System.Collections.Generic; using System.Linq; @@ -14,6 +15,9 @@ namespace TUSB_ProgressViewer.Models /// public class Island: BindableBase { + /// + /// 島タイプ + /// public IslandType IslandType { get; } /// @@ -24,12 +28,7 @@ public class Island: BindableBase /// /// 選択フラグ /// - public bool IsSelected - { - get => _isSelected; - set => SetProperty(ref _isSelected, value); - } - private bool _isSelected; + public bool IsSelected { get; set; } public Island(IslandType type, AnvilWorld world) { diff --git a/TUSB_ProgressViewer/Models/IslandsData.cs b/TUSB_ProgressViewer/Models/IslandsData.cs new file mode 100644 index 0000000..0fa03b8 --- /dev/null +++ b/TUSB_ProgressViewer/Models/IslandsData.cs @@ -0,0 +1,119 @@ +using Reactive.Bindings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using TUSB_ProgressViewer.Controls; +using TUSB_ProgressViewer.Util; + +namespace TUSB_ProgressViewer.Models +{ + public static class IslandsData + { + /// + /// 島リスト + /// + public static ReactiveCollection Islands { get; } = new ReactiveCollection(); + + /// + /// 島攻略数カウント + /// + public static ReactiveProperty CompletionCount { get; } = new ReactiveProperty(); + + /// + /// 島攻略率 + /// + public static ReactiveProperty CompletionRate { get; } = new ReactiveProperty(); + + /// + /// 島の数 + /// + private const int islandCount = 50; + + /// + /// 島読み込み + /// + /// + public static void Load(ref int count) + { + try + { + Islands.ClearOnScheduler(); + foreach (IslandType type in Enum.GetValues(typeof(IslandType))) + { + var island = new Island(type, World.WorldData); + + // 実際の座標と画像のピクセル数から画像上の島(エンドポータルフレーム)の位置を計算 + // 画像のサイズが変わると壊れます() + var X = (island.IslandType.GetCoordinate().X + 221) / 512.0; + var Z = (island.IslandType.GetCoordinate().Z + 237) / 512.0; + + // 別ディメンションは特殊な位置なので個別指定 + switch (island.IslandType) + { + case IslandType.TheUnderworld: + X = 47 / 256.0; + Z = 234 / 256.0; + break; + case IslandType.TheNether: + X = 128 / 256.0; + Z = 234 / 256.0; + break; + case IslandType.GulliversLand: + X = 183 / 256.0; + Z = 234 / 256.0; + break; + case IslandType.Cloudia: + X = 43 / 256.0; + Z = 246 / 256.0; + break; + case IslandType.TableMountain: + X = 82 / 256.0; + Z = 246 / 256.0; + break; + case IslandType.TocultColde: + X = 157 / 256.0; + Z = 246 / 256.0; + break; + case IslandType.TheEnd: + X = 218 / 256.0; + Z = 246 / 256.0; + break; + } + + Application.Current.Dispatcher.Invoke(() => + { + Islands.Add(new IslandPointer() + { + IslandName = island.IslandType.GetName(), + Center = new Point(X, Z), + IsComplete = island.IsComplete + }); + + CompletionCount.Value = Islands.Where(x => x.IsComplete).Count(); + CompletionRate.Value = (CompletionCount.Value / (double)islandCount) * 100; + }); + + World.LoadingProgress.Value = (++count / 297.0) * 100; + } + } + catch + { + Reset(); + throw; + } + } + + /// + /// データをリセット + /// + public static void Reset() + { + Islands.ClearOnScheduler(); + CompletionCount.Value = 0; + CompletionRate.Value = 0; + } + } +} diff --git a/TUSB_ProgressViewer/Models/Player.cs b/TUSB_ProgressViewer/Models/Player.cs new file mode 100644 index 0000000..1f9bece --- /dev/null +++ b/TUSB_ProgressViewer/Models/Player.cs @@ -0,0 +1,58 @@ +using Prism.Mvvm; +using Reactive.Bindings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TUSB_ProgressViewer.Models +{ + public class Player : BindableBase + { + /// + /// ユーザー名 + /// + public string Name { get; } + + /// + /// 剣士レベル + /// + public int KnightLevel { get; set; } + + /// + /// 忍者レベル + /// + public int NinjaLevel { get; set; } + + /// + /// 狩人レベル + /// + public int ArcherLevel { get; set; } + + /// + /// 白魔道士レベル + /// + public int WhiteMageLevel { get; set; } + + /// + /// 黒魔道士レベル + /// + public int BlackMageLevel { get; set; } + + /// + /// 召喚士レベル + /// + public int SummonerLevel { get; set; } + + /// + /// 選択中フラグ + /// + public bool IsSelected { get; set; } + + public Player(string name) + { + Name = name; + } + } +} diff --git a/TUSB_ProgressViewer/Models/ScoreData.cs b/TUSB_ProgressViewer/Models/ScoreData.cs new file mode 100644 index 0000000..d5f7862 --- /dev/null +++ b/TUSB_ProgressViewer/Models/ScoreData.cs @@ -0,0 +1,81 @@ +using OrangeNBT.NBT; +using OrangeNBT.NBT.IO; +using Reactive.Bindings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; + +namespace TUSB_ProgressViewer.Models +{ + public static class ScoreData + { + /// + /// プレイヤーデータのリスト + /// + public static ReactiveCollection Players { get; } = new ReactiveCollection(); + + /// + /// プレイヤーの数 + /// + public static ReactiveProperty PlayerCount { get; } = new ReactiveProperty(); + + /// + /// スコアデータ読み込み + /// + public static void Load() + { + var data = NBTFile.FromFile($@"{World.Path.Value}\data\scoreboard.dat")["data"] as TagCompound; + var PlayerScores = data["PlayerScores"] as TagList; + + // 複数のスコアオブジェクトを持っているエンティティ名を抽出 + // #100を除いてユーザー名だと思われる + // ソースは俺 + var users = PlayerScores.Value + .Select(x => ((x as TagCompound)["Name"] as TagString).Value) + .GroupBy(x => x) + .Where(x => x.Count() > 1) + .Select(x => x.Key) + .Where(x => x != "#100") + .ToList(); + + var list = PlayerScores.Value + .Where(x => users.Contains(((x as TagCompound)["Name"] as TagString).Value)) + .GroupBy(x => ((x as TagCompound)["Name"] as TagString).Value) + .ToList(); + + foreach (var user in list) + { + Application.Current.Dispatcher.Invoke(() => + { + var userData = new Player(user.Key); + Players.Add(userData); + PlayerCount.Value++; + + foreach (var tag in user) + { + var name = ((tag as TagCompound)["Objective"] as TagString).Value; + var value = ((tag as TagCompound)["Score"] as TagInt).Value; + if (name == "KnightLevel") userData.KnightLevel = value; + if (name == "NinjaLevel") userData.NinjaLevel = value; + if (name == "ArcherLevel") userData.ArcherLevel = value; + if (name == "WhiteMageLevel") userData.WhiteMageLevel = value; + if (name == "BlackMageLevel") userData.BlackMageLevel = value; + if (name == "SummonerLevel") userData.SummonerLevel = value; + } + }); + } + } + + /// + /// データをリセット + /// + public static void Reset() + { + Players.ClearOnScheduler(); + PlayerCount.Value = 0; + } + } +} diff --git a/TUSB_ProgressViewer/Models/Spawner.cs b/TUSB_ProgressViewer/Models/Spawner.cs index a4b55c7..8da285c 100644 --- a/TUSB_ProgressViewer/Models/Spawner.cs +++ b/TUSB_ProgressViewer/Models/Spawner.cs @@ -10,7 +10,14 @@ namespace TUSB_ProgressViewer.Models { public class Spawner { + /// + /// 座標 + /// public Coordinate Coordinate { get; set; } + + /// + /// 破壊フラグ + /// public bool IsBroken { get; set; } public Spawner(Coordinate coordinate, AnvilWorld world) diff --git a/TUSB_ProgressViewer/Models/SpawnersData.cs b/TUSB_ProgressViewer/Models/SpawnersData.cs new file mode 100644 index 0000000..0484bf0 --- /dev/null +++ b/TUSB_ProgressViewer/Models/SpawnersData.cs @@ -0,0 +1,333 @@ +using Reactive.Bindings; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using TUSB_ProgressViewer.Controls; + +namespace TUSB_ProgressViewer.Models +{ + public static class SpawnersData + { + /// + /// スポナーリスト + /// + public static ReactiveCollection Spawners { get; } = new ReactiveCollection(); + + /// + /// スポナー破壊数カウント + /// + public static ReactiveProperty BrokenCount { get; } = new ReactiveProperty(); + + /// + /// スポナー破壊率 + /// + public static ReactiveProperty BrokenRate { get; } = new ReactiveProperty(); + + /// + /// スポナー座標リスト + /// + private static readonly Coordinate[] _spawnerCoordinates = new Coordinate[247] + { + new Coordinate(74, 49, -10), + new Coordinate(74, 49, 10), + new Coordinate(64, 57, 5), + new Coordinate(55, 62, 5), + new Coordinate(41, 56, 5), + new Coordinate(31, 58, 5), + new Coordinate(18, 61, 5), + new Coordinate(9, 58, 5), + new Coordinate(-6, 51, -7), + new Coordinate(-7, 58, 5), + new Coordinate(-8, 67, 19), + new Coordinate(-27, 65, 18), + new Coordinate(-29, 51, 6), + new Coordinate(-31, 51, -7), + new Coordinate(-34, 62, 5), + new Coordinate(-35, 42, 18), + new Coordinate(-39, 62, 5), + new Coordinate(-52, 58, 10), + new Coordinate(-55, 45, 18), + new Coordinate(-59, 58, 6), + new Coordinate(-61, 64, 14), + new Coordinate(-63, 49, 18), + new Coordinate(-70, 61, 2), + new Coordinate(-71, 61, 18), + new Coordinate(-78, 61, 18), + new Coordinate(-95, 66, 4), + new Coordinate(-95, 65, 21), + new Coordinate(-105, 68, 13), + new Coordinate(-107, 61, -4), + new Coordinate(-107, 61, 31), + new Coordinate(-118, 63, 3), + new Coordinate(-118, 63, 23), + new Coordinate(-128, 63, 5), + new Coordinate(-128, 63, 21), + new Coordinate(-139, 63, 5), + new Coordinate(-139, 63, 21), + new Coordinate(-149, 63, 1), + new Coordinate(-149, 63, 25), + new Coordinate(-159, 63, 11), + new Coordinate(-159, 63, 15), + new Coordinate(-165, 63, -7), + new Coordinate(-165, 63, 33), + new Coordinate(-168, 63, 13), + new Coordinate(-183, 63, 0), + new Coordinate(-197, 68, 14), + new Coordinate(-198, 67, 28), + new Coordinate(-207, 58, 1), + new Coordinate(-207, 70, 13), + new Coordinate(-212, 58, 25), + new Coordinate(-222, 75, -4), + new Coordinate(-228, 66, 8), + new Coordinate(-236, 66, 2), + new Coordinate(-236, 64, 10), + new Coordinate(-236, 63, 12), + new Coordinate(-236, 64, 14), + new Coordinate(-236, 66, 22), + new Coordinate(-244, 66, 17), + new Coordinate(-252, 63, 29), + new Coordinate(-261, 63, 0), + new Coordinate(-265, 65, 11), + new Coordinate(-278, 63, 28), + new Coordinate(-279, 61, 9), + new Coordinate(-291, 63, -1), + new Coordinate(-296, 64, 14), + new Coordinate(-301, 65, 20), + new Coordinate(-304, 61, -5), + new Coordinate(-306, 63, 28), + new Coordinate(-313, 63, 11), + new Coordinate(-319, 62, -4), + new Coordinate(-326, 61, 15), + new Coordinate(-328, 60, 2), + new Coordinate(-333, 60, 28), + new Coordinate(-344, 59, 2), + new Coordinate(-353, 60, 24), + new Coordinate(-358, 60, 11), + new Coordinate(-367, 67, 12), + new Coordinate(-378, 64, 0), + new Coordinate(-382, 64, 19), + new Coordinate(-396, 66, 5), + new Coordinate(-395, 65, -4), + new Coordinate(-401, 65, 31), + new Coordinate(-407, 66, 24), + new Coordinate(-413, 67, 31), + new Coordinate(-414, 67, -3), + new Coordinate(-415, 68, 14), + new Coordinate(-428, 64, -12), + new Coordinate(-432, 64, 29), + new Coordinate(-434, 64, 2), + new Coordinate(-435, 64, 1), + new Coordinate(-443, 63, 18), + new Coordinate(-451, 63, 2), + new Coordinate(-458, 63, 25), + new Coordinate(-463, 61, 14), + new Coordinate(-469, 63, 0), + new Coordinate(-478, 63, 18), + new Coordinate(-496, 64, -12), + new Coordinate(-500, 63, 39), + new Coordinate(-518, 63, -15), + new Coordinate(-528, 63, 2), + new Coordinate(-525, 63, 43), + new Coordinate(-532, 63, 22), + new Coordinate(-544, 66, -9), + new Coordinate(-546, 66, -11), + new Coordinate(-546, 78, 32), + new Coordinate(-548, 78, 34), + new Coordinate(-562, 63, -10), + new Coordinate(-563, 76, 14), + new Coordinate(-565, 76, 16), + new Coordinate(-566, 63, -15), + new Coordinate(-569, 68, -8), + new Coordinate(-570, 67, 31), + new Coordinate(-571, 63, 37), + new Coordinate(-577, 63, 32), + new Coordinate(-579, 63, 4), + new Coordinate(-582, 63, -13), + new Coordinate(-583, 63, 16), + new Coordinate(-587, 63, 33), + new Coordinate(-600, 66, 9), + new Coordinate(-600, 66, 15), + new Coordinate(-610, 66, -6), + new Coordinate(-610, 66, 30), + new Coordinate(-615, 66, 5), + new Coordinate(-615, 66, 19), + new Coordinate(-618, 66, 43), + new Coordinate(-619, 66, -19), + new Coordinate(-622, 66, 12), + new Coordinate(-624, 66, 10), + new Coordinate(-624, 66, 12), + new Coordinate(-624, 66, 14), + new Coordinate(-625, 66, 2), + new Coordinate(-625, 66, 23), + new Coordinate(-626, 66, 12), + new Coordinate(-627, 66, -11), + new Coordinate(-627, 66, 35), + new Coordinate(-644, 66, 3), + new Coordinate(-644, 66, 21), + new Coordinate(-647, 66, 12), + new Coordinate(-790, 66, -4), + new Coordinate(-790, 66, 28), + new Coordinate(-802, 66, 12), + new Coordinate(-829, 76, -1), + new Coordinate(-829, 76, 26), + new Coordinate(-830, 76, 12), + new Coordinate(-881, 96, 1), + new Coordinate(-881, 96, 12), + new Coordinate(-881, 96, 23), + new Coordinate(-907, 106, 0), + new Coordinate(-907, 106, 12), + new Coordinate(-907, 106, 26), + new Coordinate(-933, 116, -5), + new Coordinate(-933, 116, 3), + new Coordinate(-933, 116, 12), + new Coordinate(-933, 116, 21), + new Coordinate(-933, 116, 29), + new Coordinate(-960, 106, 1), + new Coordinate(-960, 106, 8), + new Coordinate(-960, 106, 16), + new Coordinate(-960, 106, 23), + new Coordinate(-984, 96, 4), + new Coordinate(-984, 96, 21), + new Coordinate(-985, 96, 12), + new Coordinate(-1011, 86, -2), + new Coordinate(-1011, 86, 26), + new Coordinate(-1013, 86, 12), + new Coordinate(-1037, 76, 3), + new Coordinate(-1037, 76, 21), + new Coordinate(-1039, 76, 12), + new Coordinate(-1069, 66, 12), + new Coordinate(-1076, 66, -4), + new Coordinate(-1076, 66, 28), + new Coordinate(-1083, 66, 12), + new Coordinate(-1090, 66, 5), + new Coordinate(-1090, 66, 19), + new Coordinate(-1109, 74, -3), + new Coordinate(-1109, 74, 27), + new Coordinate(-1115, 66, -7), + new Coordinate(-1115, 66, 31), + new Coordinate(-1118, 67, 12), + new Coordinate(-1130, 66, 0), + new Coordinate(-1130, 66, 8), + new Coordinate(-1130, 66, 16), + new Coordinate(-1130, 66, 24), + new Coordinate(-1143, 66, 12), + new Coordinate(-1145, 66, -3), + new Coordinate(-1145, 66, 27), + new Coordinate(-1153, 73, 5), + new Coordinate(-1153, 73, 19), + new Coordinate(-1154, 73, -8), + new Coordinate(-1154, 73, 32), + new Coordinate(-1155, 149, -20), + new Coordinate(-1155, 149, 44), + new Coordinate(-1252, 80, -8), + new Coordinate(-1256, 80, -10), + new Coordinate(-1260, 89, 4), + new Coordinate(-1298, 95, 56), + new Coordinate(-1302, 95, 58), + new Coordinate(-1307, 99, 41), + new Coordinate(-1364, 114, -3), + new Coordinate(-1365, 114, 20), + new Coordinate(-1376, 163, 5), + new Coordinate(-1376, 114, 9), + new Coordinate(-1376, 163, 13), + new Coordinate(-1377, 127, -5), + new Coordinate(-1377, 114, 1), + new Coordinate(-1377, 156, 9), + new Coordinate(-1377, 114, 17), + new Coordinate(-1377, 127, 23), + new Coordinate(-1387, 163, 5), + new Coordinate(-1387, 156, 9), + new Coordinate(-1387, 163, 13), + new Coordinate(-1388, 114, -2), + new Coordinate(-1388, 206, 9), + new Coordinate(-1388, 114, 21), + new Coordinate(-1391, 127, -8), + new Coordinate(-1391, 127, 26), + new Coordinate(-1393, 156, 4), + new Coordinate(-1393, 156, 14), + new Coordinate(-1399, 163, 5), + new Coordinate(-1399, 163, 13), + new Coordinate(-1411, 202, 3), + new Coordinate(-1412, 198, 10), + new Coordinate(-1419, 151, -9), + new Coordinate(-1419, 192, -9), + new Coordinate(-1419, 198, -9), + new Coordinate(-1419, 198, 27), + new Coordinate(-1425, 157, 22), + new Coordinate(-1427, 114, -1), + new Coordinate(-1427, 114, 19), + new Coordinate(-1428, 157, 33), + new Coordinate(-1432, 145, -14), + new Coordinate(-1433, 187, -11), + new Coordinate(-1437, 184, -15), + new Coordinate(-1440, 142, -17), + new Coordinate(-1442, 159, 33), + new Coordinate(-1447, 139, -9), + new Coordinate(-1448, 120, 28), + new Coordinate(-1453, 131, 10), + new Coordinate(-1455, 179, -15), + new Coordinate(-1456, 178, -9), + new Coordinate(-1456, 114, 2), + new Coordinate(-1456, 114, 16), + new Coordinate(-1456, 164, 27), + new Coordinate(-1457, 169, 12), + new Coordinate(-1459, 127, 12), + new Coordinate(-1460, 176, -5), + new Coordinate(-1463, 131, 4), + new Coordinate(-1463, 173, 4) + }; + + /// + /// スポナー読み込み + /// + /// + public static void Load(ref int count) + { + try + { + Spawners.ClearOnScheduler(); + foreach (Coordinate coor in _spawnerCoordinates) + { + // 実際の座標と画像のピクセル数から画像上のスポナー位置を計算 + // 画像のサイズが変わると壊れます() + var X = (coor.X + 1502.5) / 1664; + var Z = (coor.Z + 114.5) / 247; + + var isBroken = new Spawner(coor, World.WorldData).IsBroken; + + Application.Current.Dispatcher.Invoke(() => + { + Spawners.Add(new SpawnerPointer() + { + Center = new Point(X, Z), + IsBroken = isBroken + }); + + BrokenCount.Value = Spawners.Where(x => x.IsBroken).Count(); + BrokenRate.Value = (BrokenCount.Value / 247.0) * 100; + }); + + World.LoadingProgress.Value = (++count / 297.0) * 100; + } + } + catch + { + Reset(); + throw; + } + } + + /// + /// データをリセット + /// + public static void Reset() + { + Spawners.ClearOnScheduler(); + BrokenCount.Value = 0; + BrokenRate.Value = 0; + } + } +} diff --git a/TUSB_ProgressViewer/Models/World.cs b/TUSB_ProgressViewer/Models/World.cs index aba17cc..80aa42b 100644 --- a/TUSB_ProgressViewer/Models/World.cs +++ b/TUSB_ProgressViewer/Models/World.cs @@ -1,13 +1,14 @@ -using OrangeNBT.World.Anvil; +using OrangeNBT.NBT; +using OrangeNBT.NBT.IO; +using OrangeNBT.World.Anvil; using Reactive.Bindings; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; -using TUSB_ProgressViewer.Controls; -using TUSB_ProgressViewer.Util; namespace TUSB_ProgressViewer.Models { @@ -39,307 +40,27 @@ public static class World /// /// 読込中フラグ /// - public static ReactiveProperty IsBusy { get; } = new ReactiveProperty(); + public static ReactiveProperty IsLoading { get; } = new ReactiveProperty(); /// /// エラーフラグ /// public static ReactiveProperty IsError { get; } = new ReactiveProperty(); - /// - /// 島リスト - /// - public static ReactiveCollection Islands { get; } = new ReactiveCollection(); - - /// - /// 島攻略数カウント - /// - public static ReactiveProperty CompletionCount { get; } = new ReactiveProperty(); - - /// - /// 島攻略率 - /// - public static ReactiveProperty CompletionRate { get; } = new ReactiveProperty(); - - /// - /// スポナーリスト - /// - public static ReactiveCollection Spawners { get; } = new ReactiveCollection(); - - /// - /// スポナー破壊数カウント - /// - public static ReactiveProperty BrokenCount { get; } = new ReactiveProperty(); - - /// - /// スポナー破壊率 - /// - public static ReactiveProperty BrokenRate { get; } = new ReactiveProperty(); - - /// - /// スポナー座標リスト - /// - private static Coordinate[] _spawnerCoordinates = new Coordinate[247] - { - new Coordinate(74, 49, -10), - new Coordinate(74, 49, 10), - new Coordinate(64, 57, 5), - new Coordinate(55, 62, 5), - new Coordinate(41, 56, 5), - new Coordinate(31, 58, 5), - new Coordinate(18, 61, 5), - new Coordinate(9, 58, 5), - new Coordinate(-6, 51, -7), - new Coordinate(-7, 58, 5), - new Coordinate(-8, 67, 19), - new Coordinate(-27, 65, 18), - new Coordinate(-29, 51, 6), - new Coordinate(-31, 51, -7), - new Coordinate(-34, 62, 5), - new Coordinate(-35, 42, 18), - new Coordinate(-39, 62, 5), - new Coordinate(-52, 58, 10), - new Coordinate(-55, 45, 18), - new Coordinate(-59, 58, 6), - new Coordinate(-61, 64, 14), - new Coordinate(-63, 49, 18), - new Coordinate(-70, 61, 2), - new Coordinate(-71, 61, 18), - new Coordinate(-78, 61, 18), - new Coordinate(-95, 66, 4), - new Coordinate(-95, 65, 21), - new Coordinate(-105, 68, 13), - new Coordinate(-107, 61, -4), - new Coordinate(-107, 61, 31), - new Coordinate(-118, 63, 3), - new Coordinate(-118, 63, 23), - new Coordinate(-128, 63, 5), - new Coordinate(-128, 63, 21), - new Coordinate(-139, 63, 5), - new Coordinate(-139, 63, 21), - new Coordinate(-149, 63, 1), - new Coordinate(-149, 63, 25), - new Coordinate(-159, 63, 11), - new Coordinate(-159, 63, 15), - new Coordinate(-165, 63, -7), - new Coordinate(-165, 63, 33), - new Coordinate(-168, 63, 13), - new Coordinate(-183, 63, 0), - new Coordinate(-197, 68, 14), - new Coordinate(-198, 67, 28), - new Coordinate(-207, 58, 1), - new Coordinate(-207, 70, 13), - new Coordinate(-212, 58, 25), - new Coordinate(-222, 75, -4), - new Coordinate(-228, 66, 8), - new Coordinate(-236, 66, 2), - new Coordinate(-236, 64, 10), - new Coordinate(-236, 63, 12), - new Coordinate(-236, 64, 14), - new Coordinate(-236, 66, 22), - new Coordinate(-244, 66, 17), - new Coordinate(-252, 63, 29), - new Coordinate(-261, 63, 0), - new Coordinate(-265, 65, 11), - new Coordinate(-278, 63, 28), - new Coordinate(-279, 61, 9), - new Coordinate(-291, 63, -1), - new Coordinate(-296, 64, 14), - new Coordinate(-301, 65, 20), - new Coordinate(-304, 61, -5), - new Coordinate(-306, 63, 28), - new Coordinate(-313, 63, 11), - new Coordinate(-319, 62, -4), - new Coordinate(-326, 61, 15), - new Coordinate(-328, 60, 2), - new Coordinate(-333, 60, 28), - new Coordinate(-344, 59, 2), - new Coordinate(-353, 60, 24), - new Coordinate(-358, 60, 11), - new Coordinate(-367, 67, 12), - new Coordinate(-378, 64, 0), - new Coordinate(-382, 64, 19), - new Coordinate(-396, 66, 5), - new Coordinate(-395, 65, -4), - new Coordinate(-401, 65, 31), - new Coordinate(-407, 66, 24), - new Coordinate(-413, 67, 31), - new Coordinate(-414, 67, -3), - new Coordinate(-415, 68, 14), - new Coordinate(-428, 64, -12), - new Coordinate(-432, 64, 29), - new Coordinate(-434, 64, 2), - new Coordinate(-435, 64, 1), - new Coordinate(-443, 63, 18), - new Coordinate(-451, 63, 2), - new Coordinate(-458, 63, 25), - new Coordinate(-463, 61, 14), - new Coordinate(-469, 63, 0), - new Coordinate(-478, 63, 18), - new Coordinate(-496, 64, -12), - new Coordinate(-500, 63, 39), - new Coordinate(-518, 63, -15), - new Coordinate(-528, 63, 2), - new Coordinate(-525, 63, 43), - new Coordinate(-532, 63, 22), - new Coordinate(-544, 66, -9), - new Coordinate(-546, 66, -11), - new Coordinate(-546, 78, 32), - new Coordinate(-548, 78, 34), - new Coordinate(-562, 63, -10), - new Coordinate(-563, 76, 14), - new Coordinate(-565, 76, 16), - new Coordinate(-566, 63, -15), - new Coordinate(-569, 68, -8), - new Coordinate(-570, 67, 31), - new Coordinate(-571, 63, 37), - new Coordinate(-577, 63, 32), - new Coordinate(-579, 63, 4), - new Coordinate(-582, 63, -13), - new Coordinate(-583, 63, 16), - new Coordinate(-587, 63, 33), - new Coordinate(-600, 66, 9), - new Coordinate(-600, 66, 15), - new Coordinate(-610, 66, -6), - new Coordinate(-610, 66, 30), - new Coordinate(-615, 66, 5), - new Coordinate(-615, 66, 19), - new Coordinate(-618, 66, 43), - new Coordinate(-619, 66, -19), - new Coordinate(-622, 66, 12), - new Coordinate(-624, 66, 10), - new Coordinate(-624, 66, 12), - new Coordinate(-624, 66, 14), - new Coordinate(-625, 66, 2), - new Coordinate(-625, 66, 23), - new Coordinate(-626, 66, 12), - new Coordinate(-627, 66, -11), - new Coordinate(-627, 66, 35), - new Coordinate(-644, 66, 3), - new Coordinate(-644, 66, 21), - new Coordinate(-647, 66, 12), - new Coordinate(-790, 66, -4), - new Coordinate(-790, 66, 28), - new Coordinate(-802, 66, 12), - new Coordinate(-829, 76, -1), - new Coordinate(-829, 76, 26), - new Coordinate(-830, 76, 12), - new Coordinate(-881, 96, 1), - new Coordinate(-881, 96, 12), - new Coordinate(-881, 96, 23), - new Coordinate(-907, 106, 0), - new Coordinate(-907, 106, 12), - new Coordinate(-907, 106, 26), - new Coordinate(-933, 116, -5), - new Coordinate(-933, 116, 3), - new Coordinate(-933, 116, 12), - new Coordinate(-933, 116, 21), - new Coordinate(-933, 116, 29), - new Coordinate(-960, 106, 1), - new Coordinate(-960, 106, 8), - new Coordinate(-960, 106, 16), - new Coordinate(-960, 106, 23), - new Coordinate(-984, 96, 4), - new Coordinate(-984, 96, 21), - new Coordinate(-985, 96, 12), - new Coordinate(-1011, 86, -2), - new Coordinate(-1011, 86, 26), - new Coordinate(-1013, 86, 12), - new Coordinate(-1037, 76, 3), - new Coordinate(-1037, 76, 21), - new Coordinate(-1039, 76, 12), - new Coordinate(-1069, 66, 12), - new Coordinate(-1076, 66, -4), - new Coordinate(-1076, 66, 28), - new Coordinate(-1083, 66, 12), - new Coordinate(-1090, 66, 5), - new Coordinate(-1090, 66, 19), - new Coordinate(-1109, 74, -3), - new Coordinate(-1109, 74, 27), - new Coordinate(-1115, 66, -7), - new Coordinate(-1115, 66, 31), - new Coordinate(-1118, 67, 12), - new Coordinate(-1130, 66, 0), - new Coordinate(-1130, 66, 8), - new Coordinate(-1130, 66, 16), - new Coordinate(-1130, 66, 24), - new Coordinate(-1143, 66, 12), - new Coordinate(-1145, 66, -3), - new Coordinate(-1145, 66, 27), - new Coordinate(-1153, 73, 5), - new Coordinate(-1153, 73, 19), - new Coordinate(-1154, 73, -8), - new Coordinate(-1154, 73, 32), - new Coordinate(-1155, 149, -20), - new Coordinate(-1155, 149, 44), - new Coordinate(-1252, 80, -8), - new Coordinate(-1256, 80, -10), - new Coordinate(-1260, 89, 4), - new Coordinate(-1298, 95, 56), - new Coordinate(-1302, 95, 58), - new Coordinate(-1307, 99, 41), - new Coordinate(-1364, 114, -3), - new Coordinate(-1365, 114, 20), - new Coordinate(-1376, 163, 5), - new Coordinate(-1376, 114, 9), - new Coordinate(-1376, 163, 13), - new Coordinate(-1377, 127, -5), - new Coordinate(-1377, 114, 1), - new Coordinate(-1377, 156, 9), - new Coordinate(-1377, 114, 17), - new Coordinate(-1377, 127, 23), - new Coordinate(-1387, 163, 5), - new Coordinate(-1387, 156, 9), - new Coordinate(-1387, 163, 13), - new Coordinate(-1388, 114, -2), - new Coordinate(-1388, 206, 9), - new Coordinate(-1388, 114, 21), - new Coordinate(-1391, 127, -8), - new Coordinate(-1391, 127, 26), - new Coordinate(-1393, 156, 4), - new Coordinate(-1393, 156, 14), - new Coordinate(-1399, 163, 5), - new Coordinate(-1399, 163, 13), - new Coordinate(-1411, 202, 3), - new Coordinate(-1412, 198, 10), - new Coordinate(-1419, 151, -9), - new Coordinate(-1419, 192, -9), - new Coordinate(-1419, 198, -9), - new Coordinate(-1419, 198, 27), - new Coordinate(-1425, 157, 22), - new Coordinate(-1427, 114, -1), - new Coordinate(-1427, 114, 19), - new Coordinate(-1428, 157, 33), - new Coordinate(-1432, 145, -14), - new Coordinate(-1433, 187, -11), - new Coordinate(-1437, 184, -15), - new Coordinate(-1440, 142, -17), - new Coordinate(-1442, 159, 33), - new Coordinate(-1447, 139, -9), - new Coordinate(-1448, 120, 28), - new Coordinate(-1453, 131, 10), - new Coordinate(-1455, 179, -15), - new Coordinate(-1456, 178, -9), - new Coordinate(-1456, 114, 2), - new Coordinate(-1456, 114, 16), - new Coordinate(-1456, 164, 27), - new Coordinate(-1457, 169, 12), - new Coordinate(-1459, 127, 12), - new Coordinate(-1460, 176, -5), - new Coordinate(-1463, 131, 4), - new Coordinate(-1463, 173, 4) - }; - /// /// ワールド読み込み /// /// ワールドパス public static void Load(string path) { - if (IsBusy.Value) return; + if (IsLoading.Value) return; + + IslandsData.Reset(); + SpawnersData.Reset(); + ScoreData.Reset(); FolderName.Value = System.IO.Path.GetFileName(path); - IsBusy.Value = true; + IsLoading.Value = true; LoadingProgress.Value = 0; Path.Value = path; @@ -351,96 +72,31 @@ public static void Load(string path) { WorldData = AnvilWorld.Load(path); - // 島 - Islands.ClearOnScheduler(); - foreach (IslandType type in Enum.GetValues(typeof(IslandType))) - { - var island = new Island(type, WorldData); - var x = (island.IslandType.GetCoordinate().X + 221) / 512.0; - var z = (island.IslandType.GetCoordinate().Z + 237) / 512.0; - switch (island.IslandType) - { - case IslandType.TheUnderworld: - x = 47 / 256.0; - z = 234 / 256.0; - break; - case IslandType.TheNether: - x = 128 / 256.0; - z = 234 / 256.0; - break; - case IslandType.GulliversLand: - x = 183 / 256.0; - z = 234 / 256.0; - break; - case IslandType.Cloudia: - x = 43 / 256.0; - z = 246 / 256.0; - break; - case IslandType.TableMountain: - x = 82 / 256.0; - z = 246 / 256.0; - break; - case IslandType.TocultColde: - x = 157 / 256.0; - z = 246 / 256.0; - break; - case IslandType.TheEnd: - x = 218 / 256.0; - z = 246 / 256.0; - break; - } - Application.Current.Dispatcher.Invoke(() => Islands.Add(new IslandPointer() - { - IslandName = island.IslandType.GetName(), - Center = new Point(x, z), - IsComplete = island.IsComplete - })); - - LoadingProgress.Value = (++count / 297.0) * 100; - } - Application.Current.Dispatcher.Invoke(() => - { - CompletionCount.Value = Islands.Where(x => x.IsComplete).Count(); - CompletionRate.Value = (CompletionCount.Value / 50.0) * 100; - }); + IslandsData.Load(ref count); + SpawnersData.Load(ref count); + ScoreData.Load(); - // エンドスポナー - Spawners.ClearOnScheduler(); - foreach (Coordinate coor in _spawnerCoordinates) - { - var x = (coor.X + 1502.5) / 1664; - var z = (coor.Z + 114.5) / 247; - var isBroken = new Spawner(coor, WorldData).IsBroken; - Application.Current.Dispatcher.Invoke(() => Spawners.Add(new SpawnerPointer() - { - Center = new Point(x, z), - IsBroken = isBroken - })); - - LoadingProgress.Value = (++count / 297.0) * 100; - } - Application.Current.Dispatcher.Invoke(() => - { - BrokenCount.Value = Spawners.Where(x => x.IsBroken).Count(); - BrokenRate.Value = (BrokenCount.Value / 247.0) * 100; - }); + // 100%を見せたいからという理由だけで0.3秒遅延させる + System.Threading.Thread.Sleep(300); } catch { Path.Value = null; - Islands.ClearOnScheduler(); - Spawners.ClearOnScheduler(); - CompletionCount.Value = 0; - CompletionRate.Value = 0; - BrokenCount.Value = 0; - BrokenRate.Value = 0; IsError.Value = true; - return; } - finally { IsBusy.Value = false; } + finally + { + IsLoading.Value = false; + } }); } - public static void Reload() => Load(Path.Value); + /// + /// ワールドを再読み込み + /// + public static void Reload() + { + Load(Path.Value); + } } } diff --git a/TUSB_ProgressViewer/Properties/AssemblyInfo.cs b/TUSB_ProgressViewer/Properties/AssemblyInfo.cs index d9612f0..025289b 100644 --- a/TUSB_ProgressViewer/Properties/AssemblyInfo.cs +++ b/TUSB_ProgressViewer/Properties/AssemblyInfo.cs @@ -51,5 +51,5 @@ // すべての値を指定するか、次を使用してビルド番号とリビジョン番号を既定に設定できます // 既定値にすることができます: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("1.1.0.0")] +[assembly: AssemblyFileVersion("1.1.0.0")] diff --git a/TUSB_ProgressViewer/Resources/book.png b/TUSB_ProgressViewer/Resources/book.png new file mode 100644 index 0000000000000000000000000000000000000000..5c37dd1c93ae029e283ad2b64d10fa692e0cbbfc GIT binary patch literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU|Qno;uumf=k48%S;7G#4G&$q zG!|W2**uAdb*_$Gqg`vX_(#sJVD*bfSEiH-PS3GxeZtD3-p<7-yT)5obLpZZ;u_Bz zmQSDknYEx#0@ zGd$p7I0q;4lJD;S`%32jkB4thR~w0+m>2)vw$Yqn4&wnyBqHYfcjhni9^1>#YkSVW zEq{uf{pW{|`#)$$z31G+h+-blU^NaIf|C zu&TcIf2;of->3e84Mi5H*!w$!^~pKADmTBcH@r~oeg}2n%+ReVay7=Gj zlb=7_xz8PN0v?iJEA;;EX;^!9^+R!+TRTPn{S41fd-$`)j{p2-+k+RkSDZT=^8AO7 z+4KE(s)MTj&x5`__NL2*T`r>?cCLvs}H;9r4|A-zm(%_${X}`7P(FYqeN(PXMPPB?%t3dd4>P WEhTH~)=L1BErX}4pUXO@geCws`#!q> literal 0 HcmV?d00001 diff --git a/TUSB_ProgressViewer/Resources/bow.png b/TUSB_ProgressViewer/Resources/bow.png new file mode 100644 index 0000000000000000000000000000000000000000..11b0c7e042d31526ace63bc192be883215e7b7b4 GIT binary patch literal 668 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU`qCMaSW-L^Y*T-7jvM9!^6Ow zmXM~V&yaZVtHwdp$S$CjZ_4;!ko9Efb|5Q~J zsO!&ko2247NhLAIMZaWcOqBDXqc7uD=RbJ+H~VA#o}cCZuCXZ$1#ArIaALb_J#*Ii zm+9`-M<4U+%dh-xf8)NMocx#Sqt~BvA*loF*#7M|v-|l0V{mgK&^y{+CyZZg-e^y=x4^vp^KIEyX+jRS7?f-K>Eiq+Z{$<$u z{jc@&>rXM9cm3B_ra7N)V@gc7FVdQ&MBb@0F&$x2LJ#7 literal 0 HcmV?d00001 diff --git a/TUSB_ProgressViewer/Resources/carrot_on_a_stick.png b/TUSB_ProgressViewer/Resources/carrot_on_a_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..35b5e241cce705b7cd6b133668c84126ee23b66d GIT binary patch literal 746 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVA|;E;uumf=j|Ow?~p)=hKDmR zxn@YKPUN}ks-USmhlA%1&kTjF8}e8Tka91BS(2Ww#*J&o2BmRw56*f>fXPD zqPe_zh?KNOx<`+IH`>pF%4HimR$;vI9yw7H+RzdPG{{k-2D z_JAhF1Ck7L5X5f=&#lk@h^xmRe!V@Hq5+w2{pMnJQB!zu@iXKbPjj&&H6uv-Cdui(i#>w__NQyaD#mzu&bC zK$&S6dSae`XS6xL{Z0dh#l9yGnT#6Zz(Q#Y4iWrug@QTZT|Y>U-LnQJ^xdTJl_iMsl3Hs|Nr~X)eq1A zzgaVXXYE8xhkUJVxHM@6E;kUT^<6=l_olE3KaY-pkO6h)^)=lJSeVPiJ0{ zx%ch+=lHirivLZ1n|J=F>N{qQ6y$gXnH@M=Z7c7EUDKsM+8wx(^QWbH`P*|?R61OH c{q-M{Uf>i5|F!kIfoYh*)78&qol`;+0Lj%;M*si- literal 0 HcmV?d00001 diff --git a/TUSB_ProgressViewer/Resources/iron_sword.png b/TUSB_ProgressViewer/Resources/iron_sword.png new file mode 100644 index 0000000000000000000000000000000000000000..a48bb173c88317f26a6c8dd4a46addafd11a0542 GIT binary patch literal 680 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV9NJ&aSW-L^Y*Tx7qg>C!$X&x zEn5VvttU?j+t#?DH=WbcNAH25&NPR<1mS5nSaaSUDcgHc`k~<)wg3OOI-AUz-)R1B z-Q|7n)uq-i%Uo6G5MK8!hm9efp#VW#{}O-Tf>&|f?QIXOZRGkN{;Jx`cl|Eo10IHR z3`m3x`-(N+=Gf0Z8)V;L%`k`YfFv^UoWaxi{7>J@Ew6KL`z5OPPfweh=o%e~ir(jk7P8TGnsA*%JR>{yEFT*Ds6fIx&23=cc{<0ZaSivZ%i1 zVaU7nedX=nmp5JK&e?wZO7x1qHBB3fF?_MQj_<>-BKf-JfW6ZC84VUKZui3{P|Nq-R(RJm^gJ1n*R^2*3*`f^7r;n?#++?RsHWmja|b9w1~WPoq5WI i=Wj4Qp)lJ=tzKgJVy3682a16ykipZ{&t;ucLK6V@ln}H4 literal 0 HcmV?d00001 diff --git a/TUSB_ProgressViewer/Resources/snowball.png b/TUSB_ProgressViewer/Resources/snowball.png new file mode 100644 index 0000000000000000000000000000000000000000..6554024ddd17f36bb96bbed968ac0f0b80f0b845 GIT binary patch literal 714 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4CRZ;uumf=k4A7UNV6q4Igg` z2y~Wi*x(U!x?zIThEKL@a@OVm(dCGnzvNct=ra8~e9X1m!NAwyZim1P8;1vT4m^Cu zw*US0xbizU|4QsAPfKU>oTLInUmo?WvNoB0c2}L+?&|8;`v;c){rf3B!cgk!zrU;J z<;VS%WSGNv06~<-v#&V!c>DHkhdzF+h`IU4V5ZNZkB1j8E~u%hm*4;I!GbTcJNOm| zF*g`9Sip%L&t5a!wAugF#_sdtAHPm--dynK_t#R3e?Na%$eh2%8N(jXiEM`?!=2an zcHgg>H-Dy`U0eOfw8Vv5{%+US{wS~Vnqh4v3yRr5TeR0Rhn)YOzUlMVn>KYTE&9)I z`=3{7DO101H}~=D=4OXJzMVVwO}X$=ZYCQhB(H!yWx8KZ!TNsuUOjv3`2Sl!S~+g} zn}0bo^EVc2UjN(O@TR6Zdw>n2H z_&Yo0zftk$&qvDx9t$#@V|c)WM6CP$naQmCJAcLf3R%V3&;R?Z`@P@Fp8xp%IdfVb z+vz*_B7z?7-s-x4M_*=I{7Wn~l{r7}_Vp;U^Z)N-21|CGt-~|@ckS}Oc5J)$Rr<`i z=fEKPE4dycv}3-PHmrJOf7ys0%!3)`a=NRBg1;~h-lqgZhT(+$3_mAJAIlwf^ N;OXk;vd$@?2>`cBKU@F+ literal 0 HcmV?d00001 diff --git a/TUSB_ProgressViewer/Resources/wolf_spawn_egg.png b/TUSB_ProgressViewer/Resources/wolf_spawn_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..ddc7044b5a3dda09e29ab819ebd544cda5d00c53 GIT binary patch literal 919 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV2<;2aSW-L^Y*THws4?K+s8W{ zi^8(?L%Pf_xC)9l<;AeL2)f+r*dfsUD9mgB1nzRPfLyVyQCpl2Rx!GMZ(5z_b@0fs zWou_GS$qG1?V-dO4}SmI_TOjL5`JdOnR8Nr*1*7ldUfgFEoJ59yMLL^oHJtr|Avbh zCmzd(Yh7F)IBC<(9qrR!KT~giBG_QbWZ=&5jN^a|;|yhn;@JIsA0C{`xFWx!v_9yZ z^J|9uY15wUiH)E3x&5-fP^^1`EJGknElWZl!x_PbomZ|iI=%ngFDp6a`18-Z9tt0J zE~@);$kZ}EGIHYQes1HUecSdaKJQP9bNkC5!R{b}Vj)Yyx(UB7^Xn)-DcW^$-rwI( z_H5p(`@H)5n~9$fHZoeu%U$|>^}eg6zjQi7G1Nksi(?*LXKvXyKVD9D>hbIQ_f7sh zcdo3Zyyo30pWhy^I{56_vN`qZuRgJPa`VodJ+2w`OzSZ1*8BRJvCH*u<AEF=~w=?Z@Kl><^6o@uGwPm@Z$3) zzvar$|EBAou6(iU-&1|=qPj14L@oVqJ$f_c5BJ-$P4RcJIN8@4x@HfBsd~K0&^>w6c5UPS + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TUSB_ProgressViewer/Styles/LoadingViewStyle.xaml b/TUSB_ProgressViewer/Styles/LoadingViewStyle.xaml index d728f32..009d8bd 100644 --- a/TUSB_ProgressViewer/Styles/LoadingViewStyle.xaml +++ b/TUSB_ProgressViewer/Styles/LoadingViewStyle.xaml @@ -1,15 +1,14 @@