存档

文章标签 ‘乱七八糟’

实用的 SSH 通道例子

2008年9月22日 16hot 没有评论

在freebsd手册里看到的一个例子,摘录出来,以便以后查找使用。

14.11.8.1.1 加强 POP3 服务的安全

  工作时, 有一个允许外来连接的 SSH 服务器。 同一个办公网络中有一个邮件服务器提供 POP3 服务。 这个网络, 或从您家到办公室的网络可能不, 或不完全可信。 基于这样的原因, 您需要以安全的方式来查看邮件。 解决方法是创建一个到办公室 SSH 服务器的连接, 并通过这个连接来访问 POP3 服务:

% ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.comuser@ssh-server.example.com's password: ******

  当这个通道连上时, 您可以把 POP3 请求发到 localhost 端口 2110。 这个连接将通过通道安全地转发到 mail.example.com

14.11.8.1.2 绕过严厉的防火墙

  一些大脑长包的网络管理员会使用一些极端的防火墙策略, 不仅过滤进入的连接, 而且也过滤连出的连接。 一些时候您可能只能连接远程机器 22 端口,以及 80 端口用来进行 SSH 和网页浏览。

  您可能希望访问一些其它的 (也许与工作无关的) 服务, 例如提供音乐的 Ogg Vorbis 流媒体服务器。 如果 Ogg Vorbis server 在 22 或 80 端口以外的端口播放音乐, 则您将无法访问它。

  解决方法是建立一个到您的网络的防火墙之外的网络上的 SSH 服务器, 并通过它提供的通道连接到 Ogg Vorbis 服务器上。

% ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.orguser@unfirewalled-system.example.org's password: *******

  现在您可以把客户程序指定到 localhost 的 8888 端口, 它将把请求转发给 music.example.com 的 8000 端口, 从而绕过防火墙。

分类: 乱七八糟 标签:

使用diff, patch和quilt制作补丁(2)

2008年9月18日 16hot 没有评论

2 quilt

我们自己的项目可以用cvs或svn管理全部代码。但有时我们要使用其他开发者维护的项目。我们需要修改一些文件, 但又不能直接向版本管理工具提交代码。自己用版本管理工具重建整个项目是不合适的,因为大多数代码都是别人维护的,例如Linux内核。我们只是想管理好 自己的补丁。这时可以使用quilt。

2.1 基本概念

quilt是一个帮助我们管理补丁的程序。quilt的命令格式类似于cvs:

quilt 子命令 [参数]

0.46版的quilt有29个子命令。

掌握quilt的关键是了解使用quilt的流程。使用quilt时,我们会在一个完整的源代码树里工作。只要我们 在源代码树里使用了quilt命令,quilt就会在源代码树的根目录建立两个特殊目录:patches和.pc。quilt在patches目录保存它 管理的所有补丁。quilt用.pc目录保存自己的内部工作状态,用户不需要了解这个目录。

patches/series文件记录了quilt当前管理的补丁。补丁按照加入的顺序排列,早加入的补丁在前。quilt用堆栈的概念管理补丁的应用。

我们在应用补丁A前,必须先应用所有早于补丁A的补丁。所以,patches/series中的补丁总是从上向下应 用。例如:上图中,补丁1到补丁5是已经应用的补丁。我们可以将已应用的补丁想象成一个向下生长的堆栈,栈顶就是已应用的最新补丁。应用补丁就是将补丁入 栈,撤销补丁就是将补丁出栈。

我们在源代码树中作任何修改前,必须用"quilt add"命令将要修改的文件与一个补丁联系起来。在完成修改后,用"quilt refresh"命令将修改保存到已联系的补丁。下面我们通过一篇流程攻略来认识一下quilt的命令。

2.2 导入补丁

我们把 old-prj.tar.bz2 想象成Linux内核,我们把它解压后,进入代码树的根目录:

$ mkdir qtest; cd qtest; tar xvjf ../old-prj.tar.bz2; mv old-prj prj; cd prj

在修改代码前,我们通常要先打上官方补丁。在quilt中,可以用import命令导入补丁:

$ quilt import ../../prj.diff

Importing patch ../../prj.diff (stored as prj.diff)

执行improt命令后, prj 目录会多出一个叫 patches 的子目录:

$ find patches/ -type f

patches/prj.diff

patches/series

quilt在这个目录存放所有补丁和前面介绍的series文件。quilt的大多数命令都可以在代码树的任意子目录运行,不一定要从根目录运行。我们可以用applied命令查询当前已应用的补丁。

$ quilt applied

No patches applied

目前还没有应用任何补丁。unapplied命令查询当前还没有应用的补丁,top命令查询栈顶补丁,即已应用的最新补丁:

$ quilt unapplied

prj.diff

$ quilt top

No patches applied

我们可以使用push命令应用补丁,例如:

$ quilt push -a

Applying patch prj.diff

patching file src/drv/drv1.h

patching file src/sys/sys1.c

patching file src/sys/sys1.h

patching file src/usr/usr1.c

patching file src/usr/usr1.h

Now at patch prj.diff

push的"-a"参数表示应用所有补丁。在使用push命令后,prj 目录会多了一个叫.pc的隐含子目录。quilt用这个目录保存内部状态,用户不需要了解这个目录。应用补丁后,我们再使用applied、unapplied和top命令查看:

$ quilt applied

prj.diff

$ quilt unapplied

File series fully applied, ends at patch prj.diff

$ quilt top

prj.diff

2.3 修改文件

我们必须将对源代码树所作的任何改动都和一个补丁联系起来。add命令将文件的当前状态与补丁联系起来。add命令的格式为:

quilt add [-P 补丁名] 文件名

如果未指定补丁名,文件就与栈顶补丁联系起来。目前,我们的栈顶补丁是官方补丁。我们不想修改这个补丁,可以用new命令新建一个补丁:

$ quilt new drv_p1.diff

Patch drv_p1.diff is now on top

$ quilt top

drv_p1.diff

$ quilt applied

prj.diff

drv_p1.diff

$ quilt unapplied

File series fully applied, ends at patch drv_p1.diff

然后用add命令向栈顶补丁添加一个准备修改的文件:

$ cd src/drv; quilt add drv2.h

File src/drv/drv2.h added to patch drv_p1.diff

add命令为指定补丁保存了指定文件的当前快照,当我们执行refresh命令时,quilt就会检查文件 的变化,将差异保存到指定补丁中。使用"quilt diff -z [-P 补丁名] [文件名]"可以查看指定补丁指定文件的当前改动。省略-P参数表示查看当前补丁的改动,省略文件名表示查看所有改动。我们修改drv2.h后,执行 diff命令:

$ quilt diff -z

Index: prj/src/drv/drv2.h

===================================================================

— prj.orig/src/drv/drv2.h 2008-03-02 13:37:34.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 13:38:53.000000000 +0800

@@ -1,7 +1,7 @@

-#ifndef APP1_H

-#define APP1_H

+#ifndef DRV2_H

+#define DRV2_H

 

-#include "def1.h"+#include "def2.h" #endif

 

只要文件已经与我们希望保存改动的补丁联系过了,我们就可以多次修改文件。使用"quilt files [补丁名]"命令可以查看与指定补丁关联的文件。使用"quilt files -val"可以查看所有补丁联系的所有文件。"-v"参数表示更友好的显示,"-a"参数表示显示所有补丁,"-l"参数显示补丁名。例如:

$ quilt files

src/drv/drv2.h

$ quilt files -val

[prj.diff] src/drv/drv1.h

[prj.diff] src/sys/sys1.c

[prj.diff] src/sys/sys1.h

[prj.diff] src/usr/usr1.c

[prj.diff] src/usr/usr1.h

[drv_p1.diff] src/drv/drv2.h

"quilt refresh [补丁名]"刷新补丁,即将指定补丁的文件变化保存到补丁。省略文件名表示刷新栈顶补丁。我们refresh后,查看补丁文件:

$ quilt refresh

Refreshed patch drv_p1.diff

$ cat ../../patches/drv_p1.diff

Index: prj/src/drv/drv2.h

===================================================================

— prj.orig/src/drv/drv2.h 2008-03-02 12:42:21.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 12:46:25.000000000 +0800

@@ -1,7 +1,7 @@

-#ifndef APP1_H

-#define APP1_H

+#ifndef DRV2_H

+#define DRV2_H

 

-#include "def1.h"

+#include "def2.h"

 

#endif

 

"quilt diff -z"命令不会显示已经保存的差异。"quilt diff"显示所有的差异,不管是否保存过。

2.4 再做几个补丁

在增加文件前,我们要先将准备增加的文件与补丁联系起来。我们新建一个补丁,然后新增两个文件src/applet/applet1.h和src/applet/applet1.c。

$ cd ..; quilt new more_p1.diff

Patch more_p1.diff is now on top

$ quilt add applet/applet.c

File src/applet/applet.c added to patch more_p1.diff

$ quilt add applet/applet.1

File src/applet/applet.1 added to patch more_p1.diff

 

看看我们增加的文件:

$ quilt files

src/applet/applet.1

src/applet/applet.c

 

哎呀,文件名写错了。我们可以用"remove"命令从补丁中删除关联文件:

$ quilt remove applet/applet.1

rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.1'? y

File src/applet/applet.1 removed from patch more_p1.diff

$ quilt remove applet/applet.c

rm: remove write-protected regular empty file `.pc/more_p1.diff/src/applet/applet.c'? y

File src/applet/applet.c removed from patch more_p1.diff

$ quilt files

$ quilt add applet/applet1.h

File src/applet/applet1.h added to patch more_p1.diff

$ quilt add applet/applet1.c

File src/applet/applet1.c added to patch more_p1.diff

$ quilt files

src/applet/applet1.c

src/applet/applet1.h

 

好了,现在可以创建新文件:

$ mkdir applet

$ echo -e "#ifndef APPLET1_Hn#define APPLET1_Hn#include "def1.h"n#endif">applet/applet1.h

$ echo -e "#include "applet1.h"">applet/applet1.c

$ quilt refresh more_p1.diff

Refreshed patch more_p1.diff

 

刷新补丁后,我们再修改文件drv2.h。修改前一定要先将文件与准备保存改动的补丁联系起来:

$ quilt add drv/drv2.h

File src/drv/drv2.h added to patch more_p1.diff

$ vi drv/drv2.h

$ quilt diff -z drv/drv2.h

Index: prj/src/drv/drv2.h

===================================================================

— prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800

@@ -1,7 +1,7 @@

#ifndef DRV2_H

#define DRV2_H

 

-#include "def2.h"

+#include "def1.h"

 

#endif

 

我们再新建一个补丁,然后删除两个文件。删除文件前也要先为文件建立关联:

$ quilt new more_p2.diff

Patch more_p2.diff is now on top

$ quilt add app/*

File src/app/app1.c added to patch more_p2.diff

File src/app/app1.h added to patch more_p2.diff

File src/app/app2.c added to patch more_p2.diff

File src/app/app2.h added to patch more_p2.diff

$ rm -rf app

$ quilt refresh

Refreshed patch more_p2.diff

 

我们再修改applet/applet1.h:

$ quilt edit applet/applet1.h

File src/applet/applet1.h added to patch more_p2.diff

$ quilt refresh

Refreshed patch more_p2.diff

 

"quilt edit"在调用"quilt add"后自动启动编辑器。用refresh命令刷新补丁。

对了,前面为more_p1.diff修改drv2.h后还没有刷新呢。我们查看修改并刷新:

$ quilt diff -z -P more_p1.diff

Index: prj/src/drv/drv2.h

===================================================================

— prj.orig/src/drv/drv2.h 2008-03-02 14:19:35.000000000 +0800

+++ prj/src/drv/drv2.h 2008-03-02 14:31:28.000000000 +0800

@@ -1,7 +1,7 @@

#ifndef DRV2_H

#define DRV2_H

 

-#include "def2.h"

+#include "def1.h"

 

#endif

 

Warning: more recent patches modify files in patch more_p1.diff

$ quilt refresh more_p1.diff

More recent patches modify files in patch more_p1.diff. Enforce refresh with -f.

$ quilt refresh -f more_p1.diff

Refreshed patch more_p1.diff

quilt会抱怨更新的补丁修改了补丁more_p1.diff的文件。这是在说more_p2.diff修改了applet1.h。我们知道这和我们要刷新的drv2.h没关系,所以可以用-f参数强制刷新。

2.5 管理补丁

series命令可以查看series文件中的补丁:

$ quilt series

prj.diff

drv_p1.diff

more_p1.diff

more_p2.diff

"quilt patches 文件名"显示修改了指定文件的所有补丁,例如:

$ quilt patches drv/drv2.h

drv_p1.diff

more_p1.diff

"quilt annotate 文件名"显示指定文件的修改情况,它会指出哪个补丁修改了哪一行。例如:

$ quilt annotate drv/drv2.h

1 #ifndef DRV2_H

1 #define DRV2_H

 

2 #include "def1.h"

#endif

1 drv_p1.diff

2 more_p1.diff

我们可以使用push和pop命令应用补丁或撤销补丁,例如:

$ quilt pop -a

Removing patch more_p2.diff

Restoring src/app/app1.c

Restoring src/app/app2.c

Restoring src/app/app2.h

Restoring src/app/app1.h

Restoring src/applet/applet1.h

 

Removing patch more_p1.diff

Restoring src/drv/drv2.h

Removing src/applet/applet1.h

Removing src/applet/applet1.c

 

Removing patch drv_p1.diff

Restoring src/drv/drv2.h

 

Removing patch prj.diff

Restoring src/sys/sys1.c

Restoring src/sys/sys1.h

Restoring src/drv/drv1.h

Removing src/usr/usr1.c

Removing src/usr/usr1.h

No patches applied

$ quilt top

No patches applied

$ quilt next

prj.diff

$ quilt previous

No patches applied

"quilt pop -a"撤销所有补丁。top命令显示栈顶命令,即当前应用的最新的补丁。next命令显示下一个可以应用的补丁。previous显示上一条应用过的补丁。"push 补丁A"将从上到下依次应用所有早于补丁A的补丁,最后应用补丁A。例如:

$ quilt push more_p1.diff

Applying patch prj.diff

patching file src/drv/drv1.h

patching file src/sys/sys1.c

patching file src/sys/sys1.h

patching file src/usr/usr1.c

patching file src/usr/usr1.h

Applying patch drv_p1.diff

patching file src/drv/drv2.h

Applying patch more_p1.diff

patching file src/applet/applet1.c

patching file src/applet/applet1.h

patching file src/drv/drv2.h

Now at patch more_p1.diff

$ quilt top

more_p1.diff

$ quilt next

more_p2.diff

$ quilt previous

drv_p1.diff

"quilt push -a"应用所有补丁:

$ quilt push -a

Applying patch more_p2.diff

patching file src/app/app1.c

patching file src/app/app1.h

patching file src/app/app2.c

patching file src/app/app2.h

patching file src/applet/applet1.h

Now at patch more_p2.diff

"quilt graph -all"可以为栈顶补丁的依赖关系生成dot文件。Graphviz的dot可以根据dot文件产生图片,例如:

$ quilt graph –all > ../../more_p2.dot

$ cd ../..; dot -Tpng more_p2.dot -o more_p2.png

2.6 发布补丁

只要将patches目录打包发布就可以了。例如:

$ cd prj; tar cvjf prj-0.1-patches.tar.bz2 patches; mv prj-0.1-patches.tar.bz2 ../..

用户先下载、解压补丁包对应的源代码树:

$ cd ../..; mkdir user; cd user; tar xvjf ../old-prj.tar.bz2; mv old-prj/ prj

然后下载、解压补丁:

$ cd ../..; tar xvjf prj-0.1-patches.tar.bz2; cd user/prj

最后把补丁目录链接到源代码树的patches目录,然后应用所有补丁:

$ ln -sfn ../../patches/ patches

$ quilt push -a

Applying patch prj.diff

patching file src/drv/drv1.h

patching file src/sys/sys1.c

patching file src/sys/sys1.h

patching file src/usr/usr1.c

patching file src/usr/usr1.h Applying patch drv_p1.diff

patching file src/drv/drv2.h

Applying patch more_p1.diff

patching file src/applet/applet1.c

patching file src/applet/applet1.h

patching file src/drv/drv2.h

Applying patch more_p2.diff

patching file src/app/app1.c

patching file src/app/app1.h

patching file src/app/app2.c

patching file src/app/app2.h

patching file src/applet/applet1.h

Now at patch more_p2.diff

3 结束语

在上面的流程攻略中,我们演示了19个quilt命令:add, annotate, applied, diff, edit, files, graph, import, new, next, patches, pop, previous, push, refresh, remove, series, top, unapplied。

本次Linux之旅到此结束,欢迎您再次参加Linux之旅,一起探索浩瀚的Linux世界。

分类: 乱七八糟, 开发 标签:

使用diff, patch和quilt制作补丁(1)

2008年9月18日 16hot 没有评论

diff和patch是在Linux环境为源代码制作和应用补丁的标准工具。diff可以比较文件或目录的差异,并 将差异记录到补丁文件。patch可以将补丁文件应用到源代码上。quilt也是一个制作和应用补丁的工具,它适合于管理较多补丁。quilt有自己的特 有的工作方式。本文通过简单的例子介绍这三个常用的工具。

0 示例工程

我们先准备一个用来做实验的工程,它包含若干子目录和文件。可以用find命令列出文件清单:

$ find old-prj/ -type f
old-prj/inc/def1.h
old-prj/inc/def2.h
old-prj/src/sys/sys1.c
old-prj/src/sys/sys1.h
old-prj/src/app/app1.c
old-prj/src/app/app2.c
old-prj/src/app/app2.h
old-prj/src/app/app1.h
old-prj/src/drv/drv1.h
old-prj/src/drv/drv2.c
old-prj/src/drv/drv1.c
old-prj/src/drv/drv2.h
old-prj/build/Makefile

find命令的"-type f"参数选择普通文件,可以省略掉目录。希望自己操作的读者可以下载这个示例工程

1 diff和patch

1.1 比较一个文件

将old-prj.tar.bz2放到我们的工作目录,然后建立一个子目录,进入后解压示例工程:

$ mkdir test1; cd test1; tar xvjf ../old-prj.tar.bz2

用分号分隔多个命令可以节省篇幅。将old-prj复制到new-prj:

$ cp -a old-prj/ new-prj

让我们编辑一个文件。src/drv/drv1.h的内容本来是:

$ cat -n old-prj/src/drv/drv1.h
     1  #ifndef DRV1_H
     2  #define DRV1_H
     3
     4  #include "def1.h"
     5
     6  typedef struct {
     7    int p1;
     8    int p2;
     9    int p3;
    10  } App1;
    11
    12  void do_app1(void);
    13
    14  #endif

cat命令的"-n"参数可以增加行号。我们用vi将它修改成:

$ cat -n new-prj/src/drv/drv1.h
     1  #ifndef DRV1_H
     2  #define DRV1_H
     3
     4  #include "def1.h"
     5
     6  typedef struct {
     7    int a;
     8    int b;
     9  } App1;
    10
    11  void do_app1(void);
    12
    13  #endif

现在可以用diff命令比较文件了:

$ diff -u old-prj/src/drv/drv1.h new-prj/src/drv/drv1.h
--- old-prj/src/drv/drv1.h      2008-03-01 12:59:46.000000000 +0800
+++ new-prj/src/drv/drv1.h      2008-03-01 13:07:14.000000000 +0800
@@ -4,9 +4,8 @@
 #include "def1.h"
 
 typedef struct {
-  int p1;
-  int p2;
-  int p3;
+  int a;
+  int b;
 } App1;
 
 void do_app1(void);

diff程序按行比较文本文件。比较文件的diff命令格式是:

$ diff -u 旧文件 新文件

"-u"参数指定diff命令使用 unified 格式,这是一种最常用的格式,我们来看看它的含义。

1.2 diff的 unified 格式

以"—"开头的行是旧文件信息,以"+++"开头的行是新文件信息:

--- old-prj/src/drv/drv1.h      2008-03-01 12:59:46.000000000 +0800
+++ new-prj/src/drv/drv1.h      2008-03-01 13:07:14.000000000 +0800

unified 格式默认在变化部分的前后各显示三行上下文。在上例中,旧文件的7、8、9行被替换成新文件的7、8行。旧文件的变化部分是7-9行,前后多显示3行,因 此显示4-12行。新文件的变化部分是7-8行,前后多显示3行,因此显示4-11行。以"@@"包围的行指示补丁的范围:

@@ -4,9 +4,8 @@

'-4,9'中,'-'表示旧文件,'4,9'表示从第4行开始,显示9行,即显示4-12行。'+4,8' 中,'+'表示新文件,'4,8'表示从第4行开始,显示8行,即显示4-11行。"@@"行之后是上下文和变化的文本,其中'-'开头的行是旧文件特有 的,'+'开头的行是新文件特有的,其它行是两个文件都有的,即补丁的上下文。例如:

 #include "def1.h"
 
 typedef struct {
-  int p1;
-  int p2;
-  int p3;
+  int a;
+  int b;
 } App1;
 
 void do_app1(void);

1.3 制作和应用补丁

所谓制作补丁就是diff的输出重定向到一个文件,这个文件就是补丁文件。例如:

$ diff -u old-prj/src/drv/drv1.h new-prj/src/drv/drv1.h>../drv1.diff

我们将old-prj解压到另一个目录,准备应用这个补丁:

$ cd ..; mkdir test2; cd test2; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj

在真实场景中,test2目录通常是在用户2的电脑上。用户2可能不使用 old-prj 作为第一级目录的名字。例如:用户1的第一级目录名是 linux-2.6.23.14, 用户2的第一级目录名是linux。所以我们将 old-prj 改为 myprj 以模拟这种情况。

我们在 myprj 目录使用patch命令应用补丁:

$ patch -p1 < ../../drv1.diff
patching file src/drv/drv1.h

patch命令行中为什么没有出现要打补丁的文件?这是因为patch命令可以使用补丁文件中的文件信息:

--- old-prj/src/drv/drv1.h      2008-03-01 12:59:46.000000000 +0800

"-pn"参数(上例中n=1)中的n表示要从补丁文件的文件路径中去掉几层目录,可以理解为去掉几个'/'。例 如:p1表示去掉一层目录,"old-prj/src/drv/drv1.h"去掉一层就成为"src/drv/drv1.h"。patch命令在 myprj 目录找到"src/drv/drv1.h"后应用补丁。

我们通常都在代码树的上一层目录制作补丁,在代码树的根目录应用补丁。因此,最常用的patch命令格式是:

$ patch -p1 < 补丁文件

1.4 比较目录

我们回到test1目录,再对 new_prj 做一些改动。这次我们删除掉src/sys目录及其中的文件。再建立src/usr目录,并在该目录增加两个文件usr1.h和usr1.c。

$ cd ../../test1; rm -rf new-prj/src/sys; mkdir new-prj/src/usr
$ echo -e "#ifndef USR1_Hn#define USR1_Hn#include "def1.h"n#endif">new-prj/src/usr/usr1.h
$ echo -e "#include "usr1.h"">new-prj/src/usr/usr1.c

echo命令的"-e"参数打开对转义符的支持,bash默认是不支持转义符的。

现在我们比较目录并制作补丁:

$ diff -Nur old-prj/ new-prj/ > ../prj.diff

读者可以cat这个补丁文件的内容。根据前面的介绍,读者应该能看懂补丁文件了吧。

比较目录的常用命令是:

$ diff -Nur 旧目录 新目录 > 补丁文件

$ diff -Naur 旧目录 新目录 > 补丁文件

"-u"参数前面已经介绍过了。"-N"参数将不存在的文件当作空文件。如果没有这个参数,补丁就不会包含孤儿文件(即另一方没有的文件)。"-r"参数表示比较子目录。"-a"参数表示将所有文件当作文本文件。

我们再准备一个目录来应用补丁:

$ cd ..; mkdir test3; cd test3; tar xvjf ../old-prj.tar.bz2; mv old-prj myprj; cd myprj

在源代码树的根目录应用补丁:

$ patch -p1 < ../../prj.diff
patching file src/drv/drv1.h
patching file src/sys/sys1.c
patching file src/sys/sys1.h
patching file src/usr/usr1.c
patching file src/usr/usr1.h

好了,读者可以用"diff -Nur"比较一下"test1/new_prj"和"test3/myprj",没有输出就表示完全相同。

$ cd ../..; diff -Nur test1/new-prj test3/myprj

1.5 很多的补丁…

一个大项目可能有不同开发者提供很多补丁。这些补丁可能还存在依赖关系,例如补丁B必须打在补丁A上。我们当然可以凭着程序员的“心细如发”去管理好这些补丁,不过有一个叫quilt的工具可以使我们轻松一些。当然,即使有工具的帮助,细心和认真也是必需的。 

附录

为了简单起见,前面只介绍了一个"diff -Nur 老目录 新目录"的用法。有时候,新目录里只放了修改过的文件。这时可以不使用-N参数以忽略孤儿文件,即"diff -ur 老目录 新目录"。diff会输出孤儿文件的提示,我们可以删除或保留这些提示,它们对patch没有影响。

使用diff时可以用–exclude排除文件和目录,例如:

diff -ur -exclude=.* --exclude=CVS prj_old prj_new

上例排除了源代码树中以'.'开头的文件和所有CVS目录。其实对于CVS项目,可以直接在源代码树根目录中执行:

cvs diff -u3 > 补丁文件名

u3表示输出3行上下文的unified 格式。打补丁时在源代码树根目录中执行:

patch -p0 < 补丁文件名

"cvs diff"会自动忽略CVS项目外的文件。通过CVS的tag和补丁文件,我们可以方便地保存工作快照。

分类: 乱七八糟, 开发 标签:

Serv-UFTP服务器软件提权防止恶意用户提权

2008年9月16日 16hot 没有评论

  大家应该都知道通过webshell 可以提权,这里简单的讲述一个怎么能够防止别人利用webshell进行提权,也就是说就算恶意用户取得了某个服务器某站点的webshell,也是没办法进行提升权限的。

  防止webshell运行cmd命令

 

  这里讲述一个简单的方法,那就是把默认的CMD名称改成其他任何复杂名称。自己需要使用的时候可以更改回来。这个是最简单的,当然也存 在安全隐患,当恶意用户上传一个CMD到任意目录下,就可以执行了,这里可以找到很安全的设置方法,比如设置CMD 运行的权限,把所有权限都删除掉,当使用的时候在把权限加上去,wscript.shell 相信大家都比较了解它,Wscript.Shell可以调用系统内核运行DOS基本命令,这里可以通过修改注册表,将此组件改名或删除(建议改名),方法 如下:

 

  HKEY_CLASSES_ROOTWscript.Shell

 

  HKEY_CLASSES_ROOTWscript.Shell.1

 

  这个样子几个简单的步骤就可以达到webshell无法运行cmd命令的效果。

 

  修改系统默认文件夹漏洞

 

  也就是最常见的 C:Documents and SettingsAll Users,虽然大部分人都知道这里可以进程上传,但管理员一般很少注意到这个目录的权限问题,从而产生安全隐患。在这里我们吧此文件夹的阅读权限设置只 允许管理员用户和system用户完全控制,其他的屏蔽掉即可。

 

  Serv-U提权

 

  Serv-U 作为一款精典的FTP服务器软件,一直被大部分管理员所使用,它简单的安装和配置以及强大的管理功能的人性化也一直被管理员们称颂。但是随着使用者越来越 多,该软件的安全问题也逐渐显露出来。Serv-U 提升权限 ASP版 6.2 ,我们怎么能够防止它进行提权呢?那么只需更改默认端口和默认FTP软件的 账户和密码,默认管理员:LocalAdministrator,默认密码:#l@$ak#.lk;0@P,其修改方法如下:

 

  首先利用Ultraedit修改文件ServUDaemon.exe和ServUAdmin.exe两个程序,将默认密码修改成同等长 度的其它字符,然后用Ultraedit打开ServUAdmin.exe查找最后一个B6AB(43958的16进制),替换成自定义的端口比如 3930(12345)即可。

 

  当然也希望各各管理员能够及时更新自己的Serv-U 因为这个漏洞只有一些Serv-U的老版本存在的漏洞!最新的Serv-U已经不存在此漏洞和加入了 管理员密码的功能!让我们使用起来更加安全!

 

  安全设置IIS用户

 

  重新建立一个用户然后把用户所在组删除,让其独立,然后在IIS中指派给其网站,然后在网站跟目录指派其用户读取、运行,即可,此时即使WEBSHELL上传成功也只能在网站文件夹内活动,涉及不到其他文件夹。

 

  总结:以上介绍主要是一些常规的防范方式,不同的环境有着不同的设置,如果计算机中安装了其他软件,那就需要相对应的设置了。

分类: 乱七八糟 标签:

geany背景颜色设置

2008年9月13日 16hot 没有评论

一直因不知道怎么设置geany的背景颜色,而引以为憾。

 今天在geany发现一个工具可以设置geany的背景颜色,地址: http://www.milliwatt-software.com/jmg/notes/geany.html#Syntax%20highlighting 。下载:http://www.milliwatt-software.com/jmg/files/set_geany_colors.tar.bz2

抓图: http://www.milliwatt-software.com/jmg/files/colorschemes.html

已经使用上了,这下可以彻底不用想editplus了。

分类: 乱七八糟, 开发 标签:

网络游戏策划方案

2008年8月30日 16hot 没有评论

    我是一名建筑设计师,但也是一个游戏爱好者,同时,现在自己也在写策划案——这几年游戏玩多了,自然会有自己的想法,自然会变得挑剔——市面上那么多游 戏,现在居然找不出一款让自己能完全满意的。作为一个设计者,很自然就会想到——干脆我自己来设计一款游戏,哪怕它不能真正实现。

  在这里潜水也有半年多了,其间看到无数精彩或是平庸的发言,也看到很多颇有独创性的“想法”,但是迄今为止,尚未看到一款真正能称被之为“策划”的东西——是我眼界太高,还是这里并没有真正的高手出没?天晓得!

  什么叫策划——策划就是设计!你心目中有一款游戏,不管这款游戏是什么类型,关键是要把它完整的表达出来——用文字,用画面,或者是用一段DEMO程序,都可以,但是,关键是要让别人能够领会你的想法,能够知道这个游戏是什么样子的。

   程序,绘画,这些都是具体实施的过程,就好像一座房子设计完成之后,由施工人员把它造出来是一样的。但是在此之前,这座房子——这款游戏,应该已经存在 于设计者的心中,并且还要已经被系统的表达出来——建筑师用图纸,策划者用文字。包括它的每一个细节,每一处角落,甚至有可能产生BUG和容易被玩家利用 来作弊的地方,策划者都应该心中有数。

  策划需要创意,但更需要的是条理!无论什么样的住宅,都是由卧室,客厅,厨房,厕所等几部分组成,如果这几部分本身没处理好甚至是缺失,那不管房子本身多漂亮,设计上采用了多少新技术,都是垃圾。

   建筑如此,游戏制作又何尝不是如此?一款游戏,比方说现在市面上最流行的网络角色扮演游戏,无论它怎样千变万化,人物升级与属性系统,职业系统,法术系 统,交易系统,以及死亡惩罚与PK规则系统……等等——这些部分一样都不能缺,一款游戏好不好玩,能不能玩,就是看这些系统做的怎么样。否则,哪怕画面再 好,技术再高,也还是一堆垃圾。

  为了避免有人 说我狂妄,我把我自己正在做的游戏策划案子放一部分上来,我可以很自豪的说,这款策划在很多方面,远远超过了目前市面上所有的网络游戏,就算是 L2,WOW,也不能与之相比……当然,它可能永远没有实现的那一天,但这又有什么关系,就算它不能被真正做出来,至少,也已经存在于我的心中。

 

 

第二部分 游戏架构与总体设想篇

一.总体构想说明

    这是一款“综合性”的网络角色扮演游戏,游戏者通过扮演不同的人物角色,在这个游戏世界中进行冒险,升级,完成各种任务,参加或自己组建团体,与游戏系统本身或者其他的玩家角色产生互动,并从中获得乐趣。

  本游戏的主要吸引力,或者说能够吸引玩家的地方,主要是体现在以下几个方面:

1.角色人物的升级。

    这是几乎所有网络游戏的基本游戏性,游戏者通过打怪,做任务来获得经验值,提升自己的等级,增强自己的实力,然后进行更大程度的冒险。

    人物等级提升以后,除了可以提高本身的属性(力量,智力,hp,mp等)之外,还可以获得类型不同的“技能点”,通过耗费技能点,在npc那里学习到各种不同的技能,掌握与众不同的能力,以各种不同的方式在游戏世界中冒险。

2.金钱与极品道具的获得。

    这是促使游戏者努力练级,辛苦完成各种任务的主要动力之一。大量的金钱,稀少而与众不同的极品装备,这往往是吸引“骨灰级”玩家们废寝忘食的最主要原因。本作力图在这些方面做出合理而极富吸引力的设定,吸引玩家长久停留在游戏中,甚至促使“职业玩家”的产生。

    金钱与战利品的获得方式:打怪,完成任务,商业交易等。当怪物被打死后,物品从尸体身上掉落出来,供游戏者捡拾。“捡拾”物品的技能可设置为能够自动持续 运行(看见地上有东西就捡起来)。为了避免发生抢夺战利品的情况,某人所打的怪爆出东西,在一段时间内(暂定为30秒)只有此人能看见和捡起,其他人无法 看见,当然也不可能捡拾。

    对于经常发生的“抢怪”行为,除了在地图布置上尽量增加重生点之外,还可作如下几种设定:

    方式一 禁止抢怪型:倘若某怪物是被两三个人一起打死,经验值与物品均属于第一个打的人所有。后面动手的,哪怕他打得比较多,也得不到经验。考虑到有人会利用这个规则带小号,或者是帮忙完成某些任务,可以作如下几种设定:

(1)  假如帮忙者级别超过这怪物级别一定数量(暂定为10级),则先动手的人所得到经验数和金钱都会减少。(正常情况的50%~25%)–禁止玩家带小号。

(2)  怪物给予的经验和金钱数量根据给它最后一击的人物级别来确定,这样就可以允许玩家帮忙带小号,但被带者必须打第一下和最后一下,否则无效–允许玩家带小号,但是麻烦。

(3)  不做特殊规定,经验和金钱数就是按照第一击的玩家等级确定–方便玩家带小号。

    方式二 允许抢怪型:几个人同时打死一个怪物,根据各人对其造成的伤害数量多少来确定各人所得的经验值与金钱数。怪物爆出的物品则根据造成伤害大小比例的百分数,随机确定谁能得到(只有得到的人才能够看见该物品,其他人在30秒内无法看到)。

    这种方式的优点是不存在带小号的问题,和组队分配的方式比较类似,另外,由于本作中NPC的用处非常大,很多情况下玩家是和NPC在配合作战,采用这种方式可以确保玩家在与NPC配合时的利益。

    本作的设定计划是将这两者结合起来考虑:当打怪物第一下的是玩家时,即采用方式一的设定,其他人再打只能算白帮忙(此时怪物的名字变成灰色,说明此怪物已 经“名花有主”,没必要再追了)。而假如打第一下的是NPC,则采用方式二,怪物依然是无主货,第一个玩家可以虎口夺食,但所获得的经验值与金钱数会相应 减少(NPC士兵可一样会捡钱,捡东西)……不过假如再有其他人加入,就等同于方式一了。

3.  丰富多彩的任务设计。

    冒险,是这类角色扮演游戏最注重的部分,在冒险中除了能够得到金钱,经验,与道具的奖赏以外,冒险过程本身也应该是一个激动人心的过程。特别是和朋友们一同冒险,就更能体现出这种快乐。

    在这款游戏任务设计上,应尽可能做到“平衡”,“有趣”,“刺激”三点,既照顾到大多数普通玩家的能力与时间,也让小部分的精英人员有用武之地。完成任务 的过程,既不能象《传奇》那样平淡无聊,也不应象《EQ》那样让人感到厌烦。时不时地给玩家一些小惊喜,或者是一些紧张的刺激……这些都是任务设计时应该 考虑的目标。

    任务设计的基本原则,应该是“清晰”和“灵活”–游戏者从接到任务开始,就应该很清楚他应该去哪儿,该做什么。一步做完以后下一步又该做什么……但相应 的任务设计也要尽可能灵活,一些过关道具,地图场景,乃至于触发条件可以采取多选一,或系统随机生成的形式,以避免游戏者们完全依靠前辈攻略,按图索骥的 情况发生。

    这必须是一个丰富多彩的世界,其中既有需要上百游戏者通力合作来完成的“史诗”任务,也有轻松悠闲,跑步聊天即可解决的“小CASE”。无论是喜欢单独SOLO还是热衷于团队合作的玩家,都应该能从这个游戏中获得属于自己的乐趣,当然,还有相应的任务奖励。

    另外,在本作中,任务系统还将与故事剧情结合起来考虑,游戏者完成任务,并不仅仅是为了得到奖赏,参加冒险,也能够把一个故事进行下去……随着任务的逐步升级,游戏者也将进入更多的剧情故事中。

    为了对任务的参与对象做出预测与控制,高级任务采用副本体制势在必行,只允许合理级别,职业的游戏者进入相应的任务区域,这样才能保证做出“平衡”,“有趣”的任务来。

4.角色人物与游戏世界,各团体之间的互动,包括惩罚,奖励,以及地位的提升等等。

    在这个游戏世界中,游戏者所扮演的角色决非单纯过客,游戏者的一举一动,都会在这个世界中留下相应的结果,进而又对游戏者本人产生反馈。也就是说,在这个世界中,每一个游戏者都必须对自己的行为负责。

    系统将根据游戏者的行为留存纪录,并且根据这些记录对游戏者做出奖励或是惩罚。游戏中的npc也会根据这些纪录数值的不同,而对游戏者做出不同反应。纪录的方式,目前暂定为若干数值:“功勋值”,“贡献度”,“道德值”,“名望值”。

    功勋值(友好度)/仇恨度:所有人物角色创造产生的时候,都会有所属的国家,并且有一个“功勋”数值,意味着游戏者对这个国家做出的贡献。游戏者在游戏中所做的大部分事情,都会造成“功勋值”的变化,做了对国家有利的事情,功勋值增加,反之则减少。

    当功勋值增达到规定数量的时候,游戏者即可享受到国家的奖赏,可以是领取金钱报酬,特殊奖励物品,也可以是获得贵族爵位,或者是成为骑士团长官,甚至担任 地方领主–获得后两种地位以后,游戏者不仅仅可以操控本身人物,还可以指挥部队,决定地方税收,宣战或者是媾和……整体的游戏性大为扩展,是吸引高等级 玩家的最好手段。

    功勋值可以下降成为负数,即成为“仇恨度”,倘若仇恨度达到一定数量,游戏者将会遭遇到来自国家力量的惩罚–将被列为任务目标,受到npc或者是其他玩 家的追杀或逮捕……等等。对于其他国家,这个数值也存在,属于A国的游戏者如果做了对B国有利的事情,就将获得B国的“友好度”,不过反过来说,也有可能 因为与B国的仇恨值太高而被B国列入绝杀名单……

    注:游戏者可以通过一系列任务,更换自己所效忠的国家,当然这首先会有友好度的高要求,其次就是会带来很多麻烦。

    贡献度(友好度)/仇恨值:当游戏者加入某个团体以后,将会拥有这个数值,当他为该团体完成一定的任务以后,其贡献度数值就会增加,只有当贡献度达到规定数量之后,游戏者才能在这个团体中获得更高的地位,进而享有更大的权利,学习到更多更强的技能。

    贡献度的设定与功勋值类似,但游戏者可以加入不只一个团体,所以他们也将拥有不只一个贡献度。

    同样的,贡献度的反面也是仇恨度,游戏者如果得罪某一个团体太多,仇恨度积累到一定数值之后,就会遭遇到来自这个团体的惩罚,包括暗杀,追捕……等等。

    在没有加入该团体之前,游戏者假如作了对该团体有益的事情,也可以获得贡献度(友好度)。

    道德值:这个数值可以单独列出,也可以与功勋值,贡献度结合起来考虑。这个数值的设定主要是为了对游戏者的行为进行引导,并且控制游戏中一些极端行为的发生。

    游戏者可以通过某些任务,或者是向教会捐款等方式提高自己的道德值。而相应的,一些诸如杀人,偷窃等行为也会导致道德值急剧下降,甚至转为负数–罪恶值。罪恶值高的游戏者将遭到来自游戏世界的惩罚。

    通过这个数值,系统可以引导游戏者用健康,有益的方式进行游戏,避免做出种种极端行为。并将游戏中最重要的组成部分–游戏氛围,控制在一个符合策划者构想的,合理的良性循环之中。
此外,很多游戏中的npc团体,例如教会和骑士团,都会对道德值有要求,若不能达到要求就无法加入,加入以后也需小心遵守,否则就会被开除,甚至遭到通缉。

    相应的,有些“邪恶”团体也会要求有一定的罪恶值才能加入,在这些团体中往往能学到很有用的强力技能或是得到好东西,不过加入之后若想脱离可就要面临永无止境的追杀了……

    罪恶值:这是单独设置用来控制PK行为的数值,也可以考虑和道德值结合起来

    因为这是一个角色“扮演”游戏,系统允许游戏者扮演任何角色,也包括了“邪恶”的角色,所以系统并不禁止游戏者做出那些恶劣行为,例如PK,盗窃等等。但 是这些行为将导致游戏者罪恶值的上升,使其名副其实的成为一个“邪恶”人物。当然,既然决心扮演邪恶者,就要有相应的思想准备,杀人者亦被人杀,这款游戏 的设定未必能够做到绝对正义,但一定会做的比较“公平”。

    注:本游戏的设计原则是:游戏中的行为,尽量用游戏本身的规则来约束,而不是通过系统设置解决。例如,对于常见的PK现象,就完全可以采用公布通缉令,悬 赏其头颅,用阴魂不散的NPC和玩家追杀来取代目前流行的“红名”制度,这样才更为合理。(一个强大的NPC赏金猎手昼夜不停地对其进行追杀……)

    名望值/恶名值:这是游戏团体的专用数值,一个游戏者组成的团体,就无法单独用哪一人的道德值加以评价,所以必须另设一个数值。在这个游戏世界中,名望是 非常重要的,特别是对于佣兵团等依靠任务为生的团体来说,名望响亮能够接更多任务,更快提升团体的能力与等级。而名声差的团体将难以生存,如果恶名值高, 甚至可能受到国家讨伐。

5.游戏者之间的互动,精英公会与普通玩家的关系。

    玩家与玩家之间的互动,乃是网络游戏的精髓之所在,但也是最难控制的一个部分。所谓互动,无非是两类–协助与对抗。能够得到其他玩家的帮助,当然是令人愉快的,但只要在游戏中产生了对抗,则就很麻烦。

    多少大作名作,都是在这一点上栽了跟头–游戏玩家是没义务配合设计者的。他们总是选择对自己最有利的方式进行游戏,而不管是否会对其他玩家造成不便……光是一个不同职业玩家对抗时的“平衡性”设定,就让无数著名公司丢尽颜面,出尽补丁也不能彻底解决。

    此外,现在日益流行的“公会”设定,也正在成为考验游戏设计者功力的一大障碍。一群玩家组成公会以后,对于他们本身,或许是确保了互相协助,可以更多享受 游戏乐趣。但对于公会以外的其他游戏者,势必会造成影响。特别是少部分大公会的产生,更直接在游戏中产生了垄断现象。

    有些游戏为了掩饰弱点,干脆完全取消了对抗,例如《EQ》,但是这样一来造成的直接结果就是游戏乐趣大为降低–游戏者们辛辛苦苦练级,攒钱买好装备,毕竟不会甘心仅仅是用来冲着一群NPC逞威风。“与人斗,其乐无穷”,这才是网络游戏的真谛。

    但如果将一切都开放给游戏者来决定,则又属于完全的自杀行为。欧美大作《魔剑》的失败已经证明,让游戏者,或者是游戏公会自己来定规矩,在游戏中实行丛林 法则,其结果只能是死路一条。因为游戏者,或者是游戏公会,他们并不需要保障世界的平衡,他们在游戏中的所有活动,都只是为了将自己的利益最大化。但如果 系统允许某一个人,或是某一群人在游戏中把自身的利益扩至最大,就必然会影响伤害到其他人的利益,从而破坏了网络游戏最起码的原则–公平,从而导致玩家 流失。

    同时,游戏玩家之间的对抗斗争,虽然精彩刺激,但也是非常耗费时间和精力的。在对抗产生之初,游戏者会因为压力而产生动力,对于游戏的兴趣也会增加。如果不加控制而任其发展,最终只会在无穷无尽的争斗中耗干游戏者的热情,使其产生厌烦情绪而最终退出。

    可以预料,在不远的将来,是否能够控制好游戏者之间的对抗,既能利用它给游戏者们带来的动力,又避免其破坏游戏者兴趣,将成为衡量一款游戏是否出色的重要依据之一。而本作的设定,既在此做出一个初步的尝试–
    首先:利用国家功勋值与道德指数对游戏者的奖励与惩罚措施,对游戏者的行为目标做出限制,使其分清楚合作与对抗的目标分别是什么。一个,或是一群游戏者在 这个世界中,既有需要严厉打击的敌人,也有可以放心依靠的同僚伙伴(这些敌人或是伙伴,既可以是玩家,也可以是NPC)。这样他的所有行动就有了明确目的 性,从而不会因为无聊而胡乱行动。(当然,仍然会有一些人胡乱行事,但他们做的所有事情都将付出代价。)

    其次,一个或者一群游戏者,在这个游戏世界中所能起到的作用是受到严格限制的。游戏者永远斗不过NPC,或者说–在国家力量面前,个人或公会的力量微不 足道,游戏者只能参与,但尚不足以改变整个世界的格局。这样,无论他们之间的斗争达到何种地步,都不足以使对方失去信心退出游戏,从而确保整个世界格局的 稳定性。

(注:可能会有一些激动人心的史诗任务会允许玩家改变整个游戏世界,但这种改变必须是在设计者预料之内的,对提高游戏性有帮助,而不仅仅是对该玩家本身有好处。)

    总而言之,在这方面的设定原则是:精英人员,或者是拥有一大群人的公会,在游戏中可以获得比普通玩家更多的乐趣,但是系统不会允许他们欺压普通玩家,更不可能构成垄断。

6.精彩的故事剧情,打动游戏者内心的东西。

    人们进行游戏,就是为了进入另一个世界,通过自己所扮演的角色去领略一个与现实完全不同的世界。同样的,他们也都希望有一段与众不同的经历–这就是剧情。在国内玩家中间,这种愿望更加明显,RPG游戏的大行其道,正说明了这一点。

    不过作为网络游戏,试图在其中加入RPG剧情是比较困难的,因为这并不是一个人在玩,而是一大群人在游戏中,游戏设计者无法预测玩家的反应,而且游戏环境 又必须始终不变,这就难以编制剧情触发条件,自然也就很难编制出合理的,能够适应多种变化的故事剧情来(例如:也许设计者本来希望通过死掉一两个NPC做 悲剧,结果却由于一大群玩家的介入,主力BOSS被轻易干掉而变成了喜剧或者是闹剧……)

    但是,困难并不等于完全不可能,如果能够有足够的耐心与细致,把诸多“意外情况”都考虑周到,在网络游戏中依然可以加入剧情元素,而且可以做出非常宏伟有气势的剧情来–只要在考虑该剧情经历者的时候,不是考虑一个玩家,而是把一群玩家统统考虑进去。

    本作在剧情策划上,主要考虑是利用任务系统来实现,游戏者在进行各类任务的时候,也在体验着剧情故事的发展,具体说来,有如下两种方式:

    第一种:一些小规模的剧情发生,可以利用副本系统,做出一个较少他人干扰的环境来,由于进入副本的玩家人数和职业都是可以预测,触发条件就比较容易设置,从而加入合适的剧情。

    第二种:改变整个游戏世界的剧情–当然都是作为“史诗”任务而存在,触发条件和完成条件都非常难,基本上可以看作“不可能完成的任务”。不过一旦成功,将造成整个世界系统的大变化–这可以和经营手法结合起来考虑,一部分一部分的推出资料片……

7.  宏伟的国战系统,庞大的战争场面。

    如果说上面一条是为了讨好RPG爱好者,那么本作加强在这一方面的内容,就是为了吸引SLG战略游戏的爱好者了。既然是一群人在玩游戏,里面就不可能不出 现SLG元素,而本作的特点就是,尽可能扩大SLG战略游戏的特色,甚至,如果预先开发单机版,这款游戏本身就可以作为一款宏伟的SLG单机游戏来看待。

    事实上,目前大多数的网络游戏都已经开始带有SLG战术指挥的影子,例如常见的宠物系统,游戏者可以用简单的命令操控自身以外的个体攻击敌人。不过,在本作中,战术指挥将被作为一个特点而专门强化。

    基本构想为–随着游戏者地位的提高,他所能控制的人物,所能管理的范围都逐步扩大。首先,所有的普通游戏者都可以操控一只宠物;级别高了以后,就能获得 一名NPC同伴,陪同自己作战;而有些特殊职业,比如骑士团,佣兵团中的小队长,可以同时操控五~六名NPC士兵的行动,并决定交战时的阵形;地位更高的 游戏者,如中队长,大队长……将可以决定更多部队的行动方向,攻击目标。

    当游戏者获得贵族爵位,拥有了自己的领地以后,他不但可以组建自己的NPC军队,还能获得管理自己领地的权限,从领地收税,分封部下等等……这时候的游戏者,除了享受角色扮演的乐趣以外,还可获得策略谋划的巨大乐趣(当然,也会承担相应的责任和负担)。

8.  结合在主体世界中的一些小游戏,休闲的乐趣

    基本设计原则是:除了让游戏者从这些小游戏中取得乐趣之外,还应该让获胜者得到相应的奖励:金钱,或者是经验值之类。

目前考虑可以加入的小游戏有:

    斗技场:可供玩家之间PVP,也可向NPC角斗士们提出挑战。可以一对一单挑,也可以团队对团队。玩家也可以此来赌博。

    赌博游戏:掷骰子,下棋,打牌之类,无聊的人可以在酒馆中消磨时间。

    兵棋游戏:需要另行设计规则,相当于一个最原始,最简单的SLG战棋小游戏,模拟军团战情况,可作为指挥官的毕业考试。

    赛马:希望能做成奇幻游戏世界中的《极品飞车》–只要程序和系统速度允许。

    障碍赛跑:比赛跳跃,攀爬,游泳等诸多能力,十项全能运动会。

    综上所述,可以看出,本游戏几乎囊括了目前市面上绝大多数网络游戏的“卖点”,并且尽量将其有序组织起来,从而达到吸引几乎所有网络游戏玩家的目的。
二.人物基本动作与操作的设想
    本游戏按照全三维画面构想,因此在动作设定,视角,操作等方面都较为复杂,但是复杂的操作也意味着游戏性更高,甚至,可以做出类似于动作游戏的效果来,以此来满足一些重视微操作的高级玩家需求。

    单个人物本身的基本动作有:走路,奔跑,后退,转身,跳跃,攀爬,游泳等等。
    拥有了相应技能之后的动作有:上马,下马,骑马走路,骑马奔跑,飞行,大量的武器技能与法术之类。
    针对目标的基本动作有:攻击,交谈,推(箱子之类),抗起(尸体,昏迷的敌人),跟随,保护(跟随并且攻击袭击跟随目标的敌人)……
    掌握了技能之后针对目标的有:各种武器技能,法术。
    动作设定复杂,也就意味着游戏中的设计有了更多的灵活性,虽然不可能完全做成象《古墓丽影》那样的动作游戏,但也可以有一点那类游戏的影子。
    操作设定的基本原则是:允许游戏者自由选择使用鼠标或是键盘进行操作。两者可以互相代替,但也拥有各自的独特性与优势。无论新手还是老手,都可以找到自己 习惯并且熟练的操作方式。但是在游戏中也将尽量体现出微操的重要性–“易学难精”,将是这款游戏操作方面的主要特征。

以下为本作角色人物基本操作的设定模式:
    1.鼠标操作。鼠标操作的优点是直观性强,较容易掌握,适合于新手使用。此外,鼠标可以一次操控多个目标,是指挥部队时必用的操作方式。

    鼠标右键设定为“选取并到达地点”,右键单击某处,人物就自动向该处走去,双击右键,则为跑步前往。如果是骑在马上也一样。
    左键设定为“选择目标”,左键点击某个目标,该目标即被选中。如果是双击左键,则为“选取并且对其实施默认动作”。例如对敌人双击左键,默认动作即为攻击 敌人;对同伴双击,默认动作为跟随并保护同伴;对某一件物品双击,默认动作为拾取或者是打开(箱子);如果是绳索或藤蔓,甚至城墙(拥有高级攀爬技能), 则为攀爬……等等。
    按住左键拖动,即形成选择窗口,可以一次选择多个目标。设定两种选择方式:如果是窗口从右往左拖出,则为窗口选择模式–只有完全包容在窗口中的目标才会被选中;如果是从左往右,则为接触选择模式–所有接触到这个窗口方框的,哪怕只碰到一点也被选中。
    左键点击目标后按住不放,稍后(暂定为0.5秒)该目标旁出现动作菜单,显示出可对此目标执行的所有动作,便于玩家选择。 
    中间滚轮来回滑动:放大或缩小画面,三维游戏的主要优势。
单击中间滚轮或鼠标上第三个键:快速将现有视角转换180度(快速回头看后面),逃跑时用于观察追敌目标。
    按住中间滚轮或鼠标上第三个键:来回拖动鼠标:改变视角方向,上下左右随意调整。
双击中间滚轮或鼠标上第三个键:恢复原先预设视角。
注:为了方便左撇子玩家,鼠标操作的左右键功能可以互换。

2.键盘操作。键盘操作的特点是反应速度快,动作灵活多样,适用于熟练程度较高的游戏者。但是键盘操作只能控制游戏者本身角色,而无法控制其他NPC人物,包括宠物。
键盘操作可允许玩家自行设置,但默认设定如下:
(1)动作键部分:
    W键:向前行走。
    双击W键:一直向前奔跑,除非按S键终止。
    S键:向后倒退,奔跑时按此键为停止奔跑。
    双击S键:向后跳跃,可用来躲避敌人的攻击。骑在马上时可以让战马在奔跑或冲刺状态下急停(这时候战马会嘶叫并且直立起来)。
    A键,D键:分别为向右,向左转弯,奔跑时按此两键可在不停止奔跑的情况下拐弯,但转弯时速度略微放慢。
    双击A,D两键,为向右,向左快速平移,也可用来躲避敌人攻击。
   Q键:万能键。正常情况下是原地跳跃,奔跑情况下向前高跳(游戏者在马上时则为纵马跳跃)。在水中一直按Q键为游泳。而当游戏者拥有飞行技能并且进入飞行状态时,一直按住Q键则为飞行。
此外,当游戏角色拥有二级跳跃技能时,跳在空中最高点时再按一次Q键,即可在空中腾空翻滚,再跳高一段距离(只某些职业拥有二级跳跃技能)。
   双击Q键:上马,下马,视当时游戏者本身状态而定。在骑马奔跑中双击Q键,则为直接从马背上跳起,
E键:动作键,对选择目标实行“默认动作”。例如,当游戏者当前的选择目标是敌人时,按E键即为攻击;但当游戏者选择到一个同伴时,E键的作用就是跟随并且保护;选择到物品,则为拿取……等等

(2)目标选择键部分:
    Insert键:选择距离自己最近的敌对目标。继续按则依次选择下去。
    双击Insert键:暂略
    Delete键:选择刚刚攻击过自己,或是对自己使用恶性技能的目标(反击键)。
    End键:选择距离自己最近的中立目标,包括中立的NPC,尸体,箱子,落在地上的道具等物品。继续按则依次选择。
    Pagedown键:选择距离自己最近的同伴目标,继续按则依次选择。
    双击Pagedown键:选择附近所有的同伴(队员)目标。(便于施展群体辅助魔法)

    特殊部分:考虑到操作的习惯性,在这一区域也设置动作键,以方便操作(一只手即可完成选择和动作,另一只手可以操作鼠标)。
    Home键:动作键,同E键效果一样。
    Pageup键:万能键,同Q键效果一样。

(3)视角控制部分:
    上,下箭头:视角范围向上,向下调整。
    双击上箭头为恢复平视状态。
    左,右箭头:视角范围向左,向右调整。
    双击左箭头为恢复至正前方视角,双击右箭头为向后看(视角转180度)
    小键盘的“-”和“+”键:放大缩小画面

    注:为左撇子玩家,或者是希望用右手控制鼠标,左手进行选择与动作的玩家所考虑的键盘设定:
    上下左右四箭头:前后奔跑,左右转弯,相当于WSDA键。
    QWEASD六键:选择与行动键,相当于Insert等六键,Q键与E键的功能可不变。
    Insert,Home,Pageup,End:相当于原上下左右键。
    Delete,Pagedown:放大缩小画面

(4)常用功能键:
Tab键:调出地图画面,战术指挥时常用。
左Shift键,Ctrl键,Alt键:参数命令键,与E键或鼠标左键同时按,执行一些“非默认动作”,例如Ctrl键可设定为强制攻击,左Shift键设定为选择多个目标,Alt键设定为立即显示动作菜单等。
Esc键:系统菜单命令
F12键:第一人称视角/跟随视角/俯视视角来回切换

(5)其它快键键:
  根据游戏者职业以及技能的差异,由玩家自行设定。

    除了人物基本动作的操作以外,本游戏中还设计了团队控制指令和内政指令,用于高级游戏者指挥部队与下达内政命令之用,这些命令由于不常用,被整合设置在专门的地图界面中。
    例如,团队操控的指令被整合在区域地图画面中,游戏者必须按Tab键调出区域地图画面以后才能指挥部队。而领地,国家级别的内政命令则被整合在更大一级的内政地图画面中,游戏者必须在市政厅或军营主帐篷的指挥桌前才能打开该画面,下达相应指令。
    这些都属于高级游戏者才能接触的范围,具体设定暂略。
三.PK,敌对阵营之间的战斗,以及死亡惩罚的基础设定:
    对于任何一款网络游戏来说,PK与死亡惩罚的设定都是属于最重要的基础性设定之一,这方面设定的好坏与否,直接关系到一款网游能否吸引,并且留住玩家。因此,虽然在前面的总体构想说明中,笔者已经简单介绍过这方面的情况,但还是有必要拿出来单独做个详细介绍。
1.关于PK的基本设定:
    游戏者由于选择的国家不同,加入的派别团队不同,被分成互相敌对或是同盟的几个阵营。敌对的国家与势力之间,在任何地方都可以自由PK,相当于玩家同怪物的关系,除了增加敌对度外,没有任何惩罚。

    同属于一个国家或者是同盟国家的玩家角色,在安全区域内,比如说新手村,首都主城等地方,不能互相攻击,也不能互相使用恶性魔法,盗窃等技能,区域魔法和 技能不会造成误伤(对玩家无效)。(敌对阵营玩家不受安全区限制,但在理论上,敌对阵营玩家无法到达安全区。)
    在安全区内有专门的斗技场,游戏者们可以在那里自由较量,但在斗技场中不会死亡,失败以后血量剩1点,胜利者会做出胜利姿势,并且获得失败者的赌注。

    在非安全区,同一阵营玩家可以互相使用强制攻击,可以对别人使用盗窃,恶性魔法技能,但区域性攻击魔法和技能仍然对玩家无效。
    一旦游戏者攻击到同阵营玩家,或者是对别人使用了盗窃与恶性魔法之类,攻击者与被攻击者即彼此进入敌对状态,可以自由攻击(此时区域性攻击魔法和技能都有效了)。直至杀死对方,或者在双方都停止攻击之后一段时间(暂定为30秒),敌对状态结束。
    如果是先攻击者杀死了被攻击者,他的道德值将大幅度下降,罪恶值将大幅上升,并且在被杀者那里留下杀人纪录。如果是被攻击者杀死了攻击者,则不会有特殊惩罚(或者道德值小幅下降,可根据实际情况调整。)
    特别说明:当两个同阵营玩家之间进入敌对状态的时候,他们与其他玩家之间的关系并不改变,其他游戏者如果想加入战斗,同样首先需要用强制攻击方式,而且会被系统认定为先攻击者。
    但是假如一队玩家中有一人与其他人敌对,那么这一队人全部对其进入敌对状态。两支队伍中只要各有一人敌对,两支队伍就敌对。

2.对PK者的惩罚:
    当道德值下降到一定程度,或者是罪恶值上升到一定程度时,该游戏者将被列入国家通缉名单,被NPC和玩家当作敌对阵营或是怪物看待,看见就杀……假如在通缉名单上的排行较高,还会引来由玩家或是NPC扮演的赏金猎手,昼夜不停的追杀,取得头颅以回去领赏。
    罪恶值只有通过死亡才能降低(或者是做某些特别困难的任务),基本上,主动杀死一个人所增加的罪恶值,需要死亡两次才能降下来。
    此外,作为被杀者,还将获得一次单独报仇的机会–在他的凶手名单里会留下加害者的名字,然后被害者可以去地方市政厅,或者是赏金猎人协会发布悬赏,将该名单直接拖入地方通缉栏内,作为一个头颅取得任务让其他玩家接下。如果肯留下赏金,接此任务的玩家肯定很多。
    为公平起见,当某一个游戏者接下此任务时,被通缉者将得到系统通知,告知是谁来追杀自己,以后两人相遇时就可以直接攻击,彼此相当于敌对阵营。

3.安全区与非安全区,边境区域的设置原则:
安全区:除了新手村以外,城市内部,村镇内部,总而言之让游戏者们休息,交易与补充物资的地方,都属于安全区。安全区内多半都有城墙和NPC卫兵,巡逻队保护,游戏者在那里通常不用担心会受到敌对阵营的攻击,不过有可能会遇到贼。
    但安全区内通常没有让游戏者打怪练级的地方,要想练级就只能去非安全区。

    非安全区:城外,山洞里,地下城……那些能够练级,获得物资的地方基本上都是非安全区,游戏者在这里需要冒一定的风险。但只要不遇到敌对阵营的人,基本上还算是安全的。

    但是在两国交界的边境区域,敌对阵营的游戏者们是有可能见面的。在这个区域里,敌对国家的游戏者们若碰了面,就相当于看见了怪物一样,随时可以开打。互为 敌对阵营的玩家之间无法交易,无法组队,看不见对方的说话,也不能密语–相当于自动进入黑名单状态,这样可以避免骚扰,辱骂等无聊现象。
    很多高级任务都需要玩家前往边境地区完成,所以在执行这些任务时随时都要保持警惕。不过大多数好的道具,矿藏也多半设置在边境区域,游戏者若能获得领地,也多半是在边境区域,随时将面临敌对国家的攻打……
    这个边境区域是可以随着国家势力的扩张而变化的,例如,根据剧情设定,当A国出兵攻下了B国边境的某一座要塞之后,在这座要塞后方的城市附近原本是看不见 敌对阵营人物,属于非边境区域的,现在也变成了边境区域,随时要冒险了……这个变化过程主要是通过NPC军团之间的大规模国战来确定,但玩家在其中也能起 到一定的作用,至少可以加入某一方的军队,跟在NPC士兵们后面混水摸鱼……如果某一方玩家数量很多,就有可能改变战场局势。攻下原本攻不下的城堡,或者 是守住原本守不住的城市。

4.死亡惩罚:
    由于本作是用“死亡”作为约束PK者,维护游戏秩序的主要措施,因此在本作中,死亡惩罚不能太轻微,否则起不到约束作用。但也不能太重,否则吸引不了人, 本作力求在这两点之间找一个合适的平衡。基本原则是:死亡应成为游戏者尽量避免的忌讳,但又不至于因为死亡而彻底失去信心。
    目前考虑两种死亡惩罚方式,新颖的和传统的,但采取哪一种,还要根据实际情况再加以推敲。

新颖的死亡惩罚:生命宝石加游戏点数复活。
    人物死亡之后,既不丢经验,也不喷东西,只是作为尸体躺在原地。想要复活,必须使用一种特殊道具–生命宝石。
    在每一个游戏者刚刚进入游戏时,都拥有一定数量的生命宝石(暂定为三颗),此后每升10级(或者是5级),都可以获得一颗生命宝石。另外某些高级任务也可以获得生命宝石的奖励。
    生命宝石还可以通过花费游戏点数来购买(就相当于花钱复活了),购买一颗生命宝石的所花费的游戏点数,大致相当于5~10个小时的游戏时间。
    另外还可以通过一些活动,如新年派送礼物等等……每隔一段时间让玩家获得生命宝石。
生命宝石只能用来给自己,或者给NPC(宠物或部下)复活。作为任务道具,它也不能被交易,丢弃到地上则自动毁弃,这样可以避免开小号战术。
    不过生命宝石可以被卖回给NPC道具商人,得到相应的游戏点数–给精英玩家们的奖励。
使用生命宝石之后,游戏者将在本地区的村镇教堂,神庙,或是自己的家中(总之都是安全区)里头复活,不存在原地复活的可能性。这样可以避免游戏者刚刚复活就又被打死,造成浪费。
    使用这种方式,由于死亡次数是被固定的,超过之后就要花钱复活,死亡将成为一种相当严厉的惩罚。在实际施行过程中,可能会由于过于严厉而导致玩家流失。因此,还可以采用第二种方式,亦即传统方式加以弥补。

    传统的死亡惩罚:经验值和道具的损失
    当游戏者成为尸体之后,可以选择使用生命宝石返回村镇复活,没有任何惩罚,尸体随即消失。
    但也可以选择“释放灵魂”,成为一个鬼魂,然后自行返回本地区的安全区,找专门的复活NPC帮忙复活。为了方便鬼魂返回安全区,鬼魂自动拥有“回归”技能,使用后直接传送回城。
    选择释放灵魂之后,游戏者将根据级别高低不同,损失一定的经验值,同时身上携带的道具,金钱,有一定几率暴出(暂定为5%~15%)。(罪恶值高的人暴东西的几率更大。)喷出来的东西有可能被旁人捡走。
    假如附近有牧师等会“复活”技能的玩家存在,则可以请求玩家帮忙复活自己,复活以后有一定的虚弱时期(暂定为300秒),所有属性值减半,无法使用任何技 能。另外,牧师的复活技能并不能完全减少玩家经验损失,只是省了来回跑路的辛苦。就算是最高等级的复活术,也只能恢复50%的经验损失–否则生命宝石就 太贬值了。
    为了避免玩家利用鬼魂状态对附近区域作侦察,鬼鬼们只能看见自己尸体附近的怪物和其他玩家,且无法进入副本地图。鬼鬼们的发言和叫喊将不会被普通玩家看 见,但牧师,圣骑士,死灵法师等会“复活”技能的职业可以看见鬼魂,以及他们的发言和叫喊,且鬼魂的私聊频道依然有效,这样可以便于鬼鬼们求助。
    尸体一段时间以后就会腐烂消失(暂定为300秒),尸体消失以后鬼魂就无法复活了,所以鬼鬼们只有五分钟时间找牧师,否则只能回城复活。
    如果玩家在300秒内一直没决定是采用生命宝石复活还是变成鬼魂,当尸体腐烂消失的时候,系统会自动将其灵魂释放出来,使得玩家成为一具无主孤魂,当然, 此时物品可能会暴,经验值也会丢。假如某人杀死了对手,他可以很耐心的在旁边等上五分钟,看看有没有好东西暴出来……被杀死的玩家也有整整五分钟时间做出 决定:是冒着喷装备的危险变鬼魂复活呢,还是用一颗生命宝石确保自己身上的好装备不丢。

    假如采用上述方式作为死亡后的惩罚措施,生命宝石就将作为一种辅助性的珍稀道具存在,游戏者得到的机会也将大为减少,同时也不能再用游戏点数,也就是花钱 购买了。这样才能让那些经常死亡的玩家,也就是PK者们冒更多喷装备与损失经验的危险在游戏中维持他们的邪恶形象。

5.在执行任务时的死亡几率:
    由于本作中将设立很多冒险性相当强的任务,比方说许多冒险者任务会要求玩家孤身潜入敌对方的腹地,小心翼翼避开NPC卫兵们取得某物品……大多数玩家在第 一次行动时不可能预知哪里有危险,很难避免不慎死亡的结局,还有就是一些“史诗性”的高级任务,高难度自然是带来高伤亡率,一场恶战下来遍地尸体应该是很 正常的现象。又不能保证在附近找到己方的牧师帮忙……而总体说来,本作中的死亡惩罚还是相当严厉的,这样就产生一个问题:如何避免玩家由于害怕死亡而不敢 尝试那些危险性较高的任务?
本作在此方面的设想为–把死亡本身设定为一种不太容易达到的状态。
    具体说来,对于大部分有难度的任务,游戏者在接下该任务的同时,可以取得一个护身符。在持有该护身符的情况下,游戏者只要是快被打死的时候,就会被自动传送回主城安全区中,同时护身符碎裂。
护身符可以去教会里修复,不过要花不少钱(教会比较贪婪),在任务完成取得奖励的时候,护身符同时上缴,任务结束。
    这样在游戏者接到任务的情况下,他几乎是不会死亡的,只是会被反复的强制送回主城,然后每次都花钱修理护身符,然后再跑回去……这就是尝试大任务不成功会遇到的麻烦,但游戏者本身很安全。
护身符不能叠加领取,因此会发给护身符的高级任务一次只能接一个……只有放弃该任务,缴回护身符,或者是超过时间,任务失败以后才能接其它高级任务。(因为有时间限制,相信也没谁会去同时接两个以上的高级任务。)

    游戏者是否能够接到一个高级任务,然后不去做任务而去练级打怪?
–可以,而且在此过程中也不会死亡,但是有一点:这些大型或高难度任务往往都有时间限制,除非游戏者对这个任务相当熟悉,并且很有把握,否则他浪费时间就将冒任务失败的危险。
–任务失败之后再重新接一个好了。
    也可以,不过能够接这类高级任务的游戏者,往往都已经是高级玩家,继续提升等级将花费许多时间。而任务本身则需要用大量的功勋值或者是贡献度来换取,游戏者花费那么多功勋值或贡献度,仅仅用来换取一段时间的练级安全,只会是得不偿失。
    当然,通常任务时间都会给的比较充裕,如果游戏者已经完成了任务,完全可以利用剩下时间舒舒服服的练极打怪,去做平时不敢做的冒险。但是,假如一个游戏者 能够提前完成并且交付任务,他原本就可以获得额外的金钱和经验奖励,甚至还可能有金钱买不到的好东西–例如生命宝石之类,所以游戏者们多半还是会选择尽 快交付。

邪恶的PK们不也可以利用这一点不死么?
–当然可以,但是有一点对PK们很不利–能够修理护身符的教会对于道德要求相当高,他们与PK的关系基本上等同于猫和老鼠那种,再加上护身符属于任务道具,无法交给别人帮忙修复,所以罪恶值高的PK们很难修复护身符。
    例如:某个玩家提前完成任务,一时得意忘形或是出于贪心杀了另一个玩家,罪恶值立刻上升到100,然后被人打回家去,他没有死,可是护身符碎裂了。于是他 去教会修理护身符,结果因为罪恶值过高,教会拒绝为他服务,于是到了该缴任务的时间,由于护身符碎裂,任务将可能失败,或者是只算部分完成,只能得到一小 半的经验和金钱奖励……该玩家唯一的解决办法是:他想办法自杀两次,把罪恶值降下来,然后再去修理护身符,上缴……得不偿失,这就是本系统所要达到的目 的。

    最后,这类高难度任务提前完成后的奖品中往往包括一颗生命宝石,所以做下来肯定是赚的,应该会有很多人抢着去做。

分类: 乱七八糟 标签:

从游戏玩家老龄化谈起

2008年8月30日 16hot 没有评论
   我有一个朋友,很早就开始玩游戏,玩了差不多20年的TV游戏,对于电脑游戏的印象还停留在暗黑年代.接触WOW后,感觉上手困难,就直接放弃了.按照他自己的说法,虽然还是很爱游戏,但是他的游戏心态已经很老了。

   对于新的上手系统,他已经没耐心去钻研了,5分钟之内没法上手或者上手后感觉不习惯,就很容易放弃了,所以他自嘲他这样的人,算是典型的老龄玩家了—— 年纪未老,也喜欢游戏,但是心态上充满了老年人的种种怀旧与拒绝新事物的特性。最典型的例子就是日本,日本游戏起步早,日本玩家类似的心态老龄化现象就非 常严重,因此超级马里奥的复刻版卖的很疯狂,疯狂到数量是同期发行新游戏的几倍。

  虽然没有调查数据,但是我相信,保持这样心态的人在 玩家群体里的比例是在逐渐但是大量的增加,这些人依然是玩家,并不会抗拒游戏,在做市场调查的时候,是被纳入了潜在消费群里作为估算的。但是他们其实总是 在抗拒新游戏,觉得没劲,而没劲的主要原因是他们已经钻研不进去,没有那个耐心和精力。

  由此产生的问题就是,作为网游也好, 单机也罢,游戏系统的复杂性通常是和游戏性成正比的,而游戏系统不革新,那么玩家不满意——革新了。老龄心态的玩家还是不满意。所以,如果有一款游戏能同 时兼顾主流玩家和老龄玩家,结合合适的推广和行销,那么就会迅速串红,并且经久不息。

  毫无疑问,这种类型的游戏,既要求上手系统简 单,又要求具有一定的游戏性。既能迅速的获得游戏乐趣的满足感,又能进行长期多次的重复体验。那么,什么样的游戏类型符合这个条件呢?还是我那个朋友,他 最近玩得最多的新游戏,是NDS上的触摸屏游戏,按照他的说法就就是,NDS好游戏,上手又快乐趣多。那么NDS上的触摸屏游戏又属于什么类型的游戏呢? 休闲游戏。

  实际上,对我来说这也可以解释,CS、星际、魔兽3一流行就流行这么多年——不是没有更好的游戏可以取代,只是大 部分的人拒绝去适应对他们来说已经变的陌生了的游戏系统和环境。这同样也能解释为什么很多被业内人士看好的游戏在中国就是流行不起来,而很多让人觉得总有 那么多缺憾的休闲类游戏可以变的很火暴。

   为什么? 因为休闲游戏其实是个合适的中间点。新玩家也好老玩家也好,主流玩家也好老龄玩家也罢,都能在休闲游戏中获得自己需要的部分满足。除了非常挑剔的人之外,一款能满足自己部分需求的游戏,总会吸引自己去尝试。

   最后说点毫无关联的话凑凑字数,一款网络游戏火不火跟游戏自身品质有什么关系我不知道,网络游戏死不死跟游戏自身品质大有关系。 而一款传统的MMORPG游戏公测当天在线连2万都没冲到的话,那么1个月后,基本很难保证有8千以上的平均在线。而收费后这个平均在线不到8K的话,国 产自己研发的游戏还可以混口饭吃,但是代理的游戏,那么基本就是亏钱了。当然,事先声明,我对游戏品质的定义是包括以下这些方面的: 1、画面 2、操作性 3、服务器端的要求(这个说法并不专业,大致想表达的意思类似什么样的配置支撑什么样数量的稳定在线) 4、技术问题的修补能力 5、游戏性——好吧,我承认,在我看来,休闲类游戏是最容易达到这5个要求的游戏类型了。

分类: 乱七八糟 标签:

企划制作守则

2008年8月30日 16hot 没有评论

1. 游戏不是给同样层级的人玩的。
2. 公司不是慈善事业,游戏是要卖钱的。老板出钱出名誉,千万尊敬。
3. 游戏好不好是对不对的起自己;适不适合是对不对的起消费者;卖不卖是对不对的起老板。至于被放在第一顺位的,应该不会是自己;如果能做出三方面都可接受的游戏,就是大赢了。

企划制作心态
1. 游戏是商业行为,不是艺术作品。
2. 通常的失败原因,在于企划无法具体表现要给人玩的是什么。有剧情、有画面,但是『玩』的部分在哪里?使用者是否好上手操作?企划人员对于游戏要有清楚通盘的认识,又不是要给人看电子书或是动画作品。
3. 企划如果不能在早期就把一切的交代清楚,只会让所有的组员做白工,更会加深别人的挫折,这是作游戏最忌讳的事情。
4. 游戏本来也可以成为创作形式,但现在的游戏制作已经脱离了单打独斗的时代,是集众人之力的创作,所以可以说是一种沟通妥协的艺术。在有限的时间资源人力能达到什么样的结果,是非常重要的。
5. 建议企划们多参加国际展览,藉由人与人之间的交流激发出更多元的创意
6. 营销的观点在于准时的重要。游戏出货延迟时,老板没法退费,厂商也不能退订,杂志的密集报导也会降温,多一个星期去为游戏加分是否能够提高大幅的卖量?不见得。将上现在盗版猖獗,反而伤害会更大。
7. 在制作小组中,每个负责的单位背景都不相同,企划、程序、美术、营销谁来领导谁?沟通妥协的艺术就在这边。企划不仅是要对上司,还要对组员,是否能明确的告诉所有成员要做的到底是什么,也同时能掌握每个人要的是什么,攸关游戏是否能顺利开发下去。

企划的功课:
1.游戏的卖点在哪里?为什么这个游戏可以卖?
2 .这个游戏要怎么玩?在构思一个游戏的时候,有没有事先在脑中已经玩过一遍了?
3 .技术瓶颈是什么?限制在哪里?什么可以做什么不能做企划是不是非常清楚?
4 . 企划书要怎么写?会不会写了一堆字却没人看?有写给自己看的:整个游戏的雏形,包括故事情节人物角色、怎么玩,连这些都没有就别享有下一步。给程序的:架 构、属性、流程,出来了就不要再变了。给美术的:图文件规格、是 2D还是 3D、表格有哪些、画几张图、相关类型、配置图,所有的数据都是量化明确可衡量的。
5 .一般游戏程序为了方便企划人员可以去调整游戏的流程 ,剧情事件等 ,会要求以游戏引擎方式来开发游戏 ,建立如地图编辑器 ,剧情编辑器或是事件编辑器来适当的区分程序设计人员与游戏企划人员 .
6 .在规划游戏内容时 ,要说服三方面的人马时 ,应该以不同的规划来说明自己的想法 .先以创意案来说服老板出资开发一套游戏 ,再以企划案与同事沟通 ,说明自己的想法 , 最后则是一份较详尽的设计案来向项目的同事说明各项设计规格 .
7. 如果你是刚进入公司 , 要考虑目前的环境 , 不要好高骛远 , 一开始的项目可以先磨练磨练自己及公司的同事 , 先让公司能够顺利的将投资收回 , 再去进行自己远大的理想开发一套心目中的好游戏 .
8.开发游戏时 ,要注意自己的游戏是卖给一般大众的 ,所以需要考虑的不仅是高等级玩家的品味 ,亦要考虑一般大众的思惟 ,毕竟游戏要卖出时 ,不是只给自己玩的 .
9 .项目在执行时 ,要注意各阶段的检查时间点 ,项目必须按照时程进行 ,才算有效的项目模式 ,必要时得有人扮黑脸 ,将部份功能修正或进行赶工 ,切勿延误整个产品的上市时程 .10. 项目的进行在不同公司有固定小组式或自各部门抽调人手的方式 ,各有优缺点 ,( 对于自己公司原有的方式 ,如果没必要 , 可以不用强加要求改变 , 毕竟这种制度算是很政治式的议题 , 不要让自己还没冲锋 , 就死在沙滩上了 )
11. 项目在规划时要考虑适当的研发人月 , 能考虑目前的现况 , 对人力做最有效的分配 .

企划营销部份
1. 目前游戏市场在上市的第一个月内大概就会销出全部销售周期的百分之八十的数量 ,因此对于营销人员来说如何在很短的时间内将产品讯息传递给消费者 ,就是目前最重要的任务 .
2. 一般的企划人员跟游戏相关的大抵可能是游戏厂商的营销企划与信息通路商的营销专员 ,一家游戏厂商的营销企划一年顶多有三至四个案子 ,但是通路商可能要负责数十个游戏推销上市 .
3. 对于游戏开发厂商来说 , 品牌经营可能是最需考虑的事 , 先把公司名称打响 , 对后续产品的推销是很大的助力 .
4. 对于通路商来说 ,对营销人员可以迅速累积不同产品的经验 ,是个不错的好起点 .
5 .口碑效果 = 产品力 x 营销力 , 如果有任一方是负值 , 对品牌会造成伤害 , 因此好的产品加上好的营销才能真正的获得玩家的口碑 .
6.对营销人员来说营销可分为四个领域 :平面媒体 (报导或广告 )/电子媒体( 报导 , 广告或社群)/店头 (立牌 ,海报或展示机)/ 活动安排( 除了活动本身吸引的人群外 , 也要被媒体报导 , 增加影响力)
7.营销动作对产品不外乎发挥四大功能 : 告知 ,吸引 ,说明及促成购买行为 .
8. 在设计游戏的封面时 , 要注意侧边及背后说明的吸引力 , 侧边可能要让玩家有从架上拿下来的动力 ,背后说明则是吸引玩家购买的另一个管道 .

分类: 乱七八糟 标签:

游戏的乐趣和任务设计

2008年8月30日 16hot 没有评论
曾有人问我,游戏是什么,我说游戏就是玩,他说是数据,谁也说不过谁。

我觉得游戏的本质应该就是玩。这个玩字当中又牵涉到了玩家的乐趣和兴趣。

我们的任务就需要满足玩家的乐趣和兴趣。好玩的,有趣的,奇妙的,动人,吓人的,都是属于乐趣。
而吸引自己的,符合自己思维习惯的,自己想学的,想玩的,想得到的,则是兴趣。

乐趣是游戏对玩家产生的感受,而兴趣则是玩家对游戏的感受。我们在游戏中不妨可以找到很多相关例子。

列如,玩家做某任务期望得到某高级技能,或高级物品,则是兴趣。自己想要,所以做个任务。
但是在做这个任务的时候,由于这个任务的剧情,方式等给了自己一些惊喜,或者感动,又得到了乐趣。

其实乐趣和兴趣还是可以统一在一起的。所以很多人在设计任务时,只考虑兴趣没有考虑乐趣,或者认为有了兴趣就有了乐趣都是不对的。前者是认为,玩家为什么要做任务是为了得到东西或者需要了解什么东西。后者认为玩家终于得到了东西就算是任务成功了。这些都是错误的

所以前者往往造成了设计者,往往先有一些东西,一些需求,所以决定做个任务来,列如,对于新手任务的理解就是,说几句话,给个东西,教会玩游戏。10级的时候需要学习某技能,所以搞个任务来给玩家,这样造成了,玩家必须要做任务才可以得到东西的必然。
后者往往造成了设计者在给出任务的时候千方百计为难玩家,因为由前者看出东西是必给的,为了不让东西给的那么畅快,或者说为了物品技能珍贵些,所以出了很多关卡来制造难度。

这些设计理念都是错误的。

可能我们需要一些需求,来保证物品或技能的珍贵。但如果从帮助玩家的角度来做则好的多。
列 如一把剑,我们先设定它很牛X,它被某BOSS所有,然后再设计各种可以对付这种BBOSS的方法,让玩家完成,列如BOSS的缺点。尽量让玩家感觉到: 我想要那把剑,但是BOSS很强,所以我找了几个NPC寻求到了帮助,得到一些东西和提示,然后自己努力干掉了BOSS,得到了剑。
错误的设计方 法是:先设计个BOSS,然后认为这个BOSS身上应该掉个牛X的东西,所以设计了一把剑,为了吸引玩家来拿这把剑,所以这把剑很强,而且或者其他任务也 需要这把剑,为了不让玩家那么容易得到剑,于是搞了几个NPC要求玩家得这样那样才可以杀BOSS。给玩家的感觉则是:那把剑不拿不行,但是又要接受 NPC给我的各种刁难,然后才可以杀BOSS,拿到剑……

这种观点可能会受到有些人的置疑,在于
1,帮助玩家和刁难玩家都需要设计出,玩家对剑的需求;获得剑的难度。所以认为本质上不会有不同(我认为是不同的)
2,帮助玩家和刁难玩家都是设想的玩家感受,不同的玩家可能感受不同,或者压根就没人那么感受。(我认为设计者的目的应该更能体现给玩家)
3,帮助玩家和刁难玩家可以同时进行。根据NPC的友善和邪恶来区分(这个我认为帮助玩家和刁难玩家的设计理念是策划层次上的设计观点,完全可以在这个层次上去设计NPC的善恶)

分类: 乱七八糟 标签:

闲论“角色属性自由分配系统”

2008年8月30日 16hot 没有评论
   曾几何时,角色扮演类游戏中出现了这么一种机制:游戏角色成长之后获得的能力提升值,可以由玩家自由分配在对应的属性上(通常为力、敏、智、耐);也就是 说,玩家可以按照他们想要的方式自由地塑造角色。此机制名曰“角色属性自由分配系统”。后文为简便起见,统称“自由系统”。

  若要考究它的由来,也许最早见于暴雪旗下的《暗黑破坏神》,又或者有更早使用这种机制的游戏而笔者未尝得见。不过这些都不妨碍大题,总之,于国人来说,此机制出自于某知名公司的某知名游戏,是没有疑义的。

  近些年的刮起的“国产网络游戏业的腾飞”风潮,使得一时间涌生了许多效仿先贤的“大作”,时时以继承传统为己任。其中一个佐证便是大作们都责无旁贷地继承了“自由系统”,没有丝毫的疑虑和不同的意见,仿佛“游戏便当如此”、“无之不足以成游戏”般。

   然而我却有些不同的看法,先贤们暂且不去议论,对于网络游戏,我认为“自由系统”并不适用。看到这句话之后,全中国3000万的游戏同胞们,自然都可以 跳出来大呼一声“我要自由”,来驳斥我的观点。诚然,“我要自由”是一句何等雄壮的话;但不要忘了自由总是相对的,且时时都受到环境这些客观因素的限制。 譬如独自一人玩搭积木,自然可以随意摆放之;但是如果是两个或者更多的人一起搭积木,那就必须事先商定好规则,互相不能破坏对方的建筑、不能抢夺对方的原 料等等……因为倘若随意给某人完全的自由,那么就很有可能给其他人带来不自由的体验。可见,对自由的限制尤其体现在多人参与的活动之中,比起自由,多人活 动更需要的是秩序。

  “自由系统”之于网络游戏,恰是秩序的破坏者。 纵观一下玩家群体中的“职业不平衡”论者,皆是针对网络游戏的;单机的角色扮演类游戏中,虽然也常常是职业林立,且各职业间的平衡也未必做得较网络游戏好 些,但是独不见针对他们的评论者,何故?笔者认为缘于单机游戏缺少了网络游戏中玩家间的竞争性,没有竞争,自然无强弱可言了。评价一款网络的缺点,时常便 带着“职业不平衡”这点,而影响这职业平衡的“罪魁祸首”就是那“自由系统”。

   职业平衡通常的做法是给每个职业设立相对的强项和弱项,这样每个职业给玩家的感觉都不会是完美的(但对于设计者来说是完美的)。譬如传奇中的法师,攻击 能力高、机动性强、灵活是他的优点;而耐久能力较差,血少不抗打便是他的弱点。但如果传奇里使用了“自由系统”,使用法师的玩家们,十有八九会在其耐力的 培养上下功夫,弥补其先天的不足,那么,一个BUG职业就这样诞生了……这是自由系统不适用于网游的第一点原因。
第二点原因就是“自由系统”严重 破坏了职业的个性。设计者在设计职业的时候,鉴于游戏背景、气氛以及常识等一系列的因素,对各职业都有一个明确的定位。这些定位都是游戏中烘托游戏背景和 气氛的基石。譬如说同为近战攻击型职业,战士的优势就应该在力量和耐力,而盗贼的长处则体现在敏捷性上;但如果把“自由系统”应用上,则完全有可能出现战 士不象战士,盗贼不象盗贼的情况。而这种混乱的职业差异性未必会对游戏性有什么益处。综上,“自由系统”完全不适合网络游戏。

   是什么原因让设计者们毫不犹疑地把不适合的系统应用在网游中呢?这恐怕要追述到信仰问题上。各行各业都有他们自己的信仰:木匠们崇拜公输班,屠户们供奉 张翼德,搞商业的言必谈比尔•盖茨,大抵如此。中国是游戏业的后进国,后进学习先进本是无可厚非的事,那么生在美利坚的暴雪作为行业 的翘楚,自然成了中国3000万游戏同胞乃至游戏设计者们的信仰对象。中国向来有一种传统,便是对于贤者们的言语和手段必须深信不疑,依教导而行事的,倘 若露出半点犹疑的神情,那便是毁谤的圣贤。但贤者们的手段往往是此一时彼一时的,这就常常造成误差。据说三国时刘备入西川的时候,军师孔明制订了一系列严 苛的法令;这时就有一个叫法正的跳出来鸣不平,大约说的是秦朝因苛政而灭亡,汉高祖刘邦建国之后一直采用“中庸”的养国利民之道,为何孔明如今要使用秦的 亡国之道之类云云。孔明就说了,高祖采用仁政是针对秦的暴政的医治,但仁政仁得久了,便要生出许多偷食国家的蛀虫来,汉朝正是因为此而衰弱,所以要用严厉 的法令来整治蛀虫们……

  可见要正确学习先贤的手段,还得明白其中的 道理。还好中国的贤者们有一个最大的优点,就是每次改变政策的时候都会告诉世人其中的道理。外国的贤者们就未必有这么主动了,基督教不就偷偷地修改过几次 教义么?把新约旧约中一些不合理的地方偷偷抹去了……对于“自由系统”的利弊,想必暴雪也是有觉察的,诸君不见《魔兽世界》中已经没有这个机制了么,不 过,给予玩家一定的塑造角色的自由,想必也是好的,于是乎魔兽中有了个“天赋系统”。

分类: 乱七八糟 标签: