import {Character} from "./CharacterStatus"; interface CharacterPrivacySettings { readonly showCharacter: boolean readonly showHp: boolean readonly showHealth: boolean readonly showMp: boolean readonly showIp: boolean readonly showSp: boolean readonly showName: boolean readonly showPortrait: boolean readonly showTurns: boolean readonly showStatuses: boolean readonly showLevel: boolean } enum CharacterPrivacy { Friend = "friend", ScannedEnemy = "scanned enemy", LightlyScannedEnemy = "lightly scanned enemy", UnscannedEnemy = "unscanned enemy", SecretiveEnemy = "secretive", Hidden = "hidden", } const CharacterPrivacySettings: Record = { [CharacterPrivacy.Friend]: { showCharacter: true, showHp: true, showHealth: true, showMp: true, showIp: true, showSp: true, showName: true, showPortrait: true, showTurns: true, showStatuses: true, showLevel: true, }, [CharacterPrivacy.ScannedEnemy]: { showCharacter: true, showHp: true, showHealth: true, showMp: true, showIp: false, showSp: true, showName: true, showPortrait: true, showTurns: true, showStatuses: true, showLevel: true, }, [CharacterPrivacy.LightlyScannedEnemy]: { showCharacter: true, showHp: true, showHealth: true, showMp: false, showIp: false, showSp: true, showName: true, showPortrait: true, showTurns: true, showStatuses: true, showLevel: true, }, [CharacterPrivacy.UnscannedEnemy]: { showCharacter: true, showHp: false, showHealth: true, showMp: false, showIp: false, showSp: true, showName: true, showPortrait: true, showTurns: true, showStatuses: true, showLevel: false, }, [CharacterPrivacy.SecretiveEnemy]: { showCharacter: true, showHp: false, showHealth: true, showMp: false, showIp: false, showSp: false, showName: false, showPortrait: true, showTurns: true, showStatuses: true, showLevel: false, }, [CharacterPrivacy.Hidden]: { showCharacter: false, showHp: false, showHealth: false, showMp: false, showIp: false, showSp: false, showName: false, showPortrait: false, showTurns: false, showStatuses: false, showLevel: false, } } function applyPrivacy(c: EditableCharacter): Character|null { const p = CharacterPrivacySettings[c.privacy ?? CharacterPrivacy.Hidden] if (!p.showCharacter) { return null } const out: {-readonly [Field in keyof EditableCharacter]?: EditableCharacter[Field]} = Object.assign({}, c) delete out.privacy if (!p.showHp) { delete out.hp delete out.maxHp if (!p.showHealth) { delete out.health } } if (!p.showMp) { delete out.mp delete out.maxMp } if (!p.showIp) { delete out.ip delete out.maxIp } if (!p.showSp) { delete out.sp delete out.spType } if (!p.showName) { delete out.name } if (!p.showPortrait) { delete out.portraitUrl } if (!p.showTurns) { delete out.turnsLeft delete out.turnsTotal delete out.canAct } if (!p.showStatuses) { delete out.statuses } if (!p.showLevel) { delete out.level } return out } interface EditableCharacter extends Character { privacy: CharacterPrivacy }