⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npc_dengon.c

📁 石器时代2.0完整版源代码.已经加入新功能. 在REDHAT9下GCC3.4编译成功.
💻 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 7char 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);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -