Example #1
0
    def load_shops(self):
        """
        Load character's shop.
        """
        # shops records
        shop_records = NPC_SHOPS.filter(self.get_data_key())

        shop_keys = set([record.shop for record in shop_records])

        # remove old shops
        for shop_key in self.db.shops:
            if shop_key not in shop_keys:
                # remove this shop
                self.db.shops[shop_key].delete()
                del self.db.shops[shop_key]

        # add new shop
        for shop_record in shop_records:
            shop_key = shop_record.shop
            if shop_key not in self.db.shops:
                # Create shop object.
                shop_obj = build_object(shop_key)
                if not shop_obj:
                    logger.log_errmsg("Can't create shop: %s" % shop_key)
                    continue

                self.db.shops[shop_key] = shop_obj
                shop_obj.set_owner(self)
Example #2
0
    def load_goods(self):
        """
        Load shop goods.
        """
        # shops records
        goods_records = SHOP_GOODS.filter(self.get_data_key())

        goods_keys = set([record.key for record in goods_records])

        # search current goods
        current_goods = set()
        for item in self.contents:
            key = item.get_data_key()
            if key in goods_keys:
                current_goods.add(key)
            else:
                # remove goods that is not in goods_keys
                item.delete()

        # add new goods
        for goods_record in goods_records:
            goods_key = goods_record.key
            if goods_key not in current_goods:
                # Create shop_goods object.
                goods_obj = build_object(goods_key)
                if not goods_obj:
                    logger.log_errmsg("Can't create goods: %s" % goods_key)
                    continue

                goods_obj.move_to(self, quiet=True)
Example #3
0
    def attack_clone_target(self, target_key, target_level=0, desc=""):
        """
        Attack the image of a target. This creates a new character object for attack.
        The origin target will not be affected.

        Args:
            target_key: (string) the info key of the target.
            target_level: (int) target's level
            desc: (string) string to describe this attack

        Returns:
            None
        """
        if target_level == 0:
            # find the target and get level
            obj = utils.search_obj_info_key(target_key)
            if not obj:
                logger.log_errmsg("Can not find the target %s." % target_key)
                return
            obj = obj[0]

            target_level = obj.db.level

        # Create a target.
        target = build_object(target_key)
        if not target:
            logger.log_errmsg("Can not create the target %s." % target_key)
            return

        target.set_level(target_level)
        self.attack_target(target, desc)
Example #4
0
    def load_shops(self):
        """
        Load character's shop.
        """
        # shops records
        shop_records = []
        nps_shops_model = apps.get_model(settings.WORLD_DATA_APP, settings.NPC_SHOPS)
        if nps_shops_model:
            # Get records.
            shop_records = nps_shops_model.objects.filter(npc=self.get_data_key())

        shop_keys = set([record.shop for record in shop_records])

        # remove old shops
        for shop_key in self.db.shops:
            if shop_key not in shop_keys:
                # remove this shop
                self.db.shops[shop_key].delete()
                del self.db.shops[shop_key]

        # add new shop
        for shop_record in shop_records:
            shop_key = shop_record.shop
            if shop_key not in self.db.shops:
                # Create shop object.
                shop_obj = build_object(shop_key)
                if not shop_obj:
                    logger.log_errmsg("Can't create shop: %s" % shop_key)
                    continue

                self.db.shops[shop_key] = shop_obj
Example #5
0
    def load_shops(self):
        """
        Load character's shop.
        """
        # shops records
        shop_records = NPC_SHOPS.filter(self.get_data_key())

        shop_keys = set([record.shop for record in shop_records])

        # remove old shops
        for shop_key in self.db.shops:
            if shop_key not in shop_keys:
                # remove this shop
                self.db.shops[shop_key].delete()
                del self.db.shops[shop_key]

        # add new shop
        for shop_record in shop_records:
            shop_key = shop_record.shop
            if shop_key not in self.db.shops:
                # Create shop object.
                shop_obj = build_object(shop_key)
                if not shop_obj:
                    logger.log_errmsg("Can't create shop: %s" % shop_key)
                    continue

                self.db.shops[shop_key] = shop_obj
Example #6
0
    def accept(self, quest_key):
        """
        Accept a quest.

        Args:
            quest_key: (string) quest's key

        Returns:
            None
        """
        if quest_key in self.current_quests:
            return

        # Create quest object.
        new_quest = build_object(quest_key)
        if not new_quest:
            return

        new_quest.set_owner(self.owner)
        self.current_quests[quest_key] = new_quest

        self.owner.msg(
            {"msg": _("Accepted quest {c%s{n.") % new_quest.get_name()})
        self.show_quests()
        self.owner.show_location()
Example #7
0
    def load_goods(self):
        """
        Load shop goods.
        """
        # shops records
        goods_records = DATA_SETS.shop_goods.objects.filter(shop=self.get_data_key())

        goods_keys = set([record.key for record in goods_records])

        # search current goods
        current_goods = set()
        for item in self.contents:
            key = item.get_data_key()
            if key in goods_keys:
                current_goods.add(key)
            else:
                # remove goods that is not in goods_keys
                item.delete()

        # add new goods
        for goods_record in goods_records:
            goods_key = goods_record.key
            if goods_key not in current_goods:
                # Create shop_goods object.
                goods_obj = build_object(goods_key)
                if not goods_obj:
                    logger.log_errmsg("Can't create goods: %s" % goods_key)
                    continue

                goods_obj.move_to(self, quiet=True)
Example #8
0
    def attack_clone_target(self, target_key, target_level=0, desc=""):
        """
        Attack the image of a target. This creates a new character object for attack.
        The origin target will not be affected.

        Args:
            target_key: (string) the info key of the target.
            target_level: (int) target's level
            desc: (string) string to describe this attack

        Returns:
            None
        """
        if target_level == 0:
            # find the target and get level
            obj = utils.search_obj_data_key(target_key)
            if not obj:
                logger.log_errmsg("Can not find the target %s." % target_key)
                return
            obj = obj[0]

            target_level = obj.db.level

        # Create a target.
        target = build_object(target_key)
        if not target:
            logger.log_errmsg("Can not create the target %s." % target_key)
            return

        target.set_level(target_level)
        self.attack_target(target, desc)
Example #9
0
    def attack_clone_target(self, target_key, target_level=0, desc=""):
        """
        Attack the image of a target. This creates a new character object for attack.
        The origin target will not be affected.

        Args:
            target_key: (string) the info key of the target.
            target_level: (int) target's level
            desc: (string) string to describe this attack

        Returns:
            (boolean) fight begins
        """
        if target_level == 0:
            # Find the target and get its level.
            obj = utils.search_obj_data_key(target_key)
            if not obj:
                logger.log_errmsg("Can not find the target %s." % target_key)
                return False
            obj = obj[0]
            target_level = obj.db.level

        # Create a target.
        target = build_object(target_key, set_location=False)
        if not target:
            logger.log_errmsg("Can not create the target %s." % target_key)
            return False

        target.set_level(target_level)
        target.is_clone = True
        return self.attack_target(target, desc)
Example #10
0
    def attack_temp_target(self, target_key, target_level=0, desc=""):
        """
        Attack a temporary clone of a target. This creates a new character object for attack.
        The origin target will not be affected.

        Args:
            target_key: (string) the info key of the target object.
            target_level: (int) target object's level
            desc: (string) string to describe this attack

        Returns:
            (boolean) fight begins
        """
        if target_level == 0:
            # Find the target and get its level.
            obj = search_obj_data_key(target_key)
            if obj:
                obj = obj[0]
                target_level = obj.db.level

        # Create a target.
        target = build_object(target_key, target_level, reset_location=False)
        if not target:
            logger.log_errmsg("Can not create the target %s." % target_key)
            return False

        target.is_temp = True
        return self.attack_target(target, desc)
Example #11
0
    def after_data_loaded(self):
        """
        Load goods data.

        Returns:
            None
        """
        self.available = False

        self.shop_key = getattr(self.system, "shop", "")
        self.goods_key = getattr(self.system, "goods", "")
        self.goods_level = getattr(self.system, "level", 0)

        if not self.shop_key or not self.goods_key:
            if self.db.goods:
                self.db.goods.delete()
                self.db.goods = None
            return

        # set goods information
        self.price = getattr(self.system, "price", 0)
        self.unit_key = getattr(self.system, "unit", "")
        self.number = getattr(self.system, "number", 0)
        self.condition = getattr(self.system, "condition", "")

        # get price unit information
        unit_record = get_object_record(self.unit_key)
        if not unit_record:
            logger.log_errmsg("Can not find %s price unit %s." %
                              (self.goods_key, self.unit_key))
            return
        self.unit_name = unit_record.name

        # load goods object
        goods = self.db.goods
        if goods:
            if goods.get_data_key() == self.goods_key:
                # Load data.
                try:
                    # Load db data.
                    goods.load_data()
                except Exception as e:
                    logger.log_errmsg("%s(%s) can not load data:%s" %
                                      (self.goods_key, self.dbref, e))
            else:
                goods.set_data_key(self.goods_key, self.goods_level)
        else:
            goods = build_object(self.goods_key)
            if goods:
                self.db.goods = goods
            else:
                logger.log_err("Can not create goods %s." % self.goods_key)
                return

        self.name = goods.get_name()
        self.desc = goods.db.desc
        self.icon = getattr(goods, "icon", None)

        self.available = True
Example #12
0
    def after_data_loaded(self):
        """
        Load goods data.

        Returns:
            None
        """
        self.available = False

        self.shop_key = getattr(self.dfield, "shop", "")
        self.goods_key = getattr(self.dfield, "goods", "")

        if not self.shop_key or not self.goods_key:
            if self.db.goods:
                self.db.goods.delete()
                self.db.goods = None
            return

        # set goods information
        self.price = getattr(self.dfield, "price", 0)
        self.unit_key = getattr(self.dfield, "unit", "")
        self.number = getattr(self.dfield, "number", 0)
        self.condition = getattr(self.dfield, "condition", "")

        # get price unit information
        unit_record = get_object_record(self.unit_key)
        if not unit_record:
            logger.log_errmsg("Can not find %s price unit %s." % (self.goods_key, self.unit_key))
            return
        self.unit_name = unit_record.name

        # load goods object
        goods = self.db.goods
        if goods:
            if goods.get_data_key() == self.goods_key:
                goods.load_data()
            else:
                goods.set_data_key(self.goods_key)
        else:
            goods = build_object(self.goods_key)
            if goods:
                self.db.goods = goods
            else:
                logger.log_err("Can not create goods %s." % self.goods_key)
                return

        self.name = goods.get_name()
        self.desc = goods.db.desc
        self.icon = getattr(goods, "icon", None)

        self.available = True
Example #13
0
    def learn_skill(self, skill, is_default=False):
        """
        Learn a new skill.

        Args:
            skill: (string) skill's key
            is_default: (boolean) if it is a default skill

        Returns:
            (boolean) learned skill
        """
        if not self.owner:
            return False

        if skill in self.skills:
            self.owner.msg(
                {"alert": LS("You have already learned this skill.")})
            return False

        # Create skill object.
        skill_obj = build_object(skill)
        if not skill_obj:
            self.owner.msg({"alert": LS("Can not learn this skill.")})
            return False

        # set default
        if is_default:
            skill_obj.set_default(is_default)

        # Store new skill.
        skill_obj.set_owner(self.owner)
        self.skills[skill] = skill_obj

        # If it is a passive skill, player's status may change.
        if skill_obj.passive:
            self.owner.refresh_data()

            # Notify the player
            if self.owner.has_player:
                self.owner.show_status()

        # Notify the player
        if self.owner.has_player:
            self.owner.show_skills()
            self.owner.msg({
                "msg":
                LS("You learned skill {c%s{n.") % skill_obj.get_name()
            })

        return True
Example #14
0
    def accept(self, quest):
        """
        Accept a quest.
        """
        if quest in self.current_quests:
            return

        new_quest = build_object(quest)
        if not new_quest:
            return

        self.current_quests[quest] = new_quest
        self.show_quests()
        self.character.show_location()
Example #15
0
    def accept(self, quest):
        """
        Accept a quest.
        """
        if quest in self.current_quests:
            return

        new_quest = build_object(quest)
        if not new_quest:
            return

        self.current_quests[quest] = new_quest
        self.show_quests()
        self.character.show_location()
Example #16
0
    def do_attack(self, data, character):
        """
        """
        rand = random.random()
        for item in data:
            if rand >= item["odds"]:
                rand -= item["odds"]
                continue

            mob = build_object(item["mob"])
            if not mob:
                return

            mob.set_level(item["level"])

            # create a new combat handler
            chandler = create_script("combat_handler.CombatHandler")
            chandler.add_characters([mob, character])
Example #17
0
    def do_attack(self, data, character):
        """
        """
        rand = random.random()
        for item in data:
            if rand >= item["odds"]:
                rand -= item["odds"]
                continue

            mob = build_object(item["mob"])
            if not mob:
                return

            mob.set_level(item["level"])

            # create a new combat handler
            chandler = create_script("combat_handler.CombatHandler")
            chandler.add_characters([mob, character])
Example #18
0
    def learn_skill(self, skill_key, is_default, silent):
        """
        Learn a new skill.

        Args:
            skill_key: (string) skill's key
            is_default: (boolean) if it is a default skill
            silent: (boolean) do not show messages to the player

        Returns:
            (boolean) learned skill
        """
        if skill_key in self.db.skills:
            self.msg({"msg": _("You have already learned this skill.")})
            return False

        # Create skill object.
        skill_obj = build_object(skill_key)
        if not skill_obj:
            self.msg({"msg": _("Can not learn this skill.")})
            return False

        # set default
        if is_default:
            skill_obj.set_default(is_default)

        # Store new skill.
        skill_obj.set_owner(self)
        self.db.skills[skill_key] = skill_obj

        # If it is a passive skill, player's status may change.
        if skill_obj.passive:
            self.refresh_properties()

        # Notify the player
        if not silent and self.has_account:
            self.show_status()
            self.show_skills()
            self.msg(
                {"msg": _("You learned skill {c%s{n.") % skill_obj.get_name()})

        return True
Example #19
0
    def learn_skill(self, skill_key, is_default, silent):
        """
        Learn a new skill.

        Args:
            skill_key: (string) skill's key
            is_default: (boolean) if it is a default skill
            silent: (boolean) do not show messages to the player

        Returns:
            (boolean) learned skill
        """
        if skill_key in self.db.skills:
            self.msg({"msg": _("You have already learned this skill.")})
            return False

        # Create skill object.
        skill_obj = build_object(skill_key)
        if not skill_obj:
            self.msg({"msg": _("Can not learn this skill.")})
            return False

        # set default
        if is_default:
            skill_obj.set_default(is_default)

        # Store new skill.
        skill_obj.set_owner(self)
        self.db.skills[skill_key] = skill_obj

        # If it is a passive skill, player's status may change.
        if skill_obj.passive:
            self.refresh_data()

        # Notify the player
        if not silent and self.has_account:
            self.show_status()
            self.show_skills()
            self.msg({"msg": _("You learned skill {c%s{n.") % skill_obj.get_name()})

        return True
Example #20
0
    def learn_skill(self, skill):
        """
        Learn a new skill.

        Args:
            skill: (string) skill's key

        Returns:
            None
        """
        if not self.owner:
            return

        if skill in self.skills:
            self.owner.msg({"alert": LS("You have already learned this skill.")})
            return

        # Create skill object.
        skill_obj = build_object(skill)
        if not skill_obj:
            self.owner.msg({"alert": LS("Can not learn this skill.")})
            return

        # Store new skill.
        skill_obj.set_owner(self.owner)
        self.skills[skill] = skill_obj

        # If it is a passive skill, player's status may change.
        if skill_obj.passive:
            self.owner.refresh_data()

            # Notify the player
            if self.owner.has_player:
                self.owner.show_status()

        # Notify the player
        if self.owner.has_player:
            self.owner.show_skills()
            self.owner.msg({"msg": LS("You learned skill {c%s{n.") % skill_obj.get_name()})
Example #21
0
    def learn_skill(self, skill):
        """
        Learn a new skill.
        """
        if not self.owner:
            return

        if skill in self.skills:
            self.msg({"alert": LS("You have already learned this skill.")})
            return

        # Create skill object.
        skill_obj = build_object(skill)
        if not skill_obj:
            self.owner.msg({"alert": LS("Can not learn this skill.")})
            return

        # Store new skill.
        skill_obj.set_owner(self.owner)
        self.skills[skill] = skill_obj

        if self.owner.has_player:
            self.owner.show_skills()
Example #22
0
    def learn_skill(self, skill):
        """
        Learn a new skill.
        """
        if not self.owner:
            return

        if skill in self.skills:
            self.msg({"alert":LS("You have already learned this skill.")})
            return

        # Create skill object.
        skill_obj = build_object(skill)
        if not skill_obj:
            self.owner.msg({"alert":LS("Can not learn this skill.")})
            return

        # Store new skill.
        skill_obj.set_owner(self.owner)
        self.skills[skill] = skill_obj

        if self.owner.has_player:
            self.owner.show_skills()
Example #23
0
    def accept(self, quest_key):
        """
        Accept a quest.

        Args:
            quest_key: (string) quest's key

        Returns:
            None
        """
        if quest_key in self.current_quests:
            return

        # Create quest object.
        new_quest = build_object(quest_key)
        if not new_quest:
            return

        new_quest.set_owner(self.owner)
        self.current_quests[quest_key] = new_quest

        self.owner.msg({"msg": _("Accepted quest {c%s{n.") % new_quest.get_name()})
        self.show_quests()
        self.owner.show_location()
Example #24
0
    def receive_objects(self, obj_list):
        """
        Receive objects.
        obj_list: (list) a list of object keys and there numbers.
                  .object object's key
                  .number object's number
        """
        accepted_keys = {}
        accepted_names = {}
        rejected_keys = {}
        reject_reason = {}

        # check what the character has now
        inventory = {}
        for item in self.contents:
            key = item.get_info_key()
            if key in inventory:
                # if the character has more than one item of the same kind,
                # get the smallest stack.
                if inventory[key].db.number > item.db.number:
                    inventory[key] = item
            else:
                inventory[key] = item

        for obj in obj_list:
            key = obj["object"]
            available = obj["number"]
            number = available
            accepted = 0
            name = ""
            unique = False

            # if already has this kind of object
            if key in inventory:
                # add to current object
                name = inventory[key].name
                unique = inventory[key].unique

                add = number
                if add > inventory[key].max_stack - inventory[key].db.number:
                    add = inventory[key].max_stack - inventory[key].db.number

                if add > 0:
                    # increase stack number
                    inventory[key].increase_num(add)
                    number -= add
                    accepted += add

            # if does not have this kind of object, or stack is full
            reason = ""
            while number > 0:
                if unique:
                    # can not have more than one unique objects
                    reason = LS("Can not get more %s.") % name
                    break

                # create a new content
                new_obj = build_object(key)
                if not new_obj:
                    reason = LS("Can not get %s.") % name
                    break

                name = new_obj.name
                unique = new_obj.unique

                # move the new object to the character
                if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                    new_obj.delete()
                    reason = LS("Can not get %s.") % name
                    break

                add = number
                if add > new_obj.max_stack:
                    add = new_obj.max_stack

                if add <= 0:
                    break

                new_obj.increase_num(add)
                number -= add
                accepted += add

            if accepted > 0:
                accepted_keys[key] = accepted
                accepted_names[name] = accepted

            if accepted < available:
                rejected_keys[key] = available - accepted
                reject_reason[name] = reason

        message = {
            "get_object": {
                "accepted": accepted_names,
                "rejected": reject_reason
            }
        }
        self.msg(message)
        self.show_inventory()

        return rejected_keys
Example #25
0
    def receive_objects(self, obj_list, mute=False, combat=False):
        """
        Add objects to the inventory.

        Args:
            obj_list: (list) a list of object keys and there numbers.
                             list item: {"object": object's key
                                         "number": object's number}
            mute: (boolean) do not send messages to the owner
            combat: (boolean) get objects in combat.

        Returns:
            (dict) a list of objects that not have been received and their reasons.
        """
        accepted_keys = {}      # the keys of objects that have been accepted
        accepted_names = {}     # the names of objects that have been accepted
        rejected_keys = {}      # the keys of objects that have been rejected
        reject_reason = {}      # the reasons of why objects have been rejected

        # check what the character has now
        inventory = {}
        for item in self.contents:
            key = item.get_data_key()
            if key in inventory:
                # if the character has more than one item of the same kind,
                # get the smallest stack.
                if inventory[key].db.number > item.db.number:
                    inventory[key] = item
            else:
                inventory[key] = item

        for obj in obj_list:
            key = obj["object"]
            available = obj["number"]
            number = available
            accepted = 0
            name = ""
            unique = False

            if number == 0:
                # it is an empty object
                if key in inventory:
                    # already has this object
                    accepted_keys[key] = 0
                    accepted_names[name] = 0
                    continue

                object_record = None
                try:
                    common_model_name = TYPECLASS("COMMON_OBJECT").model_name
                    common_model_obj = apps.get_model(settings.WORLD_DATA_APP, common_model_name)
                    object_record = common_model_obj.objects.get(key=key)
                except Exception, e:
                    pass

                if not object_record:
                    # can not find object's data record
                    reason = _("Can not get %s.") % name
                    rejected_keys[key] = 0
                    reject_reason[name] = reason
                    continue

                if object_record.can_remove:
                    # remove this empty object
                    accepted_keys[key] = 0
                    accepted_names[name] = 0
                    continue

                # create a new content
                new_obj = build_object(key)
                if not new_obj:
                    reason = _("Can not get %s.") % name
                    rejected_keys[key] = 0
                    reject_reason[name] = reason
                    continue

                name = new_obj.get_name()

                # move the new object to the character
                if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                    new_obj.delete()
                    reason = _("Can not get %s.") % name
                    rejected_keys[key] = 0
                    reject_reason[name] = reason
                    break

                # accept this object
                accepted_keys[key] = 0
                accepted_names[name] = 0

            else:
                # common number
                # if already has this kind of object
                if key in inventory:
                    # add to current object
                    name = inventory[key].name
                    unique = inventory[key].unique

                    add = number
                    if add > inventory[key].max_stack - inventory[key].db.number:
                        add = inventory[key].max_stack - inventory[key].db.number

                    if add > 0:
                        # increase stack number
                        inventory[key].increase_num(add)
                        number -= add
                        accepted += add

                # if does not have this kind of object, or stack is full
                reason = ""
                while number > 0:
                    if unique:
                        # can not have more than one unique objects
                        reason = _("Can not get more %s.") % name
                        break

                    # create a new content
                    new_obj = build_object(key)
                    if not new_obj:
                        reason = _("Can not get %s.") % name
                        break

                    name = new_obj.get_name()
                    unique = new_obj.unique

                    # move the new object to the character
                    if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                        new_obj.delete()
                        reason = _("Can not get %s.") % name
                        break

                    # Get the number that actually added.
                    add = number
                    if add > new_obj.max_stack:
                        add = new_obj.max_stack

                    if add <= 0:
                        break

                    new_obj.increase_num(add)
                    number -= add
                    accepted += add

                if accepted > 0:
                    accepted_keys[key] = accepted
                    accepted_names[name] = accepted

                if accepted < available:
                    rejected_keys[key] = available - accepted
                    reject_reason[name] = reason
Example #26
0
        unit_name = None
        unit_record = get_object_record(goods_record.unit)
        if not unit_record:
            logger.log_errmsg("Can not find %s price unit %s." % (goods_key, goods_record.unit))
            return
        unit_name = unit_record.name

        # load goods object
        goods = self.db.goods
        if goods:
            if goods.get_data_key == goods_key:
                goods.load_data()
            else:
                goods.set_data_key(goods_key)
        else:
            goods = build_object(goods_key)
            if goods:
                self.db.goods = goods
            else:
                logger.log_err("Can not create goods %s." % goods_key)
                return

        # set goods information
        self.price = goods_record.price
        self.unit_key = goods_record.unit
        self.unit_name = unit_name
        self.number = goods_record.number
        self.condition = goods_record.condition

        self.name = goods.get_name()
        self.desc = goods.db.desc
Example #27
0
    def receive_objects(self, obj_list, mute=False):
        """
        Add objects to the inventory.

        Args:
            obj_list: (list) a list of object keys and there numbers.
                             list item: {"object": object's key
                                         "number": object's number}
            mute: (boolean) do not send messages to the owner

        Returns:
            (list) a list of objects that not have been received and their reasons.
            [{
                "key": key,
                "name": name,
                "level": level,
                "number": number,
                "icon": icon,
                "reject": reason,
            }]
        """
        objects = []  # objects that have been accepted

        # check what the character has now
        inventory = {}
        for item in self.contents:
            key = item.get_data_key()
            if key in inventory:
                # if the character has more than one item of the same kind,
                # get the smallest stack.
                if inventory[key].db.number > item.db.number:
                    inventory[key] = item
            else:
                inventory[key] = item

        for obj in obj_list:
            key = obj["object"]
            level = obj.get("level")
            available = obj["number"]
            name = ""
            icon = ""
            number = available
            accepted = 0
            reject = False
            unique = False

            if number == 0:
                # it is an empty object
                if key in inventory:
                    # already has this object
                    continue

                object_record = None
                try:
                    common_model_name = TYPECLASS("COMMON_OBJECT").model_name
                    common_model_obj = apps.get_model(settings.WORLD_DATA_APP,
                                                      common_model_name)
                    object_record = common_model_obj.objects.get(key=key)
                except Exception as e:
                    pass

                if not object_record:
                    # can not find object's data record
                    continue

                if object_record.can_remove:
                    # remove this empty object
                    continue

                # create a new content
                new_obj = build_object(key, level=level)
                if not new_obj:
                    reject = _("Can not get %s.") % key
                else:
                    name = new_obj.get_name()
                    icon = new_obj.icon

                # move the new object to the character
                if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                    new_obj.delete()
                    reject = _("Can not get %s.") % name
            else:
                # common number
                # if already has this kind of object
                if key in inventory:
                    # add to current object
                    name = inventory[key].name
                    icon = inventory[key].icon
                    unique = inventory[key].unique

                    add = number
                    if add > inventory[key].max_stack - inventory[
                            key].db.number:
                        add = inventory[key].max_stack - inventory[
                            key].db.number

                    if add > 0:
                        # increase stack number
                        inventory[key].increase_num(add)
                        number -= add
                        accepted += add

                # if does not have this kind of object, or stack is full
                while number > 0:
                    if unique:
                        # can not have more than one unique objects
                        reject = _("Can not get more %s.") % name
                        break

                    # create a new content
                    new_obj = build_object(key, level=level)
                    if not new_obj:
                        reject = _("Can not get %s.") % name
                        break

                    name = new_obj.get_name()
                    icon = new_obj.icon
                    unique = new_obj.unique

                    # move the new object to the character
                    if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                        new_obj.delete()
                        reject = _("Can not get %s.") % name
                        break

                    # Get the number that actually added.
                    add = number
                    if add > new_obj.max_stack:
                        add = new_obj.max_stack

                    if add <= 0:
                        break

                    new_obj.increase_num(add)
                    number -= add
                    accepted += add

            objects.append({
                "key": key,
                "name": name,
                "icon": icon,
                "number": accepted,
                "reject": reject,
            })

        if not mute:
            # Send results to the player.
            message = {"get_objects": objects}
            self.msg(message)

        self.show_inventory()

        # call quest handler
        for item in objects:
            if not item["reject"]:
                self.quest_handler.at_objective(defines.OBJECTIVE_OBJECT,
                                                item["key"], item["number"])

        return objects
Example #28
0
    def receive_objects(self, obj_list, mute=False, combat=False):
        """
        Add objects to the inventory.

        Args:
            obj_list: (list) a list of object keys and there numbers.
                             list item: {"object": object's key
                                         "number": object's number}
            mute: (boolean) do not send messages to the owner
            combat: (boolean) get objects in combat.

        Returns:
            (dict) a list of objects that not have been received and their reasons.
        """
        accepted_keys = {}      # the keys of objects that have been accepted
        accepted_names = {}     # the names of objects that have been accepted
        rejected_keys = {}      # the keys of objects that have been rejected
        reject_reason = {}      # the reasons of why objects have been rejected

        # check what the character has now
        inventory = {}
        for item in self.contents:
            key = item.get_data_key()
            if key in inventory:
                # if the character has more than one item of the same kind,
                # get the smallest stack.
                if inventory[key].db.number > item.db.number:
                    inventory[key] = item
            else:
                inventory[key] = item

        for obj in obj_list:
            key = obj["object"]
            available = obj["number"]
            number = available
            accepted = 0
            name = ""
            unique = False

            if number == 0:
                # it is an empty object
                if key in inventory:
                    # already has this object
                    accepted_keys[key] = 0
                    accepted_names[name] = 0
                    continue

                object_record = get_object_record(key)
                if not object_record:
                    # can not find object's data record
                    reason = _("Can not get %s.") % name
                    rejected_keys[key] = 0
                    reject_reason[name] = reason
                    continue

                if object_record.can_remove:
                    # remove this empty object
                    accepted_keys[key] = 0
                    accepted_names[name] = 0
                    continue

                # create a new content
                new_obj = build_object(key)
                if not new_obj:
                    reason = _("Can not get %s.") % name
                    rejected_keys[key] = 0
                    reject_reason[name] = reason
                    continue

                name = new_obj.get_name()

                # move the new object to the character
                if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                    new_obj.delete()
                    reason = _("Can not get %s.") % name
                    rejected_keys[key] = 0
                    reject_reason[name] = reason
                    break

                # accept this object
                accepted_keys[key] = 0
                accepted_names[name] = 0

            else:
                # common number
                # if already has this kind of object
                if key in inventory:
                    # add to current object
                    name = inventory[key].name
                    unique = inventory[key].unique

                    add = number
                    if add > inventory[key].max_stack - inventory[key].db.number:
                        add = inventory[key].max_stack - inventory[key].db.number

                    if add > 0:
                        # increase stack number
                        inventory[key].increase_num(add)
                        number -= add
                        accepted += add

                # if does not have this kind of object, or stack is full
                reason = ""
                while number > 0:
                    if unique:
                        # can not have more than one unique objects
                        reason = _("Can not get more %s.") % name
                        break

                    # create a new content
                    new_obj = build_object(key)
                    if not new_obj:
                        reason = _("Can not get %s.") % name
                        break

                    name = new_obj.get_name()
                    unique = new_obj.unique

                    # move the new object to the character
                    if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                        new_obj.delete()
                        reason = _("Can not get %s.") % name
                        break

                    # Get the number that actually added.
                    add = number
                    if add > new_obj.max_stack:
                        add = new_obj.max_stack

                    if add <= 0:
                        break

                    new_obj.increase_num(add)
                    number -= add
                    accepted += add

                if accepted > 0:
                    accepted_keys[key] = accepted
                    accepted_names[name] = accepted

                if accepted < available:
                    rejected_keys[key] = available - accepted
                    reject_reason[name] = reason

        if not mute:
            # Send results to the player.
            message = {"get_objects":
                            {"accepted": accepted_names,
                             "rejected": reject_reason,
                             "combat": combat}}
            self.msg(message)
            self.show_inventory()

            # call quest handler
            for key in accepted_keys:
                self.quest_handler.at_objective(defines.OBJECTIVE_OBJECT, key, accepted_keys[key])

        return rejected_keys
Example #29
0
    def receive_objects(self, obj_list):
        """
        Add objects to the inventory.
        obj_list: (list) a list of object keys and there numbers.
                         list item: {"object": object's key
                                     "number": object's number}
        """
        accepted_keys = {}      # the keys of objects that have been accepted
        accepted_names = {}     # the names of objects that have been accepted
        rejected_keys = {}      # the keys of objects that have been rejected
        reject_reason = {}      # the reasons of why objects have been rejected

        # check what the character has now
        inventory = {}
        for item in self.contents:
            key = item.get_data_key()
            if key in inventory:
                # if the character has more than one item of the same kind,
                # get the smallest stack.
                if inventory[key].db.number > item.db.number:
                    inventory[key] = item
            else:
                inventory[key] = item

        for obj in obj_list:
            key = obj["object"]
            available = obj["number"]
            number = available
            accepted = 0
            name = ""
            unique = False

            # if already has this kind of object
            if key in inventory:
                # add to current object
                name = inventory[key].name
                unique = inventory[key].unique

                add = number
                if add > inventory[key].max_stack - inventory[key].db.number:
                    add = inventory[key].max_stack - inventory[key].db.number

                if add > 0:
                    # increase stack number
                    inventory[key].increase_num(add)
                    number -= add
                    accepted += add

            # if does not have this kind of object, or stack is full
            reason = ""
            while number > 0:
                if unique:
                    # can not have more than one unique objects
                    reason = LS("Can not get more %s.") % name
                    break
                        
                # create a new content
                new_obj = build_object(key)
                if not new_obj:
                    reason = LS("Can not get %s.") % name
                    break

                name = new_obj.get_name()
                unique = new_obj.unique

                # move the new object to the character
                if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                    new_obj.delete()
                    reason = LS("Can not get %s.") % name
                    break

                # Get the number that actually added.
                add = number
                if add > new_obj.max_stack:
                    add = new_obj.max_stack
                    
                if add <= 0:
                    break

                new_obj.increase_num(add)
                number -= add
                accepted += add

            if accepted > 0:
                accepted_keys[key] = accepted
                accepted_names[name] = accepted

            if accepted < available:
                rejected_keys[key] = available - accepted
                reject_reason[name] = reason

        # Send results to the player.
        message = {"get_object":
                        {"accepted": accepted_names,
                         "rejected": reject_reason}}
        self.msg(message)
        self.show_inventory()

        # call quest handler
        for key in accepted_keys:
            self.quest_handler.at_objective(defines.OBJECTIVE_OBJECT, key, accepted_keys[key])

        return rejected_keys
Example #30
0
    def receive_objects(self, obj_list):
        """
        Receive objects.
        obj_list: (dict) a list of object keys and there numbers.
        """
        accepted_keys = {}
        accepted_names = {}
        rejected_keys = {}
        rejected_names = {}

        # check what the character has now
        inventory = {}
        for item in self.contents:
            key = item.get_info_key()
            if key in inventory:
                # if the character has more than one item of the same kind,
                # get the smallest stack.
                if inventory[key].db.number > item.db.number:
                    inventory[key] = item
            else:
                inventory[key] = item

        for key in obj_list:
            number = obj_list[key]
            accepted = 0
            name = ""
            unique = False

            # if already has this kind of object
            if key in inventory:
                # add to current object
                name = inventory[key].name
                unique = inventory[key].unique

                add = number
                if add > inventory[key].max_stack - inventory[key].db.number:
                    add = inventory[key].max_stack - inventory[key].db.number

                if add > 0:
                    # increase stack number
                    inventory[key].increase_num(add)
                    number -= add
                    accepted += add

            # if does not have this kind of object, or stack is full
            while number > 0:
                if unique:
                    # can not have more than one unique objects
                    break
                        
                # create a new content
                new_obj = build_object(key)
                if not new_obj:
                    break

                name = new_obj.name
                unique = new_obj.unique

                # move the new object to the character
                if not new_obj.move_to(self, quiet=True, emit_to_obj=self):
                    new_obj.delete()
                    break

                add = number
                if add > new_obj.max_stack:
                    add = new_obj.max_stack
                    
                if add <= 0:
                    break

                new_obj.increase_num(add)
                number -= add
                accepted += add

            if accepted > 0:
                accepted_keys[key] = accepted
                accepted_names[name] = accepted

            if accepted < obj_list[key]:
                rejected_keys[key] = obj_list[key] - accepted
                rejected_names[name] = obj_list[key] - accepted

        message = {"get_object":
                        {"accepted": accepted_names,
                         "rejected": rejected_names}}
        self.msg(message)
        self.show_inventory()

        return rejected_keys
Example #31
0
        # load goods object
        goods = self.db.goods
        if goods:
            if goods.get_data_key() == self.goods_key:
                # Load data.
                try:
                    # Load db data.
                    goods.load_data()
                except Exception, e:
                    logger.log_errmsg("%s(%s) can not load data:%s" %
                                      (self.goods_key, self.dbref, e))
            else:
                goods.set_data_key(self.goods_key, self.goods_level)
        else:
            goods = build_object(self.goods_key)
            if goods:
                self.db.goods = goods
            else:
                logger.log_err("Can not create goods %s." % self.goods_key)
                return

        self.name = goods.get_name()
        self.desc = goods.db.desc
        self.icon = getattr(goods, "icon", None)

        self.available = True

    def sell_to(self, caller):
        """
        Buy this goods.
Example #32
0
        self.unit_name = unit_record.name

        # load goods object
        goods = self.db.goods
        if goods:
            if goods.get_data_key() == self.goods_key:
                # Load data.
                try:
                    # Load db data.
                    goods.load_data()
                except Exception, e:
                    logger.log_errmsg("%s(%s) can not load data:%s" % (self.goods_key, self.dbref, e))
            else:
                goods.set_data_key(self.goods_key)
        else:
            goods = build_object(self.goods_key)
            if goods:
                self.db.goods = goods
            else:
                logger.log_err("Can not create goods %s." % self.goods_key)
                return

        self.name = goods.get_name()
        self.desc = goods.db.desc
        self.icon = getattr(goods, "icon", None)

        self.available = True

    def sell_to(self, caller):
        """
        Buy this goods.