?? npc_freepetskillshop.c
字號:
#include "version.h"
#include <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "lssproto_serv.h"
#include "pet_skill.h"
#include "readmap.h"
#include "battle.h"
#include "configfile.h"
#include "util.h"
#include "npc_eventaction.h"
#include "npc_freepetskillshop.h"
#ifdef _CFREE_petskill
enum {
CHAR_WORK_SKILLSELECT = CHAR_NPCWORKINT1,
};
enum {
SELECTSKILL_START=10,
SELECTSKILL_TEACH=23,
SELECTSKILL_END=30,
};
enum {
START_WINDOW=0,
SKILL_WINDOW,
MEEND_WINDOW,
};
static void NPC_FreePetSkillShop_selectWindow( int meindex, int toindex, int num,int select);
BOOL NPC_FreePetSkillMakeStr(int meindex,int toindex, int select);
//BOOL NPC_CHECKFREEPETSKILL( int toindex, int petindex, int skillID);
BOOL NPC_SkillShopItemCheck(int meindex,int talker,int itemNo, int cou);
BOOL NPC_SkillShopDelItems(int meindex,int talker, char *buf);
BOOL NPC_SkillShopPetCheck( int toindex, int petindex, int skillID );
BOOL NPC_SkillShopWarp( int meindex, int talkindex);
#define MAXNPCPOINT 10
BOOL NPC_FreePetSkillShopInit( int meindex )
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char msg[256];
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_FREESKILLSHOP );
CHAR_setWorkInt( meindex, CHAR_WORK_SKILLSELECT, 0);
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("GetArgStrErr NO arg !!");
return FALSE;
}
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "pet_skill", msg, sizeof( msg)) != NULL){
char buf[256], filename[256];
int k=1, skillID, skillarray;
while( getStringFromIndexWithDelim( msg, ",", k, buf, sizeof( buf) ) ){
k++;
skillID=atoi(buf);
skillarray = PETSKILL_getPetskillArray( skillID);
if( PETSKILL_CHECKINDEX( skillarray) == FALSE ) continue;
if( PETSKILL_getInt( skillarray, PETSKILL_ILLEGAL) == 1){
if( NPC_Util_CheckAssignArgFile( meindex, filename) != NULL ){
print("\n寵物技能不規范:[%d-%s] ->文件:%s\n",
skillID,
PETSKILL_getChar( skillarray, PETSKILL_NAME),
filename );
}
}
}
}else{
return FALSE;
}
return TRUE;
}
void NPC_FreePetSkillShopTalked( int meindex , int talkerindex , char *szMes ,int color )
{
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
if(NPC_Util_isFaceToFace(talkerindex,meindex,2 )==FALSE){
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
}
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 1 );
NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, START_WINDOW,-1);
}
static void NPC_FreePetSkillShop_selectWindow( int meindex, int toindex, int num,int select)
{
char npcarg[NPC_UTIL_GETARGSTR_BUFSIZE];
char token[1024];
int fd = getfdFromCharaIndex( toindex);
int buttontype = 0, windowtype = 0, windowno = 0;
char buf1[256];
if(NPC_Util_GetArgStr( meindex, npcarg, sizeof(npcarg))==NULL){
print("GetArgStrErr");
return ;
}
switch(num) {
case START_WINDOW:
{
BOOL Evflg = TRUE;
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "start_msg", token, sizeof( token)) == NULL) {
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
return;
}
if( CHAR_getWorkInt( toindex, CHAR_WORKSHOPRELEVANT) != 1 ) {
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
return;
}
//玩家條件判斷
if( NPC_Util_GetStrFromStrWithDelim( npcarg, "FREE", buf1, sizeof( buf1)) != NULL ) {
if( NPC_ActionPassCheck( meindex, toindex, buf1) == FALSE ) {
Evflg = FALSE;
}
}
if( Evflg == FALSE) {
CHAR_talkToCli( toindex, -1, "你想讓寵物學特殊技能?可你的條件還不夠喔!", CHAR_COLORYELLOW);
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 0);
return;
}else {
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
buttontype = WINDOW_BUTTONTYPE_NEXT;
windowno = SELECTSKILL_START;
CHAR_setWorkInt( toindex, CHAR_WORKSHOPRELEVANT, 2);
lssproto_WN_send( fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token );
}
}
break;
case SKILL_WINDOW:
if( NPC_FreePetSkillMakeStr( meindex, toindex, select) == FALSE ) {
print("\n npc_freepetskillshop.c 錯誤");
}
break;
case MEEND_WINDOW:
break;
}
}
void NPC_FreePetSkillShopWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
{
int skill;
int pet;
int slot;
int cost;
int skillID=0;
int petskillindex;
char buf[64];
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
char msg[512];
int petindex;
char msgbuf[128];
double rate= 1.0;
if(NPC_Util_GetArgStr( meindex, argstr, sizeof(argstr))==NULL){
print("GetArgStrErr");
return;
}
if( CHAR_getInt( talkerindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
if(NPC_Util_isFaceToFace(talkerindex,meindex,2 )==FALSE){
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
}
if( CHAR_getWorkInt( talkerindex, CHAR_WORKBATTLEMODE) != BATTLE_CHARMODE_NONE)
return ;
switch( seqno) {
case SELECTSKILL_START:
if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != 2 ) {
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
return;
}
NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, SKILL_WINDOW, -1);
break;
case SELECTSKILL_TEACH:
if( CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT) != 3 ) {
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
return;
}
makeStringFromEscaped( data);
getStringFromIndexWithDelim(data,"|",1,buf,sizeof(buf));
skill=atoi(buf);
getStringFromIndexWithDelim(data,"|",2,buf,sizeof(buf));
pet=atoi(buf);
getStringFromIndexWithDelim(data,"|",3,buf,sizeof(buf));
slot=atoi(buf);
getStringFromIndexWithDelim(data,"|",4,buf,sizeof(buf));
cost=atoi(buf);
if( NPC_Util_GetStrFromStrWithDelim( argstr, "pet_skill", msg, sizeof( msg)) != NULL){
getStringFromIndexWithDelim(msg,",",skill,buf,sizeof(buf));
skillID=atoi(buf);
}
slot--;
if( slot < 0 ) return;
petindex = CHAR_getCharPet( talkerindex, pet-1);
if( !CHAR_CHECKINDEX(petindex) ){
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return ;
}
if( NPC_Util_GetStrFromStrWithDelim( argstr, "skill_rate", msg, sizeof( msg)) != NULL){
rate = atof( msg);
}
petskillindex = PETSKILL_getPetskillArray( skillID );
if( !PETSKILL_CHECKINDEX( petskillindex)){
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return ;
}
cost = PETSKILL_getInt( petskillindex, PETSKILL_COST );
cost = cost * rate;
//條件判斷
if(CHAR_getInt(talkerindex,CHAR_GOLD) < cost){
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
return;
}
if( NPC_CHECKFREEPETSKILL( talkerindex, petindex, skillID ) == TRUE ){
if( Action_RunDoEventAction( meindex, talkerindex, argstr) == FALSE ){
CHAR_talkToCli( talkerindex, -1, "所需物品不足!!", CHAR_COLORYELLOW);
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
CHAR_setWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT, 0);
return;
}
CHAR_setPetSkill( petindex, slot, skillID);
CHAR_setInt( talkerindex, CHAR_GOLD, ( CHAR_getInt( talkerindex, CHAR_GOLD) - cost) );
snprintf( msgbuf, sizeof( msgbuf ), "W%d",pet-1);
CHAR_sendStatusString( talkerindex, msgbuf );
CHAR_sendStatusString( talkerindex, "P");
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
//WARP
if( NPC_SkillShopWarp( meindex, talkerindex) == TRUE )
return;
}else {
CHAR_send_P_StatusString( talkerindex, CHAR_P_STRING_GOLD);
CHAR_talkToCli( talkerindex, -1, "條件不足!!", CHAR_COLORYELLOW);
}
//ADD
NPC_FreePetSkillShop_selectWindow( meindex, talkerindex, SKILL_WINDOW, -1);
break;
case SELECTSKILL_END:
break;
}
return;
}
BOOL NPC_CHECKFREEPETSKILL( int toindex, int petindex, int skillID)
{
int skillindex=-1;
char SCode[256];
char Free[256];
int i, petID;
skillindex = PETSKILL_getPetskillArray( skillID );
memset( Free, 0, sizeof( Free));
if( !PETSKILL_CHECKINDEX( skillindex) ) {
return FALSE;
}
petID = CHAR_getInt( petindex, CHAR_PETID);
sprintf( SCode, "%s", PETSKILL_getChar( skillindex, PETSKILL_KINDCODE));
sprintf( Free, "%s", PETSKILL_getChar( skillindex, PETSKILL_FREE));
//CHECK CODE
if( !strcmp( SCode, "\0")) {
return TRUE;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -