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 + -
显示快捷键?