using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Timers; using System.Windows.Forms; using CDSAE3_Lian_Lian_Kan.Boards; using CDSAE3_Lian_Lian_Kan.Forms.Interface; using CDSAE3_Lian_Lian_Kan.Properties; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using static CDSAE3_Lian_Lian_Kan.Etcs; namespace CDSAE3_Lian_Lian_Kan.Forms { public partial class Leisure_Mode : Form, IGameMode { GameControl gameControl; public Leisure_Mode() { Etcs.gameModeForm = this; Etcs.current_block_theme = Theme.fruit; InitializeComponent(); upper_search.Item_Init(Resources.search, (70, 70), Color.FromArgb(253, 161, 60)); time.Text = (left_time / 60).ToString().PadLeft(2, '0') + ":" + (left_time % 60).ToString().PadLeft(2, '0'); upper_search_ori_position = upper_search.Location; timer = new System.Timers.Timer(1000); timer.Elapsed += Timer_Tick; timer.Enabled = false; gameControl = new GameControl((t) => t++); game_Panel.Controls.Add(gameControl); gameControl.Dock = DockStyle.Fill; } System.Timers.Timer timer; int hundred_up_timer = 0; Point upper_search_ori_position; int left_time = Etcs.left_time; bool is_pause = true; int cur_score = 0; int factor_val = 1; int current_base = 0; int search_left_time = 0; bool search_mode = false; Dictionary decrease_per_level = Etcs.decrease_per_level; private void Timer_Tick(object? sender, EventArgs e) { left_time--; BeginInvoke(() => time.Text = (left_time / 60).ToString().PadLeft(2, '0') + ":" + (left_time % 60).ToString().PadLeft(2, '0')); if (search_mode) { search_left_time--; if (search_left_time < 0) { search_mode = false; gameControl.Search_Handler(this, new SearchEventArgs { set_search = false }); BeginInvoke(() => upper_search.set_progress(0)); BeginInvoke(() => upper_search.Visible = false); } SuspendLayout(); BeginInvoke(() => upper_search.Location = new Point(upper_search_ori_position.X, upper_search_ori_position.Y + (int)(70 * (1 - ((search_left_time - hundred_up_timer * 0.1) / Etcs.search_left_time))))); BeginInvoke(() => upper_search.set_progress(70 - upper_search.Location.Y + upper_search_ori_position.Y)); ResumeLayout(); } if (current_base <= 0) { if (factor_val > 1) { current_base = 100; factor_val--; BeginInvoke(() => factor.Text = "x" + factor_val.ToString()); BeginInvoke(() => energy_bar.Value = current_base); } } else { current_base -= (int)decrease_per_level[factor_val]; if (current_base < 0) current_base = 0; BeginInvoke(() => energy_bar.Value = current_base); } if (left_time < 0) { timer.Enabled = false; Finished_Handler(this, new FinishArgs { finishType = FinishArgs.FinishType.Time_out }); } if (is_pause) { timer.Enabled = false; } } public void De_pause(object sender, EventArgs e) { if (is_pause) Sp_button_Click(sender, e); } public void Do_pause(object sender,EventArgs e) { if (!is_pause) Sp_button_Click(sender, e); } public void Score_Change(object sender, ChangeScoreArgs e) { cur_score += e.score * factor_val; current_base += e.score; while (current_base > 100) { if (factor_val >= 10) { factor_val = 10; current_base = 100; } else { current_base -= 100; factor_val++; } } BeginInvoke(() => factor.Text = "x" + factor_val.ToString()); BeginInvoke(() => energy_bar.Value = current_base); BeginInvoke(() => score.Text = cur_score.ToString()); } public void Sp_button_Click(object sender, EventArgs e) { if (is_pause) { sp_button.Image = Properties.Resources.pause; is_pause = false; timer.Enabled = true; } else { sp_button.Image = Properties.Resources.play_buttton; is_pause = true; timer.Enabled = false; } } public void Finished_Handler(object sender, FinishArgs e) { BeginInvoke(() => { timer.Close(); switch (e.finishType) { case FinishArgs.FinishType.All_done: Do_pause(this, new EventArgs()); Form form = new FinishedMessageBox(cur_score, Etcs.left_time - left_time); form.FormClosed += ((sender, args) => { Dispose(); Close(); Etcs.form?.change_form(charts, false, null, null); }); form.ShowDialog(); break; case FinishArgs.FinishType.Time_out: Thread thread = new Thread(() => MessageBox.Show("时间到!")); thread.Start(); back_Click(this, new EventArgs()); break; } }); } private void back_Click(object sender, EventArgs e) { Dispose(); Close(); timer.Close(); Etcs.gameMenuForm!.playFormToMenu(); } private void exchange_Click(object sender, EventArgs e) { Task.Run(() => gameControl.Exchange_Handler(this, new EventArgs())); } private void search_Click(object sender, EventArgs e) { gameControl.Search_Handler(this, new SearchEventArgs { set_search = true }); search_mode = true; search_left_time = Etcs.search_left_time; upper_search.Visible = true; } public void SetTheme() { Etcs.ThemeInfo themeInfo = Etcs.currentThemeInfo; BackColor = Color.FromArgb(themeInfo.ThemeColor![0], themeInfo.ThemeColor[1], themeInfo.ThemeColor[2]); //gameControl.BackColor = BackColor; //gameControl.BackgroundImage = (Image)res_Manager.GetObject(themeInfo.PictureName!, Etcs.res_Culture)!; if (themeInfo.PlayPanelUsePicture) { if (themeInfo.PlayPanelPictureIsOutPicture) BackgroundImage = new Bitmap(themeInfo.PlayPanelPictureName!); else BackgroundImage = (Image)res_Manager.GetObject(themeInfo.PictureName!, Etcs.res_Culture)!; } } public void GetGift_Handler(object sender, GiftArgs e){ } public void TogglePause() { Sp_button_Click(this, new EventArgs()); } public void Back() { back_Click(this, new EventArgs()); } } }