#include <sys/types.h>
#include <stdio.h>
#include <syslog.h>
#include "define.h"
#include "struct.h"
const char* level_name( int i )
{
char* tmp = static_string( );
if( i < LEVEL_AVATAR )
sprintf( tmp, "level %d", i );
else
sprintf( tmp, "a%s %s",
isvowel( *imm_title[ i-LEVEL_AVATAR ] ) ? "n" : "",
imm_title[ i-LEVEL_AVATAR ] );
return tmp;
}
void do_level( char_data* ch, char* argument )
{
int i;
if( is_confused_pet( ch ) )
return;
if( *argument != '\0' ) {
if( !number_arg( argument, i ) )
send( ch, "Unknown syntax - see help level.\n\r" );
else if( i > LEVEL_HERO )
send( ch, "Gaining levels beyond %d via exp is impossible.\n\r",
LEVEL_HERO );
else if( i < 2 )
send( ch, "Levels below 2 do not require exp.\n\r" );
else
send( ch, "Gaining level %s costs %d exp.\n\r",
number_word( i, ch ), exp_for_level( i-1 ) );
return;
}
if( is_mob( ch ) )
return;
if( ch->shdata->level >= LEVEL_AVATAR ) {
send( ch, "You are level %d.\n\r", ch->shdata->level );
return;
}
send( ch, "You need %d exp and %d quest points to level.\n\r",
exp_for_level( ch )-ch->exp, 0 );
send( ch, "[ You have acquired %d exp points so far. ]\n\r",
ch->exp );
}
void advance_level( char_data* ch, bool message )
{
char buf [ MAX_STRING_LENGTH ];
int clss = ch->pcdata->clss;
int add_hp;
int add_mana;
int add_move;
int pracs = 0;
bool regain;
if( ch->species != NULL )
return;
ch->shdata->level++;
regain = ( ch->pcdata->max_level != -1 );
if( message ) {
send( ch, "\n\r-=-= CONGRATS!!! =-=-\n\r\n\r" );
send( ch, "You have %sgained level %d.\n\r",
regain ? "re" : "", ch->shdata->level );
send( ch, "You need %d exp for the next level.\n\r",
exp_for_level( ch )-ch->exp );
sprintf( buf, "%s has %sgained level %d.", ch->descr->name,
regain ? "re" : "", ch->shdata->level );
info( buf, LEVEL_BUILDER, buf, IFLAG_LEVELS, regain ? 2 : 1, ch );
}
if( ch->pcdata->max_level == ch->shdata->level ) {
ch->pcdata->max_level = -1;
ch->base_hit = ch->pcdata->level_hit;
ch->base_mana = ch->pcdata->level_mana;
ch->base_move = ch->pcdata->level_move;
}
else {
add_hp = number_range( clss_table[ clss ].hit_min,
clss_table[ clss ].hit_max );
add_mana = number_range( clss_table[ clss ].mana_min,
clss_table[ clss ].mana_max );
add_move = number_range( clss_table[ clss ].move_min,
clss_table[ clss ].move_max );
ch->base_hit += add_hp;
ch->base_mana += add_mana;
ch->base_move += add_move;
if( ch->pcdata->max_level == -1 ) {
if( ( pracs = 12-ch->shdata->level ) > 0 ) {
if( message )
send( ch, "\n\r>> You gain %d practice point%s. <<\n\r\n\r",
pracs, pracs == 1 ? "" : "s" );
ch->pcdata->practice += pracs;
}
remove_bit( ch->pcdata->pfile->flags, PLR_FAMILIAR );
}
}
if( message ) {
sprintf( buf, "%sained level %d.",
regain ? "Reg" : "G", ch->shdata->level );
player_log( ch, buf );
}
ch->pcdata->pfile->level = ch->shdata->level;
calc_resist( ch );
update_maxes( ch );
}
void lose_level( char_data* ch )
{
char tmp [ ONE_LINE ];
int add_hp;
int add_mana;
int add_move;
if( ch->pcdata == NULL || ch->shdata->level < 2 )
return;
if( ch->pcdata->max_level == -1 ) {
ch->pcdata->max_level = ch->shdata->level;
ch->pcdata->level_hit = ch->base_hit;
ch->pcdata->level_mana = ch->base_mana;
ch->pcdata->level_move = ch->base_move;
}
ch->shdata->level--;
ch->pcdata->pfile->level = ch->shdata->level;
if( ch->shdata->level < LEVEL_BUILDER ) {
sprintf( tmp, "%s has lost a level.", ch->descr->name );
info( tmp, LEVEL_BUILDER, tmp, IFLAG_LEVELS, 2, ch );
}
add_hp = ( ch->base_hit-20 )/( ch->shdata->level );
add_mana = ( ch->base_mana-50 )/( ch->shdata->level );
add_move = ( ch->base_move-100 )/( ch->shdata->level );
ch->base_hit -= add_hp;
ch->base_mana -= add_mana;
ch->base_move -= add_move;
calc_resist( ch );
update_maxes( ch );
send( ch, "You have lost a level!\n\r" );
}
/*
* EXPECTED FUNCTIONS (PLAYER)
*/
float Player_Data :: Mean_Hp( )
{
return 20+(shdata->level-1)*(clss_table[ pcdata->clss ].hit_min
+clss_table[ pcdata->clss ].hit_max)/2;
}
float Player_Data :: Mean_Mana( )
{
return 50+(shdata->level-1)*(clss_table[ pcdata->clss ].mana_min
+clss_table[ pcdata->clss ].mana_max)/2;
}
float Player_Data :: Mean_Move( )
{
return 100+(shdata->level-1)*(clss_table[ pcdata->clss ].move_min
+clss_table[ pcdata->clss ].move_max)/2;
}
/*
* EXPECTED FUNCTIONS (MOB)
*/
float Mob_Data :: Mean_Hp( )
{
return 0;
}
float Mob_Data :: Mean_Mana( )
{
return 0.;
}
float Mob_Data :: Mean_Move( )
{
return 0.;
}