def __init__(self, crystalGenerator, hitPoints=None, timeoutDuration=None,
                 showExitButton=True, infoManager=None, *args, **kwargs):
        self._crystalGenerator = crystalGenerator
        self._maxHitPoints = hitPoints
        self._hitPoints = self._maxHitPoints
        
        GameElementBase.__init__(self, *args, **kwargs)
        
        self._timeoutCallback = None
        self._timeoutTimer = None  
        self.timeoutDuration = timeoutDuration

        self.destructionCallback = None
                
        self._spawnPos = self._getSpawnPos()
        
        self._infoManager = infoManager        
        self._scoreDisplay = None
        self._exitButton = None
        if self.owner is not None:
            self.owner.setCannon(self)
            if infoManager is not None:
                button, box = self._makeInfoElements()
                self._placeInfoElements(button, box)
            self._scoreDisplay = self._makeScoreCounter()
            if self._scoreDisplay is not None:
                self._alignScore(self._scoreDisplay)
            self.owner.setOnScoreChangeCallback(self._setScore)
            
        if showExitButton:
            self._makeExitButton()
                
        self.startCrystalSpawn()
    def delete(self):

        if not self.alive:
            return

        self._stopTickTimer()

        if self.owner is not None:
            self.owner.removeStructure(self)

        for element in self._elementMapping.values():
            if element.node is not None:
                element.node.unlink(True)
                element.node = None

        self._elementMapping = None

        for node in self._edgeNodes.values():
            node.unlink(True)

        for node in self._shadowNodes.values():
            node.unlink(True)

        self._edgeNodes = None
        self._shadowNodes = None

        self._rootParent = None

        self._canvasRoot.unlink(True)
        self._canvasRoot = None

        self._shadowImage.unlink(True)
        self._shadowImage = None

        self._graphVisRoot.unlink(True)
        self._graphVisRoot = None

        self._image.unlink(True)
        self._image = None

        player = avg.Player.get()
        player.deleteCanvas(self._blackCanvas.getID())
        player.deleteCanvas(self._canvas.getID())

        self._blackCanvas = None
        self._canvas = None

        self._fixElements = None

        self.crystalManager.removeStructure(self)
        self.crystalManager = None

        GameElementBase.delete(self)
    def __init__(self, crystalManager=None, framesToGrowth=None, startCrystals=20, *args, **kwargs):
        GameElementBase.__init__(self, *args, **kwargs)

        if self.owner is not None:
            self.owner.addStructure(self)

        self._graph = nx.Graph()
        self._elementMapping = {}

        self._fixElements = WeakSet()

        if __debug__:
            print "FRAMESTO GROWTH", framesToGrowth
        self.framesToGrowth = framesToGrowth
        self.growTimer = 0

        self._overDriveCounter = 0
        self._overdrive = False

        self._veil = None

        self._growLock = False
        self._depletedCallback = None
        self._gameOverCallback = None

        self.crystalManager = crystalManager
        if crystalManager is None:
            logging.warn("Structure {!s} has no valid CrystalManager".format(self))
        else:
            self.crystalManager.registerStructure(self)

        self._shadowWidth = util.CRYSTAL_SIZE * StructureElement.shapeOverflowFactor ** 2
        if self.owner is None:
            self._shadowColor = "000000"
        else:
            self._shadowColor = self.owner.color

        player = avg.Player.get()
        self._canvas = player.createCanvas(
            id=str(id(self)),
            size=(max(util.WINDOW_SIZE), max(util.WINDOW_SIZE)),
            handleevents=True,
            multisamplesamples=4,
        )

        self._blackCanvas = player.createCanvas(
            id=str(id(self)) + "Black",
            size=(max(util.WINDOW_SIZE), max(util.WINDOW_SIZE)),
            handleevents=True,
            multisamplesamples=4,
        )

        self._canvasRoot = self._canvas.getRootNode()

        self._blackBackground = self._blackCanvas.getRootNode()
        self._shadowImage = avg.ImageNode(
            href="canvas:{}Black".format(id(self)),
            parent=self._root,
            size=(max(util.WINDOW_SIZE), max(util.WINDOW_SIZE)),
            opacity=0.4,
        )
        util.centerNodeOnPosition(self._shadowImage, (0, 0))
        self._graphVisRoot = avg.DivNode(parent=self._canvasRoot)

        self._image = avg.ImageNode(
            href="canvas:{}".format(id(self)), parent=self._root, size=(max(util.WINDOW_SIZE), max(util.WINDOW_SIZE))
        )
        util.centerNodeOnPosition(self._image, (0, 0))
        self._edgeNodes = dict()
        self._shadowNodes = dict()

        self._initStructureCore()

        assert self.checkSanity()

        while len(self._graph) < startCrystals:
            self.growSimple()

        self.rotationEnabled = True
        self._tickTimer = None
        self._startTickTimer()
 def show(self):
     GameElementBase.show(self)
     crystal = self.getItemOnLauncher()
     if crystal is not None:
         crystal.delete()
     self.startCrystalSpawn()
 def hide(self):
     GameElementBase.hide(self)
     crystal = self.getItemOnLauncher()
     if crystal is not None:
         crystal.delete()
     self.stopCrystalSpawn()
 def _deletePhysic(self):
     self._space.delayRemove(self._circle)
     GameElementBase._deletePhysic(self)