Fluxx
This ruleset describes Fluxx, a card game published by Looney Labs. It specifically implements version 3.0 of that game, by the Looneys' reckoning. This version number is independent of this ruleset's own version number -- which happens to be 1.0.
Legal Notes
The original rules and card design of Fluxx are copyright © 2002 by Looney Labs, Inc. This Volity.net implementation of Fluxx exists with Looney Labs' permission.
If you are interested in making your own referee or UI file based on this API, please consult Looney Labs' official policy on electronic versions of their games.
Rules
Differences between this ruleset document and the standard rules to the physical card game:
- There is no Basic Rules card defined in the game logic.
- The referee randomly chooses which player goes first.
- There is no "Jumping In" rule; new seats cannot be added to the table once the game starts.
Seat IDs
No seats are required.
player_1player_2player_3player_4player_5player_6
Card IDs
10-cards-in-hand5-keepersall-you-need-is-lovebaked-goodsbed-timebreadchocolatechocolate-cookieschocolate-milkcookiesdeathdeath-by-chocolatediscard-drawdouble-agendadraw-2draw-2-and-use-emdraw-3draw-3-play-2-of-themdraw-4draw-5dreamlanddreamsempty-the-trasheverybody-gets-1exchange-keepersfirst-play-randomgo-fishhand-limit-0hand-limit-1hand-limit-2hearts-and-mindshippyismi-need-a-goalkeeper-limit-2keeper-limit-3keeper-limit-4lets-do-that-againlets-simplifylovemilkmilk-and-cookiesmoneynight-and-dayno-hand-bonusno-limitspeacepeace-no-warplay-2play-3play-4play-allpoor-bonusreverse-orderrich-bonusrocket-sciencerocket-to-the-moonrotate-handsrules-resetscramble-keeperssleepsquishy-chocolatesteal-a-keepertake-another-turntaxationtelevisionthe-appliancesthe-brainthe-brain-no-tvthe-moonthe-rocketthe-sunthe-toastertimetime-is-moneytoasttrade-handstrash-a-keepertrash-a-new-ruleuse-what-you-takewarwar-deathwinning-the-lotteryx-x-1
RPCs
The UI is responsible for keeping track of the rules, goals, keepers, and everyone's hand size, as well as the player's own hand. The RPCs below indicate what consequences they have for each of these areas.
The UI does not need to keep track of the deck or discard pile (not even their sizes). The RPCs will provide enough information to keep track of the discard pile, if the UI wants to display it.
When an array of cards are moved to the discard pile, the last member of the array winds up on top.
The argument direction must be an integer, either
0 for left (same direction as standard turn order)
or 1 for right (anti-turn-order)
All references to seats and cards below are to seat and card ID strings, respectively. A card_array is an array of card IDs.
Referee to Player
- current_turn(seat)
- It is the given seat's turn. (This seat is the "current seat" until further notice.)
- current_rules(card_array)
- An array of cards representing the New Rule cards currently in play. (Not used for all rule changes; if rules are removed, you may get rules_trashed() instead.)
- current_goals(card_array)
- An array of cards representing the Goals currently in play. (It's an array to account for the possibility of the Double Agenda rule being in play.)
- current_keepers_all(struct)
- The keys of the struct are seat IDs, and the values are arrays of card IDs representing the Keepers that the respective seats have in play.
- current_keepers(seat, card_array)
- An array of cards representing the Keepers that the given seat has in play.
- draw_pile_refreshed()
- The discard pile has just been emptied and shuffled back into the draw pile.
- seat_won(seat)
- The named seat has won the game.
- card_played(card)
- The current seat played this card. (Seat's hand count decreased. If card is an Action, it goes to discards. Otherwise, you will receive further updates as to its destination.)
- cards_drawn(seat, number)
- The named seat drew this many cards. (Seat's hand count increased. Also used for "draws" from the discard pile.)
- drew_cards(card_array)
- You drew these cards. (Seat's hand count increased. Also used for "draws" from the discard pile.)
- rules_trashed(card_array)
- The current seat trashed these rules. (Moved from rules to discards.)
- goal_trashed(card)
- The given goal card has been trashed by the current seat. (Moved from goals to discards.)
- keeper_trashed(card)
- The given keeper has been trashed by someone. (The keeper was on the table.)
- cards_discarded(card_array)
- The given cards, which came from the deck, have been trashed. (Moved to discards. Occurs in Empty the Trash, to ensure that the action card is in the new discard pile.)
- gave_cards(taking_seat, card_array)
- You have given these cards to that seat. (Seats' hand counts changed.)
- took_cards(giving_seat, card_array)
- You have taken these cards from that seat. (Seats' hand counts changed.)
- seats_traded_hands(seat1, seat2)
- The given seats just swapped their hands. (Seats' hand counts changed.)
- seat_gave_cards(giving_seat, taking_seat, number_of_cards)
- The first seat gave this many cards to the second seat. (Seats' hand counts changed.)
- hands_rotated(direction)
- The hands just rotated in the given direction. (All seats' hand counts changed.)
- rotated_hand(card_array)
- You have just received these cards by way of a Rotate Hands Action. (Your previous hand is gone.)
- seat_discarded_cards(seat, card_array)
- The given seat just discarded the given cards. (Seat's hand count decreased. Cards are in discard pile.)
- must_play(seat)
- Reply: play_card()
The seat
seatmust play a card from its hand. (Normal turn play.) - must_play_or_pass(seat)
- Reply: play_card()
The seat
seatmay play a card from its hand, or pass. (Normal turn play if it's got the Rich Bonus. Call play_card("") to pass.) - must_give_from_hand(giving_seat, receiving_seat, number)
- Reply: give_cards()
The seat
giving_seatmust choose this many cards to give toreceiving_seat. (Taxation) - must_give_from_list(giving_seat, receiving_seat, number, card_array)
- Reply: give_cards()
The seat
giving_seatmust choosenumberof the cards incard_arrayto give toreceiving_seat. (Everybody Gets 1) - must_give_from_list(giving_seat, receiving_seat, number, card_count)
- Reply: give_cards()
The seat
giving_seatmust choosenumberout ofcard_countunknown cards to give toreceiving_seat. (Everybody Gets 1) - must_discard_from_hand(seat, number)
- Reply: discard_cards()
The given
seatmust choosenumbercards from its hard to discard. (Hand Limits) - must_trash_keepers(seat, number)
- Reply: trash_keepers()
The given
seatmust choosenumberof its own active Keepers to trash. (Keeper Limits) - must_trash_rules(seat, number, orfewer)
- Reply: trash_rules()
The seat
seatmust choose this many active New Rules to trash. If the booleanorfeweris true, it may choose this number or fewer (zero is legal). If false, the count must be exact. (Let's Simplify, Trash a New Rule) - must_choose_hand(seat, nonempty)
- Reply: choose_hand_of()
The seat
seatmust choose another seat (not itself) to trade its hand with, or take cards from. If the boolean nonempty is true, it must choose a seat which has cards; if false, it may be a seat with no cards in hand. (Trade Hands, Use What You Take) - must_take_keeper(seat, notyou)
- Reply: take_keeper()
The seat
seatmust choose a keeper to remove from a seat. If the boolean notyou is true, it must choose a keeper from a different seat; if false, it may be its own. (Steal a Keeper, Trash a Keeper) - must_exchange_keepers(seat)
- Reply: exchange_keepers()
The seat
seatmust choose another seat's keeper and one of its own to exchange. (Exchange Keepers) - must_give_goal_to_seat(giving_seat)
- Reply: choose_card()
The seat
giving_seatmust choose a goal from its hand to give to the current seat. (I Need a Goal) - must_choose_from(seat, number, card_array)
- Reply: choose_card()
The seat
seatmust choosenumberof these cards. (First Play Random, Draw 2 and Use Em, Draw 3 Play 2, Go Fish, the end of I Need a Goal, Let's Do That Again) - must_choose_from(seat, number, card_count)
- Reply: choose_card()
The seat
seatmust choosenumberofcard_countunknown cards. (First Play Random, Draw 2 and Use Em, Draw 3 Play 2, Go Fish, the end of I Need a Goal, Let's Do That Again) - must_trash_goal(seat)
- Reply: trash_goals()
The seat
seatmust choose one active Goal to trash. (Occurs after it trashes Double Agenda when two Goals are in play, or when it plays a goal and two Goals are in play.) - must_choose_direction(seat)
- Reply: game_direction()
The seat
seatmust choose a direction. (Rotate Hands)
Player to Referee
- play_card(card)
- Reply to: must_play(), must_play_or_pass() Choose a card from your regular hand. (To pass, give the empty string for the argument.)
- choose_card(card)
- Reply to: must_give_goal_to_seat(), must_choose_from() Choose a card from your hand, or from a given list.
- give_cards(card_array)
- Reply to: must_give_from_hand(), must_give_from_list() Give some cards to the current seat.
- trash_keepers(card_array)
- Reply to: must_trash_keepers() Trash visible Keepers.
- trash_goals(card_array)
- Reply to: must_trash_goal() Trash visible Goals.
- trash_rules(card_array)
- Reply to: must_trash_rules() Trash visible Rules.
- discard_cards(card_array)
- Reply to: must_discard_from_hand() Discard some cards from the hand.
- choose_hand_of(seat)
- Reply to: must_choose_hand() Select a seat to trade hands with, or take cards from.
- game_direction(direction)
- Reply to: must_choose_direction() Select a direction (e.g., to rotate hands). The value must be integer 0 or 1, as described above.
- exchange_keepers(card, card)
- Reply to: must_exchange_keepers() Select another player's Keeper and one of your own (in that order) to exchange.
- take_keeper(card)
- Reply to: must_take_keeper() Select another player's Keeper to steal or trash.
Translation tokens
(And their English translations.)
unexpected_reply-- You aren't expected to make that move at this time.invalid_card-- That isn't a valid card.invalid_seat-- That isn't a valid seat.invalid_direction-- That isn't a valid direction.invalid_card_array-- Those aren't all valid cards.