FlagService.cs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Sfs2X.Entities.Data;
  5. public class FlagService : GameRoomService
  6. {
  7. private bool isGameStart = false;
  8. public int waitResetFlagTime = -1;
  9. public FlagService (ResponseDelegate callBack):base(callBack)
  10. {
  11. }
  12. override protected void InitGame()
  13. {
  14. base.InitGame();
  15. AttempAddStation(0, TeamUtil.Team.Blue.GetHashCode());
  16. AttempAddStation(1, TeamUtil.Team.Red.GetHashCode());
  17. }
  18. public void ResetFlags()
  19. {
  20. flagDict.Add(TeamUtil.Team.Blue.GetHashCode(), new ServiceFlag(TeamUtil.Team.Blue.GetHashCode(), 0, 0));
  21. flagDict.Add(TeamUtil.Team.Red.GetHashCode(), new ServiceFlag(TeamUtil.Team.Red.GetHashCode(), 0, 0));
  22. }
  23. public void SendFlagAdded()
  24. {
  25. SFSObject data = new SFSObject();
  26. data.PutSFSArray("l", GetFlagDataArray());
  27. Send(Command.AddFlag.ToString(), data);
  28. }
  29. public override bool AttempGetFlag(int userId)
  30. {
  31. ServicePlayer player = GetPlayer(userId);
  32. if(player != null && player.craftId != -1)
  33. {
  34. int teamId = TeamUtil.GetOpponentTeam(player.teamId).GetHashCode();
  35. ServiceFlag flag = flagDict[teamId];
  36. if(flag.craftId == -1)
  37. {
  38. flag.craftId = player.craftId;
  39. flag.x = 0;
  40. flag.y = 0;
  41. flag.inBase = false;
  42. return true;
  43. }
  44. }
  45. return false;
  46. }
  47. public override bool AttempPutFlag(int userId, int teamId, int x, int y)
  48. {
  49. ServicePlayer player = GetPlayer(userId);
  50. if(player != null && player.craftId != -1)
  51. {
  52. ServiceFlag flag = flagDict[teamId];
  53. if(teamId == player.teamId)
  54. {
  55. flag.craftId = -1;
  56. flag.x = 0;
  57. flag.y = 0;
  58. flag.inBase = true;
  59. return true;
  60. }
  61. else
  62. {
  63. flag.craftId = -1;
  64. flag.x = x;
  65. flag.y = y;
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71. public override bool AttempCaptureFlag(int userId)
  72. {
  73. ServicePlayer player = GetPlayer(userId);
  74. if(player != null && player.craftId != -1)
  75. {
  76. int teamId = player.teamId;
  77. ServiceFlag myFlag = flagDict[teamId];
  78. ServiceFlag oppFlag = flagDict[TeamUtil.GetOpponentTeam(teamId).GetHashCode()];
  79. if(myFlag != null & oppFlag != null && myFlag.craftId == -1 && oppFlag.craftId == player.craftId)
  80. {
  81. flagDict.Clear();
  82. if(player.teamId == TeamUtil.Team.Blue.GetHashCode())
  83. {
  84. blueScore++;
  85. }
  86. else
  87. {
  88. redScore++;
  89. }
  90. waitResetFlagTime = GetGameTime() + (int)taskInterval;
  91. return true;
  92. }
  93. }
  94. return false;
  95. }
  96. public SFSObject GetScoreData(int winTeam)
  97. {
  98. if(isGameOver)
  99. {
  100. return null;
  101. }
  102. int freeTime = GetFreeTime();
  103. int time = roundTime - GetGameTime();
  104. if(time <= 0)
  105. {
  106. if(blueScore > redScore)
  107. {
  108. winTeam = TeamUtil.Team.Blue.GetHashCode();
  109. }
  110. else if(blueScore < redScore)
  111. {
  112. winTeam = TeamUtil.Team.Red.GetHashCode();
  113. }
  114. else
  115. {
  116. winTeam = TeamUtil.Team.Yellow.GetHashCode();
  117. }
  118. }
  119. SFSObject data = new SFSObject();
  120. data.PutInt("t", time);
  121. data.PutInt("f", freeTime);
  122. data.PutInt("b", blueScore);
  123. data.PutInt("r", redScore);
  124. if(flagDict.Count > 0)
  125. {
  126. SFSArray l = new SFSArray();
  127. PutFlagData(flagDict[TeamUtil.Team.Blue.GetHashCode()], l);
  128. PutFlagData(flagDict[TeamUtil.Team.Red.GetHashCode()], l);
  129. data.PutSFSArray("fl", l);
  130. }
  131. if(winTeam > 0)
  132. {
  133. DealGameOver(data, winTeam);
  134. }
  135. return data;
  136. }
  137. private void PutFlagData(ServiceFlag flag, ISFSArray arr)
  138. {
  139. if(flag != null)
  140. {
  141. ISFSObject obj = new SFSObject();
  142. obj.PutInt("t", flag.teamId);
  143. obj.PutInt("x", flag.x);
  144. obj.PutInt("y", flag.y);
  145. obj.PutInt("c", flag.craftId);
  146. arr.AddSFSObject(obj);
  147. }
  148. }
  149. override protected void DoTask()
  150. {
  151. SendBattleInfo(GetScoreData(-1), GetPlayerChangeData(), GetAiTakerChangeData());
  152. if(!isGameStart)
  153. {
  154. if(GetFreeTime() == 0)
  155. {
  156. isGameStart = true;
  157. ResetFlags();
  158. SendFlagAdded();
  159. }
  160. }
  161. else if(waitResetFlagTime != -1 && GetGameTime()>waitResetFlagTime)
  162. {
  163. waitResetFlagTime = -1;
  164. ResetFlags();
  165. SendFlagAdded();
  166. }
  167. }
  168. override protected void SavePlayerScore(SFSObject data, int winTeam)
  169. {
  170. SFSArray stats = new SFSArray();
  171. int roundMin = roundTime/60/1000;
  172. if(roundMin <= 0)
  173. {
  174. roundMin = 1;
  175. }
  176. List<ServicePlayer> list = new List<ServicePlayer>();
  177. list.Add(myPlayer);
  178. for(int i=0; i<list.Count; i++)
  179. {
  180. ServicePlayer player = list[i];
  181. SFSObject statsInfo = new SFSObject();
  182. statsInfo.PutInt("u", player.userId);
  183. statsInfo.PutInt("k", player.kill);
  184. statsInfo.PutInt("a", player.assists);
  185. statsInfo.PutInt("d", player.death);
  186. int rankScore = player.kill * 10 + player.assists * 2;
  187. int expScore = rankScore;
  188. int time = (roundTime - player.joinTime)/60/1000 + 1;
  189. int win = 0;
  190. int lose = 0;
  191. int coinGet = 0;
  192. if(time > roundMin)
  193. time = roundMin;
  194. if(winTeam == TeamUtil.Team.Yellow.GetHashCode())
  195. {
  196. rankScore += 100*time/roundMin;
  197. expScore += 100*time/roundMin;
  198. coinGet = 80*time/roundMin;
  199. }
  200. else if(player.teamId == winTeam)
  201. {
  202. rankScore += 300*time/roundMin;
  203. expScore += 300*time/roundMin;
  204. coinGet = 100*time/roundMin;
  205. win = 1;
  206. }
  207. else
  208. {
  209. rankScore -= 300*time/roundMin;
  210. expScore += 100*time/roundMin;
  211. coinGet = 80*time/roundMin;
  212. lose = 1;
  213. }
  214. statsInfo.PutInt("t", time);
  215. statsInfo.PutInt("r", rankScore);
  216. statsInfo.PutInt("e", expScore);
  217. statsInfo.PutInt("c", coinGet);
  218. stats.AddSFSObject(statsInfo);
  219. }
  220. data.PutSFSArray("s", stats);
  221. }
  222. }