Example #1
0
    def test_got_moved(self):
        """Make sure you can't finish moving if you're warped"""
        started = self.alice.region
        londo = self.get_region("Orange Londo")
        # For testing purposes, londo is now alice's
        londo.owner = self.alice.team

        # But she's at the fight
        self.alice.region = self.get_region('sapphire')

        order = self.alice.move(100, londo, 60 * 60 * 24)[0]
        n = self.sess.query(db.MarchingOrder).count()
        self.assertEqual(n, 1)

        # The sapphire battle ends poorly for alice's team, and she gets
        # booted out
        self.alice.region = self.get_region('oraistedarg')

        # Invoke the update routine to set everyone's location
        order.arrival = now()
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # Alice should be back where she started, as the move isn't valid
        self.assertEqual(started, self.alice.region)

        n = self.sess.query(db.MarchingOrder).count()
        self.assertEqual(n, 0)
Example #2
0
    def test_situation_changes(self):
        """Can't move somewhere that changes hands while you're moving"""
        started = self.alice.region
        londo = self.get_region("Orange Londo")
        # For testing purposes, londo is now alice's
        londo.owner = self.alice.team

        order = self.alice.move(100, londo, 60 * 60 * 24)[0]
        n = self.sess.query(db.MarchingOrder).count()
        self.assertEqual(n, 1)

        # BUT WAIT!  Londo's government is overthrown!
        londo.owner = self.bob.team

        # Push back arrival time
        order.arrival = now()
        self.sess.commit()

        # Invoke the update routine to set everyone's location
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # Alice should be back where she started, as she can't be in londo
        self.assertEqual(started, self.alice.region)

        n = self.sess.query(db.MarchingOrder).count()
        self.assertEqual(n, 0)
Example #3
0
    def test_delayed_movement(self):
        """Most movement should take a while"""
        home = self.alice.region
        londo = self.get_region("Orange Londo")

        # Everything's fine
        self.assertFalse(self.alice.is_moving())

        # Ideally, this test will not take a day to complete
        order = self.alice.move(100, londo, 60 * 60 * 24)
        self.assert_(order)

        # Alice should be moving
        self.assert_(self.alice.is_moving())

        # For record-keeping purposes, she's in her source city
        self.assertEqual(home, self.alice.region)

        # Well, we don't want to wait an entire day, so let's cheat and push
        # back the arrival time
        order.arrival = time.mktime(time.localtime())
        self.sess.commit()
        self.assert_(order.has_arrived())

        # But we're not actually there yet
        self.assertEqual(home, self.alice.region)

        # Invoke the update routine to set everyone's location
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # Now we're there!
        self.assertEqual(londo, self.alice.region)

        # Shouldn't be any marching orders left
        orders = self.sess.query(MarchingOrder).count()
        self.assertEqual(orders, 0)
Example #4
0
    def update_game(self):
        session = self.session
        MarchingOrder.update_all(session, self.config)

        results = Region.update_all(session, self.config)
        to_add = []
        for newternal in results['new_eternal']:
            title = "The Eternal Battle Rages On"
            post = InvadeCommand.post_invasion(title, newternal, self.reddit)
            if post:
                newternal.submission_id = post.name
                to_add.append(newternal)
            else:
                logging.warn("Couldn't submit eternal battle thread")
                session.rollback()
        if to_add:
            session.add_all(to_add)
            session.commit()

        results = Battle.update_all(session, self.config)

        for ready in results['begin']:
            ready.display_ends = (ready.begins +
                self.config["game"]["battle_time"])

            # Actual ending is within battle_lockout of the end
            chooserange = self.config["game"]["battle_lockout"]
            chosen = random.randint(0, chooserange)
            ready.ends = ready.display_ends - (chooserange / 2) + chosen

            text = ("War is now at your doorstep!  Mobilize your armies! "
                    "The battle has begun now, and will end at %s.\n\n"
                    "> Enter your commands in this thread, prefixed with "
                    "'>'") % ready.ends_str()
            post = self.reddit.get_submission(
                submission_id=name_to_id(ready.submission_id))
            post.edit(text)
            session.commit()

        self.update_skirmish_summaries(results['skirmish_ended'])

        for done in results['ended']:
            report = ["The battle is complete...\n"]
            report += done.report(self.config)

            report.append("")

            if done.old_buffs:
                report.append("Buffs in effect for Team %s\n" %
                              num_to_team(done.old_owner, self.config))
                for buff in done.old_buffs:
                    report.append("  * %s" % buff.name)
                report.append("")

            team0_name = num_to_team(0, self.config)
            team1_name = num_to_team(1, self.config)

            # Homeland buffs?
            if done.homeland_buffs:
                report.append("Homeland buffs in effect:")
                for team in range(0, 2):
                    name = num_to_team(team, self.config)
                    report.append("%s: %d%%" %
                                  (name, done.homeland_buffs[team]))

            report.append(("## Final Score:  Team %s: %d "
                           "Team %s: %d") % (team0_name, done.score0,
                                             team1_name, done.score1))
            if done.victor is not None:
                report.append("\n# The Victor:  Team %s" %
                              num_to_team(done.victor, self.config))
            else:
                report.append("# TIE")

            text = "\n".join(report)
            post = self.reddit.get_submission(
                submission_id=name_to_id(done.submission_id))
            post.edit(text)

            # Update all the skirmish summaries
            self.update_skirmish_summaries(done.toplevel_skirmishes())

            session.delete(done)
            session.commit()
        db.Buff.update_all(session)
Example #5
0
    def test_multimove_situation_changes(self):
        """Can't multimove somewhere that's changed hands"""
        sapp = self.get_region("Sapphire")
        sapp.owner = self.alice.team
        self.sess.commit()

        DAY = 60 * 60 * 24

        movements = self.sess.query(MarchingOrder).count()
        self.assertEqual(movements, 0)

        path = [self.get_region(name) for name in ('Orange Londo', 'Sapphire')]
        then = now()  # We'll need this to check timing
        self.alice.move(100, path, DAY)

        movements = self.sess.query(MarchingOrder).all()
        self.assertEqual(len(movements), 2)
        # The first should be to londo
        londomove = movements[0]
        self.assertEqual(londomove.source, self.get_region('Oraistedarg'))
        self.assertEqual(londomove.dest, self.get_region('Orange Londo'))
        # Note, if self.alice.move takes longer than 10 minutes to run, this
        # will fail.
        self.assertAlmostEqual(londomove.arrival, then + DAY, delta=600)

        # Next, sapphire
        sappmove = movements[1]
        self.assertEqual(sappmove.source, self.get_region('Orange Londo'))
        self.assertEqual(sappmove.dest, self.get_region('Sapphire'))
        # Should arrive 2 days from now, +/- 5 minutes
        self.assertAlmostEqual(sappmove.arrival, then + DAY + DAY, delta=600)

        n = (self.sess.query(db.MarchingOrder).
            filter_by(leader=self.alice)).count()
        self.assertEqual(n, 2)

        # Sapphire falls to the enemy!
        sappmove.dest.owner = self.bob.team
        self.sess.commit()

        # Tired of waiting
        movements[0].arrival = now()
        self.sess.commit()
        self.assert_(movements[0].has_arrived())
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # Should be in londo
        self.assertEqual(londomove.dest, self.alice.region)

        # One order left
        n = (self.sess.query(db.MarchingOrder).
            filter_by(leader=self.alice)).count()
        self.assertEqual(n, 1)

        movements[1].arrival = now()
        self.sess.commit()
        self.assert_(movements[1].has_arrived())
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # But we fail to arrive because this movement's no longer valid.
        self.assertEqual(londomove.dest, self.alice.region)

        # Done moving
        n = (self.sess.query(db.MarchingOrder).
            filter_by(leader=self.alice)).count()
        self.assertEqual(n, 0)
Example #6
0
    def test_multimove(self):
        """Should be able to more more than one hop.
        (with corresponding increase in times)"""
        sapp = self.get_region("Sapphire")
        sapp.owner = self.alice.team
        self.sess.commit()

        DAY = 60 * 60 * 24

        movements = self.sess.query(MarchingOrder).count()
        self.assertEqual(movements, 0)

        path = [self.get_region(name) for name in ('Orange Londo', 'Sapphire')]
        then = now()  # We'll need this to check timing
        self.alice.move(100, path, DAY)

        movements = self.sess.query(MarchingOrder).all()
        self.assertEqual(len(movements), 2)
        # The first should be to londo
        londomove = movements[0]
        self.assertEqual(londomove.source, self.get_region('Oraistedarg'))
        self.assertEqual(londomove.dest, self.get_region('Orange Londo'))
        # Note, if self.alice.move takes longer than 10 minutes to run, this
        # will fail.
        self.assertAlmostEqual(londomove.arrival, then + DAY, delta=600)

        # Next, sapphire
        sappmove = movements[1]
        self.assertEqual(sappmove.source, self.get_region('Orange Londo'))
        self.assertEqual(sappmove.dest, self.get_region('Sapphire'))
        # Should arrive 2 days from now, +/- 5 minutes
        self.assertAlmostEqual(sappmove.arrival, then + DAY + DAY, delta=600)

        n = (self.sess.query(db.MarchingOrder).
            filter_by(leader=self.alice)).count()
        self.assertEqual(n, 2)

        # Tired of waiting
        movements[0].arrival = now()
        self.sess.commit()
        self.assert_(movements[0].has_arrived())
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # Should be in londo
        self.assertEqual(londomove.dest, self.alice.region)

        # One order left
        n = (self.sess.query(db.MarchingOrder).
            filter_by(leader=self.alice)).count()
        self.assertEqual(n, 1)

        movements[1].arrival = now()
        self.sess.commit()
        self.assert_(movements[1].has_arrived())
        arrived = MarchingOrder.update_all(self.sess)
        self.assert_(arrived)

        # And now in sapphire
        self.assertEqual(sappmove.dest, self.alice.region)

        # Done moving
        n = (self.sess.query(db.MarchingOrder).
            filter_by(leader=self.alice)).count()
        self.assertEqual(n, 0)
Example #7
0
    def update_game(self):
        session = self.session
        MarchingOrder.update_all(session, self.config)

        results = Region.update_all(session, self.config)
        to_add = []
        for newternal in results['new_eternal']:
            title = "The Eternal Battle Rages On"
            post = InvadeCommand.post_invasion(title, newternal, self.reddit)
            if post:
                newternal.submission_id = post.name
                to_add.append(newternal)
            else:
                logging.warn("Couldn't submit eternal battle thread")
                session.rollback()
        if to_add:
            session.add_all(to_add)
            session.commit()

        results = Battle.update_all(session, self.config)

        for ready in results['begin']:
            ready.display_ends = (ready.begins +
                                  self.config["game"]["battle_time"])

            # Actual ending is within battle_lockout of the end
            chooserange = self.config["game"]["battle_lockout"]
            chosen = random.randint(0, chooserange)
            ready.ends = ready.display_ends - (chooserange / 2) + chosen

            text = ("War is now at your doorstep!  Mobilize your armies! "
                    "The battle has begun now, and will end at %s.\n\n"
                    "> Enter your commands in this thread, prefixed with "
                    "'>'") % ready.ends_str()
            post = self.reddit.get_submission(
                submission_id=name_to_id(ready.submission_id))
            post.edit(text)
            session.commit()

        self.update_skirmish_summaries(results['skirmish_ended'])

        for done in results['ended']:
            report = ["The battle is complete...\n"]
            report += done.report(self.config)

            report.append("")

            if done.old_buffs:
                report.append("Buffs in effect for Team %s\n" %
                              num_to_team(done.old_owner, self.config))
                for buff in done.old_buffs:
                    report.append("  * %s" % buff.name)
                report.append("")

            team0_name = num_to_team(0, self.config)
            team1_name = num_to_team(1, self.config)

            # Homeland buffs?
            if done.homeland_buffs:
                report.append("Homeland buffs in effect:")
                for team in range(0, 2):
                    name = num_to_team(team, self.config)
                    report.append("%s: %d%%" %
                                  (name, done.homeland_buffs[team]))

            report.append(("## Final Score:  Team %s: %d "
                           "Team %s: %d") %
                          (team0_name, done.score0, team1_name, done.score1))
            if done.victor is not None:
                report.append("\n# The Victor:  Team %s" %
                              num_to_team(done.victor, self.config))
            else:
                report.append("# TIE")

            text = "\n".join(report)
            post = self.reddit.get_submission(
                submission_id=name_to_id(done.submission_id))
            post.edit(text)

            # Update all the skirmish summaries
            self.update_skirmish_summaries(done.toplevel_skirmishes())

            session.delete(done)
            session.commit()
        db.Buff.update_all(session)