chuyiwen_gmsv/npc/npc_alldoman.c
2017-01-14 00:37:03 +09:00

393 lines
14 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "version.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "object.h"
#include "char_base.h"
#include "char.h"
#include "util.h"
#include "npcutil.h"
#include "item.h"
#include "readmap.h"
#include "enemy.h"
#include "chatmagic.h"
#include "log.h"
#include "npc_itemchange.h"
#include "lssproto_serv.h"
#include "saacproto_cli.h"
#include "npc_eventaction.h"
#include "npc_charm.h"
#ifdef _ALLDOMAN
#include "npc_alldoman.h"
#define MAX_HERO_COLUMN 7
#define MAX_HERO_LIST 100
char Herolist[MAX_HERO_LIST][MAX_HERO_COLUMN][72];
int sort[MAX_HERO_LIST][2];
int countnum = -1 ;
int showpage = 1 ;
int totalpage = 1;
static void NPC_Alldoman_selectWindow( int meindex, int talker, int seqno,char *data);
void NPC_AlldomanWindowTalked(int meindex, int talkerindex, int seqno, int select,char *data)
{
char buf2[256];
char buf[256];
int i;
int playernum = CHAR_getPlayerMaxNum();
//andy_log
print( "seqno:%d\n", seqno);
switch(seqno)
{
case NPC_ALLDOMAN_MAIN_WND:
if ( select == WINDOW_BUTTONTYPE_NEXT ) {
showpage ++ ;
NPC_Alldoman_selectWindow(meindex , talkerindex , 4 ,"");
}
if ( select == WINDOW_BUTTONTYPE_OK ) {
//CHAR_talkToCli(talkerindex,meindex,"看清楚了!",CHAR_COLORRED);
showpage = 1 ;
NPC_Alldoman_selectWindow(meindex , talkerindex, 5 ,"");
}
break;
case NPC_ALLDOMAN_SELECT_WND:
if(atoi(data)==2) {
//CHAR_talkToCli(talkerindex,meindex,"",CHAR_COLORRED);
if ( CHAR_getInt( talkerindex , CHAR_FLOOR ) != 8200 ) {
CHAR_talkToCli(talkerindex,-1,"这里只能给真正的英雄刻写!",CHAR_COLORRED);
break;
}
if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) > 132 ||
CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) <= 0 ) {
CHAR_setWorkInt( talkerindex , CHAR_WORKHEROFLOOR , 0 ) ;
CHAR_talkToCli(talkerindex,-1,"这里只能给真正的英雄刻写!",CHAR_COLORRED);
break;
}
sprintf( buf2 , "你拿出了打败守灵者%3d的证明试图将自己的姓名刻上石碑" , CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) );
CHAR_talkToCli(talkerindex,-1,buf2,CHAR_COLORRED);
if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) == 132 ) {
sprintf( buf2 , "%s" , "尼斯大陆英雄" ) ;
//到达顶层对全星系广播
sprintf( buf , "%s征服了英雄战场由风之精灵将这个消息通知全世界新的英雄诞生了!!" , CHAR_getChar( talkerindex, CHAR_NAME ) );
for( i = 0 ; i < playernum ; i++) {
if( CHAR_getCharUse(i) != FALSE ) {
CHAR_talkToCli( i, -1, buf, CHAR_COLORBLUE2);
}
}
}
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 130 )
sprintf( buf2 , "%s" , "尼斯大陆战士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 125 )
sprintf( buf2 , "%s" , "尼斯大陆勇士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 120 )
sprintf( buf2 , "%s" , "萨伊那斯英雄" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 115 )
sprintf( buf2 , "%s" , "斯巴达战士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 110 )
sprintf( buf2 , "%s" , "萨姆吉尔战士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 100 )
sprintf( buf2 , "%s" , "玛丽那丝战士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 80 )
sprintf( buf2 , "%s" , "卡坦战士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 60 )
sprintf( buf2 , "%s" , "霍特尔战士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 40 )
sprintf( buf2 , "%s" , "降魔勇士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 20 )
sprintf( buf2 , "%s" , "圣灵勇士" ) ;
else if ( CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ) >= 1 )
sprintf( buf2 , "%s" , "初犊勇士" ) ;
else
sprintf( buf2 , " " );
saacproto_UpdataStele_send (
acfd ,
CHAR_getChar( talkerindex , CHAR_CDKEY ),
CHAR_getChar( talkerindex , CHAR_NAME ) ,
buf2 ,
CHAR_getInt( talkerindex , CHAR_LV ) ,
CHAR_getInt( talkerindex , CHAR_TRANSMIGRATION) ,
10 ,
CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR )
) ;
//清除WorkFloor
CHAR_setWorkInt( talkerindex , CHAR_WORKHEROFLOOR , 0 ) ;
}
if(atoi(data)==4) {
//CHAR_talkToCli(talkerindex,meindex,"",CHAR_COLORRED);
showpage = 1 ;
NPC_Alldoman_selectWindow(meindex , talkerindex, 6 ,"");
}
if(atoi(data)==6) {
//CHAR_talkToCli(talkerindex,meindex,"",CHAR_COLORRED);
}
break;
case NPC_ALLDOMAN_LIST_WND:
if( select == WINDOW_BUTTONTYPE_OK ){
print("\nSyu log FloorWorkint => %d" , CHAR_getWorkInt( talkerindex , CHAR_WORKHEROFLOOR ));
}
if( select == WINDOW_BUTTONTYPE_PREV && showpage > 1 ) {
showpage -- ;
NPC_Alldoman_selectWindow(meindex , talkerindex, 6 ,"" );
}
if( select == WINDOW_BUTTONTYPE_NEXT && showpage < totalpage ) {
showpage ++ ;
NPC_Alldoman_selectWindow(meindex , talkerindex, 6 ,"");
}
break;
}
}
static void NPC_Alldoman_selectWindow( int meindex, int talker, int num, char *data)
{
int buttontype = 0,windowtype = 0,windowno = 0 , i ;
int fd = getfdFromCharaIndex( talker);
char token[1024];
char token2[100 * 100];
//andy_log
print( "NPC_Alldoman_selectWindow( num:%d)\n", num);
switch(num)
{
case 4:
if ( showpage == 1 ) {
buttontype = WINDOW_BUTTONTYPE_NEXT;
sprintf( token, "485447圣饼时,吉鲁出现大批机暴横行,所到之处皆无一幸免,尼斯各村的长老达成共识,调集各村勇士,前往消灭这群发狂的机暴,这群勇士在海底隧道入口跟这群机暴激战,不料,实力相差悬殊,勇士们伤亡惨重,残余的勇士,选择在霍特尔海底通路的入口做最");
}
else if ( showpage == 2 ) {
buttontype = WINDOW_BUTTONTYPE_NEXT;
sprintf( token, "後的的抵抗,各村长老召集大批人力,封死所有通往吉鲁的海底通道,终於在大批机暴涌入前,将入口封死,此地为485550圣饼时所建造,为纪念485447圣饼时所牺牲的勇士,立此石碑,建此地洞,命名为“英雄战场”,望後世人效法先烈的行径,达到强种强");
}
else if ( showpage == 3) {
buttontype = WINDOW_BUTTONTYPE_OK;
sprintf( token, "族为目的,让尼斯大陆的人们生生不息,上面的英雄是最近勇闯“英雄战场”所留下来的,特此诏告全尼斯英雄!\n\n 英雄战场制作委员会");
}
windowtype = WINDOW_MESSAGETYPE_MESSAGE;
windowno = NPC_ALLDOMAN_MAIN_WND;
lssproto_WN_send(fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX), token );
break;
case 5:
buttontype = WINDOW_BUTTONTYPE_NONE;
windowtype = WINDOW_MESSAGETYPE_SELECT;
windowno = NPC_ALLDOMAN_SELECT_WND;
sprintf(token,
"0\n\n         刻写石碑"
"\n\n        检视其他勇者"
"\n\n          取消"
);
lssproto_WN_send( fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),token);
break;
case 6:
if ( totalpage != 1 && showpage == 1 )
buttontype = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_NEXT;
else if ( totalpage == 1 )
buttontype = WINDOW_BUTTONTYPE_OK ;
else if ( totalpage != 1 && showpage == totalpage )
buttontype = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV;
else if ( totalpage != 1 && showpage != 1 && showpage != totalpage )
buttontype = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV | WINDOW_BUTTONTYPE_NEXT;
windowtype = WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT;
windowno = NPC_ALLDOMAN_LIST_WND;
sprintf ( token2 , " 姓名 头衔 楼层 等级 转生\n");
for ( i=0+(showpage-1 )*15; i<showpage*15; i++) {
if( atoi ( Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][6] ) == 0 ||
atoi ( Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][3] ) == 0 )
continue ;
sprintf( token , "%16s %13s %7d %7d %7d\n" ,
Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][1] ,
Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][2] ,
atoi ( Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][6] ),
atoi ( Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][3] ),
atoi ( Herolist[sort[MAX_HERO_LIST - 1 - i ][1]][4] )
);
strcat ( token2 , token ) ;
if ( i + 1 == countnum )
break;
}
lssproto_WN_send( fd, windowtype, buttontype, windowno,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),token2);
break;
}
}
static int loadherolist = 0;
BOOL NPC_AlldomanInit( int meindex )
{
if( loadherolist == 0){
loadherolist = 1;
saacproto_UpdataStele_send ( acfd , "FirstLoad", "LoadHerolist" , "华义" , 0 , 0 , 0 , 999 ) ;
}
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEALLDOMAN);
CHAR_setFlg( meindex , CHAR_ISATTACKED , 0 );
return TRUE;
}
void NPC_AlldomanTalked( int meindex , int talker , char *msg ,int color )
{
if( NPC_Util_CharDistance( talker, meindex ) > 1) return;
if( NPC_Util_isFaceToFace( talker, meindex , 1 ) == FALSE ) return;
showpage = 1 ;
NPC_Alldoman_selectWindow(meindex, talker , 4 ,"");
}
void NPC_AlldomanWriteStele ( char *token )
{
int linenum = 0 , i , flag , temp , temp1 , j ;
int lens=0;
char *addr;
if( token == NULL || (lens = strlen( token)) <= 0 ) return;
while( linenum < 100 ){
for ( i = 0 ; i < MAX_HERO_COLUMN ; i ++ ) {
if( getStringFromIndexWithDelim( token, "|", i + 1 , Herolist[ linenum ][ i ] , sizeof( Herolist[ linenum ][ i ] ) ) == FALSE ){
#ifdef _ALLDOMAN_DEBUG
countnum = 0 ;
for ( i = 0 ; i < MAX_HERO_LIST ; i ++ ) {
sort[i][0] = atoi ( Herolist[i][6] ) ;
sort[i][1] = i ;
if ( sort[i][0] != 0 && sort[i][0] != -1 )
countnum ++ ;
}
for ( i = 0 ; i < MAX_HERO_LIST - 1 ; i ++ ) {
flag = 0 ;
for ( j = 0 ; j < MAX_HERO_LIST - 1 ; j ++ ) {
if ( sort[j][0] > sort[j+1][0] ){
flag = 1 ;
temp = sort[j][0];
temp1 = sort[j][1];
sort[j][0] = sort[j + 1][0];
sort[j][1] = sort[j + 1][1];
sort[j+1][0] = temp;
sort[j+1][1] = temp1;
}
}
if ( flag != 1 )
break;
}
totalpage = countnum / 15 ;
if ( ( countnum % 15 ) != 0 )
totalpage ++;
#endif
return;
}
}
linenum ++;
if ( (addr = strstr ( token , "\n" )) == NULL ) break;
strcpy ( token , addr + 1 ) ;
if( token == NULL || (lens = strlen( token)) <= 0 ) {
#ifdef _ALLDOMAN_DEBUG
countnum = 0 ;
for ( i = 0 ; i < MAX_HERO_LIST ; i ++ ) {
sort[i][0] = atoi ( Herolist[i][6] ) ;
sort[i][1] = i ;
if ( sort[i][0] != 0 && sort[i][0] != -1 )
countnum ++ ;
}
for ( i = 0 ; i < MAX_HERO_LIST - 1 ; i ++ ) {
flag = 0 ;
for ( j = 0 ; j < MAX_HERO_LIST - 1 ; j ++ ) {
if ( sort[j][0] > sort[j+1][0] ){
flag = 1 ;
temp = sort[j][0];
temp1 = sort[j][1];
sort[j][0] = sort[j + 1][0];
sort[j][1] = sort[j + 1][1];
sort[j+1][0] = temp;
sort[j+1][1] = temp1;
}
}
if ( flag != 1 )
break;
}
totalpage = countnum / 15 ;
if ( ( countnum % 15 ) != 0 )
totalpage ++;
#endif
return;
}
}
countnum = 0 ;
for ( i = 0 ; i < MAX_HERO_LIST ; i ++ ) {
sort[i][0] = atoi ( Herolist[i][6] ) ;
sort[i][1] = i ;
if ( sort[i][0] != 0 && sort[i][0] != -1 )
countnum ++ ;
}
for ( i = 0 ; i < MAX_HERO_LIST - 1 ; i ++ ) {
flag = 0 ;
for ( j = 0 ; j < MAX_HERO_LIST - 1 ; j ++ ) {
if ( sort[j][0] > sort[j+1][0] ){
flag = 1 ;
temp = sort[j][0];
temp1 = sort[j][1];
sort[j][0] = sort[j + 1][0];
sort[j][1] = sort[j + 1][1];
sort[j+1][0] = temp;
sort[j+1][1] = temp1;
}
}
if ( flag != 1 )
break;
}
totalpage = countnum / 15 ;
if ( ( countnum % 15 ) != 0 )
totalpage ++;
//#endif
}
void NPC_Alldoman_S_WriteStele( char *ocdkey , char *oname , char *ncdkey ,
char *nname , char *title , int level , int trns , int floor )
{
int i , j , temp , temp1 , flag ;
for ( i = 0 ; i < MAX_HERO_COLUMN ; i ++ ) {
if ( ( strcmp( Herolist[i][0] , ocdkey ) == 0 ) && ( strcmp( Herolist[i][1] , oname ) == 0 ) ) {
sprintf( Herolist[i][0] , "%s" , ncdkey ) ;
sprintf( Herolist[i][1] , "%s" , nname ) ;
sprintf( Herolist[i][2] , "%s" , title ) ;
sprintf( Herolist[i][3] , "%d" , level ) ;
sprintf( Herolist[i][4] , "%d" , trns ) ;
sprintf( Herolist[i][6] , "%d" , floor ) ;
break;
}
}
countnum = 0 ;
for ( i = 0 ; i < MAX_HERO_LIST ; i ++ ) {
sort[i][0] = atoi ( Herolist[i][6] ) ;
sort[i][1] = i ;
if ( sort[i][0] != 0 && sort[i][0] != -1 )
countnum ++ ;
}
for ( i = 0 ; i < MAX_HERO_LIST - 1 ; i ++ ) {
flag = 0 ;
for ( j = 0 ; j < MAX_HERO_LIST - 1 ; j ++ ) {
if ( sort[j][0] > sort[j+1][0] ){
flag = 1 ;
temp = sort[j][0];
temp1 = sort[j][1];
sort[j][0] = sort[j + 1][0];
sort[j][1] = sort[j + 1][1];
sort[j+1][0] = temp;
sort[j+1][1] = temp1;
}
}
if ( flag != 1 )
break;
}
totalpage = countnum / 15 ;
if ( ( countnum % 15 ) != 0 )
totalpage ++ ;
}
#endif