fboard.c

来自「C实现的MUD,对大家基本入门网络游戏很有帮助!」· C语言 代码 · 共 176 行

C
176
字号
// fboard.c 档案板#include <ansi.h>#define BOARD_CAPACITY query("capacity")inherit ITEM;inherit F_SAVE;void setup(){	string loc;	if( stringp(loc = query("location")) )		move(loc);	set("no_get", 1);	restore();}void init(){//	add_action("do_post", "post");	add_action("do_list", "list");	add_action("do_read", "read");//	add_action("do_discard", "discard");}string query_save_file(){	string id;	if( !stringp(id = query("board_id")) ) return 0;	return DATA_DIR + "board/" + id;}string short(){	mapping *notes;	int i, unread, last_read_time;	notes = query("notes");	if( !pointerp(notes) || !sizeof(notes) )		return ::short() + " [ 没有任何留言 ]";	if( this_player() ) {		last_read_time = (int)this_player()->query("board_last_read/" + (string)query("board_id"));		for(unread = 0, i=sizeof(notes)-1; i>=0; i--, unread ++)			if( notes[i]["time"] <= last_read_time ) break;	}	if( unread )		return sprintf("%s [ %d 张留言,%d 张未读 ]", ::short(), sizeof(notes), unread);	else		return sprintf("%s [ %d 张留言 ]", ::short(), sizeof(notes));}string long(){	mapping *notes;	int i, last_time_read;	string msg, myid;	notes = query("notes");	msg = query("long");	msg = msg + "留言版的使用方法请见 help board。\n";	if( !pointerp(notes) || !sizeof(notes) ) return query("long");	last_time_read = this_player()->query("board_last_read/" + (string)query("board_id"));	for(i=0; i<sizeof(notes); i++)		msg += sprintf("%s[%2d]" NOR "  %-40s %12s (%s)\n",			( notes[i]["time"] > last_time_read ? HIY: ""),			i+1, notes[i]["title"], notes[i]["author"], ctime(notes[i]["time"])[0..15] );	return msg;}// This is the callback function to process the string returned from the// editor defined in F_EDIT of player object.void done_post(object me, mapping note, string text){	mapping *notes;	note["msg"] = text;	notes = query("notes");	if( !pointerp(notes) || !sizeof(notes) )		notes = ({ note });	else		notes += ({ note });	// Truncate the notes if maximum capacity exceeded.	if( sizeof(notes) > BOARD_CAPACITY )		notes = notes[BOARD_CAPACITY / 2 .. BOARD_CAPACITY];	set("notes", notes);	tell_object(me, "留言完毕。\n");	save();	return;}int do_post(string arg){	mapping note;	if(!arg) return notify_fail("留言请指定一个标题。\n");		note = allocate_mapping(4);	note["title"] = arg;	note["author"] = this_player()->query("name");	note["time"] = time();	this_player()->edit( (: done_post, this_player(), note :) );	return 1;}int do_read(string arg){	int num;	mapping *notes, last_read_time;	string myid;	last_read_time = this_player()->query("board_last_read");	myid = query("board_id");	notes = query("notes");	if( !pointerp(notes) || !sizeof(notes) )		return notify_fail("留言板上目前没有任何留言。\n");	if( !arg ) return notify_fail("指令格式:read <留言编号>|new|next\n");	if( arg=="new" || arg=="next" ) {		if( !mapp(last_read_time) || undefinedp(last_read_time[myid]) )			num = 1;		else			for(num = 1; num<=sizeof(notes); num++)				if( notes[num-1]["time"] > last_read_time[myid] ) break;				} else if( !sscanf(arg, "%d", num) )		return notify_fail("你要读第几张留言?\n");	if( num < 1 || num > sizeof(notes) )		return notify_fail("没有这张留言。\n");	num--;	this_player()->start_more( sprintf("[%d] %-40s %s(%s)\n----------------------------------------------------------------------\n",		num + 1, notes[num]["title"], notes[num]["author"], ctime(notes[num]["time"])[0..9])		+ notes[num]["msg"] );	// Keep track which post we were reading last time.	if( !mapp(last_read_time) )		this_player()->set("board_last_read", ([ myid: notes[num]["time"] ]) );	else 		if( undefinedp(last_read_time[myid]) || notes[num]["time"] > last_read_time[myid] )			last_read_time[myid] = notes[num]["time"];	return 1;}int do_discard(string arg){	mapping *notes;	int num;	if( !arg || sscanf(arg, "%d", num)!=1 )		return notify_fail("指令格式:discard <留言编号>\n");	notes = query("notes");	if( !arrayp(notes) || num < 1 || num > sizeof(notes) )		return notify_fail("没有这张留言。\n");	num--;	if( notes[num]["author"] != (string) this_player(1)->query("name")	&&	(string)SECURITY_D->get_status(this_player(1)) != "(admin)" )		return notify_fail("这个留言不是你写的。\n");	notes = notes[0..num-1] + notes[num+1..sizeof(notes)-1];	set("notes", notes);	save();	write("删除第 " + (num+1) + " 号留言....Ok。\n");	return 1;}

⌨️ 快捷键说明

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