map2.c

来自「CS反恐精英1.6的部分C源代码。」· C语言 代码 · 共 2,313 行 · 第 1/5 页

C
2,313
字号
   break;
 case SP_STATUSPOINT:
   sd->status.status_point=sd->status.status_point+val;
   break;
 case SP_SKILLPOINT:
   sd->status.skill_point=sd->status.skill_point+val;
   break;
 default:
   break;
 }
 len=mmo_map_set_param(fd,WFIFOP(fd,0),type);
 if(len>0) WFIFOSET(fd,len);
 return 0;
}


//function for sigma operation
int mmo_map_calc_sigma(int k,double val)
{
	int i;
	double j=0;
	for(i=1;i<=k;i++){
		j = (double)(i*val) + j;
	}
	return (int)j;
}

//functions for recalculating status乫
int mmo_map_calc_status(int fd,int item_num,int equip){
	struct item_db2 item_equip;
	struct map_session_data *sd;
	struct mmo_charstatus *p;
	short temp_str;
	short temp_agi;
	short temp_vit;
	short temp_int;
	short temp_dex;
	short temp_luk;
	if(item_num != 0)
		item_equip = item_database(item_num);
	sd=session[fd]->session_data;
	p=&sd->status;
	if(item_num != 0){
		//sword mastery wisc
		if(itemdb_hands(item_num)==1) item_equip.atk += ( sd->status.skill[2 -1].lv *5);
		if(itemdb_hands(item_num)==2) item_equip.atk += ( sd->status.skill[3 -1].lv *5);

		if(equip){
			p->str2 += item_equip.str;
			p->agi2 += item_equip.agi;
			p->dex2 += item_equip.dex;
			p->vit2 += item_equip.vit;
			p->int_2 += item_equip.int_;
			p->luk2 += item_equip.luk;
		}
		else
		{
			p->str2 -= item_equip.str;
			p->agi2 -= item_equip.agi;
			p->dex2 -= item_equip.dex;
			p->vit2 -= item_equip.vit;
			p->int_2 -= item_equip.int_;
			p->luk2 -= item_equip.luk;
		}
	}
	else
	{
		p->str2 = 0;
		p->agi2 = 0;
		p->dex2 = 0;
		p->vit2 = 0;
		p->int_2 = 0;
		p->luk2 = 0;
	}

	p->dex2 = p->skill[43-1].lv;	//correction on Owl乫s Eye skill

	temp_str=p->str + p->str2;
	temp_agi=p->agi + p->agi2;
	temp_vit=p->vit + p->vit2;
	temp_int=p->int_+ p->int_2;
	temp_dex=p->dex + p->dex2;
	temp_luk=p->luk + p->luk2;

	//HP calculation
	switch(p->class){
	case 0://novice
		p->max_hp = (double)(35 + p->base_level*5)*(double)(1+temp_vit/100);
		p->max_sp = p->base_level*2*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30;
		break;
	case 1://swordsman
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.7))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*2*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 800;
		break;
	case 2://mage
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.3))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*6*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 200;
		break;
	case 3://archer
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.5))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*2*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 600;
		break;
	case 4://acolyte
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.4))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*5*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 400;
		break;
	case 5://merchant
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.4))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*3*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 800;
		break;
	case 6://theif
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.5))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*2*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 400;
		break;
	case 7://knight
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,1.5))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*3*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 800;
		break;
	case 8://priest
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.75))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*7*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 600;
		break;
	case 9://wizard
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.55))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*9*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 400;
		break;
	case 10://blacksmith
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.9))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*4*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 1000;
		break;
	case 11://hunter
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,0.85))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*4*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 700;
		break;
	case 12://assassin
		p->max_hp = (double)(35 + p->base_level*5 + mmo_map_calc_sigma(p->base_level,1.1))*(double)(1+((double)temp_vit/100));
		p->max_sp = p->base_level*4*(double)(1+((double)temp_int/100));
		sd->max_weight = 2000 + p->str*30 + 400;
		break;
	}

	if(p->max_hp > 30000 || p->max_hp < 0){//max HP available is 30000
		p->max_hp = 30000;
	}

	//ATK,ASPD,MATK,DEF,MDEF,HIT,FLEE calculations
	if(item_num != 0){
		if(equip){
			p->atk1 = temp_str + (temp_str/10)*(temp_str/10) + (temp_dex/5);
			if(item_equip.atk != 0)
			p->atk2 += item_equip.atk;
			p->aspd = (long)((def_aspd[sd->status.class][0])*(float)(((250-(temp_agi)-((temp_dex)/4.0f)))/250.0f));
			p->matk1 = temp_int + (temp_int/5)*(temp_int/5);
			if(item_equip.matk != 0)
				p->matk1 += item_equip.matk;
			p->matk2 = temp_int + (temp_int/7)*(temp_int/7);
			p->def1 = temp_vit;
			if(item_equip.def != 0)
				p->def2 += item_equip.def;
			p->mdef1 = temp_int;
			if(item_equip.mdef != 0)
				p->mdef2 += item_equip.mdef;
			p->hit = sd->status.base_level + temp_dex + item_equip.hit;
			p->flee1 = sd->status.base_level + temp_agi + item_equip.flee;
			p->flee2 = (temp_luk/10)+1;
			p->critical = 1 + temp_luk/3 + item_equip.critical;
		}
		else
		{
			p->atk1 = temp_str + (temp_str/10)*(temp_str/10) + (temp_dex/5);
			if(item_equip.atk != 0)
				p->atk2 -= item_equip.atk;
			p->aspd = (long)((def_aspd[sd->status.class][0])*(float)(((250-(temp_agi)-((temp_dex)/4.0f)))/250.0f));
			p->matk1 = temp_int + (temp_int/5)*(temp_int/5);
			if(item_equip.matk != 0)
				p->matk1 -= item_equip.matk;
			p->matk2 = temp_int + (temp_int/7)*(temp_int/7);
			p->def1 = temp_vit;
			if(item_equip.def != 0)
				p->def2 -= item_equip.def;
			p->mdef1 = temp_int;
			if(item_equip.mdef != 0)
				p->mdef2 -= item_equip.mdef;
			p->hit = sd->status.base_level + temp_dex - item_equip.hit;
			p->flee1 = sd->status.base_level + temp_agi - item_equip.flee;
			p->flee2 = (temp_luk/10)+1;
			p->critical = 1 + temp_luk/3 - item_equip.critical;
		}
	}
	else
	{
			p->atk1 = temp_str + (temp_str/10)*(temp_str/10) + (temp_dex/5);
			p->atk2 = 1;
			p->aspd = (long)((def_aspd[sd->status.class][0])*(float)(((250-(temp_agi)-((temp_dex)/4.0f)))/250.0f));
			p->matk1 = temp_int + (temp_int/5)*(temp_int/5);
			p->matk2 = temp_int + (temp_int/7)*(temp_int/7);
			p->def1 = temp_vit;
			p->def2 = 1;
			p->mdef1 = temp_int;
			p->mdef2 = 1;
			p->hit = sd->status.base_level + temp_dex;
			p->flee1 = sd->status.base_level + temp_agi;
			p->flee2 = (temp_luk/10)+1;
			p->critical = 1 + temp_luk/3;
			equip_check(fd);
	}

	//MAX_HP renewal
	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x06;
	WFIFOL(fd,4) = p->max_hp;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x08;
	WFIFOL(fd,4) = p->max_sp;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x19;
	WFIFOL(fd,4) = sd->max_weight*10;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0x141;
	WFIFOL(fd,2) = SP_STR;
	WFIFOL(fd,6) = p->str;
	WFIFOL(fd,10) = p->str2;
	WFIFOSET(fd,14);

	WFIFOW(fd,0) = 0x141;
	WFIFOL(fd,2) = SP_AGI;
	WFIFOL(fd,6) = p->agi;
	WFIFOL(fd,10) = p->agi2;
	WFIFOSET(fd,14);

	WFIFOW(fd,0) = 0x141;
	WFIFOL(fd,2) = SP_VIT;
	WFIFOL(fd,6) = p->vit;
	WFIFOL(fd,10) = p->vit2;
	WFIFOSET(fd,14);

	WFIFOW(fd,0) = 0x141;
	WFIFOL(fd,2) = SP_INT;
	WFIFOL(fd,6) = p->int_;
	WFIFOL(fd,10) = p->int_2;
	WFIFOSET(fd,14);

	WFIFOW(fd,0) = 0x141;
	WFIFOL(fd,2) = SP_DEX;
	WFIFOL(fd,6) = p->dex;
	WFIFOL(fd,10) = p->dex2;
	WFIFOSET(fd,14);

	WFIFOW(fd,0) = 0x141;
	WFIFOL(fd,2) = SP_LUK;
	WFIFOL(fd,6) = p->luk;
	WFIFOL(fd,10) = p->luk2;
	WFIFOSET(fd,14);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x29;
	WFIFOL(fd,4) = p->atk1;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x2a;
	WFIFOL(fd,4) = p->atk2;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x2b;
	WFIFOL(fd,4) = p->matk1;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x2c;
	WFIFOL(fd,4) = p->matk2;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x2d;
	WFIFOL(fd,4) = p->def1;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x2e;
	WFIFOL(fd,4) = p->def2;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x2f;
	WFIFOL(fd,4) = p->mdef1;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x30;
	WFIFOL(fd,4) = p->mdef2;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x31;
	WFIFOL(fd,4) = p->hit;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x32;
	WFIFOL(fd,4) = p->flee1;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x33;
	WFIFOL(fd,4) = p->flee2;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x34;
	WFIFOL(fd,4) = p->critical;
	WFIFOSET(fd,8);

	WFIFOW(fd,0) = 0xb0;
	WFIFOW(fd,2) = 0x35;
	WFIFOL(fd,4) = p->aspd;
	WFIFOSET(fd,8);

	return 0;
}

//skill lvl up proccessing
void mmo_map_skill_lv_up(int fd,int skill_id)
{
	int len;
	struct map_session_data *sd;
	skill_id--;
	sd=session[fd]->session_data;
	sd->status.skill[skill_id].lv++;
	WFIFOW(fd,0) = 0x10e;
	WFIFOW(fd,2) = skill_id;
	WFIFOW(fd,4) = sd->status.skill[skill_id].lv;
	WFIFOW(fd,6) = skill_db[skill_id].sp;
	WFIFOW(fd,8) = skill_db[skill_id].range;
	WFIFOB(fd,10) = 1;//skill point up
	WFIFOSET(fd,11);
	len = mmo_map_all_skill(fd,WFIFOP(fd,0),sd->status.skill_point,0);
    if(len>0) WFIFOSET(fd,len);
	mmo_map_update_param(fd,SP_SKILLPOINT,-1);
}

void mmo_map_job_lv_up(int fd,int val)
{
	int i,len;
//	int c;
//	struct skill *n_skill;
	struct map_session_data *sd;
	struct mmo_charstatus *m_cs;

	sd=session[fd]->session_data;
	m_cs=&sd->status;

	for(i=0;i<val;i++){
		m_cs->job_level++;
		//Lv up renewal
		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x37;
		WFIFOL(fd,4) = m_cs->job_level;
		WFIFOSET(fd,8);

		WFIFOW(fd,0) = 0xb0;
		WFIFOW(fd,2) = 0x0c;
		WFIFOL(fd,4) = val;
		WFIFOSET(fd,8);
	}
	len = mmo_map_all_skill(fd,WFIFOP(fd,0),sd->status.skill_point,0);
	 if(len>0) WFIFOSET(fd,len);
	/*
	WFIFOW(fd,0)=0x10f;
	for(i=c=0;i<MAX_SKILL;i++){
    n_skill=&sd->status.skill[i];
	 if(n_skill->id==0)
	 continue;
    WFIFOW(fd,4+c*37)= n_skill->id;	//ID 1 basic skills?
    WFIFOW(fd,4+c*37+2)=skill_db[i+1].type_inf;	//target type 0-passive 1-enemy 2-place 4-immidiatery 16-ally
    WFIFOW(fd,4+c*37+4)=0;	//???
    WFIFOW(fd,4+c*37+6)=n_skill->lv+1;	//lv
    WFIFOW(fd,4+c*37+8)=skill_db[i+1].sp;//sp
    WFIFOW(fd,4+c*37+10)=skill_db[i+1].range;//range
    memcpy(WFIFOP(fd,4+c*37+12),"",24);	//name
    WFIFOB(fd,4+c*37+36)=val;	//up
    c++;
  }
  */
}

//Lvl up processing
void mmo_map_level_up(int fd,int val)
{
	int i=0;
	struct map_session_data *sd;
	struct mmo_charstatus *m_cs;

	sd=session[fd]->session_data;
	m_cs=&sd->status;

	if(sd->status.base_level <= 99){
	for(i=0;i<val;i++){
		m_cs->base_level++;

		//status point acquisition
		if(m_cs->base_level<5){
			mmo_map_update_param(fd,SP_STATUSPOINT,3);
		}else if(m_cs->base_level<10){
			mmo_map_update_param(fd,SP_STATUSPOINT,4);
		}else if(m_cs->base_level<15){
			mmo_map_update_param(fd,SP_STATUSPOINT,5);
		}else if(m_cs->base_level<20){
			mmo_map_update_param(fd,SP_STATUSPOINT,6);
		}else if(m_cs->base_level<25){
			mmo_map_update_param(fd,SP_STATUSPOINT,7);
		}else if(m_cs->base_level<30){
			mmo_map_update_param(fd,SP_STATUSPOINT,8);
		}else if(m_cs->base_level<35){
			mmo_map_update_param(fd,SP_STATUSPOINT,9);
		}else if(m_cs->base_level<40){
			mmo_map_update_param(fd,SP_STATUSPOINT,10);
		}else if(m_cs->base_level<45){
			mmo_map_update_param(fd,SP_STATUSPOINT,11);
		}else if(m_cs->base_level<50){
			mmo_map_update_param(fd,SP_STATUSPOINT,12);
		}else if(m_cs->base_level<55){
			mmo_map_update_param(fd,SP_STATUSPOINT,13);
		}else if(m_cs->base_level<60){
			mmo_map_update_param(fd,SP_STATUSPOINT,14);
		}else if(m_cs->base_level<65){
			mmo_map_update_param(fd,SP_STATUSPOINT,15);
		}else if(m_cs->base_level<70){
			mmo_map_update_param(fd,SP_STATUSPOINT,16);
		}else if(m_cs->base_level<75){
			mmo_map_update_param(fd,SP_STATUSPOINT,17);
		}else if(m_cs->base_level<80){
			mmo_map_update_param(fd,SP_STATUSPOINT,18);
		}else if(m_cs->base_level<85){
			mmo_map_update_param(fd,SP_STATUSPOINT,19);
		}else if(m_cs->base_level<90){
			mmo_map_update_param(fd,SP_STATUSPOINT,20);
		}else if(m_cs->base_level<95){
			mmo_map_update_param(fd,SP_STATUSPOINT,21);
		}else if(m_cs->base_level<100){
			mmo_map_update_param(fd,SP_STATUSPOINT,22);
		}else{//Lv100 and above...
			mmo_map_update_param(fd,SP_STATUSPOINT,30);
			}
		}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?