using UnityEngine; using System.Collections; using System.Collections.Generic; using Sfs2X.Entities.Data; public class FlagService : GameRoomService { private bool isGameStart = false; public int waitResetFlagTime = -1; public FlagService (ResponseDelegate callBack):base(callBack) { } override protected void InitGame() { base.InitGame(); AttempAddStation(0, TeamUtil.Team.Blue.GetHashCode()); AttempAddStation(1, TeamUtil.Team.Red.GetHashCode()); } public void ResetFlags() { flagDict.Add(TeamUtil.Team.Blue.GetHashCode(), new ServiceFlag(TeamUtil.Team.Blue.GetHashCode(), 0, 0)); flagDict.Add(TeamUtil.Team.Red.GetHashCode(), new ServiceFlag(TeamUtil.Team.Red.GetHashCode(), 0, 0)); } public void SendFlagAdded() { SFSObject data = new SFSObject(); data.PutSFSArray("l", GetFlagDataArray()); Send(Command.AddFlag.ToString(), data); } public override bool AttempGetFlag(int userId) { ServicePlayer player = GetPlayer(userId); if(player != null && player.craftId != -1) { int teamId = TeamUtil.GetOpponentTeam(player.teamId).GetHashCode(); ServiceFlag flag = flagDict[teamId]; if(flag.craftId == -1) { flag.craftId = player.craftId; flag.x = 0; flag.y = 0; flag.inBase = false; return true; } } return false; } public override bool AttempPutFlag(int userId, int teamId, int x, int y) { ServicePlayer player = GetPlayer(userId); if(player != null && player.craftId != -1) { ServiceFlag flag = flagDict[teamId]; if(teamId == player.teamId) { flag.craftId = -1; flag.x = 0; flag.y = 0; flag.inBase = true; return true; } else { flag.craftId = -1; flag.x = x; flag.y = y; return true; } } return false; } public override bool AttempCaptureFlag(int userId) { ServicePlayer player = GetPlayer(userId); if(player != null && player.craftId != -1) { int teamId = player.teamId; ServiceFlag myFlag = flagDict[teamId]; ServiceFlag oppFlag = flagDict[TeamUtil.GetOpponentTeam(teamId).GetHashCode()]; if(myFlag != null & oppFlag != null && myFlag.craftId == -1 && oppFlag.craftId == player.craftId) { flagDict.Clear(); if(player.teamId == TeamUtil.Team.Blue.GetHashCode()) { blueScore++; } else { redScore++; } waitResetFlagTime = GetGameTime() + (int)taskInterval; return true; } } return false; } public SFSObject GetScoreData(int winTeam) { if(isGameOver) { return null; } int freeTime = GetFreeTime(); int time = roundTime - GetGameTime(); if(time <= 0) { if(blueScore > redScore) { winTeam = TeamUtil.Team.Blue.GetHashCode(); } else if(blueScore < redScore) { winTeam = TeamUtil.Team.Red.GetHashCode(); } else { winTeam = TeamUtil.Team.Yellow.GetHashCode(); } } SFSObject data = new SFSObject(); data.PutInt("t", time); data.PutInt("f", freeTime); data.PutInt("b", blueScore); data.PutInt("r", redScore); if(flagDict.Count > 0) { SFSArray l = new SFSArray(); PutFlagData(flagDict[TeamUtil.Team.Blue.GetHashCode()], l); PutFlagData(flagDict[TeamUtil.Team.Red.GetHashCode()], l); data.PutSFSArray("fl", l); } if(winTeam > 0) { DealGameOver(data, winTeam); } return data; } private void PutFlagData(ServiceFlag flag, ISFSArray arr) { if(flag != null) { ISFSObject obj = new SFSObject(); obj.PutInt("t", flag.teamId); obj.PutInt("x", flag.x); obj.PutInt("y", flag.y); obj.PutInt("c", flag.craftId); arr.AddSFSObject(obj); } } override protected void DoTask() { SendBattleInfo(GetScoreData(-1), GetPlayerChangeData(), GetAiTakerChangeData()); if(!isGameStart) { if(GetFreeTime() == 0) { isGameStart = true; ResetFlags(); SendFlagAdded(); } } else if(waitResetFlagTime != -1 && GetGameTime()>waitResetFlagTime) { waitResetFlagTime = -1; ResetFlags(); SendFlagAdded(); } } override protected void SavePlayerScore(SFSObject data, int winTeam) { SFSArray stats = new SFSArray(); int roundMin = roundTime/60/1000; if(roundMin <= 0) { roundMin = 1; } List list = new List(); list.Add(myPlayer); for(int i=0; i roundMin) time = roundMin; if(winTeam == TeamUtil.Team.Yellow.GetHashCode()) { rankScore += 100*time/roundMin; expScore += 100*time/roundMin; coinGet = 80*time/roundMin; } else if(player.teamId == winTeam) { rankScore += 300*time/roundMin; expScore += 300*time/roundMin; coinGet = 100*time/roundMin; win = 1; } else { rankScore -= 300*time/roundMin; expScore += 100*time/roundMin; coinGet = 80*time/roundMin; lose = 1; } statsInfo.PutInt("t", time); statsInfo.PutInt("r", rankScore); statsInfo.PutInt("e", expScore); statsInfo.PutInt("c", coinGet); stats.AddSFSObject(statsInfo); } data.PutSFSArray("s", stats); } }