sub loadattacks{ print "loading attacks\r\n"; %attack=loadfile("attacks.xml"); } sub loadfile { my $file=shift; open(FILE, "$file"); local $/; my $a=<FILE>; my $hash=load_decend($a); return %{$hash}; } sub loadcommands { print "loading commands\r\n"; unless (open(COMMANDS, "commands.lst")){ print "can't open the commands file."; die; } $/="\n"; if (defined(%command)){ %command=""; } while ($a=<COMMANDS>){ chomp($a); if ($a=~/<commandset name=(\w*) failed="(.*?[^\\])">/i){ $type=$1; $commandtype{$type}{failed}=$2; next; } if ($a=~/<commandset name=(\w*) type=(.*) sub=(.*)>/i){ $commandtype{$1}{$2}=$3; next; } if ($a=~/<\/commandset>/i){ my @a=sort(keys(%command)); undef %command; $commandlist{$type}=[@a]; $type=undef; next; } if ($a=~/<([^\/].*)>/i){ $command=$1; $command{$command}=$command; next; } if (defined($command) and ($a=~/<\/$command>/i)){ $command=undef; next; } $commands{$type}{$a}=$command; } close (COMMANDS); } sub loadmonster { print "loading monsters\r\n"; $/="</monster>"; $monstertotal=1; unless (open(MONSTER, "monster.xml")){ print "can't open the monster file."; die; } while ($a=<MONSTER>){ unless ($a=~s/<monster num=(\d+)>\n?//i){ print"bad monster #, probably done loading monsters.\r\n"; next; } my $monster=$1; while($a=~s/<adjective>\n?(.*?)\n?<\/adjective>\n?//is){ push (@{$monster[$monster]{adjectives}}, $1); } while ($a=~/<(.*?)>(.*?)<\/\1>/isg){ $monster[$monster]{$1}=$2; } while ($a=~/<(.*?)=(.*?)>/ig){ $monster[$monster]{$1}=$2; } } } sub loadroom{ print "loading rooms\r\n"; my $filename=shift; $/="</room>"; foreach $map (($filename or glob("map/map*.xml"))){ print "$map"; unless (open(MAP, "$map")){ print "can't open the mapfile."; die; } while ($a=<MAP>){ unless ($a=~s/<num=(\d+)>//i){ print"bad room #, probably done loading map.\r\n"; next; } my $room=$1; $a=~s/<room>//i; $a=~s/<\room>//i; $room[$room]=load_decend($a); #print keys %{$room[$room]}; print each %{$room[$room]{longdesc}}; } close MAP; } } sub loaditems { print "loading items\r\n"; $/="</item>"; unless (open(ITEM, "item.xml")){ print "can't open the mapfile."; die; } while ($a=<ITEM>){ unless ($a=~s/<item num=(.*?)>//i){ print "bad item #, probably done loading items.\r\n"; next; } my $item=$1; $itemtemplate{$item}=load_decend($a); } close ITEM; } sub loadmuddata{ unless (open(MUD, "muddata.xml")){ print "can't open the muddata file $a: $!."; next; } local $/; $a=<MUD>; while ($a=~/<(.*?)>(.*?)<\/\1>/isg){ ${$1}=$2; } while ($a=~/<(.*?)=(.*?)>/ig){ ${$1}=$2; } close MUD; } sub savemuddata{ unless (open(MUD, "muddata.xml")){ print "can't open the muddata file $a: $!."; next; } local $/; my $a=<MUD>; close MUD; $a=~s/<itemtotal=.*?>/<itemtotal=$itemtotal>/is; unless (open(MUD, ">muddata.xml")){ print "can't open the muddata file $a: $!."; next; } print MUD $a; close MUD; } sub loadrealitems { print "loading real items\r\n"; local $/; my $a; foreach $a (glob("items/*")){ unless (open(ITEM, "$a")){ print "can't open the realitem file $a: $!."; next; } $item=$a; $item=~s/items\///i; while ($a=<ITEM>){ while ($a=~/<(.*?)>(.*?)<\/\1>/isg){ $item{$item}{$1}=$2; } while ($a=~/<(.*?)=(.*?)>/ig){ $item{$item}{$1}=$2; } } close ITEM; } } sub saverealitem { $item=shift; print "saving $item\n\n"; unless (open(ITEM, ">items/$item")){ print "can't save realitem!!!! $!"; return 0; } local $string; foreach $a (keys %{$item{$item}}){ descend($item{$item}{$a},$a); } print ITEM $string; close ITEM; return 1; } sub loadplayer { my $user=shift; my $user2=shift; my $dir=(shift or "players"); unless (open(FILE,"$dir/$user")){ return 0; } local $/; my $c=<FILE>; close(FILE); if (defined($user{$user2})){ $userold=$user{$user2}; $user{$user2}=load_decend($c); %{$user{$user2}}=(%{$userold},%{$user{$user2}}); }else { $user{$user2}=load_decend($c); } print keys %{$user{$user2}}; print "\n"; foreach $body_part (keys %{$user{$user2}{health}}){ foreach $a (keys %{$user{$user2}{health}{$body_part}{wear}}){ if ($user{$user2}{health}{$body_part}{wear}{$a}=~/#(\d*)/i){ print "make wear $1\n"; $user{$user2}{health}{$body_part}{wear}{$a}=makeitem($1); } } if (defined($user{$user2}{health}{$body_part}{weapon})){ if ($user{$user2}{health}{$body_part}{weapon}=~/#(\d*)/i){ print "make weapon $1\n"; $user{$user2}{health}{$body_part}{weapon}=makeitem($1); } } if (defined($user{$user2}{health}{$body_part}{hold})){ push (@{$user{$user2}{hold}}, $body_part); if ($user{$user2}{health}{$body_part}{hold}=~/#(\d*)/i){ print "make item $1\n"; $user{$user2}{health}{$body_part}{hold}=makeitem($1); } } } return 1; } sub loaddesc { print "loading descriptions\r\n"; unless (open(DESC, "describe.lst")){ print "can't open the commands file."; die; } local $/; my $a=<DESC>; close DESC; while ($a=~s/<(.*?)>(.*?)<\/\1>//is){ my $desc=$1; @{$desc{$desc}}=split(/\n/,$2); } } sub load_decend { my $string=shift; my %hash; my $a; while($string=~s/<(.*?)>(.*?)<\/\1>\n?//is){ $a=1; my $b=$1; $hash{$b}=load_decend($2); if ($b=~/>/s){ print "error1 $b, $c"; } } while($string=~s/<([^>]*?)=([^>]*?)>\n?//is){ $a=1; my $b=$1; $hash{$b}=$2; if ($b=~/>/s){ print "error2 $b, $c, $&"; } } unless ($a){ # print "returning $string"; return $string; } return \%hash; } return 1;