Card deck would certainly work. Here's another option using the Scriptcards Mod/script, if I'm understanding the mechanics properly. This queries for the number of Positive and Negative tokens to put into the bag as well as the number of tokens to draw. These are displayed in the subtitle of the output card. Creates an array containing the values of the bag contents, then randomly rolls (draws) the prescribed number of times against the remaining contents of the bag. After an array element is rolled, that element is removed from the array for subsequent draws. As a sanity check, I output the remaining contents of the bag before each draw is performed. If you want to save on chat space, you can remove those lines by deleting the following full line from the macro below (In the DrawToken function) --+|[r][b]Remaining:[/b] [&remainingToks][/r] Example output: Here's the scriptcard macro. !scriptcard {{
--#title|Not the End RPG
--#leftsub|+1's: [?{Num Positive Counters?|1}]
--#rightsub|-1's: [?{Num Negative Counters?|0}]
--:Formatting|
--#titleCardBackground|#000000
--#titlecardbackgroundimage|url('<a href="https://s3.amazonaws.com/files.d20.io/images/310650058/OlhR4KGJz1KJzCOpsaxP_w/max.png?');background-size" rel="nofollow">https://s3.amazonaws.com/files.d20.io/images/310650058/OlhR4KGJz1KJzCOpsaxP_w/max.png?');background-size</a>: 100% 100%; background-repeat: no-repeat
--#subtitleFontColor|#000000
--#titleFontColor|#bbbbbb
--#oddRowBackground|#bbbbbb
--:Initialize Roll Vars|
--=NumPos|?{Num Positive Counters?}
--=NumNeg|?{Num Negative Counters?}
--=TokensRemaining|[$NumPos] + [$NumNeg]
--=NumDraws|?{Num Draws?|1}
--=NumSuccess|0
--=NumFail|0
--:Data Validation|
--?[$NumDraws] -gt [$TokensRemaining]|[
--+[#990000][c]Error[/c][/#]|[c][$NumDraws] Draws(s) requested, but only [$TokensRemaining] Token(s) available![/c]
--X| End Macro
--]|
--:Define an array representing the draw bag| add the req'd number of +1/-1 entries
--?[$NumNeg] -gt 0|[
--%i|1;[$NumNeg];1
--~|array;add;DrawBag;-1
--%|
--]|
--?[$NumPos] -gt 0|[
--%i|1;[$NumPos];1
--~|array;add;DrawBag;1
--%|
--]|
--:Draw Tokens from Bag|
--+[#990000]DRAWS ([$NumDraws])[/#]|
--=DrawCount|0
--:BaseDiceLoop|
--=DrawCount|[$DrawCount] + 1
-->DrawToken|
--?[$DrawCount] -lt [$NumDraws]|BaseDiceLoop
--:Evaluation|
--+[#990000]RESULTS[/#]|
--:Output Success and Failure counts|
--+|[c][b]Successes = [$NumSuccess][/b][/c]
--+|[c][b]Complications = [$NumFail][/b][/c]
--X| End macro
--:FUNCTIONS|
--:DrawToken|
--=DrawNum|[$DrawNum]+1
--~remainingToks|array;stringify;DrawBag;,
--+|[r][b]Remaining:[/b] [&remainingToks][/r]
--=ThisIndex|1d[$TokensRemaining.Raw] - 1
--=ThisDraw|[@DrawBag([$ThisIndex.Raw])]
--+Draw [$DrawNum]|[$ThisDraw]
--~|array;removeat;DrawBag;[$ThisIndex.Raw]
--~length|array;getlength;DrawBag
--=TokensRemaining|[&length]
--?[$ThisDraw] -eq 1|>AddSuccess
--?[$ThisDraw] -eq -1|>AddFail
--<|
--:AddSuccess|
--=NumSuccess|[$NumSuccess] + 1
--<|
--:AddFail|
--=NumFail|[$NumFail] + 1
--<|
}}