VPet/VPet-Simulator.Core/Display/MainLogic.cs

417 lines
15 KiB
C#
Raw Normal View History

2022-12-13 07:10:18 +00:00
using System;
using System.Threading.Tasks;
using System.Timers;
2022-12-14 18:17:13 +00:00
using System.Windows;
2022-12-13 07:10:18 +00:00
namespace VPet_Simulator.Core
{
public partial class Main
{
2023-01-24 15:47:16 +00:00
public const int DistanceMax = 100;
public const int DistanceMid = 100;
public const int DistanceMin = 50;
2023-01-25 04:49:18 +00:00
public const int LoopProMax = 20;
2023-01-24 15:47:16 +00:00
public const int LoopMax = 10;
public const int LoopMid = 7;
public const int LoopMin = 5;
2023-01-26 15:15:37 +00:00
public const int TreeRND = 5;
2022-12-14 18:17:13 +00:00
2023-04-01 19:31:28 +00:00
/// <summary>
/// 处理说话内容
/// </summary>
public event Action<string> OnSay;
2023-06-14 11:14:04 +00:00
/// <summary>
/// 上次交互时间
/// </summary>
public DateTime LastInteractionTime { get; set; } = DateTime.Now;
2023-04-04 16:21:46 +00:00
/// <summary>
/// 事件Timer
/// </summary>
2022-12-13 07:10:18 +00:00
public Timer EventTimer = new Timer(15000)
{
AutoReset = true,
Enabled = true
};
2023-05-26 16:05:59 +00:00
readonly GraphCore.Helper.SayType[] sayTypes = new GraphCore.Helper.SayType[] { GraphCore.Helper.SayType.Serious, GraphCore.Helper.SayType.Shining, GraphCore.Helper.SayType.Self };
public void SayRnd(string text)
{
Say(text, sayTypes[Function.Rnd.Next(sayTypes.Length)]);
}
2023-01-27 17:44:57 +00:00
/// <summary>
/// 说话
/// </summary>
/// <param name="text">说话内容</param>
2023-06-08 21:06:46 +00:00
public void Say(string text, GraphCore.Helper.SayType type = GraphCore.Helper.SayType.Shining, bool force = false)
2023-01-26 15:15:37 +00:00
{
2023-05-25 11:02:13 +00:00
Task.Run(() =>
{
OnSay?.Invoke(text);
2023-06-08 21:06:46 +00:00
if (force || type != GraphCore.Helper.SayType.None && DisplayType == GraphCore.GraphType.Default)
2023-05-25 11:02:13 +00:00
Display(GraphCore.Helper.Convert(type, GraphCore.Helper.AnimatType.A_Start), () =>
{
Dispatcher.Invoke(() => MsgBar.Show(Core.Save.Name, text, type));
Saying(type);
});
else
2023-01-27 17:44:57 +00:00
{
2023-03-28 13:18:14 +00:00
Dispatcher.Invoke(() => MsgBar.Show(Core.Save.Name, text, type));
2023-05-25 11:02:13 +00:00
}
});
2023-01-26 15:15:37 +00:00
}
2023-04-01 19:31:28 +00:00
2023-03-28 13:18:14 +00:00
public void Saying(GraphCore.Helper.SayType type)
2023-01-26 15:15:37 +00:00
{
2023-03-28 13:18:14 +00:00
Display(GraphCore.Helper.Convert(type, GraphCore.Helper.AnimatType.B_Loop), () => Saying(type));
2023-01-26 15:15:37 +00:00
}
2023-05-10 03:13:34 +00:00
/// <summary>
/// 根据消耗计算相关数据
/// </summary>
/// <param name="TimePass">过去时间倍率</param>
public void FunctionSpend(double TimePass)
2022-12-13 07:10:18 +00:00
{
2023-01-22 17:33:13 +00:00
Core.Save.CleanChange();
2023-06-03 21:51:58 +00:00
Core.Save.StoreTake();
2023-06-14 11:14:04 +00:00
double freedrop = (DateTime.Now - LastInteractionTime).TotalMinutes;
if (freedrop < 1)
2023-06-18 18:11:40 +00:00
freedrop = 0.5 * TimePass;
2023-06-14 11:14:04 +00:00
else
freedrop = Math.Sqrt(freedrop) * TimePass;
2023-05-19 08:17:51 +00:00
switch (State)
2023-05-10 03:13:34 +00:00
{
2023-05-19 08:17:51 +00:00
case WorkingState.Sleep:
//睡觉消耗
if (Core.Save.StrengthFood >= 25)
{
2023-05-23 08:23:47 +00:00
Core.Save.StrengthChange(TimePass * 4);
2023-05-19 08:17:51 +00:00
if (Core.Save.StrengthFood >= 75)
2023-05-23 08:23:47 +00:00
Core.Save.Health += TimePass * 2;
2023-05-19 08:17:51 +00:00
}
2023-06-14 11:14:04 +00:00
Core.Save.StrengthChangeFood(-TimePass / 2);
Core.Save.StrengthChangeDrink(-TimePass / 2);
Core.Save.FeelingChange(-freedrop / 2);
2023-05-19 08:17:51 +00:00
break;
case WorkingState.WorkONE:
2023-05-23 08:23:47 +00:00
//工作
if (Core.Save.StrengthFood <= 25)
{
if (Core.Save.Strength >= TimePass)
{
Core.Save.StrengthChange(-TimePass);
}
else
{
Core.Save.Health -= TimePass;
}
2023-06-08 11:44:41 +00:00
var addmoney = TimePass * 5;
2023-05-23 08:23:47 +00:00
Core.Save.Money += addmoney;
WorkTimer.GetCount += addmoney;
}
else
{
2023-06-08 11:44:41 +00:00
Core.Save.StrengthChangeFood(TimePass);
2023-05-23 08:23:47 +00:00
if (Core.Save.StrengthFood >= 75)
Core.Save.Health += TimePass;
2023-06-08 11:44:41 +00:00
var addmoney = TimePass * (10 + Core.Save.Level / 2);
2023-05-23 08:23:47 +00:00
Core.Save.Money += addmoney;
WorkTimer.GetCount += addmoney;
}
2023-06-14 11:14:04 +00:00
Core.Save.StrengthChangeFood(-TimePass * 3.5);
Core.Save.StrengthChangeDrink(-TimePass * 2.5);
Core.Save.FeelingChange(-freedrop * 1.5);
2023-05-23 08:23:47 +00:00
break;
2023-05-19 08:17:51 +00:00
case WorkingState.WorkTWO:
2023-05-23 08:23:47 +00:00
//工作2 更加消耗体力
if (Core.Save.StrengthFood <= 25)
{
if (Core.Save.Strength >= TimePass * 2)
{
Core.Save.StrengthChange(-TimePass * 2);
}
else
{
Core.Save.Health -= TimePass;
}
2023-06-08 11:44:41 +00:00
var addmoney = TimePass * 10;
2023-05-23 08:23:47 +00:00
Core.Save.Money += addmoney;
WorkTimer.GetCount += addmoney;
}
else
{
if (Core.Save.StrengthFood >= 75)
Core.Save.Health += TimePass;
2023-06-08 11:44:41 +00:00
var addmoney = TimePass * (20 + Core.Save.Level);
2023-05-23 08:23:47 +00:00
Core.Save.Money += addmoney;
WorkTimer.GetCount += addmoney;
}
2023-06-14 11:14:04 +00:00
Core.Save.StrengthChangeFood(-TimePass * 4.5);
Core.Save.StrengthChangeDrink(-TimePass * 7.5);
Core.Save.FeelingChange(-freedrop * 2.5);
2023-05-23 08:23:47 +00:00
break;
2023-05-19 08:17:51 +00:00
case WorkingState.Study:
2023-05-23 08:23:47 +00:00
//学习
if (Core.Save.StrengthFood <= 25)
{
if (Core.Save.Strength >= TimePass)
{
Core.Save.StrengthChange(-TimePass);
}
else
{
Core.Save.Health -= TimePass;
}
2023-06-18 18:11:40 +00:00
var addmoney = TimePass * (10 + Core.Save.Level);
2023-05-23 08:23:47 +00:00
Core.Save.Exp += addmoney;
WorkTimer.GetCount += addmoney;
}
else
{
Core.Save.StrengthChange(TimePass);
if (Core.Save.StrengthFood >= 75)
Core.Save.Health += TimePass;
2023-06-18 18:11:40 +00:00
var addmoney = TimePass * (30 + Core.Save.Level);
2023-05-23 08:23:47 +00:00
Core.Save.Exp += addmoney;
WorkTimer.GetCount += addmoney;
}
2023-06-18 18:11:40 +00:00
Core.Save.StrengthChangeFood(-TimePass * 1.5);
Core.Save.StrengthChangeDrink(-TimePass * 2);
2023-06-14 11:14:04 +00:00
Core.Save.FeelingChange(-freedrop * 3);
2023-06-08 11:44:41 +00:00
goto default;
2023-05-19 08:17:51 +00:00
default://默认
//饮食等乱七八糟的消耗
if (Core.Save.StrengthFood >= 50)
{
2023-05-23 08:23:47 +00:00
Core.Save.StrengthChange(TimePass * 2);
2023-05-19 08:17:51 +00:00
if (Core.Save.StrengthFood >= 75)
2023-05-23 08:23:47 +00:00
Core.Save.Health += Function.Rnd.Next(0, 2) * TimePass;
2023-05-19 08:17:51 +00:00
}
else if (Core.Save.StrengthFood <= 25)
{
Core.Save.Health -= Function.Rnd.Next(0, 1) * TimePass;
}
2023-06-14 11:14:04 +00:00
Core.Save.StrengthChangeFood(-TimePass * 1.5);
Core.Save.StrengthChangeDrink(-TimePass * 1.5);
Core.Save.FeelingChange(-freedrop);
2023-06-10 10:05:01 +00:00
break;
2023-05-10 03:13:34 +00:00
}
2023-05-19 08:17:51 +00:00
2023-05-10 03:13:34 +00:00
//if (Core.GameSave.Strength <= 40)
//{
// Core.GameSave.Health -= Function.Rnd.Next(0, 1);
//}
2023-05-23 08:23:47 +00:00
Core.Save.Exp += TimePass;
2023-05-10 03:13:34 +00:00
//感受提升好感度
if (Core.Save.Feeling >= 75)
{
if (Core.Save.Feeling >= 90)
{
Core.Save.Likability += TimePass;
}
2023-05-23 08:23:47 +00:00
Core.Save.Exp += TimePass * 2;
2023-05-10 03:13:34 +00:00
Core.Save.Health += TimePass;
}
else if (Core.Save.Feeling <= 25)
{
Core.Save.Likability -= TimePass;
Core.Save.Exp -= TimePass;
2023-05-10 03:13:34 +00:00
}
if (Core.Save.StrengthDrink <= 25)
{
Core.Save.Health -= Function.Rnd.Next(0, 1) * TimePass;
Core.Save.Exp -= TimePass;
2023-05-10 03:13:34 +00:00
}
else if (Core.Save.StrengthDrink >= 75)
Core.Save.Health += Function.Rnd.Next(0, 1) * TimePass;
2023-06-18 22:20:06 +00:00
FunctionSpendHandle?.Invoke();
2023-05-10 03:13:34 +00:00
var newmod = Core.Save.CalMode();
if (Core.Save.Mode != newmod)
{
2023-05-15 10:44:30 +00:00
//TODO:切换显示动画
2023-05-10 03:13:34 +00:00
Core.Save.Mode = newmod;
2023-05-23 08:23:47 +00:00
//TODO:看情况播放停止工作动画
if (newmod == GameSave.ModeType.Ill && (State != WorkingState.Nomal || State != WorkingState.Sleep))
{
WorkTimer.Stop();
}
2023-05-10 03:13:34 +00:00
}
}
2023-06-18 22:20:06 +00:00
public event Action FunctionSpendHandle;
2023-05-10 03:13:34 +00:00
private void EventTimer_Elapsed(object sender, ElapsedEventArgs e)
2023-05-19 08:17:51 +00:00
{
2023-01-08 16:57:10 +00:00
//所有Handle
TimeHandle?.Invoke(this);
2023-01-21 14:16:13 +00:00
if (Core.Controller.EnableFunction)
2023-01-20 12:42:00 +00:00
{
2023-06-08 11:44:41 +00:00
FunctionSpend(0.05);
2023-01-20 12:42:00 +00:00
}
2023-01-21 14:16:13 +00:00
else
2023-01-20 12:42:00 +00:00
{
2023-06-05 09:18:27 +00:00
//Core.Save.Mode = GameSave.ModeType.Happy;
2023-05-09 23:16:58 +00:00
//Core.GameSave.Mode = GameSave.ModeType.Ill;
2023-06-05 09:18:27 +00:00
Core.Save.Mode = NoFunctionMOD;
2023-01-20 12:42:00 +00:00
}
2023-01-19 15:26:58 +00:00
2023-01-08 16:57:10 +00:00
//UIHandle
Dispatcher.Invoke(() => TimeUIHandle.Invoke(this));
2023-01-20 12:42:00 +00:00
if (DisplayType == GraphCore.GraphType.Default && !isPress)
if (Core.Save.Mode == GameSave.ModeType.Ill)
{//生病时候的随机
2022-12-14 18:17:13 +00:00
}
else//TODO:制作随机列表
switch (Function.Rnd.Next(Math.Max(20, Core.Controller.InteractionCycle - CountNomal)))
{
case 0:
//随机向右
DisplayWalk_Left();
break;
case 1:
DisplayClimb_Left_UP();
break;
case 2:
DisplayClimb_Left_DOWN();
break;
case 3:
DisplayClimb_Right_UP();
break;
case 4:
DisplayClimb_Right_DOWN();
break;
case 5:
DisplayWalk_Right();
break;
case 6:
DisplayFall_Left();
break;
case 7:
DisplayFall_Right();
break;
case 8:
DisplayClimb_Top_Right();
break;
case 9:
DisplayClimb_Top_Left();
break;
case 10:
DisplayCrawl_Left();
break;
case 11:
DisplayCrawl_Right();
break;
case 13:
case 14:
DisplaySleep();
break;
case 15:
case 16:
DisplayBoring();
break;
case 18:
case 17:
DisplaySquat();
break;
case 12:
case 19:
case 20:
DisplayIdel_StateONE();
break;
default:
break;
}
2023-01-19 15:26:58 +00:00
2022-12-13 07:10:18 +00:00
}
2022-12-14 18:17:13 +00:00
/// <summary>
/// 定点移动位置向量
/// </summary>
private Point MoveTimerPoint = new Point(0, 0);
/// <summary>
/// 定点移动定时器
/// </summary>
private Timer MoveTimer = new Timer(125)
{
AutoReset = true,
};
2023-01-24 06:56:16 +00:00
/// <summary>
/// 设置计算间隔
/// </summary>
/// <param name="Interval">计算间隔</param>
public void SetLogicInterval(int Interval)
{
EventTimer.Interval = Interval;
}
private Timer SmartMoveTimer = new Timer(20 * 60)
{
AutoReset = true,
};
/// <summary>
/// 是否启用智能移动
/// </summary>
private bool SmartMove;
/// <summary>
/// 设置移动模式
/// </summary>
/// <param name="AllowMove">允许移动</param>
2023-04-04 16:21:46 +00:00
/// <param name="smartMove">启用智能移动</param>
2023-01-24 06:56:16 +00:00
/// <param name="SmartMoveInterval">智能移动周期</param>
public void SetMoveMode(bool AllowMove, bool smartMove, int SmartMoveInterval)
{
2023-04-03 18:11:12 +00:00
MoveTimer.Enabled = false;
2023-01-24 06:56:16 +00:00
if (AllowMove)
{
MoveTimer.AutoReset = true;
if (smartMove)
{
SmartMoveTimer.Interval = SmartMoveInterval;
SmartMoveTimer.Start();
SmartMove = true;
}
else
{
2023-04-04 09:32:53 +00:00
SmartMoveTimer.Enabled = false;
2023-01-24 06:56:16 +00:00
SmartMove = false;
}
}
else
{
MoveTimer.AutoReset = false;
}
}
2023-05-19 08:17:51 +00:00
/// <summary>
/// 当前状态
/// </summary>
public WorkingState State = WorkingState.Nomal;
/// <summary>
/// 当前正在的状态
/// </summary>
public enum WorkingState
{
/// <summary>
/// 默认:啥都没干
/// </summary>
Nomal,
/// <summary>
/// 正在干活1
/// </summary>
WorkONE,
/// <summary>
/// 正在干活1
/// </summary>
WorkTWO,
/// <summary>
/// 学习中
/// </summary>
Study,
/// <summary>
/// 睡觉
/// </summary>
Sleep,
///// <summary>
///// 玩耍中
///// </summary>
//Playing,
}
2022-12-13 07:10:18 +00:00
}
}