protected List<List<String>> loadRecipes() {
    String filename = parametersFile();
    List<List<String>> recipes =
        (List<List<String>>) Resources.getResource("PARSED_RECIPE: " + filename);
    if (recipes == null) {
      StringBuffer str =
          new CMFile(Resources.buildResourcePath("skills") + filename, null, true).text();
      recipes = loadList(str);
      if (recipes.size() == 0) Log.errOut("LeatherWorking", "Recipes not found!");
      else {
        List<List<String>> pleaseAdd = new Vector();
        for (int r = 0; r < recipes.size(); r++) {
          List<String> V = recipes.get(r);
          if (V.size() > 0) {
            String name = (String) V.get(RCP_FINALNAME);
            int baseLevel = CMath.s_int((String) V.get(RCP_LEVEL)) + 2;

            List<String> V1 = new XVector<String>(V);
            V1.set(RCP_FINALNAME, "Cuirbouli " + name);
            V1.set(RCP_LEVEL, "" + (baseLevel + 37));
            pleaseAdd.add(V1);

            V1 = new XVector<String>(V);
            V1.set(RCP_FINALNAME, "Reinforced " + name);
            V1.set(RCP_LEVEL, "" + (baseLevel + 45));
            pleaseAdd.add(V1);

            V1 = new XVector<String>(V);
            V1.set(RCP_FINALNAME, "Masterwork " + name);
            V1.set(RCP_LEVEL, "" + (baseLevel + 54));
            pleaseAdd.add(V1);

            V1 = new XVector<String>(V);
            V1.set(RCP_FINALNAME, "Laminar " + name);
            V1.set(RCP_LEVEL, "" + (baseLevel + 63));
            pleaseAdd.add(V1);

            V1 = new XVector<String>(V);
            V1.set(RCP_FINALNAME, "Battlemoulded " + name);
            V1.set(RCP_LEVEL, "" + (baseLevel + 72));
            pleaseAdd.add(V1);

            V.set(RCP_FINALNAME, "Designer " + name);
            V.set(RCP_LEVEL, "" + (baseLevel + 30));
          }
        }
        for (int i = 0; i < pleaseAdd.size(); i++) recipes.add(pleaseAdd.get(i));
      }
      Resources.submitResource("PARSED_RECIPE: " + filename, recipes);
    }
    return recipes;
  }