///
///
class GameTableBase {
public ActivePlayer: TGamePlayer;
public Players: TGamePlayer[];
public Status = TableStatus.New;
constructor(private GamePlayerClass, public Channel = '', public Mode = 0, public MaxPlayersCount = 2, public IsVIPTable = false) {
this.Players = [];
}
public join(user, ipaddress, channel, mode) {
var player = this.Players.filter(p => p.UserID == user.UserID)[0];
if (!player)
player = new this.GamePlayerClass(user.UserID, ipaddress, user.IsVIP, true);
player.IsOnline = true;
switch (this.Status) {
// ახალი მაგიდაა და მოთამაშეები ივსება ჯერ
case TableStatus.New:
{
if (!this.Players.contains(player)) {
this.Players.push(player);
this.playersChanged();
}
// თუ 2 კაცი შეიკრიბა თამაში დაიწყოს
if (this.Players.length == this.MaxPlayersCount) {
this.start();
}
}
break;
// დაწყებული იყო თამაში და აგრძელებს თამაშს
case TableStatus.Started:
case TableStatus.StartedWaiting:
{
if (!this.Players.contains(player)) return;
this.Status = TableStatus.Started;
this.playersChanged();
}
break;
// სხვა ყველა შემთხვევებში ვუშვებთ უკან, ახალი მოთამაშე ვერ შემოვა
default:
return;
}
}
public leave(userid: number) {
var player = this.Players.filter(p=> p.UserID == userid)[0];
if (player == null) return;
player.IsOnline = false;
switch (this.Status) {
// თუ ჯერ არ დაწყებულა თამაში, იშლება მოთამაშე სიიდან ეგრევე
case TableStatus.New:
{
this.Players.remove(player);
this.playersChanged();
}
break;
// თუ დაწყებული იყო თამაში, მაგიდის სტატუსი იცვლება და მაგიდაზე დარჩენილ
// მოთამაშეს ეგზავნება მაგიდის განახლებული მდგომარეობა
case TableStatus.Started:
{
// თუ ორივე მოთამაშემ არ გააკეთა ერთ სვლა მაინც, მაგიდის სტატუსი გადადის ახალზე
if (this.Players.filter(p => p.HasAnyMoveMade).length != 2) {
this.Status = TableStatus.New;
this.Players.remove(player);
this.playersChanged();
break;
}
this.Status = TableStatus.StartedWaiting;
this.playersChanged();
}
break;
case TableStatus.Finished:
{
this.Players.remove(player);
this.playersChanged();
}
break;
// სხვა ყველა შემთხვევაში, უბრალოდ გამოვდივართ
default:
return;
}
}
start() {
}
finish() {
}
playersChanged() {
}
send(command: string, ...params: any[]) {
params.unshift(command);
this.Players.forEach(p => p.send.apply(p, params));
}
getNextPlayer(player?: TGamePlayer): TGamePlayer {
if (this.Players.length <= 1) return;
if (!player)
player = this.ActivePlayer;
if (!player) return;
var index = this.Players.indexOf(player);
return this.Players[index < this.Players.length - 1 ? ++index : 0];
}
}
enum TableStatus {
New,
Started,
StartedWaiting,
Finished
}