from panda3d.core import Point3, NodePath
from pandac.PandaModules import CollisionPolygon
from otp.otpbase import OTPGlobals
from direct.distributed.DistributedObject import DistributedObject
from direct.fsm import ClassicFSM, State
from toontown.toonbase import ToontownGlobals

class DistributedPillow(DistributedObject):

    points = [
        Point3(-62.2896,  59.2746, -6.0),
        Point3(-119.969,  59.2746, -6.0),
        Point3(-67.1297,  55.2920, -1.6),
        Point3(-120.063,  55.2920, -1.6),
        Point3(-64.9566,  35.6930,  1.0),
        Point3(-119.993,  35.6930,  1.0),
        Point3(-63.4717,  0.00000,  1.6),
        Point3(-119.670,  0.00000,  1.6),
        Point3(-64.9566, -35.6930,  1.0),
        Point3(-119.993, -35.6930,  1.0),
        Point3(-67.1297, -55.2920, -1.6),
        Point3(-120.063, -55.2920, -1.6),
        Point3(-62.2896, -58.3746, -6.0),
        Point3(-119.969, -58.3746, -6.0),
        Point3(-104.100,  59.2746, -6.0),
        Point3(-104.100, -58.3746, -6.0),
        Point3(-104.100,  55.2920, -6.0),
        Point3(-104.100, -55.2920, -6.0),
    ]
    polygons = [[0, 1, 3, 2], [2, 3, 5, 4], [4, 5, 7, 6],
                [6, 7, 9, 8], [8, 9, 11, 10], [10, 11, 13, 12]]
    walls = [[0, 2], [2, 4], [4, 6], [6, 8], [8, 10], [10, 12],
             [3, 1], [5, 3], [7, 5], [9, 7], [11, 9], [13, 11],
             [3, 16], [17, 11], [16, 14], [15, 17]]

    def __init__(self, cr):
        DistributedObject.__init__(self, cr)
        self.floorpolys = []
        self.wallpolys = []
        self.npaths = []
        self.np = None

    def generate(self):
        DistributedObject.generate(self)
        self.loader = self.cr.playGame.hood.loader
        self.np = NodePath('Pillow')
        self.np.reparentTo(render)
        for point in DistributedPillow.polygons:
            orderedPoints = []
            for index in point:
                orderedPoints.append(DistributedPillow.points[index])
            self.floorpolys.append(CollisionPolygon(*orderedPoints))
        for n, p in enumerate(self.floorpolys):
            polyNode = CollisionNode("FloorPoly-%d" % n)
            polyNode.addSolid(p)
            polyNode.setFromCollideMask(OTPGlobals.FloorBitmask)
            polyNodePath = self.np.attachNewNode(polyNode)
            self.npaths.append(polyNodePath)
            self.accept("enterFloorPoly-%d" % n, self.gravityHigh)
            self.accept("enterdonalds_dreamland", self.gravityLow)
        for wall in DistributedPillow.walls:
            ab = DistributedPillow.points[wall[0]]
            bb = DistributedPillow.points[wall[1]]
            cb = Point3(bb.getX(), bb.getY(), bb.getZ() + 20)
            db = Point3(ab.getX(), ab.getY(), ab.getZ() + 20)
            self.wallpolys.append(CollisionPolygon(ab, bb, cb, db))
        for n, p in enumerate(self.wallpolys):
            polyNode = CollisionNode("WallPoly-%d" % n)
            polyNode.addSolid(p)
            polyNode.setFromCollideMask(OTPGlobals.FloorBitmask)
            polyNodePath = self.np.attachNewNode(polyNode)
            self.npaths.append(polyNodePath)

    def disable(self):
        DistributedObject.disable(self)
        self.floorpolys = []
        self.wallpolys = []
        self.npaths = []
        if self.np:
            self.np.removeNode()
        self.np = None
        if hasattr(self, 'loader'):
            del self.loader

    def delete(self):
        if self.np:
            self.np.removeNode()
        self.np = None
        DistributedObject.delete(self)

    def gravityLow(self, entry):
        base.localAvatar.controlManager.currentControls.setGravity(ToontownGlobals.GravityValue * 1.25)

    def gravityHigh(self, entry):
        base.localAvatar.controlManager.currentControls.setGravity(ToontownGlobals.GravityValue * 2.00)