Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | 1x 1x 29x 1x 94x 1x 3x 1x 3x 1x | import { Token } from "../tokens"; import { removeFirst } from "../utils"; /** * A representation of a Chaos Bag with its tokens. A bag is immutable, each * modification (adding or removing tokens) creates a new bag and leave the * original bag unchanged. * * ## Examples * ### Creating a bag from scratch * ```javascript * const T = ArkhamOdds.Token; * const myBag = new ArkhamOdds.Bag([ * T.ELDER_SIGN, T.PLUS_ONE, T.ZERO, T.MINUS_ONE, T.AUTOFAIL * ]); * ``` * ### Creating a bag from predefined bags * See [[Bags]]. * ```javascript * const myBag = new ArkhamOdds.Bag(ArkhamOdds.Bags.ThePathToCarcosa.Standard); * ``` */ export class Bag { private _tokens: Token[]; /** * @param {Token[]} tokens * The tokens to put in the bag. The bag will hold a copy of these tokens * so that changes to the original array of tokens does not affect the bag. */ constructor(tokens: Token[]) { this._tokens = tokens.slice(0); } /** * Get tokens in the bag. * * @return {Token[]} * A copy of tokens in the bag (modification to it will not affect the bag). */ public getTokens(): Token[] { return [...this._tokens]; } /** * Create a new bag with the specified tokens added to it. The original bag is * unchanged which makes it handy to compare odds based on bag composition. * * ## Example * Comparing odds of success when a token is added to the bag. * ```javascript * const bag = new ArkhamOdds.Bag(ArkhamOdds.Bags.ThePathToCarcosa.Standard); * const bagWithTabletAdded = bag.addTokens([ArkhamOdds.Token.TABLET]); * * const effects = ArkhamOdds.DefaultTokenEffects * .merge(new ArkhamOdds.TokenEffects([ * [ArkhamOdds.Token.SKULL, new ArkhamOdds.Modifier(-1)], * [ArkhamOdds.Token.CULTIST, new ArkhamOdds.Modifier(-2)], * [ArkhamOdds.Token.TABLET, new ArkhamOdds.Modifier(-2)], * [ArkhamOdds.Token.ELDER_THING, new ArkhamOdds.Modifier(-2)], * [ArkhamOdds.Token.ELDER_SIGN, new ArkhamOdds.Modifier(2)] * ])); * * const [odds, success] = [ArkhamOdds.odds, ArkhamOdds.success]; * console.log( * odds(1, bag, effects, success(2)) * - odds(1, bagWithTabletAdded, effects, success(2))); * ``` * * @param {Token[]} tokens * The tokens to add to the bag. * @return {Bag} * A new bag. */ public addTokens(tokens: Token[]): Bag { return new Bag(this._tokens.concat(tokens)); } /** * Returns a new bag with the specified token removed. The original bag is * unchanged which makes it handy to compare odds based on bag composition. * This is the method to use for seal effects like * [The Chthonian Stone](https://arkhamdb.com/card/04030) * * ## Example * ```javascript * const bag = new ArkhamOdds.Bag(ArkhamOdds.Bags.ThePathToCarcosa.Standard); * const theChthonianStone = bag.removeToken(ArkhamOdds.Token.CULTIST); * ``` * * @param {Token} token * The token to remove. * @return {Bag} * A new bag with the token removed. If the original bag does not contain * an occurrence of the specified token, the method still returns a copy of * the original bag even if there are no differences in their compositions. */ public removeToken(token: Token): Bag { return new Bag(removeFirst(this._tokens, token)); } } |