201 lines
7.4 KiB
Python
201 lines
7.4 KiB
Python
import random
|
|
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.directnotify import DirectNotifyGlobal
|
|
from direct.distributed import ClockDelta
|
|
from direct.interval.IntervalGlobal import *
|
|
from direct.task import Task
|
|
from otp.ai.AIBase import *
|
|
from otp.level import BasicEntities
|
|
from otp.level import DistributedEntityAI
|
|
from toontown.coghq import BattleBlockerAI
|
|
from toontown.coghq import LaserGameAvoid
|
|
from toontown.coghq import LaserGameDrag
|
|
from toontown.coghq import LaserGameMineSweeper
|
|
from toontown.coghq import LaserGameRoll
|
|
|
|
|
|
class DistributedLaserFieldAI(BattleBlockerAI.BattleBlockerAI, NodePath, BasicEntities.NodePathAttribs):
|
|
def __init__(self, level, entId):
|
|
BattleBlockerAI.BattleBlockerAI.__init__(self, level, entId)
|
|
node = hidden.attachNewNode('DistributedLaserFieldAI')
|
|
NodePath.__init__(self, node)
|
|
if not hasattr(self, 'switchId'):
|
|
self.switchId = 0
|
|
self.gridScale = 1
|
|
self.game = LaserGameRoll.LaserGameRoll(self.trapDisable, self.trapFire, self.sendField, self.setGrid)
|
|
if not hasattr(self, 'gridGame'):
|
|
self.gridGame = 'Roll'
|
|
self.enabled = 1
|
|
self.hasShownSuits = 0
|
|
self.healReady = 1
|
|
self.playedSound = 0
|
|
self.canButton = 1
|
|
self.title = 'MemTag: This is a laserField %s' % random.random()
|
|
|
|
def setGridGame(self, gameName):
|
|
if gameName == 'Random':
|
|
gameName = random.choice(['MineSweeper', 'Roll', 'Avoid', 'Drag'])
|
|
self.gridGame = gameName
|
|
if hasattr(self, 'game'):
|
|
self.game.delete()
|
|
self.game = None
|
|
if gameName == 'Drag':
|
|
self.game = LaserGameDrag.LaserGameDrag(self.trapDisable, self.trapFire, self.sendField, self.setGrid)
|
|
elif gameName == 'MineSweeper':
|
|
self.game = LaserGameMineSweeper.LaserGameMineSweeper(self.trapDisable, self.trapFire, self.sendField, self.setGrid)
|
|
elif gameName == 'Roll':
|
|
self.game = LaserGameRoll.LaserGameRoll(self.trapDisable, self.trapFire, self.sendField, self.setGrid)
|
|
elif gameName == 'Avoid':
|
|
self.game = LaserGameAvoid.LaserGameAvoid(self.trapDisable, self.trapFire, self.sendField, self.setGrid)
|
|
else:
|
|
self.game = LaserGameMineSweeper.LaserGameMineSweeper(self.trapDisable, self.trapFire, self.sendField, self.setGrid)
|
|
self.game.startGrid()
|
|
self.sendField()
|
|
self.sendUpdate('setGridGame', [gameName])
|
|
|
|
def generate(self):
|
|
BattleBlockerAI.BattleBlockerAI.generate(self)
|
|
if self.switchId != 0:
|
|
self.accept(self.getOutputEventName(self.switchId), self.reactToSwitch)
|
|
self.detectName = 'laserField %s' % self.doId
|
|
taskMgr.doMethodLater(1.0, self._DistributedLaserFieldAI__detect, self.detectName)
|
|
self.setPos(self.pos)
|
|
self.setHpr(self.hpr)
|
|
self.setGridGame(self.gridGame)
|
|
|
|
def registerBlocker(self):
|
|
BattleBlockerAI.BattleBlockerAI.registerBlocker(self)
|
|
taskMgr.doMethodLater(1, self.hideSuits, 'hide-suits')
|
|
|
|
def delete(self):
|
|
taskMgr.remove(self.detectName)
|
|
self.ignoreAll()
|
|
self.game.delete()
|
|
self.game = None
|
|
BattleBlockerAI.BattleBlockerAI.delete(self)
|
|
|
|
def destroy(self):
|
|
self.notify.info('destroy entity(laserField) %s' % self.entId)
|
|
BattleBlockerAI.BattleBlockerAI.destroy(self)
|
|
|
|
def setGrid(self, gridNumX, gridNumY):
|
|
self.game.setGridSize(gridNumX, gridNumY)
|
|
|
|
def getGrid(self):
|
|
return (self.game.gridNumX, self.game.gridNumY)
|
|
|
|
def getField(self):
|
|
fieldData = []
|
|
fieldData.append(self.game.gridNumX)
|
|
fieldData.append(self.game.gridNumY)
|
|
for column in xrange(0, self.game.gridNumX):
|
|
for row in xrange(0, self.game.gridNumY):
|
|
fieldData.append(self.game.gridData[column][row])
|
|
return fieldData
|
|
|
|
def sendField(self):
|
|
self.sendUpdate('setField', [self.getField()])
|
|
|
|
def _DistributedLaserFieldAI__detect(self, task):
|
|
isThereAnyToons = False
|
|
if hasattr(self, 'level'):
|
|
toonInRange = 0
|
|
for avId in self.level.presentAvIds:
|
|
if avId in self.air.doId2do:
|
|
av = self.air.doId2do[avId]
|
|
isThereAnyToons = True
|
|
distance = self.getDistance(av)
|
|
if isThereAnyToons:
|
|
taskMgr.doMethodLater(1.0, self._DistributedLaserFieldAI__detect, self.detectName)
|
|
self._DistributedLaserFieldAI__run()
|
|
return Task.done
|
|
|
|
def hit(self, hitX, hitY, oldX, oldY):
|
|
if self.enabled:
|
|
self.game.hit(hitX, hitY, oldX, oldY)
|
|
|
|
def _DistributedLaserFieldAI__run(self):
|
|
pass
|
|
|
|
def _DistributedLaserFieldAI__toonHit(self):
|
|
self.gridNumX = random.randint(1, 4)
|
|
self.gridNumY = random.randint(1, 4)
|
|
self.gridScale = random.randint(1, 4)
|
|
self.sendUpdate('setGrid', [self.gridNumX, self.gridNumY, self.gridScale])
|
|
|
|
def reactToSwitch(self, on):
|
|
if on and self.canButton:
|
|
self.trapDisable()
|
|
self.game.win()
|
|
|
|
def trapFire(self):
|
|
self.game.lose()
|
|
self.showSuits()
|
|
stage = self.air.getDo(self.level.stageDoId)
|
|
stage.resetPuzzelReward()
|
|
self.healReady = 0
|
|
self.canButton = 0
|
|
self.sendUpdate('setActiveLF', [0])
|
|
if not self.playedSound:
|
|
self.sendUpdate('setSuccess', [0])
|
|
self.playedSound = 1
|
|
|
|
def setBattleFinished(self):
|
|
print 'battle Finished'
|
|
BattleBlockerAI.BattleBlockerAI.setBattleFinished(self)
|
|
messenger.send(self.getOutputEventName(), [1])
|
|
self.switchFire()
|
|
|
|
def switchFire(self):
|
|
print 'switchFire'
|
|
if self.switchId != 0:
|
|
switch = self.level.getEntity(self.switchId)
|
|
if switch:
|
|
switch.setIsOn(1)
|
|
|
|
def trapDisable(self):
|
|
self.enabled = 0
|
|
suits = self.level.planner.battleCellId2suits.get(self.cellId)
|
|
messenger.send(self.getOutputEventName(), [1])
|
|
if self.hasShownSuits == 0:
|
|
for suit in suits:
|
|
suit.requestRemoval()
|
|
self.sendUpdate('setActiveLF', [0])
|
|
stage = self.air.getDo(self.level.stageDoId)
|
|
reward = stage.getPuzzelReward()
|
|
if self.healReady:
|
|
for avId in self.level.presentAvIds:
|
|
av = self.air.doId2do.get(avId)
|
|
if av:
|
|
av.toonUp(reward)
|
|
continue
|
|
stage.increasePuzzelReward()
|
|
self.healReady = 0
|
|
if not self.playedSound:
|
|
self.sendUpdate('setSuccess', [1])
|
|
self.playedSound = 1
|
|
self.switchFire()
|
|
|
|
def hideSuits(self, taskName):
|
|
suits = self.level.planner.battleCellId2suits.get(self.cellId)
|
|
suitArray = []
|
|
for suit in suits:
|
|
suitArray.append(suit.doId)
|
|
if suitArray:
|
|
self.sendUpdate('hideSuit', [suitArray])
|
|
|
|
def showSuits(self):
|
|
if self.hasShownSuits == 0:
|
|
suits = self.level.planner.battleCellId2suits.get(self.cellId)
|
|
suitArray = []
|
|
for suit in suits:
|
|
suit.setVirtual()
|
|
suitArray.append(suit.doId)
|
|
if suitArray:
|
|
self.sendUpdate('showSuit', [suitArray])
|
|
self.hasShownSuits = 1
|
|
|
|
def addSuit(self, suit):
|
|
print 'Adding Suit %s' % suit.doId
|
|
BattleBlockerAI.BattleBlockerAI.addSuit(self, suit)
|