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

228 lines
6.5 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 <string.h>
#include "char.h"
#include "object.h"
#include "char_base.h"
#include "npcutil.h"
#include "net.h"
#include "lssproto_serv.h"
#include "saacproto_cli.h"
#include "npc_duelranking.h"
#include "handletime.h"
static void NPC_Duelranking_selectWindow( int meindex, int toindex, int num, int select );
#define NPC_DUELRANKING_WINDOWLINENUM 10
enum{
WINDOWTYPE_PKLIST_START=10,
WINDOWTYPE_PKLIST_SELECT,
WINDOWTYPE_PKLIST_SELECT1,
WINDOWTYPE_PKLIST_SELECT2,
WINDOWTYPE_FAMILYCONTENDSTART,
WINDOWTYPE_FAMILYCONTENDSELECT,
WINDOWTYPE_FAMILYCONTENDLIST,
WINDOWTYPE_FAMILYCONTENDJOIN,
NPC_WORK_CURRENTTIME = CHAR_NPCWORKINT1,
NPC_WORK_BATTLELOOP = CHAR_NPCWORKINT2,
};
BOOL NPC_DuelrankingInit( int meindex )
{
CHAR_setInt( meindex , CHAR_WHICHTYPE , CHAR_TYPEDUELRANKING );
return TRUE;
}
void NPC_DuelrankingLooked( int meindex , int lookedindex)
{
NPC_Duelranking_selectWindow( meindex, lookedindex, 1, -1);
}
static void NPC_Duelranking_selectWindow( int meindex, int toindex, int num, int select)
{
int fd;
if( CHAR_getInt( toindex , CHAR_WHICHTYPE ) != CHAR_TYPEPLAYER ) {
return;
}
if( NPC_Util_CharDistance( toindex, meindex ) > 1) return;
if( (fd = getfdFromCharaIndex( toindex)) == -1 ) return;
switch( num){
case 1:
{
char message[1024];
char buf[2048];
strcpy( message,
"1\n"
" 要看哪一个? \n\n\n"
" <强者们> \n\n"
" 自己 \n\n"
" <都不看> \n\n" );
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_SELECT,
WINDOW_BUTTONTYPE_NONE,
CHAR_WINDOWTYPE_DUELRANKING_START,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
makeEscapeString( message, buf, sizeof(buf)));
}
break;
}
}
void NPC_DuelrankingWindowTalked( int meindex, int talkerindex, int seqno, int select, char *data)
{
int fdid = getFdidFromCharaIndex( talkerindex);
if( fdid == -1 ) return;
if( NPC_Util_CharDistance( talkerindex, meindex ) > 1) return;
switch( seqno){
case CHAR_WINDOWTYPE_DUELRANKING_START:
if( atoi( data) == 3 ) {
saacproto_DBGetEntryByCount_send( acfd,
DB_DUELPOINT, 0,
NPC_DUELRANKING_WINDOWLINENUM, fdid,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
}
if( atoi( data) == 5 ) {
char dbkey[256];
CHAR_makeDBKey( talkerindex, dbkey, sizeof( dbkey));
saacproto_DBGetEntryRank_send( acfd, DB_DUELPOINT, dbkey, fdid,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
}
break;
case CHAR_WINDOWTYPE_DUELRANKING_TOPRANKING:
if( select == WINDOW_BUTTONTYPE_PREV || select == WINDOW_BUTTONTYPE_NEXT) {
int count = CHAR_getWorkInt( talkerindex, CHAR_WORKSHOPRELEVANT);
if( select == WINDOW_BUTTONTYPE_NEXT ) {
count += NPC_DUELRANKING_WINDOWLINENUM;
}else {
count -= NPC_DUELRANKING_WINDOWLINENUM;
}
if( count < 0) count = 0;
saacproto_DBGetEntryByCount_send( acfd,
DB_DUELPOINT,
count,
NPC_DUELRANKING_WINDOWLINENUM, fdid,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
}else if( select == WINDOW_BUTTONTYPE_OK ) {
if( strlen( data) != 0 ) {
int count;
count = atoi( data);
if( count < 1 ) count = 1;
saacproto_DBGetEntryByCount_send( acfd,
DB_DUELPOINT,
count-1,
NPC_DUELRANKING_WINDOWLINENUM, fdid,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX));
}
}
break;
}
}
void NPC_Duelranking_PrintRanking( char *data, int count_start, int fdid, int msgid2)
{
char message[1024];
char buf[2048];
int i;
int cnt = 0;
int button = 0;
int fd = getfdFromFdid( fdid);
if( fd == -1 ) return;
message[0] = '\0';
snprintf( message, sizeof( message),
" 世界的强者们\n\n"
" Rank DuelPoint Lv Name\n\n" );
for( i = 1; ; i ++ ) {
char rankdata[256];
char cdandname[64];
char charaname[32];
char rank[16];
char score[64];
char msgbuf[512];
char cdkey[32];
char lv[16];
char hosi[6];
if( !getStringFromIndexWithDelim( data, "|", i, rankdata, sizeof( rankdata))) {
break;
}
if( !getStringFromIndexWithDelim( rankdata, ",", 2, rank, sizeof( rank)) ){
continue;
}
if( !getStringFromIndexWithDelim( rankdata, ",", 3, cdandname, sizeof( cdandname)) ){ continue;
}
makeStringFromEscaped( cdandname);
if( !getStringFromIndexWithDelim( cdandname, "_", 1, cdkey, sizeof( cdkey)) ){
continue;
}
if( !getStringFromIndexWithDelim( cdandname, "_", 2, charaname, sizeof( charaname)) ){
continue;
}
if( !getStringFromIndexWithDelim( rankdata, ",", 4, score, sizeof( score)) ){
continue;
}
if( !getStringFromIndexWithDelim( rankdata, ",", 5, lv, sizeof( lv)) ){
lv[0] = '\0';
}
{
char *mycdkey = CHAR_getChar( CONNECT_getCharaindex(fd), CHAR_CDKEY);
char *myname = CHAR_getChar( CONNECT_getCharaindex(fd), CHAR_NAME);
char engnum[4][3] = { "st","nd","rd","th"};
int dsprank = atoi(rank);
if( dsprank > 3) dsprank = 3;
if( mycdkey != NULL && myname != NULL && strcmp( cdkey, mycdkey) == 0 &&
strcmp( charaname, myname) == 0 ) {
strcpy( hosi, "");
}else {
strcpy( hosi, " ");
}
snprintf( msgbuf, sizeof( msgbuf), "%s %5d%s %10s %3s %s\n",
hosi,
atoi(rank)+1, engnum[dsprank],
score, lv,
charaname );
}
strcatsafe( message, sizeof( message), msgbuf);
cnt ++;
}
if( cnt == 0 ) {
strcpy( message, "\n 没有其他的资料了。");
button = WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_OK;
}else if( cnt < NPC_DUELRANKING_WINDOWLINENUM ) {
if( count_start >= NPC_DUELRANKING_WINDOWLINENUM) {
button = WINDOW_BUTTONTYPE_OK | WINDOW_BUTTONTYPE_PREV;
}else {
button = WINDOW_BUTTONTYPE_OK;
}
}else if( count_start == 0 ) {
button = WINDOW_BUTTONTYPE_NEXT|WINDOW_BUTTONTYPE_OK;
}else {
button = WINDOW_BUTTONTYPE_NEXT|WINDOW_BUTTONTYPE_PREV|WINDOW_BUTTONTYPE_OK;
}
lssproto_WN_send( fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT,
button,
CHAR_WINDOWTYPE_DUELRANKING_TOPRANKING,
msgid2,
makeEscapeString( message, buf, sizeof(buf)));
if( cnt == 0 ) {
CHAR_setWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKSHOPRELEVANT, -1);
}else {
CHAR_setWorkInt( CONNECT_getCharaindex(fd), CHAR_WORKSHOPRELEVANT, count_start);
}
}
void NPC_Duelranking_CallMyRanking( int count, int msgid, int msgid2)
{
count -= 5;
if( count < 0 ) count = 0;
saacproto_DBGetEntryByCount_send( acfd, DB_DUELPOINT,
count, NPC_DUELRANKING_WINDOWLINENUM,
msgid, msgid2 );
}