87 lines
3.3 KiB
Python
87 lines
3.3 KiB
Python
from otp.level import DistributedEntityAI
|
|
import DistributedBarrelBaseAI
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed.ClockDelta import globalClockDelta
|
|
from direct.task import Task
|
|
|
|
class DistributedMazeAI(DistributedEntityAI.DistributedEntityAI):
|
|
notify = DirectNotifyGlobal.directNotify.newCategory('DistributedMazeAI')
|
|
|
|
def __init__(self, level, entId):
|
|
DistributedEntityAI.DistributedEntityAI.__init__(self, level, entId)
|
|
self.roomDoId = level.doId
|
|
self.GameDuration = 60.0
|
|
self.DamageOnFailure = 20
|
|
self.finishedList = []
|
|
|
|
def delete(self):
|
|
self.removeAllTasks()
|
|
DistributedEntityAI.DistributedEntityAI.delete(self)
|
|
|
|
def announceGenerate(self):
|
|
DistributedEntityAI.DistributedEntityAI.announceGenerate(self)
|
|
self.mazeEndTimeTaskName = self.uniqueName('mazeEndTime')
|
|
|
|
def getRoomDoId(self):
|
|
return self.roomDoId
|
|
|
|
def setClientTriggered(self):
|
|
if not hasattr(self, 'gameStartTime'):
|
|
self.gameStartTime = globalClock.getRealTime()
|
|
self.b_setGameStart(globalClockDelta.localToNetworkTime(self.gameStartTime))
|
|
|
|
def b_setGameStart(self, timestamp):
|
|
self.d_setGameStart(timestamp)
|
|
self.setGameStart(timestamp)
|
|
|
|
def d_setGameStart(self, timestamp):
|
|
self.notify.debug('BASE: Sending setGameStart')
|
|
self.sendUpdate('setGameStart', [timestamp])
|
|
|
|
def setGameStart(self, timestamp):
|
|
self.notify.debug('BASE: setGameStart')
|
|
self.GameDuration = 35.0 + self.numSections * 15.0
|
|
self.prepareForGameStartOrRestart()
|
|
|
|
def prepareForGameStartOrRestart(self):
|
|
self.doMethodLater(self.GameDuration, self.gameEndingTimeHit, self.mazeEndTimeTaskName)
|
|
|
|
def setFinishedMaze(self):
|
|
senderId = self.air.getAvatarIdFromSender()
|
|
if senderId not in self.finishedList:
|
|
toon = simbase.air.doId2do.get(senderId)
|
|
if toon:
|
|
if len(self.finishedList) < 1:
|
|
toon.toonUp(200.0)
|
|
else:
|
|
toon.toonUp(20.0)
|
|
lastToon = 0
|
|
if hasattr(self, 'level'):
|
|
numToons = len(self.level.presentAvIds)
|
|
if numToons == len(self.finishedList) + 1:
|
|
lastToon = 1
|
|
self.sendUpdate('toonFinished', [senderId, len(self.finishedList), lastToon])
|
|
self.finishedList.append(senderId)
|
|
|
|
def gameEndingTimeHit(self, task):
|
|
roomId = self.getLevelDoId()
|
|
room = simbase.air.doId2do.get(roomId)
|
|
if room:
|
|
avIds = room.presentAvIds
|
|
for avId in avIds:
|
|
av = simbase.air.doId2do.get(avId)
|
|
if av and avId not in self.finishedList:
|
|
self.finishedList.append(avId)
|
|
|
|
self.sendUpdate('setGameOver', [])
|
|
|
|
def damageMe(self):
|
|
senderId = self.air.getAvatarIdFromSender()
|
|
av = simbase.air.doId2do.get(senderId)
|
|
roomId = self.getLevelDoId()
|
|
room = simbase.air.doId2do.get(roomId)
|
|
if room:
|
|
avIds = room.presentAvIds
|
|
if av and senderId in avIds:
|
|
av.takeDamage(self.DamageOnFailure, quietly=0)
|
|
room.sendUpdate('forceOuch', [self.DamageOnFailure])
|