def test_scale(self): poly1 = Polygon([Point(1, 2), Point(1, 7), Point(3.5, 2)]) poly2 = Polygon([Point(1, 2), Point(1, 4), Point(2, 2)]) poly2.scale(2.5) for p1, p2 in zip(poly1.points, poly2.points): self.assertAlmostEqual(p1.x, p2.x) self.assertAlmostEqual(p1.y, p2.y)
def test_rotate(self): poly1 = Polygon([Point(1, 1), Point(0, 1), Point(1, 2)]) poly2 = Polygon([Point(0, 0), Point(0, 1), Point(1, 0)]) poly2.rotate(pi / 2.0, Point(0, 1)) for p1, p2 in zip(poly1.points, poly2.points): self.assertAlmostEqual(p1.x, p2.x) self.assertAlmostEqual(p1.y, p2.y)
def test_rotate(self): poly1 = Polygon([Point(1, 1), Point(0, 1), Point(1, 2)]) poly2 = Polygon([Point(0, 0), Point(0, 1), Point(1, 0)]) poly2.rotate(pi/2.0, Point(0, 1)) for p1, p2 in zip(poly1.points, poly2.points): self.assertAlmostEqual(p1.x, p2.x) self.assertAlmostEqual(p1.y, p2.y)
def test_packing_across(self): level = Level() level.version = VERSION_ACROSS # Specify level id to make testing easier level.level_id = 2535781587 level.polygons = [Polygon([Point(0, 0), Point(0, 1), Point(1, 0)])] level.objects = [ Obj(Point(0, 0), Obj.FLOWER), Obj(Point(0, 0), Obj.START), Obj(Point(0, 0), Obj.KILLER), Obj(Point(0, 0), Obj.FOOD) ] packed = level.pack() level = level.unpack(packed) self.assertEqual(VERSION_ACROSS, level.version) self.assertEqual(2535781587, level.level_id) self.assertEqual('Unnamed', level.name) # polygons self.assertEqual(1, len(level.polygons)) self.assertEqual(Point(0, 0), level.polygons[0].points[0]) self.assertEqual(Point(0, 1), level.polygons[0].points[1]) self.assertEqual(Point(1, 0), level.polygons[0].points[2]) # objects self.assertEqual(4, len(level.objects)) for expected_obj, obj in zip([ Obj(Point(0, 0), Obj.FLOWER), Obj(Point(0, 0), Obj.START), Obj(Point(0, 0), Obj.KILLER), Obj(Point(0, 0), Obj.FOOD) ], level.objects): self.assertEqual(expected_obj, obj)
def test_packing(self): level = Level() # Specify level id to make testing easier level.level_id = 2535781587 level.polygons = [Polygon([Point(0, 0), Point(0, 1), Point(1, 0)])] level.pictures = [Picture(Point(0, 0))] level.objects = [ Obj(Point(0, 0), Obj.FLOWER), Obj(Point(0, 0), Obj.START), Obj(Point(0, 0), Obj.KILLER), Obj(Point(0, 0), Obj.FOOD), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_UP), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_DOWN), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_LEFT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_RIGHT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_NORMAL) ] packed = pack_level(level) original_level = level level = unpack_level(packed) self.assertEqual(2535781587, level.level_id) self.assertEqual('Unnamed', level.name) self.assertEqual('DEFAULT', level.lgr) self.assertEqual('ground', level.ground_texture) self.assertEqual('sky', level.sky_texture) # polygons self.assertEqual(1, len(level.polygons)) self.assertEqual(Point(0, 0), level.polygons[0].points[0]) self.assertEqual(Point(0, 1), level.polygons[0].points[1]) self.assertEqual(Point(1, 0), level.polygons[0].points[2]) # pictures self.assertEqual(1, len(level.pictures)) picture = level.pictures[0] original_picture = original_level.pictures[0] self.assertEqual(original_picture.picture_name, picture.picture_name) self.assertEqual(original_picture.texture_name, picture.texture_name) self.assertEqual(original_picture.mask_name, picture.mask_name) self.assertEqual(original_picture.distance, picture.distance) self.assertEqual(original_picture.clipping, picture.clipping) # objects self.assertEqual(9, len(level.objects)) for expected_obj, obj in zip([ Obj(Point(0, 0), Obj.FLOWER), Obj(Point(0, 0), Obj.START), Obj(Point(0, 0), Obj.KILLER), Obj(Point(0, 0), Obj.FOOD), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_UP), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_DOWN), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_LEFT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_RIGHT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_NORMAL) ], level.objects): self.assertEqual(expected_obj, obj)
def test_move_by(self): poly1 = Polygon([Point(1, 2), Point(1, 3), Point(2, 2)]) poly2 = Polygon([Point(0, 0), Point(0, 1), Point(1, 0)]) poly2.move_by(1, 2) for p1, p2 in zip(poly1.points, poly2.points): self.assertEqual(p1, p2)
def test_center(self): poly = Polygon([Point(0, 0), Point(0, 2), Point(2, 2), Point(2, 0)]) center = poly.center_point() self.assertAlmostEqual(center.x, 1.0) self.assertAlmostEqual(center.y, 1.0)
def test_flip(self): poly1 = Polygon([Point(1, 2), Point(1, 3), Point(2, 2)]) poly2 = Polygon([Point(1, 3), Point(1, 2), Point(2, 3)]) poly2.flip() for p1, p2 in zip(poly1.points, poly2.points): self.assertEqual(p1, p2)
def unpack_level(data): """ Unpack a level-related item from its binary representation readable by Elastomania. """ data = iter(data) def munch(n): return b''.join([bytes(chr(next(data)), 'latin1') for _ in range(n)]) level = Level() assert munch(5) == b'POT14' munch(2) level.level_id = struct.unpack('I', munch(4))[0] munch(8 * 4) level.name = munch(51).rstrip(b'\0').decode('latin1') level.lgr = munch(16).rstrip(b'\0').decode('latin1') level.ground_texture = munch(10).rstrip(b'\0').decode('latin1') level.sky_texture = munch(10).rstrip(b'\0').decode('latin1') number_of_polygons = int(struct.unpack('d', munch(8))[0]) for _ in range(number_of_polygons): grass = struct.unpack('I', munch(4))[0] number_of_vertices = struct.unpack('I', munch(4))[0] points = [] for __ in range(number_of_vertices): x = struct.unpack('d', munch(8))[0] y = struct.unpack('d', munch(8))[0] points.append(Point(x, y)) level.polygons.append(Polygon(points, grass=grass)) number_of_objects = int(struct.unpack('d', munch(8))[0]) for _ in range(number_of_objects): x = struct.unpack('d', munch(8))[0] y = struct.unpack('d', munch(8))[0] object_type = struct.unpack('I', munch(4))[0] gravity = struct.unpack('I', munch(4))[0] animation_number = struct.unpack('I', munch(4))[0] level.objects.append( Obj(Point(x, y), object_type, gravity=gravity, animation_number=animation_number)) number_of_pictures = int(struct.unpack('d', munch(8))[0]) for _ in range(number_of_pictures): picture_name = munch(10).rstrip(b'\0').decode('latin1') texture_name = munch(10).rstrip(b'\0').decode('latin1') mask_name = munch(10).rstrip(b'\0').decode('latin1') x = struct.unpack('d', munch(8))[0] y = struct.unpack('d', munch(8))[0] distance = struct.unpack('I', munch(4))[0] clipping = struct.unpack('I', munch(4))[0] level.pictures.append( Picture(Point(x, y), picture_name=picture_name, texture_name=texture_name, mask_name=mask_name, distance=distance, clipping=clipping)) return level
def test_packing(self): level = Level() # Specify level id to make testing easier level.level_id = 2535781587 level.polygons = [Polygon([Point(0, 0), Point(0, 1), Point(1, 0)])] level.pictures = [Picture(Point(0, 0))] level.objects = [ Obj(Point(0, 0), Obj.FLOWER), Obj(Point(0, 0), Obj.START), Obj(Point(0, 0), Obj.KILLER), Obj(Point(0, 0), Obj.FOOD), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_UP), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_DOWN), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_LEFT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_RIGHT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_NORMAL) ] level.top10.single.append(Top10Time(1386, 'player1')) level.top10.single.append(Top10Time(1379, 'player2')) level.top10.multi.append(Top10Time(709, 'player3', 'player2', True)) level.top10.multi.append(Top10Time(714, 'player4', 'player1', True)) original_level = level packed = level.pack() level = Level.unpack(packed) self.assertEqual(2535781587, level.level_id) self.assertEqual('Unnamed', level.name) self.assertEqual('DEFAULT', level.lgr) self.assertEqual('ground', level.ground_texture) self.assertEqual('sky', level.sky_texture) # polygons self.assertEqual(1, len(level.polygons)) self.assertEqual(Point(0, 0), level.polygons[0].points[0]) self.assertEqual(Point(0, 1), level.polygons[0].points[1]) self.assertEqual(Point(1, 0), level.polygons[0].points[2]) # pictures self.assertEqual(1, len(level.pictures)) picture = level.pictures[0] original_picture = original_level.pictures[0] self.assertEqual(original_picture.picture_name, picture.picture_name) self.assertEqual(original_picture.texture_name, picture.texture_name) self.assertEqual(original_picture.mask_name, picture.mask_name) self.assertEqual(original_picture.distance, picture.distance) self.assertEqual(original_picture.clipping, picture.clipping) # objects self.assertEqual(9, len(level.objects)) for expected_obj, obj in zip([ Obj(Point(0, 0), Obj.FLOWER), Obj(Point(0, 0), Obj.START), Obj(Point(0, 0), Obj.KILLER), Obj(Point(0, 0), Obj.FOOD), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_UP), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_DOWN), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_LEFT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_RIGHT), Obj(Point(0, 0), Obj.FOOD, gravity=Obj.GRAVITY_NORMAL) ], level.objects): self.assertEqual(expected_obj, obj) # top10 self.assertEqual(2, len(level.top10.single)) self.assertEqual(2, len(level.top10.multi)) self.assertEqual(Top10Time(1379, 'player2'), level.top10.single[0]) self.assertEqual(Top10Time(1386, 'player1'), level.top10.single[1]) self.assertEqual(Top10Time(709, 'player3', 'player2', True), level.top10.multi[0]) self.assertEqual(Top10Time(714, 'player4', 'player1', True), level.top10.multi[1]) # merge top10s level2 = deepcopy(level) level2.top10.single.append(Top10Time(1383, 'player2')) level2.top10.multi.append(Top10Time(714, 'player1', 'player5')) level.top10.merge(level2.top10) self.assertEqual(3, len(level.top10.single)) self.assertEqual(3, len(level.top10.multi)) self.assertEqual(Top10Time(1379, 'player2'), level.top10.single[0]) self.assertEqual(Top10Time(1383, 'player2'), level.top10.single[1]) self.assertEqual(Top10Time(1386, 'player1'), level.top10.single[2]) self.assertEqual(Top10Time(709, 'player3', 'player2', True), level.top10.multi[0]) self.assertEqual(Top10Time(714, 'player4', 'player1', True), level.top10.multi[1]) self.assertEqual(Top10Time(714, 'player1', 'player5', True), level.top10.multi[2])