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

249 lines
7.4 KiB
C

#include "version.h"
#include <time.h>
#include "char.h"
#include "object.h"
#include "lssproto_serv.h"
#include "npcutil.h"
#include "handletime.h"
static BOOL NPC_DengonReadString( int meindex, int id, char *str );
static void NPC_DengonWriteString( int meindex, int talkerindex, int id, char *str );
#define DENGONFILEDIR "./Dengon/"
#define DENGONFILELINENUM 1000
#define DENGONFILESTRINGSIZE 256
#define DENGONFILECOUNTERSIZE 11
#define DENGONFILEENTRYSIZE (DENGONFILECOUNTERSIZE+DENGONFILESTRINGSIZE+1)
#define MESSAGEINONEWINDOW 7
char NPC_sendbuf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW];
BOOL NPC_DengonInit( int meindex )
{
char filename[256], tmp[256];
FILE *f;
int i,j;
int id, maxid;
CHAR_setInt( meindex, CHAR_WHICHTYPE, CHAR_TYPEDENGON );
snprintf( filename,sizeof(filename), "%s%d_%d_%d",
DENGONFILEDIR, CHAR_getInt( meindex, CHAR_FLOOR ),
CHAR_getInt( meindex, CHAR_X ),
CHAR_getInt( meindex, CHAR_Y ) );
if( ! (f=fopen( filename, "r" )) ){
f = fopen( filename, "w" );
if( f ){
}else{
print( "ERROR:Can't create Dengonfile %s!\n",filename );
return FALSE;
}
for( j = 0; j < DENGONFILELINENUM; j++ ){
fwrite( "0000000000:", sizeof(char),
DENGONFILECOUNTERSIZE, f);
for( i=0;i<DENGONFILESTRINGSIZE;i++ ){
fwrite( "\0", sizeof(char),1, f );
}
fwrite( "\n", sizeof(char), 1, f);
}
}
id =0;
maxid = 0;
for( i = 0; i < DENGONFILELINENUM; i++ ){
fseek( f, i*DENGONFILEENTRYSIZE, SEEK_SET );
fread( tmp, sizeof(char), DENGONFILECOUNTERSIZE, f );
tmp[DENGONFILECOUNTERSIZE-1] = '\0';
if( (id=atoi(tmp)) > maxid ) {
maxid = id;
}
}
CHAR_setWorkInt( meindex, CHAR_WORKDENGONMAXID, maxid );
fclose(f);
return TRUE;
}
void NPC_DengonWindowTalked( int index, int talker,
int seqno, int select, char *data)
{
char buf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW*2];
int id;
#define DENGONDISTANCE 3
if(NPC_Util_CharDistance(index,talker) > DENGONDISTANCE ) return;
if( seqno == CHAR_WINDOWTYPE_DENGON) {
int buttontype = 0;
int maxid;
switch( select ){
case WINDOW_BUTTONTYPE_NEXT:
case WINDOW_BUTTONTYPE_PREV:
id = CHAR_getWorkInt( talker, CHAR_WORKSHOPRELEVANT)
+ MESSAGEINONEWINDOW
* (( select == WINDOW_BUTTONTYPE_NEXT) ? 1 : -1);
maxid = CHAR_getWorkInt( index, CHAR_WORKDENGONMAXID );
if( id > maxid) id = maxid;
else if( id < 2 ) id = 1;
buttontype = WINDOW_BUTTONTYPE_OKCANCEL;
if( id == maxid ) buttontype |= WINDOW_BUTTONTYPE_PREV;
else if( id == 1 ) buttontype |= WINDOW_BUTTONTYPE_NEXT;
else {
buttontype |= WINDOW_BUTTONTYPE_PREV;
buttontype |= WINDOW_BUTTONTYPE_NEXT;
}
CHAR_setWorkInt( talker, CHAR_WORKSHOPRELEVANT, id);
if( NPC_DengonReadString( index, id, NPC_sendbuf ) ){
int fd;
fd = getfdFromCharaIndex( talker );
if( fd == -1 )return;
lssproto_WN_send(fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT,
buttontype,
CHAR_WINDOWTYPE_DENGON,
CHAR_getWorkInt( index, CHAR_WORKOBJINDEX),
makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));
}
break;
case WINDOW_BUTTONTYPE_OK:
if( strlen( data) == 0 ) break;
id = CHAR_getWorkInt(index, CHAR_WORKDENGONMAXID );
id++;
NPC_DengonWriteString( index, talker, id, data );
CHAR_setWorkInt(index, CHAR_WORKDENGONMAXID, id );
CHAR_setWorkInt( talker, CHAR_WORKSHOPRELEVANT, id);
if( NPC_DengonReadString( index, id, NPC_sendbuf ) ){
int fd;
fd = getfdFromCharaIndex( talker );
if( fd == -1 )return;
lssproto_WN_send(fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT,
WINDOW_BUTTONTYPE_OKCANCEL|
WINDOW_BUTTONTYPE_PREV,
CHAR_WINDOWTYPE_DENGON,
CHAR_getWorkInt( index, CHAR_WORKOBJINDEX),
makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));
}
break;
default:
break;
}
}
}
void NPC_DengonLooked( int meindex, int lookedindex )
{
int maxid;
char buf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW*2];
if( NPC_Util_CharDistance( lookedindex, meindex ) > 1) return;
maxid = CHAR_getWorkInt( meindex, CHAR_WORKDENGONMAXID );
if( NPC_DengonReadString( meindex, maxid, NPC_sendbuf ) ){
int fd;
fd = getfdFromCharaIndex( lookedindex );
if( fd == -1 )return;
lssproto_WN_send(fd, WINDOW_MESSAGETYPE_WIDEMESSAGEANDLINEINPUT,
WINDOW_BUTTONTYPE_OKCANCEL|
WINDOW_BUTTONTYPE_PREV,
CHAR_WINDOWTYPE_DENGON,
CHAR_getWorkInt( meindex, CHAR_WORKOBJINDEX),
makeEscapeString( NPC_sendbuf, buf, sizeof(buf)));
CHAR_setWorkInt( lookedindex, CHAR_WORKSHOPRELEVANT, maxid);
}
}
static BOOL NPC_DengonReadString( int meindex, int id, char *str )
{
char filename[256];
char readbuf[DENGONFILEENTRYSIZE*MESSAGEINONEWINDOW];
FILE *f;
int maxid, i, sendid, len;
char *writeptr, *readptr;
maxid = CHAR_getWorkInt( meindex, CHAR_WORKDENGONMAXID );
if( id > maxid ) id = maxid;
sendid = id - MESSAGEINONEWINDOW + 1;
if( sendid < maxid - DENGONFILELINENUM + 1 ){
sendid = maxid - DENGONFILELINENUM + 1;
}
if( sendid < 1 ) sendid = 1;
snprintf( filename,sizeof(filename), "%s%d_%d_%d",
DENGONFILEDIR, CHAR_getInt( meindex, CHAR_FLOOR ),
CHAR_getInt( meindex, CHAR_X ),
CHAR_getInt( meindex, CHAR_Y ) );
writeptr = str;
strcpy( writeptr, " 传言板\n");
len = strlen(writeptr);
writeptr += len;
f = fopen( filename, "r" );
if( !f ) return FALSE;
{
char buf[DENGONFILEENTRYSIZE];
int wptr = 0;
readbuf[0] = '\0';
for( i = 0; i < MESSAGEINONEWINDOW; i ++ ) {
fseek( f, ((sendid+i)%DENGONFILELINENUM)*DENGONFILEENTRYSIZE, SEEK_SET );
fread( buf, sizeof(char),
DENGONFILEENTRYSIZE , f );
memcpy( &readbuf[wptr], buf,sizeof( buf));
wptr += DENGONFILEENTRYSIZE;
}
}
fclose(f);
readptr = readbuf + DENGONFILECOUNTERSIZE;
for( i=0;i<MESSAGEINONEWINDOW;i++ ){
snprintf( writeptr, DENGONFILESTRINGSIZE, "%s\n", readptr );
writeptr+= strlen(readptr)+1;
readptr+=DENGONFILEENTRYSIZE;
}
return TRUE;
}
static void NPC_DengonWriteString( int meindex, int talker, int id, char *str )
{
char buf[256];
FILE *f;
int line;
struct tm tm1;
snprintf( buf,sizeof(buf), "%s%d_%d_%d",
DENGONFILEDIR, CHAR_getInt( meindex, CHAR_FLOOR ),
CHAR_getInt( meindex, CHAR_X ),
CHAR_getInt( meindex, CHAR_Y ) );
f = fopen( buf, "r+" );
if( !f ) return;
line = id%DENGONFILELINENUM;
fseek( f, line*DENGONFILEENTRYSIZE, SEEK_SET );
fprintf( f, "%010d:",id );
memcpy( &tm1, localtime( (time_t *)&NowTime.tv_sec), sizeof( tm1));
fprintf( f, "%s\n %2d/%02d %2d:%02d %s%c",
str,
tm1.tm_mon +1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min,
CHAR_getChar( talker, CHAR_NAME),
'\0');
fclose(f);
}