1、视频选项:
-exp-expansion切换到扩展模式。
-w-window切换到窗口模式。
-glide-glide使用Glide显示模式。
-opengl-opengl使用OpenGL显示模式。
-d3d-d3d使用Direct3D显示模式。
-rave-rave使用Rave显示模式,仅适用于Mac。
-per-perspective打开透视模式,仅适用于全屏非DirectDraw模式。
-lq-lowquality低图像质量(高速度)。
-gamma-gamma设置Gamma值为。
-vsync-vsync打开VSync。
-fr-framerate甚至帧速率为。
2、网络选项:
-s-serverip设置TCP/IP游戏服务器的IP为
-gametype-gametype设置游戏类型为。
-joinid-joinid设置加入游戏的ID为。
-gamename-gamename设置游戏名为。
-bn-battlenetip设置battle、net服务器IP为。
-mcpip-mcpip设置mcpip服务器IP为。
-nopk-nopk禁止PK。
-openc-openc不清楚。
3、游戏选项:
-arena-arena无效。
-difficulty-difficulty无效。
-txt-txt给MOD制作者,用于创建、bin文件。
4、角色选项:
-ama-ama设置角色类型为ama。
-pal-pal设置角色类型为pal。
-sor-sor设置角色类型为sor。
-nec-nec设置角色类型为nec。
-bar-bar设置角色类型为bar。
-dru-dru设置角色类型为dru。
-asn-asn设置角色类型为asn。
-i-invincible隐形?(好像无效)。
-bnacct-bnacct设置battle、net账号名字为。
-bnpass-bnpass设置battle、net密码为。
-name-name设置battle、net角色名字为。
-realm-realm设置battle、net服务器(Realm)名字为。
-ctemp-ctemp在arena模式使用第个角色的模板。
5、怪物选项:
-nm-nomonster无怪物?(无效)。
-m-monsterclass不清楚。
-minfo-monsterinfo显示怪物信息?(无效)。
-md-monsterdebug不清楚。
6、物品选项:
-rare-rare全稀有(Rare)物品?(无效)。
-unique-unique全独特(Unique)物品?(无效)。
扩展资料
在游戏中主要有四种属性的元素伤害:火焰(Fire),冰冷(Cold),闪电(Lightning)以及毒素(Poison)。每个角色如果想减少这些元素伤害的话,可以使用技能或装备。
魔法抗性与物理抗性没有出现在角色属性界面中,但每个角色都有。在任何难度下,这个值的基本数值都是0。不少的怪物拥有物理和魔法伤害免疫或是某种元素免疫,这样可以减少相应的伤害。
怪物可以抵抗魔法伤害的话就同样可以抵抗死灵法师的毒素和白骨系技能(骨矛/白骨之魂)以及野蛮人的狂战士技能。圣骑士的祝福之锤忽略恶魔和亡灵类型怪物的魔法抗性。但是一些其它类型的魔法抗性怪物可以抵消一部分祝福之槌的魔法伤害。
某些特殊的头目级怪物会有“幽灵一击”的特性,会随机在攻击中加入某种元素的攻击。
所有的7位角色开始时都会两种基本的技能:Attack(普攻)和Throw(投掷)。
“Attack”:攻击要求装备有攻击性的武器。
“Throw”:要求装备有可以投掷的物品。
刺客,德鲁伊和男巫开始时会有“Unsummon”来召唤那些先前被消灭掉的怪物。
ASN.1 – Abstract Syntax Notation dot one,抽象记法1,在大部分的书写场合会简写为ASN1。它描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。ASN1有很多实现版本,OpenSSL主要采用DER格式。
本文假设你已经安装好了OpenSSL,并且持有一份1.1.1的源码。
ASN1相关的头文件为asn1.h、asn1t.h、源文件在crypto/asn1目录中。
这个结构负责管理ANS1大多数数据类型的内存组织方式,字段含义:
length —— 管理的数据长度。
type —— 管理的数据类型。
data —— 数据指针。
flags —— 标志位,跟具体数据类型有关。
管理的数据类型:
主要数据类型的取值:
其它一些类型的定义:
在OpenSSL的实现中,每个数据类型都有一个ITEM结构,它负责定义这个数据类型的编解码规则。
相关字段含义如下:
itype —— 定义ITEM自身的类型,取值:
utype —— 定义管理的数据类型,取值前面有说明,例如V_ASN1_INTEGER。
templates —— 数据处理方法模板数组指针。
tcount —— 模板数组的个数。
funcs —— 回调方法指针。
size —— 负责数据结构的大小。
sname —— 指向数据结构的名称。
前面讲到,对每个数据类型来说,OpenSSL需要一个对应的ITEM结构,下面这几个宏为每个数据类型声明ITEM结构,同时也声明了相应的助记函数。如下:
拿 DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER) 来说,宏定义展开形式为:
还有几个宏负责为数据类型实现相应的助记函数。如下:
拿 IMPLEMENT_ASN1_ITEM(ASN1_INTEGER) 来说,其展开形式为:
可以看到,展开形式所实现的助记函数实际上是对ASN1内部几个函数的封装调用,对提供上层数据类型与内部类型的转换,其中ASN1_VALUE是类型上下转换的纽带,它是个万能指针:
typedef struct ASN1_VALUE_st ASN1_VALUE
在asn1.h中,对基本数据类型声明了助记函数:
可是我暂时还没有找到对基本数据类型助记函数的宏实现。
OpenSSL的ASN1编码处理依赖ASN1_ITEM对象,对基本类型来说,OpenSSL本身已经做了声明和初使化,所以可以直接以相关函数中使用。然而对于自定义结构体,需要开发者来定义ASN1_ITEM对象和规则,有一些宏可以提供帮助,摘录部分如下:
在ASN1_ITEM结构中,ASN1_TEMPLATE的结构定义如下:
主要字段含义:
offset —— 字段在父结构中的偏移。
field_name —— 字段名称。
item —— 指向字段对应结构类型的ASN1_ITEM对象。
举例定义如下的自定义结构:
将宏展开,为:
ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it)
void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it)
根据ITEM对象创建和释放对应的数据类型。
ASN1_VALUE *ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_ITEM *it)
根据ITEM对象将DER编码转换为二进制结构。
成功返回有效指针,成功返回NULL。
如果val为NULL,将内部分配内存,但必须由外部使用者释放。
其内部实现为:
可以看到内部做了为val传入NULL的兼容性处理。
int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it)
根据ITEM对象将二进制结构转换为DER编码。
成功返回DER编码长度,失败返回负数。
如果*out为NULL,将内部分配内存,但内存必须由外部使用者释放。若**out为NULL,将仅返回长度,这用于试探长度的场景。
其内部实现为:
可以看到内部做了为out和*out传入NULL的兼容性处理。在out传入NULL的情况下,无法接收缓冲区,只能返回长度。
void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x)
根据ITEM对象将DER编码转换为二进制结构,输入的DER编码来源于BIO对象。
成功返回有效指针,成功返回NULL。
事实上,本函数是对ASN1_item_d2i()的封装调用。
其内部实现为:
void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x)
ASN1_item_d2i_bio()的FILE版本。
ASN1_item_d2i_bio()和ASN1_item_d2i_fp() 这两个函数关于输出参数x的类型定义是不恰当的,后面讲的 ASN1_d2i_bio()和ASN1_d2i_bio() 有修复这个问题。
int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x)
根据ITEM对象将二进制结构转换为DER编码,输出到BIO对象中。
成功返回DER编码长度,失败返回负数。
如果*out为NULL,将内部分配内存,但内存必须由外部使用者释放。事实上,本函数是对ASN1_item_i2d()的封装调用。
其内部实现为:
int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x)
ASN1_item_i2d_bio()的FILE版本。
其实上,以上函数由于直接需要ASN1_ITEM做为参数,很少在程序中直接使用,而是由DECLARE_ASN1_FUNCTIONS宏声明的变体,或者下面介绍的函数代替。
void *ASN1_d2i_bio(void *(*xnew) (void), d2i_of_void *d2i, BIO *in, void **x)
从BIO对象读取DER编码数据,转换为对应的二进制结构,具体的转换依赖d2i函数指针。
成功返回有效指针,失改返回NULL。
其内部实现为:
void *ASN1_d2i_fp(void *(*xnew) (void), d2i_of_void *d2i, FILE *in, void **x)
ASN1_d2i_bio()的FILE版本。
int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x)
将二进制结构转换为DER编码,输出到BIO中,具体的转换依赖i2d函数指针。
成功返回1,失败返回0。
其内部实现为:
int ASN1_i2d_fp(i2d_of_void *i2d, FILE *out, void *x)
ASN1_i2d_bio() 的FILE版本。
上面d2i_of_void 和 i2d_of_void 函数的签名为:
通常为数据类型的转换助记函数。
int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
将v值设置到a中。成功返回1,失败返回0。
long ASN1_INTEGER_get(const ASN1_INTEGER *a)
获取a中存储的整数值。失败返回-1。
int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v)
将v值设置到a中。成功返回1,失败返回0。
long ASN1_ENUMERATED_get(const ASN1_ENUMERATED *a)
获取a中存储的枚举值。失败返回-1。
int ASN1_STRING_set(ASN1_STRING *str, const void *data, int len)
将data和len指向的串值设置到str中。成功返回1,失败返回0。
unsigned char *ASN1_STRING_data(ASN1_STRING *x)
获取x的字符串首指针。成功返回有效指针,失败返回NULL。
int ASN1_STRING_length(const ASN1_STRING *x)
获取x的字符串长度。
int i2a_ASN1_INTEGER(BIO *bp, const ASN1_INTEGER *a)
将ASN1_INTEGER转换为ASC码,输出到bp中。成功返回1,失败返回0。
int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size)
将bp中的ASC码转换为ASN1_INTEGER,buf存放BIO的ASC码。成功返回1,失败返回0。
int i2a_ASN1_ENUMERATED(BIO *bp, const ASN1_ENUMERATED *a)
将ASN1_ENUMERATED转换为ASC码,输出到bp中。成功返回1,失败返回0。
int a2i_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *bs, char *buf, int size)
将bp中的ASC码转换为ASN1_ENUMERATED,buf存放BIO的ASC码。成功返回1,失败返回0。
int i2a_ASN1_STRING(BIO *bp, const ASN1_STRING *a, int type)
将a中的字符串转换为ASC码输出到bp中,type不起作用。返回转换的ASC字符串长度。
int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size)
将bp中的ASC码转换为ASN1_STRING,buf存放BIO的ASC码。成功返回1,失败返回0。
ASN1_OBJECT *ASN1_OBJECT_new(void)
分配OID对象。
void ASN1_OBJECT_free(ASN1_OBJECT *a)
释放OID对象。
OID的编码规为:第一个八位组采用公式:first_arc* 40+second_arc。如果一个数大于127,就采用多个8位表示,最高位用1表示后续还有octet,用0表示后续没有。成功返回OID编码的字节数。
int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num)
计算由ASC字符串指定的OID的DER编码。返回编码的字节数。所果事先需要知道编码的长度来分配内存,可以设置out为NULL,olen为0,获取编码字节长度,根据该长度再去分配内存。
ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp, long length)
将DER编码转换为OID对象。成功返回有效指针。
int i2d_ASN1_OBJECT(const ASN1_OBJECT *a, unsigned char **pp)
将OID对象换转为DER编码。返回DER编码的长度。
int i2a_ASN1_OBJECT(BIO *bp, const ASN1_OBJECT *a)
将DER编码转换为ASC字符串,结果输出到bp中。返回ASC字符串长度。
下面这个例子测试了很多函数的用法,请自行放开注释并测试。
《暗黑破坏神2》是美国暴雪继《暗黑破坏神》之后,玩家创建属于自己的角色,在游戏中成长,最终成为各自种族里的Master。
与前代作品相同,游戏共有普通、噩梦、地狱三个难度。普通难度是游戏的默认难度。只有完成了这个难度的游戏后才能够进入到更高难度的游戏中去。
不同的游戏难度,玩家拥有不同的抗性下限,普通难度为0,噩梦难度为-40,地狱难度为-100。失去经验值的比例是根据角色到下一级别所要求的经验值来定的,噩梦是5%,而地狱是10%。
*** 作系统:
Run:单击击左键,按住不放,就会奔跑。奔跑是二代人物新增添的一种动作,这种跑和地狱火中人物的“Fast Walk”完全不同,它是以消耗耐力值为代价的,而且其作用不言而喻,无论是快速进入战场,还是逃离都是必不可少的。另外,某些靴子能够增加奔跑的速度。
Search:这也是二代中的新增功能,有了二代,一切都那么简单了。只要一直按着Alt键,地面上所有的物品都会显现出来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)