?? npc_newnpcman.c
字號:
#include "version.h"
#include <string.h>
#include <math.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "enemy.h"
#include "log.h"
#include "battle.h"
#include "readmap.h"
#include "handletime.h"
#include "npc_eventaction.h"
#include "npc_newnpcman.h"
#include "pet.h"
#define NEWNPCMAN_STANDBY 5000
#define NEWNPCMAN_WAITTIME 150
enum {
WINDOW_START=1,
WINDOW_SELECT1,
WINDOW_SELECT2,
WINDOW_SELECT3,
WINDOW_SELECTLOSTPET,
WINDOW_DEFIND,
WINDOW_WARP,
WINDOW_END,
NPC_PROGRAMEGINEER_START=1,
NPC_PROGRAMEGINEER_SELECT1,
NPC_PROGRAMEGINEER_SELECT2,
NPC_PROGRAMEGINEER_SELECT3,
NPC_PROGRAMEGINEER_SELECTLOSTPET,
NPC_PROGRAMEGINEER_DEFIND,
NPC_PROGRAMEGINEER_END,
};
enum {
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
/*
NPC_WORK_ROUTETOY = CHAR_NPCWORKINT2,
NPC_WORK_ROUTEPOINT = CHAR_NPCWORKINT3,
NPC_WORK_ROUNDTRIP = CHAR_NPCWORKINT4,
NPC_WORK_MODE = CHAR_NPCWORKINT5,
NPC_WORK_CURRENTROUTE = CHAR_NPCWORKINT6,
NPC_WORK_ROUTEMAX = CHAR_NPCWORKINT7,
NPC_WORK_WAITTIME = CHAR_NPCWORKINT8,
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT9,
NPC_WORK_SEFLG = CHAR_NPCWORKINT10,
*/
};
/*
char UserBBIs[12][256]={
"小矮子", "賽亞人", "辮子男孩", "酷哥", "熊皮男", "大個",
"小矮妹", "熊皮妹", "帽子妹", "短法發夾妹", "手套女", "辣妹" };
char PetBBIs[4][256]={//格魯西斯 貝魯卡 金格薩貝魯 貝魯伊卡
"格魯西斯-紅虎", "貝魯卡-綠虎", "金格薩貝魯-金虎", "貝魯伊卡-黃虎" };
int PlayerBBI[6*2][4]={
{ 100000, 100005, 100010, 100015 }, //小矮子
{ 100025, 100030, 100035, 100020 }, //賽亞人
{ 100055, 100050, 100045, 100040 }, //辮子男孩
{ 100060, 100065, 100070, 100075 }, //酷哥
{ 100095, 100085, 100090, 100080 }, //熊皮男
{ 100100, 100115, 100110, 100115 }, //大個
{ 100135, 100120, 100125, 100130 }, //小矮妹
{ 100145, 100140, 100150, 100155 }, //熊皮妹
{ 100165, 100170, 100160, 100175 }, //帽子妹
{ 100190, 100195, 100185, 100180 }, //短發發夾妹
{ 100200, 100210, 100215, 100205 }, //手套女
{ 100230, 100225, 100220, 100235 } //辣妹
};
*/
static int checkPc[48][3];
static void NPC_NewNpcMan_selectWindow( int meindex, int toindex, int num, int flg);
void NPC_reCheckMyPetUnusual( int meindex, int toindex);//檢查寵物異常
BOOL CHECK_ReplacePET( int toindex); //更換寵物
void NPC_reCheckItemPilenum( int meindex, int toindex);//還原鐵槍叁堆疊
BOOL CHECK_ITEMEQUIT( int toindex);//更換靈力鎧
BOOL CHECK_PETBBI( int toindex);//修正寵物圖號
#ifdef _PET_LOSTPET
BOOL NPC_reFindMyLostPet( int meindex, int toindex, char *buf);
BOOL NPC_getLostPetString( int meindex, int toindex);
BOOL NPC_backupLostPetString( int toindex);
static char petstring[7][2048]={"","","","","","",""};
#endif
BOOL NPC_NewNpcManInit( int meindex )
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("TRANSER_MAN: GetArgStrErr!!");
return FALSE;
}
{
int i;
for( i=0; i<48; i++){
if( i == 0 ){
checkPc[i][0]=30000;
checkPc[i][1]=30024;
checkPc[i][2]=100000;
}else{
checkPc[i][0] = checkPc[i-1][0] + 25;
checkPc[i][1] = checkPc[i-1][1] + 25;
checkPc[i][2] = checkPc[i-1][2] + 5;
}
// print("ANDY checkPc:%d[%d,%d,%d]\n", i, checkPc[i][0], checkPc[i][1], checkPc[i][2]);
}
}
CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_NEWNPCMAN);
CHAR_setWorkInt( meindex, NPC_WORK_CURRENTTIME, NowTime.tv_sec);
return TRUE;
}
void NPC_NewNpcManLoop( int meindex)
{
}
void NPC_NewNpcManTalked( int meindex , int talkerindex , char *msg , int color )
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER )
return;
if(NPC_Util_isFaceToFace( meindex ,talkerindex , 2) == FALSE) {
if(NPC_Util_isFaceToChara( talkerindex, meindex, 1) == FALSE)
return;
}
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("TRANSER_MAN: GetArgStrErr!!");
return;
}
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
if( CHAR_getInt( talkerindex, CHAR_BASEBASEIMAGENUMBER) != 101578 ){
NPC_NewNpcMan_selectWindow( meindex, talkerindex, WINDOW_SELECT1, 0);
return;
}
NPC_NewNpcMan_selectWindow( meindex, talkerindex, WINDOW_START, 0);
}
static void NPC_NewNpcMan_selectWindow( int meindex, int toindex, int num, int flg)
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[256];
int buttontype = 0, windowtype = 0, windowno = 0;
int fd = getfdFromCharaIndex( toindex);
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
if(NPC_Util_isFaceToFace( meindex ,toindex , 2) == FALSE) {
if(NPC_Util_isFaceToChara( toindex, meindex, 1) == FALSE)
return;
}
memset( npcarg, 0, sizeof( npcarg));
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
return;
}
memset( token, 0, sizeof( token));
switch( num) {
case WINDOW_START:
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "START_MSG", token, sizeof( token) ) == NULL) {
return;
}
buttontype = WINDOW_BUTTONTYPE_YESNO;
windowno = NPC_PROGRAMEGINEER_DEFIND;
break;
case WINDOW_SELECT1:
sprintf(token," 請選擇"
"\n 《修正寵物異常》"
"\n 《修正寵物圖號》"
"\n 《更換靈力鎧》"
#ifdef _PET_LOSTPET
"\n 《領回遺失寵物》"
#endif
// "\n 《還原鐵槍叁堆疊》"
);
windowtype = WINDOW_MESSAGETYPE_SELECT;
buttontype = WINDOW_BUTTONTYPE_CANCEL;
windowno = NPC_PROGRAMEGINEER_SELECT2;
break;
case WINDOW_SELECT2:
switch( flg){
case 1://修正寵物異常
NPC_reCheckMyPetUnusual( meindex, toindex);
CHAR_talkToCli( toindex, -1, "身上寵物檢查完畢!", CHAR_COLORYELLOW);
return;
break;
case 2://修正寵物圖號
CHECK_PETBBI( toindex);
return;
break;
case 3://更換靈力鎧
if( CHECK_ITEMEQUIT( toindex) == TRUE ){
CHAR_talkToCli( toindex, -1, "檢查完畢!", CHAR_COLORYELLOW);
}
return;
break;
case 4:
#ifdef _PET_LOSTPET
if( NPC_reFindMyLostPet( meindex, toindex, token) == FALSE ){
CHAR_talkToCli( toindex, -1, "查無資料!", CHAR_COLORYELLOW);
return;
}
windowtype = WINDOW_MESSAGETYPE_SELECT;
buttontype = WINDOW_BUTTONTYPE_CANCEL;
windowno = NPC_PROGRAMEGINEER_SELECTLOSTPET;
#endif
break;
case 5: //還原鐵槍叁堆疊
// NPC_reCheckItemPilenum( meindex, toindex);
return;
break;
}
break;
/*
case WINDOW_SELECT3:
{
int petnum, petindex;
petnum = atoi( data)-1;
if( petnum >= CHAR_MAXPETHAVE || petnum < 0 ) return;
petindex = CHAR_getCharPet( talker, petsel);
if( !CHAR_CHECKINDEX(petindex) ) return;
break;
}
*/
case WINDOW_SELECTLOSTPET:
#ifdef _PET_LOSTPET
{
int ret, i, ti, ltime, cost;
Char ch;
char msgbuf[256];
char petstring1[2048];
int havepetelement = CHAR_getCharPetElement( toindex);
ti = flg;
if( havepetelement < 0 ){
CHAR_talkToCli( toindex, -1, "寵物欄位已滿!", CHAR_COLORYELLOW);
return;
}
if( NPC_getLostPetString( meindex, toindex) == FALSE ) {
CHAR_talkToCli( toindex, -1, "領取寵物失敗!", CHAR_COLORYELLOW);
return;
}
if( getStringFromIndexWithDelim( petstring[ti-1], "#", 2, petstring1, sizeof( petstring1)) == FALSE ){
CHAR_talkToCli( toindex, -1, "領取寵物失敗!", CHAR_COLORYELLOW);
return;
}else{
char buf1[256];
if( getStringFromIndexWithDelim( petstring[ti-1], "|", 6, buf1, sizeof( buf1)) == FALSE ) return;
ltime = atoi(buf1);
ltime = time( NULL) - ltime;
ltime = ltime/(60*60*24);
if( getStringFromIndexWithDelim( petstring[ti-1], "|", 4, buf1, sizeof( buf1)) == FALSE ) return;
cost = atoi( buf1);
#if 0 // 修正保釋金
cost = cost + (ltime*100);
cost = (cost>10000)?10000:cost;
#else
cost = cost + (ltime*10000);
#endif
if( CHAR_getInt( toindex, CHAR_GOLD) < cost ) {
sprintf( buf1, "寵物已寄放%d天,共需%d石幣才可領回。", ltime, cost);
CHAR_talkToCli( toindex, meindex, buf1, CHAR_COLORYELLOW);
return;
}
}
ret = CHAR_makePetFromStringToArg( petstring1, &ch, -2);
strcpy( petstring[ti-1], "");
if( ret ) {
char buf1[256];
int petindex = PET_initCharOneArray( &ch );
if( !CHAR_CHECKINDEX( petindex) ){
CHAR_talkToCli( toindex, -1, "領取寵物失敗!", CHAR_COLORYELLOW);
return;
}
print("ANDY petindex:%d[%s]\n", petindex, CHAR_getChar( petindex, CHAR_NAME) );
CHAR_complianceParameter( petindex );
CHAR_setInt( petindex, CHAR_HP, CHAR_getWorkInt( petindex, CHAR_WORKMAXHP));
CHAR_setWorkInt( petindex, CHAR_WORKPLAYERINDEX, toindex);
CHAR_setCharPet( toindex, havepetelement, petindex);
CHAR_setChar( petindex, CHAR_OWNERCDKEY,
CHAR_getChar( toindex, CHAR_CDKEY));
CHAR_setChar( petindex, CHAR_OWNERCHARANAME,
CHAR_getChar( toindex, CHAR_NAME));
if( NPC_backupLostPetString( toindex) == FALSE ){
print("ANDY err backup petstring !!\n");
return;
}
sprintf( buf1, "LostPGet:%d", cost);
LogPet(
CHAR_getChar( toindex, CHAR_NAME ),
CHAR_getChar( toindex, CHAR_CDKEY ),
CHAR_getChar( petindex, CHAR_NAME),
CHAR_getInt( petindex, CHAR_LV),
buf1,
CHAR_getInt( toindex,CHAR_FLOOR),
CHAR_getInt( toindex,CHAR_X ),
CHAR_getInt( toindex,CHAR_Y ),
CHAR_getChar( petindex, CHAR_UNIQUECODE) // shan 2001/12/14
);
sprintf( buf1, "領取寵物%s。", CHAR_getUseName( petindex));
CHAR_talkToCli( toindex, meindex, buf1, CHAR_COLORYELLOW);
for( i = 0; i < CHAR_MAXPETHAVE; i++){
int petindex = CHAR_getCharPet( toindex, i);
if( !CHAR_CHECKINDEX( petindex) )
continue;
CHAR_complianceParameter( petindex );
snprintf( msgbuf, sizeof( msgbuf ), "K%d", i );
CHAR_sendStatusString( toindex, msgbuf );
snprintf( msgbuf, sizeof( msgbuf ), "W%d", i );
CHAR_sendStatusString( toindex, msgbuf );
}
CHAR_DelGold( toindex, cost);
}else{
CHAR_talkToCli( toindex, -1, "領取寵物失敗!", CHAR_COLORYELLOW);
return;
}
return;
}
#endif
return;
break;
case WINDOW_DEFIND:
{
int i;
int face = CHAR_getInt( toindex, CHAR_FACEIMAGENUMBER);
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "CHECK_MSG", token, sizeof( token) ) == NULL) {
return;
}
for( i=0; i<48; i++){
if( face >= checkPc[i][0] && face < checkPc[i][1] )
break;
}
if( i >= 48 )return;
CHAR_setWorkInt( toindex, CHAR_WORKNPCMETAMO, meindex);
CHAR_setInt( toindex, CHAR_BASEIMAGENUMBER, checkPc[i][2]);
CHAR_complianceParameter( toindex );
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( toindex , CHAR_WORKOBJINDEX ));
CHAR_send_P_StatusString( toindex , CHAR_P_STRING_BASEBASEIMAGENUMBER);
buttontype = WINDOW_BUTTONTYPE_YESNO;
windowno = NPC_PROGRAMEGINEER_END;
}
break;
case WINDOW_END:
{
CHAR_setWorkInt( toindex, CHAR_WORKNPCMETAMO, -1);
CHAR_setInt( toindex, CHAR_BASEBASEIMAGENUMBER,
CHAR_getInt( toindex, CHAR_BASEIMAGENUMBER) );
CHAR_complianceParameter( toindex );
CHAR_sendCToArroundCharacter( CHAR_getWorkInt( toindex , CHAR_WORKOBJINDEX ));
CHAR_send_P_StatusString( toindex , CHAR_P_STRING_BASEBASEIMAGENUMBER);
return;
}
break;
}
lssproto_WN_send( fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
}
void NPC_NewNpcManWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
{
if(NPC_Util_isFaceToFace( meindex ,talkerindex , 2) == FALSE) {
if(NPC_Util_isFaceToChara( talkerindex, meindex, 1) == FALSE)
return;
}
if( select == WINDOW_BUTTONTYPE_CANCEL || select == WINDOW_BUTTONTYPE_NO){
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
CHAR_setWorkInt( talkerindex, CHAR_WORKNPCMETAMO, -1);
return;
}
switch( seqno) {
case NPC_TRANSERMAN_START:
break;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -