Esempio n. 1
0
        private Dictionary <int, RadingKind> getRadingArea(IEnumerable <IGrouping <int, Mem_tanker> > tankerInfo, int radingType)
        {
            Mst_DataManager instance = Mst_DataManager.Instance;
            Dictionary <int, RadingKind> dictionary = new Dictionary <int, RadingKind>();

            foreach (IGrouping <int, Mem_tanker> item in tankerInfo)
            {
                int             key            = item.Key;
                int             sc             = item.Count();
                int             req_tanker_num = instance.Mst_maparea[key].Req_tanker_num;
                List <Mem_ship> memShip        = Comm_UserDatas.Instance.User_EscortDeck[key].Ship.getMemShip();
                int             ec             = 0;
                int             ad             = 0;
                int             ad2            = 0;
                memShip.ForEach(delegate(Mem_ship ship)
                {
                    if (ship.IsEscortDeffender())
                    {
                        ec++;
                    }
                    ad  += ship.Taiku;
                    ad2 += ship.Taisen;
                });
                Mst_radingrate radingRecord = instance.Mst_RadingRate[key][radingType];
                if (isRadingSubmarine(radingRecord, ec, ad2))
                {
                    dictionary.Add(key, RadingKind.SUBMARINE_ATTACK);
                }
                else if (isRadingAir(radingRecord, sc, ec, ad))
                {
                    dictionary.Add(key, RadingKind.AIR_ATTACK);
                }
            }
            return(dictionary);
        }
        private bool isRadingAir(Mst_radingrate radingRecord, int sc, int ec, int ad1)
        {
            int    air_rate    = radingRecord.Air_rate;
            int    air_karyoku = radingRecord.Air_karyoku;
            int    num         = air_rate + sc - ec * 3;
            double randDouble  = Utils.GetRandDouble(1.0, 100.0 + Math.Sqrt((double)ad1), 1.0, 1);

            return((double)num > randDouble && (double)ec < Utils.GetRandDouble(1.0, 10.0, 1.0, 1));
        }
        private bool isRadingSubmarine(Mst_radingrate radingRecord, int ec, int ad2)
        {
            int    submarine_rate    = radingRecord.Submarine_rate;
            int    submarine_karyoku = radingRecord.Submarine_karyoku;
            int    num        = submarine_rate - ec * 2;
            double randDouble = Utils.GetRandDouble(1.0, 100.0 + Math.Sqrt((double)ad2), 1.0, 1);

            return((double)num > randDouble && (double)ec < Utils.GetRandDouble(1.0, 10.0, 1.0, 1));
        }
        private Dictionary <int, RadingKind> getRadingArea(IEnumerable <IGrouping <int, Mem_tanker> > tankerInfo, int radingType)
        {
            Mst_DataManager instance = Mst_DataManager.Instance;
            Dictionary <int, RadingKind> dictionary = new Dictionary <int, RadingKind>();

            using (IEnumerator <IGrouping <int, Mem_tanker> > enumerator = tankerInfo.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    IGrouping <int, Mem_tanker> current = enumerator.get_Current();
                    int             key            = current.get_Key();
                    int             sc             = Enumerable.Count <Mem_tanker>(current);
                    int             req_tanker_num = instance.Mst_maparea.get_Item(key).Req_tanker_num;
                    List <Mem_ship> memShip        = Comm_UserDatas.Instance.User_EscortDeck.get_Item(key).Ship.getMemShip();
                    int             ec             = 0;
                    int             ad1            = 0;
                    int             ad2            = 0;
                    memShip.ForEach(delegate(Mem_ship ship)
                    {
                        if (ship.IsEscortDeffender())
                        {
                            ec++;
                        }
                        ad1 += ship.Taiku;
                        ad2 += ship.Taisen;
                    });
                    Mst_radingrate radingRecord = instance.Mst_RadingRate.get_Item(key).get_Item(radingType);
                    if (this.isRadingSubmarine(radingRecord, ec, ad2))
                    {
                        dictionary.Add(key, RadingKind.SUBMARINE_ATTACK);
                    }
                    else if (this.isRadingAir(radingRecord, sc, ec, ad1))
                    {
                        dictionary.Add(key, RadingKind.AIR_ATTACK);
                    }
                }
            }
            return(dictionary);
        }
        private int getRadingTankerLostNum(RadingKind kind, List <Mem_ship> ships, int nowTankerNum, Mst_radingrate radingRecord)
        {
            int radingPow = radingRecord.GetRadingPow(kind);
            int num       = Enumerable.Count <Mem_ship>(ships, (Mem_ship x) => x.IsEscortDeffender());
            int num2      = 0;

            if (num == 0 || Utils.GetRandDouble(1.0, (double)(12 - num), 1.0, 1) >= 6.0)
            {
                if (num == 6)
                {
                    double randDouble = Utils.GetRandDouble(0.0, Math.Sqrt((double)radingPow), 0.1, 1);
                    num2 = (int)(randDouble + 0.5);
                }
                else if (num == 4 || num == 5)
                {
                    double randDouble2 = Utils.GetRandDouble(0.0, Math.Sqrt((double)(radingPow / 2)), 0.1, 1);
                    num2 = (int)(randDouble2 + 0.5);
                }
                else if (num >= 1 && num <= 3)
                {
                    double randDouble3 = Utils.GetRandDouble(0.0, Math.Sqrt((double)radingPow), 0.1, 1);
                    num2 = (int)(randDouble3 + 1.5);
                }
                else if (num == 0)
                {
                    return(nowTankerNum);
                }
            }
            if (num2 > nowTankerNum)
            {
                return(nowTankerNum);
            }
            return(num2);
        }
        private List <RadingDamageData> getRadingDamage(int area, RadingKind kind, Mst_radingrate rateRecord, List <Mem_ship> targetShips, out int deckPow, out List <Mem_ship> deleteShips)
        {
            List <Mem_ship> list = Enumerable.ToList <Mem_ship>(targetShips);
            int             ec   = 0;
            double          ad1  = 0.0;
            double          ad2  = 0.0;

            list.ForEach(delegate(Mem_ship ship)
            {
                if (ship.IsEscortDeffender())
                {
                    ec++;
                }
                Ship_GrowValues battleBaseParam = ship.GetBattleBaseParam();
                int num11 = ship.Taiku - battleBaseParam.Taiku;
                ad1       = ad1 + Math.Sqrt((double)battleBaseParam.Taiku) + (double)num11;
                int num12 = ship.Taisen - battleBaseParam.Taisen;
                ad2       = ad2 + Math.Sqrt((double)battleBaseParam.Taisen) + (double)num12;
            });
            int[]  radingValues = rateRecord.GetRadingValues(kind);
            double num          = (kind != RadingKind.AIR_ATTACK) ? ad2 : ad1;
            int    num2         = radingValues[0];
            int    num3         = radingValues[1];

            deckPow     = (int)num;
            deleteShips = new List <Mem_ship>();
            if (list.get_Count() == 0)
            {
                return(new List <RadingDamageData>());
            }
            RadingResultData radingResultData = new RadingResultData();

            radingResultData.DeckAttackPow = (int)num;
            double num4 = (double)num3 - Math.Sqrt((double)ec);
            int    num5 = (num4 >= 1.0) ? ((int)Utils.GetRandDouble(0.0, num4, 0.1, 1)) : 0;
            List <RadingDamageData>       list2      = new List <RadingDamageData>();
            Dictionary <int, DamageState> dictionary = Enumerable.ToDictionary(Enumerable.Select(list, (Mem_ship x) => new
            {
                rid   = x.Rid,
                state = x.Get_DamageState()
            }), key => key.rid, val => val.state);

            for (int i = 0; i < num5; i++)
            {
                if (list.get_Count() == 0)
                {
                    return(list2);
                }
                RadingDamageData radingDamageData = new RadingDamageData();
                double           num6             = (double)(num3 * 5) - num / 5.0 - Math.Sqrt(num);
                int      num7     = (int)Utils.GetRandDouble(0.0, (double)(list.get_Count() - 1), 1.0, 1);
                Mem_ship mem_ship = list.get_Item(num7);
                radingDamageData.Rid = mem_ship.Rid;
                if (num6 <= 0.0)
                {
                    radingDamageData.Damage      = false;
                    radingDamageData.DamageState = DamagedStates.None;
                }
                else
                {
                    int taik = Mst_DataManager.Instance.Mst_ship.get_Item(mem_ship.Ship_id).Taik;
                    int num8 = (int)((double)taik * Utils.GetRandDouble(1.0, num6, 1.0, 1) / 100.0) + 1;
                    int num9 = mem_ship.Nowhp - num8;
                    if (num9 <= 0)
                    {
                        if (this.basicInstance.Difficult != DifficultKind.SHI)
                        {
                            num9 = 1;
                        }
                        else if (dictionary.get_Item(mem_ship.Rid) != DamageState.Taiha)
                        {
                            num9 = 1;
                        }
                        else
                        {
                            num9 = 0;
                        }
                    }
                    int num10 = mem_ship.Nowhp - num9;
                    if (num10 > 0)
                    {
                        DamageState damageState = mem_ship.Get_DamageState();
                        radingDamageData.Damage = true;
                        if (num9 == 0)
                        {
                            int[] array = mem_ship.FindRecoveryItem();
                            if (array[0] == -1)
                            {
                                radingDamageData.DamageState = DamagedStates.Gekichin;
                                list.Remove(mem_ship);
                                deleteShips.Add(mem_ship);
                            }
                            else
                            {
                                mem_ship.SubHp(num10);
                                mem_ship.UseRecoveryItem(array, false);
                                radingDamageData.DamageState = ((array[1] != 43) ? DamagedStates.Youin : DamagedStates.Megami);
                                dictionary.set_Item(mem_ship.Rid, DamageState.Normal);
                            }
                        }
                        else
                        {
                            mem_ship.SubHp(num10);
                            DamageState damageState2 = mem_ship.Get_DamageState();
                            if (damageState != damageState2)
                            {
                                if (damageState2 == DamageState.Taiha)
                                {
                                    radingDamageData.DamageState = DamagedStates.Taiha;
                                }
                                else if (damageState2 == DamageState.Shouha)
                                {
                                    radingDamageData.DamageState = DamagedStates.Shouha;
                                }
                                else if (damageState2 == DamageState.Tyuuha)
                                {
                                    radingDamageData.DamageState = DamagedStates.Tyuuha;
                                }
                            }
                            else
                            {
                                radingDamageData.DamageState = DamagedStates.None;
                            }
                        }
                    }
                    else
                    {
                        radingDamageData.Damage      = false;
                        radingDamageData.DamageState = DamagedStates.None;
                    }
                }
                list2.Add(radingDamageData);
            }
            return(list2);
        }
        private List <RadingResultData> getRadingResult(int radingPhase, Dictionary <int, RadingKind> targetArea, Dictionary <int, List <Mem_tanker> > tankers)
        {
            DifficultKind           difficult = this.basicInstance.Difficult;
            List <RadingResultData> list      = new List <RadingResultData>();

            using (Dictionary <int, RadingKind> .Enumerator enumerator = targetArea.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    KeyValuePair <int, RadingKind> current = enumerator.get_Current();
                    int key = current.get_Key();
                    List <Mem_tanker> list2           = tankers.get_Item(key);
                    Mst_radingrate    mst_radingrate  = Mst_DataManager.Instance.Mst_RadingRate.get_Item(key).get_Item(radingPhase);
                    int              count            = list2.get_Count();
                    List <Mem_ship>  memShip          = Comm_UserDatas.Instance.User_EscortDeck.get_Item(key).Ship.getMemShip();
                    RadingResultData radingResultData = new RadingResultData();
                    radingResultData.AreaId     = key;
                    radingResultData.AttackKind = current.get_Value();
                    radingResultData.BeforeNum  = list2.get_Count();
                    List <Mem_ship> list3 = null;
                    if (memShip.get_Count() > 0)
                    {
                        radingResultData.FlagShipMstId       = memShip.get_Item(0).Ship_id;
                        radingResultData.FlagShipDamageState = memShip.get_Item(0).Get_DamageState();
                    }
                    radingResultData.RadingDamage = this.getRadingDamage(key, current.get_Value(), mst_radingrate, memShip, out radingResultData.DeckAttackPow, out list3);
                    radingResultData.BreakNum     = this.getRadingTankerLostNum(current.get_Value(), memShip, count, mst_radingrate);
                    IEnumerable <Mem_tanker> enumerable = Enumerable.Take <Mem_tanker>(list2, radingResultData.BreakNum);
                    if (radingResultData.RadingDamage.get_Count() > 0)
                    {
                        List <int> list4 = new List <int>();
                        using (List <Mem_ship> .Enumerator enumerator2 = memShip.GetEnumerator())
                        {
                            Mem_ship checkShip;
                            while (enumerator2.MoveNext())
                            {
                                checkShip = enumerator2.get_Current();
                                if (Enumerable.Any <RadingDamageData>(radingResultData.RadingDamage, (RadingDamageData x) => x.Rid == checkShip.Rid && x.Damage) && checkShip.Get_DamageState() >= DamageState.Tyuuha)
                                {
                                    list4.Add(checkShip.Ship_id);
                                }
                            }
                        }
                        Comm_UserDatas.Instance.UpdateShipBookBrokenClothState(list4);
                    }
                    using (List <Mem_ship> .Enumerator enumerator3 = list3.GetEnumerator())
                    {
                        while (enumerator3.MoveNext())
                        {
                            Mem_ship current2 = enumerator3.get_Current();
                            Comm_UserDatas.Instance.User_EscortDeck.get_Item(key).Ship.RemoveShip(current2.Rid);
                            Comm_UserDatas.Instance.User_record.AddLostShipCount();
                        }
                    }
                    Comm_UserDatas.Instance.Remove_Ship(list3);
                    using (IEnumerator <Mem_tanker> enumerator4 = enumerable.GetEnumerator())
                    {
                        while (enumerator4.MoveNext())
                        {
                            Mem_tanker current3 = enumerator4.get_Current();
                            Comm_UserDatas.Instance.Remove_Tanker(current3.Rid);
                        }
                    }
                    if (radingResultData.BeforeNum > 0)
                    {
                        double num = (double)radingResultData.BreakNum / (double)radingResultData.BeforeNum;
                        if (num >= 0.5)
                        {
                            int         mapinfo_id  = Mst_mapinfo.ConvertMapInfoId(key, 1);
                            Mem_history mem_history = new Mem_history();
                            mem_history.SetTanker(this.turnInstance.Total_turn, mapinfo_id, num >= 1.0);
                            Comm_UserDatas.Instance.Add_History(mem_history);
                        }
                    }
                    list.Add(radingResultData);
                }
            }
            return(list);
        }
Esempio n. 8
0
        private int getRadingTankerLostNum(RadingKind kind, List <Mem_ship> ships, int nowTankerNum, Mst_radingrate radingRecord)
        {
            int radingPow = radingRecord.GetRadingPow(kind);
            int num       = ships.Count((Mem_ship x) => x.IsEscortDeffender());
            int num2      = 0;

            if (num == 0 || Utils.GetRandDouble(1.0, 12 - num, 1.0, 1) >= 6.0)
            {
                switch (num)
                {
                case 6:
                {
                    double randDouble = Utils.GetRandDouble(0.0, Math.Sqrt(radingPow), 0.1, 1);
                    num2 = (int)(randDouble + 0.5);
                    break;
                }

                case 4:
                case 5:
                {
                    double randDouble3 = Utils.GetRandDouble(0.0, Math.Sqrt(radingPow / 2), 0.1, 1);
                    num2 = (int)(randDouble3 + 0.5);
                    break;
                }

                case 1:
                case 2:
                case 3:
                {
                    double randDouble2 = Utils.GetRandDouble(0.0, Math.Sqrt(radingPow), 0.1, 1);
                    num2 = (int)(randDouble2 + 1.5);
                    break;
                }

                default:
                    if (num == 0)
                    {
                        return(nowTankerNum);
                    }
                    break;
                }
            }
            if (num2 > nowTankerNum)
            {
                return(nowTankerNum);
            }
            return(num2);
        }
Esempio n. 9
0
        private List <RadingDamageData> getRadingDamage(int area, RadingKind kind, Mst_radingrate rateRecord, List <Mem_ship> targetShips, out int deckPow, out List <Mem_ship> deleteShips)
        {
            List <Mem_ship> list = targetShips.ToList();
            int             ec   = 0;
            double          ad3  = 0.0;
            double          ad2  = 0.0;

            list.ForEach(delegate(Mem_ship ship)
            {
                if (ship.IsEscortDeffender())
                {
                    ec++;
                }
                Ship_GrowValues battleBaseParam = ship.GetBattleBaseParam();
                int num9  = ship.Taiku - battleBaseParam.Taiku;
                ad3       = ad3 + Math.Sqrt(battleBaseParam.Taiku) + (double)num9;
                int num10 = ship.Taisen - battleBaseParam.Taisen;
                ad2       = ad2 + Math.Sqrt(battleBaseParam.Taisen) + (double)num10;
            });
            int[]  radingValues = rateRecord.GetRadingValues(kind);
            double num          = (kind != RadingKind.AIR_ATTACK) ? ad2 : ad3;
            int    num11        = radingValues[0];
            int    num2         = radingValues[1];

            deckPow     = (int)num;
            deleteShips = new List <Mem_ship>();
            if (list.Count == 0)
            {
                return(new List <RadingDamageData>());
            }
            RadingResultData radingResultData = new RadingResultData();

            radingResultData.DeckAttackPow = (int)num;
            double num3 = (double)num2 - Math.Sqrt(ec);
            int    num4 = (!(num3 < 1.0)) ? ((int)Utils.GetRandDouble(0.0, num3, 0.1, 1)) : 0;
            List <RadingDamageData>       list2      = new List <RadingDamageData>();
            Dictionary <int, DamageState> dictionary = (from x in list
                                                        select new
            {
                rid = x.Rid,
                state = x.Get_DamageState()
            }).ToDictionary(key => key.rid, val => val.state);

            for (int i = 0; i < num4; i++)
            {
                if (list.Count == 0)
                {
                    return(list2);
                }
                RadingDamageData radingDamageData = new RadingDamageData();
                double           num5             = (double)(num2 * 5) - num / 5.0 - Math.Sqrt(num);
                int      index    = (int)Utils.GetRandDouble(0.0, list.Count - 1, 1.0, 1);
                Mem_ship mem_ship = list[index];
                radingDamageData.Rid = mem_ship.Rid;
                if (num5 <= 0.0)
                {
                    radingDamageData.Damage      = false;
                    radingDamageData.DamageState = DamagedStates.None;
                }
                else
                {
                    int taik = Mst_DataManager.Instance.Mst_ship[mem_ship.Ship_id].Taik;
                    int num6 = (int)((double)taik * Utils.GetRandDouble(1.0, num5, 1.0, 1) / 100.0) + 1;
                    int num7 = mem_ship.Nowhp - num6;
                    if (num7 <= 0)
                    {
                        num7 = ((basicInstance.Difficult != DifficultKind.SHI) ? 1 : ((dictionary[mem_ship.Rid] != DamageState.Taiha) ? 1 : 0));
                    }
                    int num8 = mem_ship.Nowhp - num7;
                    if (num8 > 0)
                    {
                        DamageState damageState = mem_ship.Get_DamageState();
                        radingDamageData.Damage = true;
                        if (num7 == 0)
                        {
                            int[] array = mem_ship.FindRecoveryItem();
                            if (array[0] == -1)
                            {
                                radingDamageData.DamageState = DamagedStates.Gekichin;
                                list.Remove(mem_ship);
                                deleteShips.Add(mem_ship);
                            }
                            else
                            {
                                mem_ship.SubHp(num8);
                                mem_ship.UseRecoveryItem(array, flagShipRecovery: false);
                                radingDamageData.DamageState = ((array[1] != 43) ? DamagedStates.Youin : DamagedStates.Megami);
                                dictionary[mem_ship.Rid]     = DamageState.Normal;
                            }
                        }
                        else
                        {
                            mem_ship.SubHp(num8);
                            DamageState damageState2 = mem_ship.Get_DamageState();
                            if (damageState != damageState2)
                            {
                                switch (damageState2)
                                {
                                case DamageState.Taiha:
                                    radingDamageData.DamageState = DamagedStates.Taiha;
                                    break;

                                case DamageState.Shouha:
                                    radingDamageData.DamageState = DamagedStates.Shouha;
                                    break;

                                case DamageState.Tyuuha:
                                    radingDamageData.DamageState = DamagedStates.Tyuuha;
                                    break;
                                }
                            }
                            else
                            {
                                radingDamageData.DamageState = DamagedStates.None;
                            }
                        }
                    }
                    else
                    {
                        radingDamageData.Damage      = false;
                        radingDamageData.DamageState = DamagedStates.None;
                    }
                }
                list2.Add(radingDamageData);
            }
            return(list2);
        }
Esempio n. 10
0
        private List <RadingResultData> getRadingResult(int radingPhase, Dictionary <int, RadingKind> targetArea, Dictionary <int, List <Mem_tanker> > tankers)
        {
            DifficultKind           difficult = basicInstance.Difficult;
            List <RadingResultData> list      = new List <RadingResultData>();

            foreach (KeyValuePair <int, RadingKind> item in targetArea)
            {
                int key = item.Key;
                List <Mem_tanker> list2           = tankers[key];
                Mst_radingrate    mst_radingrate  = Mst_DataManager.Instance.Mst_RadingRate[key][radingPhase];
                int              count            = list2.Count;
                List <Mem_ship>  memShip          = Comm_UserDatas.Instance.User_EscortDeck[key].Ship.getMemShip();
                RadingResultData radingResultData = new RadingResultData();
                radingResultData.AreaId     = key;
                radingResultData.AttackKind = item.Value;
                radingResultData.BeforeNum  = list2.Count;
                List <Mem_ship> deleteShips = null;
                if (memShip.Count > 0)
                {
                    radingResultData.FlagShipMstId       = memShip[0].Ship_id;
                    radingResultData.FlagShipDamageState = memShip[0].Get_DamageState();
                }
                radingResultData.RadingDamage = getRadingDamage(key, item.Value, mst_radingrate, memShip, out radingResultData.DeckAttackPow, out deleteShips);
                radingResultData.BreakNum     = getRadingTankerLostNum(item.Value, memShip, count, mst_radingrate);
                IEnumerable <Mem_tanker> enumerable = list2.Take(radingResultData.BreakNum);
                if (radingResultData.RadingDamage.Count > 0)
                {
                    List <int> list3 = new List <int>();
                    using (List <Mem_ship> .Enumerator enumerator2 = memShip.GetEnumerator())
                    {
                        Mem_ship checkShip;
                        while (enumerator2.MoveNext())
                        {
                            checkShip = enumerator2.Current;
                            if (radingResultData.RadingDamage.Any((RadingDamageData x) => x.Rid == checkShip.Rid && x.Damage) && checkShip.Get_DamageState() >= DamageState.Tyuuha)
                            {
                                list3.Add(checkShip.Ship_id);
                            }
                        }
                    }
                    Comm_UserDatas.Instance.UpdateShipBookBrokenClothState(list3);
                }
                foreach (Mem_ship item2 in deleteShips)
                {
                    Comm_UserDatas.Instance.User_EscortDeck[key].Ship.RemoveShip(item2.Rid);
                    Comm_UserDatas.Instance.User_record.AddLostShipCount();
                }
                Comm_UserDatas.Instance.Remove_Ship(deleteShips);
                foreach (Mem_tanker item3 in enumerable)
                {
                    Comm_UserDatas.Instance.Remove_Tanker(item3.Rid);
                }
                if (radingResultData.BeforeNum > 0)
                {
                    double num = (double)radingResultData.BreakNum / (double)radingResultData.BeforeNum;
                    if (num >= 0.5)
                    {
                        int         mapinfo_id  = Mst_mapinfo.ConvertMapInfoId(key, 1);
                        Mem_history mem_history = new Mem_history();
                        mem_history.SetTanker(turnInstance.Total_turn, mapinfo_id, (num >= 1.0) ? true : false);
                        Comm_UserDatas.Instance.Add_History(mem_history);
                    }
                }
                list.Add(radingResultData);
            }
            return(list);
        }