Advertisement
CaptainLepidus

arcgen.py

Mar 10th, 2012
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.79 KB | None | 0 0
  1. '''
  2. Created on Mar 9, 2012
  3.  
  4. @author: Jeremiah
  5. '''
  6. import jinja2
  7. import random
  8. import re
  9. env = jinja2.Environment(loader = jinja2.PackageLoader('arcgen', 'arcor'))
  10. def type_to_id(t):
  11.     if t == "weapon":
  12.         return 0
  13.     elif t == "armor_head":
  14.         return 1#Check this
  15.     elif t == "armor_body":
  16.         return 2
  17.     elif t == "armor_leg":
  18.         return 3
  19.     elif t == "item_potion":
  20.         return 4
  21.     elif t == "item_misc":
  22.         return 5
  23. def render(templ):
  24.     return templ.render(component = component, choose_one = choose_one, select = random.choice, extract_tier = extract_tier, type_to_id = type_to_id)
  25. def extract_tier(s):
  26.     if "[tier:" not in s:
  27.         return "", s
  28.     tierregex = r"\[tier\:.*?\]"
  29.     tier = re.findall(tierregex, s)[0]
  30.     withouttier = re.sub(tierregex, "", s)
  31.     tier = component("tiers/"+tier[len("[tier:"): -len("]")])
  32.     namesregex = r"<.*?>"
  33.     tiernames = re.findall(namesregex, tier)[0]
  34.     mods = tier.replace(tiernames, "")
  35.     tiernames = tiernames[1:-1]
  36.     tiernames = [i.strip() for i in tiernames.split(",")]
  37.     tier = random.choice(tiernames)+mods
  38.     return tier, withouttier
  39. def choose_one(s):
  40.     s = s.split("\n")
  41.     while "" in s:
  42.         s.remove("")
  43.     return random.choice(s)
  44. def component(name):
  45.     templ = env.get_template(name)
  46.     return choose_one(render(templ))
  47. def parse_instruction(i, target):
  48.     opers = ["=", "+", "-", "*", "/"]
  49.     oper = None
  50.     for e in opers:
  51.         if e in i:
  52.             stat, oper, val = i.partition(e)
  53.             break
  54.     try:
  55.         if val[-1] == "%":
  56.             val = target[stat]/100.0 * int(val[:-1])
  57.         if stat == "e":
  58.             v = val
  59.         else:
  60.             v = int(val)
  61.         if oper == "=":
  62.             target[stat] = v
  63.         elif oper == "+":
  64.             target[stat] += int(val)
  65.         elif oper == "-":
  66.             target[stat] -= int(val)
  67.         elif oper == "*":
  68.             target[stat] *= int(val)
  69.         elif oper == "/":
  70.             target[stat] /= int(val)
  71.     except KeyError:#Should not happen; indcates incorrect definitions.
  72.         target[stat] = 1
  73.         parse_instruction(i, target)
  74.     return
  75. def build_stats(s):
  76.     d = {}
  77.     for i in s:
  78.         parse_instruction(i, d)
  79.     g = {}
  80.     g["stat"] = d.get("s") if d.get("s") != None else 0
  81.     g["specialstat"] = d.get("cs") if d.get("cs") != None else 0
  82.     g["sellprice"] = d.get("v") if d.get("v") != None else 0
  83.     g["special"] = d.get("c") if d.get("c") != None else 0
  84.     g["desc"] = d.get("e") if d.get("e") != None else ""
  85.     return g
  86. def reformat(item):
  87.     itype, _, item = item.partition("|/|")
  88.     itype = int(itype)
  89.     modifiers = re.findall("\\{.*?\\}",item)
  90.     item = re.sub("\\{.*?\\}", "", item)
  91.     item = re.sub("\s+", " ", item)
  92.     init_val = []
  93.     val_mod = []
  94.     perc_mod = []
  95.     for i in modifiers:
  96.         i = i[1:-1]
  97.         if "=" in i:
  98.             init_val.append(i)
  99.         if "+" in i or "-" in i:
  100.             if "%" in i:
  101.                 perc_mod.append(i)
  102.             else:
  103.                 val_mod.append(i)
  104.  
  105.     modifiers = []
  106.     modifiers.extend(init_val)
  107.     modifiers.extend(val_mod)
  108.     modifiers.extend(perc_mod)
  109.     stats = build_stats(modifiers)
  110.     return item, stats, itype
  111. def get_item():
  112.     item_basic = component("item")
  113.     item_name, item_modifiers, itype = reformat(item_basic)
  114.     return env.get_template("entry").render(name = item_name, stats = item_modifiers, type = itype)
  115. def get_items(number):
  116.     return [get_item() for _ in range(number)]
  117.  
  118. if __name__ == "__main__":
  119.     print("FISK")
  120.     g = get_items(int(raw_input("How many items?")))
  121.     test = open("items.txt", "wt")
  122.     for i in g:
  123.         test.write(i.replace("\n\n", "\n").strip())
  124.         test.write("\n")
  125.     test.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement