-
Notifications
You must be signed in to change notification settings - Fork 0
raretypeoffox/pymud
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
PyMUD v0.0.1 January 2024 == Introduction PyMUD is a MUD codebase written from scratch in Python. Inspiration for it comes from MUDs originally based on the Diku/Merc however the code it is all original Built with Python v3.12.1 == Folder Structure ./ source code (*.py) ./config server config files ./database sqlite db files (initially empty) ./log log files (initially empty) ./world area / zone files == How to run python mud_server.py [port optional, default 4000] == Summary of the source code: mud_abilities.py - handles skills and spells learning and levelup mud_combat.py - handles melee combat mud_comms.py - handles processing messages to players and player login/char creation mud_consts.py - where constant data is stored mud_gmcp.py - implements GMCP mud_handler.py - processes the player's command input mud_mprog.py - handles mob specific behavour mud_objects.py - the main data structure and methods for players, mobs, objects and resets mud_password.py - checks/creates user password on login mud_server.py - starts up the server and contains the game_loop mud_shared.py - common functions that any other .py file can use mud_socials.py - handles the players social commands mud_spells.py - handles spellcasting mud_ticks.py - handles timed events mud_world.py - loads and parses the world .are files into the template managers == Most Important Data Structures mud_objects.py: PlayerDatabase - save files for players ObjectDatabase - save files for objects to be saved (eg on players) PlayerManager - player_manager instance contains all the players currently connected Player - every client gets an instance, contains all their connectively and gameplay data Character - main character data (note, Mob's also get this class) Inventory - players / mobs inventory Equipment - players / mobs equipped items MobTemplate - the mob data loaded from the .are files to a template ObjectTemplate - the object data loaded from the .are files to a template Room - the room instances, loaded directly from the .are files MobInstance - the individual mobs in the game ObjectInstance - the individual objects in the game Resets - manages the area reset/repop process CombatManager - tracks who's in combat with who == Most Important Functions build_world # loads all the .are file (note: compatable with diku/merc .are files) game_loop # loops continiously containing the main game logic, see next section handle_player # process player commands (eg look) tick_loop / mini_tick_loop # manages commonly used timed events (eg regen) do_cast # casts a spell == Often Used Fucntions # send messages to players send_message(player, message) send_room_message(room, msg, excluded_player=None, excluded_msg=None) # characters room instance player.current_room, mob.current_room -- reference the current room # handling player input ## takes the first argument a player gives and puts it in arg1, puts the remainder in arg2 ## arguments in quotes are counted as a single argument, eg ## command = give, argument = 'red cloak' player ## splits into arg 1 = "red cloak", arg2 = "player" arg1, arg2 = parse_argument(argument) # search for a target (eg look, give, kill, cast etc) ## note multiple set of items can be inputed via a pipe | ## for example: search_items((room.get_players() | room.get_mobs()), target_name) ## returns the instance found, None is not found ## is able to process the X. format, eg target_name of "2.mobname" would find the 2nd mob search_items(set_of_instances, keyword) # log to server output window / log file log_info(msg) / log_error(msg) == Overview of game start / loop mud_server.py: main() launches the following before starting the game loop: # parse all of the .are files in world and loads them into the template managers and the reset manager build_world() # loads all of the rooms, mobs, and objects from the template managers into the world reset_world() # loads all of the saved objects (eg on players) into the world build_objects() # starts up the server, which them calls game_loop start_server() game_loop() is the main loop for the game and will run until the server is shutdown. note that the MUD has been designed as single threaded with non-blocking sockets The game_loop works in the following way: iterate over every socket: check for new connections and pass them over to handle_new_client() (mud_comms.py) on connection, a socket will be assigned a Player instance existing connections, read the input data to player_data[player] if the client has sent us GMCP data, pass over to mud.gmcp.py for processing iterate over every player: if the player is already loggedin: pass the input to handle_player (mud_handler.py) which handles all player cmds if the player is not loggedin: pass the input to handle_client_login (mud_comms.py) iterate over every player and send them their output_buffer (via process_output()) call the main game logic function, update_game_state() which does following - every 2 seconds, processes a round of combat - checks a number of timed events, eg ticks, via timed_events() (mud_ticks.py) sends any gmcp messages to the players then briefly waits before looping again
About
Multi-User Dungeon (MUD) written in Python. Supports Diku/Merc .are files, GMCP