def main():
    """Main game function."""
    try:
        data = load_data()
        data = update.update(data)
    except:
        # print(sys.exc_info())
        data_constructor.build_data()
        data = load_data()
    data["want_to_play"] = True
    data["start"] = time.time()
    actions = {"quit": quit,
               "look": check_status,
               "shop": buy_menu.menu,
               "yard": placement.menu,
               "collect money": collect_money,
               "check food": placement.check_food,
               "help": print_help}
    banner()
    data["prefix"] = "{.BLUE}[Welcome!]{.ENDC}".format(
        printer.PColors, printer.PColors)
    check_status(data)
    data["prefix"] = "[Main Menu]"
    while data["want_to_play"] is True:
        data["prefix"] = "{.MAIN}[Main Menu]{.ENDC}".format(
            printer.PColors, printer.PColors)
        printer.prompt(data["prefix"], actions.keys())
        inp = input("{0} Choose an action! ".format(data["prefix"]))
        # pdb.set_trace()
        if inp in actions:
            actions[inp](data)
            continue
        else:
            printer.invalid(data["prefix"])
def menu(data):
    """Display item shop menu."""
    data["prefix"] = "[Item Shop]"
    printer.shop(
        data["prefix"], "you have {0} silver fish and {1} gold fish to spend"
        .format(data["s_fish"], data["g_fish"]))
    list_items(data)
    data["want_to_buy"] = True
    actions = {"buy": buy_item,
               "examine": ex_item,
               "check wallet": wallet,
               "list items": list_items,
               "leave shop": exit_buy}
    while data["want_to_buy"]:
        printer.prompt("{.SHOP}{}{.ENDC}".format(
            printer.PColors, data["prefix"], printer.PColors), actions.keys())
        inp = input("{.SHOP}{}{.ENDC} What do you want to do? ".format(
            printer.PColors, data["prefix"], printer.PColors))
        if inp in actions:
            actions[inp](data)
            continue
        else:
            printer.invalid(data["prefix"])
def menu(data):
    """Display yard menu."""
    data["prefix"] = "[The Yard]".format(printer.PColors, printer.PColors)
    # printer.p(data["prefix"], "You have {0} spaces open in your yard"
    # .format(compute_space(data)))
    list_yard_items(data)
    data["placing"] = True
    actions = {"list owned items": list_owned_items,
               "examine yard": list_yard_items,
               "cats": cats,
               "place toy": place,
               "place food": food,
               "leave yard": exit}
    while data["placing"]:
        # FIXME: with printer.prompt here and printer.invalid on unknown
        #        input, the options are doubled up after an unknown input
        printer.prompt(data["prefix"], actions.keys())
        inp = input("{.YARD}{}{.ENDC} What do you want to do? ".format(
            printer.PColors, data["prefix"], printer.PColors))
        if inp in actions:
            actions[inp](data)
            continue
        else:
            printer.invalid(data["prefix"])