|
本帖最后由 方马也 于 2022-11-19 15:56 编辑
先说结论:
第一关键点,宠物等级上130,这个很明显代码里交代得是清楚的。
第二关键点,MM和宠0转的成长率,这个决定了total值,虽然不是很清楚之间怎么起作用的。
第三关键点,人品,getNewPoint函数里的那两段随机数人品代码,就说明了一切.当然,这个人品并不是算命决定的,这个很遗憾,我恐怕算命和转宠无关,因为我没看到任何这类型的代码出现。
第四关键点,一转后的血和攻,这个在最后的代码中,四围数组的位移运算,说明了这点。
//======================
第一个函数:
- int PETTRANS_PetTransManStatus( int toindex, int petindex1, int petindex2)
- {
- int petrank=0,i;
- int total1,total2,total,petLV,ans;
- int petID,enemynum,ret=-1;
- int work[4]=;
- int base[4]=;
- #define RAND(x,y) ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) )
- total1 = PETTRANS_getPetBase( petindex1, work, &petrank);
- total2 = PETTRANS_getPetBase( petindex2, base, &petrank);
- petLV = CHAR_getInt( petindex2, CHAR_LV);
复制代码
//======================第一部分===================================
- #ifdef _PET_2TRANS
- ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank, CHAR_getInt( petindex2, CHAR_TRANSMIGRATION ) );
- #else
- ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank );
- #endif
复制代码
//=========================================================
- total = total1 + (total2*4);
- total2 = 0;
- for( i=0; i
- work = work*4;
- total2 += work;
- }
- total = total1 + total2;
- for( i=0; i
- base = (ans * (base+work)) /total;
- }
- enemynum = ENEMY_getEnemyNum();
- petID = CHAR_getInt( petindex2, CHAR_PETID);
- for( i=0; i
- if( ENEMY_getInt(i, ENEMY_TEMPNO) == petID )
- break;
- }
- if( i == enemynum )
- return -1;
- ret = GetNewPet( toindex, petindex2, i, base); if( ret < 0 )
- return -1;
- return ret;
- }
复制代码
这个函数大致上应该是宠物转生的入口函数,从第一部分红色代码就可以判断,这段代码判断是一转还是二转,我们现在只研究一转的情况.
ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank );
从这个ans不用说,是一个影响转身的系数,从它后面的用法可以看得出,而toital1和total2代表的大致是MM和转宠的一个什么合值,后面有分析.petLv不用说代表宠的等级,petRank代表的大致是宠物的成长方面的东西,rank代表的是成长方面的数值,这个后面有分析.
接下来我们再看后面这段:
- total = total1 + (total2*4);
- total2 = 0;
- for( i=0; i
- work = work*4;
- total2 += work;
- }
- total = total1 + total2;
- for( i=0; i
- base = (ans * (base+work)) /total;
- }
复制代码
这里有两个关键变量,一个是total1,一个是total2,从这段代码推测:
total1 = PETTRANS_getPetBase( petindex1, work, &petrank);
total2 = PETTRANS_getPetBase( petindex2, base, &petrank);
total1和total2分别传入了petindex1,和petindex2.petindex不用说,都代表一个宠物的指针,也就是可以这个宠物的代号,那么至少可以说明,这两个total,一个代表人宠,一个代表转生宠.
再看这句:
- for( i=0; i
- work = work*4;
- total2 += work;
- }
- total = total1 + total2;
- for( i=0; i
- base = (ans * (base+work)) /total;
- }
复制代码
base是一个int数组,经我研究,这个数组是4位长,从0-3的下标,分别代表:血,攻,防,敏.看这段代码就知道:
//最终启动的转身函数
ret = GetNewPet( toindex, petindex2, i, base);
//=============
(这个base最终被当作一个参数传给了GetNewPet,GetNewPet不用说,就代表了获取新的宠物的函数)再看GetNewPet的定义中
int GetNewPet( int toindex , int petindex, int array, int *work)
{
......前面的先省略
work[0] += ( RAND(0,4) - 2 );
work[1] += ( RAND(0,4) - 2 );
work[2] += ( RAND(0,4) - 2 );
work[3] += ( RAND(0,4) - 2 );
///而参数work,刚好就是前面传入的base数组
- CHAR_setInt( petindex, CHAR_VITAL, ( PARAM_CAL(E_T_BASEVITAL) * work[0] ));
- CHAR_setInt( petindex, CHAR_STR , ( PARAM_CAL(E_T_BASESTR) * work[1] ));
- CHAR_setInt( petindex, CHAR_TOUGH , ( PARAM_CAL(E_T_BASETGH) * work[2] ));
- CHAR_setInt( petindex, CHAR_DEX , ( PARAM_CAL(E_T_BASEDEX) * work[3] ));
复制代码
//看到没,char_serInt,字面上的意思,就是character_setInital,也就是特征初始化,work[0]对应BASEVITAL,work[1]对应BASESTR,work[2]对应BASETGH,work[3]对应BASEDEX,很显然,BASEVITAL就是基本血量,BASESTR就是基本攻击力,BASEDEX就是基本敏捷,BASETGH虽然我不太理解TGH的意思,但不用说就是指防御了.
}
|
|