123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266 |
- 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<ServicePlayer> list = new List<ServicePlayer>();
- list.Add(myPlayer);
-
- for(int i=0; i<list.Count; i++)
- {
- ServicePlayer player = list[i];
-
- SFSObject statsInfo = new SFSObject();
- statsInfo.PutInt("u", player.userId);
- statsInfo.PutInt("k", player.kill);
- statsInfo.PutInt("a", player.assists);
- statsInfo.PutInt("d", player.death);
-
- int rankScore = player.kill * 10 + player.assists * 2;
- int expScore = rankScore;
- int time = (roundTime - player.joinTime)/60/1000 + 1;
- int win = 0;
- int lose = 0;
- int coinGet = 0;
-
- if(time > 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);
- }
- }
|