BEGIN { arcana_list["x"] = 1; delete arcana_list["x"]; persona_arcana["x"] = 1; delete persona_arcana["x"]; fusion_table["x"] = 1; delete fusion_table["x"]; interest["x"] = 1; delete interest["x"]; } /^a/ { arcana_list[substr($0,2)] = 1; next; } /^p/ { split(substr($0,2),a,"/"); if (! (2 in a)) { printf("Bad persona line: %s\n",$0) > "/dev/stderr"; exit; } persona = a[1]; arcana = a[2]; if (! (arcana in arcana_list)) { printf("Bad persona line (bad arcana %s): %s\n",arcana,$0) > "/dev/stderr"; exit; } if (persona in persona_arcana) { printf("Duplicate persona line: %s\n",$0) > "/dev/stderr"; exit; } persona_arcana[persona] = arcana; next; } /^i/ { s = substr($0,2); if (! (s in persona_arcana)) { printf("Bad interest line (bad persona) %s\n",s) > "/dev/stderr"; exit; } interest[s] = 1; next; } /^f/ { split(substr($0,2),a," -> "); if (! (2 in a)) { printf("Bad fusion line (no ->): %s\n",$0) > "/dev/stderr"; exit; } if (3 in a) { printf("Bad fusion line (multiple ->): %s\n",$0) > "/dev/stderr"; exit; } result = a[2]; if (! (result in persona_arcana) && (result != "-")) { printf("Bad fusion line (bad result): %s\n",$0) > "/dev/stderr"; exit; } split(a[1],e," [+] "); if (! (2 in e)) { printf("Bad fusion line (<2 parts): %s\n",$0) > "/dev/stderr"; exit; } if (4 in e) { printf("Bad fusion line (>3 parts): %s\n",$0) > "/dev/stderr"; exit; } for (px in e) { p = e[px]; if (! (p in persona_arcana)) { printf("Bad fusion line (bad part %s): %s\n",p,$0) > "/dev/stderr"; exit; } if (! (p in interest)) next; } 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",$0) > "/dev/stderr"; exit; } fusion_table[c] = result; next; } { printf("Unclassifiable line: %s\n",$0) > "/dev/stderr"; exit; } END { for (c in fusion_table) printf("%s -> %s (%s)\n",c,fusion_table[c],persona_arcana[fusion_table[c]]); }