diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1efc9fe87f39c04dd3b49edac1162bb28091a553..7ee1fc317187f4648b6f1bb5c229bdd1dc2816b9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,15 @@ before it.
 Thanks for your interest in the Idle RPG! Feel free to contact me with ideas and
 comments, or post them in the issues of the project for public view.
 
+---
+## v5.2.4: released 07/01/20
+- the ACTION command has a new option to specify the type of action (fight/mystic/steal)
+- fix a sentence and colored team battle results
+- $rps hash is now available from PEVAL command context
+- admin commands now react on usernick (irc) and not username (irpg)
+- Critical Strike range is now 90% for Neutral, 85% for Evil and 95% for Good
+- some other bugfixes and corrections
+
 ---
 ## v5.2.3: released 06/03/20
 - added a 1/5 chance for evilchase
diff --git a/Irpg/Action.pm b/Irpg/Action.pm
index 76dcc8e2a2a4ed76a5e0804f0b4a43bee05a3e1d..9aba1627274e9ec1f8896301795d2219870ef925 100644
--- a/Irpg/Action.pm
+++ b/Irpg/Action.pm
@@ -2,6 +2,7 @@ package Irpg::Action;
 
 use strict;
 use warnings;
+use POSIX;
 use Irpg::Utils qw(:text);
 use Irpg::Irc qw(:interaction);
 use Exporter qw(import);
@@ -70,13 +71,40 @@ sub choose_action {
     return 'steal';
 }
 
+sub minimize {
+    my $x = shift;
+    return unless defined($x);
+    return 5*exp(-pow($x,2)/5000);
+}
+
+sub maximize {
+    my $x = shift;
+    return unless defined($x);
+    return 5+pow($x,2)/1000;
+}
+
+sub perc_defeat {
+    my $lvl_gap = shift;
+    return unless defined($lvl_gap);
+    return 5 if $lvl_gap == 0;
+    return $lvl_gap > 0 ? minimize($lvl_gap) : maximize($lvl_gap);
+}
+
+sub perc_victory {
+    my $lvl_gap = shift;
+    return unless defined($lvl_gap);
+    return 5 if $lvl_gap == 0;
+    return $lvl_gap > 0 ? maximize($lvl_gap) : minimize($lvl_gap);
+}
+
 sub fight_result {
     my ($p1, $p2, $win, $wanted) = @_;
     return unless $p1 && $p2 && defined($win);
     my @queue = ();
     if ($win) {
-        my $gain = int($rps->{$p2}{level}/4);
-        $gain = 7 if $gain < 7;
+        #my $gain = int($rps->{$p2}{level}/4);
+        #$gain = 7 if $gain < 7;
+        my $gain = perc_victory($rps->{$p2}{level} - $rps->{$p1}{level});
         $gain *= $rps->{$p1}{class}->{MOD_CRT} if ($win == 2);
         $gain *= 1.2 if ($wanted);
         $gain = int(($gain/100)*$rps->{$p1}{next});
@@ -86,8 +114,7 @@ sub fight_result {
             duration($gain)." is removed from $p1\'s clock.");
         if ($win == 2) {
             $gain = int(0.05*$rps->{$p2}{next});
-            $gain = $rps->{$p2}{class}->real_gain($gain);
-            $rps->{$p2}{next} += $gain;
+            $rps->{$p2}{next} += $rps->{$p2}{class}->real_gain($gain);
             push(@queue,
                 "$p1 has dealt $p2 a Critical Strike! ".
                 duration($gain)." is added to $p2\'s clock. ".
@@ -95,8 +122,9 @@ sub fight_result {
         }
     }
     else {
-        my $gain = $rps->{$p2}{level}/7;
-        $gain = 7 if $gain < 7;
+        #my $gain = $rps->{$p2}{level}/7;
+        #$gain = 7 if $gain < 7;
+        my $gain = perc_defeat($rps->{$p2}{level} - $rps->{$p1}{level});
         $gain *= 1.2 if ($wanted);
         $gain = int(($gain/100)*$rps->{$p1}{next});
         $gain = $rps->{$p1}{class}->real_gain($gain);
@@ -114,8 +142,9 @@ sub mystic_result {
     return unless $p1 && $p2 && defined($win);
     my @queue = ();
     if ($win) {
-        my $gain = int($rps->{$p2}{level}/8);
-        $gain = 5 if $gain < 5;
+        #my $gain = int($rps->{$p2}{level}/8);
+        #$gain = 5 if $gain < 5;
+        my $gain = perc_victory($rps->{$p2}{level} - $rps->{$p1}{level})*0.70;
         $gain *= 1.2 if ($wanted);
         $gain = int(($gain/100)*$rps->{$p1}{next});
         $gain = -$rps->{$p1}{class}->real_gain(-$gain);
@@ -139,8 +168,9 @@ sub mystic_result {
         }
     }
     else {
-        my $gain = $rps->{$p2}{level}/10;
-        $gain = 5 if $gain < 5;
+        #my $gain = $rps->{$p2}{level}/10;
+        #$gain = 5 if $gain < 5;
+        my $gain = perc_defeat($rps->{$p2}{level} - $rps->{$p1}{level})*0.70;
         $gain *= 1.2 if ($wanted);
         $gain = int(($gain/100)*$rps->{$p1}{next});
         $gain = $rps->{$p1}{class}->real_gain($gain);
@@ -178,13 +208,13 @@ sub steal_result {
                 " own demise.");
             Irpg::Irc::notice(
                 "You (rightfully) acquired a new level $item2 $type, which ".
-				"looks far better than your old level $item1 $type! ".
+                "looks far better than your old level $item1 $type! ".
                 "You left your old one to whom you took the new from.",
                 $rps->{$p1}{nick});
             Irpg::Irc::notice(
                 "Waking up from your daydreaming, you realize your level ".
                 "$item2 $type has been stolen, and replaced by a level ".
-				"$item1 $type!",
+                "$item1 $type!",
                 $rps->{$p2}{nick});
         }
         else {
@@ -199,7 +229,7 @@ sub steal_result {
         my $type = "ring";
         my $val = 0;
         while( my ($k,$v) = each(%{$rps->{$p2}{item}}) ) {
-			my ($v_d,) = $v =~ m/(\d+)\D?/;
+            my ($v_d,) = $v =~ m/(\d+)\D?/;
             ($type, $val) = ($k, $v_d) if ($v_d > $val)
         }
         my ($item1,) = $rps->{$p1}{item}{$type} =~ m/(\d+)\D?/;
@@ -216,13 +246,13 @@ sub steal_result {
                 "self.";
             Irpg::Irc::notice(
                 "You (rightfully) acquired a new level $item2 $type, which ".
-				"looks far better than your old level $item1 $type! ".
+                "looks far better than your old level $item1 $type! ".
                 "You left your old one to whom you took the new from.",
                 $rps->{$p1}{nick});
             Irpg::Irc::notice(
                 "Waking up from your daydreaming, you realize your level ".
                 "$item2 $type has been stolen, and replaced by a level ".
-				"$item1 $type!",
+                "$item1 $type!",
                 $rps->{$p2}{nick});
         }
         else {
@@ -267,8 +297,8 @@ sub perform_action {
         # VICTORY
         $ret->{vict}++;
         my $align_mod = $rps->{$p1}{alignment} eq 'Good' ? 0.05 :
-                        $rps->{$p1}{alignment} eq 'Evil' ? -0.10 :
-                        1;
+                        $rps->{$p1}{alignment} eq 'Evil' ? -0.05 :
+                        0;
         if ($p1roll*$p1atk >= $p1sum*$p1atk*($rps->{$p1}{class}->{CRIT_SK} + $align_mod)) {
             # CRITICAL STRIKE
             $ret->{vict}++;
@@ -378,13 +408,13 @@ sub team_battle { # pit three players against three other players
 
     my ($state, $moved);
     if ($myroll >= $opproll) {
-        ($state, $moved) = ('won', 'removed from');
+        ($state, $moved) = ('3won', 'removed from');
         for (my $i = 0; $i < 3; $i++) {
             $rps->{$opp[$i]}{next} += $rps->{$opp[$i]}{class}->real_gain(-$gain);
         }
     }
     else {
-        ($state, $moved) = ('lost', 'added to');
+        ($state, $moved) = ('5lost', 'added to');
         for (my $i = 0; $i < 3; $i++) {
             $rps->{$opp[$i]}{next} += $rps->{$opp[$i]}{class}->real_gain($gain);
         }
@@ -393,8 +423,8 @@ sub team_battle { # pit three players against three other players
         "$opp[0], $opp[1], and $opp[2] ".
         "[".($myroll/5)."/".($mysum/5)."] have team battled ".
         "$opp[3], $opp[4], and $opp[5] ".
-        "[".($opproll/5)."/".($oppsum/5)."] and $state! ".
-        duration($gain)." is $moved their clocks."));
+        "[".($opproll/5)."/".($oppsum/5)."] and \x03$state! ".
+        duration($gain)."\x03 is $moved their clocks."));
 }
 
 sub rpcheck {
@@ -429,6 +459,38 @@ sub do_action {
             "an undefined deed, but collapses out of exhaustion.");
         return 1;
     }
+    my ($type,) = join(' ', @arg) =~ m/-t (\w+)/;
+    if (defined($type)) {
+        if (!($type =~ m/fight|mystic|steal/i)) {
+            Irpg::Irc::notice("Despite your intensive training, ".
+                "you are still unable to perform a '$type' action.", $usernick);
+            return 1;
+        }
+        #remove "-t xxx" from @arg
+        foreach ('-t', $type) {
+            my $index = 0;
+            $index++ until $arg[$index] eq $_;
+            splice(@arg, $index, 1);
+        }
+    }
+    if ($rps->{$username}{actions} < 6 && exists($arg[0]) && defined($type)) {
+        Irpg::Irc::notice("You are far to weak willed and feeble to ".
+            "both choose for yourself the action you want to perform and ".
+            "look for anyone.", $usernick);
+        Irpg::Irc::chanmsg("$usernick fails to handle his own path as the ".
+            "Gods did not made ".pronoun(3, $rps->{$username}{gender})." ".
+            "for such inanity.");
+        return 1;
+    }
+    if ($rps->{$username}{actions} < 4 && defined($type)) {
+        Irpg::Irc::notice("You do not have enough initiative to ".
+            "choose for yourself the action you want to perform.",
+            $usernick);
+        Irpg::Irc::chanmsg("$username tries to overstep what the Gods ".
+            "have planned for ".pronoun(3, $rps->{$username}{gender}).
+            ", but fails.");
+        return 1;
+    }
     if ($rps->{$username}{actions} < 2 && exists($arg[0])) {
         Irpg::Irc::notice("You do not have enough energy to ".
             "look for anyone.", $usernick);
@@ -443,10 +505,11 @@ sub do_action {
         Irpg::Irc::chanmsg(
             "$username is desperatly searching for someone, ".
             "but ".pronoun(2, $rps->{$username}{gender})." call remains ".
-            "unheard in the silent desert of ".pronoun(2, $rps->{$username}).
+            "unheard in the silent desert of ".pronoun(2, $rps->{$username}{gender}).
             " loneliness.");
         return 1;
     }
+    my $p1 = $username;
     my $p2;
     if (exists($arg[0]) && !(grep { $arg[0] eq $_ } @opps)) {
         if (exists($rps->{$arg[0]})) {
@@ -472,10 +535,15 @@ sub do_action {
     else {
         $p2 = $opps[int(rand(@opps))];
     }
+    my $action_type = choose_action($p1);;
+    if (defined($type)) {
+        $action_type = $type;
+        # selecting an action's type cost 3 extra action points
+        consume_action($username);
+        consume_action($username);
+        consume_action($username);
+    }
     consume_action($username);
-    $rps->{$username}{next_a} = 3600 unless ($rps->{$username}{next_a});
-    my $p1 = $username;
-    my $action_type = choose_action($p1);
     my $ret_action = perform_action($p1, $p2, $action_type);
     my $res_action = eval $action_type.'_result($p1, $p2, $ret_action->{vict}, 1)';
 
@@ -522,14 +590,14 @@ sub new_action {
 
 our $commands = {
     action => {ref => \&do_action, adm => 0, prv => 1, pub => 1,
-               hlp => 'ACTION [<char name>]: perform an action '.
-                      '(fight/mystic/steal) with someone. The action is '.
-                      'chosen at random, with more chance for the one you are '.
-                      'the better at.'},
+               hlp => 'ACTION [-t <type>] [<char name>]: perform an action '.
+                      '(fight/mystic/steal) with someone. With no type specified, '.
+					  'The action is chosen at random, '.
+					  'with more chance for the one you are the better at.'},
     actions => {ref => \&do_actions, adm => 0, prv => 1, pub => 1,
-                hlp => 'ACTIONS [<char name>]: perform all available actions '.
-                       'with someone. The actions are chosen at random, with '.
-                       'more chance for the one you are the better at.'}
+                hlp => 'ACTIONS [-t <type>] [<char name>]: perform all available actions '.
+                       'with someone. With no type spcified, the actions are chosen '.
+					   'at random, with more chance for the one you are the better at.'}
 };
 
 1;
diff --git a/Irpg/Admin.pm b/Irpg/Admin.pm
index 149b521e752462a3beb387227b68aadb42e19de8..9a34ff308bc33d2a5af498c84cbb1a41fee1c27c 100644
--- a/Irpg/Admin.pm
+++ b/Irpg/Admin.pm
@@ -10,274 +10,279 @@ use Irpg::Event qw(hog);
 my $opts;
 my $rps;
 =head1 FUNCTION init_hashes
-	This function sets the references to
-	options and players hashes.
+    This function sets the references to
+    options and players hashes.
 =over
-=item SCALAR (ref)	- reference to the options hash
-=item SCALAR (ref)	- reference to the players hash
+=item SCALAR (ref)    - reference to the options hash
+=item SCALAR (ref)    - reference to the players hash
 =cut
 sub init_pkg { ($opts, $rps) = @_; }
 
 sub join_chans {
-	for (@_[3..$#_]) {
-		Irpg::Irc::sts("JOIN $_");
-	}
+    for (@_[3..$#_]) {
+        Irpg::Irc::sts("JOIN $_");
+    }
 }
 
 sub leave_chans {
-	for (@_[3..$#_]) {
-		Irpg::Irc::sts("PART $_");
-	}
+    for (@_[3..$#_]) {
+        Irpg::Irc::sts("PART $_");
+    }
 }
 
 sub peval {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if ($opts->{ownerpevalonly} && $opts->{owner} ne $username) {
-		Irpg::Irc::privmsg("You don't have access to PEVAL.", $usernick);
-	}
-	else {
-		my @peval = eval "@arg";
-		if (@peval >= 4 || length("@peval") > 1024) {
-			Irpg::Irc::privmsg("Command produced too much output to send ".
-					"outright; queueing ".length("@peval").
-					" bytes in ".scalar(@peval)." items. Use ".
-					"CLEARQ to clear queue if needed.",$usernick,1);
-			Irpg::Irc::privmsg($_,$usernick) for @peval;
-		}
-		else { Irpg::Irc::privmsg($_,$usernick, 1) for @peval; }
-		Irpg::Irc::privmsg("EVAL ERROR: $@", $usernick, 1) if $@;
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if ($opts->{ownerpevalonly} && $opts->{owner} ne $usernick) {
+        Irpg::Irc::privmsg("You don't have access to PEVAL.", $usernick);
+    }
+    else {
+        my (undef) = $rps;  #does nothing;
+                            #this is a cheat to have $rps variable
+                            #available in eval context
+                            #FIXME
+                            #I don't understand why $rps is not already available
+        my @peval = eval "@arg";
+        if (@peval >= 4 || length("@peval") > 1024) {
+            Irpg::Irc::privmsg("Command produced too much output to send ".
+                    "outright; queueing ".length("@peval").
+                    " bytes in ".scalar(@peval)." items. Use ".
+                    "CLEARQ to clear queue if needed.",$usernick,1);
+            Irpg::Irc::privmsg($_,$usernick) for @peval;
+        }
+        else { Irpg::Irc::privmsg($_,$usernick, 1) for @peval; }
+        Irpg::Irc::privmsg("EVAL ERROR: $@", $usernick, 1) if $@;
+    }
 }
 
 sub delold {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if ($arg[0] !~ /^[\d\.]+$/) {
-		Irpg::Irc::privmsg("Try: DELOLD <# of days>", $usernick, 1);
-	}
-	else {
-		my @oldaccounts = grep { (time()-$rps->{$_}{lastlogin}) >
-								 ($arg[0] * 86400) &&
-								 !$rps->{$_}{online} } keys(%$rps);
-		delete(@$rps->{@oldaccounts});
-		Irpg::Irc::chanmsg(scalar(@oldaccounts)." accounts not accessed in ".
-				"the last $arg[0] days removed by $usernick.");
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if ($arg[0] !~ /^[\d\.]+$/) {
+        Irpg::Irc::privmsg("Try: DELOLD <# of days>", $usernick, 1);
+    }
+    else {
+        my @oldaccounts = grep { (time()-$rps->{$_}{lastlogin}) >
+                                 ($arg[0] * 86400) &&
+                                 !$rps->{$_}{online} } keys(%$rps);
+        delete(@$rps->{@oldaccounts});
+        Irpg::Irc::chanmsg(scalar(@oldaccounts)." accounts not accessed in ".
+                "the last $arg[0] days removed by $usernick.");
+    }
 }
 
 sub delacct {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if (!defined($arg[0])) {
-	   Irpg::Irc::privmsg("Try: DEL <char name>", $usernick, 1);
-	}
-	elsif (!exists($rps->{$arg[0]})) {
-		Irpg::Irc::privmsg("No such account $arg[0].", $usernick, 1);
-	}
-	else {
-		delete($rps->{$arg[0]});
-		Irpg::Irc::chanmsg("Account $arg[0] removed by $usernick.");
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if (!defined($arg[0])) {
+       Irpg::Irc::privmsg("Try: DEL <char name>", $usernick, 1);
+    }
+    elsif (!exists($rps->{$arg[0]})) {
+        Irpg::Irc::privmsg("No such account $arg[0].", $usernick, 1);
+    }
+    else {
+        delete($rps->{$arg[0]});
+        Irpg::Irc::chanmsg("Account $arg[0] removed by $usernick.");
+    }
 }
 
 sub mkadmin {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if ($opts->{owneraddonly} && $opts->{owner} ne $username) {
-		Irpg::Irc::privmsg("You don't have access to MKADMIN.", $usernick);
-	}
-	elsif (!defined($arg[0])) {
-		Irpg::Irc::privmsg("Try: MKADMIN <char name>", $usernick, 1);
-	}
-	elsif (!exists($rps->{$arg[0]})) {
-		Irpg::Irc::privmsg("No such account $arg[0].", $usernick, 1);
-	}
-	else {
-		$rps->{$arg[0]}{isadmin}=1;
-		Irpg::Irc::privmsg("Account $arg[0] is now a bot admin.",$usernick, 1);
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if ($opts->{owneraddonly} && $opts->{owner} ne $usernick) {
+        Irpg::Irc::privmsg("You don't have access to MKADMIN.", $usernick);
+    }
+    elsif (!defined($arg[0])) {
+        Irpg::Irc::privmsg("Try: MKADMIN <char name>", $usernick, 1);
+    }
+    elsif (!exists($rps->{$arg[0]})) {
+        Irpg::Irc::privmsg("No such account $arg[0].", $usernick, 1);
+    }
+    else {
+        $rps->{$arg[0]}{isadmin}=1;
+        Irpg::Irc::privmsg("Account $arg[0] is now a bot admin.",$usernick, 1);
+    }
 }
 
 sub rmadmin {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if ($opts->{ownerdelonly} && $opts->{owner} ne $username) {
-		Irpg::Irc::privmsg("You don't have access to RMADMIN.", $usernick);
-	}
-	elsif (!defined($arg[0])) {
-		Irpg::Irc::privmsg("Try: RMADMIN <char name>", $usernick, 1);
-	}
-	elsif (!exists($rps->{$arg[0]})) {
-		Irpg::Irc::privmsg("No such account $arg[0].", $usernick, 1);
-	}
-	elsif ($arg[0] eq $opts->{owner}) {
-		Irpg::Irc::privmsg("Cannot RMADMIN owner account.", $usernick, 1);
-	}
-	else {
-		$rps->{$arg[0]}{isadmin}=0;
-		Irpg::Irc::privmsg("Account $arg[0] is no longer a bot admin.",
-				$usernick, 1);
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if ($opts->{ownerdelonly} && $opts->{owner} ne $usernick) {
+        Irpg::Irc::privmsg("You don't have access to RMADMIN.", $usernick);
+    }
+    elsif (!defined($arg[0])) {
+        Irpg::Irc::privmsg("Try: RMADMIN <char name>", $usernick, 1);
+    }
+    elsif (!exists($rps->{$arg[0]})) {
+        Irpg::Irc::privmsg("No such account $arg[0].", $usernick, 1);
+    }
+    elsif ($arg[0] eq $opts->{owner}) {
+        Irpg::Irc::privmsg("Cannot RMADMIN owner account.", $usernick, 1);
+    }
+    else {
+        $rps->{$arg[0]}{isadmin}=0;
+        Irpg::Irc::privmsg("Account $arg[0] is no longer a bot admin.",
+                $usernick, 1);
+    }
 }
 
 sub rehash {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	$opts = readconfig();
-	Irpg::Irc::privmsg("Reread config file.",$usernick,1);
-	$opts->{botchan} =~ s/ .*//; # strip channel key if present
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    $opts = readconfig();
+    Irpg::Irc::privmsg("Reread config file.",$usernick,1);
+    $opts->{botchan} =~ s/ .*//; # strip channel key if present
 }
 
 sub chpass {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if (!defined($arg[1])) {
-		Irpg::Irc::privmsg("Try: CHPASS <char name> <new pass>", $usernick, 1);
-	}
-	elsif (!exists($rps->{$arg[0]})) {
-		Irpg::Irc::privmsg("No such username $arg[0].", $usernick, 1);
-	}
-	else {
-		$rps->{$arg[0]}{pass} = crypt($arg[1],mksalt());
-		Irpg::Irc::privmsg("Password for $arg[0] changed.", $usernick, 1);
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if (!defined($arg[1])) {
+        Irpg::Irc::privmsg("Try: CHPASS <char name> <new pass>", $usernick, 1);
+    }
+    elsif (!exists($rps->{$arg[0]})) {
+        Irpg::Irc::privmsg("No such username $arg[0].", $usernick, 1);
+    }
+    else {
+        $rps->{$arg[0]}{pass} = crypt($arg[1],mksalt());
+        Irpg::Irc::privmsg("Password for $arg[0] changed.", $usernick, 1);
+    }
 }
 
 sub chuser {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	if (!defined($arg[1])) {
-		Irpg::Irc::privmsg("Try: CHUSER <char name> <new char name>",
-				$usernick, 1);
-	}
-	elsif (!exists($rps->{$arg[0]})) {
-		Irpg::Irc::privmsg("No such username $arg[0].", $usernick, 1);
-	}
-	elsif (exists($rps->{$arg[1]})) {
-		Irpg::Irc::privmsg("Username $arg[1] is already taken.", $usernick,1);
-	}
-	else {
-		$rps->{$arg[1]} = delete($rps->{$arg[0]});
-		Irpg::Irc::privmsg("Username for $arg[0] changed to $arg[1].",
-				$usernick, 1);
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    if (!defined($arg[1])) {
+        Irpg::Irc::privmsg("Try: CHUSER <char name> <new char name>",
+                $usernick, 1);
+    }
+    elsif (!exists($rps->{$arg[0]})) {
+        Irpg::Irc::privmsg("No such username $arg[0].", $usernick, 1);
+    }
+    elsif (exists($rps->{$arg[1]})) {
+        Irpg::Irc::privmsg("Username $arg[1] is already taken.", $usernick,1);
+    }
+    else {
+        $rps->{$arg[1]} = delete($rps->{$arg[0]});
+        Irpg::Irc::privmsg("Username for $arg[0] changed to $arg[1].",
+                $usernick, 1);
+    }
 }
 
 sub push {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	# insure it's a positive or negative, integral number of seconds
-	if ($arg[1] !~ /^\-?\d+$/) {
-		Irpg::Irc::privmsg("Try: PUSH <char name> <seconds>", $usernick, 1);
-	}
-	elsif (!exists($rps->{$arg[0]})) {
-		Irpg::Irc::privmsg("No such username $arg[0].", $usernick, 1);
-	}
-	elsif ($arg[1] > $rps->{$arg[0]}{next}) {
-		Irpg::Irc::privmsg("Time to level for $arg[0] ($rps->{$arg[0]}{next}s) ".
-				"is lower than $arg[1]; setting TTL to 0.",
-				$usernick, 1);
-		Irpg::Irc::chanmsg("$usernick has pushed $arg[0] ".
-				duration($rps->{$arg[0]}{next}).
-				" ($rps->{$arg[0]}{next} seconds) ".
-				"toward level ".($rps->{$arg[0]}{level}+1));
-		$rps->{$arg[0]}{next}=0;
-	}
-	else {
-		$rps->{$arg[0]}{next} -= $arg[1];
-		 Irpg::Irc::chanmsg("$usernick has pushed $arg[0] ".
-			 	 duration($arg[1])." ($arg[1] seconds) ".
-				 "toward level ".($rps->{$arg[0]}{level}+1).". ".
-				 "$arg[0] reaches next level in ".
-				 duration($rps->{$arg[0]}{next}).".");
-	}
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    # insure it's a positive or negative, integral number of seconds
+    if ($arg[1] !~ /^\-?\d+$/) {
+        Irpg::Irc::privmsg("Try: PUSH <char name> <seconds>", $usernick, 1);
+    }
+    elsif (!exists($rps->{$arg[0]})) {
+        Irpg::Irc::privmsg("No such username $arg[0].", $usernick, 1);
+    }
+    elsif ($arg[1] > $rps->{$arg[0]}{next}) {
+        Irpg::Irc::privmsg("Time to level for $arg[0] ($rps->{$arg[0]}{next}s) ".
+                "is lower than $arg[1]; setting TTL to 0.",
+                $usernick, 1);
+        Irpg::Irc::chanmsg("$usernick has pushed $arg[0] ".
+                duration($rps->{$arg[0]}{next}).
+                " ($rps->{$arg[0]}{next} seconds) ".
+                "toward level ".($rps->{$arg[0]}{level}+1));
+        $rps->{$arg[0]}{next}=0;
+    }
+    else {
+        $rps->{$arg[0]}{next} -= $arg[1];
+         Irpg::Irc::chanmsg("$usernick has pushed $arg[0] ".
+                  duration($arg[1])." ($arg[1] seconds) ".
+                 "toward level ".($rps->{$arg[0]}{level}+1).". ".
+                 "$arg[0] reaches next level in ".
+                 duration($rps->{$arg[0]}{next}).".");
+    }
 }
 
 sub bot_die {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	$opts->{reconnect} = 0;
-	writedb($rps);
-	Irpg::Irc::sts("QUIT :DIE from $usernick",1);
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    $opts->{reconnect} = 0;
+    writedb($rps);
+    Irpg::Irc::sts("QUIT :DIE from $usernick",1);
 }
 
 sub restart {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	writedb($rps);
-	Irpg::Irc::sts("QUIT :RESTART from $usernick",1);
-	#close($Irpg::Irc::sock);
-	#Irpg::Irc::irc_clean($opts);
-	exec("perl $0");
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    writedb($rps);
+    Irpg::Irc::sts("QUIT :RESTART from $usernick",1);
+    #close($Irpg::Irc::sock);
+    #Irpg::Irc::irc_clean($opts);
+    exec("perl $0");
 }
 
 sub do_backup {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	backup();
-	Irpg::Irc::privmsg("$opts->{dbfile} copied to ".
-			".dbbackup/$opts->{dbfile}".time(),$usernick,1);
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    backup();
+    Irpg::Irc::privmsg("$opts->{dbfile} copied to ".
+            ".dbbackup/$opts->{dbfile}".time(),$usernick,1);
 }
 
 sub clearq {
-	my ($userhost, $usernick, $username, $source, @arg) = @_;
-	undef(@Irpg::Irc::queue);
-	Irpg::Irc::chanmsg("Outgoing message queue cleared by $usernick.");
-	Irpg::Irc::privmsg("Outgoing message queue cleared.",$usernick,1);
+    my ($userhost, $usernick, $username, $source, @arg) = @_;
+    undef(@Irpg::Irc::queue);
+    Irpg::Irc::chanmsg("Outgoing message queue cleared by $usernick.");
+    Irpg::Irc::privmsg("Outgoing message queue cleared.",$usernick,1);
 }
 
 sub dump_rps {
-	use Data::Dumper;
-	print Dumper($rps);
+    use Data::Dumper;
+    print Dumper($rps);
 }
 
 
 our $commands = {
-	dumprps => {ref => \&dump_rps,	adm => 1, prv => 1, pub => 0,
-				hlp => 'DUMPRPS : dump the current state of %rps'},
+    dumprps => {ref => \&dump_rps, adm => 1, prv => 1, pub => 0,
+                hlp => 'DUMPRPS : dump the current state of %rps'},
 
-	go 		=> {ref => \&join_chans, adm => 1, prv => 1, pub => 0,
-				hlp => 'GO <chan>[ <chan> ...] : join the given chan(s)'},
+    go      => {ref => \&join_chans, adm => 1, prv => 1, pub => 0,
+                hlp => 'GO <chan>[ <chan> ...] : join the given chan(s)'},
 
-	leave 	=> {ref => \&leave_chans,adm => 1, prv => 1, pub => 0,
-				hlp => 'LEAVE <chan>[ <chan> ...] : join the given chan(s)'},
+    leave   => {ref => \&leave_chans,adm => 1, prv => 1, pub => 0,
+                hlp => 'LEAVE <chan>[ <chan> ...] : join the given chan(s)'},
 
-	peval	=> {ref => \&peval,		adm => 1,  prv => 1, pub => 0,
-				hlp => 'PEVAL <code> : execute arbitrary argument as Perl code. '.
-					   'Queues output > 3 lines or >1k of text.'},
+    peval   => {ref => \&peval,  adm => 1,  prv => 1, pub => 0,
+                hlp => 'PEVAL <code> : execute arbitrary argument as Perl code. '.
+                'Queues output > 3 lines or >1k of text.'},
 
-	delold 	=> {ref => \&delold,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'DELOLD <nday> : remove all non-logged-in accounts '.
-					   'inactive in the last <nday> days'},
+    delold  => {ref => \&delold,  adm => 1, prv => 1, pub => 0,
+                hlp => 'DELOLD <nday> : remove all non-logged-in accounts '.
+                'inactive in the last <nday> days'},
 
-	del		=> {ref => \&delacct,	 adm => 1, prv => 1, pub => 0,
-				hlp => ''},
+    del     => {ref => \&delacct,  adm => 1, prv => 1, pub => 0,
+                hlp => ''},
 
-	mkadmin => {ref => \&mkadmin,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'MKADMIN <username> : set the isadmin flag '.
-					   'for a given <username>'},
+    mkadmin => {ref => \&mkadmin,  adm => 1, prv => 1, pub => 0,
+                hlp => 'MKADMIN <username> : set the isadmin flag '.
+                'for a given <username>'},
 
-	rmadmin => {ref => \&rmadmin,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'MKADMIN <username> : remove the isadmin flag '.
-					   'for a given <username>'},
+    rmadmin => {ref => \&rmadmin,  adm => 1, prv => 1, pub => 0,
+                hlp => 'MKADMIN <username> : remove the isadmin flag '.
+                'for a given <username>'},
 
-	rehash	=> {ref => \&rehash,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'REHASH : reload configuration file.'},
+    rehash  => {ref => \&rehash,  adm => 1, prv => 1, pub => 0,
+                hlp => 'REHASH : reload configuration file.'},
 
-	chpass	=> {ref => \&chpass,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'CHPASS <char name> <new password> :'.
-					   'change a character\'s password.'},
+    chpass  => {ref => \&chpass,  adm => 1, prv => 1, pub => 0,
+                hlp => 'CHPASS <char name> <new password> :'.
+                'change a character\'s password.'},
 
-	chuser	=> {ref => \&chuser,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'CHUSER <char name> <new char name> :'.
-					   'change a character\'s name.'},
+    chuser  => {ref => \&chuser,  adm => 1, prv => 1, pub => 0,
+                hlp => 'CHUSER <char name> <new char name> :'.
+                'change a character\'s name.'},
 
-	push	=> {ref => \&push,		 adm => 1, prv => 1, pub => 0,
-				hlp => 'PUSH <char name> <seconds> : '.
-					   'remove <seconds> to a player\'s TTL. '.
-				   	   'Can be a negative number to add TTL.'},
+    push    => {ref => \&push,   adm => 1, prv => 1, pub => 0,
+                hlp => 'PUSH <char name> <seconds> : '.
+                'remove <seconds> to a player\'s TTL. '.
+                'Can be a negative number to add TTL.'},
 
-	die		=> {ref => \&bot_die,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'DIE : kills the bot.'},
+    die     => {ref => \&bot_die,  adm => 1, prv => 1, pub => 0,
+                hlp => 'DIE : kills the bot.'},
 
-	restart => {ref => \&restart,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'RESTART : restarts the bot.'},
+    restart => {ref => \&restart,  adm => 1, prv => 1, pub => 0,
+                hlp => 'RESTART : restarts the bot.'},
 
-	backup	=> {ref => \&do_backup,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'BACKUP : make a backup copy of the dbfile.'},
+    backup  => {ref => \&do_backup,  adm => 1, prv => 1, pub => 0,
+                hlp => 'BACKUP : make a backup copy of the dbfile.'},
 
-	clearq	=> {ref => \&clearq,	 adm => 1, prv => 1, pub => 0,
-				hlp => 'CLEARQ : clear the outgoing message queue. '.
-					   'Useful if the bot is flooded (and plans to respond). '}
+    clearq  => {ref => \&clearq,  adm => 1, prv => 1, pub => 0,
+                hlp => 'CLEARQ : clear the outgoing message queue. '.
+                'Useful if the bot is flooded (and plans to respond). '}
 };
 
 1;
diff --git a/Irpg/Classes/Barbarian.pm b/Irpg/Classes/Barbarian.pm
index 8d073172c063a0e4723d1a6ef8e898becf3084e7..872bf69c3ccbba989122be342a16aa7bc7fb9dfb 100644
--- a/Irpg/Classes/Barbarian.pm
+++ b/Irpg/Classes/Barbarian.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 11) {
+	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Bargainer.pm b/Irpg/Classes/Bargainer.pm
index db2f96f981b5f6ecd3be76bd2d8e424be3aabb1c..5f6c9e843b1497f60e1a389e1f50de1b83ff47d4 100644
--- a/Irpg/Classes/Bargainer.pm
+++ b/Irpg/Classes/Bargainer.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 11) {
+	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Cunning.pm b/Irpg/Classes/Cunning.pm
index 0364943b0fa56cd84591a0deff8b21ef044509bf..d0d6686d65a8caa967c2fd12bad015d8404f2577 100644
--- a/Irpg/Classes/Cunning.pm
+++ b/Irpg/Classes/Cunning.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 9) {
+	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 10) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Elite_Warrior.pm b/Irpg/Classes/Elite_Warrior.pm
index 775ead73198c4361da50f81ea764901433bf1cf2..480c6884dc9256893b51df0a60f112a6a1304699 100644
--- a/Irpg/Classes/Elite_Warrior.pm
+++ b/Irpg/Classes/Elite_Warrior.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 13) {
+	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 15) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Enchanter.pm b/Irpg/Classes/Enchanter.pm
index f40c598a345f44c06a15cf0ae19af71348b303c2..f2eeac2e3c65aa56d894608209db1ed7820751dd 100644
--- a/Irpg/Classes/Enchanter.pm
+++ b/Irpg/Classes/Enchanter.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 11) {
+	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Enlightened.pm b/Irpg/Classes/Enlightened.pm
index bfdc56a4c475d5c04782206e71dcc29f247f4f33..6fdb7604a04aebb3f62ac77eaacdfe79f6e829a7 100644
--- a/Irpg/Classes/Enlightened.pm
+++ b/Irpg/Classes/Enlightened.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 9) {
+	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 10) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Farmer.pm b/Irpg/Classes/Farmer.pm
index a94408ce9424788fb91b1158c601843c0520709c..b936cb372658e35d9d81755737bfaca5e7060d5e 100644
--- a/Irpg/Classes/Farmer.pm
+++ b/Irpg/Classes/Farmer.pm
@@ -17,7 +17,7 @@ sub new {
 	$self->{MOD_INT} = 1; # intelligence
 	$self->{MOD_CHA} = 1; # charisma
 	$self->{MOD_DEX} = 1; # dexterity
-	$self->{CRIT_SK} = 0.95; # critical strike minimum range, the lower the largest acceptance
+	$self->{CRIT_SK} = 0.90; # critical strike minimum range, the lower the largest acceptance
 	$self->{MOD_CRT} = 1; # criticak strike modificator
 	return $self;
 }
@@ -84,8 +84,8 @@ sub real_gain {
 	my ($self, $time) = @_;
 	return unless ($time =~ m/^-?\d+(?:\.\d+$)?/);
 	$time = $time >= 0 ?
-		$time*(1-($self->cha()-1)/20):	# add less time
-		$time*(1+($self->cha()-1)/20);	# remove more time
+		$time*(1-($self->cha()-1)/50):	# add less time
+		$time*(1+($self->cha()-1)/50);	# remove more time
 	return CORE::int($time);
 }
 
@@ -94,8 +94,8 @@ sub real_sum {
 	my ($self, $sum) = @_;
 	return unless ($sum =~ m/^-?\d+$/);
 	$sum = $sum >= 0 ?
-		$sum*(1+($self->str()-1)/20):
-		$sum*(1-($self->str()-1)/20);
+		$sum*(1+($self->str()-1)/50):
+		$sum*(1-($self->str()-1)/50);
 	return CORE::int($sum);
 }
 
@@ -104,8 +104,8 @@ sub real_lvl {
 	my ($self, $lvl) = @_;
 	return unless ($lvl =~ m/^-?\d+$/);
 	$lvl = $lvl >= 0 ?
-		$lvl*(1+($self->wis()-1)/20):
-		$lvl*(1-($self->wis()-1)/20);
+		$lvl*(1+($self->wis()-1)/50):
+		$lvl*(1-($self->wis()-1)/50);
 	return CORE::int($lvl);
 }
 
diff --git a/Irpg/Classes/Fighter.pm b/Irpg/Classes/Fighter.pm
index 262d040d2eb7db21b68f4c69acb26d2526ce4954..2d721a19dc6c2cc1d5956580f4b81ae7637da595 100644
--- a/Irpg/Classes/Fighter.pm
+++ b/Irpg/Classes/Fighter.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 9) {
+	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 10) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Godfather.pm b/Irpg/Classes/Godfather.pm
index b991bbdd7d815e0cdef8a08a568157a1b0e27042..dc055ef97879ce222f02de851e533e1ac9650e0d 100644
--- a/Irpg/Classes/Godfather.pm
+++ b/Irpg/Classes/Godfather.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 13) {
+	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 15) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/High_Mage.pm b/Irpg/Classes/High_Mage.pm
index 93b94fbaac57eeb26fd618cc5bac37a2ed7ba1be..3f7107df8d2a0c18f39b8a2cdd21cf694dc10001 100644
--- a/Irpg/Classes/High_Mage.pm
+++ b/Irpg/Classes/High_Mage.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 13) {
+	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 15) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Mage.pm b/Irpg/Classes/Mage.pm
index 57c8daeabd6f738e1853eb27d195950c4180e815..2255110681ae89af47b773c566524ebcdf7128b0 100644
--- a/Irpg/Classes/Mage.pm
+++ b/Irpg/Classes/Mage.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 11) {
+	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Master_Enchanter.pm b/Irpg/Classes/Master_Enchanter.pm
index 000d7fb64c8a57c8164a7a626745421dc1f79eda..0a6b5fffc979a9659632ee030f93ee0652ac714e 100644
--- a/Irpg/Classes/Master_Enchanter.pm
+++ b/Irpg/Classes/Master_Enchanter.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 13) {
+	if ($pl_stats->{'wis'} < 16) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Merchant.pm b/Irpg/Classes/Merchant.pm
index d30b8c26fbdff0e78f476d8ff0215132b35ee987..c63ed950b6a0faa7c747dc5f12b4474560d42bb6 100644
--- a/Irpg/Classes/Merchant.pm
+++ b/Irpg/Classes/Merchant.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 13) {
+	if ($pl_stats->{'cha'} < 16) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Officer.pm b/Irpg/Classes/Officer.pm
index 9318c1dea84c6b7089e738bc87d9feb0eba7699b..1f1e039f60af3a87afa3177ba1ca2b5966142d1f 100644
--- a/Irpg/Classes/Officer.pm
+++ b/Irpg/Classes/Officer.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 13) {
+	if ($pl_stats->{'con'} < 16) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Old_Wizard.pm b/Irpg/Classes/Old_Wizard.pm
index 5d85a61334d56f3403d652220c712b4a2fc79151..0f8150158ff80f5504251e5c7ece1946801dd56d 100644
--- a/Irpg/Classes/Old_Wizard.pm
+++ b/Irpg/Classes/Old_Wizard.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 13) {
+	if ($pl_stats->{'int'} < 16) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Shadow.pm b/Irpg/Classes/Shadow.pm
index 9a85b4c6337dfee7c9cefc5ea64fb60d78f33906..4b2a3dc38356e2a21a29207c57e2450772412480 100644
--- a/Irpg/Classes/Shadow.pm
+++ b/Irpg/Classes/Shadow.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 13) {
+	if ($pl_stats->{'dex'} < 16) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Soldier.pm b/Irpg/Classes/Soldier.pm
index 8efd0120ca26d29b2e7d3ac28e68ea8b769c220e..9b32b7bda752eeff17754ebd87ca7a2f8b92924a 100644
--- a/Irpg/Classes/Soldier.pm
+++ b/Irpg/Classes/Soldier.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 11) {
+	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Swindler.pm b/Irpg/Classes/Swindler.pm
index 670b2ef07ae72b880051d6c16dee5f9dac339ad6..8b5fa8ed049d23d3e51a1befff3b591889aee9ea 100644
--- a/Irpg/Classes/Swindler.pm
+++ b/Irpg/Classes/Swindler.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 11) {
+	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Thief.pm b/Irpg/Classes/Thief.pm
index 233876ea737bfdbb49b7b7995878392e1a35d512..cc5d2af02ecd0042e7bf03b46be5d581efb31a22 100644
--- a/Irpg/Classes/Thief.pm
+++ b/Irpg/Classes/Thief.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 11) {
+	if ($pl_stats->{'cha'} + $pl_stats->{'dex'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Tribe_Chief.pm b/Irpg/Classes/Tribe_Chief.pm
index ae34a68fa6c31e3863837439a723ea87cbc997d7..af674d0bc366ffb9e2ede508e889aa478b2b29c2 100644
--- a/Irpg/Classes/Tribe_Chief.pm
+++ b/Irpg/Classes/Tribe_Chief.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 13) {
+	if ($pl_stats->{'str'} < 16) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Warrior.pm b/Irpg/Classes/Warrior.pm
index 5c004c8fead7ed962b873bab41ae9be6b4305513..3ab9210f49b473a2055b449446559c581c9306c1 100644
--- a/Irpg/Classes/Warrior.pm
+++ b/Irpg/Classes/Warrior.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 11) {
+	if ($pl_stats->{'str'} + $pl_stats->{'con'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Classes/Wizard.pm b/Irpg/Classes/Wizard.pm
index a0cd2abd103d52f5b5c41063302513cfbc4b2811..4b6e3bc257d869a0863db4f5932a7c5e260f6250 100644
--- a/Irpg/Classes/Wizard.pm
+++ b/Irpg/Classes/Wizard.pm
@@ -9,7 +9,7 @@ sub new {
 	my ($class, $pl_stats) = @_;
 
 	# condition to enter the class
-	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 11) {
+	if ($pl_stats->{'int'} + $pl_stats->{'wis'} < 12) {
 		return undef;
 	}
 
diff --git a/Irpg/Main.pm b/Irpg/Main.pm
index 1b716794333bdcc623eead131e49792304269564..0cf90c1f2d2d6da7a2d57f95bcd434cdf26ddc24 100644
--- a/Irpg/Main.pm
+++ b/Irpg/Main.pm
@@ -343,15 +343,6 @@ sub rpcheck { # check levels, update database
                 find_item($k);
                 challenge_opp($k);
             }
-            #if ($rps->{$k}{next_a} < 1
-            #    && $rps->{$k}{actions} < int($rps->{$k}{level}/10)) {
-            #    $rps->{$k}{actions}++;
-            #    if ($rps->{$k}{actions} < int($rps->{$k}{level}/10)) {
-            #        $rps->{$k}{next_a} = 3600
-            #    }
-            #    Irpg::Irc::notice("You feel ready to perform a new deed !",
-            #                      $rps->{$k}{nick});
-            #}
             if ($rps->{$k}{actions} + @{$rps->{$k}{next_a}} < int($rps->{$k}{level}/10)) {
                 Irpg::Action::new_action($k);
             }
@@ -483,7 +474,7 @@ sub parse {
         $opts->{botchan} =~ s/ .*//; # strip channel key if present
     }
     elsif ($arg[1] eq '315') {
-        # 315 is /WHO end. report who we automagically signed online iff it will
+        # 315 is /WHO end. report who we automagically signed online if it will
         # print < 1k of text
         if (keys(%auto_login)) {
             # not a true measure of size, but easy
@@ -597,7 +588,7 @@ sub help {
     my ($userhost, $usernick, $username, $source, @arg) = @_;
     my $ctxt = $source =~ m/^#/ ? 'pub' : 'prv';
     my $ret = '';
-    my $isadmin = $rps->{$username}{isadmin};
+    my $isadmin = defined($username) ? $rps->{$username}{isadmin} : 0;
     if (!exists($arg[0])) {
         $ret = "Available commands : ".
             join(', ', grep({ $commands{$_}->{$ctxt}
diff --git a/Irpg/Users.pm b/Irpg/Users.pm
index b251082262eedfae2126a8d2b4ca28ecc83c5bb1..5d80c20bfbc682900554e5778bb10feae8d67294 100644
--- a/Irpg/Users.pm
+++ b/Irpg/Users.pm
@@ -97,7 +97,7 @@ sub register {
                 $rps->{$arg[0]}{stats}{$_} = 1;
             }
             $rps->{$arg[0]}{class} = Irpg::Classes::Farmer->new($rps->{$arg[0]}{stats});
-            $rps->{$arg[0]}{points} = 1;
+            $rps->{$arg[0]}{points} = 0;
             $rps->{$arg[0]}{actions} = 0;
             $rps->{$arg[0]}{next_f} = 0;
             $rps->{$arg[0]}{online} = 1;
@@ -210,7 +210,10 @@ sub logout {
 sub status {
     return unless ($opts->{statuscmd});
     my ($userhost, $usernick, $username, $source, @arg) = @_;
-    my $asked = exists($arg[0]) ? $arg[0] : $username;
+    my $asked = exists($arg[0]) ?
+                    $arg[0] :
+                    (defined($username) ?
+                        $username : $usernick);
 
     $asked = Irpg::Main::finduser($asked) unless (exists($rps->{$asked}));
     $asked = Irpg::Main::finduser($asked, 1) unless ($asked);
diff --git a/Irpg/Utils.pm b/Irpg/Utils.pm
index a475b4558de824e493d3de557b8e0be8eadf8f9e..725bdcb7df7d04fe6f746e6a4c8d062cf78c8b95 100644
--- a/Irpg/Utils.pm
+++ b/Irpg/Utils.pm
@@ -304,6 +304,9 @@ sub loaddb { # load the players database
         $classname =~ s/ /_/g;
         $rps->{$i[0]}{class} = eval 'Irpg::Classes::'.$classname.
                                     '->new($rps->{$i[0]}{stats})';
+        if (! defined($rps->{$i[0]}{class})) {
+            $rps->{$i[0]}{class} = eval 'Irpg::Classes:Farmer->new($rps->{$i[0]}{stats})';
+        }
         $rps->{$i[0]}{next_a} = ();
     }
     close(RPS);