public void OnOptionSelect(GameEventOption option)
    {
        if (option == null)
        {
            return;
        }

        result.text = "";
        if (option.result != null)
        {
            result.text += option.result + "\n";
        }

        if (option.items != null)
        {
            List <ItemEntry> finalItems = new List <ItemEntry>();
            float            posibility = (float)UnityEngine.Random.Range(1, 100);
            int sum = 0;
            foreach (ItemEntry item in option.items)
            {
                if (item.posibility == 100)
                {
                    finalItems.Add(item);
                    continue;
                }
                sum += item.posibility;
                if (posibility < sum)
                {
                    finalItems.Add(item);
                    break;
                }
            }
            if (finalItems.Count > 0)
            {
                result.text += "Get ";
                foreach (ItemEntry item in finalItems)
                {
                    gm.itemManager.GetItem(item.itemType, item.number);
                    result.text += TextColor.SetTextColor(item.itemType.ToString(), TextColor.ItemColor) + "*" + item.number + ";";
                }
                result.text += "\n";
            }
        }
        if (option.buffs != null)
        {
            foreach (BuffEntry buff in option.buffs)
            {
                currentMonster.addBuff(buff.attributeType, buff.value, buff.counter);
                currentMonster.UpdateCurrentValue();
            }
        }
        if (option.costs != null)
        {
            List <ItemEntry> finalItems = new List <ItemEntry>();
            foreach (ItemEntry item in option.costs)
            {
                if (gm.itemManager.IsHaveEnoughItem(item.itemType, item.number))
                {
                    finalItems.Add(item);
                }
                else
                {
                    finalItems.Clear();
                    break;
                }
            }
            if (finalItems.Count > 0)
            {
                result.text += "Paid ";
                foreach (ItemEntry item in finalItems)
                {
                    gm.itemManager.ConsumeItem(item.itemType, item.number);
                    result.text += TextColor.SetTextColor(item.itemType.ToString(), TextColor.ItemColor) + "*" + item.number + ";";
                }
                result.text += "\n";
            }

            if (currentMonsterType != MonsterType.NUM)
            {
                gm.monsterManager.CreateMonster(currentMonsterType, gm.hexMap.GetEmptyNearestCellAround(currentCell), currentMonsterLevel);
            }
        }
        if (result.text == "")
        {
            result.text += "无事发生";
        }
    }
    public GameEvent getNewGameEvent(GameEventType type, int which)
    {
        if (which < 0 || which >= eventNums[(int)type])
        {
            return(null);
        }

        GameEvent gameEvent        = null;
        string    eventName        = "";
        string    eventDescription = "";
        int       eventCounter     = 0;

        //int eventid=0;

        if (xmlDoc != null)
        {
            string     xpath = eventxpath[(int)type];
            XmlElement node  = (XmlElement)xmlDoc.SelectNodes(xpath)[which];
            eventName        = node["name"].InnerXml;
            eventDescription = node["description"].InnerXml;
            eventCounter     = int.Parse(node["counter"].InnerXml);
        }
        else
        {
            Debug.Log("EventReader not load correctly");
            return(null);
        }

        switch (type)
        {
        case GameEventType.NormalNonoptionGainbuffEvent:
            try
            {
                XmlElement node = (XmlElement)xmlDoc.SelectNodes(eventxpath[(int)type])[which];

                XmlElement buffnode = (XmlElement)node.SelectSingleNode("buff");
                int        counter  = int.Parse(buffnode["counter"].InnerXml);
                int        value    = int.Parse(buffnode["value"].InnerXml);

                string attributeType = buffnode["attribute"].InnerXml;


                string    effectDescription = node["effectDescription"].InnerXml;
                BuffEntry entry             = new BuffEntry(GameEventHelper.getAttributeTypeFromString(attributeType),
                                                            counter, value);
                gameEvent = new NormalNonoptionGainbuffEvent(eventName, eventDescription, eventCounter, type, which,
                                                             effectDescription,
                                                             entry);
                //Debug.Log(gameEvent.ToString());
            }
            catch (Exception ex)
            {
                Debug.Log(ex.StackTrace);
            }
            break;

        case GameEventType.NormalNonoptionGainitemsEvent:
            try
            {
                XmlElement  node = (XmlElement)xmlDoc.SelectNodes(eventxpath[(int)type])[which];
                string      effectDescription = node["effectDescription"].InnerXml;
                XmlNodeList itemnodes         = node.SelectNodes("item");
                //Debug.Log("itemnodes: " + itemnodes.Count);
                List <ItemEntry> items = new List <ItemEntry>();
                for (int i = 0; i < itemnodes.Count; i++)
                {
                    ItemEntry  itemEntry = new ItemEntry();
                    XmlElement itemnode  = (XmlElement)itemnodes[i];
                    itemEntry.primaryType = GameEventHelper.getItemPrimaryTypeFromString(itemnode["type"].InnerXml);
                    itemEntry.itemType    = GameEventHelper.getItemTypeFromString(itemEntry.primaryType, itemnode["typeEnum"].InnerXml);
                    itemEntry.number      = int.Parse(itemnode["number"].InnerXml);
                    itemEntry.posibility  = int.Parse(itemnode["posibility"].InnerXml);
                    items.Add(itemEntry);
                }
                gameEvent = new NormalNonoptionGainitemsEvent(eventName, eventDescription, eventCounter, type, which, effectDescription,
                                                              items);
                //Debug.Log(gameEvent.ToString());
            }
            catch (Exception ex)
            {
                Debug.Log(ex.StackTrace);
            }
            break;

        case GameEventType.NormalNonoptionMemoryEvent:
            try
            {
                XmlElement node = (XmlElement)xmlDoc.SelectNodes(eventxpath[(int)type])[which];
                string     effectDescription = node["effectDescription"].InnerXml;

                int memoryid = int.Parse(node["memory"].InnerXml);

                gameEvent = new NormalNonoptionMemoryEvent(eventName, eventDescription, eventCounter, type, which, effectDescription,
                                                           memoryid);
            }
            catch (Exception ex)
            {
                Debug.Log(ex.StackTrace);
            }
            break;

        case GameEventType.NormalOptionEvent:
            try
            {
                XmlNodeList optionnodes = xmlDoc.SelectNodes(eventxpath[(int)type])[which].SelectNodes("options/option");
                //Debug.Log(optionnodes.Count);
                List <GameEventOption> options = new List <GameEventOption>();
                for (int i = 0; i < optionnodes.Count; i++)
                {
                    XmlElement  node      = (XmlElement)optionnodes[i];
                    string      name      = node["name"].InnerXml;
                    XmlNodeList itemnodes = node.SelectNodes("item");
                    XmlNodeList buffnodes = node.SelectNodes("buff");

                    List <ItemEntry> items = itemnodes.Count > 0?new List <ItemEntry>():null;
                    List <BuffEntry> buffs = buffnodes.Count > 0?new List <BuffEntry>():null;

                    //Debug.Log("Items: " + itemnodes.Count + "\t\tBuffs: " + buffnodes.Count);

                    for (int j = 0; j < itemnodes.Count; j++)
                    {
                        XmlElement item      = (XmlElement)itemnodes[j];
                        ItemEntry  itementry = new ItemEntry();
                        itementry.primaryType = GameEventHelper.getItemPrimaryTypeFromString(item["type"].InnerXml);
                        itementry.itemType    = GameEventHelper.getItemTypeFromString(itementry.primaryType, item["typeEnum"].InnerXml);
                        itementry.number      = int.Parse(item["number"].InnerXml);
                        itementry.posibility  = int.Parse(item["posibility"].InnerXml);

                        items.Add(itementry);
                    }

                    for (int j = 0; j < buffnodes.Count; j++)
                    {
                        XmlElement buff      = (XmlElement)buffnodes[j];
                        BuffEntry  buffentry = new BuffEntry(GameEventHelper.getAttributeTypeFromString(buff["attribute"].InnerXml),
                                                             int.Parse(buff["counter"].InnerXml), int.Parse(buff["value"].InnerXml));
                        buffs.Add(buffentry);
                    }

                    GameEventOption option = new GameEventOption(name, items, buffs, null, null);
                    options.Add(option);
                }
                gameEvent = new NormalOptionEvent(eventName, eventDescription, eventCounter, type, which,
                                                  options);
                //Debug.Log(gameEvent.ToString());
            }
            catch (Exception ex)
            {
                Debug.Log(ex.StackTrace);
            }

            break;

        case GameEventType.MysterypersonGainitemsEvent:
            try
            {
                XmlNodeList optionnodes = xmlDoc.SelectNodes(eventxpath[(int)type])[which].SelectNodes("options/option");
                //Debug.Log(optionnodes.Count);
                List <GameEventOption> options = new List <GameEventOption>();
                for (int i = 0; i < optionnodes.Count; i++)
                {
                    XmlElement node   = (XmlElement)optionnodes[i];
                    string     name   = node["name"].InnerXml;
                    string     result = node["result"].InnerXml ?? null;
                    //Debug.Log("event " + which + " " + name + result);
                    XmlNodeList itemnodes = node.SelectNodes("item");
                    XmlNodeList buffnodes = node.SelectNodes("buff");
                    XmlNodeList costnodes = node.SelectNodes("cost/item");

                    List <ItemEntry> items = itemnodes.Count > 0 ? new List <ItemEntry>() : null;
                    List <BuffEntry> buffs = buffnodes.Count > 0 ? new List <BuffEntry>() : null;
                    List <ItemEntry> costs = costnodes.Count > 0?new List <ItemEntry>():null;

                    //Debug.Log("Items: " + itemnodes.Count + "\t\tBuffs: " + buffnodes.Count);

                    for (int j = 0; j < itemnodes.Count; j++)
                    {
                        XmlElement item      = (XmlElement)itemnodes[j];
                        ItemEntry  itementry = new ItemEntry();
                        itementry.primaryType = GameEventHelper.getItemPrimaryTypeFromString(item["type"].InnerXml);
                        itementry.itemType    = GameEventHelper.getItemTypeFromString(itementry.primaryType, item["typeEnum"].InnerXml);
                        itementry.number      = int.Parse(item["number"].InnerXml);
                        itementry.posibility  = int.Parse(item["posibility"].InnerXml);

                        items.Add(itementry);
                    }

                    for (int j = 0; j < buffnodes.Count; j++)
                    {
                        XmlElement buff      = (XmlElement)buffnodes[j];
                        BuffEntry  buffentry = new BuffEntry(GameEventHelper.getAttributeTypeFromString(buff["attribute"].InnerXml),
                                                             int.Parse(buff["counter"].InnerXml), int.Parse(buff["value"].InnerXml));
                        buffs.Add(buffentry);
                    }

                    for (int j = 0; j < costnodes.Count; j++)
                    {
                        XmlElement cost      = (XmlElement)costnodes[j];
                        ItemEntry  costentry = new ItemEntry();
                        costentry.primaryType = GameEventHelper.getItemPrimaryTypeFromString(cost["type"].InnerXml);
                        costentry.itemType    = GameEventHelper.getItemTypeFromString(costentry.primaryType, cost["typeEnum"].InnerXml);
                        costentry.number      = int.Parse(cost["number"].InnerXml);
                        costentry.posibility  = 100;

                        costs.Add(costentry);
                    }

                    GameEventOption option = new GameEventOption(name, items, buffs, costs, result);
                    options.Add(option);
                }
                gameEvent = new MysterypersonGainitemsEvent(eventName, eventDescription, eventCounter, type, which, options);
                //Debug.Log(gameEvent.ToString());
            }
            catch (Exception ex)
            {
                Debug.Log(ex.StackTrace);
            }
            break;

        case GameEventType.MysterypersonGaincharacterEvent:
            try
            {
                XmlNode     eventnode   = xmlDoc.SelectNodes(eventxpath[(int)type])[which];
                XmlNodeList optionnodes = eventnode.SelectNodes("options/option");

                MonsterType monsterType = GameEventHelper.getMonsterTypeFromString(eventnode["character"].InnerXml);
                int         level       = int.Parse(eventnode["level"].InnerXml);

                List <GameEventOption> options = new List <GameEventOption>();

                for (int i = 0; i < optionnodes.Count; i++)
                {
                    XmlElement node   = (XmlElement)optionnodes[i];
                    string     name   = node["name"].InnerXml;
                    string     result = node["result"].InnerXml ?? null;
                    //Debug.Log("event " + which + " " + name + result);
                    XmlNodeList itemnodes = node.SelectNodes("item");
                    XmlNodeList buffnodes = node.SelectNodes("buff");
                    XmlNodeList costnodes = node.SelectNodes("cost/item");

                    List <ItemEntry> items = itemnodes.Count > 0 ? new List <ItemEntry>() : null;
                    List <BuffEntry> buffs = buffnodes.Count > 0 ? new List <BuffEntry>() : null;
                    List <ItemEntry> costs = costnodes.Count > 0 ? new List <ItemEntry>() : null;

                    //Debug.Log("Items: " + itemnodes.Count + "\t\tBuffs: " + buffnodes.Count);

                    for (int j = 0; j < itemnodes.Count; j++)
                    {
                        XmlElement item      = (XmlElement)itemnodes[j];
                        ItemEntry  itementry = new ItemEntry();
                        itementry.primaryType = GameEventHelper.getItemPrimaryTypeFromString(item["type"].InnerXml);
                        itementry.itemType    = GameEventHelper.getItemTypeFromString(itementry.primaryType, item["typeEnum"].InnerXml);
                        itementry.number      = int.Parse(item["number"].InnerXml);
                        itementry.posibility  = int.Parse(item["posibility"].InnerXml);

                        items.Add(itementry);
                    }

                    for (int j = 0; j < buffnodes.Count; j++)
                    {
                        XmlElement buff      = (XmlElement)buffnodes[j];
                        BuffEntry  buffentry = new BuffEntry(GameEventHelper.getAttributeTypeFromString(buff["attribute"].InnerXml),
                                                             int.Parse(buff["counter"].InnerXml), int.Parse(buff["value"].InnerXml));
                        buffs.Add(buffentry);
                    }

                    for (int j = 0; j < costnodes.Count; j++)
                    {
                        XmlElement cost      = (XmlElement)costnodes[j];
                        ItemEntry  costentry = new ItemEntry();
                        costentry.primaryType = GameEventHelper.getItemPrimaryTypeFromString(cost["type"].InnerXml);
                        costentry.itemType    = GameEventHelper.getItemTypeFromString(costentry.primaryType, cost["typeEnum"].InnerXml);
                        costentry.number      = int.Parse(cost["number"].InnerXml);
                        costentry.posibility  = 100;

                        costs.Add(costentry);
                    }

                    GameEventOption option = new GameEventOption(name, items, buffs, costs, result);
                    options.Add(option);
                }

                gameEvent = new MysterypersonGaincharacterEvent(eventName, eventDescription, eventCounter, type, which,
                                                                monsterType, level, options);
                //Debug.Log(gameEvent.ToString());
            }
            catch (Exception ex)
            {
                Debug.Log(ex.StackTrace);
            }

            break;

        default:
            break;
        }

        return(gameEvent);
    }