Example #1
0
class Ship:
    ships = []

    def __init__(self, parent, pos=[0, 0]):

        self.parent = parent
        self.stats = RPGStats()
        self.pos = Vex(pos[0], pos[1])
        self.rot = 0
        self.stats.lvlUP()

        self.weapon = Weapon(self, [0, 0, 0], [.5, .5, .5], 60, 1, 1,
                             (255, 0, 0))
        self.points = [
            Vex(-.5, .5, 0),
            Vex(.5, .5, 0),
            Vex(0.0, -.5, 0),
            Vex(0.0, .5, -.3),
            Vex(-.25, .45, -.15),
            Vex(.25, .45, -.15)
        ]
        self.projPoints = [Vex(0, 0)] * 6
        self.lines = [(0, 4), (4, 5), (5, 1), (1, 2), (2, 0), (2, 3), (3, 0),
                      (3, 1), (2, 4), (2, 5)]

        self.shieldPoints = []
        self.shieldEdges = []
        self.shieldRot = [0, 0, 0]
        self.occupied = False

        #construct player shield
        sides = 10
        size = 2

        self.shieldRadius = size
        mi = 0

        for i in range(sides):
            angle_deg = (360 / sides) * i
            angle_rad = 3.14159265359 / 180 * angle_deg
            x = 0 + size * math.cos(angle_rad)
            y = 0 + size * math.sin(angle_rad)
            self.shieldPoints += [Vex(x, y)]

        for i in range(mi, len(self.shieldPoints)):
            seg = []
            if i + 1 < len(self.shieldPoints):
                seg = (i, i + 1)
            else:
                seg = (i, mi)
                mi = i + 1
            self.shieldEdges.append(seg)

    def getShieldRadius(self):
        return self.shieldRadius

    def setParent(self, par):
        self.parent = par

    def isOccupied(self):
        return self.occupied

    def setOccupied(self, val):
        self.occupied = val

    def totalDamage(self):
        return self.stats.getSTR()

    def shoot(self, pos, rot, ant):
        self.weapon.Shoot(pos, rot, ant)

    def syncPos(self, pos):
        self.pos = pos.copy()

    def updatePlayerShip(self, cam):
        env = Environment.Environment
        self.weapon.update()

        proj = []
        for vec in self.points:
            if not self.isOccupied():
                v = ((vec.rotate2dXY(-self.rot) - cam.pos +
                      self.pos).rotate2dXY(cam.rot[1])).rotate2dYZ(
                          cam.mov[2], cam.rot[0])  # pitch
            else:
                v = (vec + self.pos).setZ(vec.z() - cam.pos.z()).rotate2dYZ(
                    cam.mov[2], cam.rot[0])  # pitch

            f = env.fov / (v.z() + .0000001)
            if (f < env.lim):
                f = 1000
            v = v * f + env.center
            proj += [v.p2D()]

        for l in self.lines:
            points = [proj[l[0]], proj[l[1]]]
            if (env.inScreen(points[0]) or env.inScreen(points[1])):
                env.add_edge(Color.NEONBLUE, points)
        self.shieldRot[1] = cam.rot[1]

        shldH = -(self.stats.getHP() / self.stats.getHTH()) / 4
        proj = []
        fs = []
        for vec in self.shieldPoints:
            if not self.isOccupied():
                v = ((vec.rotate2dXY(-self.rot) - cam.pos +
                      self.pos).rotate2dXY(cam.rot[1])).rotate2dYZ(
                          cam.mov[2], cam.rot[0])  # pitch
            else:
                v = (vec.rotate2dXY(self.shieldRot[1]) +
                     self.pos).setZ(self.pos.z() - cam.pos.z()).rotate2dYZ(
                         cam.mov[2], cam.rot[0])  # pitch

            f = env.fov / (v.z() + .00000001)
            if (f < env.lim):
                f = 1000
            v = v * f + env.center
            proj += [v.p2D()]
            fs += [f]

        for l in self.shieldEdges:
            points = [proj[l[0]], proj[l[1]]]
            fst = [fs[l[0]], fs[l[1]]]
            if (env.inScreen(points[0]) or env.inScreen(points[1])):
                env.add_edge(Color.BLUE, points, 1, 1, shldH, fst)

    def updateCreatureShip(self, cam, pos, ang):
        env = Environment.Environment
        self.weapon.update()
        if cam.pos.dist2D(self.pos) < env.renderDist:
            proj = []
            for vec in self.points:
                v = ((vec.rotate2dXY(math.radians(ang)) - cam.pos +
                      pos).rotate2dXY(cam.rot[1])).rotate2dYZ(
                          cam.mov[2], cam.rot[0])  # pitch

                f = env.fov / (v.z() + .00000001)
                if (f < env.lim):
                    f = 1000
                v = v * f + env.center
                proj += [v.p2D()]

            for l in self.lines:
                points = [proj[l[0]], proj[l[1]]]
                if (env.inScreen(points[0]) or env.inScreen(points[1])):
                    env.add_edge(Color.NEONBLUE, points)

            hth = -(self.stats.getHP() / self.stats.getHTH()) / 2

            proj = []
            fs = []
            for vec in self.shieldPoints:
                v = (vec.rotate2dXY(math.radians(ang)) - cam.pos +
                     pos).rotate2dXY(cam.rot[1]).rotate2dYZ(
                         cam.mov[2], cam.rot[0])  # pitch
                f = env.fov / (v.z() + .00000001)
                if (f < env.lim):
                    f = 1000
                v = v * f + env.center
                proj += [v.p2D()]
                fs += [f]

            for l in self.shieldEdges:
                points = [proj[l[0]], proj[l[1]]]
                fst = [fs[l[0]], fs[l[1]]]
                if (env.inScreen(points[0]) or env.inScreen(points[1])):
                    env.add_edge(Color.BLUE, points, 1, 1, hth, fst)

    @staticmethod
    def remove_unoccupied(ship):
        try:
            Ship.ships.remove(ship)
        except:
            pass

    @staticmethod
    def add_unoccupied(ship):
        Ship.ships += [ship]

    @staticmethod
    def updateUnOccupied(cam):
        env = Environment.Environment
        for self in Ship.ships:
            if not self.isOccupied() and cam.pos.dist2D(self.pos) < 300:
                proj = []
                for vec in self.points:
                    v = (vec.rotate2dXY(self.rot) - cam.pos +
                         self.pos).rotate2dXY(cam.rot[1]).rotate2dYZ(
                             cam.mov[2], cam.rot[0])  # pitch

                    f = env.fov / (v.z() + .00000001)
                    if (f < env.lim):
                        f = 1000
                    v = v * f + env.center
                    proj += [v.p2D()]

                for l in self.lines:
                    points = [proj[l[0]], proj[l[1]]]
                    if (env.inScreen(points[0]) or env.inScreen(points[1])):
                        env.add_edge(Color.NEONBLUE, points)

                hth = -(self.stats.getHP() / self.stats.getHTH()) / 2

                proj = []
                fs = []
                for vec in self.shieldPoints:
                    v = (vec - cam.pos + self.pos).rotate2dXY(
                        cam.rot[1]).rotate2dYZ(cam.mov[2], cam.rot[0])  # pitch
                    f = env.fov / (v.z() + .00000001)
                    if (f < env.lim):
                        f = 1000
                    v = v * f + env.center
                    proj += [v.p2D()]
                    fs += [f]

                for l in self.shieldEdges:
                    points = [proj[l[0]], proj[l[1]]]
                    fst = [fs[l[0]], fs[l[1]]]
                    if (env.inScreen(points[0]) or env.inScreen(points[1])):
                        env.add_edge(Color.BLUE, points, 1, 1, hth, fst)