📄 npc_transmigration.c
字号:
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE]; 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:"); //比对npc谈话 while(getStringFromIndexWithDelim( npcarg,"END",i,buf,sizeof( buf)) != FALSE) { i++; //如果条件符合则 tenflg 设为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: //对话 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: //是否让宠物转生 //转生需要物品或宠物检查 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: //宠物转生 确定/取消 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]没错吧? \n\n %s",petname,buf1); windowtype = WINDOW_MESSAGETYPE_MESSAGE; buttontype = WINDOW_BUTTONTYPE_YESNO; windowno = CHAR_WINDOWTYPE_PETTRANS_MAIN1; break; case 4: //宠物转生 CHAR_TRANSMIGRATION //转生条件判断 petindex = CHAR_getCharPet( toindex, select-1); if( !CHAR_CHECKINDEX( petindex) ) { return; }#ifdef _PET_2TRANS if( CHAR_getInt( toindex, CHAR_RIDEPET ) == select-1 /*&& CHAR_getInt( petindex, CHAR_TRANSMIGRATION ) > 0*/ ){//骑乘中的宠物不能转生 sprintf(token, "\n\n骑乘中的宠物不能转生喔!"); }else#endif if( CHAR_getInt( petindex, CHAR_LV) < 80 ) { sprintf(token, "\n\n接受转生祝福的宠物必需要等级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这只宠物不能转生喔!"); 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这只宠物已经接受过祝福了喔!"); CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0); //检查宠物是否重复转生 }else { // 转生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; //结束 break; case 5: //宠物转生取消 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; //结束 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; int PetEvent_no[3]={4,69,70}; //int PetEvent_no[3]={4,4,4}; //宠物转生条件 if( CHAR_getInt( toindex, CHAR_LV ) < 80 ) { return 0; }else { //检查任务的FLAG 是否已完成宠转需要的任务 for(i = 0; i < 3 ;i++) { if( NPC_EventCheckFlg( toindex, PetEvent_no[i] ) == FALSE) { 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 宠物转生发生错误 !!"); 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); } } CHAR_setInt( petNo, CHAR_LIMITLEVEL, -1); { 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 addvoid s_eventsetend( int charaindex, int shiftbit ){ int event_num = 6; int point; int array; int shift; array = shiftbit / 32; shift = shiftbit % 32; if( array>=event_num ){ //print("错误!!所设的任务旗标编号已超过范围(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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -