import 'reflect-metadata';
import Disk from './disk.js';
import DeviceRef from './mame/deviceRef.js';
import Release from './release.js';
import ROM from './rom.js';
declare const GameType: {
    readonly AFTERMARKET: "Aftermarket";
    readonly ALPHA: "Alpha";
    readonly BAD: "Bad";
    readonly BETA: "Beta";
    readonly BIOS: "BIOS";
    readonly CRACKED: "Cracked";
    readonly DEBUG: "Debug";
    readonly DEMO: "Demo";
    readonly DEVICE: "Device";
    readonly FIXED: "Fixed";
    readonly HACKED: "Hacked";
    readonly HOMEBREW: "Homebrew";
    readonly OVERDUMP: "Overdump";
    readonly PENDING_DUMP: "Pending Dump";
    readonly PIRATED: "Pirated";
    readonly PROGRAM: "Program";
    readonly PROTOTYPE: "Prototype";
    readonly RETAIL: "Retail";
    readonly SAMPLE: "Sample";
    readonly TRAINED: "Trained";
    readonly TRANSLATED: "Translated";
    readonly UNLICENSED: "Unlicensed";
};
type GameTypeValue = (typeof GameType)[keyof typeof GameType];
/**
 * "There are two 'semi-optional' fields that can be included for each game;
 * 'year' and 'manufacturer'. However, CMPro displays the manufacturer in the
 * scanner window so it isn't really optional! For the sake of completeness I
 * would recommend you include year and manufacturer."
 *
 * "There are two fields that relate to the merging of ROMs; 'cloneof' and
 * 'romof'. In MAME the 'cloneof' field represents a notional link between
 * the two games and the 'romof' field represents that the ROMs themselves
 * can be shared. CMPro actually ignores the 'romof' field and uses the
 * 'cloneof' value to determine how the ROMs can be shared. However, you should
 * use the MAME meanings of 'cloneof and 'romof' both for the sake of clarity
 * and to allow faultless conversions between CMPro and RomCenter formats.
 * If you don't use these fields correctly then you cannot guarantee that your
 * data file will work as expected in CMPro and RomCenter for all three merge
 * types."
 * @see http://www.logiqx.com/DatFAQs/CMPro.php
 */
export interface GameProps {
    readonly name?: string;
    readonly isBios?: 'yes' | 'no';
    readonly cloneOf?: string;
    readonly romOf?: string;
    readonly release?: Release | Release[];
    readonly roms?: ROM | ROM[];
    readonly disks?: Disk | Disk[];
    readonly categories?: string | string[];
    readonly description?: string;
    readonly id?: string;
    readonly cloneOfId?: string;
    readonly isDevice?: 'yes' | 'no';
    readonly manufacturer?: string;
    readonly deviceRef?: DeviceRef | DeviceRef[];
    readonly genre?: string;
}
/**
 * A logical "game" that contains zero or more {@link ROM}s, and has zero or more region
 * {@link Release}s.
 */
export default class Game implements GameProps {
    readonly name: string;
    readonly isBios: 'yes' | 'no';
    readonly cloneOf?: string;
    readonly romOf?: string;
    readonly release: Release | Release[];
    readonly roms: ROM | ROM[];
    readonly disks: Disk | Disk[];
    readonly categories: string | string[];
    readonly description?: string;
    readonly id?: string;
    readonly cloneOfId?: string;
    readonly isDevice: 'yes' | 'no';
    readonly manufacturer?: string;
    readonly deviceRef: DeviceRef | DeviceRef[];
    readonly genre?: string;
    constructor(props?: GameProps);
    /**
     * Create an XML object, to be used by the owning {@link DAT}.
     */
    toXmlDatObj(parentNames: Set<string>): object;
    getName(): string;
    getCategories(): string[];
    /**
     * Is this game a collection of BIOS file(s).
     */
    getIsBios(): boolean;
    /**
     * Is this game a MAME "device"?
     */
    getIsDevice(): boolean;
    getDeviceRefs(): DeviceRef[];
    getGenre(): string | undefined;
    private getReleases;
    getRoms(): ROM[];
    getDisks(): Disk[];
    getCloneOf(): string | undefined;
    getRomOf(): string | undefined;
    getId(): string | undefined;
    getCloneOfId(): string | undefined;
    getRevision(): number;
    /**
     * Is this game aftermarket (released after the last known console release)?
     */
    isAftermarket(): boolean;
    /**
     * Is this game an alpha pre-release?
     */
    isAlpha(): boolean;
    /**
     * Is this game an alternate release?
     */
    isAlternate(): boolean;
    /**
     * Is this game a "bad" dump?
     */
    isBad(): boolean;
    /**
     * Is this game a beta pre-release?
     */
    isBeta(): boolean;
    /**
     * Is this game an unlicensed bootleg?
     */
    isBootleg(): boolean;
    /**
     * Is this game a "cracked" release (has copy protection removed)?
     */
    isCracked(): boolean;
    /**
     * Does this game contain debug symbols?
     */
    isDebug(): boolean;
    static readonly DEMO_REGEX: RegExp;
    /**
     * Is this game a demo?
     */
    isDemo(): boolean;
    /**
     * Is this game an enhancement chip? Primarily for SNES
     */
    isEnhancementChip(): boolean;
    /**
     * Is this game "fixed" (altered to run better in emulation)?
     */
    isFixed(): boolean;
    /**
     * Is this game community homebrew?
     */
    isHomebrew(): boolean;
    /**
     * Is this game MIA (has not been dumped yet)?
     *
     * NOTE(cemmer): RomVault indicates that some DATs include <rom mia="yes"/>, but I did not find
     * any evidence of this in No-Intro, Redump, TOSEC, and FinalBurn Neo.
     * https://wiki.romvault.com/doku.php?id=mia_rom_tracking#can_i_manually_flag_roms_as_mia
     */
    isMIA(): boolean;
    /**
     * Is this game an overdump (contains excess data)?
     */
    isOverdump(): boolean;
    /**
     * Is this game a pending dump (works, but isn't a proper dump)?
     */
    isPendingDump(): boolean;
    /**
     * Is this game pirated (probably has copyright information removed)?
     */
    isPirated(): boolean;
    /**
     * Is this game a "program" application?
     */
    isProgram(): boolean;
    /**
     * Is this game a prototype?
     */
    isPrototype(): boolean;
    /**
     * Is this game a sample?
     */
    isSample(): boolean;
    /**
     * Is this game translated by the community?
     */
    isTranslated(): boolean;
    /**
     * Is this game unlicensed (but was still physically produced and sold)?
     */
    isUnlicensed(): boolean;
    /**
     * Is this game an explicitly verified dump?
     */
    isVerified(): boolean;
    /**
     * Was this game altered to work on a Bung cartridge?
     * @see https://en.wikipedia.org/wiki/Bung_Enterprises
     */
    hasBungFix(): boolean;
    /**
     * Does this game have a hack?
     */
    hasHack(): boolean;
    /**
     * Does this game have a trainer?
     */
    hasTrainer(): boolean;
    /**
     * Is this game "retail"?
     */
    isRetail(): boolean;
    getGameType(): GameTypeValue;
    /**
     * Is this game a parent (is not a clone)?
     */
    isParent(): boolean;
    /**
     * Is this game a clone?
     */
    isClone(): boolean;
    getRegions(): string[];
    getLanguages(): string[];
    private getTwoLetterLanguagesFromName;
    private getThreeLetterLanguagesFromName;
    private getLanguagesFromRegions;
    /**
     * Return a new copy of this {@link Game} with some different properties.
     */
    withProps(props: GameProps): Game;
    /**
     * A string hash code to uniquely identify this {@link Game}.
     */
    hashCode(): string;
    /**
     * Is this {@link Game} equal to another {@link Game}?
     */
    equals(other: Game): boolean;
}
export {};
