英雄黄昏吧 关注:1,236贴子:2,104
  • 2回复贴,共1

【修改】为一个武将安排多项记忆事务

只看楼主收藏回复

上个贴我们实现了为一项城池事务指定多个武将记忆安排
这次我们研究为一个武将记忆安排多个事务
把五边形战士充分利用起来了
先上图看看效果


原理:
npcData.Reserve1属性是用来存储武将记忆事务的,我们用"|"将多个事务拼接起来,用的时候再拆分,对每个事务进行原来的操作
流程:
【武将列表界面的显示】
1、搜索 SpecialInfo方法,找到两个方法,都需要替换

找到如图位置,
if (propName == "Reserve1")
{
}
【替换】
-----------
if (propName == "Reserve1")
{
string npcRecordAffair = GameManager.Instance.m_NpcBehaviorTrig_Affair.GetNpcRecordAffair(data);
if (npcRecordAffair != "0")
{
string[] array = npcRecordAffair.Split(new char[]
{
'|'
});
string str = "";
for (int i = 0; i < array.Length; i++)
{
str = str + GameManager.Instance.m_NpcBehaviorModel.GetBehaviorDes(array[i]) + "|";
}
if (str.EndsWith("|"))
{
text = str.Remove(str.LastIndexOf("|"));
}
text = Tools.ChangeTextColor(text, ColorEnum.DarkVoilet);
}
else
{
text = text2;
}
}
-----------

【月初武将根据记忆选择事务】
2、搜索NpcChooseCityCommonAffair方法,找到如图两个位置,先【替换】1
----------------------
if (this.m_SettingModel.IsRecordAffair)
{
for (int j = 0; j < list2.Count; j++)
{
PlayerNpcData playerNpcData2 = list2[j];
string npcRecordAffair = this.GetNpcRecordAffair(playerNpcData2);
if (npcRecordAffair != "0" && playerNpcData2.Reserve2 == "0")
{
string[] array = npcRecordAffair.Split(new char[]
{
'|'
});
for (int num9 = 0; num9 < array.Length; num9++)
{
string trimmedRecord = array[num9].Trim();
if (!string.IsNullOrEmpty(trimmedRecord))
{
List<PlayerNpcData> list3;
if (dictionary.ContainsKey(trimmedRecord))
{
list3 = dictionary[trimmedRecord];
}
else
{
list3 = new List<PlayerNpcData>();
}
list3.Add(playerNpcData2);
dictionary[trimmedRecord] = list3;
}
}
}
}
}

再【替换】2
----------------------
PlayerNpcData playerNpcData3 = list2[l];
string text = "1";
bool flag = false;
string npcRecordAffair2 = this.GetNpcRecordAffair(playerNpcData3);
if (this.m_SettingModel.IsRecordAffair && npcRecordAffair2 != "0")
{
foreach (string affairType in npcRecordAffair2.Split(new char[]
{
'|'
}))
{
text = DataModel.CityAffairStaticDict[affairType].AffairStrategy;
if (!cityHaveAffairStrategyList.Contains(text))
{
flag = true;
playerNpcData3.Reserve2 = "1";
break;
}
}
}

【安排管理界面】
3、搜索 CreatClearAffairRecordList方法,右键编辑类,【替换】两个函数
----------------------
private void ClickClearRecordBtn(PlayerCityData cityData, PlayerNpcData npcData, string affair1)
{
SoundManager.Instance.PlayerClickSound();
string[] array = npcData.Reserve1.Split(new char[]
{
'|'
});
List<string> remainingAffairs = new List<string>();
foreach (string affair2 in array)
{
if (affair2 != affair1)
{
remainingAffairs.Add(affair2);
}
}
string[] remainingAffairsArray = remainingAffairs.ToArray();
this.curChooseNpcData.Reserve1 = string.Join("|", remainingAffairsArray);
if (string.IsNullOrEmpty(this.curChooseNpcData.Reserve1))
{
this.curChooseNpcData.Reserve1 = "0";
}
this.CreatClearAffairRecordList(cityData);
this.SetAffairTipsInfo();
}
----------------------
private void CreatClearAffairRecordList(PlayerCityData cityData)
{
Pools.Instance.GiveBackGOToPool(this.clearAffairRecordGridTrans);
List<Button> list = new List<Button>();
List<PlayerNpcData> list2 = new List<PlayerNpcData>();
List<string> name = new List<string>();
foreach (KeyValuePair<PlayerNpcData, string> entry in this.GetAffairRecordNpcList(cityData))
{
PlayerNpcData playerNpcData = entry.Key;
string npcRecordAffairs = entry.Value;
if (npcRecordAffairs != "0")
{
foreach (string affair in npcRecordAffairs.Split(new char[]
{
'|'
}))
{
if (!string.IsNullOrEmpty(affair))
{
list2.Add(playerNpcData);
Transform transform = Pools.Instance.GetGOFromPool(PrefabTabEnum.AffairRecordTab, this.clearAffairRecordGridTrans).transform;
transform.Find("City").GetComponent<Text>().text = this.m_DataModel.CityDataDict[playerNpcData.BelongCityID].CityName;
transform.Find("Name").GetComponent<Text>().text = GameManager.Instance.m_NpcModel.GetNpcName(playerNpcData, false);
Text component6 = transform.Find("Affair").GetComponent<Text>();
string behaviorDes = GameManager.Instance.m_NpcBehaviorModel.GetBehaviorDes(affair);
name.Add(affair);
component6.text = Tools.ChangeTextColor(behaviorDes, ColorEnum.DarkVoilet);
Text component7 = transform.Find("Attr").GetComponent<Text>();
CityAffairData cityAffairData = DataModel.CityAffairStaticDict[affair];
string npcAttrName = GameManager.Instance.m_NpcModel.GetNpcAttrName(cityAffairData.AffairAttr);
string attrValue = GameManager.Instance.m_NpcAttrModel.GetAttrValue(playerNpcData, npcAttrName);
component7.text = Tools.ChangeTextColor(cityAffairData.AffairAttr, ColorEnum.DarkGray) + " " + attrValue;
Button component5 = transform.Find("ClearBtn").GetComponent<Button>();
list.Add(component5);
}
}
}
}
for (int i = 0; i < list2.Count; i++)
{
PlayerNpcData npcData = list2[i];
Button button = list[i];
string text = name[i];
button.onClick.RemoveAllListeners();
button.onClick.AddListener(delegate()
{
this.ClickClearRecordBtn(cityData, npcData, text);
});
}
}


IP属地:安徽1楼2024-09-29 17:28回复
    ---------------------
    【建筑事务武将执行完后点击会清除记忆的操作】
    4、搜索 SetAffairBtn方法,右键编辑类,需要【替换】三个函数,
    (1)、SetAffairBtn函数如图位置替换
    ----------------------
    if (affairNpcID != "0")
    {
    PlayerNpcData affairNpcData = this.m_DataModel.NpcDataDict[affairNpcID];
    string name = affairNpcData.Name;
    string str = this.affairExeStateDes1;
    if (isAffairFinish)
    {
    str = this.affairExeStateDes2;
    }
    text = Tools.SwitchSymbolToValue(str, name);
    string npcRecordAffair = this.m_NpcBehaviorTrig_Affair.GetNpcRecordAffair(affairNpcData);
    if (npcRecordAffair != "0")
    {
    string[] affairs = npcRecordAffair.Split(new char[]
    {
    '|'
    });
    bool matchFound = false;
    for (int i = 0; i < affairs.Length; i++)
    {
    if (affairs[i].Trim() == affairData.AffairType)
    {
    matchFound = true;
    break;
    }
    }
    if (matchFound)
    {
    text = Tools.ChangeTextColor(text, ColorEnum.DarkVoilet);
    component7.GetComponent<Image>().raycastTarget = true;
    component7.onClick.RemoveAllListeners();
    component7.onClick.AddListener(delegate()
    {
    this.ClickAffairintBtn(affairNpcData, affairData);
    });
    transform.gameObject.SetActive(true);
    }
    }
    }
    ----------------------

    (2)、ClickAffairintBtnh函数替换
    --------------------------------------------
    private void ClickAffairintBtn(PlayerNpcData npcData, CityAffairData affairData)
    {
    SoundManager.Instance.PlayerClickSound();
    this.curChooseNpcData = npcData;
    string text = GameManager.Instance.m_NpcBehaviorModel.GetBehaviorDes(affairData.AffairType);
    text = Tools.ChangeTextColor(text, ColorEnum.DarkVoilet);
    string text2 = npcData.Name;
    text2 = Tools.ChangeTextColor(text2, ColorEnum.Blue);
    UIGame.Instance.ShowConfirmationPanel(240431, delegate()
    {
    this.ClearPlayerRecordAffair(affairData);
    }, "清除", null, "取消", text2, text, string.Empty, string.Empty, string.Empty, string.Empty);
    }
    ----------------------
    (3)ClearPlayerRecordAffair替换
    ----------------------
    private void ClearPlayerRecordAffair(CityAffairData affairData)
    {
    string reserve = this.curChooseNpcData.Reserve1;
    string affairToRemove = affairData.AffairType;
    string[] array = reserve.Split(new char[]
    {
    '|'
    });
    List<string> remainingAffairs = new List<string>();
    foreach (string affair in array)
    {
    if (affair != affairToRemove)
    {
    remainingAffairs.Add(affair);
    }
    }
    string[] remainingAffairsArray = remainingAffairs.ToArray();
    this.curChooseNpcData.Reserve1 = string.Join("|", remainingAffairsArray);
    if (string.IsNullOrEmpty(this.curChooseNpcData.Reserve1))
    {
    this.curChooseNpcData.Reserve1 = "0";
    }
    this.SetAffairTipsInfo();
    }
    【玩家安排记忆时记录此次选择事务】
    5、搜索RecordNpcAffair,替换
    --------------
    public void RecordNpcAffair(PlayerNpcData npcData, string affairType)
    {
    if (string.IsNullOrEmpty(npcData.Reserve1) || npcData.Reserve1 == "0")
    {
    npcData.Reserve1 = affairType;
    return;
    }
    if (!new List<string>(npcData.Reserve1.Split(new char[]
    {
    '|'
    })).Contains(affairType))
    {
    npcData.Reserve1 = npcData.Reserve1 + "|" + affairType;
    }
    }
    应该没了


    IP属地:安徽2楼2024-09-29 17:29
    回复
      再补充一个功能,安排城池事务时,选择界面高亮显示已安排该事务的武将
      效果如图

      流程:
      1、UIGameManager类新增
      public string ChooseNpcAffair;//存储当前记忆的事务
      2、CloseUIPanel方法
      if (flag && GameManager.Instance.IsGame && !UIGame_Log.Instance.JudgeHaveActivePanel(null))
      里增加 一句 GameManager.Instance.ChooseNpcAffair = "";
      3、ClickArrangeAffairBtn方法里最后面增加一句
      GameManager.Instance.ChooseNpcAffair = affairData.AffairType;
      ChooseNpcExeCityAffair方法里最后面增加一句
      GameManager.Instance.ChooseNpcAffair = "";
      4、AllGeneralInfoItem类里onUpdateItem方法
      找到if (data == this.m_DataModel.PlayerNpcData)
      if (data == this.m_DataModel.PlayerNpcData)这一句用
      ---------------
      string[] array2 = data.Reserve1.Split(new char[]
      {
      '|'
      });
      bool flag = false;
      for (int j = 0; j < array2.Length; j++)
      {
      if (array2[j] == GameManager.Instance.ChooseNpcAffair)
      {
      flag = true;
      }
      }
      if (flag)
      {
      component.text = Tools.ChangeTextColor(text, ColorEnum.Purple);
      }
      else if (data == this.m_DataModel.PlayerNpcData)
      -----------
      替换,欧克


      IP属地:安徽4楼2024-09-29 20:52
      回复