'''
char_gen.py
The basic character generation module. Allows accounts to create new characters
with basic selection for name, sex, and race.
'''
import mudsys, mud, socket, char, hooks
def check_char_name(arg):
'''checks to make sure the character name is valid. Names are valid if they
are greater than 2 characters, less than 13, and comprise only alpha
characters.'''
return len(arg) >= 3 and len(arg) <= 12 and arg.isalpha()
def cg_name_handler(sock, arg):
if not check_char_name(arg):
sock.send("{cIllegal name, please pick another.{n\r\n")
elif mudsys.player_exists(arg):
sock.send("{cA player with that name already exists.{n\r\n")
elif mudsys.player_creating(arg):
sock.send("{cA player is already being created with that name.{n\r\n")
elif arg.lower().startswith("guest"):
sock.send("{cCharacter names cannot begin with 'guest'.{n\r\n")
else:
name = arg[0].upper() + arg[1:]
ch = mudsys.create_player(name)
if ch == None:
sock.send("{cIllegal name, please pick another.{n\r\n")
else:
mudsys.attach_char_socket(ch, sock)
ch.rdesc = ch.name + " is here."
sock.pop_ih()
def cg_sex_handler(sock, arg):
try:
result = {
'M' : 'male',
'F' : 'female',
}[arg[0].upper()]
sock.ch.sex = result
sock.pop_ih()
except:
sock.send("{cInvalid sex, try again.{n\r\n")
def cg_race_handler(sock, arg):
if not mud.is_race(arg, True):
sock.send("{cInvalid race selection, try again.{n\r\n")
else:
sock.ch.race = arg.lower()
sock.pop_ih()
def cg_finish_handler(sock, arg):
# pop our input handler for finishing character generation
sock.pop_ih()
# log that the character created
mud.log_string("New player: " + sock.ch.name + " has entered the game.")
# register and save him to disk and to an account
mudsys.do_register(sock.ch)
# make him exist in the game for functions to look him up
mudsys.try_enter_game(sock.ch)
# run the init_player hook
hooks.run("init_player", hooks.build_info("ch", (sock.ch,)))
# attach him to his account and save the account
sock.account.add_char(sock.ch)
mudsys.do_save(sock.account)
mudsys.do_save(sock.ch)
# clear their screen
sock.ch.act("clear")
# send them the motd
sock.ch.page(mud.get_motd())
# make him look at the room
sock.ch.act("look")
# run our enter hook
hooks.run("enter", hooks.build_info("ch rm", (sock.ch, sock.ch.room)))
def cg_name_prompt(sock):
sock.send_raw("What is your character's name? ")
def cg_sex_prompt(sock):
sock.send_raw("What is your sex (M/F)? ")
def cg_race_prompt(sock):
sock.send("Available races are: ")
sock.send(mud.list_races(True))
sock.send_raw("\r\nPlease enter your choice: ")
def cg_finish_prompt(sock):
sock.send_raw("{c*** Press enter to finish character generation:{n ")
################################################################################
# character generation hooks
################################################################################
def char_gen_hook(info):
'''Put a socket into the character generation menu when character generation
hooks are called.
'''
sock, = hooks.parse_info(info)
sock.push_ih(mudsys.handle_cmd_input, mudsys.show_prompt, "playing")
sock.push_ih(cg_finish_handler, cg_finish_prompt)
sock.push_ih(cg_race_handler, cg_race_prompt)
sock.push_ih(cg_sex_handler, cg_sex_prompt)
sock.push_ih(cg_name_handler, cg_name_prompt)
def guest_gen_hook(info):
sock, = hooks.parse_info(info)
sock.push_ih(mudsys.handle_cmd_input, mudsys.show_prompt, "playing")
# make the guest character
ch = mudsys.create_player("Guest")
# oops...
if ch == None:
sock.send("Sorry, there were issues creating a guest account.")
sock.close()
mudsys.attach_char_socket(ch, sock)
ch.rdesc = "a guest player is here, exploring the world."
ch.name = ch.name + str(ch.uid)
ch.race = "human"
# log that the character created
mud.log_string("Guest character created (id %d)." % ch.uid)
# make him exist in the game for functions to look him up
mudsys.try_enter_game(ch)
# run the init_player hook
hooks.run("init_player", hooks.build_info("ch", (ch,)))
# clear our screen
ch.act("clear")
# send them the motd
ch.page(mud.get_motd())
# make him look at the room
ch.act("look")
# run our enter hook
hooks.run("enter", hooks.build_info("ch rm", (ch, ch.room)))
################################################################################
# loading and unloading the module
################################################################################
hooks.add("create_character", char_gen_hook)
hooks.add("create_guest", guest_gen_hook)
def __unload__():
'''removes the hooks for character generation'''
hooks.remove("create_character", char_gen_hook)
hooks.remove("create_guest", guest_gen_hook)