yyl
2026-02-12 bcd1dcef07dc129d68539ca2d562c5df53007f36
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
using System.Collections.Generic;
using System.Linq;
using LitJson;
using UnityEngine;
 
public class FuncNPCManager : GameSystemManager<FuncNPCManager>
{
    //内政NPC
    Dictionary<int, string[]> affairNpcTalkDic = new Dictionary<int, string[]>();
    public List<int> affairTalkIndexList = new List<int>();
    public Dictionary<int, int> funcNPCToFuncID = new Dictionary<int, int>();
    public float lastAffairTalkTime;
    public int lastAffiarRandomIndex;
 
    //公会NPC
    Dictionary<int, string[]> guildNpcTalkDic = new Dictionary<int, string[]>();
    public List<int> guildTalkIndexList = new List<int>();
    public float lastGuildTalkTime;
    public int lastGuildRandomIndex;
 
    //行商特殊处理
    public bool isHawkerShowNow = false; //行商状态,true 行商走出来和站岗中,false 行商走出去和外出中
    public bool isHawkerStandBy = false; //行商状态,true 行商站岗中,只有true才能参与喊话;移动或者消失都为false
 
 
    public override void Init()
    {
        ParseConfig();
    }
    void ParseConfig()
    {
        var config = FuncConfigConfig.Get("FuncNPC");
        var json = JsonMapper.ToObject(config.Numerical1);
        var keys = json.Keys.ToList();
        foreach (var key in keys)
        {
            var npcID = int.Parse(key);
            var talkList = JsonMapper.ToObject<string[]>(json[key].ToJson());
            affairNpcTalkDic.Add(npcID, talkList);
        }
 
 
 
        json = JsonMapper.ToObject(config.Numerical2);
        keys = json.Keys.ToList();
        foreach (var key in keys)
        {
            var npcID = int.Parse(key);
            var talkList = JsonMapper.ToObject<string[]>(json[key].ToJson());
            guildNpcTalkDic.Add(npcID, talkList);
        }
        for (int i = 0; i < guildNpcTalkDic.Count; i++)
        {
            guildTalkIndexList.Add(i);
        }
 
        funcNPCToFuncID = ConfigParse.ParseIntDict(config.Numerical3);
    }
 
 
    void RefreshAffairTalkIndexList()
    {
        affairTalkIndexList.Clear();
        foreach (var key in affairNpcTalkDic.Keys)
        {
            if (!FuncOpen.Instance.IsFuncOpen(funcNPCToFuncID[key]))
            {
                continue;
            }
            if (funcNPCToFuncID[key] == 54 && MinggeManager.Instance.isStartAuto)
            {
                //算命中不参与喊话
                continue;
            }
            affairTalkIndexList.Add(key);
        }
    }
 
 
    //随机某个NPC对话,与上一次随机的NPC索引不重复
    //返回NPCID
    public int GetRandomAffairNpcTalk()
    {
        RefreshAffairTalkIndexList();
        int index = Random.Range(0, affairTalkIndexList.Count);
        if (index == lastAffiarRandomIndex)
        {
            index = (index + 1) % affairTalkIndexList.Count;
        }
        lastAffiarRandomIndex = index;
        return affairTalkIndexList[index];
    }
 
    public int GetRandomGuildNpcTalk()
    {
        //行商特殊处理,行商非站岗中不参与喊话
        int index;
        if (isHawkerStandBy)
        {
            index = Random.Range(0, guildTalkIndexList.Count);
        }
        else
        {
            if (guildTalkIndexList.Count == 1)
            {
                return -1;
            }
            index = Random.Range(1, guildTalkIndexList.Count);
        }
        if (index == lastGuildRandomIndex)
        {
            if (guildTalkIndexList.Count == 1)
            {
                //只有一个的情况
                lastGuildRandomIndex = -1;
                return -1;
            }
            index = (index + 1) % guildTalkIndexList.Count;
        }
        lastGuildRandomIndex = index;
        return index;
    }
 
    public string GetAffairTalk(int skinID)
    {
        if (affairNpcTalkDic.ContainsKey(skinID))
        {
 
            return affairNpcTalkDic[skinID][Random.Range(0, affairNpcTalkDic[skinID].Length)];
        }
        return null;
    }
 
    public string GetGuildTalk(int skinID)
    {
        if (guildNpcTalkDic.ContainsKey(skinID))
        {       
            return guildNpcTalkDic[skinID][Random.Range(0, guildNpcTalkDic[skinID].Length)];
        }
        return null;
    }
}