import { Event, EventBase } from './event';
import { Player, Players } from './player';
import { Effect, Effects } from './effect';
import { Field } from './field';
import { HandlerParam, HandlerParamWithPlayer, HandlerParamWithEffect, HandlerProducer, KeyedHandlerProducers, EventAction, EventActions } from './handler';
export interface Package<P extends Player, E extends Effect, F extends Field> {
    ruleProducers: Array<HandlerProducer<P, E, F, EventRunner<P, E, F>, HandlerParam<P, E, F, Event, EventRunner<P, E, F>>>>;
    playerProducers: KeyedHandlerProducers<P, E, F, EventRunner<P, E, F>, HandlerParamWithPlayer<P, E, F, Event, EventRunner<P, E, F>>>;
    effectProducers: KeyedHandlerProducers<P, E, F, EventRunner<P, E, F>, HandlerParamWithEffect<P, E, F, Event, EventRunner<P, E, F>>>;
    actions: EventActions<P, E, F, EventRunner<P, E, F>>;
}
export declare class Game<P extends Player, E extends Effect, F extends Field> {
    private players;
    private effects;
    private field;
    private ruleProducers;
    private playerProducers;
    private effectProducers;
    private actions;
    constructor(initField: F);
    loadRuleProducers(ps: Array<HandlerProducer<P, E, F, EventRunner<P, E, F>, HandlerParam<P, E, F, Event, EventRunner<P, E, F>>>>): void;
    loadPlayerProducers(ps: KeyedHandlerProducers<P, E, F, EventRunner<P, E, F>, HandlerParamWithPlayer<P, E, F, Event, EventRunner<P, E, F>>>): void;
    loadEffectProducers(ps: KeyedHandlerProducers<P, E, F, EventRunner<P, E, F>, HandlerParamWithEffect<P, E, F, Event, EventRunner<P, E, F>>>): void;
    loadActions(acts: {
        [event: string]: EventAction<P, E, F, Event, EventRunner<P, E, F>>;
    }): void;
    loadPackage(p: Package<P, E, F>): void;
    addPlayer(p: P): void;
    addEffect(e: E): void;
    removeEffect(id: string): void;
    runEvent<Ev extends Event>(e: Ev): Ev;
    getPlayers(): Players<P>;
    getEffects(): Effects<E>;
    getField(): F;
}
export declare class EventRunner<P extends Player, Ef extends Effect, F extends Field> {
    private handlers;
    private base;
    private resultObject?;
    private players;
    private effects;
    private field;
    constructor(players: Players<P>, effects: Effects<Ef>, field: F, handlers: Package<P, Ef, F>, base: EventBase | null, resultObject?: {
        players?: Players<P>;
        effects?: Effects<Ef>;
        field?: F;
    });
    private runOneEvent<Ev>(e, subrunner);
    runEvent<Ev extends Event>(e: Ev): Ev;
    addEvent<Ev extends Event>(e: Ev): void;
    private branchRunner(base);
}
