Files
JJBB/Assets/Project/Script/GUI/ImperialExam/ImpreialExamPanelCtr.cs

757 lines
25 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using GCGame.Table;
using Games.Mission;
using System;
public class ImpreialExamPanelCtr : MonoBehaviour
{
public static ImpreialExamPanelCtr Instance;
private void Awake()
{
Instance = this;
}
private void OnDestroy()
{
Instance = null;
}
public enum Question_Type
{
QUESTION_INVALID = -1,
QUESTION_XIANGSHI,
QUESTION_HUISHI,
QUESTION_DIANSHI,
QUESTION_BAOLINGDAN,
QUESTION_XINGJIULING,
}
Question_Type m_QuestionType = Question_Type.QUESTION_INVALID;
public Text ReaminTimeText; //活动剩余时间
public Text ActivityDescText; //活动描述
public Text ActivityAwardDescText; //活动奖励描述
public Text CurrentQuestionIndexText; //当前第几道
public Text QuestionDescText; //问题描述
public ToggleGroup m_ToggleGroup;
public Text[] m_AllAnswerTexts; //问题选项
public Toggle[] m_AllAnswerToggles; //问题Toggle
public Image[] m_AnswwerMarkIcon; //答案正确与否的标记
public Button closeBtn; //关闭按钮
public Button submitBtn; //提交按钮
//正确错误Icon
public Sprite wrongIcon;
public Sprite rightIcon;
public int m_SelectedAnswer; //选择的答案
public bool isSubmit = false; //当前问题是否已经提交答案
//乡试面板
public GameObject TimeAndAwardInfoPanel;
//会试殿试排行榜面板
public GameObject RankingListPanel;
//答案
public GameObject answerPanel;
public ImperialWaitTimePanel waitPanel;
//是否开启乡试计时器
private bool isImperialCountTime = false;
private int m_CurServerTime = 0;
private int m_ImperialExamOverTime = -1;
//答对的题目数
public int RightCountNum = 0;
public Text titleName; //当前活动名字
//屏蔽点击蒙版
public Image ClickMask;
public Text curWeekRightCount;
//超过活动时间屏蔽页面(文档没写)
public GameObject _ImperialPanel;
public GameObject _TimeOutPanel;
public Image _ItemIcon;
public Image _ItemQuality;
private static int _ItemId = 88001;
//乡试的时候显示的是奖励和答题信息
public void InitMyTimeAndAwardDescPanel()
{
ActivityDescText.text = StrDictionary.GetClientDictionaryString("#{9102}"); //活动描述
ActivityAwardDescText.text = StrDictionary.GetClientDictionaryString("#{9103}"); //活动奖励描述
//获取会试结束时间(秒)
GetAndAetImperialExamOverTime();
//开启乡试计时器
isImperialCountTime = true;
//获取当前服务器时间。
m_CurServerTime = GlobalData.ServerAnsiTime;
}
public void GetAndAetImperialExamOverTime()
{
if(m_ImperialExamOverTime == -1)
{
var m_ActivityOverTimeHour = 0;
var m_ActivityOverTimeMinute = 0;
var activityBase = ActivityDataManager.Instance.GetActivityTabByServerType(ActivityDataManager.Activity_Type.ACTIVITY_IMPERIALEXAM);
if (activityBase != null)
{
string[] m_ActivityTime = activityBase.GetTimebyIndex(0).Split('|');
m_ActivityOverTimeHour = int.Parse(m_ActivityTime[1]) / 100;
m_ActivityOverTimeMinute = int.Parse(m_ActivityTime[1]) % 100;
}
//结束时间
DateTime DateOverTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, m_ActivityOverTimeHour, m_ActivityOverTimeMinute, 0);
m_ImperialExamOverTime = Convert.ToInt32((DateOverTime - DateTime.Now).TotalSeconds);
isImperialCountTime = m_ImperialExamOverTime > 0;
SwitchPanel();
}
}
private void SwitchPanel()
{
if (m_ImperialExamOverTime > 0)
{
_ImperialPanel.SetActive(true);
_TimeOutPanel.SetActive(false);
}
else
{
_ImperialPanel.SetActive(false);
_TimeOutPanel.SetActive(true);
}
}
private float _CountRemainTime = 0.0f;
private float CountSecond = 0;
private string m_ShowHour = "0";
private string m_ShowMinute = "0";
private string m_ShowSecond = "0";
private void Update()
{
//乡试计时
if (isImperialCountTime)
{
CountSecond += Time.deltaTime;
if (CountSecond >= 1.0f)
{
m_ImperialExamOverTime--;
if (m_ImperialExamOverTime <= 0)
{
isImperialCountTime = false;
ReaminTimeText.text = "0:00:00";
CountSecond = 0.0f;
//CloseImperialAct();
SwitchPanel();
return;
}
//显示剩余的时间
m_ShowHour = (m_ImperialExamOverTime / 3600).ToString(); //小时
m_ShowMinute = ((m_ImperialExamOverTime - int.Parse(m_ShowHour) * 3600) / 60).ToString(); //分钟
m_ShowSecond = ((m_ImperialExamOverTime - int.Parse(m_ShowHour) * 3600 - int.Parse(m_ShowMinute) * 60)).ToString(); //秒
if (int.Parse(m_ShowSecond) < 10) //秒数小于0 就在前面加个0
{
m_ShowSecond = "0" + m_ShowSecond;
}
if (int.Parse(m_ShowMinute) < 10)
{
m_ShowMinute = "0" + m_ShowMinute;
}
//显示
ReaminTimeText.text = m_ShowHour + ":" + m_ShowMinute + ":" + m_ShowSecond;
//重置时间
CountSecond = 1.0f - CountSecond;
}
}
if (_IsCountRemainTime)
{
if(waitRemainTime <= 0)
{
_IsCountRemainTime = false;
return;
}
_CountRemainTime += Time.deltaTime;
if(_CountRemainTime >= 1.0f)
{
_CountRemainTime -= 1.0f;
waitRemainTime--;
SetRemainTime();
}
}
}
private int waitRemainTime = 0;
private bool _IsCountRemainTime = false;
public void CalculateRemainTime()
{
DateTime curTime = new DateTime(1970, 1, 1, 8, 0, 0).AddSeconds(GlobalData.ServerAnsiTime);
DateTime overTime = new DateTime(curTime.Year, curTime.Month, curTime.Day, 19, 1, 0); //当天19.01
waitRemainTime = (int)(overTime - curTime).TotalSeconds > 0 ? (int)(overTime - curTime).TotalSeconds - 1 : 0; //提前一秒(宁快勿慢)
if(waitRemainTime > 0)
{
_IsCountRemainTime = true;
}else
{
_IsCountRemainTime = false;
}
SetRemainTime();
}
public void SetRemainTime()
{
if(waitRemainTime <= 0)
{
_WaitTime.text = "0";
_IsCountRemainTime = false;
}
else
{
_WaitTime.text = waitRemainTime.ToString();
}
}
public Text _WaitTime;
public void ShowWaitPanel()
{
waitPanel.gameObject.SetActive(true);
waitPanel.SetWaitType();
_ImperialPanel.SetActive(true);
_TimeOutPanel.SetActive(false);
TimeAndAwardInfoPanel.SetActive(false);
RankingListPanel.SetActive(false);
answerPanel.SetActive(false);
}
public void InitRew()
{
var commonItem = TableManager.GetCommonItemByID(_ItemId, 0);
if (commonItem == null)
{
if (_ItemIcon)
_ItemIcon.gameObject.SetActive(false);
if (_ItemQuality)
_ItemQuality.gameObject.SetActive(false);
}
if (_ItemIcon)
{
LoadAssetBundle.Instance.SetImageSprite(_ItemIcon, commonItem.Icon);
if (commonItem.QualityEffect > 0)
{
CommonItemContainerItem.ShowQualityEffect(true, commonItem.QualityEffect, _ItemIcon.transform);
}
else
{
CommonItemContainerItem.ShowQualityEffect(false, commonItem.QualityEffect, _ItemIcon.transform);
}
}
if (_ItemQuality)
LoadAssetBundle.Instance.SetImageSprite(_ItemQuality, GCGame.Utils.GetItemQualityFrame(commonItem.Quality));
}
public void HideWaitPanel()
{
_ImperialPanel.SetActive(true);
_TimeOutPanel.SetActive(false);
waitPanel.gameObject.SetActive(false);
answerPanel.SetActive(true);
if(m_QuestionType == Question_Type.QUESTION_XIANGSHI)
{
TimeAndAwardInfoPanel.SetActive(true);
InitRew();
RankingListPanel.SetActive(false);
}else
{
TimeAndAwardInfoPanel.SetActive(false);
RankingListPanel.SetActive(true);
}
}
public void CloseImperialAct()
{
UIManager.CloseUI(UIInfo.ImperialExamPanel);
if (RightCountNum > 0)
{
MessageBoxLogic.OpenOKBox(StrDictionary.GetClientDictionaryString("#{44003}", RightCountNum), "", OnOKBtnClick);
}
}
public void OnOKBtnClick()
{
UIManager.CloseUI(UIInfo.MessageBox);
}
public void SetMyQuestionType(Question_Type type)
{
m_QuestionType = type;
SetMyExamDescImage();
}
//设置当前考试的类型
public void SetMyQuestionType(int m_Type, int Sub_Type = 0)
{
answerPanel.SetActive(false);
waitPanel.gameObject.SetActive(false);
switch (m_Type)
{
case (int)ActivityDataManager.Activity_Type.ACTIVITY_IMPERIALEXAM:
if (!TimeAndAwardInfoPanel.activeInHierarchy)
{
TimeAndAwardInfoPanel.SetActive(true);
InitRew();
}
if (RankingListPanel.gameObject.activeInHierarchy)
{
RankingListPanel.gameObject.SetActive(false); //打开排行榜panel
}
m_QuestionType = Question_Type.QUESTION_XIANGSHI;
//左边的面板是乡试描述
TimeAndAwardInfoPanel.gameObject.SetActive(true);
InitMyTimeAndAwardDescPanel();
ResetMyLastAnswer();
AskQuestionInfo((int)m_QuestionType);
break;
default:
if (Sub_Type == 1)
{
m_QuestionType = Question_Type.QUESTION_HUISHI;
AskQuestionInfo((int)m_QuestionType);
}
else if (Sub_Type == 2)
{
m_QuestionType = Question_Type.QUESTION_DIANSHI;
AskQuestionInfo((int)m_QuestionType);
}
if (TimeAndAwardInfoPanel.activeInHierarchy)
{
TimeAndAwardInfoPanel.SetActive(false);
}
if (!RankingListPanel.gameObject.activeInHierarchy)
{
RankingListPanel.gameObject.SetActive(true); //打开排行榜panel
}
if (ImperialExamWaitPanelCtr.Instance)
{
UIManager.CloseUI(UIInfo.ImperialExamWaitPanel);
}
break;
}
}
//答案0查询信息 不答题
public void AskQuestionInfo(int type)
{
CG_REQ_QUESTION answerQuestion = (CG_REQ_QUESTION)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_QUESTION);
answerQuestion.SetReqType(type);
answerQuestion.SetAnswer(0);
answerQuestion.SendPacket();
}
public void SetMyExamDescImage()
{
switch (m_QuestionType)
{
case Question_Type.QUESTION_XIANGSHI:
titleName.text = StrDictionary.GetClientDictionaryString("#{6519}");// "科举乡试";
break;
case Question_Type.QUESTION_HUISHI:
titleName.text = StrDictionary.GetClientDictionaryString("#{6520}");// "科举会试";
break;
case Question_Type.QUESTION_DIANSHI:
titleName.text = StrDictionary.GetClientDictionaryString("#{6521}");// "科举殿试";
break;
}
}
//请求开始答题
public void RequestQuestionStart()
{
CG_REQ_QUESTION answerQuestion = (CG_REQ_QUESTION)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_QUESTION);
answerQuestion.SetReqType((int)Question_Type.QUESTION_XIANGSHI);
answerQuestion.SetAnswer(m_SelectedAnswer);
answerQuestion.SendPacket();
}
//每次刷新题目的时候重置上一次的选择
public void ResetMyLastAnswer()
{
for (int index = 0; index < m_AllAnswerToggles.Length; index++)
{
m_AllAnswerToggles[index].isOn = false;
m_AnswwerMarkIcon[index].gameObject.SetActive(false); //清空正确错误标记
}
m_SelectedAnswer = -1;
isSubmit = false; //当前问题还没有提交
ClickMask.gameObject.SetActive(false);
}
//通过ID设置当前的问题描述以及左边面板的显示
private int m_QuestionId = -1; //当前问题的ID
private int m_RemainTime = 0;
private int m_RightCount;
private int m_HuishiCount = 0;
private int m_TodayRightCount;
private bool isFirst = true;
private void OnEnable()
{
isFirst = true;
}
public void AskForInfo()
{
CG_REQ_QUESTION answerQuestion = (CG_REQ_QUESTION)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_QUESTION);
answerQuestion.SetReqType((int)ImpreialExamPanelCtr.Question_Type.QUESTION_XIANGSHI);
answerQuestion.SetAnswer(0);
answerQuestion.SendPacket();
}
public void SetMyQuestionInfo(int questionId, int remainTime, int RightCount, int huishiCount, int todayRightCount)
{
//设置Title图片
SetMyExamDescImage();
if (m_QuestionType != Question_Type.QUESTION_XIANGSHI && huishiCount == 0)
{
//活动尚未开始
ShowWaitPanel();
return;
}
HideWaitPanel();
m_QuestionId = questionId;
m_RemainTime = remainTime;
m_RightCount = RightCount;
m_HuishiCount = huishiCount;
m_TodayRightCount = todayRightCount;
if (m_QuestionType == Question_Type.QUESTION_XIANGSHI)
{
if(isFirst)
{
isFirst = false;
SetXiangShiQuestion();
}else
{
Invoke("SetXiangShiQuestion", 2.5f); //2.5S后刷新下一题
}
}
else
{
if (remainTime > 0)
{
ResetMyLastAnswer();
}
SetHuiShiQuestion();
}
}
public void SetXiangShiQuestion()
{
ResetMyLastAnswer();
SetMyAnswerAndFontColor(); //设置可以选择的答案以及答案的颜色
Tab_QuestionBank questionBank = TableManager.GetQuestionBankByID(m_QuestionId, 0);
if (questionBank == null)
{
return;
}
QuestionDescText.text = questionBank.QuestionDesc; //设置问题描述
curWeekRightCount.text = StrDictionary.GetClientDictionaryString("#{44001}", m_RightCount);
RightCountNum = m_RightCount; //记录答对的数量
int complete = ActivityDataManager.Instance.GetActivityCompleteTimes((int)ActivityDataManager.Activity_Type.ACTIVITY_IMPERIALEXAM,false);
CurrentQuestionIndexText.text = StrDictionary.GetClientDictionaryString("#{44002}", complete + 1 > 20 ? complete - 19 : complete + 1);
}
public void SetHuiShiQuestion()
{
SetMyAnswerAndFontColor(); //设置可以选择的答案以及答案的颜色
Tab_QuestionBank questionBank = TableManager.GetQuestionBankByID(m_QuestionId, 0);
if (questionBank == null)
{
return;
}
QuestionDescText.text = questionBank.QuestionDesc; //设置问题描述
curWeekRightCount.text = StrDictionary.GetClientDictionaryString("#{44001}", m_RightCount);
RightCountNum = m_RightCount; //记录答对的数量
//服务器同步
if (m_HuishiCount < 21)
{
CurrentQuestionIndexText.text = StrDictionary.GetClientDictionaryString("#{44002}", m_HuishiCount.ToString()); //当前是会试阶段
if (m_QuestionType != Question_Type.QUESTION_HUISHI)
SetMyQuestionType((int)ActivityDataManager.Activity_Type.ACTIVITY_HUISHI, 1);
}
else if (m_HuishiCount == 21)
{
//当前是否已经竞猜
CG_QUESTION_GUESSING_INFO req = (CG_QUESTION_GUESSING_INFO)PacketDistributed.CreatePacket(MessageID.PACKET_CG_QUESTION_GUESSING_INFO);
req.SetParam(1);
req.SendPacket();
}
else if (m_HuishiCount > 21)
{
//殿试
CurrentQuestionIndexText.text = StrDictionary.GetClientDictionaryString("#{44002}", m_HuishiCount - 21); //(huishiCount - 21).ToString(); //当前是殿试阶段
if (m_QuestionType != Question_Type.QUESTION_DIANSHI)
SetMyQuestionType((int)ActivityDataManager.Activity_Type.ACTIVITY_HUISHI, 2);
//if (m_HuishiCount == 41)
//{
// // Invoke("CompleteDianshi", 16); //写死
//}
}
//通知会试计时器
if (m_RemainTime > 0)
RankingPanelCtr.Instance.SetMyQuestionRemainTime(m_RemainTime, m_QuestionType);
}
public void OnGuessingPacketReceive(GC_QUESTION_GUESSING_INFO packet)
{
if((long)packet.Targetguid > 0 || IsOnRankPanel())
{
ShowWaitPanel();
}else
{
//CloseImperialAct();
//因为弹出竞猜 所以答题被关闭 所以殿试时协议通知可以再次打开答题面板
if (ImperialExamManager.GetInstance().GetMyRankInfoList().Count > 0 && !IsOnRankPanel()) //有人上榜的时候才会弹出竞猜界面
{
ImperialExamManager.GetInstance().GuessingRemainTime = m_RemainTime;
//竞猜 打开竞猜面板 关闭答题面板
UIManager.ShowUI(UIInfo.ImperialGuessingPanel, delegate (bool bSucess, object param)
{
if (bSucess)
{
ImperialGuessingPanelCtr.Instance.SetMyRoleInfoPanel(ImperialExamManager.GetInstance().GetMyRankInfoList(),
ImperialExamManager.GetInstance().GuessingRemainTime);
}
});
}
}
}
public bool IsOnRankPanel()
{
for(int index = 0; index < ImperialExamManager.GetInstance().GetMyRankInfoList().Count; index++)
{
if(Singleton<ObjManager>.Instance.MainPlayer != null
&& Singleton<ObjManager>.Instance.MainPlayer.GUID == ImperialExamManager.GetInstance().GetMyRankInfoList()[index].guid)
{
return true;
}
}
return false;
}
public void CompleteDianshi()
{
UIManager.CloseUI(UIInfo.ImperialExamPanel);
}
//设置答案 以及 答案颜色
public void SetMyAnswerAndFontColor()
{
Tab_QuestionBank questionBank = TableManager.GetQuestionBankByID(m_QuestionId, 0);
if (questionBank == null)
{
return;
}
for (int index = 0; index < m_AllAnswerToggles.Length; index++)
{
m_AllAnswerTexts[index].text = questionBank.GetAnswerbyIndex(index);
}
}
//设置选择的答案
public void OnToggleVlueChange(int index)
{
switch (index)
{
case 1:
m_SelectedAnswer = 1;
break;
case 2:
m_SelectedAnswer = 2;
break;
case 3:
m_SelectedAnswer = 3;
break;
case 4:
m_SelectedAnswer = 4;
break;
default:
m_SelectedAnswer = -1;
break;
}
if (m_AllAnswerToggles[m_SelectedAnswer - 1].isOn) //每次重置的时候会改变Toggle值 这里要判断有打开的Toggle才发送答案
{
//直接发送答案
SubmitBtnClick();
}
//改变颜色
SetMyAnswerAndFontColor();
}
//协议发送当前的答案
public void SubmitBtnClick()
{
if(m_QuestionType != Question_Type.QUESTION_XIANGSHI
&& !GameManager.gameManager.PlayerDataPool.IsHaveImperialEligible)
{
GUIData.AddNotifyData(StrDictionary.GetClientDictionaryString("#{4610}"));
return;
}
if (isSubmit || m_SelectedAnswer == -1)
{
return; //不做处理
}
if (!isSubmit)
{
isSubmit = true; //当前问题已经提交 只有在服务器通知刷新题目的时候才会重置
ClickMask.gameObject.SetActive(true);
}
switch (m_QuestionType)
{
case Question_Type.QUESTION_XIANGSHI:
//显示答案的对错
ShowAnswerWrongOrRight();
//等待一秒 发送协议
SendMyAnswer();
break;
default:
//直接发协议
SendMyAnswer(); //不显示答案对错 在倒计时结束的时候才显示
break;
}
}
public void SendMyAnswer()
{
CG_REQ_QUESTION answerQuestion = (CG_REQ_QUESTION)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_QUESTION);
answerQuestion.SetReqType((int)m_QuestionType);
answerQuestion.SetAnswer(m_SelectedAnswer);
answerQuestion.SendPacket();
var complete = ActivityDataManager.Instance.GetActivityCompleteTimes((int)ActivityDataManager.Activity_Type.ACTIVITY_IMPERIALEXAM, false);
//判断次数 完成科举
if (m_QuestionType == Question_Type.QUESTION_XIANGSHI
&& complete + 1 == 20)
{
//只有乡试才会弹
CompleteImperialExam();
}
}
public void CompleteImperialExam()
{
// UIManager.CloseUI(UIInfo.ImperialExamPanel);
if (RightCountNum > 0)
{
MessageBoxLogic.OpenOKBox(StrDictionary.GetClientDictionaryString("#{6518}", m_TodayRightCount), null, CloseMyMessageBoxAndImperial);
}
}
public void CloseMyMessageBoxAndImperial()
{
UIManager.CloseUI(UIInfo.MessageBox);
}
public void ShowAnswerWrongOrRight()
{
//读表读取正确答案
Tab_QuestionBank questionBank = TableManager.GetQuestionBankByID(m_QuestionId, 0);
if (questionBank == null)
{
return;
}
int m_RightAnswer = -1;
switch (questionBank.RightAnswer)
{
case "A":
m_RightAnswer = 1;
break;
case "B":
m_RightAnswer = 2;
break;
case "C":
m_RightAnswer = 3;
break;
case "D":
m_RightAnswer = 4;
break;
default:
break;
}
//选择正确
if (m_SelectedAnswer == m_RightAnswer)
{
var complete = ActivityDataManager.Instance.GetActivityCompleteTimes((int)ActivityDataManager.Activity_Type.ACTIVITY_IMPERIALEXAM, false);
//判断次数 完成科举
if (m_QuestionType == Question_Type.QUESTION_XIANGSHI
&& complete + 1 == 20)
{
//只有乡试才会弹
m_TodayRightCount += 1;
}
//正确答案显示绿色对号
m_AnswwerMarkIcon[m_SelectedAnswer - 1].gameObject.SetActive(true);
m_AnswwerMarkIcon[m_SelectedAnswer - 1].sprite = rightIcon;
m_AnswwerMarkIcon[m_SelectedAnswer - 1].SetNativeSize();
}
else if (m_SelectedAnswer == -1)
{
//正确的答案显示正确的标记
m_AnswwerMarkIcon[m_RightAnswer - 1].gameObject.SetActive(true);
m_AnswwerMarkIcon[m_RightAnswer - 1].sprite = rightIcon;
m_AnswwerMarkIcon[m_RightAnswer - 1].SetNativeSize();
}
else if (m_SelectedAnswer != m_RightAnswer) //选择错误
{
//选择的答案显示错误标记
m_AnswwerMarkIcon[m_SelectedAnswer - 1].gameObject.SetActive(true);
m_AnswwerMarkIcon[m_SelectedAnswer - 1].sprite = wrongIcon;
m_AnswwerMarkIcon[m_SelectedAnswer - 1].SetNativeSize();
//正确的答案显示正确的标记
m_AnswwerMarkIcon[m_RightAnswer - 1].gameObject.SetActive(true);
m_AnswwerMarkIcon[m_RightAnswer - 1].sprite = rightIcon;
m_AnswwerMarkIcon[m_RightAnswer - 1].SetNativeSize();
}
}
public void OnRewardClick()
{
ItemTooltipsLogic.ShowItemTooltip(88001, ItemTooltipsLogic.ShowType.Info, transform.position);
}
public void CloseBtnClick()
{
GlobalData.HasOpenedImperialExamPanel = true; //手动关闭记录同步试题的时候不再自动打开UI
UIManager.CloseUI(UIInfo.ImperialExamPanel);
}
}