"""
/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
/***************************************************************************
* ROM 2.4 is copyright 1993-1998 Russ Taylor *
* ROM has been brought to you by the ROM consortium *
* Russ Taylor (rtaylor@hypercube.org) *
* Gabrielle Taylor (gtaylor@hypercube.org) *
* Brian Moore (zump@rom.org) *
* By using this code, you have agreed to follow the terms of the *
* ROM license, in the file Rom24/doc/rom.license *
***************************************************************************/
/************
* Ported to Python by Davion of MudBytes.net
* Using Miniboa https://code.google.com/p/miniboa/
* Now using Python 3 version https://code.google.com/p/miniboa-py3/
************/
"""
import hashlib
import time
from merc import *
from settings import *
from const import race_table, pc_race_table, guild_table, weapon_table, title_table
from save import load_char_obj
from db import read_word, create_object
from skills import *
from handler import wiznet
from alias import substitute_alias
import comm
def licheck(c):
if c.lower() == 'l':
return False
if c.lower() == 'i':
return False
return True
def check_parse_name( name ):
bad_names = ['All', 'Auto', 'Immortal', 'Self', 'Someone', 'Something', 'The', 'You', 'Loner', 'Alander']
if name in bad_names:
return False
if len(name) < 2 or len(name) >12:
return False
if not name.isalpha():
return False
checked = [licheck(c) for c in name ]
if True not in checked:
return False
return True
def con_get_name( self ):
argument = self.get_command()
name = argument.title()
if not check_parse_name(name):
self.send("Illegal name, try another.\r\nName:")
found,ch = load_char_obj(self,name)
if IS_SET( ch.act, PLR_DENY ):
print ("Denying access to %s@%s" % (ch.name, self.addrport()))
self.send("You have been denied access.")
self.deactivate()
return
if comm.is_reconnecting(self, name):
found = True
if WIZLOCK and not IS_IMMORTAL(ch):
ch.send("Game is wizlocked")
self.deactivate()
return
if not found and NEWLOCK:
ch.send("Game is newlocked")
self.deactivate()
return
if found:
ch.send("Password: ")
self.set_connected(con_get_old_password)
return
ch.send("Did I get that right, %s (Y/N)? " % ch.name )
self.set_connected(con_confirm_new_name)
return
def con_confirm_new_name(self):
argument = self.get_command()[:1].lower()
ch = self.character
if argument == 'y':
ch.send("New character.\nGive me a password for %s: " % ch.name)
self.set_connected(con_get_new_password)
elif argument == 'n':
ch.send("Ok, what IS it, then? ")
del ch
self.character = None
self.set_connected(con_get_name)
else:
ch.send("Please type Yes or No? ")
def con_get_new_password(self):
argument = self.get_command()
ch = self.character
if len(argument) < 5:
ch.send("Password must be at least five characters long.\nPassword: ")
return
if ENCRYPT_PASSWORD:
argument = argument.encode('utf8')
pwdnew = hashlib.sha512( argument ).hexdigest()
else:
pwdnew = argument
ch.pcdata.pwd = pwdnew
ch.send("Please retype password: ")
self.set_connected(con_confirm_new_password)
def con_confirm_new_password(self):
argument = self.get_command()
ch = self.character
if ENCRYPT_PASSWORD:
argument = argument.encode('utf8')
argument = hashlib.sha512( argument ).hexdigest()
if argument != ch.pcdata.pwd:
ch.send("Passwords don't match.\r\nRetype password: ")
self.set_connected(con_get_new_password)
return
ch.send("The following races are available:\n ")
for race in pc_race_table:
ch.send("%s " % race_table[race].name )
ch.send("\nWhat is your race (help for more information)? ")
self.set_connected(con_get_new_race)
def con_get_new_race(self):
argument = self.get_command().lower()
ch = self.character
if argument.startswith("help"):
argument, arg = read_word(argument)
if not argument:
ch.do_help('race help')
else:
ch.do_help(argument)
ch.send( "\r\nWhat is your race (help for more information)? ")
return
race = prefix_lookup(pc_race_table, argument)
if not race:
ch.send("That is not a valid race.\n")
ch.send("The following races are available:\n ")
for race in pc_race_table:
ch.send("%s " % race_table[race].name )
ch.send("\r\nWhat is your race? (help for more information) ")
return
ch.race = race_table[race.name]
#initialize stats */
for i in range(MAX_STATS):
ch.perm_stat[i] = race.stats[i]
ch.affected_by = ch.affected_by|race_table[race.name].aff
ch.imm_flags = ch.imm_flags|race_table[race.name].imm
ch.res_flags = ch.res_flags|race_table[race.name].res
ch.vuln_flags = ch.vuln_flags|race_table[race.name].vuln
ch.form = race_table[race.name].form
ch.parts = race_table[race.name].parts
# add skills */
for i in race.skills:
group_add(ch,i,False)
# add cost */
ch.pcdata.points = race.points
ch.size = race.size
ch.send("What is your sex (M/F)? ")
self.set_connected(con_get_new_sex)
return
def con_get_new_sex(self):
argument = self.get_command()[:1].lower()
ch = self.character
if argument == 'm':
ch.sex = SEX_MALE
ch.pcdata.true_sex = SEX_MALE
elif argument == 'f':
ch.sex = SEX_FEMALE
ch.pcdata.true_sex = SEX_FEMALE
else:
ch.send("That's not a sex.\nWhat IS your sex? ")
return
ch.send("Select a class [" )
for name, guild in guild_table.items():
ch.send("%s " % guild.name )
ch.send("]: ")
self.set_connected(con_get_new_class)
return
def con_get_new_class(self):
argument = self.get_command()
ch = self.character
guild = prefix_lookup(guild_table, argument)
if not guild:
ch.send("That's not a class.\nWhat IS your class? ")
return
ch.guild = guild
log_buf = "%s@%s new player." % ( ch.name, self.addrport() )
print (log_buf)
wiznet("Newbie alert! $N sighted.",ch,None,WIZ_NEWBIE,0,0)
wiznet(log_buf,None,None,WIZ_SITES,0,ch.get_trust())
ch.send("\r\nYou may be good, neutral, or evil.\n")
ch.send("Which alignment (G/N/E)? ")
self.set_connected(con_get_alignment)
return
def con_get_alignment(self):
argument = self.get_command()[:1].lower()
ch = self.character
if argument == 'g': ch.alignment = 750
elif argument == 'n': ch.alignment = 0
elif argument == 'e': ch.alignment = -750
else:
ch.send("That's not a valid alignment.\n")
ch.send("Which alignment (G/N/E)? ")
return
ch.send("\n")
group_add(ch,"rom basics",False)
group_add(ch,ch.guild.base_group,False)
ch.pcdata.learned['recall'] = 50
ch.send("Do you wish to customize this character?\n")
ch.send("Customization takes time, but allows a wider range of skills and abilities.\n")
ch.send("Customize (Y/N)? ")
self.set_connected(con_default_choice)
def con_default_choice(self):
argument = self.get_command()[:1].lower()
ch = self.character
ch.send("\r\n")
if argument == 'y':
ch.gen_data = GEN_DATA()
ch.gen_data.points_chosen = ch.pcdata.points
ch.do_help("group header")
list_group_costs(ch)
ch.send("You already have the following skills:\n")
ch.do_skills("")
ch.do_help("menu choice")
self.set_connected(con_gen_groups)
elif argument == 'n':
group_add(ch,ch.guild.default_group,True)
ch.send("Please pick a weapon from the following choices:\n")
for k,weapon in weapon_table.items():
if weapon.gsn in ch.pcdata.learned:
ch.send("%s " % weapon.name)
ch.send("\nYour choice? ")
self.set_connected(con_pick_weapon)
else:
ch.send("Please answer (Y/N)? ")
def con_pick_weapon(self):
argument = self.get_command()
ch = self.character
weapon = prefix_lookup(weapon_table, argument )
if not weapon or ch.pcdata.learned[weapon.gsn] <= 0:
ch.send("That's not a valid selection. Choices are:\n")
for k,weapon in weapon_table.items():
if weapon.gsn in ch.pcdata.learned:
ch.send("%s " % weapon.name)
ch.send("\nYour choice? ")
return
ch.pcdata.learned[weapon.gsn] = 40
ch.do_help("motd")
self.set_connected(con_read_motd)
def con_gen_groups(self):
argument = self.get_command().lower()
ch = self.character
if argument == "done":
if ch.pcdata.points == pc_race_table[ch.race.name].points:
ch.send("You didn't pick anything.\n")
return
if ch.pcdata.points < 40 + pc_race_table[ch.race.name].points:
ch.send("You must take at least %d points of skills and groups" % (40 + pc_race_table[ch.race.name].points))
return
ch.send("Creation points: %d\n" % ch.pcdata.points )
ch.send("Experience per level: %d\n" % ch.exp_per_level(ch.gen_data.points_chosen))
if ch.pcdata.points < 40:
ch.train = (40 - ch.pcdata.points + 1) / 2
del ch.gen_data
ch.gen_data = None
ch.send("Please pick a weapon from the following choices:\n")
for w, weapon in weapon_table.items():
if ch.pcdata.learned[weapon.gsn] > 0:
ch.send("%s " % weapon.name)
ch.send("\nYour choice? ")
self.set_connected(con_pick_weapon)
return
if not parse_gen_groups(ch,argument):
ch.send("Choices are: list,learned,premise,add,drop,info,help, and done.\n")
ch.do_help("menu choice")
return
def con_get_old_password(self):
argument = self.get_command()
ch = self.character
ch.send("\n")
pwdcmp = ""
if ENCRYPT_PASSWORD:
argument = argument.encode('utf8')
pwdcmp = hashlib.sha512( argument ).hexdigest()
else:
pwdcmp = argument
if pwdcmp != ch.pcdata.pwd:
ch.send("Wrong password.\n")
comm.close_socket( self )
return
#write_to_buffer( d, echo_on_str, 0 );
if comm.check_playing(self, ch.name):
return
if comm.check_reconnect(self, ch.name, True):
return
log_buf = "%s@%s has connected." % (ch.name, self.addrport())
print (log_buf)
wiznet(log_buf,None,None,WIZ_SITES,0,ch.get_trust())
if IS_IMMORTAL(ch):
ch.do_help("imotd")
self.set_connected(con_read_imotd)
else:
ch.do_help("motd")
self.set_connected(con_read_motd)
return
# RT code for breaking link */
def con_break_connect(self):
argument = self.get_command()[:1].lower()
ch = self.character
if argument == 'y':
for d_old in descriptor_list[:]:
if d_old == self or not d_old.character:
continue
chname = d_old.original if d_old.original else d_old.character
if ch.name != chname:
continue
close_socket(d_old)
if comm.check_reconnect(self, ch.name, True):
return
self.send("Reconnect attempt failed.\nName: ")
if self.character:
del self.character
self.character = None
self.set_connected(con_get_name)
return
if argument == 'n':
self.send("Name: ")
if self.character:
del self.character
self.character = None
self.set_connected(con_get_name)
return
self.send("Please type Y or N? ")
return
def con_read_imotd(self):
ch = self.character
ch.do_help("motd")
self.set_connected(con_read_motd)
def con_read_motd(self):
ch = self.character
if not ch.pcdata or not ch.pcdata.pwd:
ch.send("Warning! Null password!\n")
ch.send("Please report old password with bug.\n")
ch.send("Type 'password null <new password>' to fix.\n")
ch.send("\nWelcome to ROM 2.4. Please do not feed the mobiles.\n")
char_list.append(ch)
ch.reset()
self.set_connected(con_playing)
if ch.level == 0:
ch.perm_stat[ch.guild.attr_prime] += 3
ch.position = POS_STANDING
ch.level = 1
ch.exp = ch.exp_per_level(ch.pcdata.points)
ch.hit = ch.max_hit
ch.mana = ch.max_mana
ch.move = ch.max_move
ch.train = 3
ch.practice = 5
buf = "the %s" % title_table[ch.guild.name][ch.level][ch.sex-1]
set_title( ch, buf )
ch.do_outfit("")
create_object(obj_index_hash[OBJ_VNUM_MAP],0).to_char(ch)
ch.to_room(room_index_hash[ROOM_VNUM_SCHOOL])
ch.do_help("newbie info")
elif ch.in_room:
ch.to_room(ch.in_room)
elif IS_IMMORTAL(ch):
ch.to_room(room_index_hash[ROOM_VNUM_CHAT])
else:
ch.to_room(ch, room_index_hash[ROOM_VNUM_TEMPLE])
act( "$n has entered the game.", ch, None, None, TO_ROOM )
ch.do_look("auto")
wiznet("$N has left real life behind.",ch,None, WIZ_LOGINS,WIZ_SITES,ch.get_trust())
if ch.pet:
ch.pet.to_room(ch.in_room)
act("$n has entered the game.",ch.pet,None,None,TO_ROOM)
def con_playing(self):
command = self.get_command()
if not command.strip():
return
substitute_alias(self, command)