/*------------------------------------------------------------ * 洶仃月井升丹井 蠅允月〔 * 婁醒 * index int Char 匹及 Index * ff int floor id * fx int x甄 * fy int y甄 * 忒曰襖 * 洶中化方中 TRUE(1) * 洶中化反母丟 FALSE(0) ------------------------------------------------------------*/ BOOL MAP_walkAble( int index,int ff, int fx, int fy) { /* 平乓仿卅日OK */ if( CHAR_getFlg( index, CHAR_ISTRANSPARENT ) ) return TRUE; // Arminius 7.9 Airplane ok if( CHAR_getInt( index, CHAR_WHICHTYPE ) == CHAR_TYPEBUS) return TRUE; if( CHAR_getWorkInt( index, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { int oyaindex = CHAR_getWorkInt( index, CHAR_WORKPARTYINDEX1); if( CHAR_CHECKINDEX( oyaindex)) { if (CHAR_getInt( oyaindex, CHAR_WHICHTYPE ) == CHAR_TYPEBUS) return TRUE; } } return MAP_walkAbleFromPoint( ff,fx,fy,CHAR_getFlg(index,CHAR_ISFLYING)|CHAR_getWorkInt(index,CHAR_WORKSKYWALKER) ); }
void NPC_SimpleShopTalked( int meindex, int talker, char *msg, int color ) { #define SHOPRANGE 3 char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE], token[NPC_UTIL_GETARGSTR_LINEMAX]; if( CHAR_getInt( talker,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER ){ return; } if( NPC_Util_charIsInFrontOfChar( talker, meindex, SHOPRANGE ) && ! CHAR_getFlg( talker,CHAR_ISDIE ) ){ NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg)); getStringFromIndexWithDelim( npcarg,"|", OPENSHOPTOKEN,token, sizeof(token)); if( NPC_SimpleShopOpenShopOrNot( msg, token ) && NPC_Util_isFaceToFace( meindex, talker, SHOPRANGE ) ){ CHAR_setWorkInt( meindex, CHAR_WORKSHOPCLIENTINDEX, talker ); NPC_SimpleShopOpenShopWindow( meindex, talker, npcarg ); }else{ int tokennum; int i; char tmp[NPC_UTIL_GETARGSTR_LINEMAX]; getStringFromIndexWithDelim( npcarg,"|", MSGTOKEN,token, sizeof(token)); tokennum = 1; for( i=0;token[i]!='\0';i++ ){ if( token[i] == ',' ) tokennum++; } getStringFromIndexWithDelim( token,",", rand()%tokennum+1,tmp, sizeof(tmp)); CHAR_talkToCli( talker, meindex, tmp, CHAR_COLORWHITE ); } } }
/*------------------------------------------------------------ * Map 奶矛件玄及 pre post毛质 允月 * 娄醒 * index int 昙欠丹午仄化中月平乓仿及奶件犯永弁旦 * mode BOOL TRUE及凛反}in FALSE及凛反 out 卞覆杀 * 忒曰袄卅仄 ------------------------------------------------------------*/ static void MAP_dealprepostevent( int index, BOOL mode ) { int map[2]; int i; int damaged=FALSE; if( CHAR_getFlg(index,CHAR_ISFLYING) ) /* 氏匹月支勾卞反窒手仄卅中 */ return; if( !MAP_getMapDataFromCharIndex( index , map ) ) return; for( i = 0 ; i < 2 ; i ++ ){ /* damage */ int damage; damage = MAP_getImageInt(map[i], mode ? MAP_INTODAMAGE : MAP_OUTOFDAMAGE); if( damage != 0 ){ /* 母丢□斥汹毛恳匹 蜇允月及匹 寞 木赘尹 */ int opt[2]={SPR_kmydamY,-damage}; damaged=TRUE; CHAR_setInt(index, CHAR_HP, CHAR_getInt(index,CHAR_HP) + damage ); CHAR_complianceParameter(index); /* 母丢□斥熬仃凶巨白尼弁玄请允 */ CHAR_sendWatchEvent(CHAR_getWorkInt(index,CHAR_WORKOBJINDEX), CHAR_ACTDAMAGE,opt,2,TRUE); } } if( damaged ) CHAR_sendStatusString(index,"M"); }
/*------------------------------------------------------------ * Map 奶矛件玄及 pre post毛質 允月 * 婁醒 * index int 曇欠丹午仄化中月平乓仿及奶件犯永弁旦 * mode BOOL TRUE及凜反}in FALSE及凜反 out 卞覆殺 * 忒曰襖卅仄 ------------------------------------------------------------*/ static void MAP_dealprepostevent( int index, BOOL mode ) { int map[2]; int i; int damaged=FALSE,statuschange=FALSE; if( CHAR_getFlg(index,CHAR_ISFLYING) ) /* 氏匹月支勾卞反窒手仄卅中 */ return; if( !MAP_getMapDataFromCharIndex( index , map ) ) return; /* damage */ int damage; for( i = 0 ; i < 2 ; i ++ ){ damage = MAP_getImageInt(map[i], mode ? MAP_INTODAMAGE : MAP_OUTOFDAMAGE); if( damage != 0 ){ /* 母丟□斥洶毛懇匹 蜇允月及匹 寞 木贅尹 */ int opt[2]={SPR_kmydamY,-damage}; damaged=TRUE; CHAR_setInt(index, CHAR_HP, CHAR_getInt(index,CHAR_HP) + damage ); CHAR_complianceParameter(index); /* 母丟□斥熬仃凶巨白尼弁玄請允 */ CHAR_sendWatchEvent(CHAR_getWorkInt(index,CHAR_WORKOBJINDEX), CHAR_ACTDAMAGE,opt,2,TRUE); } if( MAP_changeCharStatusFromMapDataAndTime( index,map[i], mode ? TRUE : FALSE ) ) statuschange=TRUE; } if( damaged ) CHAR_sendStatusString(index,"M"); if( statuschange ){ CHAR_sendCToArroundCharacter(index); CHAR_sendStatusString(index,"P"); } }
/*------------------------------------------------------------ * ¥Ñ¡¼ ¥£¤Ë ¤í¤¦¤È¤¹¤ë¡e ------------------------------------------------------------*/ BOOL CHAR_JoinParty( int charaindex ) { int result = -1; int x,y; OBJECT object; int found = FALSE; int fd; int cnt; int i; fd = getfdFromCharaIndex( charaindex ); if( fd == -1 ) { print( "%s : %d err\n", __FILE__, __LINE__); return FALSE; } /* ¼«Ê¬¤¬¥Ñ¡¼ ¥£ÁȤó¤Ç¤¿¤éÂÌ */ if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE ) { lssproto_PR_send( fd, 1, FALSE); return FALSE; } /* ¤ÎÁ°¤ÎºÂ ¤ò ¤ë */ CHAR_getCoordinationDir( CHAR_getInt( charaindex, CHAR_DIR ) , CHAR_getInt( charaindex , CHAR_X ), CHAR_getInt( charaindex , CHAR_Y ) , 1 , &x , &y ); /* ½é´ü²½¤¹¤ë */ for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setJoinpartycharaindex(fd,i,-1); } cnt = 0; /*¼«Ê¬¤Î ¤ÎÁ°¤Î¥¥ã¥é¤ò¼è ¤¹¤ë */ for( object = MAP_getTopObj( CHAR_getInt( charaindex, CHAR_FLOOR),x,y) ; object ; object = NEXT_OBJECT(object ) ) { int toindex; int parray; int objindex = GET_OBJINDEX(object); int targetindex = -1; /* ¥¥ã¥é¥¯¥¿¡¼¤¸¤ã¤Ê¤¤ */ if( OBJECT_getType( objindex) != OBJTYPE_CHARA) continue; toindex = OBJECT_getIndex( objindex); // shan begin if( CHAR_getInt(charaindex, CHAR_FMINDEX) > 0 && CHAR_getInt(toindex, CHAR_FMINDEX) >0){ for( i = 0; i < FAMILY_FMPKFLOOR; i++){ if( fmpkflnum[i].fl == CHAR_getInt( charaindex, CHAR_FLOOR) ) if( CHAR_getInt(charaindex, CHAR_FMINDEX) != CHAR_getInt(toindex, CHAR_FMINDEX) ){ lssproto_PR_send( fd, 1, FALSE); return FALSE; } } } // shan end /* ¥×¥ì¥¤¥ä¡¼¤Î»þ */ if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ found = TRUE; /* Áê¼ê¤¬»Ò¤À¤Ã¤¿¤é¿Æ¤ò°ú¤ÃÄ¥¤ê½Ð¤¹ */ if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { targetindex = CHAR_getWorkInt( toindex, CHAR_WORKPARTYINDEX1); if( !CHAR_CHECKINDEX( targetindex) ) { print( " %s:%d err\n", __FILE__, __LINE__); continue; } if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS) { continue; } } else { targetindex = toindex; } /* ¿Æ¤È £±¬¤°Ê ¤Ë¤¤¤ë¤« */ if( NPC_Util_CharDistance( charaindex, targetindex ) > 1) { continue; } /* Àï ¤Ï¤Ç¤Ê¤¤»ö¡e*/ if( CHAR_getWorkInt( targetindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE ){ continue; } /* Ãç´Öµö²Ä¥â¡¼¥É¤« */ if( !CHAR_getFlg( targetindex, CHAR_ISPARTY) ) continue; #ifdef _ANGEL_SUMMON if( CHAR_getWorkInt( targetindex, CHAR_WORKANGELMODE) == TRUE) { CHAR_talkToCli( charaindex, -1, "¨ÏªÌ¤£¥i¥H·í»â¶¤¡C", CHAR_COLORYELLOW); continue; } #endif #ifdef _ESCAPE_RESET // ¨Ï¥Î´cÄ_°k¶]«áx¤ÀÄÁ¤º¤£¥i»P¤H²Õ¶¤ if( getStayEncount( getfdFromCharaIndex(targetindex) ) ) { //print(" ´cÄ_¤¤²Õ¶¤ "); if( time(NULL) - CHAR_getWorkInt( targetindex, CHAR_WORKLASTESCAPE) < 5*60 ) { //print(" ´cÄ_°k¶]«á²Õ¶¤ "); CHAR_talkToCli( charaindex, -1, "¦¹¤H¼È®É¤£¥i¥H·í»â¶¤¡C", CHAR_COLORYELLOW); continue; } } #endif } /* ¥Þ¥ó¥â¥¹¥Ð¥¹¤¬¤¤¤ë»þ¤Ï¡f¿Í´Ö¤è¤êÍ¥À褹¤ë¡e */ else if( CHAR_getInt( toindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) { targetindex = toindex; cnt = 0; if( !NPC_BusCheckJoinParty( toindex, charaindex, TRUE)) { /* ¾ò·ï¤ò ¤¿¤µ¤Ê¤«¤Ã¤¿¡eÃç´Ö ¤ë¤Î¤Ï½ª¤ï¤ë¡e¿Í´Ö¤Î½è ¤â¤·¤Ê¤¤¡e * ¤ä¤ä¤³¤·¤¤¤Î¤Ç¡e */ break; } { // Arminius 7.10 Airplane int busimg=CHAR_getInt(toindex, CHAR_BASEIMAGENUMBER); if ((busimg!=100355) && (busimg!=100461)) { CHAR_setInt(charaindex,CHAR_BASEIMAGENUMBER,busimg); CHAR_sendCToArroundCharacter( CHAR_getWorkInt( charaindex , CHAR_WORKOBJINDEX )); // Robin debug 01/11/21 if( CHAR_getInt( charaindex, CHAR_RIDEPET) != -1 ) { CHAR_setInt( charaindex, CHAR_RIDEPET, -1); CHAR_send_P_StatusString( charaindex, CHAR_P_STRING_RIDEPET); } /* CHAR_sendPMEToArroundCharacterFLXY(charaindex, CHAR_getInt( charaindex, CHAR_FLOOR), CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y), 0,1,CHAR_getInt( charaindex, CHAR_PETMAILEFFECT) ); */ } } } /* ¥×¥ì¥¤¥ä¡¼Ëô¤Ï¥Þ¥ó¥â¥¹¥Ð¥¹°Ê³°¤Ï »ë¤¹¤ë */ else { continue; } /* Áê¼ê¥Ñ¡¼ ¥£¤Î¿Í¿ô¤Ï ¤«¡ª */ parray = CHAR_getEmptyPartyArray( targetindex) ; if( parray == -1 ) continue; /* ¤³¤³¤Þ¤Ç¤¯¤ì¤Ð */ CONNECT_setJoinpartycharaindex( fd,cnt,toindex); cnt++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; /* ¥Þ¥ó¥â¥¹¥Ð¥¹ ¸«¤·¤À¤¤¡f¥ë¡¼¥×¤ò ¤±¤ë¡e */ if( CHAR_getInt( targetindex, CHAR_WHICHTYPE) == CHAR_TYPEBUS ) break; } if( cnt == 0 ) { if( found == TRUE) { CHAR_talkToCli( charaindex, -1, "µLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); } result = FALSE; }else if( cnt == 1 ) { #ifdef _DEATH_CONTEND int toindex = CONNECT_getJoinpartycharaindex( fd, 0); if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ }else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ CHAR_talkToCli( charaindex, -1, "¶¤¥î¤£¦P¡AµLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); result = FALSE; }else{ #endif CHAR_JoinParty_Main( charaindex, CONNECT_getJoinpartycharaindex(fd,0)); result = TRUE; #ifdef _DEATH_CONTEND } #endif }else { int strlength; char msgbuf[1024]; char escapebuf[2048]; #ifdef _DEATH_CONTEND int toindex = CONNECT_getJoinpartycharaindex( fd, 0); if(CHAR_getInt(toindex,CHAR_PKLISTTEAMNUM) == -1 && CHAR_getInt(charaindex,CHAR_PKLISTTEAMNUM) == -1){ }else if( CHAR_getInt( charaindex, CHAR_PKLISTLEADER ) > 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) < 0 || CHAR_getInt( toindex, CHAR_PKLISTTEAMNUM) != CHAR_getInt( charaindex, CHAR_PKLISTTEAMNUM) || CHAR_getInt(toindex,CHAR_WHICHTYPE) != CHAR_TYPEPLAYER){ CHAR_talkToCli( charaindex, -1, "¶¤¥î¤£¦P¡AµLªk¥[¤J¹Î¶¤¡C", CHAR_COLORYELLOW); result = FALSE; } #endif strcpy( msgbuf, "1\n©M½Ö²Õ¦¨¹Î¶¤©O¡H\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getJoinpartycharaindex( fd,i ) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getJoinpartycharaindex(fd,i) , CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%dµøµ¡°T®§buffer¤£¨¬¡C\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTPARTY, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); } if( result != -1 ) { lssproto_PR_send( fd, 1, result); } return result; }
int BATTLE_ai_all( int battleindex, int side, int turn) { int i; int rc = FALSE; BATTLE_ENTRY *pEntry; struct B_AI_RESULT result; if( BATTLE_CHECKINDEX( battleindex ) == FALSE )return BATTLE_ERR_BATTLEINDEX; if( BATTLE_CHECKSIDE( side ) == FALSE )return BATTLE_ERR_PARAM; if( BATTLE_CHECKSIDE( side ^1) == FALSE )return BATTLE_ERR_PARAM; if( BattleArray[battleindex].Side[side].type != BATTLE_S_TYPE_ENEMY ) return FALSE; pEntry = BattleArray[battleindex].Side[side^1].Entry; for( i = 0; i < BATTLE_ENTRY_MAX; i ++ ){ int charaindex = BattleArray[battleindex].Side[side].Entry[i].charaindex; int mode; if( CHAR_CHECKINDEX( charaindex ) == FALSE )continue; mode = CHAR_getWorkInt( charaindex, CHAR_WORKTACTICS); if( mode < 0 || mode >= arraysizeof( functbl)){ print( "BATTLE_ai_all ÖÐ,Õ½¶·Â߼ģʽºÜÆæ¹Ö(%s)(%d)\n", CHAR_getUseName( charaindex ), mode ); mode = 1; } if( BATTLE_IsCharge( charaindex ) == TRUE ){ CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); continue; } if( BattleArray[battleindex].Side[side].flg & BSIDE_FLG_SURPRISE) { CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, BATTLE_COM_NONE ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); }else { if( functbl[mode] != NULL ) { rc = functbl[mode]( turn, charaindex, pEntry, &result); if( BATTLE_CanMoveCheck( charaindex ) == FALSE ){ result.command = BATTLE_COM_NONE; } } if( rc ) { #ifdef _BATTLENPC_WARP_PLAYER if(result.command==BATTLE_COM_WARP){ for( i=0; i<BATTLE_ENTRY_MAX; i++){ int tindex = (pEntry+i)->charaindex; if( !CHAR_CHECKINDEX( tindex ))continue; if( CHAR_getFlg( tindex, CHAR_ISDIE)) continue; if( CHAR_getWorkInt( tindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_RESCUE ) continue; if( CHAR_getInt( tindex, CHAR_WHICHTYPE)==CHAR_TYPEPLAYER){ char sBuff[1024]="", sBuff1[1024]=""; int ss[3]; int sii; int rc = 1; if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_ACT_CONDITION), "wp", sBuff, sizeof( sBuff))!=NULL){ for( sii=1; sii<=3; sii++){ if(getStringFromIndexWithDelim( sBuff, ";", sii, sBuff1, sizeof( sBuff1))) {ss[sii-1]=atoi(sBuff1);} else {rc=0;} } if(rc){ CHAR_warpToSpecificPoint( tindex, ss[0], ss[1], ss[2]); BATTLE_WatchStop( tindex); } } } } } #endif CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM1, result.command ); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLECOM2, result.target + (side^1)*SIDE_OFFSET); CHAR_setWorkInt( charaindex, CHAR_WORKBATTLEMODE, BATTLE_CHARMODE_C_OK ); //CHAR_SETWORKINT_LOW( charaindex, CHAR_WORKBATTLECOM3, array); } } } return TRUE; }
static int BATTLE_ai_normal( int turn, int charaindex, BATTLE_ENTRY *pEntry, struct B_AI_RESULT *result) { int at[B_AI_NORMAL_ATTACKSUBOPTIONNUM] = { 0,0,0}; /* »«×óÃóÆËÒà¼þ */ int gu[B_AI_NORMAL_GUARDSUBOPTIONNUM] = {0}; /* ×óÃóÆËÒà¼þ */ int ma[B_AI_NORMAL_MAGICSUBOPTIONNUM] = {0}; /* ×óÃóÆËÒà¼þ */ int es[B_AI_NORMAL_ESCAPESUBOPTIONNUM] = {0}; /* ×óÃóÆËÒà¼þ */ int wa[B_AI_NORMAL_WAZASUBOPTIONNUM] = {0,0,0,0, 0,0,0};/* ×óÃóÆËÒà¼þ */ #ifdef _ENEMY_ATTACK_AI int rn[B_AI_NORMAL_RANDOMOPTIONNUM] = {1}; #endif int target[BATTLE_ENTRY_MAX]; int cnt; int i; int r; int rc; int mode=0; char buff[256]; char buff2[256]; if( turn == 1 ) { print( "Ó¦¸ÃûÕâ»ØÊ¡£\n" ); return FALSE; } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_ATTACKOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_ATTACKSUBOPTIONNUM + 1; i ++ ) { rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2)); if( rc != TRUE ) { print( "battle_ai.c:Invarid Param [%s]\n", CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION)); return FALSE; } at[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_GUARDOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_GUARDSUBOPTIONNUM + 1; i ++ ) { rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2)); if( rc != TRUE ) { print( "battle_ai.c:Invarid Param [%s]\n", CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION)); return FALSE; } gu[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_MAGICOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_MAGICSUBOPTIONNUM + 1; i ++ ) { rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2)); if( rc != TRUE ) { print( "battle_ai.c:Invarid Param [%s]\n", CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION)); return FALSE; } ma[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_ESCAPEOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_ESCAPESUBOPTIONNUM + 1; i ++ ) { rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2)); if( rc != TRUE ) { print( "battle_ai.c:Invarid Param [%s]\n", CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION)); return FALSE; } es[i-1] = atoi( buff2); } } if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_WAZAOPTION, buff, sizeof( buff)) != NULL ){ for( i = 1; i < B_AI_NORMAL_WAZASUBOPTIONNUM + 1; i ++ ) { rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2)); if( rc != TRUE ) { }else{ wa[i-1] = atoi( buff2); } } } #ifdef _ENEMY_ATTACK_AI if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION), B_AI_NORMAL_RANDAOPTION, buff, sizeof( buff))!=NULL){ for( i=1; i<B_AI_NORMAL_RANDOMOPTIONNUM+1; i++){ rc = getStringFromIndexWithDelim( buff, ";", i, buff2, sizeof( buff2)); if(rc!=TRUE){ print( "battle_ai.c:Invarid Param [%s]\n", CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_TACTICSOPTION)); return FALSE; } rn[i-1] = atoi( buff2); } } #endif #ifdef _BATTLENPC_WARP_PLAYER if( NPC_Util_GetStrFromStrWithDelim( CHAR_getWorkChar( charaindex, CHAR_WORKBATTLE_ACT_CONDITION), "tn", buff, sizeof( buff))!=NULL){ int sTurn = atoi( buff); if(CHAR_getWorkInt( charaindex, CHAR_WORKTURN)==0) CHAR_setWorkInt( charaindex, CHAR_WORKTURN, 1); else CHAR_setWorkInt( charaindex, CHAR_WORKTURN, CHAR_getWorkInt( charaindex, CHAR_WORKTURN)+1); if(sTurn==CHAR_getWorkInt( charaindex, CHAR_WORKTURN)){ result->command = BATTLE_COM_WARP; return TRUE; } } #endif if( at[0] == 0 && gu[0] == 0 && ma[0] == 0 && es[0] == 0 ){ for( i = 0; i < B_AI_NORMAL_WAZASUBOPTIONNUM; i ++ ){ if( wa[i] != 0 )break; } if( i >= B_AI_NORMAL_WAZASUBOPTIONNUM ){ print( "ÎÞÖ¸¶¨ÈκεĹ¥»÷·½Ê½¡£\n" ); return FALSE; } } while( !mode ) { int work = 0; work = at[0]+gu[0]+ma[0]+es[0]; for( i = 0; i < B_AI_NORMAL_WAZASUBOPTIONNUM; i ++ ){ work += wa[i]; } r = RAND( 0, work - 1 ); if( at[0] != 0 && r < at[0] ) mode = B_AI_ATTACKMODE; else if( gu[0] != 0 && r < at[0] + gu[0]) mode = B_AI_GURADMODE; else if( ma[0] != 0 && r < at[0] + gu[0] + ma[0]) mode = B_AI_MAGICMODE; else if( es[0] != 0 && r < at[0] + gu[0] + ma[0] + es[0] ){ mode = B_AI_ESCAPEMODE; } if( mode ) break; work = at[0] + gu[0] + ma[0] + es[0]; for( i = 0; i < B_AI_NORMAL_WAZASUBOPTIONNUM; i ++ ){ work += wa[i]; if( wa[i] != 0 && r < work ){ mode = B_AI_WAZAMODE0+i; break; } } } if( mode == B_AI_ATTACKMODE || ( B_AI_WAZAMODE0 <= mode && mode <= B_AI_WAZAMODE6 )){ while( 1 ) { for( i = 0 ; i < BATTLE_ENTRY_MAX; i ++ ) { target[i] = -1; } cnt = 0; for( i = 0; i < BATTLE_ENTRY_MAX ; i ++ ) { int tindex = (pEntry+i)->charaindex; if( !CHAR_CHECKINDEX( tindex ))continue; if( CHAR_getFlg( tindex, CHAR_ISDIE)) continue; if( CHAR_getWorkInt( tindex, CHAR_WORKBATTLEMODE) == BATTLE_CHARMODE_RESCUE ) continue; switch( at[1]) { case B_AI_NORMAL_TARGET_PLAYER: if( CHAR_getInt( tindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER ){ target[cnt++] = i; } break; case B_AI_NORMAL_TARGET_PET: if( CHAR_getInt( tindex, CHAR_WHICHTYPE) == CHAR_TYPEPET){ target[cnt++] = i; } break; #ifdef _ENEMY_ATTACK_AI case B_AI_NORMAL_TARGET_LEADER: if( CHAR_getWorkInt( tindex, CHAR_WORKPARTYMODE ) == CHAR_PARTY_LEADER) { target[cnt++] = i; }else if(!RAND( 0, 2)) { target[cnt++] = i; } break; #endif default: target[cnt++] = i; break; } } if( cnt == 0 && at[1] == B_AI_NORMAL_TARGET_ALL ) return FALSE; if( cnt > 0 ) break; at[1] = B_AI_NORMAL_TARGET_ALL; } result->command = BATTLE_COM_NONE; if( at[2] == B_AI_NORMAL_SELECT_RANDOM ) { r = RAND( 0, cnt-1); result->command = BATTLE_COM_ATTACK; result->target = target[r]; }else if( at[2] == B_AI_NORMAL_SELECT_HP_MAX || at[2] == B_AI_NORMAL_SELECT_HP_MIN ){ int top = 0; for( i = 0; i < cnt; i ++ ) { if( i ==0 ) top = target[i]; else { int tophp = CHAR_getInt((pEntry+top)->charaindex, CHAR_HP); int comphp = CHAR_getInt((pEntry+target[i])->charaindex, CHAR_HP); if( at[2] == B_AI_NORMAL_SELECT_HP_MAX ) { if( comphp > tophp ) top = target[i]; } else { if( comphp < tophp ) top = target[i]; } } } #ifdef _ENEMY_ATTACK_AI if(!RAND( 0, rn[0])) result->target = target[RAND( 0, cnt-1)]; else result->target = top; result->command = BATTLE_COM_ATTACK; #else result->command = BATTLE_COM_ATTACK; result->target = top; #endif } #ifdef _ENEMY_ATTACK_AI else if(at[2] == B_AI_NORMAL_SELECT_STR_MAX) { int top = 0; for( i=0; i<cnt; i++) { if(i==0) top = target[i]; else { int topstr = CHAR_getInt( (pEntry+top)->charaindex, CHAR_STR); int compstr = CHAR_getInt( (pEntry+target[i])->charaindex, CHAR_STR); if(compstr>topstr) top = target[i]; } } if(!RAND( 0, rn[0])) result->target = target[RAND( 0, cnt-1)]; else result->target = top; result->command = BATTLE_COM_ATTACK; } else if(at[2] == B_AI_NORMAL_SELECT_DEX_MAX || at[2] == B_AI_NORMAL_SELECT_DEX_MIN) { int top = 0; for( i=0; i<cnt; i++) { if(i==0) top = target[i]; else { int topdex = CHAR_getInt( (pEntry+top)->charaindex, CHAR_DEX); int compdex = CHAR_getInt( (pEntry+target[i])->charaindex, CHAR_DEX); if(at[2]==B_AI_NORMAL_SELECT_DEX_MAX) { if(compdex>topdex) top = target[i]; }else { if(compdex<topdex) top = target[i]; } } } if(!RAND( 0, rn[0])) result->target = target[RAND( 0, cnt-1)]; else result->target = top; result->command = BATTLE_COM_ATTACK; } else if(at[2] == B_AI_NORMAL_SELECT_ATT_SUBDUE) { int top = 0; for( i=0; i<cnt; i++) { if(i==0) top = target[i]; else { switch(GetSubdueAttribute(charaindex)) { case AI_ATT_EARTHAT: { int topatt = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXEARTHAT); int compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXEARTHAT); if(compatt>topatt) top = target[i]; } break; case AI_ATT_WATERAT: { int topatt = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXWATERAT); int compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXWATERAT); if(compatt>topatt) top = target[i]; } break; case AI_ATT_FIREAT: { int topatt = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXFIREAT); int compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXFIREAT); if(compatt>topatt) top = target[i]; } break; case AI_ATT_WINDAT: { int topatt = CHAR_getWorkInt( (pEntry+top)->charaindex, CHAR_WORKFIXWINDAT); int compatt = CHAR_getWorkInt( (pEntry+target[i])->charaindex, CHAR_WORKFIXWINDAT); if(compatt>topatt) top = target[i]; } break; default: break; } } } if(!RAND( 0, rn[0])) result->target = target[RAND( 0, cnt-1)]; else result->target = top; result->command = BATTLE_COM_ATTACK; } #endif else{ return FALSE; } if( B_AI_WAZAMODE0 <= mode && mode <= B_AI_WAZAMODE6 ){ if( PETSKILL_Use( charaindex, mode - B_AI_WAZAMODE0, result->target,NULL ) == TRUE ){ result->command = CHAR_getWorkInt( charaindex, CHAR_WORKBATTLECOM1 ); return TRUE; }else{ //print( "´ËÏî¼¼ÄÜÉÐδÉ趨(%s):(%d)\n", // CHAR_getUseName( charaindex), mode - B_AI_WAZAMODE0 ); return FALSE; } }else if( mode == B_AI_ATTACKMODE ){ result->command = BATTLE_COM_ATTACK; return TRUE; } }else if( mode == B_AI_GURADMODE ) { result->command = BATTLE_COM_GUARD; return TRUE; }else if( mode == B_AI_ESCAPEMODE ) { result->command = BATTLE_COM_ESCAPE; return TRUE; } return FALSE; }
BOOL ADDRESSBOOK_addEntry( int meindex ) { int objbuf[20]; int found_count; int front_x , front_y; int i; int cnt = 0; int fd; char *mycd , *tocd; BOOL found = FALSE; if( !CHAR_CHECKINDEX( meindex ) )return FALSE; fd = getfdFromCharaIndex( meindex); if( fd == -1 ) return FALSE; if( ADDRESSBOOK_findBlankEntry( meindex ) < 0) { CHAR_talkToCli( meindex , -1,ADDRESSBOOK_MYTABLEFULL,CHAR_COLORWHITE ); return FALSE; } for( i = 0; i < CONNECT_WINDOWBUFSIZE; i ++ ) { CONNECT_setTradecardcharaindex( fd,i,-1); } CHAR_getCoordinationDir( CHAR_getInt( meindex, CHAR_DIR ) , CHAR_getInt( meindex , CHAR_X ), CHAR_getInt( meindex , CHAR_Y ) , 1 , &front_x , &front_y ); found_count = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf), CHAR_getInt(meindex,CHAR_FLOOR), front_x,front_y ); if( found_count == 0 ){ CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); return FALSE; } for( i = 0 ; i < found_count; i++ ){ int objindex = objbuf[i]; int index = OBJECT_getIndex( objindex); if( OBJECT_getType(objindex) != OBJTYPE_CHARA ) { continue; } if( CHAR_getInt( index,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ){ continue; } if( index == meindex ) { continue; } found = TRUE; if( CHAR_getWorkInt( index, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE) { continue; } if(!CHAR_getFlg( index, CHAR_ISTRADECARD)) { continue; } if( ADDRESSBOOK_findBlankEntry( index ) < 0 ) { continue; } tocd = CHAR_getChar( index, CHAR_CDKEY); mycd = CHAR_getChar( meindex, CHAR_CDKEY); if( ADDRESSBOOK_getIndexInAddressbook( meindex, tocd, CHAR_getChar( index, CHAR_NAME)) >= 0 && ADDRESSBOOK_getIndexInAddressbook( index, mycd, CHAR_getChar(meindex, CHAR_NAME) ) >= 0 ) { continue; } CONNECT_setTradecardcharaindex( fd,cnt,index); cnt ++; if( cnt == CONNECT_WINDOWBUFSIZE ) break; } if( cnt == 0 ) { if( found ) { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD2, CHAR_COLORWHITE); }else { CHAR_talkToCli( meindex, -1, ADDRESSBOOK_CANTADD, CHAR_COLORWHITE); } return FALSE; } if( cnt == 1 ) { ADDRESSBOOK_addAddressBook( meindex, CONNECT_getTradecardcharaindex(fd,0) ); return TRUE; }else if( cnt > 1 ) { int strlength; char msgbuf[1024]; char escapebuf[2048]; strcpy( msgbuf, "1\n©M½Ö¥æ´«¦W¤ù©O¡H\n"); strlength = strlen( msgbuf); for( i = 0; CONNECT_getTradecardcharaindex(fd,i) != -1 && i< CONNECT_WINDOWBUFSIZE; i ++ ){ char *a = CHAR_getChar( CONNECT_getTradecardcharaindex(fd,i), CHAR_NAME); char buf[256]; snprintf( buf, sizeof( buf),"%s\n", a); if( strlength + strlen( buf) > arraysizeof( msgbuf)){ print( "%s:%dµøµ¡°T®§buffer¤£¨¬¡C\n", __FILE__,__LINE__); break; } strcpy( &msgbuf[strlength], buf); strlength += strlen(buf); } lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT, WINDOW_BUTTONTYPE_CANCEL, CHAR_WINDOWTYPE_SELECTTRADECARD, -1, makeEscapeString( msgbuf, escapebuf, sizeof(escapebuf))); return TRUE; } return FALSE; }
void CHAR_playerWatchfunc( int objmeindex, int objmoveindex, CHAR_ACTION act, int x, int y, int dir, int* opt, int optlen ) { int fd; int meindex; if( !CHECKOBJECTUSE(objmeindex) )return; if( !CHECKOBJECTUSE(objmoveindex))return; if( OBJECT_getType(objmeindex) != OBJTYPE_CHARA )return; meindex = OBJECT_getIndex(objmeindex); if( CHAR_getInt( meindex,CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER )return; fd = getfdFromCharaIndex( meindex ); if( fd == -1 )return; switch( OBJECT_getType(objmoveindex) ) { case OBJTYPE_CHARA: { char buf[128]; if( !CHAR_getFlg( OBJECT_getIndex(objmoveindex),CHAR_ISVISIBLE) ) return; switch( act ) { case CHAR_ACTSTAND: case CHAR_ACTWALK: case CHAR_ACTATTACK: case CHAR_ACTDEAD: case CHAR_ACTMAGIC: case CHAR_ACTITEM: case CHAR_ACTDOWN: case CHAR_ACTSIT: case CHAR_ACTHAND: case CHAR_ACTPLEASURE: case CHAR_ACTANGRY: case CHAR_ACTSAD: case CHAR_ACTDAMAGE: case CHAR_ACTGUARD: case CHAR_ACTTURN: case CHAR_ACTWARP: case CHAR_ACTACTIONWALK: case CHAR_ACTNOD: case CHAR_ACTTHROW: case CHAR_ACTACTIONSTAND: if( CHAR_makeCADefaultString(objmoveindex,buf,sizeof(buf),act) ) { CONNECT_appendCAbuf( fd,buf,strlen(buf)); } break; // shan begin case CHAR_ACTTRADE: if( optlen == 1 ) if( CHAR_makeCAOPT1String( objmoveindex, buf, sizeof( buf), act, opt[0] ) ) CONNECT_appendCAbuf( fd, buf, strlen(buf)); break; // shan end #ifdef _MIND_ICON case CHAR_MIND: if( optlen == 1 ) if( CHAR_makeCAOPT1String( objmoveindex, buf, sizeof(buf), act, opt[0])) CONNECT_appendCAbuf( fd, buf, strlen(buf)); break; #endif #ifdef _ITEM_CRACKER case CHAR_ITEM_CRACKER: if( optlen == 1 ) if( CHAR_makeCAOPT1String( objmoveindex, buf, sizeof(buf), act, opt[0])) CONNECT_appendCAbuf( fd, buf, strlen(buf)); break; #endif case CHAR_ACTEFFECT: if( optlen == 1 ) if( CHAR_makeCAOPT1String(objmoveindex,buf, sizeof(buf),act,opt[0] ) ) CONNECT_appendCAbuf( fd,buf,strlen(buf)); break; case CHAR_ACTPOPUPNAME: case CHAR_ACTLEADER: case CHAR_ACTBATTLEWATCH: if( optlen == 1 ) if( CHAR_makeCAOPT1String(objmoveindex,buf, sizeof(buf),act,opt[0] ) ) CONNECT_appendCAbuf( fd,buf,strlen(buf)); break; case CHAR_ACTBATTLE: if( optlen == 3 ) if( CHAR_makeCAOPT3String( objmoveindex,buf, sizeof(buf), act,opt[0],opt[1],opt[2] ) ) CONNECT_appendCAbuf( fd,buf,strlen(buf)); break; default: break; } break; } case OBJTYPE_ITEM: case OBJTYPE_GOLD: CHAR_sendSpecifiedobjindexCToCharaindex(meindex,objmoveindex); break; default: break; } }
/*------------------------------------------------------------ * 啖 允月[ * 娄醒 * index int 平乓仿及奶件犯永弁旦 * dir int 轾 * 忒曰袄 * CHAR_WALKRET ------------------------------------------------------------*/ static CHAR_WALKRET CHAR_walk_move( int charaindex, int dir ) { int i; int fx,fy,ff; int ox,oy,of; int objbuf[128]; int objbufindex=0; int notover=FALSE; int retvalue=CHAR_WALKSUCCESSED; if( !CHAR_CHECKINDEX( charaindex )) return CHAR_WALKSYSTEMERROR; ox = CHAR_getInt(charaindex,CHAR_X); oy = CHAR_getInt(charaindex,CHAR_Y); of = CHAR_getInt(charaindex,CHAR_FLOOR); CHAR_getCoordinationDir( dir,ox,oy,1,&fx,&fy); ff = of; if( CHAR_getInt( charaindex,CHAR_WHICHTYPE ) == CHAR_TYPEENEMY ){ RECT walkr; POINT nextp; int npccreateindex; npccreateindex = CHAR_getInt( charaindex,CHAR_NPCCREATEINDEX ); if( CHAR_isInvincibleArea( ff,fx,fy)) { CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKEXTEND; goto CHAR_AFTERWALK; } if( NPC_isBoundarySet( npccreateindex ) && NPC_createGetRECT( npccreateindex,&walkr ) == TRUE ) { nextp.x = fx; nextp.y = fy; if( PointInRect( &walkr,&nextp ) == FALSE ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKEXTEND; goto CHAR_AFTERWALK; } }else{ ; } } if( CHAR_getFlg( charaindex, CHAR_ISBIG ) == 1 ){ static POINT offset[5]={ { 0,-1}, {-1, 0}, { 0, 0}, { 1, 0}, { 0, 1}, }; int k; for( k=0 ; k<5; k++ ){ if( !MAP_walkAble( charaindex, ff, fx+offset[k].x, fy+offset[k].y )){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } } }else{ if( CHAR_getDX(dir)*CHAR_getDY(dir) == 0 ){ if( !MAP_walkAble( charaindex,ff, fx, fy ) ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } }else{ int xflg,yflg; if( !MAP_walkAble( charaindex,ff, fx, fy ) ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } xflg = MAP_walkAble( charaindex,of, ox+CHAR_getDX(dir), oy ); yflg = MAP_walkAble( charaindex,of, ox, oy+CHAR_getDY(dir) ); if( !xflg || !yflg ) { CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALK1357; goto CHAR_AFTERWALK; } } } objbufindex = CHAR_getSameCoordinateObjects( objbuf, arraysizeof( objbuf ), ff,fx,fy ); for( i = 0 ; i < objbufindex ; i ++ ){ int objindex= objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: if( !CHAR_getFlg( OBJECT_getIndex(objindex),CHAR_ISOVERED) ){ if(!CHAR_CHECKINDEX(OBJECT_getIndex(objindex))){ printf("自动删除一个问题对象!"); endObjectOne(objindex); break; } notover= TRUE; } break; case OBJTYPE_ITEM: if( !ITEM_getInt( OBJECT_getIndex(objindex), ITEM_ISOVERED ) ) notover= TRUE; break; case OBJTYPE_GOLD: break; default: break; } } if( notover == TRUE ){ CHAR_setInt(charaindex,CHAR_DIR,dir); retvalue = CHAR_WALKHITOBJECT; }else{ for( i = 0 ; i < objbufindex ; i ++ ){ typedef void (*PREOFUNC)(int,int); PREOFUNC pfunc=NULL; int objindex=objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (PREOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_PREOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (PREOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_PREOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex ); } CHAR_setInt(charaindex,CHAR_X,fx); CHAR_setInt(charaindex,CHAR_Y,fy); CHAR_setInt(charaindex,CHAR_FLOOR,ff); CHAR_setInt(charaindex,CHAR_DIR,dir); { int objindex; int ox,oy,of; objindex = CHAR_getWorkInt( charaindex,CHAR_WORKOBJINDEX ); of = OBJECT_setFloor(objindex, CHAR_getInt(charaindex,CHAR_FLOOR)); ox = OBJECT_setX(objindex,CHAR_getInt(charaindex,CHAR_X)); oy = OBJECT_setY(objindex,CHAR_getInt(charaindex,CHAR_Y)); if( !MAP_objmove( objindex, of,ox,oy,ff,fx,fy ) ){ /* 仇氏卅氏升丹仄方丹手卅中 */ fprint( "ERROR MAP_OBJMOVE objindex=%d(%s)\n",objindex, CHAR_getUseName( charaindex ) ); } } CHAR_setInt(charaindex,CHAR_WALKCOUNT, CHAR_getInt(charaindex,CHAR_WALKCOUNT) + 1 ); for( i = 0 ; i < objbufindex ; i ++ ){ typedef void (*POSTOFUNC)(int,int); POSTOFUNC pfunc=NULL; int objindex=objbuf[i]; switch( OBJECT_getType(objindex) ){ case OBJTYPE_CHARA: pfunc = (POSTOFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_POSTOVERFUNC); break; case OBJTYPE_ITEM: pfunc = (POSTOFUNC)ITEM_getFunctionPointer( OBJECT_getIndex(objindex), ITEM_POSTOVERFUNC); break; case OBJTYPE_GOLD: break; default: break; } if( pfunc )pfunc( OBJECT_getIndex(objindex),charaindex ); } objbufindex = CHAR_getSameCoordinateObjects(objbuf, arraysizeof(objbuf), of, ox, oy ); for( i=0 ;i<objbufindex;i++){ typedef void (*OFFFUNC)(int,int); OFFFUNC ofunc=NULL; int objindex = objbuf[i]; switch( OBJECT_getType( objindex ) ){ case OBJTYPE_CHARA: ofunc = (OFFFUNC)CHAR_getFunctionPointer( OBJECT_getIndex(objindex), CHAR_OFFFUNC); break; case OBJTYPE_ITEM: /* 卞窒手仄卅中 */ break; case OBJTYPE_GOLD: /* 卞窒手仄卅中 */ break; default: break; } if( ofunc )ofunc( OBJECT_getIndex(objindex), charaindex ); } } CHAR_AFTERWALK: if( retvalue == CHAR_WALK1357 || retvalue == CHAR_WALKHITOBJECT ){ { int opt[2] = { ox, oy}; CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWALK,opt,2,TRUE ); } CHAR_setWorkChar( charaindex, CHAR_WORKWALKARRAY, ""); if( CHAR_getInt( charaindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWARP,NULL,0,TRUE); } }else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPLAYER ){ BOOL flg = FALSE; int par; int count; CHAR_setWorkInt( charaindex, CHAR_WORKACTION, -1 ); if( CHAR_getWorkInt( charaindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE ){ CHAR_sendCharaAtWalk( charaindex, of,ox,oy,CHAR_getDX(dir), CHAR_getDY(dir)); } { int opt[2] = { ox, oy}; CHAR_sendWatchEvent( CHAR_getWorkInt(charaindex, CHAR_WORKOBJINDEX), CHAR_ACTWALK,opt,2,TRUE ); } if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE) == CHAR_PARTY_CLIENT ) { CHAR_sendMapAtWalk( charaindex, of, ox,oy, CHAR_getInt( charaindex, CHAR_X), CHAR_getInt( charaindex, CHAR_Y)); } count = CHAR_getWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT); if( count > 0 ) { CHAR_setWorkInt( charaindex, CHAR_WORK_TOHELOS_COUNT, count -1); if( count -1 == 0 ) { CHAR_talkToCli( charaindex, -1, "道具的效力已到。", CHAR_COLORWHITE); } } par = ENCOUNT_getEncountPercentMin( charaindex, of,ox,oy); if( par != -1 ) { if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN) != par ){ flg = TRUE; CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN, par); } } par = ENCOUNT_getEncountPercentMax( charaindex, of,ox,oy); if( par != -1 ) { if( CHAR_getWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX) != par ){ flg = TRUE; CHAR_setWorkInt( charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX, par); } } // Arminius 7.12 login announce /* { int enfd = getfdFromCharaIndex( charaindex ); if (CONNECT_get_announced(enfd)==0) { // Robin 0720 //AnnounceToPlayer(charaindex); AnnounceToPlayerWN( enfd ); CONNECT_set_announced(enfd,1); } } */ // Arminius 6.22 check Encounter // Nuke 0622: Provide No Enemy function { int enfd = getfdFromCharaIndex( charaindex ); int eqen = getEqNoenemy( enfd ); // Arminius 7.2: Ra's amulet int noen = getNoenemy(enfd); // Arminius 7.31 cursed stone if (getStayEncount(enfd)>0) { clearStayEncount(enfd); } //print("\n enfd=%d,eqen=%d,noen=%d", enfd, eqen, noen); // Arminius 7.2 Ra's amulet if (eqen>=200) { noen=1; } else if (eqen>=120) { if ((ff==100)||(ff==200)||(ff==300)||(ff==400)||(ff==500)) noen=1; } else if (eqen>=80) { if ((ff==100)||(ff==200)||(ff==300)||(ff==400)) noen=1; } else if (eqen>=40) { if ((ff==100)||(ff==200)) noen=1; } //print("\n noen=%d", noen); if (noen==0) { int maxep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MAX); int minep = CHAR_getWorkInt(charaindex, CHAR_WORKENCOUNTPROBABILITY_MIN); int cep = CONNECT_get_CEP(enfd); if (cep<minep) cep=minep; if (cep>maxep) cep=maxep; if (CHAR_getWorkInt(charaindex,CHAR_WORKBATTLEMODE)==BATTLE_CHARMODE_NONE) { int entflag=1; { int objindex,index; OBJECT obj; for ( obj = MAP_getTopObj( ff, fx, fy); obj; obj = NEXT_OBJECT( obj)) { objindex = GET_OBJINDEX( obj); if (OBJECT_getType( objindex) == OBJTYPE_CHARA) { int etype; index = OBJECT_getIndex( objindex); if (!CHAR_CHECKINDEX( index)) continue; if( CHAR_getInt( index, CHAR_WHICHTYPE) == CHAR_TYPENPCENEMY && CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE) == CHAR_EVENT_ENEMY ) { CHAR_setInt( charaindex, CHAR_X, ox); CHAR_setInt( charaindex, CHAR_Y, oy); lssproto_XYD_send( getfdFromCharaIndex(charaindex), CHAR_getInt( charaindex, CHAR_X ), CHAR_getInt( charaindex, CHAR_Y ), CHAR_getInt( charaindex, CHAR_DIR ) ); break; } etype = CHAR_getWorkInt( index, CHAR_WORKEVENTTYPE); if (etype!=CHAR_EVENT_NONE) { if (etype==CHAR_EVENT_WARP) entflag=0; } } } } #ifdef _ENEMY_ACTION if( rand()%(120*getEnemyAction()) < cep ){ #else if (rand()%120<cep){ // Arminius 6.28 lower encounter prob. #endif if (entflag) { #ifdef _Item_MoonAct if( getEqRandenemy( enfd) > 0 ) { int Rnum=0; int RandEnemy = getEqRandenemy( enfd); Rnum = RAND(0,100); if( Rnum > RandEnemy ) { #endif //encounter!! cep = minep; lssproto_EN_recv(enfd, CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y)); #ifdef _Item_MoonAct } }else{ cep = minep; lssproto_EN_recv(enfd, CHAR_getInt(charaindex,CHAR_X), CHAR_getInt(charaindex,CHAR_Y)); } #endif } } else { if (cep<maxep) cep++; } } CONNECT_set_CEP(enfd, cep); } } if( CHAR_getWorkInt( charaindex, CHAR_WORKPARTYMODE )!= CHAR_PARTY_CLIENT ){ CHAR_setFlg( charaindex, CHAR_ISWARP, 0); } } else if( CHAR_getInt( charaindex, CHAR_WHICHTYPE ) == CHAR_TYPEPET ||
static int CHAR_Talk_check(int talkerindex, int talkedindex, int micflg) { #if 1 if(!CHAR_getFlg(talkerindex, CHAR_ISPARTYCHAT)) { int talker_b_mode = CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEMODE); int talked_b_mode = CHAR_getWorkInt(talkedindex, CHAR_WORKBATTLEMODE); if(talker_b_mode != BATTLE_CHARMODE_NONE && CHAR_getInt(talkedindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) { return FALSE; } if(micflg != 0)return TRUE; if(talker_b_mode != BATTLE_CHARMODE_NONE && talked_b_mode != BATTLE_CHARMODE_NONE) { if(CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEINDEX) != CHAR_getWorkInt(talkedindex, CHAR_WORKBATTLEINDEX)) { return FALSE; } } else if(talker_b_mode != BATTLE_CHARMODE_NONE || talked_b_mode != BATTLE_CHARMODE_NONE) { return FALSE; } return TRUE; } if(CHAR_getInt(talkerindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER) { int talker_b_mode = CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEMODE); int talked_b_mode = CHAR_getWorkInt(talkedindex, CHAR_WORKBATTLEMODE); if(talker_b_mode != BATTLE_CHARMODE_NONE && CHAR_getInt(talkedindex, CHAR_WHICHTYPE) != CHAR_TYPEPLAYER) { return FALSE; } if(micflg != 0)return TRUE; if(CHAR_getWorkInt(talkerindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) { if(CHAR_getWorkInt(talkedindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE) { if(CHAR_getWorkInt(talkerindex, CHAR_WORKPARTYINDEX1) == CHAR_getWorkInt(talkedindex, CHAR_WORKPARTYINDEX1)) { return TRUE; } } } else { if(talker_b_mode != BATTLE_CHARMODE_NONE && talked_b_mode != BATTLE_CHARMODE_NONE) { if(CHAR_getWorkInt(talkerindex, CHAR_WORKBATTLEINDEX) != CHAR_getWorkInt(talkedindex, CHAR_WORKBATTLEINDEX)) { return FALSE; } } else if(talker_b_mode != BATTLE_CHARMODE_NONE || talked_b_mode != BATTLE_CHARMODE_NONE) { return FALSE; } return TRUE; } } return FALSE; #else int MyBattleMode; int ToBattleMode; MyBattleMode = CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE); ToBattleMode = CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEMODE); /* 爵 及凛 */ if( MyBattleMode == BATTLE_CHARMODE_NONE ) { if( ToBattleMode == BATTLE_CHARMODE_NONE ) { return TRUE; } else { return FALSE; } } /* 爵 及凛 */ else { /* 爵 仄化中卅中谛卞反霜日卅中[ */ if( ToBattleMode == BATTLE_CHARMODE_NONE) { return FALSE; } /* 元爵 匹 元扔奶玉及谛卞仄井霜耨请 卅中 */ if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEINDEX) == CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLEINDEX) && CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLESIDE) == CHAR_getWorkInt( talkedindex, CHAR_WORKBATTLESIDE ) ) { return TRUE; } else { return FALSE; } } return FALSE; #endif }
int NPC_Lua_NLG_UpChar(lua_State *_NLL) { CheckEx(_NLL, 1); CheckIndexNull(_NLL, 1); int TM_Index = (int)lua_tointeger(_NLL, 1); if(!CHAR_CHECKINDEX(TM_Index)) { LRetErrInt(_NLL, -1, "传入的索引是无效的。"); } CHAR_complianceParameter( TM_Index ); if(CHAR_getInt(TM_Index,CHAR_WHICHTYPE)==CHAR_TYPEPET){ int playindex = CHAR_getWorkInt(TM_Index,CHAR_WORKPLAYERINDEX); if(!CHAR_CHECKINDEX(playindex)){ LRetErrInt(_NLL, -1, "传入的索引是无效的。"); }else{ int i; for( i = 0; i < CHAR_MAXPETHAVE; i ++ ) { int workindex = CHAR_getCharPet( playindex, i ); if( workindex == TM_Index ){ CHAR_send_K_StatusString( playindex, i, CHAR_K_STRING_BASEIMAGENUMBER| CHAR_K_STRING_HP| CHAR_K_STRING_MAXHP| CHAR_K_STRING_MP| CHAR_K_STRING_MAXMP| CHAR_K_STRING_EXP| CHAR_K_STRING_NEXTEXP| CHAR_K_STRING_LV| CHAR_K_STRING_ATK| CHAR_K_STRING_DEF| CHAR_K_STRING_QUICK| CHAR_K_STRING_AI| CHAR_K_STRING_EARTH| CHAR_K_STRING_WATER| CHAR_K_STRING_FIRE| CHAR_K_STRING_WIND| CHAR_K_STRING_SLOT| CHAR_K_STRING_CHANGENAMEFLG| CHAR_K_STRING_NAME| CHAR_K_STRING_USERPETNAME); char msgbuf[128]; snprintf( msgbuf, sizeof( msgbuf ), "W%d",i); CHAR_sendStatusString( playindex, msgbuf ); CHAR_sendStatusString( playindex, "P"); break; } } } }else if(CHAR_getInt(TM_Index,CHAR_WHICHTYPE)==CHAR_TYPEPLAYER){ CHAR_send_P_StatusString( TM_Index, CHAR_P_STRING_GOLD ); } if(CHAR_getFlg(TM_Index, CHAR_ISVISIBLE) == FALSE) { int TM_objindex = CHAR_getWorkInt(TM_Index,CHAR_WORKOBJINDEX); CHAR_sendCDArroundChar ( OBJECT_getFloor(TM_objindex), OBJECT_getX(TM_objindex), OBJECT_getY(TM_objindex), TM_objindex ); }else { CHAR_sendCToArroundCharacter( CHAR_getWorkInt( TM_Index , CHAR_WORKOBJINDEX )); } LRetNull(_NLL); }