DefenseService.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using Sfs2X.Entities.Data;
  5. public class DefenseService : GameRoomService
  6. {
  7. public const int SEND_ITEM_INTERVAL = 20*1000;
  8. private int lastAddItemTime = 0;
  9. public DefenseService (ResponseDelegate callBack):base(callBack)
  10. {
  11. }
  12. override protected void InitGame()
  13. {
  14. base.InitGame();
  15. lastAddItemTime = GetTime() - SEND_ITEM_INTERVAL;
  16. AttempAddStation(0, TeamUtil.Team.Blue.GetHashCode());
  17. AttempAddStation(1, TeamUtil.Team.Red.GetHashCode());
  18. AddDoor(0, TeamUtil.Team.Blue.GetHashCode());
  19. AddDoor(1, TeamUtil.Team.Blue.GetHashCode());
  20. AddDoor(2, TeamUtil.Team.Red.GetHashCode());
  21. AddDoor(3, TeamUtil.Team.Red.GetHashCode());
  22. }
  23. public override void RemoveStation (int stationId)
  24. {
  25. foreach(KeyValuePair<int, ServiceStation> kvp in stationDict)
  26. {
  27. ServiceStation station = kvp.Value;
  28. if(station.id == stationId)
  29. {
  30. stationDict.Remove(kvp.Key);
  31. KeyStationDestroyed(station.teamId);
  32. return;
  33. }
  34. }
  35. }
  36. private void SendItem()
  37. {
  38. SFSArray items = new SFSArray();
  39. foreach(KeyValuePair<int, ServiceItemPos> kvp in itemPosDict)
  40. {
  41. ServiceItemPos itemPos = kvp.Value;
  42. if(itemPos.itemId == -1)
  43. {
  44. itemPos.itemId = MapItem.BIGGER;
  45. SFSObject itemObj = new SFSObject();
  46. itemObj.PutInt("i", itemPos.id);
  47. itemObj.PutInt("t", itemPos.itemId);
  48. items.AddSFSObject(itemObj);
  49. }
  50. }
  51. if(items.Size() > 0)
  52. {
  53. SFSObject data = new SFSObject();
  54. data.PutSFSArray("l", items);
  55. Send(Command.AddMapItem.ToString(), data);
  56. }
  57. }
  58. private void KeyStationDestroyed(int teamId)
  59. {
  60. TeamUtil.Team team = TeamUtil.GetTeam(teamId);
  61. TeamUtil.Team winTeam = TeamUtil.GetOpponentTeam(team);
  62. SendBattleInfo(GetScoreData(winTeam.GetHashCode()), GetPlayerChangeData(), GetAiTakerChangeData());
  63. }
  64. public SFSObject GetScoreData(int winTeam)
  65. {
  66. if(isGameOver)
  67. {
  68. return null;
  69. }
  70. SFSObject data = new SFSObject();
  71. int freeTime = GetFreeTime();
  72. int time = roundTime - GetGameTime();
  73. if(time <= 0)
  74. {
  75. winTeam = FindWinTeam();
  76. }
  77. data.PutInt("t", time);
  78. data.PutInt("f", freeTime);
  79. if(winTeam > 0)
  80. {
  81. DealGameOver(data, winTeam);
  82. }
  83. return data;
  84. }
  85. private int FindWinTeam()
  86. {
  87. float blueDoorCount = 0;
  88. float redDoorCount = 0;
  89. foreach(KeyValuePair<int, ServiceDoor> kvp in doorDict)
  90. {
  91. if(kvp.Value.teamId == TeamUtil.Team.Blue.GetHashCode())
  92. {
  93. blueDoorCount++;
  94. }
  95. else if(kvp.Value.teamId == TeamUtil.Team.Red.GetHashCode())
  96. {
  97. redDoorCount++;
  98. }
  99. }
  100. if(blueDoorCount > redDoorCount)
  101. return TeamUtil.Team.Blue.GetHashCode();
  102. else if(blueDoorCount < redDoorCount)
  103. return TeamUtil.Team.Red.GetHashCode();
  104. return TeamUtil.Team.Blue.GetHashCode();
  105. }
  106. protected override void DoTask ()
  107. {
  108. SendBattleInfo(GetScoreData(-1), GetPlayerChangeData(), GetAiTakerChangeData());
  109. if(GetFreeTime() == 0)
  110. {
  111. if(GetTime() - lastAddItemTime >= SEND_ITEM_INTERVAL)
  112. {
  113. lastAddItemTime += SEND_ITEM_INTERVAL;
  114. SendItem();
  115. }
  116. }
  117. }
  118. override protected void SavePlayerScore(SFSObject data, int winTeam)
  119. {
  120. SFSArray stats = new SFSArray();
  121. List<ServicePlayer> list = new List<ServicePlayer>();
  122. list.Add(myPlayer);
  123. for(int i=0; i<list.Count; i++)
  124. {
  125. ServicePlayer player = list[i];
  126. SFSObject statsInfo = new SFSObject();
  127. statsInfo.PutInt("u", player.userId);
  128. statsInfo.PutInt("k", player.kill);
  129. statsInfo.PutInt("a", player.assists);
  130. statsInfo.PutInt("d", player.death);
  131. int rankScore = player.kill * 10 + player.assists * 2;
  132. int expScore = rankScore;
  133. int win = 0;
  134. int lose = 0;
  135. int coinGet = 0;
  136. if(player.teamId == winTeam)
  137. win = 1;
  138. else
  139. lose = 1;
  140. statsInfo.PutInt("r", rankScore);
  141. statsInfo.PutInt("e", expScore);
  142. statsInfo.PutInt("c", coinGet);
  143. stats.AddSFSObject(statsInfo);
  144. }
  145. data.PutSFSArray("s", stats);
  146. }
  147. }