1808 lines
60 KiB
C
1808 lines
60 KiB
C
![]() |
#include "version.h"
|
|||
|
#include <time.h>
|
|||
|
#include <string.h>
|
|||
|
#include "char.h"
|
|||
|
#include "object.h"
|
|||
|
#include "char_base.h"
|
|||
|
#include "npcutil.h"
|
|||
|
#include "lssproto_serv.h"
|
|||
|
#include "handletime.h"
|
|||
|
#include "readmap.h"
|
|||
|
#include "log.h"
|
|||
|
#include "enemy.h"
|
|||
|
#include "npc_eventaction.h"
|
|||
|
#include "pet.h"
|
|||
|
#include "battle.h"
|
|||
|
#include "chatmagic.h"
|
|||
|
|
|||
|
#ifdef _NPC_MAGICCARD
|
|||
|
#include "npc_magiccard.h"
|
|||
|
|
|||
|
void NPC_Magiccard_selectWindow(int meindex,int toindex,int num,int select);
|
|||
|
int NPC_magiccard_checkplace( int meindex , int toindex , char *token );
|
|||
|
void NPC_magiccard_gameinit( int meindex , int bkid );
|
|||
|
void NPC_magiccard_selectcard( int meindex , int bkid );
|
|||
|
void NPC_magiccard_checkselect( int meindex , int toindex ,int choise);
|
|||
|
void NPC_magiccard_waitselect( int meindex , int bkid );
|
|||
|
void NPC_magiccard_aiselect( int meindex , int bkid );
|
|||
|
//void NPC_magiccard_showcard( int meindex , int bkid );
|
|||
|
//void NPC_magiccard_summonpet(int meindex , int bkid , int charindex , int mode );
|
|||
|
//void NPC_magiccard_fightcard( int meindex , int bkid , int playtotal);
|
|||
|
//void NPC_magiccard_damage( int meindex , int bkid , int charindex , int player , int playtotal);
|
|||
|
void NPC_magiccard_out( int meindex , int bkid , int player );
|
|||
|
void NPC_magiccard_turnover( int meindex , int bkid );
|
|||
|
void NPC_magiccard_gameover( int meindex , int bkid );
|
|||
|
void NPC_magiccard_resetbanker( int meindex , int bkid );
|
|||
|
int NPC_magiccard_checkExist( int meindex , int bkid , int player );
|
|||
|
//void NPC_magiccard_action( int meindex , int charindex , int bkid , int player );
|
|||
|
void NPC_magiccard_selectback( int meindex , int toindex );
|
|||
|
void NPC_magiccard_action2( int meindex , int charindex , int user , int card , int action );
|
|||
|
void NPC_magiccard_checkdamage( int meindex , int bkid );
|
|||
|
void NPC_magiccard_showdamage( int meindex , int charindex , int position , int damage );
|
|||
|
void NPC_magiccard_specialcard( int meindex , int bkid );
|
|||
|
int NPC_magiccard_sort( const void *card1, const void *card2 );
|
|||
|
|
|||
|
enum {
|
|||
|
NPC_WORK_BANKER = CHAR_NPCWORKINT1, // <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ׯ<EFBFBD><D7AF><EFBFBD><EFBFBD>
|
|||
|
NPC_WORK_GIVEGOLD = CHAR_NPCWORKINT2, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD><D5BD><EFBFBD>Ƿ<EFBFBD><C7B7>Ǹ<EFBFBD><C7B8><EFBFBD>֤<EFBFBD><D6A4><EFBFBD><EFBFBD>
|
|||
|
//NPC_WORK_ABANDON = CHAR_NPCWORKINT2, // <20><>ս<EFBFBD><D5BD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//NPC_WORK_TURN = CHAR_NPCWORKINT3, // <20><>¼<EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
|
|||
|
NPC_WORK_HAND = CHAR_NPCWORKINT4, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD>
|
|||
|
NPC_WORK_SELECT = CHAR_NPCWORKINT5, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD><D5BD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
NPC_WORK_ACTION = CHAR_NPCWORKINT6, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD><D5BD>ѡ<EFBFBD><EFBFBD><F1B9A5BB><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>
|
|||
|
NPC_WORK_HISTORY = CHAR_NPCWORKINT7, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
NPC_WORK_DAMAGE = CHAR_NPCWORKINT8, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD><D5BD><EFBFBD>ܵ<EFBFBD><DCB5>˺<EFBFBD>
|
|||
|
//NPC_WORK_LOCATION = CHAR_NPCWORKINT9, // <20><>¼<EFBFBD><C2BC>ս<EFBFBD>ߵ<EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
//NPC_WORK_ = CHAR_NPCWORKINT10, // <20><>¼ׯ<C2BC>ҵ<EFBFBD>index
|
|||
|
};
|
|||
|
|
|||
|
enum {
|
|||
|
ATTACK=1,
|
|||
|
DEFENCE,
|
|||
|
MAGIC,
|
|||
|
};
|
|||
|
|
|||
|
enum {
|
|||
|
START,
|
|||
|
RULES,
|
|||
|
INGAME,
|
|||
|
SCORE,
|
|||
|
END,
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
#define LOOPTIME 100 // 0.1<EFBFBD><EFBFBD>
|
|||
|
#define SHOWCARDLOOPTIME 800//1000 //1<><31>
|
|||
|
#define FIGHTLOOPTIME 800//1000//2000
|
|||
|
#define TURNOVERTIME 1300//1500//4000
|
|||
|
#define GAMEOVERTIME 4800//5000
|
|||
|
|
|||
|
#define MAXHP 50
|
|||
|
#define MAXGUY 6
|
|||
|
#define BANKERID 6
|
|||
|
|
|||
|
#define SHIFTBASE 1 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƵĻ<C6B5>ֵ
|
|||
|
//#define MAGIC_MOVE_SCREEN_XY (18 << 16) | 10 // ӫĻҪ<C4BB>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>XY<58><59><EFBFBD><EFBFBD>
|
|||
|
//#define MAGIC_MOVE_SCREEN_XY (14 << 16) | 13 // ӫĻҪ<C4BB>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>XY<58><59><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
struct BANKER banker[BANKERTOTAL];
|
|||
|
|
|||
|
int Bettotal[BANKERTOTAL];
|
|||
|
int Wintotal[BANKERTOTAL];
|
|||
|
int tickettotal[BANKERTOTAL];
|
|||
|
|
|||
|
//λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
typedef struct Posstruct
|
|||
|
{
|
|||
|
int humanX;
|
|||
|
int humanY;
|
|||
|
int petX;
|
|||
|
int petY;
|
|||
|
int npcX;
|
|||
|
int npcY;
|
|||
|
int direct;
|
|||
|
}Position;
|
|||
|
static Position Positiontable[]=
|
|||
|
{
|
|||
|
{19,12,17,12,15,13,6}, //0 <20><>ս<EFBFBD><D5BD>
|
|||
|
{18,17,16,15,15,14,7}, //1 <20><>ս<EFBFBD><D5BD>
|
|||
|
{13,18,13,16,14,14,0}, //2 <20><>ս<EFBFBD><D5BD>
|
|||
|
{ 9,14,11,14,13,13,2}, //3 <20><>ս<EFBFBD><D5BD>
|
|||
|
{10, 9,12,11,13,12,3}, //4 <20><>ս<EFBFBD><D5BD>
|
|||
|
{15, 8,15,10,14,12,4}, //5 <20><>ս<EFBFBD><D5BD>
|
|||
|
{15,12,14,13,14,13,5}, //6 ׯ<><D7AF>
|
|||
|
{24,18, 0, 0,0,0,6}, //7 <20><><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
/*
|
|||
|
{23, 9,21, 9,6}, //0 <20><>ս<EFBFBD><D5BD>
|
|||
|
{22,14,20,12,7}, //1 <20><>ս<EFBFBD><D5BD>
|
|||
|
{17,15,17,13,0}, //2 <20><>ս<EFBFBD><D5BD>
|
|||
|
{13,11,15,11,2}, //3 <20><>ս<EFBFBD><D5BD>
|
|||
|
{14, 6,16, 8,3}, //4 <20><>ս<EFBFBD><D5BD>
|
|||
|
{19, 5,19, 7,4}, //5 <20><>ս<EFBFBD><D5BD>
|
|||
|
{18,18,18,10,5}, //6 ׯ<><D7AF>
|
|||
|
{15,13, 0, 0,6}, //7 <20><><EFBFBD><EFBFBD>
|
|||
|
*/
|
|||
|
};
|
|||
|
|
|||
|
typedef struct st_cardbox
|
|||
|
{
|
|||
|
BOOL use;
|
|||
|
int cardindex;
|
|||
|
}CardBoxType;
|
|||
|
static CardBoxType Cardbox[BANKERTOTAL*7][30];
|
|||
|
|
|||
|
//ħ<><C4A7><EFBFBD><EFBFBD>
|
|||
|
typedef struct Cardstruct
|
|||
|
{
|
|||
|
STRING64 name;
|
|||
|
int petid;
|
|||
|
int attack;
|
|||
|
int defence;
|
|||
|
int effect;
|
|||
|
void* functionPointer;
|
|||
|
}Cardfunction;
|
|||
|
static Cardfunction Cardfunctiontable[]=
|
|||
|
{
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1: <20>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD> <20><> 13 <20><> 1"} ,2565 ,13 , 1 , 101437,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2: <20><><EFBFBD><EFBFBD> <20><> 13 <20><> 1"} ,0 ,13 , 1 , 101962,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 13 <20><> 1"} ,2571 ,13 , 1 , 101616,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4: <20><><EFBFBD><EFBFBD> <20><> 1 <20><> 13"} ,2563 , 1 ,13 , 101760,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>5: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŵ <20><> 1 <20><> 13"} ,0 , 1 ,13 , 101946,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6: <20><><EFBFBD><EFBFBD>ŷ<EFBFBD><C5B7> <20><> 1 <20><> 13"} ,0 , 1 ,13 , 101485,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>7: <20><><EFBFBD><EFBFBD> <20><> 8 <20><> 8"} ,0 , 8 , 8 , 101180,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>8: <20><>¶<EFBFBD><C2B6> <20><> 8 <20><> 8"} ,0 , 8 , 8 , 100872,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>9: <20><>ŵ<EFBFBD><C5B5> <20><> 8 <20><> 7"} ,0 , 8 , 7 , 101952,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10: <20><><EFBFBD>ַ<EFBFBD> <20><> 8 <20><> 6"} ,0 , 8 , 6 , 101875,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>11: <20><>˹<EFBFBD><CBB9> <20><> 7 <20><> 7"} ,0 , 7 , 7 , 101914,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>12: <20><><EFBFBD><EFBFBD>ŵ˹ <20><> 7 <20><> 7"} ,2456 , 7 , 7 , 101819,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>13: <20><EFBFBD>˹<EFBFBD><CBB9> <20><> 7 <20><> 8"} ,0 , 7 , 8 , 101501,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>14: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 7 <20><> 6"} ,0 , 7 , 6 , 101922,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>15: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˹ <20><> 6 <20><> 6"} ,0 , 6 , 6 , 101464,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 6 <20><> 6"} ,0 , 6 , 6 , 101928,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>17: <20><>˹<EFBFBD><CBB9> <20><> 6 <20><> 8"} ,0 , 6 , 8 , 101446,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>18: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 6 <20><> 7"} ,0 , 6 , 7 , 100390,NULL}, //
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>19: <20><>˹<EFBFBD>ŵ<EFBFBD> <20><> 3 <20><> 3"} ,0 , 3 , 3 , 101954,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>20: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˾ <20><> 3 <20><> 3"} ,0 , 3 , 3 , 101957,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>21: ʷ<><CAB7><EFBFBD><EFBFBD> <20><> 3 <20><> 3"} ,0 , 3 , 3 , 101556,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>22: <20><>˹<EFBFBD><CBB9> <20><> 3 <20><> 2"} ,0 , 3 , 2 , 101933,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>23: <20>ɿɶ<C9BF> <20><> 2 <20><> 3"} ,2570 , 2 , 3 , 100898,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>24: <20><><EFBFBD><EFBFBD> <20><> 2 <20><> 2"} ,0 , 2 , 2 , 101870,NULL},
|
|||
|
{{"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>25: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 2 <20><> 2"} ,0 , 2 , 2 , 101918,NULL},
|
|||
|
{{"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1: <20>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>"} ,2604 , 0 , 0 , 101652,NULL},
|
|||
|
{{"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2: <20><>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><DCB5>Է<EFBFBD><D4B7>κι<CEBA><CEB9><EFBFBD><EFBFBD><EFBFBD>"} ,2605 , 0 , 0 , 101695,NULL},
|
|||
|
{{"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>3: <20><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>ͣһ<CDA3>غϡ<D8BA>"} ,2606 , 0 , 0 , 101120,NULL},
|
|||
|
{{"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>4: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>HP-><3E><>Ѫ<EFBFBD><D1AA>50%<25><>"} ,2607 , 0 , 0 , 101828,NULL},
|
|||
|
{{"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>5: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 20<32><30>"} ,2608 , 20 , 0 , 101628,NULL},
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
BOOL NPC_Magiccard_Init( int meindex )
|
|||
|
{
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
char buf[64];
|
|||
|
int j,k;
|
|||
|
|
|||
|
memset( banker,0,sizeof(banker));
|
|||
|
for(j=0;j<BANKERTOTAL;j++){
|
|||
|
banker[j].state = -1;
|
|||
|
Bettotal[j]=0;
|
|||
|
Wintotal[j]=0;
|
|||
|
tickettotal[j]=0;
|
|||
|
}
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, LOOPTIME );
|
|||
|
|
|||
|
for(j=0;j<14;j++){
|
|||
|
for(k=0;k<30;k++){
|
|||
|
Cardbox[j][k].use = 0;
|
|||
|
Cardbox[j][k].cardindex = k;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL) return FALSE;
|
|||
|
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "ID", buf, sizeof( buf));
|
|||
|
|
|||
|
CHAR_setInt( meindex, CHAR_LV, atoi(buf)); // ׯ<>ҵ<EFBFBD>id<69><64>¼<EFBFBD><C2BC>CHAR_LV
|
|||
|
print("\n ------------bankerid= %d ------------------- ",atoi(buf));
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
void NPC_Magiccard_Talked( int meindex , int talkerindex , char *szMes , int color )
|
|||
|
{
|
|||
|
char argstr[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, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return;
|
|||
|
}
|
|||
|
CHAR_setWorkInt( talkerindex , CHAR_WORKSHOPRELEVANT,0);
|
|||
|
NPC_Magiccard_selectWindow( meindex , talkerindex, START , -1 );
|
|||
|
}
|
|||
|
|
|||
|
void NPC_Magiccard_selectWindow(int meindex,int toindex,int num,int select)
|
|||
|
{
|
|||
|
int fd;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
int i,pagenum;
|
|||
|
int buttontype = 0, windowtype = 0, windowno = 0;
|
|||
|
char token[1024],buf2[256],buf1[256];
|
|||
|
|
|||
|
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
|
|||
|
fd = getfdFromCharaIndex( toindex );
|
|||
|
if( fd == -1 ) return;
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
switch(num)
|
|||
|
{
|
|||
|
case START: //һ<>еĿ<D0B5>ʼ
|
|||
|
i = 1;
|
|||
|
strcpy( token, "\0");
|
|||
|
sprintf( buf2,"%s%d", "menu_msg0", i);
|
|||
|
while( NPC_Util_GetStrFromStrWithDelim( argstr, buf2, buf1, sizeof( buf1) ) != NULL ) {
|
|||
|
if( strstr( buf1, "NULL" ) == NULL ) {
|
|||
|
strcat( token , buf1);
|
|||
|
strcat( token, "\n");
|
|||
|
}else {
|
|||
|
strcat( token, "\n");
|
|||
|
}
|
|||
|
i++;
|
|||
|
sprintf( buf2,"%s%d", "menu_msg0", i);
|
|||
|
}
|
|||
|
windowtype = WINDOW_MESSAGETYPE_SELECT;
|
|||
|
buttontype = WINDOW_BUTTONTYPE_NONE;
|
|||
|
windowno = CHAR_WINDOWTYPE_MAGIC_START;
|
|||
|
break;
|
|||
|
case RULES:
|
|||
|
pagenum = CHAR_getWorkInt( toindex , CHAR_WORKSHOPRELEVANT);
|
|||
|
strcpy( token, "\0");
|
|||
|
if( select >= 0 ){
|
|||
|
sprintf( buf2,"%s%d", "page_num", select);
|
|||
|
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANT, select+1);
|
|||
|
}else{
|
|||
|
sprintf( buf2,"%s%d", "page_num", pagenum );
|
|||
|
pagenum+=1;
|
|||
|
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANT, pagenum);
|
|||
|
}
|
|||
|
|
|||
|
if( NPC_Util_GetStrFromStrWithDelim( argstr, buf2, token, sizeof( token) ) == NULL ) {
|
|||
|
print("\n error: not found token:%s", token);
|
|||
|
CHAR_setWorkInt( toindex , CHAR_WORKSHOPRELEVANT,0);
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
sprintf( buf2,"%s%d", "page_num", CHAR_getWorkInt( toindex , CHAR_WORKSHOPRELEVANT));
|
|||
|
if( NPC_Util_GetStrFromStrWithDelim( argstr, buf2, buf1, sizeof( buf1) ) == NULL ) {
|
|||
|
buttontype = WINDOW_BUTTONTYPE_OK;
|
|||
|
windowno = CHAR_WINDOWTYPE_MAGIC_NORMAL;
|
|||
|
}else {
|
|||
|
buttontype = WINDOW_BUTTONTYPE_NEXT;
|
|||
|
windowno = CHAR_WINDOWTYPE_MAGIC_RULES;
|
|||
|
}
|
|||
|
break;
|
|||
|
case INGAME:
|
|||
|
//warp<72><70>ս<EFBFBD>ߵ<EFBFBD>ս<EFBFBD><D5BD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
|||
|
if( NPC_magiccard_checkplace( meindex , toindex , token ) == TRUE ){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>п<EFBFBD>λ
|
|||
|
return;
|
|||
|
}else{
|
|||
|
//<2F><><EFBFBD>ܲμ<DCB2>
|
|||
|
buttontype = WINDOW_BUTTONTYPE_OK;
|
|||
|
windowno = CHAR_WINDOWTYPE_MAGIC_NORMAL;
|
|||
|
}
|
|||
|
break;
|
|||
|
case SCORE:
|
|||
|
{
|
|||
|
int G_num = CHAR_getInt( toindex, CHAR_GAMBLENUM );
|
|||
|
|
|||
|
if( G_num < 0 ) G_num = 0;
|
|||
|
sprintf( token,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ%d<><64>", G_num );
|
|||
|
buttontype = WINDOW_BUTTONTYPE_OK;
|
|||
|
windowno = CHAR_WINDOWTYPE_MAGIC_NORMAL;
|
|||
|
}
|
|||
|
break;
|
|||
|
case END:
|
|||
|
if( NPC_Util_GetStrFromStrWithDelim( argstr, "end_msg", token, sizeof( token) ) == NULL ){
|
|||
|
print("\n read arg err");
|
|||
|
}
|
|||
|
buttontype = WINDOW_BUTTONTYPE_OK;
|
|||
|
windowno = CHAR_WINDOWTYPE_MAGIC_NORMAL;
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
lssproto_WN_send( fd, windowtype, buttontype, windowno,
|
|||
|
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
|
|||
|
}
|
|||
|
|
|||
|
void NPC_Magiccard_WindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
|
|||
|
{
|
|||
|
int pagenum,datanum;
|
|||
|
|
|||
|
switch(seqno)
|
|||
|
{
|
|||
|
case CHAR_WINDOWTYPE_MAGIC_START:
|
|||
|
pagenum = atoi( data );
|
|||
|
if( pagenum == 4 ){ // <20>뿪
|
|||
|
NPC_Magiccard_selectWindow( meindex, talkerindex, END , -1 );
|
|||
|
}else {
|
|||
|
if( pagenum == 3 ){ // <20><><EFBFBD>˻<EFBFBD><CBBB><EFBFBD>
|
|||
|
NPC_Magiccard_selectWindow( meindex, talkerindex, SCORE , -1 );
|
|||
|
}else if( pagenum == 2 ){ // <20>μ<EFBFBD><CEBC><EFBFBD>Ϸ
|
|||
|
NPC_Magiccard_selectWindow( meindex, talkerindex, INGAME , -1 );
|
|||
|
}else{ // <20><>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD>
|
|||
|
NPC_Magiccard_selectWindow( meindex, talkerindex, RULES, 1 );
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case CHAR_WINDOWTYPE_MAGIC_RULES:
|
|||
|
NPC_Magiccard_selectWindow( meindex, talkerindex, RULES, -1 );
|
|||
|
break;
|
|||
|
case CHAR_WINDOWTYPE_MAGIC_NORMAL:
|
|||
|
break;
|
|||
|
case CHAR_WINDOWTYPE_MAGIC_SELECT:
|
|||
|
datanum = atoi(data);
|
|||
|
if( CHAR_getWorkInt( talkerindex , NPC_WORK_SELECT ) == -1 ) {
|
|||
|
NPC_magiccard_checkselect( meindex , talkerindex ,datanum );
|
|||
|
}else{
|
|||
|
if( select == WINDOW_BUTTONTYPE_OK ){
|
|||
|
CHAR_setWorkInt( talkerindex , NPC_WORK_ACTION , MAGIC );
|
|||
|
}else if( select == WINDOW_BUTTONTYPE_CANCEL ){
|
|||
|
CHAR_setWorkInt( talkerindex , NPC_WORK_SELECT , -1 );
|
|||
|
NPC_magiccard_selectback( meindex , talkerindex );
|
|||
|
}else{
|
|||
|
if(datanum == 2 )
|
|||
|
CHAR_setWorkInt( talkerindex , NPC_WORK_ACTION , ATTACK );
|
|||
|
else if(datanum == 4)
|
|||
|
CHAR_setWorkInt( talkerindex , NPC_WORK_ACTION , DEFENCE );
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void NPC_Magiccard_Loop( int meindex ) //ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>LOOP
|
|||
|
{
|
|||
|
int j,playertotal,bkid;
|
|||
|
char buf[256];
|
|||
|
|
|||
|
if( !CHAR_CHECKINDEX( meindex) ) return;
|
|||
|
bkid = CHAR_getInt( meindex, CHAR_LV );
|
|||
|
|
|||
|
playertotal = 0;
|
|||
|
for( j=0 ; j < MAXGUY ; j++){
|
|||
|
if( NPC_magiccard_checkExist( meindex , bkid , j ) != -1 )
|
|||
|
playertotal++;
|
|||
|
}
|
|||
|
if( playertotal == 0 ) NPC_magiccard_resetbanker( meindex , bkid ); //<2F><><EFBFBD><EFBFBD>ׯ<EFBFBD><D7AF><EFBFBD>Ѿ<EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
else banker[bkid].playertotal = playertotal ;
|
|||
|
|
|||
|
switch( banker[bkid].state ) //<2F><>ׯ<EFBFBD><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
{
|
|||
|
case 0: //<2F>ȴ<EFBFBD><C8B4><EFBFBD>ս<EFBFBD><D5BD>
|
|||
|
if( banker[bkid].waittime < NowTime.tv_sec ){
|
|||
|
NPC_magiccard_gameinit( meindex , bkid);
|
|||
|
}else{
|
|||
|
if((long)banker[bkid].waittime - NowTime.tv_sec != banker[bkid].turntime ){
|
|||
|
banker[bkid].turntime = (long)banker[bkid].waittime - NowTime.tv_sec;
|
|||
|
if( banker[bkid].turntime < 6 ){
|
|||
|
sprintf( buf ,"<EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD>ڡ<EFBFBD> %d<><64> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ", banker[bkid].turntime );
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
case 1: //Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
NPC_magiccard_selectcard( meindex , bkid);
|
|||
|
break;
|
|||
|
case 2: //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( (long)banker[bkid].turntime - NowTime.tv_sec != banker[bkid].waittime ){
|
|||
|
banker[bkid].waittime = (long)banker[bkid].turntime - NowTime.tv_sec;
|
|||
|
if(banker[bkid].waittime < 4 && banker[bkid].waittime >= 0 ){
|
|||
|
sprintf( buf ,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>%d<><64>", banker[bkid].waittime );
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
}
|
|||
|
NPC_magiccard_waitselect( meindex , bkid);
|
|||
|
break;
|
|||
|
case 3: //<2F><><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>㶯<EFBFBD><E3B6AF>
|
|||
|
NPC_magiccard_checkdamage( meindex,bkid);
|
|||
|
break;
|
|||
|
case 4: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
NPC_magiccard_specialcard( meindex , bkid);
|
|||
|
break;
|
|||
|
case 5: //<2F>غϽ<D8BA><CFBD><EFBFBD>
|
|||
|
NPC_magiccard_turnover( meindex , bkid);
|
|||
|
break;
|
|||
|
case 9: //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӯ
|
|||
|
NPC_magiccard_gameover( meindex , bkid);
|
|||
|
break;
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int NPC_magiccard_checkplace( int meindex , int toindex , char *token )
|
|||
|
{
|
|||
|
int i,offsetx,offsety;
|
|||
|
unsigned int movescreenXY=0;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
char buf[64];
|
|||
|
OBJECT object;
|
|||
|
int bossindex,objindex;
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
if( CHAR_getWorkInt( toindex, CHAR_WORKPARTYMODE) != CHAR_PARTY_NONE )
|
|||
|
{
|
|||
|
strcpy(token,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD>ܲμ<EFBFBD>!!!");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
//<2F>ж<EFBFBD><D0B6><EFBFBD>û<EFBFBD><C3BB><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( CHAR_getInt( toindex , CHAR_GAMBLENUM) < 6 && CHAR_getInt( toindex , CHAR_GOLD) < 15000 ){
|
|||
|
strcpy(token,"<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><EFBFBD>Ǯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>֤<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʊร<EFBFBD><EFBFBD>ܱ<EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD>ܲμ<EFBFBD>!!!");
|
|||
|
return FALSE;
|
|||
|
}else if( CHAR_getInt( toindex , CHAR_GOLD) < 5000 ){
|
|||
|
strcpy(token,"<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><EFBFBD>ʯ<EFBFBD>Ҹ<EFBFBD><EFBFBD><EFBFBD>Ʊร<EFBFBD><EFBFBD>ܱ<EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD>ܲμ<EFBFBD>!!!");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
i = CHAR_getInt( meindex, CHAR_LV );
|
|||
|
if( banker[i].state > 0 || banker[i].playertotal >= MAXGUY ){ //continue; //<2F><><EFBFBD>˻<EFBFBD><CBBB><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
strcpy(token,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˻<EFBFBD><EFBFBD>ǽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>лл");
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
if( banker[i].playertotal == 0 ){ //<2F><>һλ<D2BB><CEBB>ս<EFBFBD><D5BD>
|
|||
|
banker[i].waittime = NowTime.tv_sec + 15 ; //30
|
|||
|
banker[i].state = 0 ; //<2F><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>loop
|
|||
|
}else
|
|||
|
banker[i].waittime = NowTime.tv_sec + 10 ; //ֻҪ<D6BB><D2AA><EFBFBD><EFBFBD>ս<EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ټ<EFBFBD>10<31><30>
|
|||
|
|
|||
|
sprintf( banker[i].cdkey[banker[i].playertotal] , "%s" , CHAR_getChar( toindex , CHAR_CDKEY ));
|
|||
|
sprintf( banker[i].name[banker[i].playertotal] , "%s" , CHAR_getChar( toindex , CHAR_NAME ));
|
|||
|
|
|||
|
if(CHAR_getInt( toindex , CHAR_GAMBLENUM) < 6){
|
|||
|
CHAR_setInt( toindex , CHAR_GOLD, CHAR_getInt( toindex , CHAR_GOLD)-15000 );
|
|||
|
CHAR_setWorkInt( toindex , NPC_WORK_GIVEGOLD , 1 );
|
|||
|
sprintf( buf,"<EFBFBD>ѽɽ<EFBFBD><EFBFBD><EFBFBD>Ʊ5000<EFBFBD>Ӻͱ<EFBFBD>֤<EFBFBD><EFBFBD>10000<EFBFBD><EFBFBD>" );
|
|||
|
CHAR_talkToCli( toindex , -1 , buf, CHAR_COLORYELLOW);
|
|||
|
}else{
|
|||
|
CHAR_setInt( toindex , CHAR_GOLD, CHAR_getInt( toindex , CHAR_GOLD)-5000 );
|
|||
|
CHAR_setInt( toindex , CHAR_GAMBLENUM, CHAR_getInt( toindex , CHAR_GAMBLENUM) - 6 );
|
|||
|
CHAR_setWorkInt( toindex , NPC_WORK_GIVEGOLD , 0 );
|
|||
|
sprintf( buf,"<EFBFBD>ѽɽ<EFBFBD><EFBFBD><EFBFBD>Ʊ5000<EFBFBD><EFBFBD>" );
|
|||
|
CHAR_talkToCli( toindex , -1 , buf, CHAR_COLORYELLOW);
|
|||
|
}
|
|||
|
|
|||
|
Bettotal[i] += 6;
|
|||
|
tickettotal[i]++;
|
|||
|
|
|||
|
CHAR_setInt( toindex , CHAR_DIR , Positiontable[banker[i].playertotal].direct );
|
|||
|
CHAR_setWorkInt( toindex , NPC_WORK_BANKER , i );
|
|||
|
//<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>;<EFBFBD>뿪
|
|||
|
CHAR_setWorkInt(toindex, CHAR_WORK_TEMP_FLOOR, CHAR_getInt(meindex, CHAR_FLOOR));
|
|||
|
|
|||
|
//sprintf( buf ,"<22><>¼<EFBFBD>ĵ<EFBFBD>ͼΪ%d", CHAR_getWorkInt(toindex, CHAR_WORK_TEMP_FLOOR ));
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
CHAR_warpToSpecificPoint( toindex, CHAR_getInt( meindex, CHAR_FLOOR),
|
|||
|
Positiontable[banker[i].playertotal].humanX + offsetx ,
|
|||
|
Positiontable[banker[i].playertotal].humanY + offsety );
|
|||
|
//<2F>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD>ߵ<EFBFBD><DFB5>ӽ<EFBFBD>
|
|||
|
movescreenXY = ((Positiontable[banker[i].playertotal].humanX + offsetx) << 16) | ( Positiontable[banker[i].playertotal].humanY + offsety) ;
|
|||
|
lssproto_MoveScreen_send(getfdFromCharaIndex(toindex), TRUE, movescreenXY);
|
|||
|
banker[i].playertotal += 1; //<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>
|
|||
|
|
|||
|
//<2F><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
object = MAP_getTopObj(CHAR_getInt(meindex, CHAR_FLOOR), Positiontable[BANKERID].humanX + offsetx, Positiontable[BANKERID].humanY + offsety );
|
|||
|
if( object ){
|
|||
|
objindex = GET_OBJINDEX( object);
|
|||
|
bossindex = OBJECT_getIndex(objindex);
|
|||
|
if( banker[i].playertotal < 3 )
|
|||
|
CHAR_CHAT_DEBUG_metamo( bossindex , "101813" );
|
|||
|
else if( banker[i].playertotal < 5 )
|
|||
|
CHAR_CHAT_DEBUG_metamo( bossindex , "101814" );
|
|||
|
else
|
|||
|
CHAR_CHAT_DEBUG_metamo( bossindex , "101815" );
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_gameinit( int meindex , int bkid )
|
|||
|
{
|
|||
|
int i,j=0,charindex,k;
|
|||
|
unsigned int card;
|
|||
|
char buf[256];
|
|||
|
unsigned int movescreenXY=0;
|
|||
|
int offsetx,offsety;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
BOOL flag = FALSE;
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return ;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
banker[bkid].turn = 1;
|
|||
|
banker[bkid].hand = 0;
|
|||
|
banker[bkid].history = 0;
|
|||
|
banker[bkid].turntime = NowTime.tv_sec + 20 ;
|
|||
|
banker[bkid].process = 0;
|
|||
|
sprintf( buf,"<EFBFBD><EFBFBD>һ<EFBFBD>غϿ<EFBFBD>ʼ ս<><D5BD>" );
|
|||
|
showString( meindex, buf , 0);
|
|||
|
|
|||
|
//ׯ<>ҵ<EFBFBD><D2B5><EFBFBD>
|
|||
|
while(j<5){
|
|||
|
if( tickettotal[bkid] > 5000 && flag == FALSE ){
|
|||
|
i = rand()%100;
|
|||
|
if( i > 50 ) k = 25 + rand()%5;
|
|||
|
else if( i > 20 ) k = rand()%3;
|
|||
|
else k = 3 + rand()%3;
|
|||
|
flag = TRUE;
|
|||
|
}else{
|
|||
|
k = rand()%(30-j);
|
|||
|
if( Cardbox[6+7*bkid][k].cardindex == 28 && flag == FALSE && rand()%100 > 50){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
|
|||
|
flag = TRUE;
|
|||
|
continue;
|
|||
|
}
|
|||
|
}
|
|||
|
Cardbox[6+7*bkid][k].use = 1;
|
|||
|
card = SHIFTBASE << Cardbox[6+7*bkid][k].cardindex ;
|
|||
|
banker[bkid].hand |= card;
|
|||
|
qsort( &Cardbox[6+7*bkid] , 30 , sizeof(CardBoxType) , &NPC_magiccard_sort );
|
|||
|
j++;
|
|||
|
}
|
|||
|
flag = FALSE;
|
|||
|
for( i=0;i<MAXGUY;i++){
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><DFBB>ڲ<EFBFBD><DAB2><EFBFBD>
|
|||
|
charindex = NPC_magiccard_checkExist(meindex,bkid,i);
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
|
|||
|
banker[bkid].starttotal += 1;
|
|||
|
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE , 0 );
|
|||
|
banker[bkid].hp[i] = MAXHP ; //<2F><>Ѫ<EFBFBD><D1AA>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_HAND , 0 ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_HISTORY , 0 ); //<2F><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_SELECT , -1 ); //ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_ACTION , 0 ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
j=0;
|
|||
|
while(j<5){
|
|||
|
k = rand()%(30-j);
|
|||
|
if( Cardbox[i+7*bkid][k].cardindex == 28 && flag == FALSE && rand()%100 > 50){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
|
|||
|
flag = TRUE;
|
|||
|
continue;
|
|||
|
}
|
|||
|
Cardbox[i+7*bkid][k].use = 1;
|
|||
|
card = SHIFTBASE << Cardbox[i+7*bkid][k].cardindex ;
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_HAND ,
|
|||
|
(unsigned int)CHAR_getWorkInt( charindex , NPC_WORK_HAND )|card );
|
|||
|
qsort( &Cardbox[i+7*bkid] , 30 , sizeof(CardBoxType) , &NPC_magiccard_sort );
|
|||
|
j++;
|
|||
|
}
|
|||
|
/*
|
|||
|
for( j=0;j<30;j++){
|
|||
|
char tempbuf[256];
|
|||
|
sprintf( tempbuf,"%d ",Cardbox[i+7*bkid][j].use );
|
|||
|
strcat( buf, tempbuf );
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
buf[0]='\0';
|
|||
|
for( j=0;j<30;j++){
|
|||
|
char tempbuf[256];
|
|||
|
sprintf( tempbuf,"%d ",Cardbox[i+7*bkid][j].cardindex );
|
|||
|
strcat( buf, tempbuf );
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
*/
|
|||
|
|
|||
|
//<2F>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD>ߵ<EFBFBD><DFB5>ӽ<EFBFBD>
|
|||
|
movescreenXY = ((14+offsetx) << 16) | (13+offsety) ;
|
|||
|
lssproto_MoveScreen_send(getfdFromCharaIndex(charindex), TRUE, movescreenXY);
|
|||
|
|
|||
|
}
|
|||
|
banker[bkid].hp[BANKERID] = banker[bkid].starttotal * MAXHP ;
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, 1000 );
|
|||
|
banker[bkid].state = 1;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ʲô<CAB2><C3B4>
|
|||
|
void NPC_magiccard_selectcard( int meindex , int bkid )
|
|||
|
{
|
|||
|
int i,j,fd,allhp=0,charindex;
|
|||
|
unsigned int card=1;
|
|||
|
char token[256];
|
|||
|
|
|||
|
for(i=0;i<MAXGUY;i++) allhp += banker[bkid].hp[i];
|
|||
|
for(i=0;i<MAXGUY;i++)
|
|||
|
{
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
////////////
|
|||
|
if( banker[bkid].pauseflag[i] == TRUE ){
|
|||
|
sprintf( token,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>%s<><73><EFBFBD><EFBFBD>ӡ<EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>ͣһ<CDA3>غ<EFBFBD>",i+1,CHAR_getChar( charindex, CHAR_NAME) );
|
|||
|
showString( meindex, token , 0);
|
|||
|
continue;
|
|||
|
}
|
|||
|
////////////
|
|||
|
fd = getfdFromCharaIndex( charindex );
|
|||
|
sprintf( token, "ħ<EFBFBD><EFBFBD>HP%d <20><>ս<EFBFBD><D5BD>HP%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HP%d<><64>\n",banker[bkid].hp[BANKERID],allhp,banker[bkid].hp[i]);
|
|||
|
for( j=0;j<30;j++){
|
|||
|
if( (card<<j) & (unsigned int)CHAR_getWorkInt( charindex , NPC_WORK_HAND ) ){
|
|||
|
strcat( token , Cardfunctiontable[j].name.string );
|
|||
|
strcat( token, "\n");
|
|||
|
}
|
|||
|
}
|
|||
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT ,
|
|||
|
WINDOW_BUTTONTYPE_NONE ,
|
|||
|
CHAR_WINDOWTYPE_MAGIC_SELECT ,
|
|||
|
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
|
|||
|
|
|||
|
}
|
|||
|
banker[bkid].waittime = NowTime.tv_sec + 20 ;
|
|||
|
banker[bkid].state = 2;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʲô<CAB2><C3B4>
|
|||
|
void NPC_magiccard_checkselect( int meindex , int toindex ,int choise )
|
|||
|
{
|
|||
|
int fd,i,j=0;
|
|||
|
unsigned int card=1;
|
|||
|
char token[128];
|
|||
|
int buttontype;
|
|||
|
|
|||
|
fd = getfdFromCharaIndex( toindex );
|
|||
|
if( fd == -1 ) return;//Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><DFBB>ڲ<EFBFBD><DAB2><EFBFBD> Ŀǰ<C4BF><C7B0>û<EFBFBD><C3BB><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
for( i=0;i<30;i++){
|
|||
|
if( (card<<i) & (unsigned int)CHAR_getWorkInt( toindex , NPC_WORK_HAND) ){
|
|||
|
j++;
|
|||
|
if( j == choise ){
|
|||
|
CHAR_setWorkInt( toindex , NPC_WORK_SELECT , i ); //<2F><>¼<EFBFBD><C2BC>ս<EFBFBD><D5BD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0~29
|
|||
|
sprintf( token, "%s\n",Cardfunctiontable[i].name.string);
|
|||
|
//if( Cardfunctiontable[i].attack > 0 || Cardfunctiontable[i].defence > 0 ){
|
|||
|
if( i < 25 ){
|
|||
|
//ȷ<><C8B7><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
strcat( token , "\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n" );
|
|||
|
strcat( token , "\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
buttontype = WINDOW_BUTTONTYPE_CANCEL;
|
|||
|
}else{
|
|||
|
buttontype = WINDOW_BUTTONTYPE_OK|WINDOW_BUTTONTYPE_CANCEL;
|
|||
|
}
|
|||
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT ,
|
|||
|
buttontype,
|
|||
|
CHAR_WINDOWTYPE_MAGIC_SELECT ,
|
|||
|
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ѡʱ
|
|||
|
void NPC_magiccard_selectback( int meindex , int toindex )
|
|||
|
{
|
|||
|
unsigned int handcard;
|
|||
|
char token[256];
|
|||
|
int i,j,fd,bkid,allhp=0;
|
|||
|
|
|||
|
handcard = CHAR_getWorkInt( toindex , NPC_WORK_HAND);
|
|||
|
bkid = CHAR_getWorkInt( toindex , NPC_WORK_BANKER );
|
|||
|
for(i=0;i<MAXGUY;i++) allhp += banker[bkid].hp[i];
|
|||
|
for(i=0;i<MAXGUY;i++){
|
|||
|
if( strcmp( banker[bkid].cdkey[i] , CHAR_getChar( toindex, CHAR_CDKEY) ) == 0 &&
|
|||
|
strcmp( banker[bkid].name[i] , CHAR_getChar( toindex, CHAR_NAME) ) == 0){
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
fd = getfdFromCharaIndex( toindex );
|
|||
|
if( fd == -1 ) return;
|
|||
|
|
|||
|
sprintf( token, "ħ<EFBFBD><EFBFBD>HP%d <20><>ս<EFBFBD><D5BD>HP%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HP%d<><64>\n",banker[bkid].hp[BANKERID],allhp,banker[bkid].hp[i]);
|
|||
|
for( j=0;j<30;j++){
|
|||
|
if( (SHIFTBASE<<j) & handcard ){
|
|||
|
strcat( token , Cardfunctiontable[j].name.string );
|
|||
|
strcat( token, "\n");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT ,
|
|||
|
WINDOW_BUTTONTYPE_NONE ,
|
|||
|
CHAR_WINDOWTYPE_MAGIC_SELECT ,
|
|||
|
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
void NPC_magiccard_waitselect( int meindex , int bkid )
|
|||
|
{
|
|||
|
int i,charindex,select=0;
|
|||
|
BOOL okflag = FALSE;
|
|||
|
char buf[256];
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++){
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
if( //CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) != -1 &&
|
|||
|
CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) != 0 || banker[bkid].pauseflag[i] == TRUE ){
|
|||
|
select++; //ѡ<><D1A1><EFBFBD><EFBFBD>
|
|||
|
}else if( banker[bkid].turntime < NowTime.tv_sec ){
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_SELECT , -1 );
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_ACTION , 0 );
|
|||
|
//ȡ<><C8A1>ѡ<EFBFBD><D1A1>
|
|||
|
lssproto_MagiccardDamage_send(getfdFromCharaIndex(charindex), 10 , 0 ,0 ,0 );
|
|||
|
sprintf(buf,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䵽<EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD>ս<EFBFBD>߷<EFBFBD><DFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",i+1);
|
|||
|
showString( meindex, buf , 0);
|
|||
|
select++; //<2F><><EFBFBD><EFBFBD><EFBFBD>˲<EFBFBD><CBB2><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>
|
|||
|
}
|
|||
|
}
|
|||
|
if( select >= banker[bkid].playertotal ) okflag = TRUE; //<2F><><EFBFBD>Ҷ<EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>
|
|||
|
//sprintf(buf,"ʣ<><CAA3>%d<><64>ս<EFBFBD><D5BD> <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>%d ",banker[bkid].playertotal,select);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
if( okflag == TRUE ) {
|
|||
|
banker[bkid].state = 3;
|
|||
|
NPC_magiccard_aiselect( meindex , bkid );
|
|||
|
|
|||
|
//sprintf(buf,"ai select %d action %d",banker[bkid].select,banker[bkid].action);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, SHOWCARDLOOPTIME );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_aiselect( int meindex , int bkid )
|
|||
|
{
|
|||
|
int i,j,k,enemy=0;
|
|||
|
//int maxattack=0,maxdefence=0;
|
|||
|
//int maxacard=0,maxdcard=0;
|
|||
|
char buf[256];
|
|||
|
int charindex,allattack,alldefence,bestattack,bestdefence;
|
|||
|
int getdamage=0,givedamage=0;
|
|||
|
int card25=0,allhp=0;
|
|||
|
int attacklist[5],defencelist[5],cardnum[5];
|
|||
|
BOOL selectflag = FALSE;
|
|||
|
BOOL checkflag = FALSE;
|
|||
|
|
|||
|
for( i=0;i<6;i++){
|
|||
|
attacklist[i] = 0;
|
|||
|
defencelist[i] = 0;
|
|||
|
cardnum[i]=0;
|
|||
|
if(banker[bkid].pauseflag[i] == TRUE){
|
|||
|
banker[bkid].pauseflag[i] = FALSE;
|
|||
|
checkflag = TRUE; //<2F><><EFBFBD>˱<EFBFBD><CBB1><EFBFBD>ӡ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
allattack=0;
|
|||
|
alldefence=0;
|
|||
|
bestattack=0;
|
|||
|
bestdefence=0;
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
if( banker[bkid].pauseflag[BANKERID] == TRUE )
|
|||
|
{
|
|||
|
banker[bkid].pauseflag[BANKERID] = FALSE;
|
|||
|
sprintf( buf,"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD> <20><>ͣһ<CDA3>غ<EFBFBD>" );
|
|||
|
showString( meindex, buf , 0);
|
|||
|
return;
|
|||
|
}
|
|||
|
//-----------------------------------------------------------------------------
|
|||
|
if( rand()%200 > 5 + banker[bkid].playertotal * 1 || checkflag == TRUE || banker[bkid].turn == 10 ){ //80%
|
|||
|
selectflag = FALSE;
|
|||
|
for( i=0;i<MAXGUY;i++){
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
enemy++;
|
|||
|
allhp += banker[bkid].hp[i];
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == 0 ) continue;
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == ATTACK ){
|
|||
|
allattack += Cardfunctiontable[CHAR_getWorkInt(charindex,NPC_WORK_SELECT)].attack ;
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == DEFENCE ){
|
|||
|
alldefence += Cardfunctiontable[CHAR_getWorkInt(charindex,NPC_WORK_SELECT)].defence ;
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 25 ){ //<2F>þ<EFBFBD>
|
|||
|
if( rand()%100 > 40 + 5 * banker[bkid].playertotal ){
|
|||
|
allattack += rand()%10;
|
|||
|
alldefence += rand()%10;
|
|||
|
}else{
|
|||
|
alldefence += Cardfunctiontable[0].attack ; //<2F>ɵֵ<C9B5><D6B5><EFBFBD>ǿ<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>--><3E><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>
|
|||
|
card25++;
|
|||
|
}
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 26 ){ //<2F><>Ӱ
|
|||
|
if( rand()%100 > 40 + 5 * banker[bkid].playertotal )
|
|||
|
alldefence += rand()%10;
|
|||
|
else
|
|||
|
alldefence += Cardfunctiontable[0].attack ;
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 27 ){ //<2F><>ӡ
|
|||
|
if( rand()%100 > 30 + 5 * banker[bkid].playertotal ){
|
|||
|
allattack += rand()%5;
|
|||
|
alldefence += rand()%5;
|
|||
|
}
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 28 ){ //<2F><><EFBFBD><EFBFBD>
|
|||
|
if( rand()%100 > 70 + 5 * banker[bkid].playertotal ){
|
|||
|
allattack += rand()%5;
|
|||
|
alldefence += rand()%5;
|
|||
|
}
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 29 ){ //<2F><><EFBFBD><EFBFBD>
|
|||
|
if( rand()%100 > 30 + 5 * banker[bkid].playertotal ){
|
|||
|
allattack += rand()%5;
|
|||
|
alldefence += rand()%5;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//sprintf( buf,"allA=%d allD=%d",allattack,alldefence );
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
//<2F><>¼ÿһ<C3BF><D2BB><EFBFBD>ƵĽ<C6B5><C4BD><EFBFBD> û<>и<EFBFBD>ֵ<EFBFBD><D6B5>ʾ<EFBFBD><CABE>0
|
|||
|
j=0;
|
|||
|
for( k=0;k<30;k++){
|
|||
|
if((SHIFTBASE<<k) & banker[bkid].hand ){
|
|||
|
if( k < 25 ){
|
|||
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
if( 1 ){ //Cardfunctiontable[k].attack * enemy > alldefence ){
|
|||
|
givedamage = Cardfunctiontable[k].attack * enemy - alldefence ;
|
|||
|
if( allhp > banker[bkid].hp[BANKERID] )
|
|||
|
getdamage = allattack + Cardfunctiontable[k].attack * card25;
|
|||
|
else
|
|||
|
getdamage = allattack ;
|
|||
|
attacklist[j] = givedamage - getdamage;
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
if( Cardfunctiontable[k].defence * enemy < allattack ){
|
|||
|
defencelist[j] = Cardfunctiontable[k].defence * enemy - allattack;
|
|||
|
}
|
|||
|
}else{ //ħ<><C4A7><EFBFBD><EFBFBD>
|
|||
|
attacklist[j] -= allattack; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>Ʋ<EFBFBD><C6B2>ÿ<EFBFBD><C3BF>ǵ<EFBFBD>ħ<EFBFBD><C4A7><EFBFBD><EFBFBD>
|
|||
|
defencelist[j] -= allattack;
|
|||
|
}
|
|||
|
cardnum[j]=k;
|
|||
|
j++;
|
|||
|
}
|
|||
|
}
|
|||
|
//sprintf( buf,"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d %d %d %d %d",cardnum[0],cardnum[1],cardnum[2],cardnum[3],cardnum[4]);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---------------------------------------------------------------------
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] == 28 ){
|
|||
|
if( banker[bkid].turn == 10 )
|
|||
|
selectflag = TRUE;
|
|||
|
else{
|
|||
|
switch( banker[bkid].playertotal ){
|
|||
|
case 1:
|
|||
|
case 2:
|
|||
|
if( banker[bkid].hp[BANKERID] < banker[bkid].starttotal * (MAXHP-25) )
|
|||
|
selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
if( banker[bkid].hp[BANKERID] < banker[bkid].starttotal * (MAXHP-20) || banker[bkid].turn > 8 )
|
|||
|
selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
case 6:
|
|||
|
if( banker[bkid].hp[BANKERID] < banker[bkid].starttotal * (MAXHP-15) &&
|
|||
|
allattack < banker[bkid].playertotal * 8 )
|
|||
|
selectflag = TRUE;
|
|||
|
else if( banker[bkid].turn > 7 )
|
|||
|
selectflag = TRUE;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if( selectflag == TRUE ){
|
|||
|
banker[bkid].select = 28;
|
|||
|
banker[bkid].action = MAGIC;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><>ӡ<EFBFBD><D3A1>----------------------------------------------------------------
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i]== 27 && banker[bkid].turn != 10 && banker[bkid].hp[BANKERID] >= banker[bkid].playertotal * 13){
|
|||
|
switch( banker[bkid].playertotal ){
|
|||
|
case 1:
|
|||
|
case 2:
|
|||
|
for( j=0;j<5;j++){
|
|||
|
if( rand()%100 > 50 && Cardfunctiontable[cardnum[j]].attack > 6 && allattack < banker[bkid].playertotal * 13 )
|
|||
|
selectflag = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
for( j=0;j<5;j++){
|
|||
|
if( rand()%100 > 70 && Cardfunctiontable[cardnum[j]].attack > 7 && allattack < banker[bkid].playertotal * 8 )
|
|||
|
selectflag = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
case 6:
|
|||
|
for( j=0;j<5;j++){
|
|||
|
if( rand()%100 > 50 && Cardfunctiontable[cardnum[j]].attack == 13 && allattack < banker[bkid].playertotal * 8 )
|
|||
|
selectflag = TRUE;
|
|||
|
else if( rand()%100 > 80 && Cardfunctiontable[cardnum[j]].attack > 7 && allattack < banker[bkid].playertotal * 8 )
|
|||
|
selectflag = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
if( selectflag == TRUE ){
|
|||
|
banker[bkid].select = 27;
|
|||
|
banker[bkid].action = MAGIC;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>ж<EFBFBD>Ҫ<EFBFBD><D2AA>Ҫʹ<D2AA><CAB9>-----------------------------------------------------------------
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] == 26 && checkflag == FALSE ){
|
|||
|
if( banker[bkid].turn == 10 && allhp <= banker[bkid].hp[BANKERID] ){
|
|||
|
selectflag = TRUE;
|
|||
|
}else{
|
|||
|
switch( banker[bkid].playertotal ){
|
|||
|
case 1:
|
|||
|
case 2:
|
|||
|
if( banker[bkid].turn < 8 && rand()%100 > 80 ) selectflag = TRUE;
|
|||
|
else if( banker[bkid].turn > 7 && banker[bkid].hp[BANKERID] < banker[bkid].starttotal * 15 ) selectflag = TRUE;
|
|||
|
else if( allattack > 8 * banker[bkid].playertotal && rand()%100 > 40 ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
if( allhp > banker[bkid].hp[BANKERID] && allattack > 8 * banker[bkid].playertotal ) selectflag = TRUE;
|
|||
|
else if( allhp - banker[bkid].hp[BANKERID] > 10 && banker[bkid].turn > 5 &&
|
|||
|
allattack > 6 * banker[bkid].playertotal ){
|
|||
|
selectflag = TRUE;
|
|||
|
}
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
case 6:
|
|||
|
if( allhp - banker[bkid].hp[BANKERID] > 10 &&
|
|||
|
allattack > 8 * banker[bkid].playertotal ) selectflag = TRUE;
|
|||
|
else if( banker[bkid].hp[BANKERID] > allhp && banker[bkid].turn > 5 && rand()%100 > 80) selectflag = TRUE;
|
|||
|
else{
|
|||
|
for( j=0;j<MAXGUY;j++){
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 27 ){
|
|||
|
if( rand()%100 > (70-banker[bkid].turn*8) ){
|
|||
|
selectflag = TRUE;
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if( banker[bkid].turn == 10 && allhp > banker[bkid].hp[BANKERID] ) selectflag = FALSE;
|
|||
|
if( selectflag == TRUE ){
|
|||
|
banker[bkid].select = 26;
|
|||
|
banker[bkid].action = MAGIC;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ҫ<EFBFBD><D2AA>Ҫʹ<D2AA><CAB9>-----------------------------------------------------------------
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] == 29 && checkflag == FALSE){
|
|||
|
switch(banker[bkid].playertotal){
|
|||
|
case 1:
|
|||
|
case 2:
|
|||
|
if( rand()%100 > 80 && banker[bkid].hp[BANKERID] < allhp ) selectflag = TRUE;
|
|||
|
else if( banker[bkid].turn == 10 && (allhp-banker[bkid].hp[BANKERID]) >= 10 ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
if( allattack < Cardfunctiontable[29].attack && rand()%100>30 ) selectflag = TRUE;
|
|||
|
else if( rand()%100 > 70 && banker[bkid].hp[BANKERID] < allhp ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
case 6:
|
|||
|
if( allattack < Cardfunctiontable[29].attack+10 ) selectflag = TRUE;
|
|||
|
else if( banker[bkid].turn == 10 && (allhp - banker[bkid].hp[BANKERID]) >= 13 ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
}
|
|||
|
if( selectflag == TRUE ){
|
|||
|
banker[bkid].select = 29;
|
|||
|
banker[bkid].action = MAGIC;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---------------------------------------------------------------------------------
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] == 25 && checkflag == FALSE ){
|
|||
|
if( banker[bkid].turn == 10 ){
|
|||
|
selectflag = TRUE;
|
|||
|
}else{
|
|||
|
switch(banker[bkid].playertotal){
|
|||
|
case 1:
|
|||
|
case 2:
|
|||
|
if( rand()%100 > 50 ) selectflag = TRUE;
|
|||
|
else if( rand()%100>70-banker[bkid].turn*2 && allattack >= 6 * banker[bkid].playertotal ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 3:
|
|||
|
case 4:
|
|||
|
if( rand()%100 > 60 ) selectflag = TRUE;
|
|||
|
else if( rand()%100 > 50 && allhp < banker[bkid].hp[BANKERID] ) selectflag = TRUE;
|
|||
|
else if( rand()%100>60-banker[bkid].turn*2 && allattack >= 7 * banker[bkid].playertotal ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
case 5:
|
|||
|
case 6:
|
|||
|
if( rand()%100 > 70 && allhp > banker[bkid].hp[BANKERID] ) selectflag = TRUE;
|
|||
|
else if( rand()%100>50-banker[bkid].turn*2 && allattack >= 8 * banker[bkid].playertotal ) selectflag = TRUE;
|
|||
|
else if( banker[bkid].turn > 7 && allhp < banker[bkid].hp[BANKERID] ) selectflag = TRUE;
|
|||
|
break;
|
|||
|
}
|
|||
|
if( selectflag == TRUE ){
|
|||
|
banker[bkid].select = 25;
|
|||
|
banker[bkid].action = MAGIC;
|
|||
|
return;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD>غϻ<D8BA><CFBB><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>----------------------------------------------------
|
|||
|
if( ( banker[bkid].turn == 10 && allhp > banker[bkid].hp[BANKERID] ) || checkflag == TRUE ){
|
|||
|
bestattack = 0;
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] >= 25) continue;
|
|||
|
if( Cardfunctiontable[cardnum[i]].attack > bestattack ){
|
|||
|
bestattack = Cardfunctiontable[cardnum[i]].attack;
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//<2F><><EFBFBD><EFBFBD>Ŀǰ<C4BF><C7B0>Ӯ<EFBFBD><D3AE>״̬ ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֳ<EFBFBD><D6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>ûѪ<C3BB><D1AA> <20><><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD>------------------------
|
|||
|
if( banker[bkid].action == 0 ){
|
|||
|
if( allhp < banker[bkid].hp[BANKERID] ){
|
|||
|
for( j=0;j<BANKERID;j++){
|
|||
|
if( banker[bkid].hp[j] > 0 && banker[bkid].hp[j] < MAXHP/4 ){
|
|||
|
bestattack = 6;
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] >= 25) continue;
|
|||
|
if( Cardfunctiontable[cardnum[i]].attack > bestattack ){
|
|||
|
bestattack = Cardfunctiontable[cardnum[i]].attack;
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//-----------------------------------------------------------------------------------
|
|||
|
bestattack = 0;
|
|||
|
bestdefence = 0;
|
|||
|
if( banker[bkid].action == 0 ){
|
|||
|
if( allhp >= banker[bkid].hp[BANKERID] || rand()%100 > 50 ){ //<2F><>Ӯ<EFBFBD><D3AE><EFBFBD><EFBFBD>
|
|||
|
for( i=0;i<5;i++){
|
|||
|
if( cardnum[i] >= 25) continue;
|
|||
|
if( banker[bkid].hp[BANKERID] < banker[bkid].playertotal * 13 ) break; //<2F><>ûѪ<C3BB><D1AA>
|
|||
|
if( attacklist[i] > bestattack ){
|
|||
|
bestattack = attacklist[i];
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
if( banker[bkid].action == 0 ){
|
|||
|
if( rand()%100 > 50 + banker[bkid].playertotal * 3 ){
|
|||
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
if( rand()%100 > 50 ){
|
|||
|
bestdefence = defencelist[4] ;
|
|||
|
for( i=4;i>=0;i--){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
|
|||
|
if( cardnum[i] >= 25 ) continue;
|
|||
|
if( defencelist[i] > bestdefence ){
|
|||
|
bestdefence = defencelist[i] ;
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = DEFENCE;
|
|||
|
}
|
|||
|
}
|
|||
|
}else{
|
|||
|
bestdefence = defencelist[0] ;
|
|||
|
for( i=0;i<5;i++){ //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( cardnum[i] >= 25 ) continue;
|
|||
|
if( defencelist[i] > bestdefence ){
|
|||
|
bestdefence = defencelist[i] ;
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = DEFENCE;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}else{
|
|||
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
if( rand()%100 > 50 ){
|
|||
|
bestattack = attacklist[4] ;
|
|||
|
for( i=4;i>=0;i--){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ñȽϺõ<CFBA><C3B5><EFBFBD>
|
|||
|
if( cardnum[i] >= 25 ) continue;
|
|||
|
if( attacklist[i] > bestattack ){
|
|||
|
bestattack = attacklist[i] ;
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
}
|
|||
|
}
|
|||
|
}else{
|
|||
|
bestattack = attacklist[0] ;
|
|||
|
for( i=0;i<5;i++){ //<2F><><EFBFBD><EFBFBD><EFBFBD>ñȽϲ<C8BD><CFB2><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( cardnum[i] >= 25 ) continue;
|
|||
|
if( attacklist[i] > bestattack ){
|
|||
|
bestattack = attacklist[i] ;
|
|||
|
banker[bkid].select = cardnum[i];
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><C3BB>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( banker[bkid].action == 0 )
|
|||
|
{
|
|||
|
j=0;
|
|||
|
for( k=0;k<25;k++){
|
|||
|
if((SHIFTBASE<<k) & banker[bkid].hand ){
|
|||
|
cardnum[j]=k;
|
|||
|
j++;
|
|||
|
}
|
|||
|
}
|
|||
|
//sprintf( buf,"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d %d %d %d %d",cardnum[0],cardnum[1],cardnum[2],cardnum[3],cardnum[4]);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
if( j==0 ) j = 1;
|
|||
|
banker[bkid].select = cardnum[rand()%j];
|
|||
|
if( rand()%100 > 50 )
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
else
|
|||
|
banker[bkid].action = DEFENCE;
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>
|
|||
|
if( banker[bkid].select < 25 ){
|
|||
|
if( Cardfunctiontable[banker[bkid].select].attack == 13 )
|
|||
|
banker[bkid].action = ATTACK;
|
|||
|
if( Cardfunctiontable[banker[bkid].select].defence == 13 )
|
|||
|
banker[bkid].action = DEFENCE;
|
|||
|
}else
|
|||
|
banker[bkid].action = MAGIC;
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_checkdamage( int meindex , int bkid )
|
|||
|
{
|
|||
|
int charindex,i;
|
|||
|
int bankerdamage=0,playerdamage=0;
|
|||
|
int select;
|
|||
|
//char buf[256];
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++)
|
|||
|
{
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE , 0 );
|
|||
|
select = CHAR_getWorkInt( charindex , NPC_WORK_SELECT );
|
|||
|
|
|||
|
if( select == 28 ){ //<2F><>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE , -MAXHP/2);
|
|||
|
playerdamage += -MAXHP/2;
|
|||
|
//sprintf( buf,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>%sʹ<73><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",i+1,CHAR_getChar( charindex, CHAR_NAME));
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == ATTACK && banker[bkid].select != 26 )
|
|||
|
{
|
|||
|
if( banker[bkid].select == 25 ){ //<2F>þ<EFBFBD><C3BE><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE , Cardfunctiontable[select].attack );
|
|||
|
playerdamage += Cardfunctiontable[select].attack;
|
|||
|
}else if( banker[bkid].action == DEFENCE ){
|
|||
|
if( Cardfunctiontable[select].attack > Cardfunctiontable[banker[bkid].select].defence )
|
|||
|
bankerdamage += (Cardfunctiontable[select].attack-Cardfunctiontable[banker[bkid].select].defence);
|
|||
|
}else
|
|||
|
bankerdamage += Cardfunctiontable[select].attack;
|
|||
|
}
|
|||
|
if( banker[bkid].action == ATTACK && CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) != 26 )
|
|||
|
{
|
|||
|
if( select == 25 ){
|
|||
|
bankerdamage += Cardfunctiontable[banker[bkid].select].attack;
|
|||
|
}else if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == DEFENCE ){
|
|||
|
if( Cardfunctiontable[banker[bkid].select].attack > Cardfunctiontable[select].defence )
|
|||
|
{
|
|||
|
playerdamage += (Cardfunctiontable[banker[bkid].select].attack-Cardfunctiontable[select].defence);
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE , (Cardfunctiontable[banker[bkid].select].attack-Cardfunctiontable[select].defence) );
|
|||
|
}
|
|||
|
}else{
|
|||
|
playerdamage += Cardfunctiontable[banker[bkid].select].attack;
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE ,
|
|||
|
CHAR_getWorkInt( charindex , NPC_WORK_DAMAGE ) + Cardfunctiontable[banker[bkid].select].attack );
|
|||
|
}
|
|||
|
}
|
|||
|
//sprintf( buf,"<22><>ս<EFBFBD><D5BD>%d select=%d <20>˺<EFBFBD>%d",i,select,CHAR_getWorkInt( charindex , NPC_WORK_DAMAGE ) );
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
//sprintf( buf,"ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD>%d <20><>ս<EFBFBD><D5BD><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD>%d",bankerdamage,playerdamage);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
//<2F>㶯<EFBFBD><E3B6AF>
|
|||
|
if( banker[bkid].select != 29 && banker[bkid].select != 27 ){
|
|||
|
//sprintf( buf,"-----------------ħ<><C4A7>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD> <20><>%d<><64>------------------",banker[bkid].select);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
NPC_magiccard_action2( meindex , meindex , BANKERID , banker[bkid].select , banker[bkid].action );
|
|||
|
}
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++ ){
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
//<2F><>ս<EFBFBD>߿<EFBFBD>Ѫ
|
|||
|
banker[bkid].hp[i] -= CHAR_getWorkInt( charindex , NPC_WORK_DAMAGE ) ;
|
|||
|
NPC_magiccard_showdamage( meindex , charindex , i , CHAR_getWorkInt( charindex , NPC_WORK_DAMAGE ) );
|
|||
|
//if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == 0 ) continue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
//sprintf( buf,"i=%d Action=%d",i,CHAR_getWorkInt( charindex , NPC_WORK_ACTION ));
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
if( banker[bkid].hp[i] > MAXHP ) banker[bkid].hp[i] = MAXHP;
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) != 29 &&
|
|||
|
CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) != 27 )
|
|||
|
NPC_magiccard_action2( meindex , charindex , i , CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) , CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) );
|
|||
|
}
|
|||
|
|
|||
|
//ׯ<>ҿ<EFBFBD>Ѫ
|
|||
|
if( banker[bkid].select == 28 ){ //ׯ<><D7AF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
bankerdamage = bankerdamage - banker[bkid].starttotal*MAXHP/2;
|
|||
|
//sprintf( buf,"ħ<><C4A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bankdamage=%d <20>Լ<EFBFBD>=%d",bankerdamage,banker[bkid].starttotal*MAXHP/2);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
|
|||
|
}
|
|||
|
banker[bkid].hp[BANKERID] -= bankerdamage;
|
|||
|
NPC_magiccard_showdamage( meindex, meindex , BANKERID , bankerdamage );
|
|||
|
if( banker[bkid].hp[BANKERID] > banker[bkid].starttotal * MAXHP )
|
|||
|
banker[bkid].hp[BANKERID] = banker[bkid].starttotal * MAXHP;
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, FIGHTLOOPTIME );
|
|||
|
banker[bkid].state = 4;
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_specialcard( int meindex , int bkid )
|
|||
|
{
|
|||
|
int thunder=0,allhp=0;
|
|||
|
int i,j,k,target,targetarray[6],charindex,damage=0;
|
|||
|
char buf[256],buf1[256],buf2[256];
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
for( i=0;i<MAXGUY;i++)
|
|||
|
{
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 29 ){
|
|||
|
thunder++;
|
|||
|
sprintf( buf,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>",i+1);
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
allhp += banker[bkid].hp[i];
|
|||
|
}
|
|||
|
if( banker[bkid].select == 29 ){
|
|||
|
thunder++;
|
|||
|
sprintf( buf,"ħ<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
|
|||
|
//sprintf( buf,"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d",thunder);
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
i=0;
|
|||
|
while(thunder){
|
|||
|
|
|||
|
if( rand()%100 > 50 + 5 * banker[bkid].playertotal )
|
|||
|
target = BANKERID;
|
|||
|
else
|
|||
|
{
|
|||
|
k = 0 ;
|
|||
|
for( j=0;j<BANKERID;j++ ){
|
|||
|
if( NPC_magiccard_checkExist( meindex , bkid , j ) == -1 ) continue;
|
|||
|
targetarray[k] = j;
|
|||
|
k++;
|
|||
|
}
|
|||
|
if( k == 0 ) target = BANKERID; //û<><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3><EFBFBD>
|
|||
|
else target = targetarray[rand()%k];
|
|||
|
}
|
|||
|
|
|||
|
if(target == BANKERID ) //<2F><>ׯ<EFBFBD><D7AF>
|
|||
|
{
|
|||
|
charindex = meindex;
|
|||
|
if( banker[bkid].select != 26 ) damage = Cardfunctiontable[29].attack;
|
|||
|
else damage = 0;
|
|||
|
|
|||
|
banker[bkid].hp[target] -= damage;
|
|||
|
i++;
|
|||
|
if( damage == 0 ){
|
|||
|
sprintf( buf,"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BB>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>û<EFBFBD><C3BB>",i);
|
|||
|
}else{
|
|||
|
sprintf( buf,"ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BB><EFBFBD>",i);
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}else{
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , target );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 26 ) damage = 0;
|
|||
|
else damage = Cardfunctiontable[29].attack;
|
|||
|
|
|||
|
banker[bkid].hp[target] -= damage;
|
|||
|
allhp -= damage;
|
|||
|
i++;
|
|||
|
if( damage == 0 ){
|
|||
|
sprintf( buf,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD>߱<EFBFBD><DFB1><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BB>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>û<EFBFBD><C3BB>",target+1,i);
|
|||
|
}else{
|
|||
|
sprintf( buf,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD>߱<EFBFBD><DFB1><EFBFBD>%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><D7BB><EFBFBD>",target+1,i);
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
NPC_magiccard_action2( meindex , charindex , target , 29 , MAGIC );
|
|||
|
NPC_magiccard_showdamage( meindex , meindex , target , damage );
|
|||
|
thunder--;
|
|||
|
}
|
|||
|
|
|||
|
buf1[0] ='\0';
|
|||
|
buf2[0] ='\0';
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>
|
|||
|
if( banker[bkid].select == 27 )
|
|||
|
{
|
|||
|
sprintf( buf,"ħ<EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ӡ<EFBFBD><EFBFBD>");
|
|||
|
showString( meindex, buf , 0);
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++ ){
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
NPC_magiccard_action2( meindex , meindex , i , 27 , MAGIC );
|
|||
|
|
|||
|
if( ( rand()%100 > ( 30 - 4 * banker[bkid].playertotal ) ) &&
|
|||
|
CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) != 26 ){
|
|||
|
banker[bkid].pauseflag[i] = TRUE;
|
|||
|
NPC_magiccard_showdamage(meindex , meindex , i , 1111 );
|
|||
|
sprintf(buf2,"%d<><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ",i+1);
|
|||
|
strcat( buf1,buf2);
|
|||
|
}else
|
|||
|
NPC_magiccard_showdamage(meindex , meindex , i , 2222 );
|
|||
|
}
|
|||
|
}
|
|||
|
for( i=0;i<MAXGUY;i++)
|
|||
|
{
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_SELECT ) == 27 ){
|
|||
|
|
|||
|
sprintf( buf,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>ʹ<EFBFBD>÷<EFBFBD>ӡ<EFBFBD><D3A1>",i+1);
|
|||
|
NPC_magiccard_action2( meindex , charindex , BANKERID , 27 , MAGIC );
|
|||
|
if( banker[bkid].select == 26 )
|
|||
|
{
|
|||
|
NPC_magiccard_showdamage(meindex , meindex , BANKERID , 2222 );
|
|||
|
strcat(buf," <20><>ħ<EFBFBD><C4A7>ʹ<EFBFBD>û<EFBFBD>Ӱ<EFBFBD><D3B0>ʧ<EFBFBD><CAA7>");
|
|||
|
}else if( rand()%100 > ( 50 + 5 * banker[bkid].playertotal ) ){
|
|||
|
banker[bkid].pauseflag[BANKERID] = TRUE;
|
|||
|
sprintf( buf2,"ħ<EFBFBD><EFBFBD> ");
|
|||
|
strcat( buf1,buf2);
|
|||
|
NPC_magiccard_showdamage( meindex , meindex , BANKERID , 1111 );
|
|||
|
strcat(buf," <20><><EFBFBD><EFBFBD>");
|
|||
|
}else{
|
|||
|
NPC_magiccard_showdamage(meindex , meindex , BANKERID , 2222 );
|
|||
|
strcat(buf," ʧ<><CAA7>");
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(strcmp( buf1 , "" ) !=0 ){
|
|||
|
strcat( buf1,"<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><EFBFBD>");
|
|||
|
}
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>غ϶<D8BA>ս<EFBFBD><D5BD><EFBFBD><EFBFBD>
|
|||
|
if( allhp > banker[bkid].hp[BANKERID] )
|
|||
|
sprintf( buf,"<EFBFBD><EFBFBD>%d<>غϽ<D8BA><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD><D5BD>HP%d<><64><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ħ<EFBFBD><C4A7>HP%d<><64>%s",banker[bkid].turn,allhp,banker[bkid].hp[BANKERID],buf1);
|
|||
|
else if( allhp < banker[bkid].hp[BANKERID] )
|
|||
|
sprintf( buf,"<EFBFBD><EFBFBD>%d<>غϽ<D8BA><CFBD><EFBFBD><EFBFBD><EFBFBD>ħ<EFBFBD><C4A7>HP%d<><64><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ս<EFBFBD><D5BD>HP%d<><64>%s",banker[bkid].turn,banker[bkid].hp[BANKERID],allhp,buf1);
|
|||
|
else
|
|||
|
sprintf( buf,"<EFBFBD><EFBFBD>%d<>غϽ<D8BA><CFBD><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD>HP%d<><64>ƽ<EFBFBD><C6BD> %s",banker[bkid].turn,allhp,buf1);
|
|||
|
showString( meindex, buf , 0);
|
|||
|
|
|||
|
banker[bkid].state = 5;
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, TURNOVERTIME );
|
|||
|
}
|
|||
|
|
|||
|
// <20>µ<EFBFBD><C2B5><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD>
|
|||
|
void NPC_magiccard_action2(int meindex , int charindex , int user , int card , int action )
|
|||
|
{
|
|||
|
int x,y,floor;
|
|||
|
OBJECT object;
|
|||
|
int objindex,othercharindex;
|
|||
|
int j,k,dir,animno;
|
|||
|
char data[1024],buf[256];
|
|||
|
int offsetx,offsety;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return ;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
floor = CHAR_getInt(charindex, CHAR_FLOOR);
|
|||
|
x = Positiontable[user].petX + offsetx;
|
|||
|
y = Positiontable[user].petY + offsety;
|
|||
|
dir = Positiontable[user].direct;
|
|||
|
animno = Cardfunctiontable[card].effect;
|
|||
|
|
|||
|
//<2F><><EFBFBD><CDB8><EFBFBD><EFBFBD>npc
|
|||
|
if( ( card == 27 || card == 29 ) && user <= BANKERID ){
|
|||
|
object=MAP_getTopObj(floor, Positiontable[user].npcX + offsetx, Positiontable[user].npcY + offsety );
|
|||
|
if(object){
|
|||
|
objindex = GET_OBJINDEX( object);
|
|||
|
charindex = OBJECT_getIndex(objindex);
|
|||
|
}
|
|||
|
//sprintf( data,"npcindex %d name: %s",charindex,CHAR_getChar(charindex, CHAR_NAME));
|
|||
|
//showString( charindex, data , 0);
|
|||
|
}
|
|||
|
|
|||
|
for( j = x-CHAR_DEFAULTSEESIZ ; j <= x+CHAR_DEFAULTSEESIZ ; j++ ){
|
|||
|
for( k = y-CHAR_DEFAULTSEESIZ ; k <= y+CHAR_DEFAULTSEESIZ ; k ++ ){
|
|||
|
for (object = MAP_getTopObj(floor, j, k); object; object = NEXT_OBJECT(object))
|
|||
|
{
|
|||
|
objindex = GET_OBJINDEX( object);
|
|||
|
othercharindex = OBJECT_getIndex(objindex);
|
|||
|
|
|||
|
if (OBJECT_getType(objindex) == OBJTYPE_NOUSE)
|
|||
|
continue;
|
|||
|
//if (OBJECT_getType(objindex) == OBJTYPE_CHARA &&
|
|||
|
// !CHAR_getFlg(OBJECT_getIndex(objindex), CHAR_ISVISIBLE))
|
|||
|
// continue;
|
|||
|
if (OBJECT_getType(objindex) == OBJTYPE_CHARA &&
|
|||
|
CHAR_getInt(othercharindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER &&
|
|||
|
CHAR_getWorkInt(othercharindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE){
|
|||
|
sprintf( data,"%d|%d|%d|%d|%d|%d|%d|%d|",CHAR_getWorkInt( charindex, CHAR_WORKOBJINDEX)
|
|||
|
//sprintf( data,"%d|%d|%d|%d|%d|%d|",CHAR_getWorkInt( npccharindex, CHAR_WORKOBJINDEX)
|
|||
|
,user,card,dir,animno,action,offsetx,offsety);
|
|||
|
lssproto_MagiccardAction_send(getfdFromCharaIndex(othercharindex), data );
|
|||
|
//lssproto_Firework_send(getfdFromCharaIndex(othercharindex), CHAR_getWorkInt( charindex, CHAR_WORKOBJINDEX), 0, 101888);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_showdamage(int meindex , int charindex , int position , int damage )
|
|||
|
{
|
|||
|
int x,y,j,k,floor;
|
|||
|
OBJECT object;
|
|||
|
int objindex,othercharindex,offsetx,offsety;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
char buf[256];
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return ;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
floor = CHAR_getInt(charindex, CHAR_FLOOR);
|
|||
|
x = Positiontable[position].humanX + offsetx;
|
|||
|
y = Positiontable[position].humanY + offsety;
|
|||
|
|
|||
|
for( j = x-CHAR_DEFAULTSEESIZ/2 ; j <= x+CHAR_DEFAULTSEESIZ/2 ; j++ ){
|
|||
|
for( k = y-CHAR_DEFAULTSEESIZ/2 ; k <= y+CHAR_DEFAULTSEESIZ/2 ; k ++ ){
|
|||
|
for (object = MAP_getTopObj(floor, j, k); object; object = NEXT_OBJECT(object))
|
|||
|
{
|
|||
|
objindex = GET_OBJINDEX( object);
|
|||
|
othercharindex = OBJECT_getIndex(objindex);
|
|||
|
|
|||
|
if (OBJECT_getType(objindex) == OBJTYPE_NOUSE)
|
|||
|
continue;
|
|||
|
if (OBJECT_getType(objindex) == OBJTYPE_CHARA &&
|
|||
|
!CHAR_getFlg(OBJECT_getIndex(objindex), CHAR_ISVISIBLE))
|
|||
|
continue;
|
|||
|
if (OBJECT_getType(objindex) == OBJTYPE_CHARA &&
|
|||
|
CHAR_getInt(othercharindex, CHAR_WHICHTYPE) == CHAR_TYPEPLAYER &&
|
|||
|
CHAR_getWorkInt(othercharindex, CHAR_WORKBATTLEMODE ) == BATTLE_CHARMODE_NONE){
|
|||
|
lssproto_MagiccardDamage_send(getfdFromCharaIndex(othercharindex), position,damage,offsetx,offsety);
|
|||
|
//sprintf( buf,"name: %s fd%d posi %d damage %d ox %d oy %d",CHAR_getChar(othercharindex, CHAR_NAME),
|
|||
|
// getfdFromCharaIndex(othercharindex),position,damage,offsetx,offsety
|
|||
|
// );
|
|||
|
//showString( meindex, buf , 0);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
//<2F>ĸ<EFBFBD><C4B8><EFBFBD>ս<EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
|
|||
|
void NPC_magiccard_out( int meindex , int bkid , int player )
|
|||
|
{
|
|||
|
int gift=0,charindex,allhp=0,i;
|
|||
|
char buf[128];
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
int offsetx,offsety;
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return ;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , player );
|
|||
|
if( !CHAR_CHECKINDEX(charindex)) return;
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++) allhp += banker[bkid].hp[i];
|
|||
|
|
|||
|
if(banker[bkid].hp[player]<=0||banker[bkid].hp[BANKERID]>=allhp ){
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_GIVEGOLD ) == 1 ){
|
|||
|
sprintf(buf,"Ŀǰ<EFBFBD>ܻ<EFBFBD><EFBFBD><EFBFBD>Ϊ%d<><64>лл<D0BB><D0BB><EFBFBD><EFBFBD>",CHAR_getInt( charindex , CHAR_GAMBLENUM));
|
|||
|
CHAR_talkToCli( charindex , -1 , buf, CHAR_COLORYELLOW);
|
|||
|
}else{
|
|||
|
sprintf(buf,"<EFBFBD>ܱ<EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD> 6 <20><><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>Ŀǰ<C4BF>ܻ<EFBFBD><DCBB><EFBFBD>Ϊ%d<><64>лл<D0BB><D0BB><EFBFBD><EFBFBD>",CHAR_getInt( charindex , CHAR_GAMBLENUM));
|
|||
|
CHAR_talkToCli( charindex , -1 , buf, CHAR_COLORYELLOW);
|
|||
|
}
|
|||
|
}else{
|
|||
|
if( banker[bkid].turn <= 10 && banker[bkid].hp[BANKERID] <= 0) gift = 20;
|
|||
|
else if(allhp >= banker[bkid].starttotal*MAXHP*80/100 ) gift = 15;
|
|||
|
else if(allhp >= banker[bkid].starttotal*MAXHP*60/100 ) gift = 10;
|
|||
|
else gift = 5;
|
|||
|
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_GIVEGOLD ) == 1 ){
|
|||
|
CHAR_setInt( charindex , CHAR_GOLD, CHAR_getInt( charindex , CHAR_GOLD)+10000 );
|
|||
|
CHAR_setInt( charindex , CHAR_GAMBLENUM, CHAR_getInt( charindex , CHAR_GAMBLENUM)+gift );
|
|||
|
sprintf(buf,"<EFBFBD><EFBFBD><EFBFBD>ûر<EFBFBD>֤<EFBFBD><EFBFBD>10000<EFBFBD><EFBFBD>");
|
|||
|
CHAR_talkToCli( charindex , -1 , buf, CHAR_COLORYELLOW);
|
|||
|
}else{
|
|||
|
CHAR_setInt( charindex , CHAR_GAMBLENUM, CHAR_getInt( charindex , CHAR_GAMBLENUM)+gift+6 );
|
|||
|
}
|
|||
|
sprintf(buf,"<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD> %d <20><><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>Ŀǰ<C4BF>ܻ<EFBFBD><DCBB><EFBFBD>Ϊ%d<><64>лл<D0BB><D0BB><EFBFBD><EFBFBD>",gift,CHAR_getInt( charindex , CHAR_GAMBLENUM));
|
|||
|
CHAR_talkToCli( charindex , -1 , buf, CHAR_COLORYELLOW);
|
|||
|
Bettotal[bkid] -= 6;
|
|||
|
Wintotal[bkid] += gift;
|
|||
|
if( CHAR_getInt( charindex , CHAR_GAMBLENUM ) > 10000 )
|
|||
|
CHAR_setInt( charindex , CHAR_GAMBLENUM , 10000 );
|
|||
|
}
|
|||
|
|
|||
|
CHAR_setWorkInt( charindex , CHAR_WORK_TEMP_FLOOR, 0);
|
|||
|
// ӫĻ<D3AB><C4BB>λ
|
|||
|
lssproto_MoveScreen_send(getfdFromCharaIndex(charindex), FALSE, 0);
|
|||
|
|
|||
|
CHAR_warpToSpecificPoint( charindex , CHAR_getInt( meindex, CHAR_FLOOR)
|
|||
|
,Positiontable[7].humanX + offsetx , Positiontable[7].humanY + offsety);
|
|||
|
//banker[bkid].playertotal -= 1;
|
|||
|
}
|
|||
|
|
|||
|
//һ<>غϽ<D8BA><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD><C2B3><EFBFBD>
|
|||
|
void NPC_magiccard_turnover( int meindex , int bkid )
|
|||
|
{
|
|||
|
char buf[256];
|
|||
|
unsigned int card;
|
|||
|
int i,k,charindex,offsetx,offsety;
|
|||
|
BOOL goflag = FALSE;
|
|||
|
OBJECT object;
|
|||
|
int bossindex,objindex;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return ;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>
|
|||
|
for( i=0;i<MAXGUY;i++)
|
|||
|
{
|
|||
|
charindex = NPC_magiccard_checkExist( meindex , bkid , i );
|
|||
|
if( charindex == -1 ) continue;
|
|||
|
|
|||
|
//<2F><><EFBFBD>黹<EFBFBD><E9BBB9>û<EFBFBD><C3BB><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( banker[bkid].hp[i] <= 0 ) {
|
|||
|
sprintf( buf,"%d<><64><EFBFBD><EFBFBD>ս<EFBFBD>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>",i+1);
|
|||
|
showString( meindex, buf , 0);
|
|||
|
NPC_magiccard_out( meindex , bkid , i );
|
|||
|
continue;
|
|||
|
}
|
|||
|
goflag = TRUE; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD>»غ<C2BB>
|
|||
|
if( CHAR_getWorkInt( charindex , NPC_WORK_ACTION ) == 0 ) continue; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
card = SHIFTBASE << CHAR_getWorkInt( charindex , NPC_WORK_SELECT );
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_HISTORY , (unsigned int)CHAR_getWorkInt( charindex , NPC_WORK_HISTORY ) | card );
|
|||
|
card = ~card;
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_HAND , (unsigned int)CHAR_getWorkInt( charindex , NPC_WORK_HAND ) & card );
|
|||
|
//<2F><><EFBFBD><EFBFBD>
|
|||
|
k = rand()%(26-banker[bkid].turn);
|
|||
|
if( Cardbox[i+7*bkid][k].cardindex == 28 && rand()%100 > 50 ) k = rand()%(26-banker[bkid].turn); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
|
|||
|
|
|||
|
Cardbox[i+7*bkid][k].use = 1;
|
|||
|
card = SHIFTBASE << Cardbox[i+7*bkid][k].cardindex ;
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_HAND ,
|
|||
|
(unsigned int)CHAR_getWorkInt( charindex , NPC_WORK_HAND )|card );
|
|||
|
qsort( &Cardbox[i+7*bkid] , 30 , sizeof(CardBoxType) , &NPC_magiccard_sort );
|
|||
|
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_SELECT , -1 ); //ѡ<><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_ACTION , 0 ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CHAR_setWorkInt( charindex , NPC_WORK_DAMAGE , 0 ); //<2F>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if( banker[bkid].action != 0 ) //û<>б<EFBFBD><D0B1><EFBFBD>ӡ
|
|||
|
{
|
|||
|
//<2F><>ׯ<EFBFBD>ҳ<EFBFBD><D2B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
|
|||
|
card = SHIFTBASE << banker[bkid].select ;
|
|||
|
banker[bkid].history |= card;
|
|||
|
card = ~card;
|
|||
|
banker[bkid].hand &= card;
|
|||
|
|
|||
|
//ׯ<>ҳ<EFBFBD><D2B3><EFBFBD>
|
|||
|
k = rand()%(26-banker[bkid].turn);
|
|||
|
if( Cardbox[6+7*bkid][k].cardindex == 28 && rand()%100 > 50 ) k = rand()%(26-banker[bkid].turn); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
|
|||
|
Cardbox[6+7*bkid][k].use = 1;
|
|||
|
card = SHIFTBASE << Cardbox[6+7*bkid][k].cardindex ;
|
|||
|
banker[bkid].hand |= card;
|
|||
|
qsort( &Cardbox[6+7*bkid] , 30 , sizeof(CardBoxType) , &NPC_magiccard_sort );
|
|||
|
}
|
|||
|
|
|||
|
if( banker[bkid].turn == 10 || banker[bkid].hp[BANKERID] <= 0 || goflag == FALSE ){
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
if( banker[bkid].hp[BANKERID] <= 0 && goflag == TRUE )
|
|||
|
{
|
|||
|
object = MAP_getTopObj(CHAR_getInt(meindex, CHAR_FLOOR), Positiontable[BANKERID].humanX + offsetx, Positiontable[BANKERID].humanY + offsety );
|
|||
|
if( object ){
|
|||
|
objindex = GET_OBJINDEX( object);
|
|||
|
bossindex = OBJECT_getIndex(objindex);
|
|||
|
CHAR_sendAction( bossindex , 2 , FALSE); //<2F>ε<EFBFBD>
|
|||
|
}
|
|||
|
}
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, GAMEOVERTIME );
|
|||
|
banker[bkid].state = 9;
|
|||
|
}else{
|
|||
|
banker[bkid].turn += 1;
|
|||
|
if( banker[bkid].turn == 10 ){
|
|||
|
sprintf(buf,"<EFBFBD><EFBFBD>10<EFBFBD>غ<EFBFBD> <20><><EFBFBD><EFBFBD>һ<EFBFBD>غφ<D8BA> ս<><D5BD>");
|
|||
|
}else{
|
|||
|
sprintf(buf,"<EFBFBD><EFBFBD>%d<>غ<EFBFBD> ս<><D5BD>",banker[bkid].turn);
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
banker[bkid].turntime = NowTime.tv_sec + 20 ;
|
|||
|
banker[bkid].process = 0;
|
|||
|
banker[bkid].select = 0;
|
|||
|
banker[bkid].action = 0;
|
|||
|
banker[bkid].state = 1;
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, LOOPTIME );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_gameover( int meindex , int bkid )
|
|||
|
{
|
|||
|
int i,allhp=0;
|
|||
|
char buf[256];
|
|||
|
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++) allhp += banker[bkid].hp[i];
|
|||
|
|
|||
|
sprintf(buf,"ս<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ħ<EFBFBD><EFBFBD>HP%d<><64>vs<76><73><EFBFBD><EFBFBD>ս<EFBFBD><D5BD><EFBFBD>ܺ<EFBFBD>HP%d<><64>",banker[bkid].hp[MAXGUY],allhp);
|
|||
|
if( banker[bkid].hp[MAXGUY] >= allhp ){
|
|||
|
strcat(buf,"<EFBFBD><EFBFBD>ħ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʤ");
|
|||
|
}else{
|
|||
|
strcat(buf,"<EFBFBD><EFBFBD>ϲ<EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD>ʤ");
|
|||
|
}
|
|||
|
showString( meindex, buf , 0);
|
|||
|
|
|||
|
for( i=0;i<MAXGUY;i++) NPC_magiccard_out( meindex , bkid , i ); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ս<EFBFBD>߳<EFBFBD><DFB3><EFBFBD>
|
|||
|
NPC_magiccard_resetbanker(meindex,bkid);
|
|||
|
}
|
|||
|
|
|||
|
void NPC_magiccard_resetbanker( int meindex , int bkid )
|
|||
|
{
|
|||
|
OBJECT object;
|
|||
|
int bossindex,objindex,offsetx,offsety;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE];
|
|||
|
char buf[256];
|
|||
|
int j,k;
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return ;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
for(j=0;j<7;j++){
|
|||
|
for(k=0;k<30;k++){
|
|||
|
Cardbox[j+bkid*7][k].use = 0;
|
|||
|
Cardbox[j+bkid*7][k].cardindex = k;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
memset(&banker[bkid],0,sizeof(banker[bkid]));
|
|||
|
banker[bkid].state = -1;
|
|||
|
CHAR_setInt( meindex, CHAR_LOOPINTERVAL, LOOPTIME );
|
|||
|
|
|||
|
//<2F><EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
object = MAP_getTopObj(CHAR_getInt(meindex, CHAR_FLOOR), Positiontable[BANKERID].humanX + offsetx, Positiontable[BANKERID].humanY + offsety );
|
|||
|
if( object ){
|
|||
|
objindex = GET_OBJINDEX( object);
|
|||
|
bossindex = OBJECT_getIndex(objindex);
|
|||
|
CHAR_sendAction( bossindex , 3 , FALSE);
|
|||
|
CHAR_CHAT_DEBUG_metamo( bossindex , "0" );
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int NPC_magiccard_checkExist( int meindex , int bkid , int player )
|
|||
|
{
|
|||
|
int i,floor,offsetx,offsety;
|
|||
|
int playernum = CHAR_getPlayerMaxNum();
|
|||
|
char *cdkey = NULL;
|
|||
|
char *name = NULL;
|
|||
|
OBJECT object;
|
|||
|
char argstr[NPC_UTIL_GETARGSTR_BUFSIZE],buf[256];
|
|||
|
|
|||
|
if( NPC_Util_GetArgStr( meindex, argstr, sizeof( argstr)) == NULL ) {
|
|||
|
print("\n read argstr err");
|
|||
|
return -1;
|
|||
|
}
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsetx", buf, sizeof( buf));
|
|||
|
offsetx = atoi(buf);
|
|||
|
NPC_Util_GetStrFromStrWithDelim( argstr , "offsety", buf, sizeof( buf));
|
|||
|
offsety = atoi(buf);
|
|||
|
|
|||
|
cdkey = banker[bkid].cdkey[player];
|
|||
|
name = banker[bkid].name[player];
|
|||
|
if( cdkey == NULL || name == NULL )
|
|||
|
return -1;
|
|||
|
for( i = 0 ; i < playernum ; i ++) {
|
|||
|
if( CHAR_CHECKINDEX( i) &&
|
|||
|
strcmp( CHAR_getChar( i, CHAR_CDKEY) , cdkey ) == 0 &&
|
|||
|
strcmp( CHAR_getChar( i, CHAR_NAME) , name ) == 0 ){
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
if( i == playernum ) return -1; //û<><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ս<EFBFBD><D5BD>
|
|||
|
floor = CHAR_getInt( meindex , CHAR_FLOOR);
|
|||
|
object = MAP_getTopObj( floor, Positiontable[player].humanX + offsetx , Positiontable[player].humanY + offsety );
|
|||
|
if( object ){
|
|||
|
int findex;
|
|||
|
int objindex = GET_OBJINDEX(object);
|
|||
|
findex = OBJECT_getIndex( objindex);
|
|||
|
if( findex == i )
|
|||
|
return i; //<2F><><EFBFBD>ҵ<EFBFBD>
|
|||
|
}
|
|||
|
return -1;
|
|||
|
}
|
|||
|
|
|||
|
int NPC_magiccard_sort( const void *card1, const void *card2 )
|
|||
|
{
|
|||
|
return ( ((CardBoxType*)card1)->use > ((CardBoxType*)card2)->use )? 1:0;
|
|||
|
}
|
|||
|
#endif
|