mirror of
https://github.com/LorisYounger/VPet.git
synced 2024-08-30 18:42:36 +00:00
分离消息栏,使其支持自定义
This commit is contained in:
parent
57be820e16
commit
26f927f668
@ -29,7 +29,7 @@ namespace VPet_Simulator.Core
|
||||
/// <summary>
|
||||
/// 消息栏
|
||||
/// </summary>
|
||||
public MessageBar MsgBar;
|
||||
public IMassageBar MsgBar;
|
||||
/// <summary>
|
||||
/// 工作显示栏
|
||||
/// </summary>
|
||||
@ -65,7 +65,7 @@ namespace VPet_Simulator.Core
|
||||
UIGrid.Children.Add(ToolBar);
|
||||
MsgBar = new MessageBar(this);
|
||||
MsgBar.Visibility = Visibility.Collapsed;
|
||||
UIGrid.Children.Add(MsgBar);
|
||||
UIGrid.Children.Add(MsgBar.This);
|
||||
labeldisplaytimer.Elapsed += Labledisplaytimer_Elapsed;
|
||||
|
||||
if (loadtouchevent)
|
||||
|
@ -41,6 +41,9 @@ namespace VPet_Simulator.Core
|
||||
/// 说话
|
||||
/// </summary>
|
||||
/// <param name="text">说话内容</param>
|
||||
/// <param name="graphname">图像名</param>
|
||||
/// <param name="desc">描述</param>
|
||||
/// <param name="force">强制显示图像</param>
|
||||
public void Say(string text, string graphname = null, bool force = false, string desc = null)
|
||||
{
|
||||
Task.Run(() =>
|
||||
@ -51,9 +54,8 @@ namespace VPet_Simulator.Core
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(desc))
|
||||
MsgBar.MessageBoxContent.Children.Add(new TextBlock() { Text = desc, FontSize = 20, ToolTip = desc, HorizontalAlignment = System.Windows.HorizontalAlignment.Right });
|
||||
MsgBar.Show(Core.Save.Name, text, graphname);
|
||||
MsgBar.Show(Core.Save.Name, text, graphname, (string.IsNullOrWhiteSpace(desc) ? null :
|
||||
new TextBlock() { Text = desc, FontSize = 20, ToolTip = desc, HorizontalAlignment = HorizontalAlignment.Right }));
|
||||
});
|
||||
DisplayBLoopingForce(graphname);
|
||||
});
|
||||
@ -61,9 +63,38 @@ namespace VPet_Simulator.Core
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(desc))
|
||||
MsgBar.MessageBoxContent.Children.Add(new TextBlock() { Text = desc, FontSize = 20, ToolTip = desc, HorizontalAlignment = System.Windows.HorizontalAlignment.Right });
|
||||
MsgBar.Show(Core.Save.Name, text);
|
||||
MsgBar.Show(Core.Save.Name, text, msgcontent: (string.IsNullOrWhiteSpace(desc) ? null :
|
||||
new TextBlock() { Text = desc, FontSize = 20, ToolTip = desc, HorizontalAlignment = HorizontalAlignment.Right }));
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
/// <summary>
|
||||
/// 说话
|
||||
/// </summary>
|
||||
/// <param name="text">说话内容</param>
|
||||
/// <param name="graphname">图像名</param>
|
||||
/// <param name="msgcontent">消息内容</param>
|
||||
/// <param name="force">强制显示图像</param>
|
||||
public void Say(string text, UIElement msgcontent, string graphname = null, bool force = false)
|
||||
{
|
||||
Task.Run(() =>
|
||||
{
|
||||
OnSay?.Invoke(text);
|
||||
if (force || !string.IsNullOrWhiteSpace(graphname) && DisplayType.Type == GraphType.Default)//这里不使用idle是因为idle包括学习等
|
||||
Display(graphname, AnimatType.A_Start, () =>
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
MsgBar.Show(Core.Save.Name, text, graphname, msgcontent);
|
||||
});
|
||||
DisplayBLoopingForce(graphname);
|
||||
});
|
||||
else
|
||||
{
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
MsgBar.Show(Core.Save.Name, text, msgcontent: msgcontent);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
@ -11,11 +11,43 @@ using Timer = System.Timers.Timer;
|
||||
|
||||
namespace VPet_Simulator.Core
|
||||
{
|
||||
public interface IMassageBar : IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// 显示消息
|
||||
/// </summary>
|
||||
/// <param name="name">名字</param>
|
||||
/// <param name="text">内容</param>
|
||||
/// <param name="graphname">图像名</param>
|
||||
/// <param name="msgcontent">消息框内容</param>
|
||||
void Show(string name, string text, string graphname = null, UIElement msgcontent = null);
|
||||
/// <summary>
|
||||
/// 强制关闭
|
||||
/// </summary>
|
||||
void ForceClose();
|
||||
/// <summary>
|
||||
/// 设置位置在桌宠内
|
||||
/// </summary>
|
||||
void SetPlaceIN();
|
||||
/// <summary>
|
||||
/// 设置位置在桌宠外
|
||||
/// </summary>
|
||||
void SetPlaceOUT();
|
||||
/// <summary>
|
||||
/// 显示状态
|
||||
/// </summary>
|
||||
Visibility Visibility { get; set; }
|
||||
/// <summary>
|
||||
/// 该消息框的UIElement
|
||||
/// </summary>
|
||||
UIElement This { get; }
|
||||
}
|
||||
/// <summary>
|
||||
/// MessageBar.xaml 的交互逻辑
|
||||
/// </summary>
|
||||
public partial class MessageBar : UserControl, IDisposable
|
||||
public partial class MessageBar : UserControl, IDisposable, IMassageBar
|
||||
{
|
||||
public UIElement This => this;
|
||||
Main m;
|
||||
public MessageBar(Main m)
|
||||
{
|
||||
@ -91,7 +123,7 @@ namespace VPet_Simulator.Core
|
||||
public Action EndAction;
|
||||
private void EndTimer_Elapsed(object sender, ElapsedEventArgs e)
|
||||
{
|
||||
|
||||
|
||||
if (--timeleft <= 0)
|
||||
{
|
||||
EndTimer.Stop();
|
||||
@ -109,12 +141,13 @@ namespace VPet_Simulator.Core
|
||||
/// </summary>
|
||||
/// <param name="name">名字</param>
|
||||
/// <param name="text">内容</param>
|
||||
public void Show(string name, string text, string graphname = null)
|
||||
public void Show(string name, string text, string graphname = null, UIElement msgcontent = null)
|
||||
{
|
||||
if (m.UIGrid.Children.IndexOf(this) != m.UIGrid.Children.Count - 1)
|
||||
{
|
||||
Panel.SetZIndex(this, m.UIGrid.Children.Count - 1);
|
||||
}
|
||||
MessageBoxContent.Children.Clear();
|
||||
TText.Text = "";
|
||||
outputtext = text.ToList();
|
||||
LName.Content = name;
|
||||
@ -123,6 +156,10 @@ namespace VPet_Simulator.Core
|
||||
this.Visibility = Visibility.Visible;
|
||||
Opacity = .8;
|
||||
graphName = graphname;
|
||||
if (msgcontent != null)
|
||||
{
|
||||
MessageBoxContent.Children.Add(msgcontent);
|
||||
}
|
||||
}
|
||||
|
||||
public void Border_MouseEnter(object sender, MouseEventArgs e)
|
||||
|
346
VPet-Simulator.Windows.Interface/VpetSave.cs
Normal file
346
VPet-Simulator.Windows.Interface/VpetSave.cs
Normal file
@ -0,0 +1,346 @@
|
||||
using LinePutScript.Converter;
|
||||
using LinePutScript;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VPet_Simulator.Core;
|
||||
using static VPet_Simulator.Core.IGameSave;
|
||||
|
||||
namespace VPet_Simulator.Windows.Interface;
|
||||
|
||||
/// <summary>
|
||||
/// 游戏存档 桌宠桌面端订制版本
|
||||
/// </summary>
|
||||
public class VpetSave : IGameSave
|
||||
{
|
||||
/// <summary>
|
||||
/// 宠物名字
|
||||
/// </summary>
|
||||
[Line(name: "name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 金钱
|
||||
/// </summary>
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat, Name = "money")]
|
||||
public double Money { get; set; }
|
||||
/// <summary>
|
||||
/// 经验值
|
||||
/// </summary>
|
||||
[Line(type: LPSConvert.ConvertType.ToFloat, name: "exp")] public double Exp { get; set; }
|
||||
/// <summary>
|
||||
/// 等级
|
||||
/// </summary>
|
||||
public int Level => Exp < 0 ? 1 : (int)(Math.Sqrt(Exp) / 10) + 1;
|
||||
/// <summary>
|
||||
/// 升级所需经验值
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public int LevelUpNeed() => (int)(Math.Pow((Level) * 10, 2));
|
||||
/// <summary>
|
||||
/// 体力 0-100
|
||||
/// </summary>
|
||||
public double Strength { get => strength; set => strength = Math.Min(StrengthMax, Math.Max(0, value)); }
|
||||
|
||||
public double StrengthMax { get; } = 100;
|
||||
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat, IgnoreCase = true)]
|
||||
protected double strength { get; set; }
|
||||
/// <summary>
|
||||
/// 待补充的体力,随着时间缓慢加给桌宠
|
||||
/// </summary>//让游戏更有游戏性
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat, IgnoreCase = true)]
|
||||
public double StoreStrength { get; set; }
|
||||
/// <summary>
|
||||
/// 变化 体力
|
||||
/// </summary>
|
||||
public double ChangeStrength { get; set; } = 0;
|
||||
public void StrengthChange(double value)
|
||||
{
|
||||
ChangeStrength += value;
|
||||
Strength += value;
|
||||
}
|
||||
/// <summary>
|
||||
/// 饱腹度
|
||||
/// </summary>
|
||||
public double StrengthFood
|
||||
{
|
||||
get => strengthFood; set
|
||||
{
|
||||
value = Math.Min(100, value);
|
||||
if (value <= 0)
|
||||
{
|
||||
Health += value;
|
||||
strengthFood = 0;
|
||||
}
|
||||
else
|
||||
strengthFood = value;
|
||||
}
|
||||
}
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
protected double strengthFood { get; set; }
|
||||
/// <summary>
|
||||
/// 待补充的饱腹度,随着时间缓慢加给桌宠
|
||||
/// </summary>//让游戏更有游戏性
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
public double StoreStrengthFood { get; set; }
|
||||
public void StrengthChangeFood(double value)
|
||||
{
|
||||
ChangeStrengthFood += value;
|
||||
StrengthFood += value;
|
||||
}
|
||||
/// <summary>
|
||||
/// 变化 食物
|
||||
/// </summary>
|
||||
public double ChangeStrengthFood { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// 口渴度
|
||||
/// </summary>
|
||||
public double StrengthDrink
|
||||
{
|
||||
get => strengthDrink; set
|
||||
{
|
||||
value = Math.Min(100, value);
|
||||
if (value <= 0)
|
||||
{
|
||||
Health += value;
|
||||
strengthDrink = 0;
|
||||
}
|
||||
else
|
||||
strengthDrink = value;
|
||||
}
|
||||
}
|
||||
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
protected double strengthDrink { get; set; }
|
||||
/// <summary>
|
||||
/// 待补充的口渴度,随着时间缓慢加给桌宠
|
||||
/// </summary>//让游戏更有游戏性
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
public double StoreStrengthDrink { get; set; }
|
||||
/// <summary>
|
||||
/// 变化 口渴度
|
||||
/// </summary>
|
||||
public double ChangeStrengthDrink { get; set; } = 0;
|
||||
public void StrengthChangeDrink(double value)
|
||||
{
|
||||
ChangeStrengthDrink += value;
|
||||
StrengthDrink += value;
|
||||
}
|
||||
/// <summary>
|
||||
/// 心情
|
||||
/// </summary>
|
||||
public double Feeling
|
||||
{
|
||||
get => feeling; set
|
||||
{
|
||||
|
||||
value = Math.Min(100, value);
|
||||
if (value <= 0)
|
||||
{
|
||||
Health += value / 2;
|
||||
Likability += value / 2;
|
||||
feeling = 0;
|
||||
}
|
||||
else
|
||||
feeling = value;
|
||||
}
|
||||
}
|
||||
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
protected double feeling { get; set; }
|
||||
/// <summary>
|
||||
/// 待补充的心情,随着时间缓慢加给桌宠
|
||||
/// </summary>//让游戏更有游戏性
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
public double StoreFeeling { get; set; }
|
||||
/// <summary>
|
||||
/// 变化 心情
|
||||
/// </summary>
|
||||
public double ChangeFeeling { get; set; } = 0;
|
||||
public void FeelingChange(double value)
|
||||
{
|
||||
ChangeFeeling += value;
|
||||
Feeling += value;
|
||||
}
|
||||
/// <summary>
|
||||
/// 健康(生病)(隐藏)
|
||||
/// </summary>
|
||||
public double Health { get => health; set => health = Math.Min(100, Math.Max(0, value)); }
|
||||
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
protected double health { get; set; }
|
||||
/// <summary>
|
||||
/// 好感度(隐藏)(累加值)
|
||||
/// </summary>
|
||||
public double Likability
|
||||
{
|
||||
get => likability; set
|
||||
{
|
||||
var max = LikabilityMax;
|
||||
value = Math.Max(0, value);
|
||||
if (value > max)
|
||||
{
|
||||
likability = max;
|
||||
Health += value - max;
|
||||
}
|
||||
else
|
||||
likability = value;
|
||||
}
|
||||
}
|
||||
|
||||
[Line(Type = LPSConvert.ConvertType.ToFloat)]
|
||||
protected double likability { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 清除变化
|
||||
/// </summary>
|
||||
public void CleanChange()
|
||||
{
|
||||
ChangeStrength /= 2;
|
||||
ChangeFeeling /= 2;
|
||||
ChangeStrengthDrink /= 2;
|
||||
ChangeStrengthFood /= 2;
|
||||
}
|
||||
/// <summary>
|
||||
/// 取回被储存的体力
|
||||
/// </summary>
|
||||
public void StoreTake()
|
||||
{
|
||||
const int t = 10;
|
||||
var s = StoreFeeling / t;
|
||||
StoreFeeling -= s;
|
||||
if (Math.Abs(StoreFeeling) < 1)
|
||||
StoreFeeling = 0;
|
||||
else
|
||||
FeelingChange(s);
|
||||
|
||||
s = StoreStrength / t;
|
||||
StoreStrength -= s;
|
||||
if (Math.Abs(StoreStrength) < 1)
|
||||
StoreStrength = 0;
|
||||
else
|
||||
StrengthChange(s);
|
||||
|
||||
s = StoreStrengthDrink / t;
|
||||
StoreStrengthDrink -= s;
|
||||
if (Math.Abs(StoreStrengthDrink) < 1)
|
||||
StoreStrengthDrink = 0;
|
||||
else
|
||||
StrengthChangeDrink(s);
|
||||
|
||||
s = StoreStrengthFood / t;
|
||||
StoreStrengthFood -= s;
|
||||
if (Math.Abs(StoreStrengthFood) < 1)
|
||||
StoreStrengthFood = 0;
|
||||
else
|
||||
StrengthChangeFood(s);
|
||||
}
|
||||
/// <summary>
|
||||
/// 吃食物
|
||||
/// </summary>
|
||||
/// <param name="food">食物类</param>
|
||||
public void EatFood(IFood food)
|
||||
{
|
||||
Exp += food.Exp;
|
||||
var tmp = food.Strength / 2;
|
||||
StrengthChange(tmp);
|
||||
StoreStrength += tmp;
|
||||
tmp = food.StrengthFood / 2;
|
||||
StrengthChangeFood(tmp);
|
||||
StoreStrengthFood += tmp;
|
||||
tmp = food.StrengthDrink / 2;
|
||||
StrengthChangeDrink(tmp);
|
||||
StoreStrengthDrink += tmp;
|
||||
tmp = food.Feeling / 2;
|
||||
FeelingChange(tmp);
|
||||
StoreFeeling += tmp;
|
||||
Health += food.Health;
|
||||
Likability += food.Likability;
|
||||
}
|
||||
/// <summary>
|
||||
/// 宠物当前状态
|
||||
/// </summary>
|
||||
[Line(name: "mode")]
|
||||
public ModeType Mode { get; set; } = ModeType.Nomal;
|
||||
|
||||
public double LikabilityMax => 90 + Level * 10;
|
||||
|
||||
/// <summary>
|
||||
/// 计算宠物当前状态
|
||||
/// </summary>
|
||||
public ModeType CalMode()
|
||||
{
|
||||
int realhel = 60 - (Feeling >= 80 ? 12 : 0) - (Likability >= 80 ? 12 : (Likability >= 40 ? 6 : 0));
|
||||
//先从最次的开始
|
||||
if (Health <= realhel)
|
||||
{
|
||||
//可以确认从状态不佳和生病二选一
|
||||
if (Health <= realhel / 2)
|
||||
{//生病
|
||||
return ModeType.Ill;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ModeType.PoorCondition;
|
||||
}
|
||||
}
|
||||
//然后判断是高兴还是普通
|
||||
realhel = 90 - (Likability >= 80 ? 20 : (Likability >= 40 ? 10 : 0));
|
||||
if (Feeling >= realhel)
|
||||
{
|
||||
return ModeType.Happy;
|
||||
}
|
||||
else if (Feeling <= realhel / 2)
|
||||
{
|
||||
return ModeType.PoorCondition;
|
||||
}
|
||||
return ModeType.Nomal;
|
||||
}
|
||||
/// <summary>
|
||||
/// 新游戏
|
||||
/// </summary>
|
||||
public VpetSave(string name)
|
||||
{
|
||||
Name = name;
|
||||
Money = 100;
|
||||
Exp = 0;
|
||||
Strength = 100;
|
||||
StrengthFood = 100;
|
||||
StrengthDrink = 100;
|
||||
Feeling = 60;
|
||||
Health = 100;
|
||||
Likability = 0;
|
||||
Mode = CalMode();
|
||||
}
|
||||
/// <summary>
|
||||
/// 读档
|
||||
/// </summary>
|
||||
public VpetSave()
|
||||
{
|
||||
}
|
||||
/// <summary>
|
||||
/// 读档
|
||||
/// </summary>
|
||||
public static GameSave Load(ILine data) => LPSConvert.DeserializeObject<GameSave>(data);
|
||||
/// <summary>
|
||||
/// 存档
|
||||
/// </summary>
|
||||
/// <returns>存档行</returns>
|
||||
public Line ToLine()
|
||||
{
|
||||
//Line save = new Line("vpet", Name);
|
||||
//save.SetFloat("money", Money);
|
||||
//save.SetInt("exp", Exp);
|
||||
//save.SetFloat("strength", Strength);
|
||||
//save.SetFloat("strengthdrink", StrengthDrink);
|
||||
//save.SetFloat("strengthfood", StrengthFood);
|
||||
//save.SetFloat("feeling", Feeling);
|
||||
//save.SetFloat("health", Health);
|
||||
//save.SetFloat("Likability", Likability);
|
||||
return LPSConvert.SerializeObject(this, "vpet");
|
||||
}
|
||||
|
||||
}
|
@ -36,9 +36,7 @@ using static VPet_Simulator.Windows.Interface.ExtensionFunction;
|
||||
using Image = System.Windows.Controls.Image;
|
||||
using System.Data;
|
||||
using System.Windows.Media;
|
||||
#if SteamOutput
|
||||
using VPet.Solution;
|
||||
#endif
|
||||
|
||||
namespace VPet_Simulator.Windows
|
||||
{
|
||||
public partial class MainWindow : IMainWindow
|
||||
@ -1523,7 +1521,7 @@ namespace VPet_Simulator.Windows
|
||||
|
||||
//清空资源
|
||||
Main.Resources = Application.Current.Resources;
|
||||
Main.MsgBar.Resources = Application.Current.Resources;
|
||||
//Main.MsgBar.Resources = Application.Current.Resources;
|
||||
Main.ToolBar.Resources = Application.Current.Resources;
|
||||
|
||||
//加载主题:
|
||||
@ -1848,25 +1846,25 @@ namespace VPet_Simulator.Windows
|
||||
{
|
||||
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");
|
||||
var btn = 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();
|
||||
};
|
||||
return button;
|
||||
});
|
||||
Main.Say("哼哼~主人,我的考试成绩出炉了哦,快来和我一起看我的成绩单喵".Translate(), btn, "shining");
|
||||
});
|
||||
}
|
||||
#if NewYear
|
||||
|
Loading…
Reference in New Issue
Block a user