private void Client_OnPuzzleComplete(object sender, PuzzleCompleteArgs e) { string str = string.Format("OnPuzzleComplete: Tower({0}), Floor({1}), Time({2}), AuthToken({3})", e.TowerIndex, e.FloorNumber, e.CompletionTime, AuthStringManager.AuthStringToAscii(e.AuthToken)); LogThread.Log(str, LogInterface.LogMessageType.Normal, true); TaskProcessor.AddTask(new HTask(HTask.HTaskType.PuzzleComplete_FetchData, (HClient)sender, e)); }
void FloorRecord_Process_Handler(Task t) { HTask task = (HTask)t; object[] args = (object[])t.Args; PuzzleCompleteArgs pca = (PuzzleCompleteArgs)args[0]; if (task.Query.Rows.Count > 0) { // record exists, see if this time is better object[] row = task.Query.Rows[0]; int oldTime = (int)row[3]; int newTime = (int)pca.CompletionTime; if (newTime < oldTime) { // Better time, update the record string sql = string.Format("UPDATE floor_records SET best_time={0} WHERE account_id={1} AND tower={2} AND floor={3};", newTime, task.Client.AccountId, pca.TowerIndex, pca.FloorNumber); AddDBQuery(sql, null, false); } } else { // No record for this floor yet, just submit what we have string sql = string.Format("INSERT INTO floor_records SET account_id={0}, tower={1}, floor={2}, best_time={3}, friend_rank={4}, global_rank={5};", task.Client.AccountId, pca.TowerIndex, pca.FloorNumber, (int)pca.CompletionTime, 0, 0); AddDBQuery(sql, null, false); } }
void PuzzleComplete_FetchData_Handler(Task t) { HTask task = (HTask)t; object[] args = (object[])t.Args; PuzzleCompleteArgs pca = (PuzzleCompleteArgs)args[0]; // Validate auth string AuthStringManager.AuthAccountInfo aai = _server.AuthManager.FindAccount(pca.AuthToken); if (aai == null) { // This account isnt in the cache, need to go fetch from global server task.Client.PendingAuthTask = task; _server.GlobalServer.FetchAuthString(pca.AuthToken, task.Client.SessionKey); return; } string sql = string.Format("SELECT * FROM game_data WHERE account_id={0};", aai.AccountID); task.Client.AccountId = aai.AccountID; task.Type = (int)HTask.HTaskType.PuzzleComplete_Validate; task.Args = new object[] { pca, aai }; AddDBQuery(sql, t); }
void PuzzleComplete_Validate_Handler(Task t) { HTask task = (HTask)t; GameDataArgs gameData = ReadGameData(t.Query); object[] args = (object[])t.Args; PuzzleCompleteArgs pca = (PuzzleCompleteArgs)args[0]; AuthStringManager.AuthAccountInfo aai = (AuthStringManager.AuthAccountInfo)args[1]; if (pca.TowerIndex < 0 || pca.TowerIndex >= gameData.TowerFloors.Length) { // Invalid tower number RecordError(task.Client.AccountId, "Invalid floor number submitted: " + pca.TowerIndex); } else { if (pca.FloorNumber > gameData.TowerFloors[pca.TowerIndex]) { // Trying to complete a puzzle further ahead than the current progress?! RecordError(task.Client.AccountId, string.Format("Out of order completion - got:{0}, expected{1}", pca.FloorNumber, gameData.TowerFloors[pca.TowerIndex])); } else { // This is the expected puzzle or a repeat of a previous puzzle // Move to the next puzzle on this floor if (pca.FloorNumber == gameData.TowerFloors[pca.TowerIndex]) { gameData.TowerFloors[pca.TowerIndex]++; } VipDataArgs vda = VipData.Create(aai.Vip); float expBonus = pca.NoExpBonus ? 1 : vda.ExpBonus; // Level up? double baseExp = Balance.BaseExp(pca.TowerIndex); double bonusExp = Balance.BonusExp(pca.TowerIndex, pca.CompletionTime); double total = (baseExp + bonusExp) * expBonus; int exp = (int)total; gameData.Exp += exp; int expForNextLevel = Balance.ExpForNextLevel(gameData.Level); while (gameData.Exp >= expForNextLevel) { gameData.Level++; gameData.Exp -= expForNextLevel; expForNextLevel = Balance.ExpForNextLevel(gameData.Level); } // Unlock next tower? if (pca.TowerIndex < (gameData.TowerFloors.Length - 1) && gameData.TowerFloors[pca.TowerIndex + 1] == 0 && gameData.Level >= Balance.UnlockThreshold(pca.TowerIndex)) { gameData.TowerFloors[pca.TowerIndex + 1] = 1; } // Save changes string sql = string.Format("UPDATE game_data SET tower0={0}, tower1={1}, tower2={2}, tower3={3}, tower4={4}, tower5={5}, level={6}, exp={7} WHERE account_id={8};", gameData.TowerFloors[0], gameData.TowerFloors[1], gameData.TowerFloors[2], gameData.TowerFloors[3], gameData.TowerFloors[4], gameData.TowerFloors[5], gameData.Level, gameData.Exp, task.Client.AccountId); AddDBQuery(sql, null, false); task.Client.SendGameData(gameData); // Store this completion record sql = string.Format("SELECT * FROM floor_records WHERE account_id={0} AND tower={1} AND floor={2};", task.Client.AccountId, pca.TowerIndex, pca.FloorNumber); task.Type = (int)HTask.HTaskType.FloorRecord_Process; AddDBQuery(sql, task); } } }