工作面板实现

This commit is contained in:
ZouJin 2024-03-14 19:31:34 +08:00
parent ace7662d2c
commit d7a7e0b674
11 changed files with 282 additions and 31 deletions
VPet-Simulator.Core
VPet-Simulator.Windows.Interface
VPet-Simulator.Windows

@ -45,9 +45,7 @@ namespace VPet_Simulator.Core
m.TimeUIHandle += M_TimeUIHandle;
LoadWork();
}
public void LoadWork()
public void LoadClean()
{
MenuWork.Click -= MenuWork_Click;
MenuWork.Visibility = Visibility.Visible;
@ -59,6 +57,11 @@ namespace VPet_Simulator.Core
MenuWork.Items.Clear();
MenuStudy.Items.Clear();
MenuPlay.Items.Clear();
}
public void LoadWork()
{
LoadClean();
m.WorkList(out List<Work> ws, out List<Work> ss, out List<Work> ps);

@ -81,7 +81,7 @@ namespace VPet_Simulator.Core
/// <summary>
/// 工作/学习
/// </summary>
public class Work
public class Work : ICloneable
{
/// <summary>
/// 类型
@ -181,6 +181,33 @@ namespace VPet_Simulator.Core
{
m.Display(Graph, AnimatType.A_Start, () => m.DisplayBLoopingForce(Graph));
}
/// <summary>
/// 克隆相同的工作/学习
/// </summary>
public object Clone()
{
return new Work
{
Type = this.Type,
Name = this.Name,
Graph = this.Graph,
MoneyBase = this.MoneyBase,
StrengthFood = this.StrengthFood,
StrengthDrink = this.StrengthDrink,
Feeling = this.Feeling,
LevelLimit = this.LevelLimit,
Time = this.Time,
FinishBonus = this.FinishBonus,
BorderBrush = this.BorderBrush,
Background = this.Background,
ButtonBackground = this.ButtonBackground,
ButtonForeground = this.ButtonForeground,
Foreground = this.Foreground,
Left = this.Left,
Top = this.Top,
Width = this.Width
};
}
}
/// <summary>

@ -42,7 +42,7 @@ namespace VPet_Simulator.Windows.Interface
public static double Spend(this Work work)
{
return (MathPow(work.StrengthFood, 1.5) / 3 + MathPow(work.StrengthDrink, 1.5) / 4 + MathPow(work.Feeling, 1.5) / 4 +
work.LevelLimit / 10 + MathPow(work.StrengthFood + work.StrengthDrink + work.Feeling, 1.5) / 10) * 3;
work.LevelLimit / 10.0 + MathPow(work.StrengthFood + work.StrengthDrink + work.Feeling, 1.5) / 10) * 3;
}
/// <summary>
/// 判断这个工作是否超模
@ -59,15 +59,20 @@ namespace VPet_Simulator.Windows.Interface
work.FinishBonus = 0;
if (work.Type == Work.WorkType.Play && work.Feeling > 0)
work.Feeling *= -1;
if (work.Time < 10)
work.Time = 10;
var spend = work.Spend();
var get = work.Get();
var rel = get / spend;
if (rel < 0)
return true;
if (Math.Abs(get) > 1.1 * work.LevelLimit + 10) //等级获取速率限制
var lvlimit = 1.1 * work.LevelLimit + 10;
if (work.Type != Work.WorkType.Work)
lvlimit *= 10;
if (Math.Abs(work.MoneyBase) > lvlimit) //等级获取速率限制
return true;
return rel < 1.3; // 推荐rel为1左右 超过1.3就是超模
return rel > 1.3; // 推荐rel为1左右 超过1.3就是超模
}
/// <summary>
/// 数值梯度下降法 修复超模工作
@ -155,6 +160,19 @@ namespace VPet_Simulator.Windows.Interface
}
}
}
/// <summary>
/// 将工作的属性值翻倍
/// </summary>
public static Work Double(this Work work, int value)
{
Work w = (Work)work.Clone();
w.MoneyBase *= value;
w.StrengthFood *= 0.48 + 0.6 * value;
w.StrengthDrink *= 0.48 + 0.6 * value;
w.Feeling *= 0.48 + 0.6 * value;
w.LevelLimit = (work.LevelLimit + 10) * value;
return w;
}
public static string FoodToDescription(this IFood food)
{

@ -143,7 +143,7 @@ namespace VPet_Simulator.Windows.Interface
throw new Exception($"image nofound {imagename}");
return v;
#else
return FindSourceUri(imagename, "pack://application:,,,/Res/Image/system/error.png");
return FindSourceUri(imagename, "pack://application:,,,/Res/img/error.png");
#endif
}

@ -72,6 +72,8 @@ namespace VPet_Simulator.Windows
public UIElement TalkBox;
public winGameSetting winSetting { get; set; }
public winBetterBuy winBetterBuy { get; set; }
public winWorkMenu winWorkMenu { get; set; }
//public ChatGPTClient CGPTClient;
public ImageResources ImageSources { get; set; } = new ImageResources();
/// <summary>
@ -473,6 +475,20 @@ namespace VPet_Simulator.Windows
winSetting.MainTab.SelectedIndex = page;
winSetting.Show();
}
public void ShowWorkMenu(Work.WorkType type)
{
if (winWorkMenu == null)
{
winWorkMenu = new winWorkMenu(this, type);
winWorkMenu.Show();
}
else
{
winWorkMenu.tbc.SelectedIndex = (int)type;
winWorkMenu.Focus();
winWorkMenu.Topmost = true;
}
}
public void ShowBetterBuy(Food.FoodType type)
{
winBetterBuy.Show(type);
@ -1548,6 +1564,45 @@ namespace VPet_Simulator.Windows
Main.Resources = Application.Current.Resources;
Main.MsgBar.This.Resources = Application.Current.Resources;
Main.ToolBar.Resources = Application.Current.Resources;
Main.ToolBar.LoadClean();
Main.WorkList(out List<Work> ws, out List<Work> ss, out List<Work> ps);
if (ws.Count == 0)
{
Main.ToolBar.MenuWork.Visibility = Visibility.Collapsed;
}
else
{
Main.ToolBar.MenuWork.Click += (x, y) =>
{
Main.ToolBar.Visibility = Visibility.Collapsed;
ShowWorkMenu(Work.WorkType.Work);
};
}
if (ss.Count == 0)
{
Main.ToolBar.MenuStudy.Visibility = Visibility.Collapsed;
}
else
{
Main.ToolBar.MenuStudy.Click += (x, y) =>
{
Main.ToolBar.Visibility = Visibility.Collapsed;
ShowWorkMenu(Work.WorkType.Study);
};
}
if (ps.Count == 0)
{
Main.ToolBar.MenuPlay.Visibility = Visibility.Collapsed;
}
else
{
Main.ToolBar.MenuPlay.Click += (x, y) =>
{
Main.ToolBar.Visibility = Visibility.Collapsed;
ShowWorkMenu(Work.WorkType.Play);
};
}
//加载主题:
LoadTheme(Set.Theme);
@ -1932,6 +1987,7 @@ namespace VPet_Simulator.Windows
//}
}
TextBlock tlvplus;
private void MWUIHandle(Main main)
{

@ -287,6 +287,7 @@ namespace VPet_Simulator.Windows
petHelper?.Close();
winSetting?.Close();
winBetterBuy?.Close();
winWorkMenu?.Close();
if (IsSteamUser)
SteamClient.Shutdown();//关掉和Steam的连线
if (notifyIcon != null)
@ -328,6 +329,7 @@ namespace VPet_Simulator.Windows
petHelper?.Close();
winSetting?.Close();
winBetterBuy?.Close();
winWorkMenu?.Close();
App.MainWindows.Remove(this);
if (notifyIcon != null)
{

Binary file not shown.

After

(image error) Size: 6.0 KiB

@ -66,6 +66,7 @@
</ItemGroup>
<ItemGroup>
<None Remove="mklink.bat" />
<None Remove="Res\img\error.png" />
<None Remove="Res\img\rank1.png" />
<None Remove="Res\img\rank2.png" />
<None Remove="Res\img\rank3.png" />
@ -119,6 +120,7 @@
<ItemGroup>
<Resource Include="Res\Font\OPPOSans B.ttf" />
<Resource Include="Res\Font\OPPOSans R.ttf" />
<Resource Include="Res\img\error.png" />
<Resource Include="Res\img\rank2.png" />
<Resource Include="Res\img\rank1.png" />
<Resource Include="Res\img\rank3.png" />

@ -3,8 +3,8 @@
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ll="clr-namespace:LinePutScript.Localization.WPF;assembly=LinePutScript.Localization.WPF"
xmlns:local="clr-namespace:VPet_Simulator.Windows" mc:Ignorable="d" Title="{ll:Str 工作面板}" Height="400"
Width="600" ResizeMode="CanMinimize" FontSize="16">
xmlns:local="clr-namespace:VPet_Simulator.Windows" mc:Ignorable="d" Title="{ll:Str 工作面板}" Height="550"
Width="680" ResizeMode="CanMinimize" FontSize="16" Closed="Window_Closed">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
@ -14,23 +14,40 @@
<ColumnDefinition Width="1*" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<TabControl Grid.RowSpan="2">
<TabItem Header="{ll:Str '学习'}">
<ListBox x:Name="lbStudy" />
<TabControl x:Name="tbc" Grid.RowSpan="2" SelectionChanged="tbc_SelectionChanged">
<TabItem x:Name="tiw" Header="{ll:Str '工作'}">
<ListBox x:Name="lbWork" SelectionChanged="lbWork_SelectionChanged" />
</TabItem>
<TabItem Header="{ll:Str '玩耍'}">
<ListBox x:Name="lbPlay" />
<TabItem x:Name="tis" Header="{ll:Str '学习'}">
<ListBox x:Name="lbStudy" SelectionChanged="lbStudy_SelectionChanged" />
</TabItem>
<TabItem Header="{ll:Str '工作'}">
<ListBox x:Name="lbWork" />
<TabItem x:Name="tip" Header="{ll:Str '玩耍'}">
<ListBox x:Name="lbPlay" SelectionChanged="lbPlay_SelectionChanged" />
</TabItem>
</TabControl>
<Image x:Name="WorkViewImage" Grid.Column="1" Margin="10,10,10,33" Source="/Res/img/r_singlemoney_1.png" />
<Button Grid.Row="1" Grid.Column="1" VerticalAlignment="Bottom" Margin="5" Height="30" Content="开始工作"
Background="{DynamicResource DARKPrimary}" BorderThickness="1" pu:ButtonHelper.CornerRadius="5"
BorderBrush="{DynamicResource DARKPrimaryDarker}" Foreground="{DynamicResource DARKPrimaryText}"
FontWeight="Bold" FontSize="20" IsEnabled="False" />
<Label Background="{x:Null}" Grid.Column="1" VerticalAlignment="Bottom" Content="请从侧边栏选择工作" FontSize="24"
<Button x:Name="btnStart" Grid.Row="1" Grid.Column="1" VerticalAlignment="Bottom" Margin="5" Height="30"
Content="{ll:Str 开始工作}" Background="{DynamicResource DARKPrimary}" BorderThickness="1"
pu:ButtonHelper.CornerRadius="5" BorderBrush="{DynamicResource DARKPrimaryDarker}"
Foreground="{DynamicResource DARKPrimaryText}" FontWeight="Bold" FontSize="20" IsEnabled="False" />
<Label x:Name="lName" Background="{x:Null}" Grid.Column="1" VerticalAlignment="Bottom" Content="{ll:Str 请从侧边栏选择}" FontSize="24"
Foreground="{DynamicResource DARKPrimaryDark}" FontWeight="Bold" />
<TextBlock Grid.Column="1" VerticalAlignment="Top" Grid.Row="1" Margin="10,5,0,0" HorizontalAlignment="Left">
<Run Text="{ll:Str '获得内容'}" /> : <LineBreak />
<Run Text="{ll:Str '获取效率'}" /> : <LineBreak />
<Run Text="{ll:Str '饱腹消耗'}" /> : <LineBreak />
<Run Text="{ll:Str '口渴消耗'}" /> : <LineBreak />
<Run Text="{ll:Str '心情消耗'}" /> : <LineBreak />
<Run Text="{ll:Str '等级限制'}" /> : <LineBreak />
<Run Text="{ll:Str '花费时间'}" /> : <LineBreak />
<Run Text="{ll:Str '奖励倍率'}" /> : <LineBreak />
<Run Text="{ll:Str '倍率调整'}" /> :
</TextBlock>
<TextBlock x:Name="tbDisplay" Grid.Column="1" VerticalAlignment="Top" Grid.Row="1" Margin="150,5,0,0"
HorizontalAlignment="Left" />
<Slider x:Name="wDouble" Grid.Column="1" Margin="20,190,20,0" Grid.Row="1" VerticalAlignment="Top"
SmallChange="1" Value="1" Minimum="1" IsEnabled="False" TickFrequency="1" IsSnapToTickEnabled="True"
ValueChanged="wDouble_ValueChanged" LargeChange="1" Style="{DynamicResource StandardSliderStyle}"
TickPlacement="Both" />
</Grid>
</Window>

@ -1,4 +1,5 @@
using System;
using LinePutScript.Localization.WPF;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
@ -11,6 +12,8 @@ using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using VPet_Simulator.Core;
using VPet_Simulator.Windows.Interface;
using static VPet_Simulator.Core.GraphHelper;
namespace VPet_Simulator.Windows;
@ -23,25 +26,148 @@ public partial class winWorkMenu : Window
List<Work> ws;
List<Work> ss;
List<Work> ps;
public winWorkMenu(MainWindow mw)
public winWorkMenu(MainWindow mw, Work.WorkType type)
{
InitializeComponent();
this.mw = mw;
mw.Main.WorkList(out ws, out ss, out ps);
if (ws.Count == 0)
tbc.Items.Remove(tiw);
else
foreach (var v in ws)
{
lbWork.Items.Add(v.NameTrans);
}
if (ss.Count == 0)
tbc.Items.Remove(tis);
else
foreach (var v in ss)
{
lbStudy.Items.Add(v.NameTrans);
}
if (ps.Count == 0)
tbc.Items.Remove(tip);
else
foreach (var v in ps)
{
lbPlay.Items.Add(v.NameTrans);
}
foreach (var v in ws)
tbc.SelectedIndex = (int)type;
}
private bool AllowChange = false;
Work nowwork;
public void ShowWork()
{
AllowChange = false;
btnStart.IsEnabled = true;
//判断倍率
if (nowwork.LevelLimit > mw.GameSavesData.GameSave.Level)
{
lbWork.Items.Add(v.NameTrans);
wDouble.IsEnabled = false;
wDouble.Value = 1;
}
foreach (var v in ss)
else
{
lbStudy.Items.Add(v.NameTrans);
int max = mw.GameSavesData.GameSave.Level / (nowwork.LevelLimit + 10);
if (max <= 1)
{
wDouble.IsEnabled = false;
wDouble.Value = 1;
}
else
{
wDouble.IsEnabled = true;
wDouble.Maximum = max;
wDouble.Value = mw.Set.GameData.GetDouble("workmenu_" + nowwork.Name, 1);
}
}
foreach (var v in ps)
if (wDouble.Value == 1)
ShowWork(nowwork);
else
ShowWork(nowwork.Double((int)wDouble.Value));
AllowChange = true;
}
public void ShowWork(Work work)
{
lName.Content = work.NameTrans;
//显示图像
string source = mw.ImageSources.FindSource(work.Graph);
if (source == null)
{
lbPlay.Items.Add(v.NameTrans);
source = mw.ImageSources.FindSource(work.Name);
}
if (source == null)
{
//尝试显示默认图像
WorkViewImage.Source = Interface.ImageResources.NewSafeBitmapImage("pack://application:,,,/Res/img/error.png");
}
else
{
WorkViewImage.Source = Interface.ImageResources.NewSafeBitmapImage(source);
}
StringBuilder sb = new StringBuilder();
if (work.Type == Work.WorkType.Work)
sb.AppendLine("金钱".Translate());
else
sb.AppendLine("经验".Translate());
sb.AppendLine(work.Get().ToString("f2"));
sb.AppendLine(work.StrengthFood.ToString("f2"));
sb.AppendLine(work.StrengthDrink.ToString("f2"));
sb.AppendLine(work.Feeling.ToString("f2"));
sb.AppendLine(work.LevelLimit.ToString("f0"));
if (work.Time > 100)
sb.AppendLine((work.Time / 60).ToString("f2") + 'h');
else
sb.AppendLine(work.Time.ToString() + 'm');
sb.AppendLine('x' + (1 + work.FinishBonus).ToString("f2"));
sb.AppendLine('x' + wDouble.Value.ToString("f0"));
tbDisplay.Text = sb.ToString();
}
private void tbc_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
switch (tbc.SelectedIndex)
{
case 0:
btnStart.Content = "开始工作".Translate();
break;
case 1:
btnStart.Content = "开始学习".Translate();
break;
case 2:
btnStart.Content = "开始玩耍".Translate();
break;
}
}
private void wDouble_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!AllowChange) return;
ShowWork(nowwork.Double((int)wDouble.Value));
}
private void lbWork_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
nowwork = (ws[lbWork.SelectedIndex]);
ShowWork();
}
private void lbStudy_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
nowwork = (ss[lbStudy.SelectedIndex]);
ShowWork();
}
private void lbPlay_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
nowwork = (ps[lbPlay.SelectedIndex]);
ShowWork();
}
private void Window_Closed(object sender, EventArgs e)
{
mw.winWorkMenu = null;
}
}

@ -11,7 +11,7 @@ work:|Type#Work:|Name#直播:|MoneyBase#28:|Graph#worktwo:|StrengthFood#5:|Stren
work:|Type#Study:|Name#学习:|MoneyBase#80:|Graph#study:|StrengthFood#2:|StrengthDrink#2:|Feeling#3:|Time#45:|FinishBonus#0.2:|BorderBrush#000000:|Background#413d39:|ButtonBackground#322e2b:|ButtonForeground#FFFFFF:|Foreground#ccbdad:|Left#113:|Top#315:|Width#280:|
work:|Type#Study:|Name#研究:|MoneyBase#120:|Graph#studytwo:|StrengthFood#2.5:|StrengthDrink#3.5:|Feeling#4:|Time#75:|FinishBonus#0.4:|BorderBrush#000000:|Background#413d39:|ButtonBackground#322e2b:|LevelLimit#15:|ButtonForeground#FFFFFF:|Foreground#ccbdad:|Left#113:|Top#315:|Width#280:|
work:|Type#Play:|Name#玩游戏:|MoneyBase#18:|Graph#playone:|StrengthFood#1:|StrengthDrink#1.5:|Feeling#-1:|Time#30:|FinishBonus#0.2:|BorderBrush#000000:|Background#413d39:|ButtonBackground#322e2b:|ButtonForeground#FFFFFF:|Foreground#ccbdad:|Left#113:|Top#315:|Width#280:|
work:|Type#Play:|Name#删错误:|MoneyBase#20:|Graph#removeobject:|StrengthFood#0.5:|StrengthDrink#0.5:|Feeling#-1:|Time#60:|FinishBonus#0.25:|BorderBrush#000000:|Background#413d39:|ButtonBackground#322e2b:|ButtonForeground#FFFFFF:|Foreground#ccbdad:|Left#113:|Top#315:|Width#280:|LevelLimit#6:|
work:|Type#Play:|Name#删错误:|MoneyBase#18:|Graph#removeobject:|StrengthFood#0.5:|StrengthDrink#0.5:|Feeling#-0.5:|Time#60:|FinishBonus#0.25:|BorderBrush#000000:|Background#413d39:|ButtonBackground#322e2b:|ButtonForeground#FFFFFF:|Foreground#ccbdad:|Left#113:|Top#315:|Width#280:|LevelLimit#6:|
move:|graph#climb.left:|LocateType#Left:|LocateLength#145:|TriggerLeft#100:|TriggerTop#200:|TriggerType#65:|CheckType#64:|CheckTop#100:|SpeedY#-10:|Distance#7:|ModeType#14:|
move:|graph#climb.left:|LocateType#Left:|LocateLength#145:|TriggerLeft#100:|TriggerBottom#200:|TriggerType#129:|CheckType#128:|CheckBottom#100:|SpeedY#10:|Distance#7:|ModeType#14:|
move:|graph#climb.right:|LocateType#Right:|LocateLength#185:|TriggerRight#100:|TriggerTop#200:|TriggerType#66:|CheckType#64:|CheckTop#100:|SpeedY#-10:|Distance#7:|ModeType#14:|