toontown-just-works/toontown/coghq/DistributedLaserFieldAI.py
2024-07-07 18:08:39 -05:00

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)