Merge branch 'main' into beta-v1.10

This commit is contained in:
ZouJin 2024-02-03 14:07:14 +08:00
commit 36eae937fc
197 changed files with 11345 additions and 724 deletions

View File

@ -5,3 +5,5 @@ dotnet_diagnostic.CS1591.severity = suggestion
dotnet_diagnostic.CS1573.severity = suggestion
dotnet_diagnostic.CS1570.severity = suggestion
# CS8632: 只能在 "#nullable" 注释上下文内的代码中使用可为 null 的引用类型的注释。
dotnet_diagnostic.CS8632.severity = suggestion

View File

@ -1,4 +1,4 @@
简体中文 | [English](./CONTRIBUTING_en.md)
简体中文 | [繁體中文](./CONTRIBUTING_zht.md) | [English](./CONTRIBUTING_en.md)
## 参与开发

View File

@ -1,6 +1,6 @@
# Contributing
[简体中文](./CONTRIBUTING.md) | English
[简体中文](./CONTRIBUTING.md) | [繁體中文](./CONTRIBUTING_zht.md) | English
Welcome to participate in development! To ensure code maintainability and playability, if you wish to develop new features or gameplay, please first contact me (by sending a [mail](mailto:zoujin.dev@exlb.org) or opening an [Issue](https://github.com/LorisYounger/VPet/issues/new)) with your idea. This is to make sure your contribution fits the game, and will not get outright rejected for being unfitting (causing your effort to be wasted). You don't need to contact me regarding fixing errors or bugs - simply send a PR in that case.

89
CONTRIBUTING_zht.md Normal file
View File

@ -0,0 +1,89 @@
[简体中文](./CONTRIBUTING.md) | 繁體中文 | [English](./CONTRIBUTING_en.md)
## 參與開發
歡迎參與虛擬桌寵模擬器的開發!為了保證程式碼的可維護性及遊戲性,若想要開發新的功能,請先[電子郵件聯絡](mailto:zoujin.dev@exlb.org)或提交[Issue](https://github.com/LorisYounger/VPet/issues),標題為想要新增的功能/玩法,以確保該功能/玩法適用於虛擬桌寵模擬器,以免在您完成開發後,因不適合而被拒絕(而浪費您的時間)。<br/>
如果是修正錯誤或BUG則不需要先行聯絡修好後直接提交即可。
當您提供的想法被贊同後,您可以使用[Fork](https://github.com/LorisYounger/VPet/fork)功能將專案程式碼整個複製至個人的Github上以便撰寫自己的程式碼。撰寫完畢後使用[Pull Requests](https://github.com/LorisYounger/VPet/compare)提交。<br/>
若您的想法並未被同意,也可以另起爐灶,開發一個不同版本及功能的桌寵軟體。須遵守[Apache License 2.0](https://github.com/LorisYounger/VPet/blob/main/LICENSE)及[動畫版權聲明與授權](https://github.com/LorisYounger/VPet/blob/main/README_zht.md#%E5%8B%95%E7%95%AB%E7%89%88%E6%AC%8A%E8%81%B2%E6%98%8E%E8%88%87%E6%8E%88%E6%AC%8A)。<br/>
註:一般而言,加入新功能都可以透過撰寫模組來達成,詳情請見:[VPet.Plugin.Demo](https://github.com/LorisYounger/VPet.Plugin.Demo)
作者可能會修改、刪減部分您所提交的程式碼,以確保該功能/玩法適用於虛擬桌寵模擬器。
## 動畫版權聲明與授權
在Github中[桌寵動畫檔案](https://github.com/LorisYounger/VPet/tree/main/VPet-Simulator.Windows/mod/0000_core/pet/vup)之動畫版權歸[虛擬主播模擬器製作組](https://www.exlb.net/VUP-Simulator)所有,在使用本類別庫時,您可能會需要自行準備動畫檔,或遵循下列協定:
### 非商業用途授權
* 需要向使用者告知動畫檔案的來源,並提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 當您完成上述要求後,可以免費使用動畫檔案
### 商業用途授權低於10萬
* 在使用者第一次使用時,需跳出視窗,並醒目向使用者告知動畫檔案的來源,並提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 在對應的頁面上(使用者能快速造訪的),向使用者告知動畫檔案的來源,並提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 當您完成上述要求後,可以免費使用動畫檔案
### 商業用途授權高於10萬或其他
* 請[電子郵件聯絡](mailto:zoujin.dev@exlb.org)本軟體作者
### 轉發動畫檔案
* 需要告知上述所有授權資訊
* 需要提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 轉發動畫檔案時,禁止任何付費或收費行為
## 桌面應用程式部署方式
1. 下載本專案透過VisualStudio開啟`VPet.sln`檔案
2. 在「建置」選項中,選擇位元數`x64`及建置專案`Vpet-Simulator.Windows`
![image-20230208004330895](README.assets/image-20230208004330895.png)
3. 點擊「開始」,若一切順利將會報錯`缺少Core模組無法啟動桌寵`
4. 以管理員身分執行`mklink.bat`,這會讓模組檔案連結至產生的位置
5. 再次點擊啟動即可正常執行
## 軟體架構
* **VPet-Simulator.Windows: 適用於桌面端的虛擬桌寵模擬器**
* *Function 功能性程式碼儲存位置*
* CoreMOD 模組管理
* MWController 視窗控制器
* *WinDesign 視窗及UI設計
* winBetterBuy 更好買視窗
* winCGPTSetting ChatGPT設定
* winSetting 軟體設定、模組視窗
* winConsole 開發控制台
* winGameSetting 遊戲設定
* winReport 意見回饋中心
* MainWindows 主視窗、儲存及展示Core
* PetHelper 快速切換圖示
* **VPet-Simulator.Tool: 方便製作模組的工具(例如:產生動態圖片)**
* **VPet-Simulator.Core: 軟體核心方便內建至任何的WPF應用程式例如VUP-Simulator**
* Handle 介面及控制項
* IController 視窗控制(呼叫相關功能及設定,例如:移動到側邊等)
* Function 通用功能
* GameCore 遊戲核心,包含各種資料數據等內容
* GameSave 遊戲存檔
* IFood 食物及物品介面
* PetLoader 寵物圖片載入器
* Graph 圖形渲染
* IGraph 動畫基本介面
* GraphCore 動畫顯示核心
* GraphHelper 動畫幫助
* GraphInfo 動畫資訊
* FoodAnimation 食物動畫,支援顯示前中後三層夾心動畫,不一定只用於食物,只是叫這個名字
* PNGAnimation 桌寵動態動畫元件
* Picture 桌寵靜態動畫元件
* Display 顯示
* basestyle/Theme 基礎風格主題
* Main.xaml 核心顯示元件
* MainDisplay 核心顯示方法
* MainLogic 核心顯示邏輯
* ToolBar 點擊人物時的工具欄
* MessageBar 人物說話時的對話框
* WorkTimer 運作計時器

View File

@ -1,6 +1,6 @@
# VPet-Simulator
简体中文 | [English](./README_en.md) | [日本語](./README_ja.md)
简体中文 | [繁體中文](./README_zht.md) | [English](./README_en.md) | [日本語](./README_ja.md)
虚拟桌宠模拟器 一个开源的桌宠软件, 可以内置到任何WPF应用程序
@ -49,6 +49,8 @@
该游戏支持创意工坊,您可以制作别的人物桌宠动画或者互动,并上传至创意工坊分享给更多人使用.
MOD制作器: https://github.com/LorisYounger/VPet.ModMaker
创意工坊支持添加/修改以下内容
* 桌宠动画

View File

@ -1,6 +1,6 @@
# VPet
[简体中文](./README.md) | English | [日本語](./README_ja.md)
[简体中文](./README.md) | [繁體中文](./README_zht.md) | English | [日本語](./README_ja.md)
![Header](README.assets/%E4%B8%BB%E5%9B%BE.png)
@ -47,6 +47,8 @@ Feature requests and pull requests are welcome! You can take our code and modify
Steam Workshop mods are supported. With mods, you can add your own pets (animations/interactions), and share them with others through the Workshop.
MOD Maker: https://github.com/LorisYounger/VPet.ModMaker
The following contents can be added or modified by Workshop mods:
* Pet animations

View File

@ -1,6 +1,6 @@
# VPet
[简体中文](./README.md) | [English](./README_en.md) | 日本語
[简体中文](./README.md) | [繁體中文](./README_zht.md) | [English](./README_en.md) | 日本語
![Header](README.assets/%E4%B8%BB%E5%9B%BE.png)
@ -47,6 +47,8 @@ VPet を [Steam で](https://store.steampowered.com/app/1920960/VPet)無料で
Steam Workshop の MOD に対応しています。MOD を使用すると、独自のペット(アニメーション/インタラクションを追加したり、Workshop を通じて他の人と共有したりすることができます。
MOD プロデューサ: https://github.com/LorisYounger/VPet.ModMaker
以下のコンテンツは、Workshop の MOD によって追加または変更することができます:
* ペットアニメーション

167
README_zht.md Normal file
View File

@ -0,0 +1,167 @@
# VPet-Simulator
简体中文(./README.md) | 繁體中文 | [English](./README_en.md) | [日本語](./README_ja.md)
《虛擬桌寵模擬器》一個開源的桌寵軟體可以內建至任何WPF應用程式中。
![主圖](README.assets/%E4%B8%BB%E5%9B%BE.png)
在[Steam](https://store.steampowered.com/app/1920960/VPet)上取得虛擬桌寵模擬器(免費),或透過[Nuget](https://www.nuget.org/packages/VPet-Simulator.Core)內建至應用程式中。
## 虛擬桌寵模擬器 - 詳細介紹
虛擬桌寵模擬器是一款桌寵軟體,支援各種互動,例如投餵等。開源、並支援工作坊。
既然都是免費的,那為何不試試呢?
本遊戲從[虛擬主播模擬器](https://store.steampowered.com/app/1352140/_/)之桌寵功能獨立出來,如果喜歡,歡迎將[虛擬主播模擬器](https://store.steampowered.com/app/1352140/_/)加入至您的願望清單中。
### 超多的互動及動畫
多達32種類×4狀態×3類型種動畫。<br/>
*註:部分種類並未有生病或循環等內容,實際上會略低於此數值。*
#### 動畫範例:
##### 摸頭
![ss0](README.assets/ss0.gif)
##### 提起
![ss4](README.assets/ss4.gif)![ss4](README.assets/ss8.gif)
##### 爬牆
![ss7](README.assets/ss7.gif)
### 免費
本遊戲完全免費!既然都不用錢,那就試試看吧!<br/>
本遊戲主要目的為宣傳[虛擬主播模擬器](https://store.steampowered.com/app/1352140/_/)中的Q版人物主角。
### 開源
本遊戲於Github上開源歡迎提出自己的想法、創意或直接參與開發<br/>
您還可以修改原始碼來製作自己專屬的桌寵!(雖然說大部分內容支援工作坊,毋須修改程式碼)<br/>
專案位置https://github.com/LorisYounger/VPet
### 支援工作坊
本遊戲支援工作坊,您可以自行製作桌寵角色、動畫或互動內容,並上傳至工作坊中分享給更多人使用。
模組製作器https://github.com/LorisYounger/VPet.ModMaker
工作坊支援加入/修改下列內容
* 桌寵動畫
* 物品/食品/飲料等
* 自訂桌寵工作內容
* 對話內容
* 主題
* 程式碼外掛:編撰程式碼來加入新內容
* 加入新的動畫邏輯或顯示效果例如l2d/spine等
* 加入新功能(鬧鐘、記事本等)
* 幾乎無所不能,範例請見[VPet.Plugin.Demo](https://github.com/LorisYounger/VPet.Plugin.Demo)
###聯絡我們
若有建議或意見可以在Steam商店、Steam社群中評論在Github發Issue使用虛擬桌寵模擬器QQ群907101442或電子郵件[mailto:service@exlb.net](mailto:service@exlb.net)聯絡作者。
## 軟體架構
* **VPet-Simulator.Windows: 適用於桌面端的虛擬桌寵模擬器**
* *Function 功能性程式碼儲存位置*
* CoreMOD 模組管理
* MWController 視窗控制器
* *WinDesign 視窗及UI設計
* winBetterBuy 更好買視窗
* winCGPTSetting ChatGPT設定
* winSetting 軟體設定、模組視窗
* winConsole 開發控制台
* winGameSetting 遊戲設定
* winReport 意見回饋中心
* MainWindows 主視窗、儲存及展示Core
* PetHelper 快速切換圖示
* **VPet-Simulator.Tool: 方便製作模組的工具(例如:產生動態圖片)**
* **VPet-Simulator.Core: 軟體核心方便內建至任何的WPF應用程式例如VUP-Simulator**
* Handle 介面及控制項
* IController 視窗控制(呼叫相關功能及設定,例如:移動到側邊等)
* Function 通用功能
* GameCore 遊戲核心,包含各種資料數據等內容
* GameSave 遊戲存檔
* IFood 食物及物品介面
* PetLoader 寵物圖片載入器
* Graph 圖形渲染
* IGraph 動畫基本介面
* GraphCore 動畫顯示核心
* GraphHelper 動畫幫助
* GraphInfo 動畫資訊
* FoodAnimation 食物動畫,支援顯示前中後三層夾心動畫,不一定只用於食物,只是叫這個名字
* PNGAnimation 桌寵動態動畫元件
* Picture 桌寵靜態動畫元件
* Display 顯示
* basestyle/Theme 基礎風格主題
* Main.xaml 核心顯示元件
* MainDisplay 核心顯示方法
* MainLogic 核心顯示邏輯
* ToolBar 點擊人物時的工具欄
* MessageBar 人物說話時的對話框
* WorkTimer 運作計時器
## 參與開發
歡迎參與虛擬桌寵模擬器的開發!為了保證程式碼的可維護性及遊戲性,若想要開發新的功能,請先[電子郵件聯絡](mailto:zoujin.dev@exlb.org)或提交[Issue](https://github.com/LorisYounger/VPet/issues),標題為想要新增的功能/玩法,以確保該功能/玩法適用於虛擬桌寵模擬器,以免在您完成開發後,因不適合而被拒絕(而浪費您的時間)。<br/>
如果是修正錯誤或BUG則不需要先行聯絡修好後直接提交即可。
當您提供的想法被贊同後,您可以使用[Fork](https://github.com/LorisYounger/VPet/fork)功能將專案程式碼整個複製至個人的Github上以便撰寫自己的程式碼。撰寫完畢後使用[Pull Requests](https://github.com/LorisYounger/VPet/compare)提交。<br/>
若您的想法並未被同意,也可以另起爐灶,開發一個不同版本及功能的桌寵軟體。須遵守[Apache License 2.0](https://github.com/LorisYounger/VPet/blob/main/LICENSE)及[動畫版權聲明與授權](https://github.com/LorisYounger/VPet/blob/main/README_zht.md#%E5%8B%95%E7%95%AB%E7%89%88%E6%AC%8A%E8%81%B2%E6%98%8E%E8%88%87%E6%8E%88%E6%AC%8A)。<br/>
註:一般而言,加入新功能都可以透過撰寫模組來達成,詳情請見:[VPet.Plugin.Demo](https://github.com/LorisYounger/VPet.Plugin.Demo)
作者可能會修改、刪減部分您所提交的程式碼,以確保該功能/玩法適用於虛擬桌寵模擬器。
感謝下列參與的開發及翻譯人員
<a href="https://github.com/LorisYounger/VPet/graphs/contributors">
<img src="https://contrib.rocks/image?repo=LorisYounger/VPet" />
</a>
以及提供社群翻譯與更多內容的工作坊作者
## 動畫版權聲明與授權
在Github中[桌寵動畫檔案](https://github.com/LorisYounger/VPet/tree/main/VPet-Simulator.Windows/mod/0000_core/pet/vup)之動畫版權歸[虛擬主播模擬器製作組](https://www.exlb.net/VUP-Simulator)所有,在使用本類別庫時,您可能會需要自行準備動畫檔,或遵循下列協定:</br>
*註:本聲明只限於桌寵自帶的動畫,其餘經工作坊等方式額外加入的內容並不適用*
### 非商業用途授權
* 需要向使用者告知動畫檔案的來源,並提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 當您完成上述要求後,可以免費使用動畫檔案
### 商業用途授權低於10萬
* 在使用者第一次使用時,需跳出視窗,並醒目向使用者告知動畫檔案的來源,並提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 在對應的頁面上(使用者能快速造訪的),向使用者告知動畫檔案的來源,並提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 不得透過出售動畫檔案營利
* 請[電子郵件聯絡](mailto:zoujin.dev@exlb.org)本軟體作者
* 當您完成上述要求後,可以免費使用動畫檔案
### 轉發動畫檔案
* 需要告知上述所有授權資訊
* 需要提供造訪[本頁面](https://github.com/LorisYounger/VPet)的連結
* 轉發動畫檔案時,禁止任何付費或收費行為
## 桌面應用程式部署方式
1. 下載本專案透過VisualStudio開啟`VPet.sln`檔案
2. 在「建置」選項中,選擇位元數`x64`及建置專案`Vpet-Simulator.Windows`
![image-20230208004330895](README.assets/image-20230208004330895.png)
3. 點擊「開始」,若一切順利將會報錯`缺少Core模組無法啟動桌寵`
4. 以管理員身分執行`mklink.bat`,這會讓模組檔案連結至產生的位置
5. 再次點擊啟動即可正常執行

View File

@ -1,4 +1,5 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="https://opensource.panuon.com/wpf-ui"
xmlns:pucore="clr-namespace:Panuon.WPF;assembly=Panuon.WPF">

View File

@ -1,4 +1,5 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="https://opensource.panuon.com/wpf-ui"
xmlns:pucore="clr-namespace:Panuon.WPF;assembly=Panuon.WPF">
@ -6,8 +7,12 @@
<pucore:SharedResourceDictionary Source="/Panuon.WPF.UI;component/Control.xaml" />
</ResourceDictionary.MergedDictionaries>
<DrawingBrush x:Key="ProgressBarForeground" Viewport="0,0,8,22" ViewportUnits="Absolute" Stretch="None"
TileMode="Tile">
<DrawingBrush
x:Key="ProgressBarForeground"
Stretch="None"
TileMode="Tile"
Viewport="0,0,8,22"
ViewportUnits="Absolute">
<DrawingBrush.RelativeTransform>
<RotateTransform Angle="2" />
</DrawingBrush.RelativeTransform>
@ -30,8 +35,12 @@
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
<DrawingBrush x:Key="SuccessProgressBarForeground" Viewport="0,0,8,22" ViewportUnits="Absolute" Stretch="None"
TileMode="Tile">
<DrawingBrush
x:Key="SuccessProgressBarForeground"
Stretch="None"
TileMode="Tile"
Viewport="0,0,8,22"
ViewportUnits="Absolute">
<DrawingBrush.RelativeTransform>
<RotateTransform Angle="2" />
</DrawingBrush.RelativeTransform>
@ -54,8 +63,12 @@
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
<DrawingBrush x:Key="WarningProgressBarForeground" Viewport="0,0,8,22" ViewportUnits="Absolute" Stretch="None"
TileMode="Tile">
<DrawingBrush
x:Key="WarningProgressBarForeground"
Stretch="None"
TileMode="Tile"
Viewport="0,0,8,22"
ViewportUnits="Absolute">
<DrawingBrush.RelativeTransform>
<RotateTransform Angle="2" />
</DrawingBrush.RelativeTransform>
@ -78,8 +91,12 @@
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
<DrawingBrush x:Key="DangerProgressBarForeground" Viewport="0,0,8,22" ViewportUnits="Absolute" Stretch="None"
TileMode="Tile">
<DrawingBrush
x:Key="DangerProgressBarForeground"
Stretch="None"
TileMode="Tile"
Viewport="0,0,8,22"
ViewportUnits="Absolute">
<DrawingBrush.RelativeTransform>
<RotateTransform Angle="2" />
</DrawingBrush.RelativeTransform>
@ -109,21 +126,27 @@
<Setter Property="pu:WindowXCaption.Buttons" Value="Close" />
<Setter Property="pu:WindowXCaption.CloseButtonStyle">
<Setter.Value>
<Style TargetType="Button" BasedOn="{StaticResource {x:Static pu:WindowXCaption.CloseButtonStyleKey}}">
<Style BasedOn="{StaticResource {x:Static pu:WindowXCaption.CloseButtonStyleKey}}" TargetType="Button">
<Setter Property="pu:ButtonHelper.HoverBackground" Value="{x:Null}" />
</Style>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="ThemedButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Style
x:Key="ThemedButtonStyle"
BasedOn="{StaticResource {x:Type Button}}"
TargetType="{x:Type Button}">
<Setter Property="Background" Value="{DynamicResource DARKPrimary}" />
<Setter Property="Foreground" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="Padding" Value="10,5" />
<Setter Property="pu:ButtonHelper.CornerRadius" Value="5" />
</Style>
<Style x:Key="TextButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
<Style
x:Key="TextButtonStyle"
BasedOn="{StaticResource {x:Type Button}}"
TargetType="{x:Type Button}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryDarker}" />
<Setter Property="Cursor" Value="Hand" />
@ -131,11 +154,17 @@
<Setter Property="FontSize" Value="12" />
</Style>
<Style x:Key="DARKPrimaryTextButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource TextButtonStyle}">
<Style
x:Key="DARKPrimaryTextButtonStyle"
BasedOn="{StaticResource TextButtonStyle}"
TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="{DynamicResource DARKPrimaryText}" />
</Style>
<Style x:Key="IconInvertedForegroundRepeatButtonStyle" TargetType="{x:Type RepeatButton}" BasedOn="{StaticResource {x:Type RepeatButton}}">
<Style
x:Key="IconInvertedForegroundRepeatButtonStyle"
BasedOn="{StaticResource {x:Type RepeatButton}}"
TargetType="{x:Type RepeatButton}">
<Setter Property="Width" Value="25" />
<Setter Property="Height" Value="25" />
<Setter Property="Background" Value="Transparent" />
@ -146,18 +175,23 @@
<Setter Property="FontFamily" Value="pack://application:,,,/Res/#remixicon" />
</Style>
<Style x:Key="LinkButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource TextButtonStyle}">
<Style
x:Key="LinkButtonStyle"
BasedOn="{StaticResource TextButtonStyle}"
TargetType="{x:Type Button}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{Binding}"
TextDecorations="Underline" />
<TextBlock Text="{Binding}" TextDecorations="Underline" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="StndardToggleButtonStyle" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}">
<Style
x:Key="StndardToggleButtonStyle"
BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type ToggleButton}">
<Setter Property="Background" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ToggleButtonHelper.CheckedBackground" Value="{DynamicResource DARKPrimaryDarker}" />
<Setter Property="Foreground" Value="{DynamicResource DARKPrimaryText}" />
@ -165,7 +199,10 @@
<Setter Property="pu:ButtonHelper.CornerRadius" Value="5" />
</Style>
<Style x:Key="TextToggleButtonStyle" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource {x:Type ToggleButton}}">
<Style
x:Key="TextToggleButtonStyle"
BasedOn="{StaticResource {x:Type ToggleButton}}"
TargetType="{x:Type ToggleButton}">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryDarker}" />
<Setter Property="Cursor" Value="Hand" />
@ -173,7 +210,10 @@
<Setter Property="FontSize" Value="14" />
</Style>
<Style x:Key="LinkToggleButtonStyle" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource TextToggleButtonStyle}">
<Style
x:Key="LinkToggleButtonStyle"
BasedOn="{StaticResource TextToggleButtonStyle}"
TargetType="{x:Type ToggleButton}">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
@ -185,13 +225,18 @@
<Style x:Key="StandardPaginationStyle" TargetType="{x:Type pu:Pagination}">
<Setter Property="Height" Value="25" />
<Setter Property="ItemsWidth" Value="NaN" />
<Setter Property="ItemsPadding" Value="7,0" />
<Setter Property="ItemsBackground" Value="{DynamicResource DARKPrimaryTrans4}" />
<Setter Property="ItemsSelectedForeground" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="ItemsSelectedBackground" Value="{DynamicResource DARKPrimary}" />
<Setter Property="ItemsCornerRadius" Value="2" />
</Style>
<Style x:Key="StandardComboBoxStyle" TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
<Style
x:Key="StandardComboBoxStyle"
BasedOn="{StaticResource {x:Type ComboBox}}"
TargetType="{x:Type ComboBox}">
<Setter Property="FontSize" Value="14" />
<Setter Property="Height" Value="30" />
<Setter Property="Background" Value="{DynamicResource DARKPrimaryText}" />
@ -215,8 +260,7 @@
<Setter Property="pu:ShadowHelper.Opacity" Value="0.5" />
<Setter Property="pu:ComboBoxHelper.ToggleArrowTransformControlStyle">
<Setter.Value>
<Style TargetType="pu:TransformControl"
BasedOn="{StaticResource {x:Static pu:ComboBoxHelper.ToggleArrowTransformControlStyleKey}}">
<Style BasedOn="{StaticResource {x:Static pu:ComboBoxHelper.ToggleArrowTransformControlStyleKey}}" TargetType="pu:TransformControl">
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}" />
<Setter Property="FontSize" Value="10" />
<Setter Property="Content" Value="&#xe91f;" />
@ -224,7 +268,10 @@
</Setter.Value>
</Setter>
</Style>
<Style x:Key="StandardTextBoxStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
<Style
x:Key="StandardTextBoxStyle"
BasedOn="{StaticResource {x:Type TextBox}}"
TargetType="TextBox">
<Setter Property="FontSize" Value="14" />
<Setter Property="Height" Value="30" />
<Setter Property="Background" Value="{DynamicResource DARKPrimaryText}" />
@ -236,7 +283,10 @@
<Setter Property="pu:ShadowHelper.BlurRadius" Value="15" />
<Setter Property="pu:ShadowHelper.Opacity" Value="0.5" />
</Style>
<Style x:Key="StandardSliderStyle" TargetType="Slider" BasedOn="{StaticResource {x:Type Slider}}">
<Style
x:Key="StandardSliderStyle"
BasedOn="{StaticResource {x:Type Slider}}"
TargetType="Slider">
<Setter Property="Background" Value="{DynamicResource DARKPrimaryTrans4}" />
<Setter Property="Foreground" Value="{DynamicResource DARKPrimaryDark}" />
<Setter Property="pu:SliderHelper.ThumbShadowColor" Value="{DynamicResource ShadowColor}" />
@ -249,12 +299,18 @@
<Setter Property="pu:ShadowHelper.Opacity" Value="0.5" />
</Style>
<Style x:Key="StandardRadioButtonStyle" TargetType="RadioButton" BasedOn="{StaticResource {x:Type RadioButton}}">
<Style
x:Key="StandardRadioButtonStyle"
BasedOn="{StaticResource {x:Type RadioButton}}"
TargetType="RadioButton">
<Setter Property="pu:RadioButtonHelper.CheckedToggleBrush" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:RadioButtonHelper.CheckedBorderBrush" Value="{DynamicResource DARKPrimary}" />
</Style>
<Style x:Key="SideMenuListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource {x:Type ListBox}}">
<Style
x:Key="SideMenuListBoxStyle"
BasedOn="{StaticResource {x:Type ListBox}}"
TargetType="ListBox">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="pu:ListBoxHelper.ItemsHeight" Value="30" />
@ -265,7 +321,10 @@
<Setter Property="pu:ListBoxHelper.ItemsSelectedForeground" Value="{DynamicResource DARKPrimaryText}" />
</Style>
<Style x:Key="ToolBarMenuStyle" TargetType="Menu" BasedOn="{StaticResource {x:Type Menu}}">
<Style
x:Key="ToolBarMenuStyle"
BasedOn="{StaticResource {x:Type Menu}}"
TargetType="Menu">
<Setter Property="Height" Value="55" />
<Setter Property="FontSize" Value="24" />
<Setter Property="VerticalContentAlignment" Value="Center" />

View File

@ -5,7 +5,7 @@ using System.Windows.Media;
namespace VPet_Simulator.Core
{
public static class Function
public static partial class Function
{
public static Random Rnd = new Random();
/// <summary>

View File

@ -23,10 +23,10 @@
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="LinePutScript" Version="1.9.2" />
<PackageReference Include="LinePutScript" Version="1.10.2" />
<PackageReference Include="LinePutScript.Localization.WPF" Version="1.0.6" />
<PackageReference Include="Panuon.WPF" Version="1.0.2" />
<PackageReference Include="Panuon.WPF.UI" Version="1.1.15.8" />
<PackageReference Include="Panuon.WPF" Version="1.0.3" />
<PackageReference Include="Panuon.WPF.UI" Version="1.1.16.8" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">

View File

@ -8,6 +8,7 @@
<FileVersion>1.0.0.0</FileVersion>
<Product>VPet-Simulator.Tool</Product>
<Copyright>Copyright © 2022</Copyright>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">

View File

@ -99,7 +99,7 @@ namespace VPet_Simulator.Windows.Interface
}
}
public static class ExtensionValue
public static partial class ExtensionValue
{
/// <summary>
/// 当前运行目录

View File

@ -1,9 +1,12 @@
using LinePutScript;
using LinePutScript.Dictionary;
using LinePutScript.Localization.WPF;
using Panuon.WPF.UI;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
@ -55,9 +58,28 @@ namespace VPet_Simulator.Windows.Interface
if (nohashcheck)
{
hash = lps.GetInt64("hash");
int ver = lps["hash"].GetInt("ver");
if (lps.Remove("hash"))
{
if (ver == 2)
HashCheck = Sub.GetHashCode(lps.ToString()) == hash;
else
{
try
{
using (MD5 md5 = MD5.Create())
{
HashCheck = BitConverter.ToInt64(md5.ComputeHash(Encoding.UTF8.GetBytes(lps.ToString())), 0) == hash;
}
if (!HashCheck)
HashCheck = Sub.GetHashCode(lps.ToString()) == hash;
}
catch (Exception e)
{
HashCheck = false;
MessageBoxX.Show(e.ToString(), "当前存档Hash验证信息".Translate() + ":" + "失败".Translate());
}
}
}
}
@ -109,16 +131,23 @@ namespace VPet_Simulator.Windows.Interface
if (HashCheck)
{
lps[(gi64)"hash"] = Sub.GetHashCode(lps.ToString());
lps["hash"][(gint)"ver"] = 2;
}
else
{
lps[(gint)"hash"] = -1;
lps["hash"][(gint)"ver"] = 2;
}
return lps;
}
/// <summary>
/// Hash检查
/// </summary>
public bool HashCheck { get; private set; } = true;
FInt64 IGetOBJ<ILine>.this[gflt subName] { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
/// <summary>
@ -132,7 +161,7 @@ namespace VPet_Simulator.Windows.Interface
#region GETOBJ
public DateTime this[gdat subName] { get => Data[subName]; set => Data[subName] = value; }
public double this[gflt subName] { get => Data[subName]; set => Data[subName] = value; }
public FInt64 this[gflt subName] { get => Data[subName]; set => Data[subName] = value; }
public double this[gdbe subName] { get => Data[subName]; set => Data[subName] = value; }
public long this[gi64 subName] { get => Data[subName]; set => Data[subName] = value; }
public int this[gint subName] { get => Data[subName]; set => Data[subName] = value; }
@ -170,12 +199,12 @@ namespace VPet_Simulator.Windows.Interface
Data.SetInt64(subName, value);
}
public double GetFloat(string subName, double defaultvalue = 0)
public FInt64 GetFloat(string subName, FInt64 defaultvalue = default)
{
return Data.GetFloat(subName, defaultvalue);
}
public void SetFloat(string subName, double value)
public void SetFloat(string subName, FInt64 value)
{
Data.SetFloat(subName, value);
}

View File

@ -50,13 +50,9 @@ namespace VPet_Simulator.Windows.Interface
/// </summary>
Drug,
/// <summary>
/// 礼品 (没做)
/// 礼品
/// </summary>
Gift,
///// <summary>
///// 限定食物优先显示
///// </summary>
//Limit,
}
/// <summary>
/// 食物类型
@ -107,7 +103,6 @@ namespace VPet_Simulator.Windows.Interface
/// </summary>
[Line(ignoreCase: true)]
public string Desc { get; set; }
private string desc = null;
private string descs = null;
/// <summary>
/// 描述(ToBetterBuy)

View File

@ -1,4 +1,5 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:pu="clr-namespace:Panuon.WPF.UI;assembly=Panuon.WPF.UI"
xmlns:pucore="clr-namespace:Panuon.WPF;assembly=Panuon.WPF">
@ -8,205 +9,131 @@
</ResourceDictionary.MergedDictionaries>
<Style x:Key="BaseWindowXStyle"
TargetType="pu:WindowX">
<Setter Property="pu:WindowXCaption.Background"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:WindowXCaption.Foreground"
Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:WindowXCaption.Buttons"
Value="Close" />
<Style x:Key="BaseWindowXStyle" TargetType="pu:WindowX">
<Setter Property="pu:WindowXCaption.Background" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:WindowXCaption.Foreground" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:WindowXCaption.Buttons" Value="Close" />
<Setter Property="pu:WindowXCaption.CloseButtonStyle">
<Setter.Value>
<Style TargetType="Button"
BasedOn="{StaticResource {x:Static pu:WindowXCaption.CloseButtonStyleKey}}">
<Setter Property="pu:ButtonHelper.HoverBackground"
Value="{x:Null}" />
<Style BasedOn="{StaticResource {x:Static pu:WindowXCaption.CloseButtonStyleKey}}" TargetType="Button">
<Setter Property="pu:ButtonHelper.HoverBackground" Value="{x:Null}" />
</Style>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="StandardComboBoxStyle"
TargetType="{x:Type ComboBox}"
BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="FontSize"
Value="14" />
<Setter Property="Height"
Value="30" />
<Setter Property="Background"
Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="BorderThickness"
Value="1.5" />
<Setter Property="BorderBrush"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="Padding"
Value="7,0,15,0" />
<Setter Property="pu:ComboBoxHelper.CornerRadius"
Value="5" />
<Setter Property="pu:ComboBoxHelper.WatermarkForeground"
Value="#DCDCDC" />
<Setter Property="pu:ComboBoxHelper.ItemsSelectedBackground"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ComboBoxHelper.ItemsSelectedForeground"
Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:ComboBoxHelper.ItemsHoverBackground"
Value="{DynamicResource DARKPrimaryTrans4}" />
<Setter Property="pu:ComboBoxHelper.ItemsPadding"
Value="22,0" />
<Setter Property="pu:DropDownHelper.BorderThickness"
Value="1" />
<Setter Property="pu:DropDownHelper.Background"
Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:DropDownHelper.ShadowColor"
Value="{DynamicResource ShadowColor}" />
<Setter Property="pu:DropDownHelper.CornerRadius"
Value="5" />
<Setter Property="pu:DropDownHelper.MinHeight"
Value="100" />
<Setter Property="pu:DropDownHelper.ClipDockSideShadow"
Value="False" />
<Setter Property="pu:DropDownHelper.BorderBrush"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ShadowHelper.BlurRadius"
Value="15" />
<Setter Property="pu:ShadowHelper.Opacity"
Value="0.5" />
<Style
x:Key="StandardComboBoxStyle"
BasedOn="{StaticResource {x:Type ComboBox}}"
TargetType="{x:Type ComboBox}">
<Setter Property="FontSize" Value="14" />
<Setter Property="Height" Value="30" />
<Setter Property="Background" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="BorderThickness" Value="1.5" />
<Setter Property="BorderBrush" Value="{DynamicResource DARKPrimary}" />
<Setter Property="Padding" Value="7,0,15,0" />
<Setter Property="pu:ComboBoxHelper.CornerRadius" Value="5" />
<Setter Property="pu:ComboBoxHelper.WatermarkForeground" Value="#DCDCDC" />
<Setter Property="pu:ComboBoxHelper.ItemsSelectedBackground" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ComboBoxHelper.ItemsSelectedForeground" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:ComboBoxHelper.ItemsHoverBackground" Value="{DynamicResource DARKPrimaryTrans4}" />
<Setter Property="pu:ComboBoxHelper.ItemsPadding" Value="22,0" />
<Setter Property="pu:DropDownHelper.BorderThickness" Value="1" />
<Setter Property="pu:DropDownHelper.Background" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:DropDownHelper.ShadowColor" Value="{DynamicResource ShadowColor}" />
<Setter Property="pu:DropDownHelper.CornerRadius" Value="5" />
<Setter Property="pu:DropDownHelper.MinHeight" Value="100" />
<Setter Property="pu:DropDownHelper.ClipDockSideShadow" Value="False" />
<Setter Property="pu:DropDownHelper.BorderBrush" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ShadowHelper.BlurRadius" Value="15" />
<Setter Property="pu:ShadowHelper.Opacity" Value="0.5" />
<Setter Property="pu:ComboBoxHelper.ToggleArrowTransformControlStyle">
<Setter.Value>
<Style TargetType="pu:TransformControl"
BasedOn="{StaticResource {x:Static pu:ComboBoxHelper.ToggleArrowTransformControlStyleKey}}">
<Setter Property="Foreground"
Value="{DynamicResource PrimaryText}" />
<Setter Property="FontSize"
Value="10" />
<Setter Property="Content"
Value="&#xe91f;" />
<Style BasedOn="{StaticResource {x:Static pu:ComboBoxHelper.ToggleArrowTransformControlStyleKey}}" TargetType="pu:TransformControl">
<Setter Property="Foreground" Value="{DynamicResource PrimaryText}" />
<Setter Property="FontSize" Value="10" />
<Setter Property="Content" Value="&#xe91f;" />
</Style>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="StandardSliderStyle"
TargetType="Slider"
BasedOn="{StaticResource {x:Type Slider}}">
<Setter Property="Background"
Value="{DynamicResource DARKPrimaryTrans4}" />
<Setter Property="Foreground"
Value="{DynamicResource DARKPrimaryDark}" />
<Setter Property="pu:SliderHelper.ThumbShadowColor"
Value="{DynamicResource ShadowColor}" />
<Setter Property="pu:SliderHelper.TrackThickness"
Value="2.5" />
<Setter Property="pu:SliderHelper.ThumbBorderBrush"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:SliderHelper.ThumbBorderThickness"
Value="2.5" />
<Setter Property="pu:SliderHelper.CoveredBackground"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ShadowHelper.ShadowDepth"
Value="3" />
<Setter Property="pu:ShadowHelper.Direction"
Value="270" />
<Setter Property="pu:ShadowHelper.Opacity"
Value="0.5" />
<Style
x:Key="StandardSliderStyle"
BasedOn="{StaticResource {x:Type Slider}}"
TargetType="Slider">
<Setter Property="Background" Value="{DynamicResource DARKPrimaryTrans4}" />
<Setter Property="Foreground" Value="{DynamicResource DARKPrimaryDark}" />
<Setter Property="pu:SliderHelper.ThumbShadowColor" Value="{DynamicResource ShadowColor}" />
<Setter Property="pu:SliderHelper.TrackThickness" Value="2.5" />
<Setter Property="pu:SliderHelper.ThumbBorderBrush" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:SliderHelper.ThumbBorderThickness" Value="2.5" />
<Setter Property="pu:SliderHelper.CoveredBackground" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ShadowHelper.ShadowDepth" Value="3" />
<Setter Property="pu:ShadowHelper.Direction" Value="270" />
<Setter Property="pu:ShadowHelper.Opacity" Value="0.5" />
</Style>
<Style x:Key="StandardRadioButtonStyle"
TargetType="RadioButton"
BasedOn="{StaticResource {x:Type RadioButton}}">
<Setter Property="pu:RadioButtonHelper.CheckedToggleBrush"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:RadioButtonHelper.CheckedBorderBrush"
Value="{DynamicResource DARKPrimary}" />
<Style
x:Key="StandardRadioButtonStyle"
BasedOn="{StaticResource {x:Type RadioButton}}"
TargetType="RadioButton">
<Setter Property="pu:RadioButtonHelper.CheckedToggleBrush" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:RadioButtonHelper.CheckedBorderBrush" Value="{DynamicResource DARKPrimary}" />
</Style>
<Style x:Key="SideMenuListBoxStyle"
TargetType="ListBox"
BasedOn="{StaticResource {x:Type ListBox}}">
<Setter Property="BorderThickness"
Value="0" />
<Setter Property="Background"
Value="Transparent" />
<Setter Property="pu:ListBoxHelper.ItemsHeight"
Value="30" />
<Setter Property="pu:ListBoxHelper.ItemsPadding"
Value="15,0" />
<Setter Property="pu:ListBoxHelper.ItemsCornerRadius"
Value="5" />
<Setter Property="pu:ListBoxHelper.ItemsHoverBackground"
Value="{x:Null}" />
<Setter Property="pu:ListBoxHelper.ItemsSelectedBackground"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ListBoxHelper.ItemsSelectedForeground"
Value="{DynamicResource DARKPrimaryText}" />
<Style
x:Key="SideMenuListBoxStyle"
BasedOn="{StaticResource {x:Type ListBox}}"
TargetType="ListBox">
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="pu:ListBoxHelper.ItemsHeight" Value="30" />
<Setter Property="pu:ListBoxHelper.ItemsPadding" Value="15,0" />
<Setter Property="pu:ListBoxHelper.ItemsCornerRadius" Value="5" />
<Setter Property="pu:ListBoxHelper.ItemsHoverBackground" Value="{x:Null}" />
<Setter Property="pu:ListBoxHelper.ItemsSelectedBackground" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:ListBoxHelper.ItemsSelectedForeground" Value="{DynamicResource DARKPrimaryText}" />
</Style>
<Style x:Key="ToolBarMenuStyle"
TargetType="Menu"
BasedOn="{StaticResource {x:Type Menu}}">
<Setter Property="Height"
Value="55" />
<Setter Property="FontSize"
Value="24" />
<Setter Property="VerticalContentAlignment"
Value="Center" />
<Setter Property="pu:MenuHelper.TopLevelDropDownVerticalOffset"
Value="-25" />
<Setter Property="BorderBrush"
Value="{DynamicResource DARKPrimaryDarker}" />
<Setter Property="Background"
Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:MenuHelper.CornerRadius"
Value="5" />
<Setter Property="pu:MenuHelper.TopLevelDropDownPlacement"
Value="TopRight" />
<Setter Property="pu:MenuHelper.TopLevelItemsPadding"
Value="15,0" />
<Setter Property="pu:MenuHelper.TopLevelItemsBackground"
Value="Transparent" />
<Setter Property="pu:MenuHelper.TopLevelItemsHoverBackground"
Value="{DynamicResource SecondaryLighter}" />
<Setter Property="pu:MenuHelper.TopLevelItemsHoverForeground"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:MenuHelper.TopLevelItemsOpenedBackground"
Value="{DynamicResource SecondaryLighter}" />
<Setter Property="pu:MenuHelper.TopLevelItemsOpenedForeground"
Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:MenuHelper.SubmenuItemsPadding"
Value="15,0" />
<Setter Property="pu:MenuHelper.SubmenuItemsHeight"
Value="55" />
<Setter Property="pu:MenuHelper.SubmenuItemsIconWidth"
Value="NaN" />
<Setter Property="pu:MenuHelper.SubmenuItemsWidth"
Value="200" />
<Setter Property="pu:DropDownHelper.CornerRadius"
Value="5" />
<Setter Property="pu:MenuHelper.SubmenuItemsBackground"
Value="Transparent" />
<Setter Property="pu:MenuHelper.SubmenuItemsHoverBackground"
Value="{DynamicResource SecondaryLighter}" />
<Style
x:Key="ToolBarMenuStyle"
BasedOn="{StaticResource {x:Type Menu}}"
TargetType="Menu">
<Setter Property="Height" Value="55" />
<Setter Property="FontSize" Value="24" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="pu:MenuHelper.TopLevelDropDownVerticalOffset" Value="-25" />
<Setter Property="BorderBrush" Value="{DynamicResource DARKPrimaryDarker}" />
<Setter Property="Background" Value="{DynamicResource DARKPrimaryText}" />
<Setter Property="pu:MenuHelper.CornerRadius" Value="5" />
<Setter Property="pu:MenuHelper.TopLevelDropDownPlacement" Value="TopRight" />
<Setter Property="pu:MenuHelper.TopLevelItemsPadding" Value="15,0" />
<Setter Property="pu:MenuHelper.TopLevelItemsBackground" Value="Transparent" />
<Setter Property="pu:MenuHelper.TopLevelItemsHoverBackground" Value="{DynamicResource SecondaryLighter}" />
<Setter Property="pu:MenuHelper.TopLevelItemsHoverForeground" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:MenuHelper.TopLevelItemsOpenedBackground" Value="{DynamicResource SecondaryLighter}" />
<Setter Property="pu:MenuHelper.TopLevelItemsOpenedForeground" Value="{DynamicResource DARKPrimary}" />
<Setter Property="pu:MenuHelper.SubmenuItemsPadding" Value="15,0" />
<Setter Property="pu:MenuHelper.SubmenuItemsHeight" Value="55" />
<Setter Property="pu:MenuHelper.SubmenuItemsIconWidth" Value="NaN" />
<Setter Property="pu:MenuHelper.SubmenuItemsWidth" Value="200" />
<Setter Property="pu:DropDownHelper.CornerRadius" Value="5" />
<Setter Property="pu:MenuHelper.SubmenuItemsBackground" Value="Transparent" />
<Setter Property="pu:MenuHelper.SubmenuItemsHoverBackground" Value="{DynamicResource SecondaryLighter}" />
<!--<Setter Property="pu:MenuHelper.SubmenuItemsHoverForeground"
Value="{DynamicResource DARKPrimary}" />-->
<Setter Property="pu:MenuHelper.SubmenuItemsOpenedBackground"
Value="{DynamicResource SecondaryLighter}" />
<Setter Property="pu:MenuHelper.SubmenuItemsOpenedBackground" Value="{DynamicResource SecondaryLighter}" />
<!--<Setter Property="pu:MenuHelper.SubmenuItemsOpenedForeground"
Value="{DynamicResource DARKPrimary}" />-->
<Setter Property="pu:MenuHelper.SubmenuItemsSeparatorVisibility"
Value="Visible" />
<Setter Property="pu:MenuHelper.SubmenuItemsSeparatorBrush"
Value="#CCCECF" />
<Setter Property="pu:MenuHelper.SubmenuItemsSeparatorMargin"
Value="10,0" />
<Setter Property="pu:MenuHelper.SubmenuItemsSeparatorVisibility" Value="Visible" />
<Setter Property="pu:MenuHelper.SubmenuItemsSeparatorBrush" Value="#CCCECF" />
<Setter Property="pu:MenuHelper.SubmenuItemsSeparatorMargin" Value="10,0" />
<!--<Setter Property="pu:MenuHelper.ShadowColor"
Value="{DynamicResource ShadowColor}" />-->
<Setter Property="pu:DropDownHelper.ShadowColor"
Value="{DynamicResource ShadowColor}" />
<Setter Property="pu:ShadowHelper.Opacity"
Value="0.7" />
<Setter Property="pu:ShadowHelper.BlurRadius"
Value="25" />
<Setter Property="pu:DropDownHelper.ShadowColor" Value="{DynamicResource ShadowColor}" />
<Setter Property="pu:ShadowHelper.Opacity" Value="0.7" />
<Setter Property="pu:ShadowHelper.BlurRadius" Value="25" />
</Style>
</ResourceDictionary>

View File

@ -33,19 +33,20 @@ namespace VPet_Simulator.Windows.Interface
allowmove = !this["gameconfig"].GetBool("allowmove");
smartmove = this["gameconfig"].GetBool("smartmove");
enablefunction = !this["gameconfig"].GetBool("nofunction");
Statistics_OLD = new Statistics(this["statistics"].ToList());
//Statistics_OLD = new Statistics(this["statistics"].ToList());
autobuy = this["gameconfig"].GetBool("autobuy");
autogift = this["gameconfig"].GetBool("autogift");
}
public override string ToString()
{//留作备份,未来版本删了
this["statistics"] = new Line("statistics", "", "", Statistics_OLD.ToSubs().ToArray());
return base.ToString();
}
/// <summary>
/// 统计数据信息(旧)
/// </summary>
public Statistics Statistics_OLD;
//public override string ToString()
//{//留作备份,未来版本删了
// this["statistics"] = new Line("statistics", "", "", Statistics_OLD.ToSubs().ToArray());
// return base.ToString();
//}
///// <summary>
///// 统计数据信息(旧)
///// </summary>
//public Statistics Statistics_OLD;
//public Size WindowsSize
//{
@ -87,7 +88,7 @@ namespace VPet_Simulator.Windows.Interface
/// </summary>
public double VoiceVolume
{
get => GetFloat("voicevolume", 0.5);
get => (double)GetFloat("voicevolume", 0.5);
set => SetFloat("voicevolume", value);
}
/// <summary>
@ -275,7 +276,7 @@ namespace VPet_Simulator.Windows.Interface
/// </summary>
public double PetHelpLeft
{
get => this["pethelp"].GetFloat("left", 0);
get => (double)this["pethelp"].GetFloat("left", 0);
set => this["pethelp"].SetFloat("left", value);
}
/// <summary>
@ -283,7 +284,7 @@ namespace VPet_Simulator.Windows.Interface
/// </summary>
public double PetHelpTop
{
get => this["pethelp"].GetFloat("top", 0);
get => (double)this["pethelp"].GetFloat("top", 0);
set => this["pethelp"].SetFloat("top", value);
}

View File

@ -45,7 +45,7 @@ namespace VPet_Simulator.Windows.Interface
get => GetDateTime((string)subName);
set => SetDateTime((string)subName, value);
}
public double this[gflt subName]
public FInt64 this[gflt subName]
{
get => GetFloat((string)subName);
set => SetFloat((string)subName, value);
@ -113,9 +113,9 @@ namespace VPet_Simulator.Windows.Interface
public void SetInt64(string subName, long value) => Set(subName, value);
public double GetFloat(string subName, double defaultvalue = 0) => Find(subName)?.GetFloat() ?? defaultvalue;
public FInt64 GetFloat(string subName, FInt64 defaultvalue = default) => Find(subName)?.GetFloat() ?? defaultvalue;
public void SetFloat(string subName, double value) => Set(subName, value);
public void SetFloat(string subName, FInt64 value) => Set(subName, new SetObject(value));
public DateTime GetDateTime(string subName, DateTime defaultvalue = default) => Find(subName)?.GetDateTime() ?? defaultvalue;

View File

@ -7,6 +7,7 @@
<UseWPF>true</UseWPF>
<ImportWindowsDesktopTargets>true</ImportWindowsDesktopTargets>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@ -15,9 +16,9 @@
<ProjectReference Include="..\VPet-Simulator.Core\VPet-Simulator.Core.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="LinePutScript" Version="1.9.2" />
<PackageReference Include="LinePutScript" Version="1.10.2" />
<PackageReference Include="LinePutScript.Localization.WPF" Version="1.0.6" />
<PackageReference Include="Panuon.WPF" Version="1.0.2" />
<PackageReference Include="Panuon.WPF.UI" Version="1.1.15.8" />
<PackageReference Include="Panuon.WPF" Version="1.0.3" />
<PackageReference Include="Panuon.WPF.UI" Version="1.1.16.8" />
</ItemGroup>
</Project>

View File

@ -1,4 +1,5 @@
<Application x:Class="VPet_Simulator.Windows.App"
<Application
x:Class="VPet_Simulator.Windows.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VPet_Simulator.Windows"
@ -17,7 +18,8 @@
</FontFamily>
</ResourceDictionary>
<ResourceDictionary>
<pu:GlobalSettings x:Key="globalSettings"
<pu:GlobalSettings
x:Key="globalSettings"
FontFamily="{StaticResource MainFont}"
FontSize="14"
IconFontFamily="/VPet-Simulator.Windows;component/Res/#remixicon"

View File

@ -9,6 +9,7 @@ using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Xml.Linq;
using VPet_Simulator.Core;
using VPet_Simulator.Windows.Interface;
@ -104,6 +105,13 @@ namespace VPet_Simulator.Windows
LocalizeCore.AddCulture(line.info, ls);
}
if (mw.CoreMODs.FirstOrDefault(x => x.Name == Name) != null)
{
Name += $"({"MOD名称重复".Translate()})";
ErrorMessage = "MOD名称重复".Translate();
return;
}
if (!IsOnMOD(mw))
{
Tag.Add("该模组已停用");
@ -155,6 +163,8 @@ namespace VPet_Simulator.Windows
var tmp = new LpsDocument(File.ReadAllText(fi.FullName));
foreach (ILine li in tmp)
{
if (li.Name != "food")
continue;
string tmps = li.Find("name").info;
mw.Foods.RemoveAll(x => x.Name == tmps);
mw.Foods.Add(LPSConvert.DeserializeObject<Food>(li));
@ -313,7 +323,11 @@ namespace VPet_Simulator.Windows
}
catch
{
Process.Start("explorer.exe", url);
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "explorer.exe";
startInfo.UseShellExecute = false;
startInfo.Arguments = url;
Process.Start(startInfo);
}
}

View File

@ -35,6 +35,8 @@ using Line = LinePutScript.Line;
using static VPet_Simulator.Windows.Interface.ExtensionFunction;
using Image = System.Windows.Controls.Image;
using VPet.Solution;
namespace VPet_Simulator.Windows
{
public partial class MainWindow : IMainWindow
@ -316,17 +318,37 @@ namespace VPet_Simulator.Windows
petHelper.Show();
}
public static void RunDIY(string content)
public void RunDIY(string content)
{
if (content.Contains("://") || content.Contains(@":\"))
if (content.Contains(@":\"))
{
try
{
Process.Start(content);
if (!Set["v"][(gbol)"rundiy"])
{
MessageBoxX.Show("由于操作系统的设计通过我们软件启动的程序可能会在任务管理器中归类为我们软件的子进程这可能导致CPU/内存占用显示较高".Translate(),
"关于CPU/内存占用显示较高的一次性提示".Translate());
Set["v"][(gbol)"rundiy"] = true;
}
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = content;
startInfo.UseShellExecute = false;
Process.Start(startInfo);
}
catch (Exception e)
{
MessageBox.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message);
MessageBoxX.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message);
}
}
else if (content.Contains("://"))
{
try
{
ExtensionSetting.StartURL(content);
}
catch (Exception e)
{
MessageBoxX.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message);
}
}
else
@ -337,7 +359,7 @@ namespace VPet_Simulator.Windows
}
catch (Exception e)
{
MessageBox.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message);
MessageBoxX.Show("快捷键运行失败:无法运行指定内容".Translate() + '\n' + e.Message);
}
}
}
@ -615,7 +637,7 @@ namespace VPet_Simulator.Windows
{
var stat = GameSavesData.Statistics;
var save = Core.Save;
stat["stat_money"] = save.Money;
stat["stat_money"] = (SetObject)save.Money;
stat["stat_level"] = save.Level;
stat["stat_likability"] = save.Likability;
@ -690,7 +712,7 @@ namespace VPet_Simulator.Windows
else
data.Add(new Line(item.Name, item.Info));
}
tmp = new GameSave_v2(lps, Set.Statistics_OLD, olddata: data);
tmp = new GameSave_v2(lps, null, olddata: data);
}
if (tmp.GameSave == null)
return false;
@ -1205,6 +1227,7 @@ namespace VPet_Simulator.Windows
public async void GameLoad(List<DirectoryInfo> Path)
{
Path = Path.Distinct().ToList();
await Dispatcher.InvokeAsync(new Action(() => LoadingText.Content = "Loading MOD"));
//加载mod
foreach (DirectoryInfo di in Path)
@ -1402,12 +1425,16 @@ namespace VPet_Simulator.Windows
await Dispatcher.InvokeAsync(new Action(() => LoadingText.Content = "尝试加载游戏动画".Translate()));
await Dispatcher.InvokeAsync(new Action(() =>
{
LoadingText.Content = "尝试加载动画和生成缓存".Translate();
LoadingText.Content = "尝试加载动画和生成缓存\n该步骤可能会耗时比较长\n请耐心等待".Translate();
Core.Graph = petloader.Graph(Set.Resolution);
Main = new Main(Core);
Main.NoFunctionMOD = Set.CalFunState;
LoadingText.Content = "正在加载游戏".Translate();
//加载数据合理化:工作
if (!Set["gameconfig"].GetBool("noAutoCal"))
{
@ -1436,7 +1463,6 @@ namespace VPet_Simulator.Windows
}
LoadingText.Content = "正在加载游戏".Translate();
var m = new System.Windows.Controls.MenuItem()
{
Header = "MOD管理".Translate(),
@ -1712,11 +1738,38 @@ namespace VPet_Simulator.Windows
Thread.Sleep(2000);
Set["SingleTips"].SetBool("helloworld", true);
NoticeBox.Show("欢迎使用虚拟桌宠模拟器!\n如果遇到桌宠爬不见了,可以在我这里设置居中或退出桌宠".Translate(),
"你好".Translate() + (IsSteamUser ? SteamClient.Name : Environment.UserName));
"你好".Translate() + (IsSteamUser ? SteamClient.Name : Environment.UserName), Panuon.WPF.UI.MessageBoxIcon.Info, true, 5000);
//Thread.Sleep(2000);
//Main.SayRnd("欢迎使用虚拟桌宠模拟器\n这是个中期的测试版,若有bug请多多包涵\n欢迎加群虚拟主播模拟器430081239或在菜单栏-管理-反馈中提交bug或建议".Translate());
});
}
if (Set["v"][(gint)"rank"] != DateTime.Now.Year && GameSavesData.Statistics[(gint)"stat_total_time"] > 3600)
{//年度报告提醒
Task.Run(() =>
{
Thread.Sleep(120000);
Set["v"][(gint)"rank"] = DateTime.Now.Year;
Dispatcher.Invoke(() =>
{
var button = new System.Windows.Controls.Button()
{
Content = "点击前往查看".Translate(),
FontSize = 20,
HorizontalAlignment = System.Windows.HorizontalAlignment.Right,
Background = Function.ResourcesBrush(Function.BrushType.Primary),
Foreground = Function.ResourcesBrush(Function.BrushType.PrimaryText),
};
button.Click += (x, y) =>
{
var panelWindow = new winCharacterPanel(this);
panelWindow.MainTab.SelectedIndex = 2;
panelWindow.Show();
};
Main.MsgBar.MessageBoxContent.Children.Add(button);
});
Main.Say("哼哼~主人,我的考试成绩出炉了哦,快来和我一起看我的成绩单喵".Translate(), "shining");
});
}
#if DEMO
else
{

View File

@ -20,6 +20,7 @@ using Line = LinePutScript.Line;
using static VPet_Simulator.Core.GraphInfo;
using System.Globalization;
using LinePutScript.Dictionary;
using Steamworks.Data;
namespace VPet_Simulator.Windows
{
@ -111,6 +112,8 @@ namespace VPet_Simulator.Windows
{
if (IsSteamUser)//如果是steam用户,尝试加载workshop
{
//Leaderboard? leaderboard = await SteamUserStats.FindLeaderboardAsync("chatgpt_auth");
//leaderboard?.ReplaceScore(Function.Rnd.Next());
var workshop = new Line_D("workshop");
await Dispatcher.InvokeAsync(new Action(() =>
{

Binary file not shown.

After

Width:  |  Height:  |  Size: 895 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 311 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 524 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 341 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 358 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 366 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 473 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 479 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 349 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 KiB

View File

@ -65,17 +65,70 @@
</ItemGroup>
<ItemGroup>
<None Remove="mklink.bat" />
<None Remove="Res\img\rank1.png" />
<None Remove="Res\img\rank2.png" />
<None Remove="Res\img\rank3.png" />
<None Remove="Res\img\rank4.png" />
<None Remove="Res\img\rank5.png" />
<None Remove="Res\img\rank6.png" />
<None Remove="Res\img\rbgb.png" />
<None Remove="Res\img\rbgt.png" />
<None Remove="Res\img\r_autobuy_1.png" />
<None Remove="Res\img\r_autobuy_2.png" />
<None Remove="Res\img\r_autobuy_3.png" />
<None Remove="Res\img\r_autobuy_4.png" />
<None Remove="Res\img\r_level_1.png" />
<None Remove="Res\img\r_level_2.png" />
<None Remove="Res\img\r_level_3.png" />
<None Remove="Res\img\r_level_4.png" />
<None Remove="Res\img\r_level_5.png" />
<None Remove="Res\img\r_mod_1.png" />
<None Remove="Res\img\r_mod_2.png" />
<None Remove="Res\img\r_mod_3.png" />
<None Remove="Res\img\r_mostfood_Drink.png" />
<None Remove="Res\img\r_mostfood_Drug.png" />
<None Remove="Res\img\r_mostfood_Food.png" />
<None Remove="Res\img\r_mostfood_Functional.png" />
<None Remove="Res\img\r_mostfood_Gift.png" />
<None Remove="Res\img\r_mostfood_Meal.png" />
<None Remove="Res\img\r_mostfood_Snack.png" />
<None Remove="Res\img\r_singleexp_1.png" />
<None Remove="Res\img\r_singleexp_2.png" />
<None Remove="Res\img\r_singleexp_3.png" />
<None Remove="Res\img\r_singleexp_4.png" />
<None Remove="Res\img\r_singleexp_5.png" />
<None Remove="Res\img\r_singlemoney_1.png" />
<None Remove="Res\img\r_singlemoney_2.png" />
<None Remove="Res\img\r_singlemoney_3.png" />
<None Remove="Res\img\r_singlemoney_4.png" />
<None Remove="Res\img\r_timelength_1.png" />
<None Remove="Res\img\r_timelength_2.png" />
<None Remove="Res\img\r_timelength_3.png" />
<None Remove="Res\img\r_timelength_4.png" />
<None Remove="Res\img\r_timelength_5.png" />
<None Remove="Res\img\r_worktime_1.png" />
<None Remove="Res\img\r_worktime_2.png" />
<None Remove="Res\img\r_worktime_3.png" />
<None Remove="Res\img\r_worktime_4.png" />
<None Remove="Res\img\r_worktime_5.png" />
<None Remove="Res\img\r_worktime_6.png" />
<None Remove="快捷键通用注解.md" />
</ItemGroup>
<ItemGroup>
<Resource Include="Res\Font\OPPOSans B.ttf" />
<Resource Include="Res\Font\OPPOSans R.ttf" />
<Resource Include="Res\img\rank2.png" />
<Resource Include="Res\img\rank1.png" />
<Resource Include="Res\img\rank3.png" />
<Resource Include="Res\img\rbgb.png" />
<Resource Include="Res\img\r_mostfood_Food.png" />
<Resource Include="Res\remixicon.ttf" />
<Resource Include="vpeticon.ico" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\VPet-Simulator.Core\VPet-Simulator.Core.csproj" />
<ProjectReference Include="..\VPet-Simulator.Windows.Interface\VPet-Simulator.Windows.Interface.csproj" />
<ProjectReference Include="..\VPet.Solution\VPet.Solution.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Settings.Designer.cs">
@ -132,6 +185,50 @@
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ItemGroup>
<Resource Include="Res\img\rbgt.png" />
<Resource Include="Res\img\r_autobuy_1.png" />
<Resource Include="Res\img\r_autobuy_2.png" />
<Resource Include="Res\img\r_autobuy_3.png" />
<Resource Include="Res\img\r_autobuy_4.png" />
<Resource Include="Res\img\r_level_1.png" />
<Resource Include="Res\img\r_level_2.png" />
<Resource Include="Res\img\r_level_3.png" />
<Resource Include="Res\img\r_level_4.png" />
<Resource Include="Res\img\r_level_5.png" />
<Resource Include="Res\img\r_mod_1.png" />
<Resource Include="Res\img\r_mod_2.png" />
<Resource Include="Res\img\r_mod_3.png" />
<Resource Include="Res\img\r_mostfood_Drink.png" />
<Resource Include="Res\img\r_mostfood_Drug.png" />
<Resource Include="Res\img\r_mostfood_Functional.png" />
<Resource Include="Res\img\r_mostfood_Gift.png" />
<Resource Include="Res\img\r_mostfood_Meal.png" />
<Resource Include="Res\img\r_mostfood_Snack.png" />
<Resource Include="Res\img\r_singleexp_1.png" />
<Resource Include="Res\img\r_singleexp_2.png" />
<Resource Include="Res\img\r_singleexp_3.png" />
<Resource Include="Res\img\r_singleexp_4.png" />
<Resource Include="Res\img\r_singleexp_5.png" />
<Resource Include="Res\img\r_singlemoney_1.png" />
<Resource Include="Res\img\r_singlemoney_2.png" />
<Resource Include="Res\img\r_singlemoney_3.png" />
<Resource Include="Res\img\r_singlemoney_4.png" />
<Resource Include="Res\img\r_timelength_1.png" />
<Resource Include="Res\img\r_timelength_2.png" />
<Resource Include="Res\img\r_timelength_3.png" />
<Resource Include="Res\img\r_timelength_4.png" />
<Resource Include="Res\img\r_timelength_5.png" />
<Resource Include="Res\img\r_worktime_1.png" />
<Resource Include="Res\img\r_worktime_2.png" />
<Resource Include="Res\img\r_worktime_3.png" />
<Resource Include="Res\img\r_worktime_4.png" />
<Resource Include="Res\img\r_worktime_5.png" />
<Resource Include="Res\img\r_worktime_6.png" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.Web" />
@ -140,10 +237,10 @@
<PackageReference Include="CSCore" Version="1.2.1.2" />
<PackageReference Include="Facepunch.Steamworks" Condition="'$(Platform)' == 'x64'" Version="2.3.3" />
<PackageReference Include="Facepunch.Steamworks.win32" Condition="'$(Platform)' == 'x86'" Version="2.3.3" />
<PackageReference Include="LinePutScript" Version="1.9.2" />
<PackageReference Include="LinePutScript" Version="1.10.2" />
<PackageReference Include="LinePutScript.Localization.WPF" Version="1.0.6" />
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="Panuon.WPF" Version="1.0.2" />
<PackageReference Include="Panuon.WPF.UI" Version="1.1.15.8" />
<PackageReference Include="Panuon.WPF" Version="1.0.3" />
<PackageReference Include="Panuon.WPF.UI" Version="1.1.16.8" />
</ItemGroup>
</Project>

View File

@ -319,8 +319,19 @@
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<pu:Pagination x:Name="pagination" Grid.Row="1" Style="{DynamicResource StandardPaginationStyle}"
<Grid Grid.Row="1" >
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<pu:Pagination x:Name="pagination" Style="{DynamicResource StandardPaginationStyle}"
CurrentPageChanged="pagination_CurrentPageChanged" />
<StackPanel Grid.Column="1" Margin="5,0,0,0" Orientation="Horizontal">
<TextBox x:Name="TbPage" MinWidth="50" Style="{DynamicResource StandardTextBoxStyle}"
PreviewKeyDown="TbPage_PreviewKeyDown" />
<TextBlock Margin="3,0,0,0" Text="页" VerticalAlignment="Center"/>
</StackPanel>
</Grid>
</Grid>
</Grid>
</pu:WindowX>

View File

@ -353,7 +353,10 @@ namespace VPet_Simulator.Windows
private void pagination_CurrentPageChanged(object sender, SelectedValueChangedRoutedEventArgs<int> e)
{
if (!AllowChange)
return;
Search();
TbPage.Text = e.NewValue.ToString();
}
private void rMoney_Loaded(object sender, RoutedEventArgs e)
@ -408,5 +411,14 @@ namespace VPet_Simulator.Windows
((Button)sender).Content = "更好买".Translate() + mw.PrefixSave;
;
}
private void TbPage_PreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Enter
&& int.TryParse(TbPage.Text?.Trim(), out int page))
{
pagination.CurrentPage = Math.Max(0, Math.Min(pagination.MaxPage, page));
}
}
}
}

View File

@ -199,6 +199,254 @@
</Grid>
</ScrollViewer>
</TabItem>
<TabItem Header="{ll:Str 统计总结}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="28" />
<RowDefinition Height="30" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<Button x:Name="btn_r_genRank" Grid.Column="1" pu:ButtonHelper.CornerRadius="4"
Background="{DynamicResource SecondaryLight}" BorderBrush="{DynamicResource SecondaryDark}"
BorderThickness="2" Content="{ll:Str 生成统计}" Margin="5,2" Click="btn_r_genRank_Click" />
<Button x:Name="btn_r_save" Grid.Column="1" pu:ButtonHelper.CornerRadius="4"
Background="{DynamicResource SecondaryLight}" BorderBrush="{DynamicResource SecondaryDark}"
BorderThickness="2" Content="{ll:Str 保存图片}" Margin="5,2" Grid.Row="1" Click="btn_r_save_Click"
IsEnabled="False" />
<CheckBox x:Name="cb_NoCheat" Content="{ll:Str '未使用过作弊模组和修改游戏数据'}" Margin="5,2"
BorderBrush="{DynamicResource DARKPrimary}" pu:CheckBoxHelper.CornerRadius="4" IsEnabled="False"
Unchecked="cb_NoCheat_Unchecked" />
<CheckBox x:Name="cb_AgreeUpload" Content="{ll:Str '同意上传统计数据至Steam排行榜'}" Margin="5,2"
BorderBrush="{DynamicResource DARKPrimary}" pu:CheckBoxHelper.CornerRadius="4" Grid.Row="1"
IsEnabled="False" Checked="cb_AgreeUpload_Checked" />
<ScrollViewer Grid.Row="2" Grid.ColumnSpan="2" x:Name="r_viewbox" Visibility="Collapsed">
<Viewbox x:Name="r_output">
<Grid x:Name="r_output_base">
<Image Source="/Res/img/rbgt.png" VerticalAlignment="Top" Stretch="UniformToFill" />
<Image Source="/Res/img/rbgb.png" VerticalAlignment="Bottom" Stretch="UniformToFill" />
<Grid Margin="55,310,55,55">
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="200" />
<RowDefinition Height="110" />
<RowDefinition Height="160" />
<RowDefinition Height="200" />
<RowDefinition Height="160" />
<RowDefinition Height="200" />
<RowDefinition Height="160" />
<RowDefinition Height="200" />
<RowDefinition Height="160" />
<RowDefinition Height="200" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="40" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Image Source="/Res/img/rank1.png" Grid.Row="1" />
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10,0,10,0" FontSize="16" Grid.Row="1">
<Run x:Name="r_r_startday" Text="XXXX年XX月XX日" FontSize="24" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /><LineBreak />
<Run Text="{ll:Str 你第一次遇到了这只可爱的小东西}" /><LineBreak />
<Run Text="{ll:Str '初次见面,主人~'}" />
</TextBlock>
<TextBlock Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="2" FontSize="16" MaxWidth="500" TextWrapping="Wrap"
Grid.ColumnSpan="2">
<Run Text="{ll:Str 你和}" /><Run x:Name="r_r_petname_2" Text="萝莉斯" /><Run
Text="{ll:Str 一共生活了}" /> <Run x:Name="r_r_startlength" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str r天}" /><LineBreak />
<Run Text="{ll:Str 你陪伴她的时长是}" /> <Run x:Name="r_r_length_h" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r小时}" /><LineBreak />
<Run Text="{ll:Str 超过了全球}" /> <Run x:Name="r_r_length_p" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r的主人}" /><LineBreak />
<Run x:Name="r_r_lenghranktext" Text="主人~感谢陪伴~" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDarker}" />
</TextBlock>
<TextBlock Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="3" FontSize="16" MaxWidth="300" TextWrapping="Wrap">
<Run Text="{ll:Str 平均一天有}" /> <Run x:Name="r_r_lengthph" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str 小时在一起}" /><LineBreak />
<Run Text="{ll:Str 相当于平均和}" /> <Run x:Name="r_r_lengthphtext" Text="同学"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 在一起的时间}" /><LineBreak />
<Run x:Name="r_r_lenghtext" Text="学长~前辈"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_timelength" Source="/Res/img/r_timelength_1.png" Grid.Row="3"
Grid.Column="1" HorizontalAlignment="Left" />
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="4" FontSize="16" MaxWidth="350" TextWrapping="Wrap">
<Run Text="{ll:Str 你的等级是}" /> <Run x:Name="r_r_level" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r级}" /><LineBreak />
<Run Text="{ll:Str 累计获得经验}" /> <Run x:Name="r_r_exp" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /><LineBreak />
<Run Text="{ll:Str 累计学习时间是}" /> <Run x:Name="r_r_studytime" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r分钟}" /><LineBreak />
<Run x:Name="r_r_studytext" Text="相当于桌宠的小学学历哦&#13;“肃清! 萝莉斯的安魂曲☆”"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_exp" Source="/Res/img/r_level_1.png" Grid.Row="4" />
<TextBlock Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="5" FontSize="16" MaxWidth="300" TextWrapping="Wrap">
<Run Text="{ll:Str 单次学习最大获得}" /> <Run x:Name="r_r_studyexpmax" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str 经验}" /><LineBreak />
<Run Text="{ll:Str 超过了全球}" /> <Run x:Name="r_r_studyexpmaxrank" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r的主人}" /><LineBreak />
<Run x:Name="r_r_studyexptext" Text="看我量子速读法!"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_singleexp" Source="/Res/img/r_singleexp_1.png" Grid.Row="5"
Grid.Column="1" HorizontalAlignment="Left" />
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="6" FontSize="16" MaxWidth="350" TextWrapping="Wrap">
<Run Text="{ll:Str 累计工作时间是}" /> <Run x:Name="r_r_worktime" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r分钟}" /><LineBreak />
<Run Text="{ll:Str 工作占总时间}" /> <Run x:Name="r_r_worktimeps" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /><LineBreak />
<Run Text="{ll:Str 超过了全球}" /> <Run x:Name="r_r_worktimepsrank" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str r的主人}" /><LineBreak />
<Run x:Name="r_r_worktext" Text="“我草,卷狗”"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_money" Source="/Res/img/r_worktime_1.png" Grid.Row="6" />
<TextBlock Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="7" FontSize="16" MaxWidth="300" TextWrapping="Wrap">
<Run Text="{ll:Str 单次工作最大获得}" /> <Run x:Name="r_r_workmoneymax" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 金钱}" /><LineBreak />
<Run Text="{ll:Str 超过了全球}" /> <Run x:Name="r_r_workmoneyrank" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str r的主人}" /><LineBreak />
<Run x:Name="r_r_workmoneytext" Text="可是,我真的很需要那些钱钱!"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_singlemoney" Source="/Res/img/r_singlemoney_1.png" Grid.Row="7"
HorizontalAlignment="Left" Grid.Column="1" />
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="8" FontSize="16" MaxWidth="350" TextWrapping="Wrap">
<Run Text="{ll:Str 累计购买}" /> <Run x:Name="r_r_betterbuytimes" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 次更好买商品}" /><LineBreak />
<Run Text="{ll:Str 累计花费}" /> <Run x:Name="r_r_betterbuycount" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 金钱}" /><LineBreak />
<Run Text="{ll:Str 其中最多购买的是}" /> <Run x:Name="r_r_betterbuymostitem" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 在分类}" /> <Run x:Name="r_r_betterbuymosttype" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /><LineBreak />
<Run x:Name="r_r_betterbuymosttext" Text="“多吃零食有益心理健康”"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_mostfood" Grid.Row="8" Source="/Res/img/r_mostfood_Snack.png" />
<TextBlock Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="9" FontSize="16" MaxWidth="500" TextWrapping="Wrap">
<Run Text="{ll:Str 自动购买}" /> <Run x:Name="r_r_autobuy" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str 次}" /><LineBreak />
<Run Text="{ll:Str 占全部购买}" /> <Run x:Name="r_r_autobuypres" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /><LineBreak />
<Run Text="{ll:Str 超过了全球}" /> <Run x:Name="r_r_autobuyrank" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str r的主人}" /><LineBreak />
<Run x:Name="r_r_autobuytext" Text="“不要小看我的情报网!你自动购买礼物没关,对不对?”"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_autobuy" Grid.Row="9" Source="/Res/img/r_autobuy_1.png"
Grid.Column="1" HorizontalAlignment="Left" />
<TextBlock Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10,0,10,0" Grid.Row="10" FontSize="16" MaxWidth="350"
TextWrapping="Wrap">
<Run Text="{ll:Str 你订阅了}" /> <Run x:Name="r_r_modcount" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str 个mod}" /><LineBreak />
<Run Text="{ll:Str 启用的其中的}" /> <Run x:Name="r_r_modenablecount" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 个mod}" /><LineBreak />
<Run Text="{ll:Str 你订阅mod数超过了全球}" /> <Run x:Name="r_r_modcountrank" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str r的主人}" /><LineBreak />
<Run x:Name="r_r_modcounttext" Text="“主人已经是mod大师了喵要不要试试mod制作器给我做mod喵”"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_mod" Source="/Res/img/r_mod_1.png" Grid.Row="10" />
<TextBlock Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="10" Grid.Row="11" Grid.ColumnSpan="2" FontSize="20" MaxWidth="500"
TextWrapping="Wrap">
<Run Text="{ll:Str 睡了}" /> <Run x:Name="r_r_sleeplength" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str 小时的觉}" /><LineBreak />
<Run Text="{ll:Str 移动了}" /> <Run x:Name="r_r_movelength" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /><Run
x:Name="r_r_movelengthcm" Text="px"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str '的距离'}" /><LineBreak />
<Run Text="{ll:Str 说了}" /> <Run x:Name="r_r_saycount" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str '句话'}" /><LineBreak />
<Run Text="{ll:Str 跳了}" /> <Run x:Name="r_r_musiccount" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str '次舞蹈'}" /><LineBreak />
<Run Text="{ll:Str 摸了}" /> <Run x:Name="r_r_touchtotal" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str '次头'}" /><LineBreak />
<Run Text="&quot;" Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" /><Run
Text="{ll:Str '吃喝玩乐睡, 惨了养成猪了'}"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" /><Run
Text="&quot;" Foreground="{DynamicResource DARKPrimaryDarker}"
FontWeight="Bold" />
</TextBlock>
<Image x:Name="r_i_like" Source="/Res/img/rank2.png" Grid.Row="12" Grid.ColumnSpan="2" />
<TextBlock Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"
Margin="40" Grid.Row="13" Grid.ColumnSpan="2" FontSize="20" MaxWidth="500"
TextWrapping="Wrap">
<Run Text="{ll:Str 打开游戏次数是}" /> <Run x:Name="r_r_opencount" Text="XX" FontWeight="Bold"
Foreground="{DynamicResource DARKPrimaryDark}" /> <Run Text="{ll:Str 次}" /><LineBreak />
<Run Text="{ll:Str 你照顾的}" /><Run x:Name="r_r_petname_3" Text="萝莉斯" /><Run
Text="{ll:Str 满状态次数是}" /> <Run x:Name="r_r_bettercount" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str '次'}" /><LineBreak /><LineBreak />
<Run x:Name="r_r_petname_4" Text="萝莉斯" /><Run Text="{ll:Str 对你的好感度是}" /><LineBreak /> <Run
x:Name="r_r_likecount" Text="&#xEE0E;&#xEE0E;&#xEE0E;&#xEE0F;"
FontWeight="Bold"
FontFamily="/VPet-Simulator.Windows;component/Res/#remixicon"
Foreground="{DynamicResource DARKPrimaryDark}" /><LineBreak /><LineBreak />
<Run Text="{ll:Str 超过了全球}" /> <Run x:Name="r_r_likecountrank" Text="XX"
FontWeight="Bold" Foreground="{DynamicResource DARKPrimaryDark}" /> <Run
Text="{ll:Str 'r的主人'}" /><LineBreak />
<LineBreak />
<Run Text="&quot;" Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" /><Run
Text="{ll:Str '最喜欢你了主人~ 新的一年请多多关照喵~'}"
Foreground="{DynamicResource DARKPrimaryDarker}" FontWeight="Bold" /><Run
Text="&quot;" Foreground="{DynamicResource DARKPrimaryDarker}"
FontWeight="Bold" />
</TextBlock>
<Image Source="/Res/img/rank3.png" Grid.Row="14" Grid.ColumnSpan="2" />
</Grid>
<TextBlock VerticalAlignment="Bottom" HorizontalAlignment="Left"
Foreground="{DynamicResource DARKPrimaryDarker}" Margin="60,0,0,55"
FontWeight="Bold" FontSize="16">
<Run Text="To" FontSize="20" /> <Run x:Name="r_r_petname" Text="萝莉斯" FontSize="24" /> <LineBreak />
<Run Text="By" FontSize="20" /> <Run x:Name="r_r_username" Text="洛里斯杨远"
FontSize="24" /> <LineBreak />
@<Run Text="{ll:Str 虚拟桌宠模拟器}" /> (<Run x:Name="r_r_now" Text="2023/12/29" />)
</TextBlock>
</Grid>
</Viewbox>
</ScrollViewer>
<ProgressBar x:Name="pb_r_genRank" Height="20" Grid.Row="2" Grid.ColumnSpan="2" VerticalAlignment="Top"
pu:ProgressBarHelper.CornerRadius="4" pu:ProgressBarHelper.IsPercentVisible="True"
Background="{DynamicResource SecondaryLighter}" BorderBrush="{DynamicResource SecondaryDark}"
BorderThickness="1.5" FontSize="10" Foreground="{DynamicResource Secondary}" Value="0"
Margin="0,5,0,0" Visibility="Collapsed" />
</Grid>
</TabItem>
</TabControl>
</pu:WindowX>

View File

@ -1,13 +1,24 @@
using LinePutScript.Localization.WPF;
using LinePutScript;
using LinePutScript.Localization.WPF;
using Microsoft.Win32;
using Panuon.WPF.UI;
using Steamworks;
using Steamworks.Data;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Effects;
using System.Windows.Media.Imaging;
using System.Xml.Linq;
using VPet_Simulator.Windows.Interface;
namespace VPet_Simulator.Windows
{
@ -30,9 +41,18 @@ namespace VPet_Simulator.Windows
}
DataGridStatic.ItemsSource = StatList;
mw.GameSavesData.Statistics.StatisticChanged += Statistics_StatisticChanged;
if (mw.GameSavesData.HashCheck && mw.GameSavesData.GameSave.Exp < int.MaxValue && mw.GameSavesData.GameSave.Money < int.MaxValue)
{
cb_NoCheat.IsEnabled = true;
if (mw.IsSteamUser)
cb_AgreeUpload.IsEnabled = true;
}
}
private void Statistics_StatisticChanged(Interface.Statistics sender, string name, LinePutScript.SetObject value)
private void Statistics_StatisticChanged(Interface.Statistics sender, string name, SetObject value)
{
Dispatcher.Invoke(() =>
{
var v = StatList.FirstOrDefault(x => x.StatId == name);
if (v != null)
@ -43,6 +63,7 @@ namespace VPet_Simulator.Windows
{
StatList.Add(new StatInfo(name, value.GetDouble()));
}
});
}
private ObservableCollection<StatInfo> StatList { get; set; } = new();
@ -206,5 +227,503 @@ namespace VPet_Simulator.Windows
mw.GameSavesData.Statistics.StatisticChanged -= Statistics_StatisticChanged;
mw.Windows.Remove(this);
}
private void btn_r_save_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog()
{
FileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "VPet_Rank.png"),
Filter = "PNG Image File|*.png"
};
if (saveFileDialog.ShowDialog() != true)
return;
r_viewbox.ScrollToTop();
FrameworkElement outputbox;
if (r_output.ActualWidth > r_output_base.ActualWidth)
outputbox = r_output;
else
outputbox = r_output_base;
RenderTargetBitmap image = new RenderTargetBitmap((int)outputbox.ActualWidth, (int)outputbox.ActualHeight, 96, 96, PixelFormats.Pbgra32);
image.Render(outputbox);
var path = saveFileDialog.FileName;
using (MemoryStream ms = new MemoryStream())
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(ms);
File.WriteAllBytes(path, ms.ToArray());
if (mw.IsSteamUser && cb_AgreeUpload.IsChecked == true)
SteamScreenshots.AddScreenshot(path, null, image.PixelWidth, image.PixelHeight);
Process.Start(path);
}
}
private void cb_AgreeUpload_Checked(object sender, RoutedEventArgs e)
{
cb_NoCheat.IsChecked = true;
}
private void cb_NoCheat_Unchecked(object sender, RoutedEventArgs e)
{
cb_AgreeUpload.IsChecked = false;
}
private void btn_r_genRank_Click(object sender, RoutedEventArgs e)
{
btn_r_genRank.IsEnabled = false;
pb_r_genRank.Value = 0;
pb_r_genRank.Visibility = Visibility.Visible;
Task.Run(GenRank);
}
private async void GenRank()
{
mw.Set["v"][(gint)"rank"] = DateTime.Now.Year;
bool useranking = mw.IsSteamUser && await Dispatcher.InvokeAsync(() => cb_AgreeUpload.IsChecked == true);
string petname = mw.GameSavesData.GameSave.Name;
string username = mw.IsSteamUser ? SteamClient.Name : Environment.UserName;
int timelength = mw.GameSavesData.Statistics[(gint)"stat_total_time"];
double timelength_h = (timelength / 3600.0);
double startdatelength = (DateTime.Now - mw.GameSavesData[(gdat)"birthday"]).TotalDays;
double startlengthrank = 0;
if (useranking)
{
Leaderboard? leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("stat_total_time", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
var result = await leaderboard?.ReplaceScore(timelength);
var length = leaderboard?.EntryCount ?? 1.0;
startlengthrank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
}
string startlengthranktext;
if (startlengthrank < 0.5)
startlengthranktext = '"' + "主人~多陪陪我~".Translate() + '"';
else
startlengthranktext = '"' + "主人~感谢陪伴~".Translate() + '"';
double timelengthph = timelength_h / startdatelength;
string timelengthphtext;
string timelengthtext;
int timelength_i;
if (timelengthph < 2)
{
timelengthphtext = "同学".Translate();
timelengthtext = '"' + "学长~前辈~".Translate() + '"';
timelength_i = 1;
}
else if (timelengthph < 4)
{
timelengthphtext = "朋友".Translate();
timelengthtext = '"' + "兄弟!".Translate() + '"';
timelength_i = 2;
}
else if (timelengthph < 7)
{
timelengthphtext = "挚友".Translate();
timelengthtext = '"' + "不求同年同月同日生,但求同年同月同日打开《虚拟桌宠模拟器》".Translate() + '"';
timelength_i = 3;
}
else if (timelengthph < 10)
{
timelengthphtext = "家人".Translate();
timelengthtext = '"' + "We are 伐木累~".Translate() + '"';
timelength_i = 4;
}
else
{
timelengthphtext = "女鹅".Translate();
timelengthtext = '"' + "爸妈~ 这么叫好像不太好".Translate() + '"';
timelength_i = 5;
}
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 10);
string studytext;
int study_i;
if (mw.GameSavesData.GameSave.Level < 20)
{
studytext = "相当于桌宠的小学学历哦\n\"肃清! {0}的安魂曲☆\"".Translate(petname);
study_i = 1;
}
else if (mw.GameSavesData.GameSave.Level < 40)
{
studytext = "相当于桌宠的中学学历哦\n<高考桌宠100天>".Translate();
study_i = 2;
}
else if (mw.GameSavesData.GameSave.Level < 60)
{
studytext = "相当于桌宠的大学学历哦\n\"大学生上课吃饭睡觉, {0}学习吃饭睡觉, {0}=大学生\"".Translate(petname);
study_i = 3;
}
else if (mw.GameSavesData.GameSave.Level < 80)
{
studytext = "相当于桌宠的博士学历哦\n\"大学生上课吃饭睡觉, 人家和那个带兜帽的没关系啦\"".Translate();
study_i = 4;
}
else
{
studytext = "<虚拟桌宠模拟器砖家>\n\"一定是{0}干的!\"".Translate(username);
study_i = 5;
}
int studyexpmax, studymoneymax;
double studyexpmaxrank = 0, studymoneymaxrank = 0;
if (mw.IsSteamUser)
{
studyexpmax = SteamUserStats.GetStatInt("stat_single_profit_exp");
studymoneymax = SteamUserStats.GetStatInt("stat_single_profit_money");
}
else
{
studyexpmax = mw.GameSavesData.Statistics[(gint)"stat_single_profit_exp"];
studymoneymax = mw.GameSavesData.Statistics[(gint)"stat_single_profit_money"];
}
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 20);
if (useranking)
{
Leaderboard? leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("stat_single_profit_exp", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
var result = await leaderboard?.ReplaceScore(studyexpmax);
var length = leaderboard?.EntryCount ?? 1.0;
studyexpmaxrank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("stat_single_profit_money", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
result = await leaderboard?.ReplaceScore(studymoneymax);
length = leaderboard?.EntryCount ?? 1.0;
studymoneymaxrank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
}
string studyexptext, workmoneytext;
int studyexp_i, workmoney_i;
if (studyexpmaxrank < 0.25)
{
studyexptext = '"' + "在你这个年纪,你怎么睡得着觉的?".Translate() + '"';
studyexp_i = 5;
}
else if (studyexpmaxrank < 0.4)
{
studyexptext = '"' + "孩子学习老不好,多半是废了,快来试试思维驰学习机".Translate() + '"';
studyexp_i = 4;
}
else if (studyexpmaxrank < 0.55)
{
studyexptext = '"' + "孩子学习老不好,多半是废了,快来试试思维驰学习机".Translate() + '"';
studyexp_i = 3;
}
else if (studyexpmaxrank < 0.75)
{
studyexptext = '"' + "学而不思则罔思而不学则die".Translate() + '"';
studyexp_i = 2;
}
else
{
studyexptext = '"' + "看我量子速读法!".Translate() + '"';
studyexp_i = 1;
}
if (studymoneymaxrank < 0.25)
{
workmoneytext = '"' + "钱钱乃身外之物".Translate() + '"';
workmoney_i = 4;
}
else if (studymoneymaxrank < 0.5)
{
workmoneytext = '"' + "风声雨声读书声声声入耳,日结月结次次结钱钱入账".Translate() + '"';
workmoney_i = 3;
}
else if (studymoneymaxrank < 0.75)
{
workmoneytext = '"' + "有钱能使磨推鬼".Translate() + '"';
workmoney_i = 2;
}
else
{
workmoneytext = '"' + "可是,我真的很需要那些钱钱!".Translate() + '"';
workmoney_i = 1;
}
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 40);
int worktime = mw.GameSavesData.Statistics[(gint)"stat_work_time"];
double worktimeph = (double)worktime / timelength;
double worktimephrank = 0;
if (useranking)
{
Leaderboard? leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("stat_work_time_ph", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
var result = await leaderboard?.ReplaceScore((int)(worktimeph * 10000));
var length = leaderboard?.EntryCount ?? 1.0;
worktimephrank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
}
string worktimephtext;
int worktime_i;
if (worktimephrank < 0.25)
{
worktimephtext = '"' + "干一天来歇一天, 能混一天是一天".Translate() + '"';
worktime_i = 1;
}
else if (worktimephrank < 0.35)
{
worktimephtext = '"' + "早8晚5快乐回家".Translate() + '"';
worktime_i = 2;
}
else if (worktimephrank < 0.45)
{
worktimephtext = '"' + "早8晚5快乐回家".Translate() + '"';
worktime_i = 3;
}
else if (worktimephrank < 0.55)
{
worktimephtext = '"' + "早8晚5快乐回家".Translate() + '"';
worktime_i = 4;
}
else if (worktimephrank < 0.75)
{
worktimephtext = '"' + "加班没有加班费不是基本常识吗?".Translate() + '"';
worktime_i = 5;
}
else
{
worktimephtext = '"' + "老板! 路灯已经准备好了!".Translate() + '"';
worktime_i = 6;
}
int betterbuytimes = mw.GameSavesData.Statistics[(gint)"stat_buytimes"];
int betterbuycount = (int)mw.GameSavesData.Statistics[(gdbe)"stat_betterbuy"];
Food mostfood = new Food()
{
Name = "None",
};
foreach (var pair in mw.GameSavesData.Statistics.Data.Where(x => x.Key.StartsWith("buy_")).OrderByDescending(x => ((int)x.Value)))
{
var fn = pair.Key.Substring(4);
var f = mw.Foods.FirstOrDefault(x => x.Name == fn);
if (f != null)
{
mostfood = f;
break;
}
}
string foodtext = "啥也没吃,{0}都饿坏了".Translate(petname);
switch (mostfood.Type)
{
case Food.FoodType.Meal:
foodtext = '"' + "人是铁饭是钢, 四菜一汤吃得香".Translate() + '"';
break;
case Food.FoodType.Drug:
foodtext = '"' + "自动购买又忘开了吧?".Translate() + '"';
break;
case Food.FoodType.Drink:
foodtext = '"' + "多喝热水".Translate() + '"';
break;
case Food.FoodType.Functional:
foodtext = '"' + "不是正餐买不起, 而是功能性更有性价比".Translate() + '"';
break;
case Food.FoodType.Snack:
foodtext = '"' + "多吃零食有益心理健康".Translate() + '"';
break;
case Food.FoodType.Gift:
foodtext = '"' + "公若不弃,{0}愿拜为义父!".Translate(petname) + '"';
break;
}
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 60);
int autobuytimes = mw.GameSavesData.Statistics[(gint)"stat_autobuy"];
double autobuytimesph = (double)autobuytimes / betterbuytimes;
double autobuytimesphrank = 0;
if (useranking)
{
Leaderboard? leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("stat_autobuy_ph", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
var result = await leaderboard?.ReplaceScore((int)(autobuytimesph * 10000));
var length = leaderboard?.EntryCount ?? 1.0;
autobuytimesphrank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
}
string autobuytext;
int autobuy_i;
if (autobuytimesph < 0.25)
{
autobuytext = '"' + "主人, 是担心我乱买东西嘛".Translate() + '"';
autobuy_i = 4;
}
else if (autobuytimesph < 0.5)
{
autobuytext = '"' + "自己赚的钱自己花".Translate() + '"';
autobuy_i = 3;
}
else if (autobuytimesph < 0.75)
{
autobuytext = '"' + "不要小看我的情报网! 你自动购买礼物没关,对不对?".Translate() + '"';
autobuy_i = 2;
}
else
{
autobuytext = '"' + "诚招保姆,工资面议".Translate() + '"';
autobuy_i = 1;
}
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 70);
var modworkshoplist = mw.CoreMODs.FindAll(x => x.Path.FullName.Contains("workshop"));
int modworkshop = modworkshoplist.Count;
int modon = modworkshoplist.FindAll(x => x.IsOnMOD(mw)).Count;
double modworkshoprank = 0;
if (useranking)
{
Leaderboard? leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("workshop", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
var result = await leaderboard?.ReplaceScore(modworkshop);
var length = leaderboard?.EntryCount ?? 1.0;
modworkshoprank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
}
string modworkshoptext;
int modworkshop_i;
if (modworkshop == 0)
{
modworkshoptext = '"' + "桌宠的steam创意工坊里有许多的mod喵, 主人快去试试吧".Translate() + '"';
modworkshop_i = 3;
}
else if (modworkshoprank < 0.3)
{
modworkshoptext = '"' + "主人还可以再去创意工坊体验更多MOD喵".Translate() + '"';
modworkshop_i = 3;
}
else if (modworkshoprank < 0.7)
{ modworkshoptext = '"' + "创意工坊又更新了很多有趣的mod喵, 主人要不要去看看?".Translate() + '"'; modworkshop_i = 2; }
else
{ modworkshoptext = '"' + "主人已经是mod大师了喵,要不要试试mod制作器,给我做mod喵!".Translate() + '"'; modworkshop_i = 1; }
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 80);
int like = (int)mw.GameSavesData.GameSave.Likability;
string liketext = "";
while (like > 100)
{
like -= 100;
liketext += '\uEE0E';
}
while (like > 50)
{
like -= 50;
liketext += '\uEE0F';
}
if (liketext.Length == 0)
{
liketext = "\uEECA";
}
double likerank = 0;
if (useranking)
{
Leaderboard? leaderboard = await SteamUserStats.FindOrCreateLeaderboardAsync("stat_likability", LeaderboardSort.Descending, LeaderboardDisplay.Numeric);
var result = await leaderboard?.ReplaceScore((int)mw.GameSavesData.GameSave.Likability);
var length = leaderboard?.EntryCount ?? 1.0;
likerank = 1 - ((result?.NewGlobalRank - 1) ?? length) / length;
}
await Dispatcher.InvokeAsync(() => pb_r_genRank.Value = 88);
await Dispatcher.InvokeAsync(() =>
{
r_r_startday.Text = mw.GameSavesData[(gdat)"birthday"].ToLongDateString();
r_r_startlength.Text = startdatelength.ToString("f1");
r_r_length_h.Text = timelength_h.ToString("f1");
r_r_length_p.Text = startlengthrank.ToString("p1");
r_r_lenghranktext.Text = startlengthranktext;
r_r_lengthph.Text = timelengthph.ToString("f1");
r_r_lengthphtext.Text = timelengthphtext;
r_r_lenghtext.Text = timelengthtext;
r_i_timelength.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_timelength_{timelength_i}.png"));
r_r_level.Text = mw.GameSavesData.GameSave.Level.ToString();
r_r_exp.Text = mw.GameSavesData.GameSave.Exp.ToString("f0");
r_r_studytime.Text = (mw.GameSavesData.Statistics[(gint)"stat_study_time"] / 60).ToString();
r_r_studytext.Text = studytext;
r_i_exp.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_level_{study_i}.png"));
r_r_studyexpmax.Text = studyexpmax.ToString();
r_r_studyexpmaxrank.Text = studyexpmaxrank.ToString("p1");
r_r_studyexptext.Text = studyexptext;
r_i_singleexp.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_singleexp_{studyexp_i}.png"));
r_r_worktime.Text = (worktime / 60).ToString();
r_r_worktimeps.Text = worktimeph.ToString("p1");
r_r_worktimepsrank.Text = worktimephrank.ToString("p1");
r_r_worktext.Text = worktimephtext;
r_i_money.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_worktime_{worktime_i}.png"));
r_r_workmoneymax.Text = studymoneymax.ToString();
r_r_workmoneyrank.Text = studymoneymaxrank.ToString("p1");
r_r_workmoneytext.Text = workmoneytext;
r_i_singlemoney.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_singlemoney_{workmoney_i}.png"));
r_r_username.Text = username;
r_r_petname.Text = r_r_petname_2.Text = r_r_petname_3.Text = r_r_petname_4.Text = petname;
r_r_now.Text = DateTime.Now.ToShortDateString();
r_r_betterbuytimes.Text = betterbuytimes.ToString();
r_r_betterbuycount.Text = betterbuycount.ToString();
r_r_betterbuymosttype.Text = mostfood.Type.ToString().Translate();
r_r_betterbuymostitem.Text = mostfood.TranslateName;
r_r_betterbuymosttext.Text = foodtext;
r_i_mostfood.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_mostfood_{mostfood.Type}.png"));
r_r_autobuy.Text = autobuytimes.ToString();
r_r_autobuypres.Text = autobuytimesph.ToString("p1");
r_r_autobuyrank.Text = autobuytimesphrank.ToString("p1");
r_r_autobuytext.Text = autobuytext;
r_i_autobuy.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_autobuy_{autobuy_i}.png"));
r_r_modcount.Text = modworkshop.ToString();
r_r_modenablecount.Text = modon.ToString();
r_r_modcountrank.Text = modworkshoprank.ToString("p1");
r_r_modcounttext.Text = modworkshoptext;
r_i_mod.Source = new BitmapImage(new Uri($"pack://application:,,,/Res/img/r_mod_{modworkshop_i}.png"));
r_r_sleeplength.Text = (mw.GameSavesData.Statistics[(gint)"stat_sleep_time"] / 3600.0).ToString("f1");
r_r_movelength.Text = px_tocm(mw.GameSavesData.Statistics[(gi64)"stat_move_length"], out string cm);
r_r_movelengthcm.Text = cm;
r_r_saycount.Text = mw.GameSavesData.Statistics[(gint)"stat_say_times"].ToString();
r_r_musiccount.Text = mw.GameSavesData.Statistics[(gint)"stat_music"].ToString();
r_r_touchtotal.Text = (mw.GameSavesData.Statistics[(gint)"stat_touch_body"] + mw.GameSavesData.Statistics[(gint)"stat_touch_head"]).ToString();
if (mw.GameSavesData.GameSave.Likability > 100)
r_i_like.Visibility = Visibility.Visible;
else
r_i_like.Visibility = Visibility.Collapsed;
r_r_opencount.Text = mw.GameSavesData.Statistics[(gint)"stat_open_times"].ToString();
r_r_bettercount.Text = mw.GameSavesData.Statistics[(gint)"stat_100_all"].ToString();
r_r_likecount.Text = liketext;
r_r_likecountrank.Text = likerank.ToString("p1");
r_viewbox.Visibility = Visibility.Visible;
btn_r_genRank.IsEnabled = true;
btn_r_save.IsEnabled = true;
pb_r_genRank.Visibility = Visibility.Collapsed;
Width = 800;
Height = 800;
});
}
private string px_tocm(long px, out string cm)
{
if (px < 37795)
{
cm = "px";
return px.ToString();
}
else if (px < 3779527)
{
cm = "cm";
return (px * 2.54 / 96).ToString("f1");
}
else if (px < 377952755)
{
cm = "m";
return (px * 2.54 / 9600).ToString("f1");
}
else
{
cm = "km";
return (px * 2.54 / 9600000).ToString("f1");
}
}
}
}

View File

@ -1439,7 +1439,14 @@ namespace VPet_Simulator.Windows
mw.GameSavesData = new GameSave_v2(mw.Core.Save.Name);
mw.Core.Save = mw.GameSavesData.GameSave;
if (oldsave.HashCheck) // 对于重开无作弊的玩家保留统计
{
mw.GameSavesData.Statistics = oldsave.Statistics;
if(oldsave.GameSave.Money > 10000000 || oldsave.GameSave.Money < -1000000000 || oldsave.GameSave.Exp > 100000000 || oldsave.GameSave.Exp < -10000000000)
{
mw.Core.Save.Money = 10000;
mw.Core.Save.Exp = 10000;
}
}
mw.HashCheck = true;
MessageBoxX.Show("重置成功".Translate());
}

View File

@ -1,11 +1,12 @@
chcp 65001
%1 mshta vbscript:createobject("shell.application").shellexecute("%~s0","::","","runas",1)(window.close)&exit
cd /d %~dp0
mklink /d "%~dp0\bin\x64\Debug\net462\mod" "%~dp0\mod"
echo ^"以下是其他相关MOD的自动链接生成, 若提示错误为正常现象,无需理会"
echo "The following is the automatic link generation for other related MODs. If an error is prompted, it is a normal phenomenon and should not be ignored"
echo The following is the automatic link generation for other related MODs. If an error is prompted, it is a normal phenomenon and can be ignored
mklink /d "%~dp0\bin\x64\Release\net462\mod" "%~dp0\mod"
mklink /d "%~dp0\..\VPet.Solution\bin\Debug\mod" "%~dp0\mod"
mklink /d "%~dp0\mod\0001_ModMaker" "%~dp0\..\..\VPet.ModMaker\0001_ModMaker"
mklink /d "%~dp0\mod\1100_DemoClock" "%~dp0\..\..\VPet.Plugin.Demo\VPet.Plugin.DemoClock\1100_DemoClock"
@ -13,5 +14,4 @@ mklink /d "%~dp0\mod\1111_ChatGPTPlus" "%~dp0\..\..\VPet.Plugin.ChatGPTPlus\VPet
mklink /d "%~dp0\mod\1101_EdgeTTS" "%~dp0\..\..\VPet.Plugin.Demo\VPet.Plugin.EdgeTTS\1101_EdgeTTS"
mklink /d "%~dp0\mod\1110_ChatGPT" "%~dp0\..\..\VPet.Plugin.Demo\VPet.Plugin.ChatGPT\1110_ChatGPT"
pause

View File

@ -1,3 +1,9 @@
food:|name#莲蓉蛋黄月饼:|type#Snack:|Exp#100:|Strength#40:|StrengthDrink#-3:|StrengthFood#80:|Likability#1:|Health#5:|Feeling#40:|price#26:|graph#eat:|desc#海上生明月,天涯共此时。无论近况如何,前途多难,计划如不如意,未来迷不迷茫,萝莉丝都为你做了莲蓉蛋黄月饼,快说谢谢萝莉丝。:|
food:|name#五仁月饼:|type#Meal:|Exp#100:|Strength#80:|StrengthDrink#-6:|StrengthFood#160:|Likability#1:|Health#5:|Feeling#0:|price#38:|graph#eat:|desc#举头望明月,低头思故乡。无论身在何处,离家多远,家人在不在身边,心情好不好,萝莉丝都为你做了五仁月饼,快说谢谢萝莉丝。:|
food:|name#巧克力花生月饼:|type#Functional:|Exp#400:|Strength#20:|StrengthDrink#0:|StrengthFood#40:|Likability#2:|Health#5:|Feeling#20:|price#62:|graph#eat:|desc#明月几时有,把酒问青天。无论考的如何,作业有多少,老师怎么说,家长怎么批评,萝莉丝都为你做了巧克力花生月饼,快说谢谢萝莉丝。:|
/// food:|name#莲蓉蛋黄月饼:|type#Snack:|Exp#100:|Strength#40:|StrengthDrink#-3:|StrengthFood#80:|Likability#1:|Health#5:|Feeling#40:|price#26:|graph#eat:|desc#海上生明月,天涯共此时。无论近况如何,前途多难,计划如不如意,未来迷不迷茫,萝莉丝都为你做了莲蓉蛋黄月饼,快说谢谢萝莉丝。:|
/// food:|name#五仁月饼:|type#Meal:|Exp#100:|Strength#80:|StrengthDrink#-6:|StrengthFood#160:|Likability#1:|Health#5:|Feeling#0:|price#38:|graph#eat:|desc#举头望明月,低头思故乡。无论身在何处,离家多远,家人在不在身边,心情好不好,萝莉丝都为你做了五仁月饼,快说谢谢萝莉丝。:|
/// food:|name#巧克力花生月饼:|type#Functional:|Exp#400:|Strength#20:|StrengthDrink#0:|StrengthFood#40:|Likability#2:|Health#5:|Feeling#20:|price#62:|graph#eat:|desc#明月几时有,把酒问青天。无论考的如何,作业有多少,老师怎么说,家长怎么批评,萝莉丝都为你做了巧克力花生月饼,快说谢谢萝莉丝。:|
food:|name#圣诞帽:|type#Gift:|Exp#200:|Likability#4:|Health#5:|Feeling#50:|price#45.0:|graph#gift:|desc#圣诞帽_giftintor:|
food:|name#礼物盒子:|type#Gift:|Exp#1000:|Likability#5:|Feeling#100:|price#150.0:|graph#gift:|desc#礼物盒子_giftintor:|
food:|name#糖果棒:|type#Snack:|Exp#200:|Strength#40:|StrengthFood#40:|Likability#2:|Feeling#40:|price#35:|graph#eat:|desc#糖果棒_giftintor:|
food:|name#圣诞草莓奶茶:|type#Drink:|Exp#200:|StrengthDrink#80:|Likability#2:|Feeling#60:|price#35:|graph#drink:|desc#圣诞草莓奶茶_giftintor:|
food:|name#萝莉丝姜饼人:|type#Snack:|Exp#600:|StrengthFood#80:|Likability#2:|Health#2:|Feeling#50:|price#128.0:|graph#eat:|desc#萝莉丝姜饼人_giftintor:|

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -0,0 +1,3 @@
由于操作系统的设计通过我们软件启动的程序可能会在任务管理器中归类为我们软件的子进程这可能导致CPU/内存占用显示较高#Due to the design of the operating system, programs launched by our software may be categorized as sub-processes of our software in the task manager, which may result in higher displayed CPU/memory usage.:|
关于CPU/内存占用显示较高的一次性提示#One-time Notice Regarding Higher Displayed CPU/Memory Usage:|
尝试加载动画和生成缓存\n该步骤可能会耗时比较长\n请耐心等待#Attempting to load animations and generate cache\nThis step may take a while\nPlease be patient:|

View File

@ -8,3 +8,13 @@
主人主人,{name}参加了sbeam大奖赛哦给人家投一票喵#Master, {name} is participating in the Sbeam Awards , vote for me meow:|
那个。。主人。。\n人家参加了sbeam大奖赛哦。能不能。。给{name}投一票呢~#That... Master... I'm participating in the Sbeam Awards . Can you... vote for {name}~:|
电脑里有一款《虚拟桌宠模拟器》的游戏正在参加2023的sbeam大奖赛快来给桌宠投一票吧#There is a game called "VPet Simulator" in the computer that is participating in the 2023 Sbeam Awards , come and vote for the desktop pet:|
圣诞帽#Christmas hat:|
圣诞帽_giftintor#An ordinary hat, but anyone can be Santa with it.:|
礼物盒子#Gift box:|
礼物盒子_giftintor#Surprise!!:|
糖果棒#Candy bar:|
糖果棒_giftintor#You can eat it, play with it, and use it to spank bad kids.:|
圣诞草莓奶茶#Christmas strawberry milk tea:|
圣诞草莓奶茶_giftintor#I don't know why it's Christmas cream tea and not Christmas cake, maybe the artist likes Christmas strawberry cream tea:|
萝莉丝姜饼人#Gingerbread Lolis:|
萝莉丝姜饼人_giftintor#Lolis made her own gingerbread man, and Lolis would get mad if she couldn't eat it because it was too cute!:|

View File

@ -0,0 +1,107 @@
统计#Statistics:|
主人~多陪陪我~#Master, stay with me!:|
主人~感谢陪伴~#Master, thank you for your company.:|
同学#Classmates:|
学长~前辈~#Senior:|
朋友#Friend!:|
兄弟!#Brother!:|
挚友#Best friend!:|
不求同年同月同日生,但求同年同月同日打开《虚拟桌宠模拟器》#We don't want to be born in the same year, month and day, but we want to open VPet Simulator in the same year, month and day.:|
家人#Family:|
We are 伐木累~#We are Family.:|
女鹅#Daughter:|
爸妈~ 这么叫好像不太好#Mom and Dad!, I don't think it's a good idea to call them that.:|
相当于桌宠的中学学历哦\n<高考桌宠100天>#It's the equivalent of VPet's high school education.\n<College Entrance Exam for VPet>:|
在你这个年纪,你怎么睡得着觉的?#How do you sleep at your age?:|
学而不思则罔思而不学则die#Learning without thought means labour lost; thought without learning is perilous.:|
学习?#Learning?:|
看我量子速读法!#Look at my quantum speed reading method!:|
钱钱乃身外之物#Money is nothing.:|
风声雨声读书声声声入耳,日结月结次次结钱钱入账#The sound of the wind and rain, the sound of reading, the sound of the day, the sound of the month, the sound of the day, the sound of the month, the sound of the money.:|
有钱能使磨推鬼#Money can make things go away.:|
可是,我真的很需要那些钱钱!#But I really need that money!:|
干一天来歇一天, 能混一天是一天#One day at a time, one day off, one day at a time.:|
早8晚5快乐回家#8 a.m. to 5 p.m., go home happy:|
加班没有加班费不是基本常识吗?#Isn't it basic knowledge that overtime work is not paid?:|
老板! 路灯已经准备好了!#Boss! The streetlights are ready!:|
啥也没吃,{0}都饿坏了#haven't eaten anything. {0} is starving.:|
人是铁饭是钢, 四菜一汤吃得香#Iron is steel, four dishes and one soup.:|
自动购买又忘开了吧?#Did you forget to turn on the auto-purchase?:|
多喝热水#Drink more hot water.:|
不是正餐买不起, 而是功能性更有性价比#It's not that you can't afford to eat, it's that functionality is more cost-effective.:|
多吃零食有益心理健康#Snacking is good for your mental health.:|
公若不弃,{0}愿拜为义父!#If you don't give me up, May {0} be worshipped as adoptive father:|
主人, 是担心我乱买东西嘛#Master, Are you worried that I will buy things randomly?:|
自己赚的钱自己花#I spend what I earn.:|
不要小看我的情报网! 你自动购买礼物没关,对不对?#Don't underestimate my intelligence network! You're not buying gifts automatically, are you?:|
诚招保姆,工资面议#We're looking for a nanny. Salary negotiable.:|
桌宠的steam创意工坊里有许多的mod喵, 主人快去试试吧#VPet's steam workshop is full of mods, so go try them out.:|
创意工坊又更新了很多有趣的mod喵, 主人要不要去看看?#There's a lot of interesting mods in the steam workshop. Would you like to take a look?:|
主人已经是mod大师了喵,要不要试试mod制作器,给我做mod喵!#Master is already a master modder, try the mod maker and make mods for me!:|
统计总结#Stats Summary:|
生成统计#Generate stats:|
保存图片#Save image:|
未使用过作弊模组和修改游戏数据#Have not used any cheat mods or modified game stats.:|
同意上传统计数据至Steam排行榜#Agree to upload stats to Steam Leaderboards:|
你第一次遇到了这只可爱的小东西#Your first encounter with this cute little thing:|
初次见面,主人~#First encounter, master~:|
你和#You and :|
一共生活了# lived together for:|
r天#Days:|
你陪伴她的时长是#The length of time you stayed with her was:|
r小时#Hours.:|
超过了全球#More than:|
r的主人#of the world's players:|
平均一天有#Spend an average of:|
小时在一起#hours a day together.:|
相当于平均和#Equivalent to the average time spent with:|
在一起的时间#time spent together:|
你的等级是#Your Level is:|
r级#:|
累计获得经验#Cumulative experience gained:|
累计学习时间是#The cumulative learning time is:|
r分钟#minutes:|
单次学习最大获得#Maximum single learning gain:|
累计工作时间是#Cumulative work time is:|
工作占总时间#Work accounts for of total time:|
单次工作最大获得#Maximum acquisition of work in a single session:|
累计购买#Accumulated:|
次更好买商品#times purchases of better products:|
其中最多购买的是#Among the most purchased are:|
在分类#under the category:|
自动购买#Automatic purchases:|
次#times:|
占全部购买#of all purchases:|
你订阅了#You subscribed to:|
个mod#mods:|
启用的其中的#of which are enabled:|
你订阅mod数超过了全球#You subscribed to more mods than:|
睡了#Slept:|
小时的觉#hours:|
移动了#Moved:|
的距离#distance:|
说了#Said:|
句话#Sentence:|
跳了#Danced:|
次舞蹈#times:|
摸了#Touched:|
次头#times:|
吃喝玩乐睡, 惨了养成猪了#Eat, drink, play and sleep.:|
打开游戏次数是#The number of times the game is opened is:|
你照顾的#The full states of:|
满状态次数是#being taken care of:|
对你的好感度是#'s favorability towards you is:|
最喜欢你了主人~ 新的一年请多多关照喵~#You're my favorite, master. Please take care of me in the new year.:|
MOD名称重复#Mod name duplicated:|
Food#Food:|
Star#Star:|
Meal#Meal:|
Snack#Snack:|
Drink#Drink:|
Functional#Functional:|
Drug#Drug:|
Gift#Gift:|
孩子学习老不好,多半是废了,快来试试思维驰学习机#The child's learning is not good, mostly waste, come and try the Nintendo switch learning machine:|
主人还可以再去创意工坊体验更多MOD喵#Master can also go to the workshop to experience more MOD:|
点击前往查看#Click to view:|
哼哼~主人,我的考试成绩出炉了哦,快来和我一起看我的成绩单喵#Humph~Master, my exam results are out, come and see my report card with me:|

View File

@ -0,0 +1,48 @@
VPET 设置编辑器#VPET Setup Editor:|
打开文件#Opening Files:|
从资源管理器打开文件#Opening a file from Explorer:|
重置#Reset:|
全部保存#Save All:|
Mod管理#Mod Management:|
保存为退出位置#Save as Exit Location:|
设为当前位置#Set as current position:|
设为当前窗口左上角顶点坐标的位置#Set to the current position of the top-left corner of the window in vertex coordinates.:|
每次间隔#Interval:|
备份设置#Backup Settings:|
桌宠设置#VPet Settings:|
桌宠状态#VPet Status:|
启用桌宠状态#Enable VPet status:|
分钟左右主动进行一次互动 (走路发呆爬墙等) #Interact actively once every minute or so (walk, dawdle, climb walls, etc.) :|
清空全部#Clear all:|
搜索名称#Search Name:|
链接#Link:|
每周期一次#Once per cycle:|
搜索模组#Search Module:|
清除失效模组#Clear invalid modules:|
清除全部模组#Clear all modules:|
模组名称:#Module Name.:|
作者:#Author.:|
模组版本:#Module Version.:|
游戏版本:#Game Version.:|
模组路径:#Path to Module.:|
启用模组#Enable Module:|
启用模组代码#Enable Module Code:|
打开所在文件夹#Open the folder:|
打开创意工坊页面#Open Creative Workshop Page:|
VPET 存档查看器#VPET Archive Viewer:|
搜索存档#Search Archives:|
保存时间#Save Time:|
游玩时长#Play Duration:|
数据#Data:|
保存日期#Save Dates:|
模式#Mode:|
等级#Grade:|
哈希检查#Hash Check:|
值#Value:|
VPET 问题解决工具#VPET Problem Solving Tool:|
打开设置编辑器#Open Settings Editor:|
打开存档查看器#Open Archive Viewer:|
打开翻译文本#Open Translated Text:|
全部重置#Reset All:|
哈希#Hash:|
第一次启动桌宠打不开?#Can't open the first time you start the desktop pet?:|

View File

@ -0,0 +1,3 @@
由于操作系统的设计通过我们软件启动的程序可能会在任务管理器中归类为我们软件的子进程这可能导致CPU/内存占用显示较高#由于操作系统的设计通过我们软件启动的程序可能会在任务管理器中归类为我们软件的子进程这可能导致CPU/内存占用显示较高:|
关于CPU/内存占用显示较高的一次性提示#关于CPU/内存占用显示较高的一次性提示:|
尝试加载动画和生成缓存\n该步骤可能会耗时比较长\n请耐心等待#尝试加载动画和生成缓存\n该步骤可能会耗时比较长\n请耐心等待:|

View File

@ -4,7 +4,17 @@
海上生明月,天涯共此时。无论近况如何,前途多难,计划如不如意,未来迷不迷茫,萝莉丝都为你做了莲蓉蛋黄月饼,快说谢谢萝莉丝。#海上生明月,天涯共此时。无论近况如何,前途多难,计划如不如意,未来迷不迷茫,萝莉丝都为你做了莲蓉蛋黄月饼,快说谢谢萝莉丝。:|
巧克力花生月饼#巧克力花生月饼:|
明月几时有,把酒问青天。无论考的如何,作业有多少,老师怎么说,家长怎么批评,萝莉丝都为你做了巧克力花生月饼,快说谢谢萝莉丝。#明月几时有,把酒问青天。无论考的如何,作业有多少,老师怎么说,家长怎么批评,萝莉丝都为你做了巧克力花生月饼,快说谢谢萝莉丝。:|
主人sbema秋季促销开始了哦还有游戏大奖赛快去给{name}去投一票吧。
主人主人,{name}参加了sbeam大奖赛哦给人家投一票喵
那个。。主人。。\n人家参加了sbeam大奖赛哦。能不能。。给{name}投一票呢~
电脑里有一款《虚拟桌宠模拟器》的游戏正在参加2023的sbeam大奖赛快来给桌宠投一票吧
主人sbema秋季促销开始了哦还有游戏大奖赛快去给{name}去投一票吧。#主人sbema秋季促销开始了哦还有游戏大奖赛快去给{name}去投一票吧。:|
主人主人,{name}参加了sbeam大奖赛哦给人家投一票喵#主人主人,{name}参加了sbeam大奖赛哦给人家投一票喵:|
那个。。主人。。\n人家参加了sbeam大奖赛哦。能不能。。给{name}投一票呢~#那个。。主人。。\n人家参加了sbeam大奖赛哦。能不能。。给{name}投一票呢~:|
电脑里有一款《虚拟桌宠模拟器》的游戏正在参加2023的sbeam大奖赛快来给桌宠投一票吧#电脑里有一款《虚拟桌宠模拟器》的游戏正在参加2023的sbeam大奖赛快来给桌宠投一票吧:|
圣诞帽#圣诞帽:|
圣诞帽_giftintor#一顶普通的帽子,但带上它谁都可以成为圣诞老人:|
礼物盒子#礼物盒子:|
礼物盒子_giftintor#Surprise!!:|
糖果棒#糖果棒:|
糖果棒_giftintor#能吃能玩,还能用来打坏小孩的屁股:|
圣诞草莓奶茶#圣诞草莓奶茶:|
圣诞草莓奶茶_giftintor#我不知道为什么是圣诞奶茶而不是圣诞蛋糕,可能画师喜欢圣诞草莓奶茶吧:|
萝莉丝姜饼人#萝莉丝姜饼人:|
萝莉丝姜饼人_giftintor#萝莉丝做的自己样子的姜饼人,要是因为太可爱舍不得吃萝莉丝会生气的哦:|

View File

@ -0,0 +1,107 @@
统计#统计:|
主人~多陪陪我~#主人~多陪陪我~:|
主人~感谢陪伴~#主人~感谢陪伴~:|
同学#同学:|
学长~前辈~#学长~前辈~:|
朋友#朋友:|
兄弟!#兄弟!:|
挚友#挚友:|
不求同年同月同日生,但求同年同月同日打开《虚拟桌宠模拟器》#不求同年同月同日生,但求同年同月同日打开《虚拟桌宠模拟器》:|
家人#家人:|
We are 伐木累~#We are 伐木累~:|
女鹅#女鹅:|
爸妈~ 这么叫好像不太好#爸妈~ 这么叫好像不太好:|
相当于桌宠的中学学历哦\n<高考桌宠100天>#相当于桌宠的中学学历哦\n<高考桌宠100天>:|
在你这个年纪,你怎么睡得着觉的?#在你这个年纪,你怎么睡得着觉的?:|
学而不思则罔思而不学则die#学而不思则罔思而不学则die:|
学习?#学习?:|
看我量子速读法!#看我量子速读法!:|
钱钱乃身外之物#钱钱乃身外之物:|
风声雨声读书声声声入耳,日结月结次次结钱钱入账#风声雨声读书声声声入耳,日结月结次次结钱钱入账:|
有钱能使磨推鬼#有钱能使磨推鬼:|
可是,我真的很需要那些钱钱!#可是,我真的很需要那些钱钱!:|
干一天来歇一天, 能混一天是一天#干一天来歇一天, 能混一天是一天:|
早8晚5快乐回家#早8晚5快乐回家:|
加班没有加班费不是基本常识吗?#加班没有加班费不是基本常识吗?:|
老板! 路灯已经准备好了!#老板! 路灯已经准备好了!:|
啥也没吃,{0}都饿坏了#啥也没吃,{0}都饿坏了:|
人是铁饭是钢, 四菜一汤吃得香#人是铁饭是钢, 四菜一汤吃得香:|
自动购买又忘开了吧?#自动购买又忘开了吧?:|
多喝热水#多喝热水:|
不是正餐买不起, 而是功能性更有性价比#不是正餐买不起, 而是功能性更有性价比:|
多吃零食有益心理健康#多吃零食有益心理健康:|
公若不弃,{0}愿拜为义父!#公若不弃,{0}愿拜为义父!:|
主人, 是担心我乱买东西嘛#主人, 是担心我乱买东西嘛:|
自己赚的钱自己花#自己赚的钱自己花:|
不要小看我的情报网! 你自动购买礼物没关,对不对?#不要小看我的情报网! 你自动购买礼物没关,对不对?:|
诚招保姆,工资面议#诚招保姆,工资面议:|
桌宠的steam创意工坊里有许多的mod喵, 主人快去试试吧#桌宠的steam创意工坊里有许多的mod喵, 主人快去试试吧:|
创意工坊又更新了很多有趣的mod喵, 主人要不要去看看?#创意工坊又更新了很多有趣的mod喵, 主人要不要去看看?:|
主人已经是mod大师了喵,要不要试试mod制作器,给我做mod喵!#主人已经是mod大师了喵,要不要试试mod制作器,给我做mod喵!:|
统计总结#统计总结:|
生成统计#生成统计:|
保存图片#保存图片:|
未使用过作弊模组和修改游戏数据#未使用过作弊模组和修改游戏数据:|
同意上传统计数据至Steam排行榜#同意上传统计数据至Steam排行榜:|
你第一次遇到了这只可爱的小东西#你第一次遇到了这只可爱的小东西:|
初次见面,主人~#初次见面,主人~:|
你和#你和:|
一共生活了#一共生活了:|
r天#天:|
你陪伴她的时长是#你陪伴她的时长是:|
r小时#小时:|
超过了全球#超过了全球:|
r的主人#的主人:|
平均一天有#平均一天有:|
小时在一起#小时在一起:|
相当于平均和#相当于平均和:|
在一起的时间#在一起的时间:|
你的等级是#你的等级是:|
r级#级:|
累计获得经验#累计获得经验:|
累计学习时间是#累计学习时间是:|
r分钟#分钟:|
单次学习最大获得#单次学习最大获得:|
累计工作时间是#累计工作时间是:|
工作占总时间#工作占总时间:|
单次工作最大获得#单次工作最大获得:|
累计购买#累计购买:|
次更好买商品#次更好买商品:|
其中最多购买的是#其中最多购买的是:|
在分类#在分类:|
自动购买#自动购买:|
次#次:|
占全部购买#占全部购买:|
你订阅了#你订阅了:|
个mod#个mod:|
启用的其中的#启用的其中的:|
你订阅mod数超过了全球#你订阅mod数超过了全球:|
睡了#睡了:|
小时的觉#小时的觉:|
移动了#移动了:|
的距离#的距离:|
说了#说了:|
句话#句话:|
跳了#跳了:|
次舞蹈#次舞蹈:|
摸了#摸了:|
次头#次头:|
吃喝玩乐睡, 惨了养成猪了#吃喝玩乐睡, 惨了养成猪了:|
打开游戏次数是#打开游戏次数是:|
你照顾的#你照顾的:|
满状态次数是#满状态次数是:|
对你的好感度是#对你的好感度是:|
最喜欢你了主人~ 新的一年请多多关照喵~#最喜欢你了主人~ 新的一年请多多关照喵~:|
MOD名称重复#MOD名称重复:|
Food#食物:|
Star#收藏:|
Meal#正餐:|
Snack#零食:|
Drink#饮料:|
Functional#功能性:|
Drug#药品:|
Gift#礼品:|
孩子学习老不好,多半是废了,快来试试思维驰学习机#孩子学习老不好,多半是废了,快来试试思维驰学习机:|
主人还可以再去创意工坊体验更多MOD喵#主人还可以再去创意工坊体验更多MOD喵:|
点击前往查看#点击前往查看:|
哼哼~主人,我的考试成绩出炉了哦,快来和我一起看我的成绩单喵#哼哼~主人,我的考试成绩出炉了哦,快来和我一起看我的成绩单喵:|

View File

@ -0,0 +1,48 @@
VPET 设置编辑器#VPET 设置编辑器:|
打开文件#打开文件:|
从资源管理器打开文件#从资源管理器打开文件:|
重置#重置:|
全部保存#全部保存:|
Mod管理#Mod管理:|
保存为退出位置#保存为退出位置:|
设为当前位置#设为当前位置:|
设为当前窗口左上角顶点坐标的位置#设为当前窗口左上角顶点坐标的位置:|
每次间隔#每次间隔:|
备份设置#备份设置:|
桌宠设置#桌宠设置:|
桌宠状态#桌宠状态:|
启用桌宠状态#启用桌宠状态:|
分钟左右主动进行一次互动 (走路发呆爬墙等) #分钟左右主动进行一次互动 (走路发呆爬墙等) :|
清空全部#清空全部:|
搜索名称#搜索名称:|
链接#链接:|
每周期一次#每周期一次:|
搜索模组#搜索模组:|
清除失效模组#清除失效模组:|
清除全部模组#清除全部模组:|
模组名称:#模组名称::|
作者:#作者::|
模组版本:#模组版本::|
游戏版本:#游戏版本::|
模组路径:#模组路径::|
启用模组#启用模组:|
启用模组代码#启用模组代码:|
打开所在文件夹#打开所在文件夹:|
打开创意工坊页面#打开创意工坊页面:|
VPET 存档查看器#VPET 存档查看器:|
搜索存档#搜索存档:|
保存时间#保存时间:|
游玩时长#游玩时长:|
数据#数据:|
保存日期#保存日期:|
模式#模式:|
等级#等级:|
哈希检查#哈希检查:|
值#值:|
VPET 问题解决工具#VPET 问题解决工具:|
打开设置编辑器#打开设置编辑器:|
打开存档查看器#打开存档查看器:|
打开翻译文本#打开翻译文本:|
全部重置#全部重置:|
哈希#哈希:|
第一次启动桌宠打不开?#第一次启动桌宠打不开?:|

View File

@ -0,0 +1,3 @@
由于操作系统的设计通过我们软件启动的程序可能会在任务管理器中归类为我们软件的子进程这可能导致CPU/内存占用显示较高#由於操作系統的設計透過我們軟體啟動的程序可能會在任務管理器中歸類為我們軟體的子進程這可能導致CPU/內存占用顯示較高:|
关于CPU/内存占用显示较高的一次性提示#關於CPU/內存占用顯示較高的一次性提示:|
尝试加载动画和生成缓存\n该步骤可能会耗时比较长\n请耐心等待#嘗試加載動畫和生成緩存\n該步驟可能會耗時比較長\n請耐心等待:|

View File

@ -8,3 +8,13 @@
主人主人,{name}参加了sbeam大奖赛哦给人家投一票喵#主人主人,{name}參加了sbeam大獎賽哦給人家投一票喵:|
那个。。主人。。\n人家参加了sbeam大奖赛哦。能不能。。给{name}投一票呢~#那個。。主人。。\n人家參加了sbeam大獎賽哦。能不能。。給{name}投一票呢~:|
电脑里有一款《虚拟桌宠模拟器》的游戏正在参加2023的sbeam大奖赛快来给桌宠投一票吧#電腦裡有一款《虛擬桌寵模擬器》的遊戲正在參加2023的sbeam大獎賽快來給桌寵投一票吧:|
圣诞帽#聖誕帽:|
圣诞帽_giftintor#一頂普通的帽子,但帶上它誰都可以成為聖誕老人:|
礼物盒子#禮物盒子:|
礼物盒子_giftintor#Surprise!!:|
糖果棒#糖果棒:|
糖果棒_giftintor#能吃能玩,還能用來打壞小孩的屁股:|
圣诞草莓奶茶#聖誕草莓奶茶:|
圣诞草莓奶茶_giftintor#我不知道為什麼是聖誕奶茶而不是聖誕蛋糕,可能繪師喜歡聖誕草莓奶茶吧:|
萝莉丝姜饼人#蘿莉斯薑餅人:|
萝莉丝姜饼人_giftintor#蘿莉絲做的自己樣子的薑餅人,要是因為太可愛捨不得吃蘿莉絲會生氣的哦:|

View File

@ -0,0 +1,107 @@
统计#統計:|
主人~多陪陪我~#主人~多陪陪我~:|
主人~感谢陪伴~#主人~感謝陪伴~:|
同学#同學。:|
学长~前辈~#學長~前輩~:|
朋友#朋友。:|
兄弟!#兄弟!:|
挚友#摯友。:|
不求同年同月同日生,但求同年同月同日打开《虚拟桌宠模拟器》#不求同年同月同日生,但求同年同月同日打開《虛擬桌寵模擬器》:|
家人#家人。:|
We are 伐木累~#We are 伐木累~:|
女鹅#女鵝。:|
爸妈~ 这么叫好像不太好#爸媽~嗯…這麼叫好像不太洽當…:|
相当于桌宠的中学学历哦\n<高考桌宠100天>#相當於桌寵的國中學歷哦\n<學測桌寵100天>:|
在你这个年纪,你怎么睡得着觉的?#在你這個年紀,你怎麼睡得著覺的?:|
学而不思则罔思而不学则die#學而不思則罔思而不學則die。:|
学习?#學習?:|
看我量子速读法!#看我量子速讀法!:|
钱钱乃身外之物#錢錢乃身外之物。:|
风声雨声读书声声声入耳,日结月结次次结钱钱入账#風聲雨聲讀書聲聲聲入耳,日結月結次次結錢錢入帳。:|
有钱能使磨推鬼#有錢能使磨推鬼。:|
可是,我真的很需要那些钱钱!#可是,我真的很需要那些錢錢!:|
干一天来歇一天, 能混一天是一天#幹一天來歇一天,能混一天是一天。:|
早8晚5快乐回家#早八晚五,快樂回家。:|
加班没有加班费不是基本常识吗?#加班沒有加班費不是基本常識嗎?:|
老板! 路灯已经准备好了!#老闆!路燈已經準備好了!:|
啥也没吃,{0}都饿坏了#啥也沒吃,{0}都餓壞了。:|
人是铁饭是钢, 四菜一汤吃得香#人是鐵飯是鋼,四菜一湯吃得香。:|
自动购买又忘开了吧?#自動購買又忘記開了吧?:|
多喝热水#多喝熱水。:|
不是正餐买不起, 而是功能性更有性价比#不是正餐買不起,而是功能性更有性價比。:|
多吃零食有益心理健康#多吃零食有益心理健康。:|
公若不弃,{0}愿拜为义父!#公若不棄,{0}願拜為義父!:|
主人, 是担心我乱买东西嘛#主人,是擔心我亂買東西嗎?:|
自己赚的钱自己花#自己賺的錢自己花。:|
不要小看我的情报网! 你自动购买礼物没关,对不对?#不要小看我的情報網!你自動購買禮物沒關,對不對?:|
诚招保姆,工资面议#誠徵保姆,薪水面議。:|
桌宠的steam创意工坊里有许多的mod喵, 主人快去试试吧#桌寵的Steam工作坊裡有許多的模組喵主人快去試試吧:|
创意工坊又更新了很多有趣的mod喵, 主人要不要去看看?#工作坊又更新了很多有趣的模組喵,主人要不要去看看?:|
主人已经是mod大师了喵,要不要试试mod制作器,给我做mod喵!#主人已經是模組大師了喵,要不要試試模組製作器,給我做模組喵!:|
统计总结#統計總結:|
生成统计#生成統計:|
保存图片#儲存圖片:|
未使用过作弊模组和修改游戏数据#從未使用作弊模組或修改遊戲數據:|
同意上传统计数据至Steam排行榜#同意上傳統計資料至Steam排行榜:|
你第一次遇到了这只可爱的小东西#你第一次遇到了這隻可愛的小東西:|
初次见面,主人~#初次見面,主人~:|
你和#你和:|
一共生活了#一共生活了:|
r天#天:|
你陪伴她的时长是#你陪伴她的時數為:|
r小时#小時:|
超过了全球#超過了全球:|
r的主人#的主人:|
平均一天有#平均一天有:|
小时在一起#小時在一起:|
相当于平均和#相當於平均和:|
在一起的时间#在一起的時間:|
你的等级是#你的等級是:|
r级#等:|
累计获得经验#累計獲得經驗:|
累计学习时间是#累計學習時間:|
r分钟#分鐘:|
单次学习最大获得#單次學習最高獲得:|
累计工作时间是#累計工作時長:|
工作占总时间#工作占總時間:|
单次工作最大获得#單次工作最高獲得:|
累计购买#累計購買:|
次更好买商品#次更好買的商品:|
其中最多购买的是#其中最多購買的是:|
在分类#類別為:|
自动购买#自動購買:|
次#次:|
占全部购买#占全部購買次數的:|
你订阅了#你訂閱了:|
个mod#個模組:|
启用的其中的#啟用了其中的:|
你订阅mod数超过了全球#你訂閱的模組數超過了全球:|
睡了#睡了:|
小时的觉#小時的覺:|
移动了#移動了:|
的距离#的距離:|
说了#說了:|
句话#句話:|
跳了#跳了:|
次舞蹈#次舞蹈:|
摸了#摸了:|
次头#次頭:|
吃喝玩乐睡, 惨了养成猪了#吃喝玩樂睡,慘了養成猪了:|
打开游戏次数是#打開遊戲的次數是:|
你照顾的#你照顧的:|
满状态次数是#狀態全滿次數是:|
对你的好感度是#對你的好感度是:|
最喜欢你了主人~ 新的一年请多多关照喵~#最喜歡你了主人~新的一年請多多關照喵~:|
MOD名称重复#模組名稱重複:|
Food#食物:|
Star#收藏:|
Meal#正餐:|
Snack#零食:|
Drink#飲料:|
Functional#功能性物品:|
Drug#藥品:|
Gift#禮品:|
孩子学习老不好,多半是废了,快来试试思维驰学习机#孩子學習老不好,多半是廢了,快來試試「思維馳」學習機!:|
主人还可以再去创意工坊体验更多MOD喵#主人還可以再去工作坊體驗更多模組喵!:|
点击前往查看#點擊前往查看:|
哼哼~主人,我的考试成绩出炉了哦,快来和我一起看我的成绩单喵#哼哼~主人,我的考試成績出爐了哦,快來和我一起看我的成績單喵!:|

View File

@ -0,0 +1,48 @@
VPET 设置编辑器#VPET設定編輯器:|
打开文件#打開文件:|
从资源管理器打开文件#從資料總管打開文件:|
重置#重置:|
全部保存#全部保存:|
Mod管理#Mod管理:|
保存为退出位置#保存為退出位置:|
设为当前位置#設為當前位置:|
设为当前窗口左上角顶点坐标的位置#設為當前視窗左上角頂點座標的位置:|
每次间隔#每次間隔:|
备份设置#備份設定:|
桌宠设置#桌寵設定:|
桌宠状态#桌寵狀態:|
启用桌宠状态#啟用桌寵狀態:|
分钟左右主动进行一次互动 (走路发呆爬墙等) #分鐘左右主動進行一次互動(走路發呆爬牆等):|
清空全部#清空全部:|
搜索名称#蒐索名稱:|
链接#鏈接:|
每周期一次#每週期一次:|
搜索模组#蒐索模組:|
清除失效模组#清除失效模組:|
清除全部模组#清除全部模組:|
模组名称:#模組名稱::|
作者:#作者::|
模组版本:#模組版本::|
游戏版本:#遊戲版本::|
模组路径:#模組路徑::|
启用模组#啟用模組:|
启用模组代码#啟用模組程式碼:|
打开所在文件夹#打開所在資料夾:|
打开创意工坊页面#打開創意工坊頁面:|
VPET 存档查看器#VPET存檔檢視器:|
搜索存档#蒐索存檔:|
保存时间#保存時間:|
游玩时长#遊玩時長:|
数据#數據:|
保存日期#保存日期:|
模式#模式:|
等级#等級:|
哈希检查#雜湊檢查:|
值#值:|
VPET 问题解决工具#VPET問題解决工具:|
打开设置编辑器#打開設定編輯器:|
打开存档查看器#打開存檔檢視器:|
打开翻译文本#打開翻譯文字:|
全部重置#全部重置:|
哈希#雜湊:|
第一次启动桌宠打不开?#第一次啟動桌寵打不開?:|

View File

@ -1,9 +1,17 @@
<Application x:Class="VPet.Solution.App"
<Application
x:Class="VPet.Solution.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VPet.Solution"
StartupUri="MainWindow.xaml">
StartupUri="Views/MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/VPet-Simulator.Windows.Interface;component/ResourceStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Panuon.WPF.UI;component/Control.xaml" />
<ResourceDictionary Source="Converters.xaml" />
<ResourceDictionary Source="Templates.xaml" />
<ResourceDictionary Source="Styles.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

View File

@ -1,22 +1,15 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Windows;
using VPet_Simulator.Windows.Interface;
namespace VPet.Solution
{
namespace VPet.Solution;
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
public static bool IsDone { get; set; } = false;
protected override void OnStartup(StartupEventArgs e)
{
if (e.Args != null && e.Args.Count() > 0)
@ -25,7 +18,9 @@ namespace VPet.Solution
switch (e.Args[0].ToLower())
{
case "removestarup":
var path = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + @"\VPET_Simulator.lnk";
var path =
Environment.GetFolderPath(Environment.SpecialFolder.Startup)
+ @"\VPET_Simulator.lnk";
if (File.Exists(path))
{
File.Delete(path);
@ -39,4 +34,3 @@ namespace VPet.Solution
IsDone = false;
}
}
}

View File

@ -0,0 +1,25 @@
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:HKW.WPF.Converters">
<c:MarginConverter x:Key="MarginConverter" />
<c:MarginConverter x:Key="RatioMarginConverter" HaveRatio="True" />
<c:CalculatorConverter x:Key="CalculatorConverter" />
<c:StringFormatConverter x:Key="StringFormatConverter" />
<c:BrushToMediaColorConverter x:Key="BrushToMediaColorConverter" />
<c:BoolToVisibilityConverter x:Key="FalseToHiddenConverter" />
<c:BoolToVisibilityConverter
x:Key="FalseToVisibleConverter"
FalseVisibilityValue="Visible"
NullValue="True"
TrueVisibilityValue="Hidden" />
<c:NullToVisibilityConverter x:Key="NotNullToVisibleConverter" />
<c:NullToVisibilityConverter
x:Key="NullToVisibleConverter"
NotNullVisibilityValue="Hidden"
NullVisibilityValue="Visible" />
<c:EqualsConverter x:Key="EqualsConverter" />
<c:EqualsConverter x:Key="NotEqualsConverter" Inverter="True" />
<c:ValueToBoolConverter x:Key="NullToFalse" Invert="True" />
<c:BoolInverter x:Key="BoolInverter" />
</ResourceDictionary>

View File

@ -0,0 +1,52 @@
using System.ComponentModel;
using System.Globalization;
using System.Windows;
namespace HKW.WPF.Converters;
/// <summary>
/// 全部为布尔值转换器
/// </summary>
public class AllIsBoolConverter : MultiValueToBoolConverter<AllIsBoolConverter>
{
/// <summary>
///
/// </summary>
public static readonly DependencyProperty BoolOnNullProperty = DependencyProperty.Register(
nameof(BoolOnNull),
typeof(bool),
typeof(AllIsBoolConverter),
new PropertyMetadata(false)
);
/// <summary>
/// 目标为空时的指定值
/// </summary>
[DefaultValue(false)]
public bool BoolOnNull
{
get => (bool)GetValue(BoolOnNullProperty);
set => SetValue(BoolOnNullProperty, value);
}
/// <summary>
///
/// </summary>
/// <param name="values"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public override object Convert(
object[] values,
Type targetType,
object parameter,
CultureInfo culture
)
{
var boolValue = TargetBoolValue;
var nullValue = BoolOnNull;
return values.All(o => Utils.GetBool(o, boolValue, nullValue));
}
}

View File

@ -0,0 +1,97 @@
using System.ComponentModel;
using System.Globalization;
using System.Windows;
namespace HKW.WPF.Converters;
/// <summary>
/// 全部为布尔值转换器
/// </summary>
public class AllIsBoolToVisibilityConverter
: MultiValueToBoolConverter<AllIsBoolToVisibilityConverter>
{
/// <summary>
///
/// </summary>
public static readonly DependencyProperty BoolOnNullProperty = DependencyProperty.Register(
nameof(BoolOnNull),
typeof(bool),
typeof(AllIsBoolToVisibilityConverter),
new PropertyMetadata(false)
);
/// <summary>
/// 目标为空时的指定值
/// </summary>
[DefaultValue(false)]
public bool BoolOnNull
{
get => (bool)GetValue(BoolOnNullProperty);
set => SetValue(BoolOnNullProperty, value);
}
/// <summary>
///
/// </summary>
public static readonly DependencyProperty VisibilityOnTrueProperty =
DependencyProperty.Register(
nameof(VisibilityOnTrue),
typeof(Visibility),
typeof(AllIsBoolToVisibilityConverter),
new PropertyMetadata(Visibility.Visible)
);
/// <summary>
/// 目标为空时的指定值
/// </summary>
[DefaultValue(Visibility.Visible)]
public Visibility VisibilityOnTrue
{
get => (Visibility)GetValue(TargetBoolValueProperty);
set => SetValue(TargetBoolValueProperty, value);
}
/// <summary>
///
/// </summary>
public static readonly DependencyProperty VisibilityOnFalseProperty =
DependencyProperty.Register(
nameof(VisibilityOnFalse),
typeof(Visibility),
typeof(AllIsBoolToVisibilityConverter),
new PropertyMetadata(Visibility.Hidden)
);
/// <summary>
/// 目标为空时的指定值
/// </summary>
[DefaultValue(Visibility.Hidden)]
public Visibility VisibilityOnFalse
{
get => (Visibility)GetValue(TargetBoolValueProperty);
set => SetValue(TargetBoolValueProperty, value);
}
/// <summary>
///
/// </summary>
/// <param name="values"></param>
/// <param name="targetType"></param>
/// <param name="parameter"></param>
/// <param name="culture"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public override object Convert(
object[] values,
Type targetType,
object parameter,
CultureInfo culture
)
{
var boolValue = TargetBoolValue;
var nullValue = BoolOnNull;
return values.All(o => Utils.GetBool(o, boolValue, nullValue))
? VisibilityOnTrue
: VisibilityOnFalse;
}
}

View File

@ -0,0 +1,41 @@
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace HKW.WPF.Converters;
public class BoolInverter : ValueConverterBase
{
/// <summary>
///
/// </summary>
public static readonly DependencyProperty NullValueProperty = DependencyProperty.Register(
nameof(NullValue),
typeof(bool),
typeof(BoolInverter),
new PropertyMetadata(false)
);
/// <summary>
/// 为空值时布尔值
/// </summary>
[DefaultValue(false)]
public bool NullValue
{
get => (bool)GetValue(NullValueProperty);
set => SetValue(NullValueProperty, value);
}
public override object Convert(
object value,
Type targetType,
object parameter,
CultureInfo culture
)
{
if (value is not bool b)
return NullValue;
return !b;
}
}

View File

@ -0,0 +1,63 @@
using System.ComponentModel;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace HKW.WPF.Converters;
public class BoolToVisibilityConverter : BoolToValueConverterBase<BoolToVisibilityConverter>
{
/// <summary>
///
/// </summary>
public static readonly DependencyProperty TrueVisibilityValueProperty =
DependencyProperty.Register(
nameof(TrueVisibilityValue),
typeof(Visibility),
typeof(BoolToVisibilityConverter),
new PropertyMetadata(Visibility.Visible)
);
/// <summary>
/// 为真时的可见度
/// </summary>
[DefaultValue(Visibility.Visible)]
public Visibility TrueVisibilityValue
{
get => (Visibility)GetValue(TrueVisibilityValueProperty);
set => SetValue(TrueVisibilityValueProperty, value);
}
/// <summary>
///
/// </summary>
public static readonly DependencyProperty FalseVisibilityValueProperty =
DependencyProperty.Register(
nameof(FalseVisibilityValue),
typeof(Visibility),
typeof(BoolToVisibilityConverter),
new PropertyMetadata(Visibility.Hidden)
);
/// <summary>
/// 为假时的可见度
/// </summary>
[DefaultValue(Visibility.Hidden)]
public Visibility FalseVisibilityValue
{
get => (Visibility)GetValue(FalseVisibilityValueProperty);
set => SetValue(FalseVisibilityValueProperty, value);
}
public override object Convert(
object value,
Type targetType,
object parameter,
CultureInfo culture
)
{
return Utils.GetBool(value, BoolValue, NullValue)
? TrueVisibilityValue
: FalseVisibilityValue;
}
}

Some files were not shown because too many files have changed in this diff Show More