Poodletooth-iLand/toontown/safezone/DistributedChineseCheckersAI.py

693 lines
20 KiB
Python
Raw Normal View History

# File: D (Python 2.4)
2015-03-03 16:10:12 -06:00
from direct.distributed.DistributedNodeAI import DistributedNodeAI
from direct.distributed.ClockDelta import *
from direct.fsm import ClassicFSM, State
from direct.fsm import State
from direct.fsm import StateData
from direct.distributed.ClockDelta import *
from toontown.safezone import ChineseCheckersBoard
2015-03-03 16:10:12 -06:00
class DistributedChineseCheckersAI(DistributedNodeAI):
2015-07-05 18:59:25 -05:00
def __init__(self, air, parent, name, x, y, z, h, p, r):
DistributedNodeAI.__init__(self, air)
self.name = name
self.air = air
self.setPos(x, y, z)
self.setHpr(h, p, r)
self.myPos = (x, y, z)
self.myHpr = (h, p, r)
self.board = ChineseCheckersBoard.ChineseCheckersBoard()
self.parent = self.air.doId2do[parent]
self.parentDo = parent
self.wantStart = []
self.playersPlaying = []
self.playersSitting = 0
self.playersTurn = 1
self.movesMade = 0
self.playersGamePos = [
None,
None,
None,
None,
None,
None]
self.wantTimer = True
self.timerEnd = 0
self.turnEnd = 0
self.playersObserving = []
self.winLaffPoints = 20
self.movesRequiredToWin = 10
self.zoneId = self.air.allocateZone()
self.generateOtpObject(air.districtId, self.zoneId, optionalFields = [
'setX',
'setY',
'setZ',
'setH',
'setP',
'setR'])
self.parent.setCheckersZoneId(self.zoneId)
self.startingPositions = [
[
0,
1,
2,
3,
4,
5,
6,
7,
8,
9],
[
10,
11,
12,
13,
23,
24,
25,
35,
36,
46],
[
65,
75,
76,
86,
87,
88,
98,
99,
100,
101],
[
111,
112,
113,
114,
115,
116,
117,
118,
119,
120],
[
74,
84,
85,
95,
96,
97,
107,
108,
109,
110],
[
19,
20,
21,
22,
32,
33,
34,
44,
45,
55]]
self.timerStart = None
self.fsm = ClassicFSM.ClassicFSM('ChineseCheckers', [
State.State('waitingToBegin', self.enterWaitingToBegin, self.exitWaitingToBegin, [
'playing']),
State.State('playing', self.enterPlaying, self.exitPlaying, [
'gameOver']),
State.State('gameOver', self.enterGameOver, self.exitGameOver, [
'waitingToBegin'])], 'waitingToBegin', 'waitingToBegin')
self.fsm.enterInitialState()
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def announceGenerate(self):
self.parent.setGameDoId(self.doId)
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def getTableDoId(self):
return self.parentDo
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def delete(self):
self.fsm.requestFinalState()
self.board.delete()
self.playerSeatPos = None
del self.fsm
DistributedNodeAI.delete(self)
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
2015-03-03 16:10:12 -06:00
def requestSeatPositions(self):
avId = self.air.getAvatarIdFromSender()
self.sendUpdateToAvatarId(avId, 'announceSeatPositions', [
self.playerSeatPos])
self.sendUpdateToAvatarId(avId, 'sendTurn', [
self.playersTurn + 1])
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def informGameOfPlayer(self):
self.playersSitting += 1
if self.playersSitting < 2:
self.timerEnd = 0
elif self.playersSitting == 2:
self.timerEnd = globalClock.getRealTime() + 60
elif self.playersSitting > 2:
pass
2015-07-05 18:59:25 -05:00
self.sendUpdate('setTimer', [
globalClockDelta.localToNetworkTime(self.timerEnd)])
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def informGameOfPlayerLeave(self):
self.playersSitting -= 1
if self.playersSitting < 2 and self.fsm.getCurrentState().getName() == 'waitingToBegin':
self.timerEnd = 0
2015-07-05 18:59:25 -05:00
if self.playersSitting > 2 and self.fsm.getCurrentState().getName() == 'waitingToBegin':
pass
1
self.timerEnd = 0
if self.timerEnd != 0:
self.sendUpdate('setTimer', [
globalClockDelta.localToNetworkTime(self.timerEnd)])
else:
self.sendUpdate('setTimer', [
0])
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def setGameCountdownTime(self):
self.timerEnd = globalClock.getRealTime() + 60
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def setTurnCountdownTime(self):
self.turnEnd = globalClock.getRealTime() + 60
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def getTimer(self):
if self.timerEnd != 0:
return 0
else:
return 0
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def getTurnTimer(self):
return globalClockDelta.localToNetworkTime(self.turnEnd)
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def requestTimer(self):
avId = self.air.getAvatarIdFromSender()
self.sendUpdateToAvatarId(avId, 'setTimer', [
globalClockDelta.localToNetworkTime(self.timerEnd)])
2015-07-05 18:59:25 -05:00
def handlePlayerExit(self, avId):
playerOrder = [
1,
4,
2,
5,
3,
6]
if avId in self.wantStart:
self.wantStart.remove(avId)
2015-07-05 18:59:25 -05:00
playstate = self.fsm.getStateNamed('playing')
if self.fsm.getCurrentState().getName() == 'playing':
gamePos = self.playersGamePos.index(avId)
self.playersGamePos[gamePos] = None
for x in self.board.squareList:
if x.getState() == gamePos + 1:
x.setState(0)
continue
2015-07-05 18:59:25 -05:00
self.sendGameState([])
if self.playersTurn == gamePos:
self.advancePlayerTurn()
self.d_sendTurn(self.playersTurn + 1)
2015-07-05 18:59:25 -05:00
remainingPlayers = 0
for x in self.playersGamePos:
if x != None:
remainingPlayers += 1
continue
2015-07-05 18:59:25 -05:00
if remainingPlayers == 1:
for x in self.playersGamePos:
if x != None:
self.clearBoard()
self.sendGameState([])
if self.movesMade >= self.movesRequiredToWin:
self.distributeLaffPoints()
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', x)
else:
self.fsm.request('gameOver')
def handleEmptyGame(self):
self.movesMade = 0
self.playersPlaying = []
self.playersTurn = 1
self.fsm.request('waitingToBegin')
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
2015-03-03 16:10:12 -06:00
def requestWin(self):
avId = self.air.getAvatarIdFromSender()
if avId not in self.playersGamePos:
self.air.writeServerEvent('suspicious', avId, 'Has requested a Chinese Checkers win and is NOT playing! SeatList of the table - %s - PlayersGamePos - %s' % (self.parent.seats, self.playersGamePos))
return None
2015-07-05 18:59:25 -05:00
requestWinGamePos = self.playersGamePos.index(avId) + 1
checkSquares = []
for x in self.board.squareList:
if x.getState() == requestWinGamePos:
checkSquares.append(x.getNum())
continue
2015-07-05 18:59:25 -05:00
if requestWinGamePos == 1:
if checkSquares == self.startingPositions[3]:
self.distributeLaffPoints()
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', avId)
2015-07-05 18:59:25 -05:00
elif requestWinGamePos == 2:
if checkSquares == self.startingPositions[4]:
self.distributeLaffPoints()
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', avId)
2015-07-05 18:59:25 -05:00
elif requestWinGamePos == 3:
if checkSquares == self.startingPositions[5]:
self.distributeLaffPoints()
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', avId)
2015-07-05 18:59:25 -05:00
elif requestWinGamePos == 4:
if checkSquares == self.startingPositions[0]:
self.distributeLaffPoints()
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', avId)
2015-07-05 18:59:25 -05:00
elif requestWinGamePos == 5:
if checkSquares == self.startingPositions[1]:
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', avId)
2015-07-05 18:59:25 -05:00
elif requestWinGamePos == 6:
if checkSquares == self.startingPositions[2]:
self.distributeLaffPoints()
self.fsm.request('gameOver')
self.parent.announceWinner('Chinese Checkers', avId)
2015-07-05 18:59:25 -05:00
self.parent = None
2015-07-05 18:59:25 -05:00
def distributeLaffPoints(self):
for x in self.parent.seats:
if x != None:
av = self.air.doId2do.get(x)
av.toonUp(self.winLaffPoints)
continue
2015-03-03 16:10:12 -06:00
2015-07-05 18:59:25 -05:00
def enterWaitingToBegin(self):
self.setGameCountdownTime()
self.parent.isAccepting = True
2015-07-05 18:59:25 -05:00
def exitWaitingToBegin(self):
self.turnEnd = 0
2015-07-05 18:59:25 -05:00
def enterPlaying(self):
self.parent.isAccepting = False
for x in self.playersGamePos:
if x != None:
self.playersTurn = self.playersGamePos.index(x)
self.d_sendTurn(self.playersTurn + 1)
break
continue
2015-07-05 18:59:25 -05:00
self.setTurnCountdownTime()
self.sendUpdate('setTurnTimer', [
globalClockDelta.localToNetworkTime(self.turnEnd)])
2015-07-05 18:59:25 -05:00
def exitPlaying(self):
2015-03-03 16:10:12 -06:00
pass
2015-07-05 18:59:25 -05:00
def enterGameOver(self):
self.timerEnd = 0
isAccepting = True
self.playersObserving = []
self.parent.handleGameOver()
self.playersTurn = 1
self.playersPlaying = []
self.clearBoard()
self.sendGameState([])
self.movesMade = 0
self.playersGamePos = [
None,
None,
None,
None,
None,
None]
self.fsm.request('waitingToBegin')
2015-07-05 18:59:25 -05:00
def exitGameOver(self):
2015-03-03 16:10:12 -06:00
pass
2015-07-05 18:59:25 -05:00
def requestBegin(self):
avId = self.air.getAvatarIdFromSender()
if avId not in self.wantStart:
self.wantStart.append(avId)
2015-07-05 18:59:25 -05:00
numPlayers = 0
for x in self.parent.seats:
if x != None:
numPlayers = numPlayers + 1
continue
2015-07-05 18:59:25 -05:00
if len(self.wantStart) == numPlayers and numPlayers >= 2:
self.d_gameStart(avId)
self.parent.sendIsPlaying()
2015-07-05 18:59:25 -05:00
def d_gameStart(self, avId):
for x in self.playersObserving:
self.sendUpdateToAvatarId(x, 'gameStart', [
255])
2015-07-05 18:59:25 -05:00
playerJoinOrder = [
1,
4,
2,
5,
3,
6]
zz = 0
numPlayers = 0
for x in self.parent.seats:
if x != None:
numPlayers += 1
self.playersPlaying.append(x)
continue
2015-07-05 18:59:25 -05:00
if numPlayers == 2:
player1 = self.playersPlaying[0]
self.sendUpdateToAvatarId(player1, 'gameStart', [
1])
self.playersGamePos[0] = player1
for x in self.startingPositions[0]:
self.board.setState(x, 1)
2015-07-05 18:59:25 -05:00
player2 = self.playersPlaying[1]
self.sendUpdateToAvatarId(player2, 'gameStart', [
4])
self.playersGamePos[3] = player2
for x in self.startingPositions[3]:
self.board.setState(x, 4)
2015-07-05 18:59:25 -05:00
elif numPlayers == 3:
player1 = self.playersPlaying[0]
self.sendUpdateToAvatarId(player1, 'gameStart', [
2])
self.playersGamePos[1] = player1
for x in self.startingPositions[1]:
self.board.setState(x, 2)
2015-07-05 18:59:25 -05:00
player2 = self.playersPlaying[1]
self.sendUpdateToAvatarId(player2, 'gameStart', [
4])
self.playersGamePos[3] = player2
for x in self.startingPositions[3]:
self.board.setState(x, 4)
2015-07-05 18:59:25 -05:00
player3 = self.playersPlaying[2]
self.sendUpdateToAvatarId(player3, 'gameStart', [
6])
self.playersGamePos[5] = player3
for x in self.startingPositions[5]:
self.board.setState(x, 6)
2015-07-05 18:59:25 -05:00
elif numPlayers == 4:
player1 = self.playersPlaying[0]
self.sendUpdateToAvatarId(player1, 'gameStart', [
1])
self.playersGamePos[0] = player1
for x in self.startingPositions[0]:
self.board.setState(x, 1)
2015-07-05 18:59:25 -05:00
player2 = self.playersPlaying[1]
self.sendUpdateToAvatarId(player2, 'gameStart', [
4])
self.playersGamePos[3] = player2
for x in self.startingPositions[3]:
self.board.setState(x, 4)
2015-07-05 18:59:25 -05:00
player3 = self.playersPlaying[2]
self.sendUpdateToAvatarId(player3, 'gameStart', [
2])
self.playersGamePos[1] = player3
for x in self.startingPositions[1]:
self.board.setState(x, 2)
2015-07-05 18:59:25 -05:00
player4 = self.playersPlaying[3]
self.sendUpdateToAvatarId(player4, 'gameStart', [
5])
self.playersGamePos[4] = player4
for x in self.startingPositions[4]:
self.board.setState(x, 5)
2015-07-05 18:59:25 -05:00
elif numPlayers == 5:
player1 = self.playersPlaying[0]
self.sendUpdateToAvatarId(player1, 'gameStart', [
1])
self.playersGamePos[0] = player1
for x in self.startingPositions[0]:
self.board.setState(x, 1)
2015-07-05 18:59:25 -05:00
player2 = self.playersPlaying[1]
self.sendUpdateToAvatarId(player2, 'gameStart', [
4])
self.playersGamePos[3] = player2
for x in self.startingPositions[3]:
self.board.setState(x, 4)
2015-07-05 18:59:25 -05:00
player3 = self.playersPlaying[2]
self.sendUpdateToAvatarId(player3, 'gameStart', [
2])
self.playersGamePos[1] = player3
for x in self.startingPositions[1]:
self.board.setState(x, 2)
2015-07-05 18:59:25 -05:00
player4 = self.playersPlaying[3]
self.sendUpdateToAvatarId(player4, 'gameStart', [
5])
self.playersGamePos[4] = player4
for x in self.startingPositions[4]:
self.board.setState(x, 5)
2015-07-05 18:59:25 -05:00
player5 = self.playersPlaying[4]
self.sendUpdateToAvatarId(player5, 'gameStart', [
3])
self.playersGamePos[2] = player5
for x in self.startingPositions[2]:
self.board.setState(x, 3)
2015-07-05 18:59:25 -05:00
elif numPlayers == 6:
player1 = self.playersPlaying[0]
self.sendUpdateToAvatarId(player1, 'gameStart', [
1])
self.playersGamePos[0] = player1
for x in self.startingPositions[0]:
self.board.setState(x, 1)
2015-07-05 18:59:25 -05:00
player2 = self.playersPlaying[1]
self.sendUpdateToAvatarId(player2, 'gameStart', [
4])
self.playersGamePos[3] = player2
for x in self.startingPositions[3]:
self.board.setState(x, 4)
2015-07-05 18:59:25 -05:00
player3 = self.playersPlaying[2]
self.sendUpdateToAvatarId(player3, 'gameStart', [
2])
self.playersGamePos[1] = player3
for x in self.startingPositions[1]:
self.board.setState(x, 2)
2015-07-05 18:59:25 -05:00
player4 = self.playersPlaying[3]
self.sendUpdateToAvatarId(player4, 'gameStart', [
5])
self.playersGamePos[4] = player4
for x in self.startingPositions[4]:
self.board.setState(x, 5)
2015-07-05 18:59:25 -05:00
player5 = self.playersPlaying[4]
self.sendUpdateToAvatarId(player5, 'gameStart', [
3])
self.playersGamePos[2] = player5
for x in self.startingPositions[2]:
self.board.setState(x, 3)
2015-07-05 18:59:25 -05:00
player6 = self.playersPlaying[5]
self.sendUpdateToAvatarId(player6, 'gameStart', [
6])
self.playersGamePos[5] = player6
for x in self.startingPositions[5]:
self.board.setState(x, 6)
2015-07-05 18:59:25 -05:00
playerSeatPos = [
0,
0,
0,
0,
0,
0]
for x in range(6):
id = self.playersGamePos[x]
if id != None:
playerSeatPos[self.parent.seats.index(id)] = x + 1
continue
2015-07-05 18:59:25 -05:00
self.sendUpdate('announceSeatPositions', [
playerSeatPos])
self.playerSeatPos = playerSeatPos
self.sendGameState([])
self.wantStart = []
self.fsm.request('playing')
self.parent.getTableState()
2015-07-05 18:59:25 -05:00
def d_sendTurn(self, playersTurn):
self.sendUpdate('sendTurn', [
playersTurn])
2015-07-05 18:59:25 -05:00
def advancePlayerTurn(self):
foundNewPlayer = False
while foundNewPlayer == False:
self.playersTurn += 1
if self.playersTurn > 5:
self.playersTurn = 0
2015-07-05 18:59:25 -05:00
if self.playersGamePos[self.playersTurn] != None:
foundNewPlayer = True
continue
2015-07-05 18:59:25 -05:00
def requestMove(self, moveList):
playerOrder = [
1,
4,
2,
5,
3,
6]
if self.checkLegalMoves(moveList) == True:
self.movesMade += 1
self.makeMove(moveList)
self.advancePlayerTurn()
self.d_sendTurn(self.playersTurn + 1)
self.setTurnCountdownTime()
self.sendUpdate('setTurnTimer', [
globalClockDelta.localToNetworkTime(self.turnEnd)])
2015-07-05 18:59:25 -05:00
def checkLegalMoves(self, moveList):
if not moveList:
return False
elif self.board.squareList[moveList[0]].getState() == 0:
return False
2015-07-05 18:59:25 -05:00
for x in range(len(moveList) - 1):
y = self.checkLegalMove(self.board.getSquare(moveList[x]), self.board.getSquare(moveList[x + 1]))
if y == False:
return False
continue
2015-07-05 18:59:25 -05:00
return True
2015-07-05 18:59:25 -05:00
def checkLegalMove(self, firstSquare, secondSquare):
if secondSquare.getNum() in firstSquare.getAdjacent():
return True
else:
for x in firstSquare.getAdjacent():
if x == None:
continue
if self.board.squareList[x].getState() == 0:
continue
if self.board.squareList[x].getAdjacent()[firstSquare.getAdjacent().index(x)] == secondSquare.getNum():
return True
continue
2015-07-05 18:59:25 -05:00
return False
2015-07-05 18:59:25 -05:00
def makeMove(self, moveList):
spot1 = self.board.squareList[moveList[0]].getState()
self.board.squareList[moveList[0]].setState(0)
self.board.squareList[moveList[len(moveList) - 1]].setState(spot1)
self.sendGameState(moveList)
2015-07-05 18:59:25 -05:00
def getState(self):
return self.fsm.getCurrentState().getName()
2015-07-05 18:59:25 -05:00
def getName(self):
return self.name
2015-07-05 18:59:25 -05:00
def getGameState(self):
return [
self.board.getStates(),
[]]
2015-07-05 18:59:25 -05:00
def sendGameState(self, moveList):
gameState = self.board.getStates()
self.sendUpdate('setGameState', [
gameState,
moveList])
2015-07-05 18:59:25 -05:00
def clearBoard(self):
for x in self.board.squareList:
x.setState(0)
2015-07-05 18:59:25 -05:00
def getPosHpr(self):
return self.posHpr
2015-07-05 18:59:25 -05:00
def testWin(self):
self.clearBoard()
for x in self.startingPositions[0]:
self.board.squareList[x].setState(4)
2015-07-05 18:59:25 -05:00
self.board.squareList[self.startingPositions[0][len(self.startingPositions[0]) - 1]].setState(0)
self.board.squareList[51].setState(4)
for x in self.startingPositions[3]:
self.board.squareList[x].setState(1)
2015-07-05 18:59:25 -05:00
self.board.squareList[120].setState(0)
self.board.squareList[104].setState(1)
self.sendGameState([])