Esempio n. 1
0
        /// <summary>
        /// 战斗结算
        /// </summary>
        public static ErrorCode Settle(int userId, string battleId, TBattleResult result, bool isManual, out TBattleSettle settle, int playerId)
        {
            settle = null;
            if (result == null)
            {
                return(ErrorCode.Success);
            }
            settle = new TBattleSettle()
            {
                BattleType  = result.BattleType,
                IsMyWin     = userId == (result == null ? 0 : result.WinPlayerId),
                BonusOutput = null,
                Round       = result == null ? 1 : result.SettleRound,
                Success     = result != null,
                BattleId    = battleId,
                IsManual    = isManual,
            };
            //结算失败, 没有战斗结果
            if (!settle.Success)
            {
                return(ErrorCode.Success);
            }
            //根据战斗类型结算
            var err = ErrorCode.Success;

            switch ((BattleType)result.BattleType)
            {
            //挑战
            case BattleType.PK:
                err = SettleUserPK(userId, settle);
                if (err != ErrorCode.Success)
                {
                    return(err);
                }
                break;

            //合作
            case BattleType.COOP:
                err = SettleUserCoop(userId, settle);
                if (err != ErrorCode.Success)
                {
                    return(err);
                }
                break;

            //随机竞技场
            case BattleType.PKRANDOM:
                err = SettleUserPKRandom(userId, settle, playerId);
                if (err != ErrorCode.Success)
                {
                    return(err);
                }
                break;

            default:
                Logger.LogError($"User[{userId}]: Unknown battleType[{result.BattleType}] to settle");
                return(ErrorCode.InvalidParameter);
            }
            return(ErrorCode.Success);
        }
Esempio n. 2
0
        public TBattleResult Simulate(TBattleRecord record)
        {
            LuaTable table;

            try
            {
                var times = Interlocked.Increment(ref _battleTimes);
                if (times >= _reInitCount && times % _reInitCount == 0)
                {
                    InitState();
                    Logger.LogDebug("Reinit Lua State");
                }

                Stopwatch watch = new Stopwatch();
                watch.Start();

                //Logger.LogWarning("Simulate Battle [" + record.ToJson() + "]");
                table = _battleEntry.invoke("entry", record.ToLua(), false) as LuaTable;

                var result = new TBattleResult()
                {
                    WinPlayerId = table["winPlayerId"].ToInt(),
                    FrameCount  = table["frameCount"].ToInt(),
                    RoundNum    = table["roundNum"].ToInt(),
                };

                watch.Stop();
                Logger.LogDebug($"Battle Simulate BattleId[{record.BattleId}] FrameCount[{record.FrameCount}] Result[{result.ToJson()}] Finish. Time cost [{watch.ElapsedMilliseconds}]ms");

                return(result);
            }
            catch (Exception e)
            {
                Logger.LogError(e, "Simulate lua battle failed.");

                InitState();

                _ = BattleService.ReportBattleException(Host.ServerId, record.PlayerList[0].PlayerId, BattleVersion, record.ToLua());
            }

            return(null);
        }