Пример #1
0
class Planet(Object, Combattant):
    attributes = { \
     'owner':     Object.Attribute('owner', -1, 'public'),
     'resources': Object.Attribute('resources', {}, 'protected'),
    }
    orderclasses = ('tp.server.rules.base.orders.NOp',
                    'tp.server.rules.minisec.orders.BuildFleet')

    def ghost(self):
        """\
		Planets never die - even when owned by the universe.
		"""
        return False

    #############################################
    # Combat functions
    #############################################

    damage = 0

    def dead(self):
        """\
		Planets are dead went delt 12 damage.
		"""
        return self.damage > 12

    def damage_do(self, damage):
        if type(amount) in (TupleType, ListType):
            for a in amount:
                self.damage_do(a)
            return

        self.damage = self.damage + damage

    def damage_get(self, fail=False):
        return (6, 2)[fail]

    def fn_resources(self, value=None):
        res = []
        for id, values in self.resources.items():
            res.append((id, values[0], values[1], values[2]))

        return res

    def resources_add(self, resource, amount, type=ACCESSABLE):
        if not self.resources.has_key(resource):
            self.resources[resource] = [0, 0, 0]
        self.resources[resource][type] += amount

        if self.resources[resource][type] < 0:
            raise TypeError("Resources some how became negative!")
class Universe(Object):
    attributes = {'turn': Object.Attribute('turn', 0, 'public')}
Пример #3
0
class Fleet(Object, Combattant):
    __metaclass__ = ShipTypes

    attributes = { \
     'owner': Object.Attribute('owner', -1, 'public'),
     'ships': Object.Attribute('ships', {}, 'protected'),
     'damage': Object.Attribute('damage', {}, 'protected'),
    }
    orderclasses = (
        'tp.server.rules.base.orders.NOp',
        'tp.server.rules.minisec.orders.Move',
        'tp.server.rules.minisec.orders.SplitFleet',
        'tp.server.rules.base.orders.MergeFleet',
        'tp.server.rules.base.orders.Colonise',
    )

    def fn_ships(self, value=None):
        if value == None:
            return self.ships.items()

    def fn_damage(self, value=None):
        if value == None:
            return sum(map(sum, self.damage.values()))

            totaldamage = 0
            for type, damage in self.damage:
                if type in self.ships.keys():
                    for d in damage:
                        totaldamage += damage

            return totaldamage

    def tidy(self):
        """\
		Fix up the ships and damage stuff.
		"""
        # Run a consistancy check
        # Check the ships actually exist
        for t, number in self.ships.items():
            if number < 1:
                del self.ships[t]

        # Check the damage goes to the right place
        for t, damage in self.damage.items():
            if not t in self.ships.keys():
                del self.damage[t]

    def ghost(self):
        """\
		Returns if the fleet has no ships.
		"""
        self.tidy()
        return len(self.ships.keys()) < 1

    #############################################
    # Movement functions
    #############################################
    def speed(self):
        """\
		Returns the maximum speed of the fleet.
		"""
        return self.ship_speed[max(self.ships.keys())]

    #############################################
    # Combat functions
    #############################################

    def dead(self):
        """\
		Checks if this object is a can still participate in combat.
		"""
        return self.ghost() or self.ships.keys() == [
            0,
        ]

    def damage_do(self, amount):
        """\
		Damages a fleet. Can be called with either a single
		integer or a tuple of integers.
		"""
        if type(amount) in (TupleType, ListType):
            for a in amount:
                self.damage_do(a)
            return

        self.tidy()

        # Find the largest ship type.
        s = self.ships.keys()
        s.sort()
        s.reverse()
        t = s[0]

        if not self.damage.has_key(t):
            self.damage[t] = []
        damage = self.damage[t]

        # Condense the damage
        if len(damage) + 1 > self.ships[t]:
            damage.sort()
            if damage[0] + amount >= self.ship_hp[t]:
                damage[-1] += amount
            else:
                damage[0] += amount
        else:
            damage.append(amount)

        if damage[-1] >= self.ship_hp[t]:
            self.ships[t] -= 1
            if self.ships[t] < 1:
                del self.ships[t]
            del damage[-1]

    def damage_get(self, fail=False):
        """\
		Returns the amount of damage this fleet can do.
		"""
        r = []
        for type, no in self.ships.items():
            r.extend([self.ship_damage[type][fail]] * no)
        return r