// by bugbug & alading @ 缥缈水云间, 2003-4-5
// damage.c
//modified by gamer@88 2004.02
#include <ansi.h>
#include <dbase.h>
#include <login.h>
#include <move.h>

void remove_faint(object me);

int ghost = 0;

int is_ghost() { return ghost; }

int self_purge()
{
 	object me=this_object();
        object link_ob = me->query_temp("link_ob");
 
        if( !userp(me) ) return 0;
        if (
	    // Removed since we don't use this part. Dream 12/11/97.
	    // Re-removed again on the same day :-)
	    (int)me->query("max_gin") > 0 &&
            (int)me->query("max_kee") > 0 &&
            (int)me->query("max_sen") > 0 ) return 0;
	set_heart_beat(0);
 	ghost =1;
 	me->move("/d/death/block.c");
 	CHANNEL_D->do_channel(me, "rumor", me->query("name")
 		+ "因为年纪太大，心力交瘁，不幸与世长辞，永远离开了我们！"); 
        return 1;
}

void gameover()
{
    object me = this_object();
	   
    //currently, only move the player to /d/death/block.c
    if( !userp(me) ) return;

    
    me->move("/d/death/block.c");
    if( !me->query("life/death_announced") )
    {
	me->set("life/death_announced", 1);
        CHANNEL_D->do_channel(load_object(COMBAT_D), "rumor", me->query("name")
            + "寿终正寝，永远地离开了我们。");
    }		    
}


int check_gameover()
{//weiqi, 981231
    object me = this_object();
	  
    if( wizardp(me) ) return 0;
    if( !userp(me) ) return 0;
		  
    if (me->query("age") <= me->query("life/life_time")) return 0;
		      
    //now gameover le
    gameover();
    return 1;
}

void announce_live_forever(string reason)
{
    object me = this_object();
    object dadi;

    if( !reason ) return;
    
    if( me->query("life/live_forever_announced") ) return;

    me->set("life/live_forever_announced", 1);
    me->set("life/live_forever", 1);
    me->set("life/life_time",188+random(12));
    dadi = new("/d/wiz/npc/dadi.c");
    dadi->move(environment(me));

    message_vision(HIY"只听一阵仙乐缥缈，一驾五彩云车从天缓缓而降。\n"NOR, dadi);
    message_vision(HIY"$N从车上立起身来对$n一拱手：恭喜！恭喜！\n"NOR, dadi, me);
    dadi->command_function("chat "+reason);
    message_vision(HIY"$N一挥手，云车渐渐淡去...\n"NOR, dadi);
    destruct(dadi);

    return;
}
varargs int receive_damage(string type, int damage, object who,string kind) 
{
	
	int val,lucky;
	
	object me;
	me=this_object();
	if( damage < 0 ) error("F_DAMAGE: 伤害值为负值。\n");
	if( type!="gin" && type!="kee" && type!="sen" )
		error("F_DAMAGE: 伤害种类错误( 只能是 gin, kee, sen 其中之一 )。\n");

	
	if(objectp(who)&&kind)
	damage = WUXING_D->query_total_damage(who,me,damage,type,kind); // who is the attacker,me is the receiver
	
	if( objectp(who) ) {
	    if(objectp(who->query_temp("invoker")))
		who=who->query_temp("invoker");
	    set_temp("last_damage_from", who);
	}
	if(me->query_temp("combat/lucky")) //ranger from -10 to 10
	{
		if(!me->query_temp("pending/exercising")&&!me->query_temp("pending/meditating"))
		{
			lucky=random(13+me->query_temp("combat/lucky"));
			if(me->query_temp("combat/lucky") > 9)
				lucky = 10+random(11);
			if(me->query_temp("combat/lucky") < -9)
				lucky = random(3);
			if(me->query_temp("combat/lucky") < 0 )
			{
				if(lucky < 1)	damage += damage/3;
				else if(lucky < 3) damage += damage/6;
				else if (lucky < 5) damage += damage/10;
				
				
			}
			else 
			{
				if(lucky > 18) damage -= damage/5;
				else if(lucky > 15) damage -= damage/8;
				else if(lucky > 10) damage -= damage/15;
				
				
			}
		}	
	
	}

	val = (int)query(type) - damage;

	if( val >= 0 ) set(type, val);
	else {
	  if(type == "kee")
	  {
		  if(query_temp("apply/preservation_kee"))	
		  	set(type, val);
		  else set( type, -1 );
	}
	 if(type == "sen")
	  {
	  if(query_temp("apply/preservation_sen"))	
	  	set(type, val);
	  else set( type, -1 );
	}
	  //added by mon for pk and nk.
	  if(living(this_object())&&objectp(who)&&userp(who)
	     &&!query_temp("last_fainted_from")
	     //must not be fainted before within 60 sec.
	     ) {
	    set_temp("last_fainted_from",who->query("id"));
	    if(userp(this_object()))
	      call_out("remove_faint",90,this_player());
	    //prevent help other to faint a npc or player
	    //and to get daoxing.
	    //has to wait 60 second after the faint.
	    //for NPC, the last_fainted_from mark will not
	    //be erased, so only the first one who faint a npc
	    //can possibly get dx. One can't help others to
	    //faint a npc.
          }
        }

        set_heart_beat(HEART_BEAT_TICK);

	return damage;
}

void remove_faint(object me)
{ 
	 if(me)
	 { me->delete_temp("last_fainted_from");
	   me->delete_temp("last_damage_from");
	}
	 
	 
 }

varargs int receive_wound(string type, int damage, object who)
{
	int val;
        if( damage < 0 ) damage = 0;
	if( damage < 0 ) error("F_DAMAGE: 伤害值为负值。\n");
	if( type!="gin" && type!="kee" && type!="sen" )
		error("F_DAMAGE: 伤害种类错误( 只能是 gin, kee, sen 其中之一 )。\n");

	if( objectp(who) ) {
	    if(objectp(who->query_temp("invoker")))
		who=who->query_temp("invoker");
	    set_temp("last_damage_from", who);
	}

	val = (int)query("eff_" + type) - damage;

	if( val >= 0 ) set("eff_" + type, val);
	
	else {
		 if(type == "kee")
	  {
	  if(query_temp("apply/preservation_kee"))	
	  	set("eff_" + type, val);
	  else {set( "eff_" + type, -1 );val = -1;}
	}
	 if(type == "sen")
	  {
		  if(query_temp("apply/preservation_sen"))	
		  	set("eff_" + type, val);
		  else {set( "eff_" + type, -1 );val = -1;}
	}
	  //added by mon for pk and nk.
	  if(living(this_object())&&objectp(who)&&userp(who)
	     &&!query_temp("last_fainted_from")
	     //must not be fainted before within 60 sec.
	     ) {
	    set_temp("last_fainted_from",who->query("id"));
	    if(userp(this_object()))
	      call_out("remove_faint",60,this_player());
	    //prevent help other to faint a npc or player
	    //and to get daoxing.
	    //has to wait 60 second after the faint.
	    //for NPC, the last_fainted_from mark will not
	    //be erased, so only the first one who faint a npc
	    //can possibly get dx. One can't help others to
	    //faint a npc.
          }
	}

	if( (int)query(type) > val ) set(type, val);

       set_heart_beat(HEART_BEAT_TICK);

	return damage;
}

int receive_heal(string type, int heal)
{
	int val;

	if( heal < 0 ) error("F_DAMAGE: 恢复值为负值。\n");
	if( type!="gin" && type!="kee" && type!="sen" )
		error("F_DAMAGE: 恢复种类错误( 只能是 gin, kee, sen 其中之一 )。\n");

	if(query("special_skill/constitution")&&query("age")>17&&type == "kee")
		heal += heal/4;
	else if(query("special_skill/spirituality")&&query("age")>17&&type == "sen")
		heal += heal/4;	
		
	val = (int)query(type) + heal;

	if( val > (int)query("eff_" + type) ) set(type, (int)query("eff_" + type));
	else set( type, val );

	return heal;
}

int receive_curing(string type, int heal)
{
	int max, val;

	if( heal < 0 ) error("F_DAMAGE: 恢复值为负值。\n");
	if( type!="gin" && type!="kee" && type!="sen" )
		error("F_DAMAGE: 恢复种类错误( 只能是 gin, kee, sen 其中之一 )。\n");
	if(query("special_skill/constitution")&&query("age")>17&&type == "kee")
		heal += heal/4;
	else if(query("special_skill/spirituality")&&query("age")>17&&type == "sen")
		heal += heal/4;	
	val = (int)query("eff_" + type);
	max = (int)query("max_" + type);

	if( val + heal > max ) {
		set("eff_" + type, max);
		return max - val;
	} else {
		set( "eff_" + type, val + heal);
		return heal;
	}
}

// snowcat feb 8 1998 
void remove_ride ()
{
	object rider, ridee;
	
	if (ridee = query_temp("ridee"))
		ridee->delete_temp("rider");
       	delete_temp("ridee");
       	add_temp("apply/dodge",-query_temp("ride/dodge"));
       	set_temp("ride/dodge",0);
        if (rider = query_temp("rider"))
        	rider->remove_ride();
       	delete_temp("rider");
}

void unconcious()
{
	object defeater;

	if (environment() && environment()->query("alternative_die")) {
	  environment()->alternative_die(this_object());
	  return;
	}
	
	if( !living(this_object()) ) return;
	if( wizardp(this_object()) && query("env/immortal") ) return;

	if( objectp(defeater = query_temp("last_damage_from")) )
		COMBAT_D->winner_reward(defeater, this_object());

	this_object()->remove_all_enemy();
	remove_ride();

 	message("system", HIR "\n你的眼前一黑，接着什么也不知道了．．．\n\n" NOR,
		this_object());
	this_object()->disable_player(" <昏迷不醒>");
	set("gin", 0);
	set("kee", 0);
	set("sen", 0);
	set_temp("block_msg/all", 1);
	COMBAT_D->announce(this_object(), "unconcious");

	call_out("revive", random(108 - query("con")) + 36);
}

varargs void revive(int quiet)
{
	remove_call_out("revive");

//	delete_temp("last_fainted_from");
	// revive will not remove this mark.

        delete_temp("no_move");
	//sometimes players still set no_move after death
	//and can't be cleared.
	if(this_object()->is_busy()) this_object()->start_busy(1);
	//clear the busy flag.

	while( environment()->is_character() )
		this_object()->move(environment(environment()));
	this_object()->enable_player();
	if( !quiet ) {
		COMBAT_D->announce(this_object(), "revive");
		set_temp("block_msg/all", 0);
		message("system", HIY "\n慢慢地你终于又有了知觉．．．\n\n" NOR,
			this_object());
	} else
		set_temp("block_msg/all", 0);
}
void die()
{
ghost = "/feature/damagedie"->die(this_object());	
}
void olddieeeee()
{
	object corpse, killer,guai;
	object fan,xiang,bian;
	int dead;
	object *inv;
	int i,times;
	string last_fainted_from, str;
        object me = this_object();
	if (environment() && environment()->query("alternative_die")) {
	  environment()->alternative_die(this_object());
	  return;
	}
	
        if (query_temp("last_fainted_from")) 
	   last_fainted_from=query_temp("last_fainted_from");

	if( !living(this_object()) ) revive(1);
	if( wizardp(this_object()) && query("env/immortal") ) return;

	// Clear all the conditions by death.
	

        //needed because last_fainted_from is cleared in revive()
	if (last_fainted_from) 
	  set_temp("last_fainted_from",last_fainted_from);

    	COMBAT_D->announce(this_object(), "dead");
 
	if (me->query("dajiu_busy") > time())
	    {
			 guai = me->query_temp("last_damage_from");
			
		        if (guai&&guai->query("mark") == me->query_temp("dajiu/mark") )
		        {
		               times = me->query_temp("dajiu/count")+3;
			      if(me->query_temp("dajiu/die") < times)
		        	{
				        message_vision(BLINK+YEL"突然天空中散出一道圣光，笼罩住$N全身。\n"NOR,me);
				        me->set("eff_kee",me->query("max_kee"));
				        me->set("eff_sen",me->query("max_sen"));
				        me->set("kee",me->query("max_kee"));
				        me->set("sen",me->query("max_sen"));
				        me->set("force",2*me->query("max_force"));
				        me->set("mana",2*me->query("max_mana"));
				        me->add("dajiu/exp",-me->query("combat_exp")/6666);
				        me->add("dajiu/dx",-me->query("daoxing")/6666);
				        me->add("combat_exp",-me->query("combat_exp")/6666);
				        me->add("daoxing",-me->query("daoxing")/6666);	
	        
				        me->start_busy(1);
				        me->add("dajiu/die",1);
				         me->add_temp("dajiu/die",1);
			        }
			        else
			        {
				        fan=present("dingyao fan",me);
					xiang=present("baibao xiang",me);
					bian=present("dashen bian",me);
				        message_vision(HIY" 突然半空中一只大手一把抓住$N,一下子就不见了\n"NOR,me);
				        me->clear_condition();
       					me->delete("dajiu_busy");
				        me->unconcious();
				        me->set("eff_kee",me->query("max_kee"));
				        me->set("eff_sen",me->query("max_sen"));
				        me->set("kee",me->query("max_kee")/3);
				        me->set("sen",me->query("max_sen")/3);
				        me->add("dajiu/exp",-me->query("combat_exp")/2100);
				        me->add("dajiu/dx",-me->query("daoxing")/2100);
				        me->add("combat_exp",-me->query("combat_exp")/2100);
				        me->add("daoxing",-me->query("daoxing")/2100);	
				        me->add("dajiu/die",1);
				        me->delete_temp("dajiu");
				        me->remove_ride();
				        me->move("/d/wiz/entrance");
				        message_vision(HIY"姜子牙盯着$N,摇了摇头说:看来你的修行不够,不可担当大任。说完伸手在$N顶门一拍\n"NOR,me);
				       if(fan) 
				      	 destruct(fan);
				        if(xiang) 
				      	 destruct(xiang);
				      	if(bian) 
				      	 destruct(bian);
						
			
			        }
			       	return;
			}
		}

	if ( me->query("xian/get")+900 > time() )
	    {
			guai = me->query("xian/guai");        
	        if ( guai && (guai == me->query_temp("last_damage_from") || guai == me->query_temp("last_opponent")) )
	        {
		        message_vision(HIY" 突然半空中一只大手一把抓住$N,一下子就不见了\n"NOR,me);
		        me->set("eff_kee",me->query("max_kee"));
		        me->set("eff_sen",me->query("max_sen"));
		        me->set("kee",me->query("max_kee")/3);
		        me->set("sen",me->query("max_sen")/3);
		        me->add("combat_exp",-me->query("combat_exp")/1600);
		        me->add("daoxing",-me->query("daoxing")/1600);	// alading  2002-6-2
		        me->add("xian_log/die",1);
		        me->delete("xian/get");
		        me->set("xian/fail",1);
		        remove_ride();
		        me->move("/d/quest/yuxugong");
		        message_vision(HIY"原始天尊盯着$N,摇了摇头说:看来你的修行不够,不可担当大任。说完伸手在$N顶门一拍\n"NOR,me);
		         me->clear_condition();
			me->unconcious();
			return;
			}
		}
	
if ( me->query("yao/get") + 900 > time() )
           {
               	guai = me->query("yao/guai");        
                	if ( guai && (guai == me->query_temp("last_damage_from") 
               	|| guai == me->query_temp("last_opponent")) )
                	     {
                                message_vision(HIY" 突然半空中一只大手一把抓住$N,一下子就不见了\n"NOR,me);
                	     	me->set("eff_kee",me->query("max_kee"));
                	     	me->set("eff_sen",me->query("max_sen"));
                	     	me->set("kee",me->query("max_kee")/3);
                	     	me->set("sen",me->query("max_sen")/3);
                                me->add("combat_exp",-me->query("combat_exp")/1600);
                                me->add("daoxing",-me->query("daoxing")/1600);
                                me->add("yao_log/die",1);
                                me->delete("yao/get");
                                me->set("yao/fail",1);
                                remove_ride();
                                me->move("/d/quest/bixiaogong");
                   message_vision(HIY"通天教主盯着$N,狠狠的说:没用的东西,不可担当大任。说完伸手在$N顶门一拍\n"NOR,me);
		                me->clear_condition();
		                me->unconcious();
		                return;
		              }
		 }
	
	
	this_object()->clear_condition();

	inv = all_inventory(this_object());
	for(i=0; i<sizeof(inv); i++)
	{
		if( inv[i]->query("owner_id") == getuid(this_object()) )
		{
        tell_object(this_object(), HIB+"你看到" + inv[i]->query("name") +
			HIB + "破空而去，慢慢消失在天际．．．\n"+NOR);
            destruct( inv[i] );
         }
    }

        if( (int)this_object()->query("max_gin") > 0 && 
	    (int)this_object()->query("max_kee") > 0 &&
            (int)this_object()->query("max_sen") > 0 ) {
	    //no damage to self_purged people.

	if( objectp(killer = query_temp("last_damage_from")) ) {
		set_temp("my_killer", killer->query("id"));
		COMBAT_D->killer_reward(killer, this_object());
		if(userp(this_object()))
		  log_file("death",sprintf("[%s] %s is killed by %s.\n",
		    ctime(time()),this_object()->query("id"),
		    killer->query("id")));
	} else {    //no obvious killer. by mon 8/17/97
	            //for example, by poison.
          if(userp(this_object())) {
            COMBAT_D->victim_penalty(this_object());
	    if(str=this_object()->query_temp("death_msg"))  
	         //can set customized death message to death_msg.
	      str=this_object()->name(1)+str;
	    else  str=this_object()->name(1)+"莫名其妙地死了。\n";
            COMBAT_D->announce(this_object(), "death_rumor", str);
	    log_file("death",sprintf("[%s] %s is killed: %s.\n",
		  ctime(time()),this_object()->query("id"),
		  str));
          }
	}
        }

	remove_ride();

	if( objectp(corpse = CHAR_D->make_corpse(this_object(), killer)) )
		corpse->move(environment());

	this_object()->remove_all_killer();
	all_inventory(environment())->remove_killer(this_object());

	this_object()->dismiss_team();
 	if (this_object()->self_purge()) return;

	if( userp(this_object()) ) {
		set("gin", 1);	set("eff_gin", 1);
		set("kee", 1);	set("eff_kee", 1);
		set("sen", 1);	set("eff_sen", 1);
		add("life/death_num",1);
		//here is a good point to decrease life time...weiqi,98/12/31
		if( !this_object()->query("life/life_time") ) this_object()->set("life/life_time", 60);
		if( !this_object()->query("life/no_death_decrease") )
			this_object()->set("life/life_time", (int)this_object()->query("life/life_time")-1);
		//now we check if gameover.
		if( check_gameover() ) return;
		this_object()->delete_temp("last_damage_from");
		this_object()->delete_temp("last_fainted_from");
		this_object()->delete_temp("death_msg");
		//bugbug,2002-5-14,delete all flags
		ghost = 1;
		this_object()->move(DEATH_ROOM);
		DEATH_ROOM->start_death(this_object());
	} else
		destruct(this_object());
}

void reincarnate()
{
	ghost = 0;
// drop all, or they could take a ghost out of hell.
	command("drop all");
	set("eff_gin", query("max_gin"));
	set("eff_kee", query("max_kee"));
	set("eff_sen", query("max_sen"));
}

int max_food_capacity() 
{ 
	int final;
	final=(int)query_weight()/200;
	if (final < 100 ){
		final=100;
	}
	if(query("special_skill/greedy")&&query("age")>17)
	  final+=final/2;
	return final;
}

int max_water_capacity() 
{ 	
	int final;
	final=(int)query_weight()/200;
	if( final< 100 ) {
		final=100;
	}
	if(query("special_skill/greedy")&&query("age")>17)
	  final+=final/2;
	return final; 
}
///////////gamer add regenerate effect...
int regenerate(int effect)
{
	
	int kee,sen,force,mana;
	mapping my;
	if (environment())
	    if (environment()->query("no_time")) return -1;
	if(!random(3))
	{		
		my = query_entire_dbase();
		
		
		kee = query_temp("apply/regenerate_max_kee")/100+query_temp("apply/regenerate_max_kee")*my["max_kee"]/100+query_temp("apply/regenerate_kee");
		sen = query_temp("apply/regenerate_max_sen")/100+query_temp("apply/regenerate_max_sen")*my["max_sen"]/100+query_temp("apply/regenerate_sen");
		force = query_temp("apply/regenerate_max_force")/100+query_temp("apply/regenerate_max_force")*my["max_force"]/100+query_temp("apply/regenerate_force");
		mana = 	query_temp("apply/regenerate_max_mana")/100+query_temp("apply/regenerate_max_mana")*my["max_mana"]/100+query_temp("apply/regenerate_mana");
		
		kee = kee/effect;sen = sen/effect;force = force/effect;mana=mana/effect;
		
		my["kee"] += kee;
		my["sen"] += sen;
		my["force"] += force;
		my["mana"] += mana;
		my["eff_kee"] += kee;
		my["eff_sen"] += sen;
	
		if(my["eff_kee"] >= my["max_kee"]) my["eff_kee"] = my ["max_kee"];
		if(my["kee"] >= my["eff_kee"]) my["kee"] = my ["eff_kee"];
		if(my["eff_sen"] >= my["max_sen"]) my["eff_sen"] = my ["max_sen"];
		if(my["sen"] >= my["eff_sen"]) my["sen"] = my ["eff_sen"];
		
		if(my["force"] >= my["max_force"]*2) my["force"] = my ["max_force"]*2;
		if(my["mana"] >= my["max_mana"]*2) my["mana"] = my ["max_mana"]*2;
	}	
}
int heal_up()
{
	int update_flag, i;
	mapping my;
	update_flag = 0;

	my = query_entire_dbase();

	// mon 01/23/99
	if(sizeof(query_temp("no_heal_up")))
	    return update_flag;

	// mon 0122/99
	// allow_heal_up will allow a NPC to heal up
	// when fighting. default is no help up.
  	if( !userp(this_object()) &&
		this_object()->is_fighting() &&
	        !my["allow_heal_up"]) 
	    return update_flag;

	if( my["water"] > 0 ) { my["water"] -= 1; update_flag++; }
	if( my["food"] > 0 ) { my["food"] -= 1; update_flag++; }

	if( my["water"] < 1 && userp(this_object()) ) return update_flag;

	if( wizardp(this_object()) && query("env/immortal") ) {
		if( my["eff_gin"] < my["max_gin"] )
			my["eff_gin"] = my["max_gin"];
		if( my["gin"] < my["eff_gin"] )
			my["gin"] = my["eff_gin"];
		if( my["eff_kee"] < my["max_kee"] )
			my["eff_kee"] = my["max_kee"];
		if( my["kee"] < my["eff_kee"] )
			my["kee"] = my["eff_kee"];
		if( my["eff_sen"] < my["max_sen"] )
			my["eff_sen"] = my["max_sen"];
		if( my["sen"] < my["eff_sen"] )
			my["sen"] = my["eff_sen"];
		if( my["force"] < my["max_force"]*2 )
			my["force"] = my["max_force"]*2;
		if( my["mana"] < my["max_mana"]*2 )
			my["mana"] = my["max_mana"]*2;
		return update_flag;
	}
	
	if( my["con"] / 3 + my["atman"] / 10 > 0 )//bugbug,2001,12,4
	    my["gin"] += my["con"] / 3 + my["atman"] / 10;
	if( my["gin"] >= my["eff_gin"] ) {
		my["gin"] = my["eff_gin"];
		if( my["eff_gin"] < my["max_gin"] ) { my["eff_gin"] ++; update_flag++; }
	} else update_flag++;

	// kee and force depends on drink to heal.
    if( my["con"] / 3 + my["force"] / 10  > 0 )//bugbug,2001,12,4
	{    my["kee"] += my["con"] / 3 + my["force"] / 10;
    		if(query("special_skill/constitution")&&query("age")>17)
    		my["kee"] += my["con"] / 6 + my["force"] / 20;
    	}
	if( my["kee"] >= my["eff_kee"] ) {
		my["kee"] = my["eff_kee"];
		if( my["eff_kee"] < my["max_kee"] )	{ my["eff_kee"] ++; update_flag++; }
	} else update_flag++;

	if( my["max_force"] && my["force"] < my["max_force"] ) {
		my["force"] =  to_int(my["force"])+(int)this_object()->query_skill("force", 1) / 2;
		if(query("special_skill/constitution")&&query("age")>17)
				my["force"] =  to_int(my["force"])+(int)this_object()->query_skill("force", 1) / 4;
		if( my["force"] > my["max_force"] ) my["force"] = my["max_force"];
		update_flag++;
	}

	if( my["food"] < 1 && userp(this_object()) ) return update_flag;

	if( my["max_atman"] && my["atman"] < my["max_atman"] ) {
		my["atman"] += (int)this_object()->query_skill("magic", 1) / 2;
		if( my["atman"] > my["max_atman"] ) my["atman"] = my["max_atman"];
		update_flag++;
	}

	// sen and mana depends on food for heal.
    if(my["spi"] / 3 + my["mana"] / 10 > 0 )//bugbug,2001,12,4 
	  {  my["sen"] += my["spi"] / 3 + my["mana"] / 10;
    		 if(query("special_skill/spirituality")&&query("age")>17)
    			  my["sen"] += my["spi"] / 6 + my["mana"] / 20;
     
		}
	if( my["sen"] >= my["eff_sen"] ) {
		my["sen"] = my["eff_sen"];
		if( my["eff_sen"] < my["max_sen"] )	{ my["eff_sen"] ++; update_flag++; }
	} else update_flag++;

	if( my["max_mana"] && my["mana"] < my["max_mana"] ) {
		my["mana"] += (int)this_object()->query_skill("spells", 1) / 2;
		if(query("special_skill/spirituality")&&query("age")>17)
		my["mana"] += (int)this_object()->query_skill("spells", 1) / 4;
		if( my["mana"] > my["max_mana"] ) my["mana"] = my["max_mana"];
		update_flag++;
	}

	return update_flag;
}

