36 lines
938 B
TypeScript
36 lines
938 B
TypeScript
import globalJSON from '../../../../global/affinity.json';
|
|
|
|
/**
|
|
* Precomputed character pair and trio affinity.
|
|
*/
|
|
export interface Affinity {
|
|
/**
|
|
* First character in the relation.
|
|
*/
|
|
chara_a: number;
|
|
/**
|
|
* Second character in the relation.
|
|
* chara_a < chara_b is an invariant.
|
|
*/
|
|
chara_b: number;
|
|
/**
|
|
* Third character in the relation, if it is a trio relation.
|
|
* If defined, chara_b < chara_c is an invariant.
|
|
*/
|
|
chara_c?: number;
|
|
/**
|
|
* Total base compatibility between characters in the relation.
|
|
*/
|
|
affinity: number;
|
|
}
|
|
|
|
export const affinity = {
|
|
global: globalJSON as Affinity[],
|
|
} as const;
|
|
|
|
export function lookup(aff: Affinity[], chara_a: number, chara_b: number, chara_c?: number): number {
|
|
const [a, b, c] = [chara_a, chara_b, chara_c ?? Infinity].sort((a, b) => a - b);
|
|
const r = aff.find((v) => v.chara_a === a && v.chara_b === b && (v.chara_c ?? Infinity) === c);
|
|
return r?.affinity ?? 0;
|
|
}
|