This is a rough outline of the pydance source code. It is not authoritative, and everything in it should checked against the real source code and comments. Basic Design Philosophies ------------------------- Everything should be strongly object-oriented. Code and data should be moved as much as possible into common parent classes. We should not sacrifice code clarity for speed except in extreme cases. Overview of Program Flow ------------------------ First pydance.py is started. constants.py is imported, and constants and some top-level variables are defined, such as the event handlers and the configuration files. From there pydance.py loads all files it finds it finds in the 'songdir' variable, using fileparsers.py. From there it calls menudriver.py, which instantiates the game's main menu. "Play Game" runs gameselect.py, which in turns runs songselect.py or endless.py. From there the code in optionscreen.py may be executed to change options, or dance.py will be run to start a game. dance.play takes the list of songs to play and the relevant configuration settings. It then instantiates the players (players.py) and has them play through the list of songs, calling dance.dance on each one. The players are in charge of managing their sprite groups, as well as creating and updating all the sprites in them. The dance.dance loop hands keypresses off to player, which in turn hands them off to Judge (judge.py). The judge rates the steps, and then the player sends the step rating and related information to all its "listeners" -- the lifebar, score, and so on. After the song list is over dance.play makes the grade screen, and then passes control back to endless/songselect. Exiting the main menu returns control to pydance.py, which writes the configuration file out and then exits the program. Naming Conventions ------------------ Class names LookLikeThis. Local variables and functions look_like_this, although short ones may for convenience looklikethis, or llt. Exceptions are to be used for exceptional circumstances only. They should not be used where an 'if' condition would suffice. Class names should begin with Abstract iff they are not to be instantiated, but are to provide functionality for subclasses. Private functions and variables should begin with _. Variables that begin with _ must be private. Use GvR's tuple/list distinction rather than the immutable vs. mutable one. This means sequences with different types in them should be tuples, and sequences with the same types should be lists (this means x,y coordinate pairs should be lists).