def get_stat_cost( self, # type: Retainer or Agent attr, ): """ Get the cost of a stat based on our current rating and the type of agent we are. """ from .npc_types import primary_stats from world.traits.models import Trait atype = self.agent.type stats = primary_stats.get(atype, []) base = get_stat_cost(self, attr) if attr not in stats: base *= 2 xpcost = base rescost = base if attr in Trait.get_valid_stat_names(Trait.MENTAL): restype = "economic" elif attr in Trait.get_valid_stat_names(Trait.SOCIAL): restype = "social" elif attr in Trait.get_valid_stat_names(Trait.PHYSICAL): restype = "military" else: # special stats restype = "military" return xpcost, rescost, restype
def get_stat_cost( self, # type: Retainer or Agent attr): """ Get the cost of a stat based on our current rating and the type of agent we are. """ atype = self.agent.type stats = primary_stats.get(atype, []) base = get_stat_cost(self, attr) if attr not in stats: base *= 2 xpcost = base rescost = base if attr in MENTAL_STATS: restype = "economic" elif attr in SOCIAL_STATS: restype = "social" elif attr in PHYSICAL_STATS: restype = "military" else: # special stats restype = "military" return xpcost, rescost, restype
def func(self): """ Allows the character to check their xp, and spend it if they use the /spend switch and meet the requirements. """ caller = self.caller dompc = None resource = None set_specialization = False spec_warning = False if self.cmdstring == "learn": self.switches.append("spend") if not self.args: # Just display our xp self.display_traits() return if "transfer" in self.switches: self.transfer_xp() return args = self.args.lower() # get cost already factors in if we have a trainer, so no need to check if args in Trait.get_valid_stat_names(): cost = stats_and_skills.get_stat_cost(caller, args) current = caller.traits.get_stat_value(args) if not caller.traits.check_stat_can_be_raised(args): caller.msg("%s is already at its maximum." % args) return stype = "stat" elif args in Trait.get_valid_skill_names(): current = caller.traits.get_skill_value(args) if current >= 6: caller.msg("%s is already at its maximum." % args) return if (current >= 5 and stats_and_skills.get_skill_cost_increase(caller) <= -1.0): caller.msg( "You cannot buy a legendary skill while you still have catchup xp remaining." ) return cost = stats_and_skills.get_skill_cost(caller, args) stype = "skill" elif args in stats_and_skills.DOM_SKILLS: try: dompc = caller.player.Dominion current = getattr(dompc, args) resource = stats_and_skills.get_dom_resource(args) if current >= 10: caller.msg("%s is already at its maximum." % args) return cost = stats_and_skills.get_dom_cost(caller, args) stype = "dom" except AttributeError: caller.msg("Dominion object not found.") return elif args in Trait.get_valid_ability_names(): # if we don't have it, determine if we can learn it current = caller.traits.get_ability_value(args) if not current: if args in Trait.get_valid_ability_names(Trait.CRAFTING): # check if we have valid skill: if args == "tailor" and "sewing" not in caller.traits.skills: caller.msg("You must have sewing to be a tailor.") return if (args == "weaponsmith" or args == "armorsmith" ) and "smithing" not in caller.traits.skills: caller.msg("You must have smithing to be a %s." % args) return if args == "apothecary" and "alchemy" not in caller.traits.skills: caller.msg( "You must have alchemy to be an apothecary.") return if (args == "leatherworker" and "tanning" not in caller.traits.skills): caller.msg( "You must have tanning to be a leatherworker.") return if (args == "carpenter" and "woodworking" not in caller.traits.skills): caller.msg( "You must have woodworking to be a carpenter.") return if args == "jeweler" and "smithing" not in caller.traits.skills: caller.msg("You must have smithing to be a jeweler.") return spec_warning = True elif not caller.check_permstring(args): caller.msg("You do not have permission to learn %s." % args) return else: spec_warning = False if current >= 6: caller.msg("%s is already at its maximum." % args) return if args in Trait.get_valid_ability_names(Trait.CRAFTING): spec_warning = True if current == 5: if any(key for key, value in caller.traits.abilities.items() if key in Trait.get_valid_ability_names(Trait.CRAFTING) and value >= 6): caller.msg( "You have already chosen a crafting specialization.") return else: set_specialization = True spec_warning = False stype = "ability" cost = stats_and_skills.get_ability_cost(caller, args) else: caller.msg("'%s' wasn't identified as a stat, ability, or skill." % self.args) return if "cost" in self.switches: caller.msg("Cost for %s: %s" % (self.args, cost)) return if "spend" in self.switches: # ap_cost = 5 * (current + 1) # if not self.player.pay_action_points(ap_cost): # self.msg("You do not have enough action points to spend xp on that.") # return if stype == "dom": if cost > getattr(dompc.assets, resource): msg = "Unable to buy influence in %s. The cost is %s, " % ( args, cost, ) msg += "and you have %s %s resources available." % ( getattr(dompc.assets, resource), resource, ) caller.msg(msg) return elif cost > caller.db.xp: caller.msg( "Unable to raise %s. The cost is %s, and you have %s xp." % (args, cost, caller.db.xp)) return if stype == "stat": caller.adjust_xp(-cost) caller.traits.adjust_stat(args) caller.msg("You have increased your %s to %s." % (args, current + 1)) return if stype == "skill": caller.adjust_xp(-cost) caller.traits.adjust_skill(args) skill_history = caller.db.skill_history or {} spent_list = skill_history.get(args, []) spent_list.append(cost) skill_history[args] = spent_list caller.db.skill_history = skill_history caller.msg("You have increased your %s to %s." % (args, current + 1)) if current + 1 == 6: # legendary rating inform_staff("%s has bought a rank 6 of %s." % (caller, args)) return if stype == "ability": if set_specialization: caller.msg("You have set your primary ability to be %s." % args) if spec_warning: caller.msg( "{wNote: The first crafting ability raised to 6 will be your specialization.{n" ) caller.adjust_xp(-cost) caller.traits.adjust_ability(args) ability_history = caller.db.ability_history or {} spent_list = ability_history.get(args, []) spent_list.append(cost) ability_history[args] = spent_list caller.db.ability_history = ability_history caller.msg("You have increased your %s to %s." % (args, current + 1)) return if stype == "dom": # charge them influence setattr(dompc.assets, resource, getattr(dompc.assets, resource) - cost) caller.traits.adjust_dom(args) caller.msg( "You have increased your %s influence for a cost of %s %s resources." % (args, resource, cost)) caller.refresh_from_db() return return # invalid or no switch + arguments caller.msg("Usage: xp/spend <stat, ability or skill>")