BEGIN { arcana_table["x"] = "x"; delete arcana_table["x"]; persona_arcana["x"] = "x"; delete persona_arcana["x"]; fusion_table["x"] = "x"; delete fusion_table["x"]; } /^a/ { arcana = substr($0,2); if (arcana in arcana_table) { printf("Bad arcana line (duplicate): %s\n",substr($0,2)); exit; } arcana_table[arcana] = 1; next; } /^p/ { line = substr($0,2); split(line,a,"/"); if (! (2 in a)) { printf("Bad persona line (no arcana): %s\n",line); exit; } persona = a[1]; arcana = a[2]; if (persona in persona_arcana) { printf("Bad persona line (duplicate persona %s): %s\n",persona,line); exit; } if (! (arcana in arcana_table)) { printf("Bad persona line (bad arcana %s): %s\n",arcana,line); exit; } persona_arcana[persona] = arcana; next; } /^f/ { line = substr($0,2) split(line,a," -> "); if (! (2 in a)) { printf("Bad fusion line (no ->): %s\n",line); exit; } if (3 in a) { printf("Bad fusion line (multiple ->): %s\n",line); exit; } result = a[2]; if (! (result in persona_arcana) && (result != "-")) { printf("Bad fusion line (bad result): %s\n",line); exit; } split(a[1],e," [+] "); if (! (2 in e)) { printf("Bad fusion line (<2 parts): %s\n",line); exit; } if (4 in e) { printf("Bad fusion line (>3 parts): %s\n",line); exit; } for (px in e) { p = e[px]; if (! (p in persona_arcana)) { printf("Bad fusion line (bad part %s): %s\n",p,line); exit; } } if (3 in e) { c1 = e[1]; c2 = e[2]; c3 = e[3]; if (c1 > c2) { t = c2; c2 = c1; c1 = t; } if (c2 > c3) { t = c3; c3 = c2; c2 = t; } if (c1 > c2) { t = c2; c2 = c1; c1 = t; } c = c1 " + " c2 " + " c3; } else { c1 = e[1]; c2 = e[2]; if (c1 > c2) { t = c2; c2 = c1; c1 = t; } c = c1 " + " c2; } if (c in fusion_table) { printf("Bad fusion line (duplicate parts list): %s\n",line); exit; } fusion_table[c] = result; next; } { printf("Unclassifiable line: %s\n",$0); exit; }