?? npc_transmigration.c
字號(hào):
char s_tensei[128];
char errchar[][56]={"errormy","erroritem","errorpet","failmsg"};
int buttontype = 0, windowtype = 0, windowno = 0, errtype = 0;
int petindex = 0,i=1;
char *petname;
BOOL tenflg = FALSE;
int fd = getfdFromCharaIndex( toindex);
if( fd == -1 ) {
print( "getfd err\n");
return;
}
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("Tensei:GetArgStrErr");
return;
}
sprintf(s_tensei,"PETTRANS:");
//比對(duì)npc談話
while(getStringFromIndexWithDelim( npcarg,"END",i,buf,sizeof( buf)) != FALSE) {
i++;
//如果條件符合則 tenflg 設(shè)為TRUE
if( strstr(buf,s_tensei) != NULL) {
tenflg = TRUE;
break;
}
}
if( CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT) < 0 )
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
token[0] = '0';
switch(num) {
case 0: //對(duì)話
if( NPC_Util_GetStrFromStrWithDelim( buf,"mainmsg", token,sizeof( token)) == NULL ) {
print("\n ERROR buf str!!");
return;
}
buttontype = WINDOW_BUTTONTYPE_NEXT;
windowno = CHAR_WINDOWTYPE_PETTRANS_START;
break;
case 1: //是否讓寵物轉(zhuǎn)生
//轉(zhuǎn)生需要物品或?qū)櫸餀z查
errtype = NPC_PetTransManCheck( meindex, toindex, 0);
if( errtype >= 0 )
errtype = 3;
if( errtype >= 0 ) {
if( NPC_Util_GetStrFromStrWithDelim( buf,errchar[ errtype], token,sizeof( token)) == NULL ) {
print("\n ERROR str errchar !!");
return;
}
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_PETTRANS_END;
break;
}
if( NPC_Util_GetStrFromStrWithDelim( buf,"selectmsg", token,sizeof( token)) == NULL ) {
print("\n ERROR selectmsg !!");
return;
}
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 1);
windowno = CHAR_WINDOWTYPE_PETTRANS_SELECT;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
buttontype=WINDOW_BUTTONTYPE_YESNO;
break;
case 2: //選寵
if( NPC_Util_GetStrFromStrWithDelim( buf,"setpetmsg", token,sizeof( token)) == NULL ) {
print("\n ERROR setpetmsg !!");
return;
}
buttontype = WINDOW_BUTTONTYPE_NONE;
windowtype = WINDOW_MESSAGETYPE_PETSELECT;
windowno = CHAR_WINDOWTYPE_PETTRANS_SELPET;
break;
case 3: //寵物轉(zhuǎn)生 確定/取消
if( NPC_Util_GetStrFromStrWithDelim( buf,"transmsg", buf1,sizeof( buf1)) == NULL ){
print("\n ERROR transmsg !!");
return;
}
strcpy( token,"\0");
petindex = CHAR_getCharPet( toindex, select-1);
petname = CHAR_getUseName( petindex);
sprintf(token, "\n是[%s]沒錯(cuò)吧? \n\n %s",petname,buf1);
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
buttontype = WINDOW_BUTTONTYPE_YESNO;
windowno = CHAR_WINDOWTYPE_PETTRANS_MAIN1;
break;
case 4: //寵物轉(zhuǎn)生 CHAR_TRANSMIGRATION
//轉(zhuǎn)生條件判斷
petindex = CHAR_getCharPet( toindex, select-1);
if( !CHAR_CHECKINDEX( petindex) ) {
return;
}
if( CHAR_getInt( petindex, CHAR_FUSIONBEIT ) == 1 ) {
sprintf(token, "\n\n融合過的寵物不能轉(zhuǎn)生喔!");
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
}else
#ifdef _PET_2TRANS
if( CHAR_getInt( toindex, CHAR_RIDEPET ) == select-1 /*&& CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 0*/ ){//騎乘中的寵物不能轉(zhuǎn)生
sprintf(token, "\n\n騎乘中的寵物不能轉(zhuǎn)生喔!");
}else
#endif
if( CHAR_getInt( petindex, CHAR_LV) < 80 ) {
sprintf(token, "\n\n接受轉(zhuǎn)生祝福的寵物必需要等級(jí)80以上喔!");
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
}else if( CHAR_getInt( petindex, CHAR_PETID) == 718
#ifdef _PET_2TRANS
|| CHAR_getInt( petindex, CHAR_PETID) == 401
#endif
){
sprintf(token, "\n\n這只寵物不能轉(zhuǎn)生喔!");
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
#ifdef _PET_2TRANS
}else if( CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 1 ) {
#else
}else if( CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 0 ) {
#endif
sprintf(token, "\n\n這只寵物已經(jīng)接受過祝福了喔!");
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
//檢查寵物是否重復(fù)轉(zhuǎn)生
}else { // 轉(zhuǎn)生OK
petindex = CHAR_getCharPet( toindex, select-1);
if( NPC_PetTransManStatus( meindex, toindex, petindex) == FALSE )
return;
if( NPC_Util_GetStrFromStrWithDelim( buf,"main1msg", token,sizeof( token)) == NULL )
return;
}
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_PETTRANS_END; //結(jié)束
break;
case 5: //寵物轉(zhuǎn)生取消
if( NPC_Util_GetStrFromStrWithDelim( buf,"cancelmsg", token,sizeof( token)) == NULL )
return;
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
buttontype = WINDOW_BUTTONTYPE_OK;
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = CHAR_WINDOWTYPE_PETTRANS_END; //結(jié)束
break;
default:
break;
}
lssproto_WN_send( fd, windowtype, buttontype, windowno, CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
}
int NPC_PetTransManCheck( int meindex, int toindex, int select)
{
//char errchar[][56]={"errormy","erroritem","errorpet","failmsg"};
int i;
int petindex = 0;
char token[256];
int PetEvent_no[3]={4,69,70};
//int PetEvent_no[3]={4,4,4};
int petNum = 0;
//寵物轉(zhuǎn)生條件
if( CHAR_getInt( toindex, CHAR_LV ) < 80 ) {
return 0;
}else {
//檢查任務(wù)的FLAG 是否已完成寵轉(zhuǎn)需要的任務(wù)
for(i = 0; i < 3 ;i++) {
if( NPC_EventCheckFlg( toindex, PetEvent_no[i] ) == FALSE) {
return 0;
}
}
//檢查所需(寵物/精靈) & 檢查所需物品
for(i=0 ; i < CHAR_MAXPETHAVE ; i++) {
petindex = CHAR_getCharPet( toindex, i);
if( petindex == -1 )
continue;
//檢查寵物的 ID 是否為瑪雷菲雅 1479 ID 為718
if(CHAR_getInt( petindex, CHAR_PETID) == 718
#ifdef _PET_2TRANS
|| CHAR_getInt( petindex, CHAR_PETID) == 401
#endif
){
petNum ++;
if( CHAR_getInt( petindex, CHAR_LV) > 79 ) {
return 0;
}else if( CHAR_getInt( petindex, CHAR_LV) == 79 ) {
if( strcmp( CHAR_getChar( petindex, CHAR_OWNERCDKEY), CHAR_getChar( toindex, CHAR_CDKEY) ) ||
strcmp( CHAR_getChar( petindex, CHAR_OWNERCHARANAME), CHAR_getChar( toindex, CHAR_NAME) )) {
sprintf( token,"你身上的瑪雷菲雅,并不是你的?。?quot;);
CHAR_talkToCli( toindex, -1, token, CHAR_COLORWHITE);
return 0;
}
}
}
}
if( petNum > 1 ) {
sprintf( token,"你怎會(huì)有那麼多瑪雷菲雅呢?");
CHAR_talkToCli( toindex, -1, token, CHAR_COLORWHITE);
print("\n error PetTrans : (PETID = 718) > 1 !!");
return 0;
}else if( petNum != 1 ) {
print("\n 寵轉(zhuǎn)發(fā)生錯(cuò)誤 !!");
return 0;
}
}
return -1;
}
BOOL NPC_PetTransManStatus( int meindex, int toindex, int petNo)
{
int petindex;
int LevelUpPoint = 0,petrank = 0;
int i,j,k,itemindex,itemID,count;
int vital1,str1,tgh1,dex1;
int vital2,str2,tgh2,dex2;
char token[128];
int total1,total2,total,petLV,ans;
int petID,enemynum,ret;
int work[4]={0,0,0,0};
struct PetTransDelItem {
int minItemID;
int maxItemID;
}DelItem[3] = { {19629,19632} , {19672,19687} , {19625,19628} };
#define RAND(x,y) ((x-1)+1+ (int)( (double)(y-(x-1))*rand()/(RAND_MAX+1.0)) )
#ifdef _PET_2TRANS
int tran = CHAR_getInt ( petNo, CHAR_TRANSMIGRATION );
int tpetidx1,tpetidx2;
if( tran == 0 ){
tpetidx1 = 718;
tpetidx2 = 401;
}
else{
tpetidx1 = 401;
tpetidx2 = 401;
}
#endif
for(i=0 ; i < CHAR_MAXPETHAVE ; i++) {
petindex = CHAR_getCharPet( toindex, i);
if( petindex == -1 )
continue;
if(
#ifdef _PET_2TRANS
CHAR_getInt( petindex, CHAR_PETID) == tpetidx1
|| CHAR_getInt( petindex, CHAR_PETID) == tpetidx2
#else
CHAR_getInt( petindex, CHAR_PETID) == 718
#endif
){
if( CHAR_getInt( petindex, CHAR_LV) == 79 ){
if( strcmp( CHAR_getChar( petindex, CHAR_OWNERCDKEY), CHAR_getChar( toindex, CHAR_CDKEY) ) ||
strcmp( CHAR_getChar( petindex, CHAR_OWNERCHARANAME), CHAR_getChar( toindex, CHAR_NAME) )) {
continue;
}
break;
}
}
}
if(i == CHAR_MAXPETHAVE) {
print("\n 寵物轉(zhuǎn)生發(fā)生錯(cuò)誤 !!");
return FALSE;
}
LevelUpPoint = CHAR_getInt( petindex, CHAR_ALLOCPOINT );
petrank = CHAR_getInt( petindex, CHAR_PETRANK );
vital1 = (float)(( LevelUpPoint >> 24 ) & 0xFF);
str1 = (float)(( LevelUpPoint >> 16 ) & 0xFF);
tgh1 = (float)(( LevelUpPoint >> 8 ) & 0xFF);
dex1 = (float)(( LevelUpPoint >> 0 ) & 0xFF);
total1 = ( vital1 + str1 + tgh1 + dex1 );
if( total1 > 150 ) total1 = 150;
if( total1 < 0 ) total1 = 0;
LevelUpPoint = CHAR_getInt( petNo, CHAR_ALLOCPOINT );
petrank = CHAR_getInt( petNo, CHAR_PETRANK );
petLV = CHAR_getInt( petNo, CHAR_LV);
vital2 = (float)(( LevelUpPoint >> 24 ) & 0xFF);
str2 = (float)(( LevelUpPoint >> 16 ) & 0xFF);
tgh2 = (float)(( LevelUpPoint >> 8 ) & 0xFF);
dex2 = (float)(( LevelUpPoint >> 0 ) & 0xFF);
total2 = ( vital2 + str2 + tgh2 + dex2 );
#ifdef _PET_2TRANS
ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank, CHAR_getInt( petNo, CHAR_TRANSMIGRATION ) );
#else
ans = NPC_PetTransManGetAns( total1, total2, petLV, petrank);
#endif
total = total1 + (total2*4);
work[0] = ( ans * ( vital1 + (vital2*4) ) ) / total;
work[1] = ( ans * ( str1 + (str2*4) ) ) / total;
work[2] = ( ans * ( tgh1 + (tgh2*4) ) ) / total;
work[3] = ( ans * ( dex1 + (dex2*4) ) ) / total;
//取array=========================
enemynum = ENEMY_getEnemyNum();
for(i=0;i<CHAR_MAXPETHAVE;i++) {
if( CHAR_getCharPet( toindex , i) == petNo) {
break;
}
}
if( CHAR_MAXPETHAVE == i ) {
return FALSE;
}
petID = CHAR_getInt( petNo, CHAR_PETID);
for(k=0;k<enemynum;k++) {
if(ENEMY_getInt(k, ENEMY_TEMPNO) == petID )
break;
}
if(k == enemynum) {
print("\n test *-7 : petID=%d", petID);
return FALSE;
}
{
BOOL FINDs = FALSE;
#ifdef _PET_2TRANS
tpetidx1 = CHAR_getInt( petindex, CHAR_PETID);
#endif
//刪除身上所有瑪寵
for(j=0 ; j < CHAR_MAXPETHAVE ; j++){
int pet_index = CHAR_getCharPet( toindex, j);
if( pet_index == -1 ) continue;
if(
#ifdef _PET_2TRANS
CHAR_getInt( pet_index, CHAR_PETID) == tpetidx1
#else
CHAR_getInt( pet_index, CHAR_PETID) == 718
#endif
){
if( NPC_TransmigrationDelPetDel( meindex, toindex, j) == FALSE){
return FALSE;
}else {
FINDs = TRUE;
}
}
}
if( FINDs == FALSE )
return FALSE;
}
ret = GetNewPet( toindex , petNo, k, work);
if( ret < 0 )
return FALSE;
for(count=0;count<CHAR_MAXPETHAVE;count++) {
if(CHAR_getCharPet(toindex,count) == ret) {
CHAR_send_K_StatusString(toindex,count,CHAR_K_STRING_HP|CHAR_K_STRING_AI);
}
}
{
LogPetTrans(
CHAR_getChar( toindex, CHAR_CDKEY ),
CHAR_getChar( petNo, CHAR_UNIQUECODE),
CHAR_getChar( petindex, CHAR_UNIQUECODE),//瑪蕾
CHAR_getChar( toindex, CHAR_NAME),
CHAR_getInt( toindex, CHAR_FLOOR),
CHAR_getInt( toindex, CHAR_X),
CHAR_getInt( toindex, CHAR_Y),
CHAR_getInt( petNo, CHAR_PETID),
CHAR_getChar( petNo, CHAR_NAME),
petLV, petrank,
vital2, str2, tgh2, dex2, total2,
CHAR_getInt( petindex, CHAR_PETID),
CHAR_getChar( petindex, CHAR_NAME),
vital1, str1, tgh1, dex1, total1,
work[0], work[1], work[2], work[3], ans, CHAR_getInt ( petNo, CHAR_TRANSMIGRATION ) );
}
sprintf(token,"%s 接受了精靈王的祝福!", CHAR_getUseName( ret));
CHAR_talkToCli( toindex, -1,token,CHAR_COLORWHITE);
sprintf( token, "K%d", i );
CHAR_sendStatusString( toindex , token );
//--------------------------------------------------------------------------
//刪除物品 itemindex,itemID;
for( i =0 ; i < CHAR_MAXITEMHAVE ; i++ ){
itemindex = CHAR_getItemIndex( toindex , i );
if( ITEM_CHECKINDEX(itemindex) ){
itemID = ITEM_getInt(itemindex ,ITEM_ID );
for( j = 0;j < 3;j++) {
if( ( itemID >= DelItem[j].minItemID ) && ( itemID <= DelItem[j].maxItemID ) ) {
LogItem(
CHAR_getChar( toindex, CHAR_NAME ),
CHAR_getChar( toindex, CHAR_CDKEY ),
#ifdef _add_item_log_name // WON ADD 在item的log中增加item名稱
itemindex,
#else
ITEM_getInt( itemindex, ITEM_ID),
#endif
"WarpManDelItem",
CHAR_getInt( toindex, CHAR_FLOOR),
CHAR_getInt( toindex, CHAR_X ),
CHAR_getInt( toindex, CHAR_Y ),
ITEM_getChar( itemindex, ITEM_UNIQUECODE),
ITEM_getChar( itemindex, ITEM_NAME),
ITEM_getInt( itemindex, ITEM_ID)
);
CHAR_DelItem( toindex, i);
}
}//for(j)
}
}
NPC_NowEventSetFlg( toindex, 71 );
return TRUE;
}
// shan add
void s_eventsetend( int charaindex, int shiftbit )
{
#ifdef _ADD_NEWEVENT // WON 多增任務(wù)旗標(biāo)
int event_num = 8;
#else
int event_num = 6;
#endif
int point;
int array;
int shift;
array = shiftbit / 32;
shift = shiftbit % 32;
if( array>=event_num ){
//print("錯(cuò)誤?。∷O(shè)的任務(wù)旗標(biāo)編號(hào)已超過 圍(0~%d)。",32*event_num-1);
return;
}
point = CHAR_getInt( charaindex, CHAR_ENDEVENT+array);
point = point | (1<<shift);
CHAR_setInt( charaindex, CHAR_ENDEVENT+array, point);
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -