BEGIN { arcana_list["x"] = "x"; delete arcana_list["x"]; persona_arcana["x"] = "x"; delete persona_arcana["x"]; fusion_table["x"] = "x"; delete fusion_table["x"]; n_interest = 0; interest[1] = 0; delete interest[1]; err = 0; } /^a/ { arcana = substr($0,2); if (arcana in arcana_list) { printf("Bad arcana line (duplicate): %s\n",$0); exit; } arcana_list[substr($0,2)] = 1; next; } /^p/ { split(substr($0,2),a,"/"); if (! (2 in a)) { printf("Bad persona line (no /): %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("Bad persona line (duplicate persona %s): %s\n",persona,$0) > "/dev/stderr"; exit; } persona_arcana[persona] = arcana; 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 (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; } /^i/ { s = substr($0,2); if (! (s in persona_arcana)) { printf("Bad interest line (bad persona) %s\n",s) > "/dev/stderr"; exit; } interest[n_interest++] = s; next; } { printf("Unclassifiable line: %s\n",$0) > "/dev/stderr"; exit; } END { for (i=n_interest-1;i>=0;i--) { ci = interest[i]; for (j=i-1;j>=0;j--) { cj = interest[j]; if (ci < cj) { c1 = ci; c2 = cj; } else { c1 = cj; c2 = ci; } if (! ((c1 " + " c2) in fusion_table)) { printf("%s + %s -> ?\n",ci,cj); } } } for (i=n_interest-1;i>=0;i--) { ci = interest[i]; for (j=i-1;j>=0;j--) { cj = interest[j]; for (k=j-1;k>=0;k--) { ck = interest[k]; if (ci < cj) { c1 = ci; c2 = cj; } else { c1 = cj; c2 = ci; } if (c2 < ck) { c3 = ck; } else { c3 = c2; c2 = ck; } if (c1 > c2) { t = c2; c2 = c1; c1 = t; } if (! ((c1 " + " c2 " + " c3) in fusion_table)) { printf("%s + %s + %s -> ?\n",ci,cj,ck); } } } } }