clubpoem.c

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

C
412
字号
// Room: /u/mon/poem/clubpoem by mon@xyj 7/25/97inherit ROOM;#include <ansi.h>;int POEMS=319;string author,title,*poem;string author1,title1,*poem1;int length,length1,running;string current,current_all,last,last_all;string curr_show;int index,chance;int poem_index,answerd,ans_curr,ans_last;void new_poem();void copy_to_old();void do_test();void do_init(object me);void poem_reward(object me,string arg);void poem_reward1(object me);void poem_penalty(object me);int find_newline();string mixup(string str);string enscript(string arg);void create (){  set ("short", "乐府诗社");  set ("long", @LONG高楼之上,满城繁华尽收眼底。文人骚客都喜欢在这里品茶吟诗,谈古论今,你瞧,不知谁在茶桌上刚刚写好一首诗(poem)。里边柜台上新贴了张启事(qishi),你不由得走过去看了几眼。LONG);    set("exits",  ([  /*  sizeof()  ==  1  */        "down"  :  __DIR__"clubup",        "west"  :  __DIR__"shaizi-room",        "east"  :  __DIR__"puke-room",        "up":  __DIR__"club3",    ]));  set("objects", ([    __DIR__"npc/teawaiter": 1,    __DIR__"npc/suanxiucai": 1,    //__DIR__"npc/gongsun": 1,//    "/d/obj/misc/tables" : 1,  ]));set("no_exert",1);  setup();  remove_call_out("do_test");  poem_index=1;  running=0;}void init(){        add_action("do_answer","answer");     add_action("do_look","look");          call_out("do_init",1,this_player());     if(running==0) {       running=1;       new_poem();       copy_to_old();       new_poem();       call_out("do_test",2);     }}void do_init(object me){     return;}int do_answer(string arg){     object me=this_player(),ob;    if(!arg) return notify_fail("回答什么?\n");        if(me->is_busy())      return notify_fail("你上一个动作还没有完成。\n");    if(me->query_temp("poemok")>50)      return notify_fail("你休息一下,让别人来回答吧!\n");    if(me->query("jing")<me->query("max_jing")/20 )      return notify_fail("你的精不够了。\n");    if(me->query("eff_jing")<me->query("max_jing")/20 )      return notify_fail("你的精不够了。\n");    if( living(me) ) me->receive_damage("jing",5+random(15));    if(objectp(ob=present("cha boshi",this_object()))       && living(ob)) {    switch(random(2)) {     case 0: message_vision("$N说道:是..."+arg+"?\n",me);             break;     case 1: message_vision("$N答道:"+arg+"?\n",me);             break;    }    arg=replace_string(arg," ","");    arg=replace_string(arg,",","");    arg=replace_string(arg,",","");    if(arg==current&&strlen(current)>2) {      if(ans_curr==1) {       write("别人已经回答过这句诗了。\n");       return 1;      }      ans_curr=1;            //change to a new poem once this one is answered.      index=length-1;      me->set_temp("poem/index",poem_index);      poem_reward(me,current_all);    } else if(arg==last&&strlen(last)>2) {      if(ans_last==1) {       write("别人已经回答过这句诗了。\n");       return 1;      }      ans_last=1;      poem_reward(me,last_all);    } else {      message_vision("茶博士摇了摇头:好象不对吧?\n",me);      me->add_temp("poem/wrong",1);      if(me->query_temp("poem/wrong")>10) poem_penalty(me);    }    } else {      write("现在没有人裁判对错了... :(\n");    }    return 1;}void poem_penalty(object me){    me->set("jing",-1);    me->set_temp("poem/wrong",0);    return;}void poem_reward(object me,string arg){    me->set_temp("poem/wrong",0);    message_vision("茶博士点头道:“"+arg+"”不错!不错!\n",me);    me->add_temp("poemok",1);    poem_reward1(me);}void poem_reward1(object me){  	int dx,pot,lite;    switch(random(3)) {     case 0: dx=10+random(80);if (me->query("combat_exp")<1000000){             me->add("combat_exp",dx);}else {             me->add("combat_exp",dx/3);}             me->add("jing",-me->query("eff_jing")/20);             me->add("eff_jing",-me->query("max_jing")/20);	     write("你的经验增加了!\n");	     break;     case 1: pot=8+random(52);if (me->query("combat_exp")<1000000){             me->add("potential",pot);}else {             me->add("potential",pot/3);}             me->add("jing",-me->query("eff_jing")/20);             me->add("eff_jing",-me->query("max_jing")/20);             write("你的潜能增加了!\n");	     break;     case 2: lite=8+random(33);if (me->query("combat_exp")<1000000){             me->improve_skill("literate",lite);}else {             me->improve_skill("literate",lite/3);}             me->add("jing",-me->query("eff_jing")/20);             me->add("eff_jing",-me->query("max_jing")/20);	     write("你的读书识字进步了!\n");	     break;    }    me->add("poem_answered",1);    dx=me->query("poem_answered");}void do_test(){     int newt;   object ob;   string first,second,quest;   if(objectp(ob=present("cha boshi",this_object()))          && living(ob)) {   if(strlen(current)>2&&ans_curr==0) {     last=current;     last_all=current_all;     ans_last=0;   }      newt=0;   while(newt==0) {    if(!find_newline()) {     copy_to_old();     new_poem();    } else {      if(sscanf(poem[index],"%s  %s",first,second)==2 &&       !sscanf(poem[index],"%*s[") &&        !sscanf(poem[index],"%*s(") &&       !sscanf(poem[index],"%*s□") ) {         if(strlen(first)>2&&strlen(second)>2) {	   newt=1;         }       }    }   }   first=replace_string(first," ","");   second=replace_string(second," ","");   current_all=first+"  "+second;   ans_curr=0;   if(strlen(first)>=14 && random(3)==0) {     quest=first;   } else if (strlen(second)>=14 && random(2)==0) {     quest=second;   } else {     quest=first+second;   }     current=replace_string(quest,",","");  // the answer     quest=mixup(quest);   // the question     curr_show=quest;     switch(random(1)) {       case 0:          tell_room(this_object(),	   enscript("茶博士提笔在墙上写道:"+quest)+"\n");         break;     }   }   if(sizeof(filter_array(all_inventory(this_object()), (:userp:))))     call_out("do_test",60);   else       running=0;   return;}string mixup(string str){   int len=strlen(str)/2,i,j,k,l;   string ans;   for(i=1;i<=random(2)+1;i++) {     j=random(len);     k=random(len);     if(j==k) {       k++;       if(k>=len) k=0;     }     if(j>k) {       l=k; k=j; j=l;     } // so j<k     j=j+j; k=k+k;     if(j>0) ans=str[0..j-1];      else ans="";     ans+=str[k..k+1]+str[j+2..k-1]+str[j..j+1];     if(k<len+len-2) ans+=str[k+2..len+len-1];     str=ans;   }   return str;}int do_look(string arg){   int i;    if(!arg) return 0;     if(arg=="poem") {     write("\n\n    "+author1+":"+title1+"\n");     for (i=0;i<length1;i++) {      write("    "+poem1[i]+"\n");     }     write("\n\n\n");    write("当前题目:   "+curr_show+"\n\n");//     write("当前题目:   "+curr_show)+"\n\n");     return 1;    } else if(arg=="qishi") {      write("\n"+@LONG           本社新增猜诗游戏,由茶博士将一句诗词的若干字       颠倒次序,写在墙上。能准确答出(answer)原句者为胜。       例如:茶博士提笔在墙上写道:离离原上草一荣一枯岁       你应该回答:answer 离离原上草一岁一枯荣LONG);      write("\n\n");     return 1;    } else return 0;}void copy_to_old(){    int i;     object ob;     author1=author;     title1=title;     length1=length;     poem1=({});     last="";     for (i=0;i<length;i++)       poem1+=({poem[i]});     if(objectp(ob=present("suan xiucai",this_object()))       && random(2)==0 && living(ob)) {       message_vision(({ob->name()+"摇头晃脑地吟诵道:",        ob->name()+"高声朗读道:",        ob->name()+"仿佛在自言自语:"})[random(3)]+"\n",ob);       message_vision("\n    "+author1+":"+title1+"\n",ob);       for (i=0;i<length1;i++) {         message_vision("    "+poem1[i]+"\n",ob);       }       message_vision("\n\n",ob);     }     return;}void new_poem(){   string filename,buf;    int i,j,k;    length=0;    while (length==0) {    while((k=(1+random(POEMS)))==poem_index);    filename="/d/city4/poem/poem"+k;    buf=read_file(filename,1,1);    sscanf(buf,"%s:%s",author,title);    i=0;    j=0;    poem=({});    while(buf=read_file(filename,2+i,1)) {      if(strlen(buf)>2) {        buf=replace_string(buf,"\n","");        poem+=({buf});	j++;      }      i++;    }    length=j;    }    poem_index=k;    answerd=0;    index=-1;    chance=3*100/(1+length);    if(length<3) {      chance=100;    }    return;}int find_newline(){   index++;   while(index<length) {     if(random(100)<chance) {       return 1;     } else index++;   }   return 0;}string enscript(string arg){    string result;     string *color=({BLK,RED,GRN,YEL,BLU,MAG,CYN,WHT,                     HIR,HIG,HIY,HIB,HBRED,HBGRN,HBYEL,		     HBBLU,HBMAG,BBLK,BRED,BGRN});     int len,i;     len=sizeof(color);     result="";     i=sizeof(arg);     while(i>2) {       if(random(2)==0) {         result=color[random(len)]+NOR+arg[i-2..i-1]+result;       } else {         result=arg[i-2..i-1]+result;       }       i-=2;     }     result=NOR+arg[0..1]+result;     return result;}

⌨️ 快捷键说明

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