Volity

Fluxx

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:

Seat IDs

No seats are required.

Card IDs

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 seat must play a card from its hand. (Normal turn play.)
must_play_or_pass(seat)
Reply: play_card() The seat seat may 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_seat must choose this many cards to give to receiving_seat. (Taxation)
must_give_from_list(giving_seat, receiving_seat, number, card_array)
Reply: give_cards() The seat giving_seat must choose number of the cards in card_array to give to receiving_seat. (Everybody Gets 1)
must_give_from_list(giving_seat, receiving_seat, number, card_count)
Reply: give_cards() The seat giving_seat must choose number out of card_count unknown cards to give to receiving_seat. (Everybody Gets 1)
must_discard_from_hand(seat, number)
Reply: discard_cards() The given seat must choose number cards from its hard to discard. (Hand Limits)
must_trash_keepers(seat, number)
Reply: trash_keepers() The given seat must choose number of its own active Keepers to trash. (Keeper Limits)
must_trash_rules(seat, number, orfewer)
Reply: trash_rules() The seat seat must choose this many active New Rules to trash. If the boolean orfewer is 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 seat must 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 seat must 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 seat must 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_seat must 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 seat must choose number of 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 seat must choose number of card_count unknown 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 seat must 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 seat must 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.)