creatskill.c

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

C
216
字号
//createskill.c
/////////////////////////
//write by maxim@nju_fengxue
//mail address is to see: maxim jiang of bbs.nju.edu.cn
// 1997.12.21
////////////////////////

#include <ansi.h>

inherit F_CLEAN_UP;

#define SHUANGYIN_HAO "\""
#define HEADER_END 16
#define SPE_PRA_LINES 34

// static string *valid_types = ({
 string *valid_types = ({
	"unarmed",
	"sword",
	"blade",
//	"stick",
	"staff",
	"club",
//	"throwing",
//	"force",
//	"parry",
//	"dodge",
//	"magic",
//	"spells",
	"hammer",
//	"move",
//	"array",
	"whip",
//      shaolin skills
        "finger",
        "hand",
        "cuff",
        "claw",
        "strike",
//      "club":     "棍法",

//added by maxim
//	"music",
//	"piano",
//	"rube",
//	"drum",

//add by cooler
//        "base-ansha",
//        "xiadu",

//add by xxs
//        "spear",
//        "bow",
//        "arrow",
});

string *banned_name=({
          "  ",});

//static string *spe_skill_lvl=({
 string *spe_skill_lvl=({
            "0","12","20","30","40","50","60","80","100",});
//static string *spe_skill_force=({
 string *spe_skill_force=({
                "50","80","100","130","150","180","200","220",
                   });
//static string *spe_skill_unarmeddodge=({
string *spe_skill_unarmeddodge=({
             "10","-10","-20","-30","-50","-60","-80","-90","-100",
                   });
//static string *spe_skill_unarmedparry=({
 string *spe_skill_unarmedparry=({
            "10","-10","-20","-30","-40","-50","-60","-70","-80",
                   });
//static string *spe_skill_weapondodge=({
 string *spe_skill_weapondodge=({
             "20","10","10","5","-5","-5","-10","-10","-10",
                   });
//static string *spe_skill_weaponparry=({
 string *spe_skill_weaponparry=({
            "20","20","10","10","5","5","5","5","5",
                   });

//static mapping spe_skill = ([
 mapping spe_skill = ([
   "action" : ({" "}),
     "force" : ({"10"}),
    "dodge" : ({"10"}),
    "parry": ({"10"}),
    "damage_type" : ({"瘀伤"}),
    "lvl" : ({"10"}),
    "skill_name" : ({"横空出世"}),
    "skill_total_num" : ({"0"}),
    "skill_en_name" : ({" "}),
    "skill_ch_name" : ({" "}),
   ]);
//static int spe_skillnum;;
 int spe_skillnum;
//it store the true name of replaced
//static string spe_skill_name;
 string spe_skill_name;
//it store the basic skill name
//static string spe_skill_basename;
 string spe_skill_basename;

int check_legal_id(string id);
int check_legal_name(string name);
int check_action_name(string yn);
int check_legal_basename(string name);
void skill_init_header(string skill_en_name,string skill_ch_name);
void get_zhaoshi_ch_name(string yn, object ob);
void get_zhaoshi_ch_action(string yn, object ob);
int check_skillnum_exist(object me,string skill_en_name,int skill_num);
void finish_write_skill(object ob);
int check_owner_skill(object me,string skill_en_name);
string get_header_skillchname(string file);
string get_header_skillbasename(string file);

int main(object me, string arg)
{
//1. exp limit,so skill lvl is according to the exp,if exp low,lvl is low
//2. first create the unarmed as a test,and the same will be sword,blade
//etc....
//3. arg is the skillname player want to create
//all create skill will be write as a log file
//so wizard can know what is the player's skill
//指令格式:createskill foliage_unarmed 招式数
//1)check if the exp is enough to the 招式数
//2)check if the 招式 have been enough
//3)ask player to input the skill_spe_name
//4)ask player to input the action
//so let's do it!

int skill_num,skill_num_result;
string skill_en_name,skill_ch_name;
string skill_base_name;

spe_skill_basename="";
spe_skill_name="";
spe_skillnum=0;

if(!arg)
    return notify_fail("指令格式:creatskill 武功基本技能 武功英文名字 武功中文名字 第几招\n");
if( sscanf(arg, "%s %s %s %d", skill_base_name,skill_en_name,skill_ch_name,skill_num)!=4)
    return notify_fail("指令格式:creatskill 武功基本技能 武功英文名字 武功中文名字 第几招\n");

//if (!wizardp(me) )
//    return notify_fail("此系统暂不开放,测试中!\n");
//write("to see the skillnum is:"+skill_num+"\n");

skill_en_name=lower_case(skill_en_name);

spe_skill_basename=skill_base_name;

if(check_legal_basename(skill_base_name)==0)
    return notify_fail("你输入的基本技能不存在。\n");

if(check_legal_id(skill_en_name)==0)
               return 1;             

spe_skill["skill_en_name"]=skill_en_name+"-"+skill_base_name+".c";
spe_skill_name=skill_en_name+"-"+skill_base_name;

//write(spe_skill_name+"\n");
//write(spe_skill_basename+"\n");
//write(spe_skill["skill_en_name"]+"\n");

if(check_legal_name(skill_ch_name)==0)
               return 1;             

spe_skill["skill_ch_name"]=skill_ch_name;

//write(spe_skill["skill_ch_name"]+"\n");

//so player can change the Chinese skill name when he begin to create
//only 1 招
if( skill_num!=1 
    && get_header_skillchname(spe_skill["skill_en_name"])!=skill_ch_name)
    return notify_fail("你输入的中文武功名称和所选的英文武功代号有矛盾。\n");

if( skill_num!=1 
    && get_header_skillbasename(spe_skill["skill_en_name"])!=skill_base_name)
    return notify_fail("你输入的基本技能名和所选的英文武功代号有矛盾。\n");


//here is important
if((int)me->query("skillmaxim")!=0
        && sizeof(keys(me->query("skillmaxim/"))) >3 )
    return notify_fail("你最多只能创建三种高级功夫。\n");


switch( check_owner_skill(me,spe_skill["skill_en_name"])){
        case 2:
    return notify_fail("这个功夫在江湖中已经存在,你无法再有创新。\n");
       break;
        case 0: //this is right
         break;
        case 1:
    return notify_fail("你目前只能针对这个基本技能创建一个功夫。\n");
        default:
        return notify_fail("请和巫师联系,所创功夫不对。\n");
    }

if(skill_num < 1)
       return notify_fail("你需要从第一招开始创建。\n");

if((int)me->query("combat_exp") < 2000000)
       return notify_fail("你的经验值还不够。\n");

if((int)me->query("combat_exp") < (skill_num-1)*150000+1000000)
       return notify_fail("你的经验值还不够。\n");

if((int)me->query_skill(spe_skill_name)!=0
     && (int)me->query_skill(spe_skill_name) < (skill_num-1)*8)
       return notify_fail("你已经有的招式还不够熟练,现提高它们,然后在想新招吧。

⌨️ 快捷键说明

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