Monday, December 28, 2009

足球小将—只不过是热血漫画

几天来把《足球小将》看了一遍。
以前基本上看得很少,只在《画书大王》上看过开头的几节,后来内地的单行本(当时应该是没授权的)买过一本。那时候觉得还不算离谱,情节设计上还不错。
几年前看了世青篇,开始觉得这个漫画已经向魔幻方向发展了,虽然情节上还是不错的,但是作者对于足球本身或者是真实的比赛的了解实在是离现实太远——好好的足球场成了格斗场和马戏场。而且你永远搞不清楚足球场究竟有多大,某个队员究竟在球场的什么位置。
在描写比赛的情节中,高桥阳一的很多设计是非常失败的。任何球队的教练从来不会作出有效的战术设计,只知道加油鼓励和说几句空话。所有的优秀队员性格都是一样,阳光的热血青年,胜不骄败不馁。
高桥讲故事的能力也值得商榷,日式漫画经常通过构图和对话来表现情节,一般极少出现大量旁白,而高桥在描写比赛的时候大量依赖旁白,这几乎是明显的港式风格,与同是体育类漫画大师的井上相比功力不可同日而语。
高桥的风格不是写实一派,人物除了发型和体型几乎很难区别。在世青篇及之后,高桥的画功似乎出现了严重的问题,人物的头明显偏小,多数人的腿部发育过度。
《足球小将》不容质疑是一部经典之作,在它诞生的时代是史无前例的。但是对于懂一些足球球迷来说,或者对于十几年之后的体育类漫画发展状况来说,还是把它当做一部纯粹的青春成长热血漫画好了。也许你把它当成类似《圣斗士星矢》的漫画会好些,热血的段子很适合煽情。可以喜欢其中的人物,其中的精神,但是无法认同其中的体育。

Wednesday, December 23, 2009

空虚的时光


想用力感觉用不到点上。


太艰苦了。


Wednesday, December 09, 2009

超级马里奥兄弟的零碎回忆

Super Mario Brothers
超级马里奥兄弟
142.超级马莉1无敌版_001

也可以翻译成“超级玛丽”之类的,虽然那个大胡子跟玛丽这个女名明显沾边。路易这个名字就这样被完全忽视了。
《超级马里奥》这个游戏似乎是很难的,其实评论一个游戏的难度还是要有些顾虑的。比如像《魂斗罗》这种游戏,死掉一条命当场就可以重来,而《超级马里奥》必须从关卡的最开始或者中间某个固定的地方重来。通关《魂斗罗》的人在大街上一抓一把,但是通关《马里奥》的恐怕就没那么多,这与游戏本身死掉一命时的处理方法关系是非常大的。
正宗的超级马里奥一代究竟有多少改版,现在已经弄不清楚了。确实存在的应该有:
黑夜版,地面为发泡样子的;
梦幻版,画面有一半左右是幻影的。
马里奥这个游戏有很多细节和传言是应该值得注意的。例如:
游戏中第3关和第6关是黑天的。
游戏中除了所有第4小关和第8关的全部外,每个小关都有一个中间的复生地点。
传说每个小关都有一个加命的蘑菇,这无疑是一个欺骗广大少年儿童的可怕谎言。根据现在网上的高手总结,全部的加命蘑菇在这里:http://tieba.baidu.com/f?kz=138936718
8-1关是最长的。
小时候我很害怕那些扔锤子的绿色动物(似乎是鸭子),因为非常难对付,背上似乎还长着倒刺,很难直接踩到。
超级马里奥2
究竟有几个超级马里奥2?这件事情看来谁也说不清,因为甚至有不少人认为FC上的《水管工马里奥》是1,而《超级马里奥》才是2。
当然这并不是什么大问题,究竟哪个是超级马里奥2也没关系。有一部更换过全部关卡,路易跳的远比马里奥高的官方发行版,目前被认为是正宗的2代。这个版本里面有一种蘑菇是有毒的。由于关卡的重新布置,难度也远比1代要大。
马2选关_001

你看到标题上大大的"2"了吗?
但是下面这个?
Super Mario Bros. 2 (U) (PRG1) [!]_001

N社你的2也不是随处乱放的。这个版本似乎在某些地区被称为4,这基本是完全的胡扯。在这款游戏里面,你可以选择4个角色。马里奥毫无特技,路易弹跳惊人,蘑菇头力气大,公主可以漂浮。在地上蹲一会可以跳高,必须拔东西才能攻击。这一代里面生命的增加也显得小气,通过魔法门可以找到蘑菇,好吧除了头两关的我基本不知道别的蘑菇在哪里。
超级马里奥3
Super Mario Bros. 3 (U) (PRG0) [!]_001

这是一个疯狂的,杀人不见血的,不要命的游戏。
超级马里奥3是N社历史上经典中的经典。不要说N社的东西都是经典,他们炮制出的垃圾绝不比任何一家烂公司少,但是N社的强大就在于惊人的骗钱能力。
扯远了。超级马里奥3的流程非常之长,共8大世界,如果完全打完大概需要数个小时。马里奥在这次有很多装备,比如浣熊,铁锤,青蛙之类。这一代中的秘密非常之多。说不定什么时候就能顶到一些不靠谱的东西。马里奥的头再次有效了,而且还能飞了。
这几部作品在SFC上均有复刻,某些操作变得简单了。无疑是在骗钱。
这个系列在FC上的回忆暂且中止,如果想玩的话,推荐使用Vnes模拟器。Nestopia对马里奥一代的支持似乎有些问题。金手指请多多使用。

SDL & Object Pascal (Delphi) [3] 制作一个选单

一个选单大致是这样:

1.可以被以某种形式呼叫出来,如按下esc;
2.在这个选单中功能键有不同的定义,如原本方向键控制走路,但现在改为控制光标的位置;
3.按下确定键后有对应功能被执行;
4.可以被关闭。

那么我的办法是编写两个子程,其中一个处理选单中的事件,另外一个专门负责画选单。

在从步行切换到选单的时候,可能需要清除当前的键值。如果步行中使用了SDL_EnableKeyRepeat方法把键盘的频率变高,对于选单来说就太快了。所以可能要在调用选单之前写上:

SDL_EnableKeyRepeat(0, 0);
event.key.keysym.sym := 0;

这样降低了键盘的反应,同时清除当前的键值,要不然呼出选单之后它可能还会自己转一会(如果之前用了PollEvent方式,我还没搞清楚原因)。不过如果在行走中使用的是WaitEvent方式,事情就会简单很多。PollEvent方式看来是太快了,在选单中不合适。

处理选单事件的子程:

procedure MenuSystem;
var
  menu: integer;
begin
  while (SDL_WaitEvent(@event) >= 0) do
  begin
    case event.type_ of
      SDL_QUITEV: //这里处理窗口退出事件
        if messagebox(0, 'Are you sure to quit?', 'KYS Windows', MB_OKCANCEL) = IDOK then Quit;
      SDL_KEYUP:
        begin
          if (event.key.keysym.sym = sdlk_down) then
          begin
            menu := menu+1;
            if menu > 3 then menu := 0; //按下下键的溢出
            showMenusystem(menu); //每次当前选中发生变化时, 均重画选单
          end;
          if (event.key.keysym.sym = sdlk_up) then
          begin
            menu := menu-1;
            if menu < 0 then menu := 3; //按下上键的溢出
            showMenusystem(menu);
          end;
          if (event.key.keysym.sym = sdlk_escape) then
          begin
            break; //按下退出键
          end;
          if (event.key.keysym.sym = sdlk_return) or (event.key.keysym.sym = sdlk_space) then
          begin //按下确定键
            case menu of
              2: MenuQuit;
              1: MenuSave;
              0: Menuload;
            end;
          end;
        end;
    end;
  end;
end;

显示选单的子程,里面有一些其他的东西,不必太在意:

procedure ShowMenuSystem(menu: integer);
var
  word: array[0..2] of Widestring;
  i: integer;
begin
  Word[0] := ' 读取';
  Word[1] := ' 存档';
  Word[2] := ' 退出';
  if fullscreen = 1 then Word[2] := ' 窗口';
  ReDraw; //你需要自己写一个清屏子程
  for i := 0 to 3 do
    if i = menu then
    begin
      drawtext(screen, @word[i][1], 64, 32+22*i, $FFFFFF)); //当前的项显示为不同的颜色
    end
    else begin
      drawtext(screen, @word[i][1], 64, 32+22*i, $00FFFF);
    end;
  SDL_UpdateRect(screen, 80, 30, 47, 93); //根据区域而定,如果觉得麻烦就更新全屏
end;

SDL & Object Pascal (Delphi) [2] 显示中文字符

一些基础的问题我不再赘述了,查阅帮助文档(Object Pascal SDL Doc.chm)显然比在这看我胡扯合适得多。那些画像素,获取像素信息,显示BMP文件多数时候只要把那些代码复制过来基本就能工作。下面说的是怎样显示中文。

其实SDL加上ttf支持时(需要将对应的dll文件添加到工程目录里)是完全可以显示中文的,简体和繁体都没问题(Object Pascal版本也不缺功能),但是只能用Unicode编码。这就是说,你必须选择一个Unicode编码完整的字体文件(或者说至少你需要的那些字符是完整的)。Windows下面这样的字体有很多,我推荐的有:

简体中文:宋体大字符集,微软雅黑;

繁体中文:细明体,微软正黑,标楷体。

这些基本是中文地区最重要的几种字体。一个缺憾就是用于显示简体中文的楷体(和其他字体)优秀的并不多。

输出中文时,可以先写这样的一个子程作为基础:

procedure DrawText(word: PUint16; x_pos, y_pos: integer; color: Uint32);
var
  text: PSDL_Surface; 
  dest: TSDL_Rect;
begin 
  text := TTF_RenderUNICODE_blended(font, word, TSDL_Color(Color));
  dest.x := x_pos;
  dest.y := y_pos;
  SDL_BlitSurface(text,nil, screen, @dest);
  SDL_FreeSurface(text);
end;

screen就是已经定义好的那个主屏幕的标记。font是一个指向字体文件的指针,可以这样定义和初始化:

全局变量:
font: PTTF_Font;

在初始化状态的子程中:
TTF_Init;
font:=TTF_OpenFont('kaiu.ttf', 20);

当然font的定义和初始化写在DrawText里面也一样,只是写在全局变量里面就可以只初始化一次,可能会效率高一些。同样把DrawText里面用的那个text写成全局变量也是一个选择。在程序结束时,还要释放这些资源。

kaiu就是标楷体的文件名字,20是字号,需要把字体文件也放在工程目录里面。

TTF_RenderUNICODE_blended这个函数是以blended效果输出文字,以TTF_RenderUNICODE开头的函数有3个,对应的是不同的效果。

SDL_BlitSurface大致可以理解为在“表面”上再贴一层。

调用DrawText的方法如下:

str: WideString;
......

str:=' 这是一个显示中文的测试';
DrawText(@str[1], 100, 100, $FFFFFF);
Sdl_UpdateRect(screen, 0, 0, screen.w, screen.h);

注意一定要用WideString(或PWideChar)类型!

str前面我添加了一个空格。这是因为我发现有些字体中的某些字符似乎包含自动缩进(原因不明),它们在作为首字符时整个字符串会右移,于是我干脆把首字符全都设成了空格(如果有人知道原因以及更好的解决方案,还请不吝赐教)。100,100,$FFFFFF就是位置和颜色了,这里我是随便写了一个颜色(应该是白的)。最后那句就是更新屏幕上的一个矩形区域了,不更新是不会有效果的。

如果用WideString类型的话,str的第0位保存的是字串长度,所以用的是str[1],由于DrawText的第一个参数是指针所以加了@。这个调用方法似乎有点别扭,当然如果在DrawText里多写几行代码也可以有其他的封装方案。

这样做基本上显示中文就可以了。但是有时你可能面对已经做好的资源文件,里面使用了其他的编码方案,比如繁体地区常用的Big5码。这时需要用到一个API函数 MultiByteToWideChar 。

这个API的参数还是有点麻烦的,可以写一个函数将它封装:

function Big5ToUnicode(str:PChar): widestring;
var
  len: integer;
begin
  len:=MultiByteToWideChar(950,0,PChar(str),-1,nil,0);
  setlength(result,len-1);
  MultiByteToWideChar(950, 0, PChar(str), -1, pwidechar(result), len+1);
  result:=' '+result;
end;

MultiByteToWideChar(950, 0, PChar(str), -1, pwidechar(result), len+1) 各个参数含义:

950:码表,950即Big5和Unicode的对应表;
0:这一位写0就可以了;
PChar(str):字符串的地址(这里又用PChar强行转换了一次,应该没必要);
-1:字符串长度,如果是-1就会自动计算长度并转换到字符串结束;
pwidechar(result):保存结果的地址;
len+1:缓冲区大小,如果为零函数就返回需要的缓冲区大小。

在Big5ToUnicode函数中MultiByteToWideChar使用了两次,第一次是计算所需缓冲区大小,第二次才是正式的转换。结果的长度设成多少需要实验一下,因为结尾或许有不想要的字符。但是不能不设或设成0,这样result并没有获得地址分配,转换会出错。至于后面在结果前又加了个空格,就看效果而定了。

在这里形参并没有用String而是PChar,是因为从资源文件中读出的数据不一定是读到String里面,甚至可能读到整数数组里,使用@算符传入地址就可以了。后面还可以利用这两个函数再写一个DrawBig5Text。

如果是GB2312,码表号是936。大部分的转码软件都是使用了这个API,GB2312与Big5的互相转换也是通过Unicode进行的。

同样还有一个WideCharToMultiByte的API,用法是类似的(Char和WideChar的位置当然相反),但是后面的参数多了两个,如果不知是干什么的可以都写成nil。

这个API是Windows提供的,所以这是在Windows下面比较简单的实现方法。但是如果作跨平台开发就不适合了。

最后是整个程序的代码。需要注意的是这份代码并未对打开设备失败进行处理。在你正式编写一个游戏时,判断一下经常是必要的。

unit myfunctions;

interface

uses
  sysutils,
  windows,
  sdl,
  sdl_ttf;

procedure Run;
procedure DrawText(word: PUint16; x_pos, y_pos: integer; color: Uint32);

implementation

var
  screen: PSDL_Surface;
  event: TSDL_event;
  font: PTTF_Font;

procedure Run;
var
  str: WideString;
begin
  SDL_Init(SDL_INIT_VIDEO);
  screen := SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE or SDL_DOUBLEBUF);
  TTF_Init;
  font := TTF_OpenFont('kaiu.ttf', 20);
  str := ' 这是一个显示中文的测试';
  DrawText(@str[1], 100, 100, $FFFFFF);
  Sdl_UpdateRect(screen, 0, 0, screen.w, screen.h);
  while SDL_PollEvent(@event) >= 0 do
  begin
    if event.type_ = SDL_QUITEV then break;
    Sdl_delay(10);
  end;
  TTF_Quit;
  SDL_Quit;
  exit;
end;

procedure DrawText(word: PUint16; x_pos, y_pos: integer; color: Uint32);
var
  text: PSDL_Surface;
  dest: TSDL_Rect;
begin
  text := TTF_RenderUNICODE_blended(font, word, TSDL_Color(Color));
  dest.x := x_pos;
  dest.y := y_pos;
  SDL_BlitSurface(text, nil, screen, @dest);
  SDL_FreeSurface(text);
end;

end.

SDL & Object Pascal (Delphi) [1] 配置,第一个视频窗口,关闭

在Delphi下面配置SDL是非常简单的,因为有一个组织(JEDI)连安装程序都做好了。

你可以到这个网站http://www.delphi-jedi.org/,下载一个JEDI-SDL的安装程序。文件的名字是[JEDI-SDLFullSetup.exe],安装就是了。当然你事先要有一个Delphi,我用的是7,其他版本的我还真不清楚。

不过要想你的游戏能正常运行,你还要去下载SDL的DLL文件,这个建议你到SDL的主页去看看。如果需要image,ttf,mixer等其他的支持,可以到这里http://www.libsdl.org/projects/。之后你要把你用到的部分放到你的游戏目录里面。当然嫌麻烦的话放到系统目录里面应该也可以,不过据说现在很多人不喜欢往系统目录里面放东西。

这些都做好了你就可以试着编写一个使用SDL的Delphi程序了。我第一次做的时候是选了一个新建控制台程序,这样打开游戏的时候会有两个窗口。这倒不是问题,至少你可以随时把

{$APPTYPE CONSOLE}

这一行注释掉取消那个控制台窗口,但是我建议你还是暂时留着。至少控制台窗口的关闭按钮是随时都有效的,而SDL的主窗口的关闭按钮却不一定随时能用,在编写和调试阶段还是很方便的。

这时你有了一个dpr文件,如果把所有的函数与子程全写到这里当然不成问题,但是我认为更好的办法是把子程全写到另一个pas文件里,再在dpr文件的uses部分添加这个pas文件。因为在dpr文件里面我还没搞清楚能不能用函数预声明,如果不能的话就只能引用前面已经写好的部分,这无论如何不是个好的选择。而pas文件里面随意性就大得多。

这样你的dpr文件的内容大致应是这样(这里的语法加亮不行,凑合着看吧):

program MyGame

{$APPTYPE CONSOLE}

uses

  SysUtils,

  windows,

  Dialogs,

  SDL,

  myfunctions in 'myfunctions.pas';

begin

  Run;

end.

而myfunctions.pas文件里面应有这样的内容:

unit myfunctions;

interface

uses
  sysutils,
  windows,
  sdl;

procedure Run;

implementation

var
  screen: PSDL_Surface;

procedure Run;
begin
  SDL_Init(SDL_INIT_VIDEO);
  screen:=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE or SDL_DOUBLEBUF);
  while true do
  ;

SDL_Quit;      
  exit;

end;

end.

uses里面加上Windows和Sysutils显然是必要的,因为我们可能还需要Windows的API。调试中如果想用showmessage显示一些结果的话还需要Dialogs,它比MessageBox还是方便很多。

全局变量里有一个screen,用它作为最主要的画图板,其余的画图板可以在使用的时候由子程定义。至于类型译成“SDL表面指针”看来也并不合适,不过没关系,知道它是做什么的就可以了。

SDL_Init(SDL_INIT_VIDEO)的作用是初始化视频系统,SDL_INIT_VIDEO其实是一个定义好的常数。一般这样用大致是可以,但是一个较为正式的用法应是这样:

if (SDL_Init(SDL_INIT_VIDEO)<0) then  
  begin      
    MessageBox(0, PChar(Format('Couldn''t initialize SDL : %s',[SDL_GetError])), 'Error', MB_OK or MB_ICONHAND);
    SDL_Quit;      
    exit;  
  end;

就是尝试初始化视频系统,一旦失败用MessageBox输出错误消息(SDL_GetError),并退出程序。不仅是视频,其他的许多比如初始化音频时都应该添加类似的判断。我在这里略去了这部分是为了让代码看来清晰一点,但是你如果真的动手编写一个游戏的时候,判断一下无疑还是必要的。

而在初始化视频之后,还需要一个窗口显示游戏画面,就是

screen:=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE or SDL_DOUBLEBUF);

这一行的作用了,前面3个数字是屏幕的分辨率和色深,后面就是初始化的一些选项了。这里用的两个选项是在显存中生成画面并使用双缓冲,可能是要求比较高的一种,其实用 SDL_ANYFORMAT 和 SDL_SWSURFACE 也许就能满足多数情况。这里就不再一一解释这些选项的含义了,可以查看SDL的说明文件。

这样就获得了一个640*480大小的窗口,并用screen标记它。

再往后是一个死循环,这只是为了让这个窗口保持住,否则再执行下去,SDL_Quit 加上 exit 谁都知道代表什么含义。当然我们并非是真的需要一个死循环,一个游戏所需的循环应是这样:

1 如果接收到指令
2 执行指令
3 返回1

在执行指令这里应有:

如果指令为“退出”,则退出循环。

把原来的死循环这样改写,并在全局变量里面添加一个event:

event: TSDL_event;
  ……

while SDL_PollEvent(@event)>=0 do
  begin
    if event.type_=SDL_QUITEV then break;
  end;

event是定义用来接收游戏的消息(事件)的,任何游戏都应该有这样的一个变量(而且似乎只能作为全局变量或者在最初的子程序中定义,这一点我还并没确定)。而PollEvent就是用于查询的,@在Delphi中是取地址算符,因为SDL_PollEvent的参数是指针类型。

通常可以用两种方式进行查询:

SDL_PollEvent:直接查询。返回值为0表示未查询到事件,大于0表示有事件。无论查询结果如何,程序都会继续执行。

SDL_WaitEvent:等待查询。与上面的区别是如果未查询到事件,会使游戏的流程停在此句。

何时使用这两种方式需根据情况决定。如果你觉得某些情况只需处理按键(比如在选单内部),那么Wait方式会好一些;而如果在没有事件的时候你需要一些自动效果,Poll方式也许更适合。

循环中的判断就是:一旦发生关闭窗口事件(SDL_QUITEV,注意在说明文档里面写成了SDL_QUIT,这与SDL中用于退出的重要函数同名,显然是写错了),则退出循环。

这个程序在执行时可能会占用CPU过大,这时可以在每次循环时让CPU休息一下。在while内
部加上一个:

Sdl_delay(10);

即可大大降低CPU的占用,这可能会带来10毫秒的延时,但不会真的有人在乎吧!

SDL & Object Pascal (Delphi) [前言]

这个系列最早发布在blogspot上,我一直以为已经转过来了,今天发现并没有。

那就转一次吧,现在blogspot基本上已经不再管了。

实际上这个名字叫[SDL & Delphi]也不成问题, 因为除了Delphi似乎也没有哪个流行的开发工具用的是Pascal语言。

SDL其实我也只学了不到两星期而已。刚开始我想试图用VC,因为这样资料最全,也很好找,但太久没用VC现在看C的代码有点困难(->这个算符是干吗的来着……)。其实作为一个专业不是计算机的人,平时写一些程序都是用Delphi,这样我不必在界面上费劲,至于VC虽然用过但扔了很久了。后来我发现SDL有Object Pascal版本,就安装了一个,觉得用起来还是很方便的。

当然我说过我只是个业余的,所以我使用的一些代码可能不太正规,至少变量的匈牙利命名方法我是很少用的,只是我嫌打字费劲。还有我用的一些实现方法也许有更高效的方案。但我还是想把一些使用上的经验和走过的一些弯路写在这里,大家参考也好,找找毛病也好,我都是欢迎的。

Thursday, November 19, 2009

Matlab符号计算的bug



根据Matlab网站的bug报告,链接如下:


http://www.mathworks.com/support/bugreports/523801


内容摘要:


Summary

On Windows, the command syms x hangs MATLAB or takes
minutes to finish.
Description

The MuPAD kernel can take several minutes or longer to
initialize on Windows. Any command from the Symbolic Math Toolbox
that requires starting MuPAD might seem to hang.
Workaround

The attached zip file contains the instructions and libraries
needed to change R2008b or R2009a to create an in-process MuPAD
kernel for symbolic computations. Download the file and extract it
to begin the installation.
Fix

This bug was fixed as of R2009b.

看来bug存在于2008b和2009a之中,解决方法:下载链接中的附件并使用,或者使用2009b……推荐后者,可以在64位系统下使用符号工具箱,一般来说,原生的64位程序的效率值得期待。

………………………………自从取消了某个开发网站的订阅之后清静了很多………………………………

Tuesday, November 03, 2009

超级恶搞的热血格斗漫画《魁!!男塾》

大概上小学的时候这部漫画开始在大陆出现,名字叫《决斗士》,上面的作者还写着车田正美。
当时对车田的了解还仅限于《风魔小次郎》和《圣斗士星矢》,倒是从小道消息知道车田有部作品叫《男阪》,这么说书中反复提到“男塾”这个名词也还算靠谱。
当然这部漫画绝对不是车田的作品,原本的作者宫下亚喜罗在日本也算一个名家,当时只是盗版书商为了多卖几本写了个大陆读者熟悉的名字而已。而且这部书在大陆可能也是第一个按照日文原装分卷的,日本的漫画一卷大约200页,而《圣斗士星矢》《龙珠》等在引进时都是每本100页左右。
扯远了。这部漫画是一部典型的热血格斗漫画,但是里面对中国功夫有很多超级不靠谱的恶搞。当出现什么功夫的介绍的时候,往往就是出现一个照片,配上图片,加上一些文字说明,说明这种功夫的来源和传说。照片是功夫的创始者或者名家,不过据说多半是从报纸上剪下来随便涂改一下的,这人什么时候被告侵犯肖像权也不是什么稀奇事。民明书房是这些恶搞资料的一个重要出版商,这个书房当然只是漫画里面杜撰的,但是日本人还真出了一本书介绍这个出版商,全民恶搞真是无极限啊。
那么扯扯漫画本身吧。
首先是我认为漫画里面最强的几个人物:
江田岛平八。似乎没败过,被形容像是斗神阿修罗的化身。这老头真是够能折腾,在宇宙空间还能活下来。
大豪院邪鬼。男塾的一号人物,败给过江田岛和剑桃太郎。
剑桃太郎。似乎没败过,不过他赢大豪院是因为他天气知识比较丰富,功力还是不及的。
伊达臣人。用枪的高手吧,败给剑也是糊里糊涂。
藤堂豪毅。能跟剑几乎打成平手,天挑五轮大会的最后boss,后来改邪归正,实力还没怎么表现漫画就结束了。
情节是热血打斗,被打败的一方逐渐加入我方,原本我方和对方都阵亡了不少人,可是都是装死。我方的人数从4到8到16后来不知加了多少。看来宫下的几何级数学得还可以……
老实说,这部漫画充斥着武士道的精神和右翼思想,这个很难得到中国人的认同。不过里面对功夫的恶搞还是有些意思,尚可一看。
有空再扯别的漫画……

Thursday, October 29, 2009

几个变形金刚摆成这样还挺有感觉的

PA260013-


中间那个按照剧情是好人一方的老大,背对着我们的红色带金色尾翼的是动画中的第二任老大。没办法,这款老大没有枪,只有一个斧头,要不坐中间的不一定是哪个呢……


其实我想到的是《吞食天地2》的失败画面……


Friday, September 25, 2009

关于《幽城幻剑录》的随便写写勿当真

这个游戏大概是不错的。据说剧情是中文RPG中最强的,这个说法可能是真的。
不过我只玩了一遍,而且也完全没有体会出剧情的好来。并不是说剧情不好,而是主线完全被复杂的支线冲淡,完全没有连贯性。
让我比较失望的是在中后期,一个台阶的地方,为了剧情大概上上下下有十几次,实在是非常的繁琐。忍了过去之后,实在不想再来第二次。
也许它的剧情确实很强,画面效果也很好,但是很多不人性化的地方阻碍了它的普及。
总的来说,网路上对它的评价也比较极端,很多人认为它是最好的中文RPG,也有很多人被不人性化的地方吓到了。
有人拿它跟95年的《仙剑奇侠传》比较,认为它远远胜过,并且认为仙剑奇侠传只是因为在一个合适的时间出现了。
实际上这并不是事实,在没有Windows和DirectX的时代,《仙剑奇侠传》的引擎非常出色,在主频仅有66MHz的电脑上就能够流畅运行,并且基本提供了足够耐看的效果和适当的节奏。而同期的另一个经典《金庸群侠传》的表现则十分糟糕,游戏的效率极为低下。而需要依赖显卡加速的Windows时代的游戏就更加完全不要想,它们不可能出现在那个时代。

Thursday, September 17, 2009

MO



20090917046_thumb20

祖国版的MO也不好买啊……涂装实在不好看……

Sunday, September 13, 2009

让引擎适应游戏的杂事

让引擎适应游戏是一件很麻烦的事情。
据说微软曾经为了一个游戏《猎鹿人》运行不了就推迟了Windows XP SP2一个测试版本的发布。当然我们这些做山寨游戏的不能跟微软比。如果你看过《Windows编程启示录》(这本书的名字听起来很高深,但纯粹是一本八卦集锦)的话,你也能体会到微软很多时候的无奈。其实Windows不是那么糟糕的系统,把它搞乱的是那些糟糕的软件。

1. 《苍龙逐日》的错误语句
看过复刻版事件部分源码的朋友应该知道我在3号指令那里写了一段注释:

//这里应该是原本z文件的bug, 如果不处于当前场景, 在连坐标值一起修改时, 并不会同时
//对S数据进行修改. 而<苍龙逐日>中有几条语句无意中符合了这个bug而造成正确的结果

这个错误实在很令人抓狂。因为它仅仅出现了三四次,而且全都是邪线。

2. 《再破菠萝》的跳转口
在内场景主循环中处理跳转口的语句是在《笑梦游记》之后才弄清楚的。原版处理跳转的逻辑实在是莫名其妙,如果能一切重新开始,那么我会选择用一个指令进行跳转,但是在复刻原版和MOD的时候,你必须去适应已有的事件。

    if ((sx = RScence[CurScence].JumpX1) and (sy = RScence[CurScence].JumpY1)) and (RScence[CurScence].JumpScence >= 0) then
    begin
      PreScence := CurScence;
      CurScence := Rscence[CurScence].JumpScence;
      if RScence[PreScence].MainEntranceX1 <> 0 then
      begin
        Sx := RScence[CurScence].EntranceX;
        Sy := RScence[CurScence].EntranceY;
      end
      else
      begin
        Sx := RScence[CurScence].JumpX2;
        Sy := RScence[CurScence].JumpY2;
      end;
      InitialScence;
      Drawscence;
      ShowScenceName(CurScence);
      CheckEvent3;
    end;

至今甚至很多制作人也没能完全弄清原版的逻辑。

3. 内存相关指令
50指令中的25和26都是内存相关指令,在内存的诸多应用被破译之后,这两个指令的相关事件也多了起来。而复刻版无疑是不能支持这两个指令的。
源码中50指令的25和26部分都是特殊处理,在26指令中有一个类似下面的列表:

          $1D295E: x50[e5] := CurScence;
          $1D295A: x50[e5] := Sx;
          $1D295C: x50[e5] := Sy;
          $1C0B88: x50[e5] := Mx;
          $1C0B8C: x50[e5] := My;
          //$1D2956: x50[e5] := Cx;
          //$1D2958: x50[e5] := Cy;
          $05B53A: x50[e5] := 1;
          $0544F2: x50[e5] := Sface;
          $1E6ED6: x50[e5] := x50[28100];
          $556DA: x50[e5] := Ax;
          $556DC: x50[e5] := Ay;

而在25指令中,情况更加复杂,因为部分指令是直接读取内存获得物品的信息。

4. 特殊子程
在没有复刻版之前,一些特殊功能的子程是通过带参数的50 43来实现的。其中最重要的应用是新的获取物品和新的对话。
在测试《笑梦游记》的复刻的时候,我发现跳转时代的执行效率非常低,后来经调试锁定问题在新的获取物品指令上。这个指令似乎是直接读内存,在DOS版中效率很高,但是在复刻版中由于执行机制变得效率极低。后来我在43指令中添加了一个列表,即如果发现要执行的子程是“获取物品”,就直接用2号指令代替,因为2号指令我扩充过功能,更加强于50指令编写的事件,更重要的是效率更高。
在猪3中的这个列表似乎更复杂了。


5. 直接执行内部子程
这个就是50 49指令。我认为在我添加的9个50指令中,49指令是最伟大的(吹吹牛)。而在我的说明书中的那个任意转换场景的例子,实际上包含了非常复杂的汇编原理。
但是相比25、26和43,49指令是绝对没可能移植的,甚至给出一个列表也是非常麻烦,因为参数的个数就是很棘手的问题。所以如果你的MOD真的使用了50 49指令,那么在不修改事件的前提下进行移植,基本上是不可能完成的任务。
所幸50 49还未传开。
下面就是50 49的源码,以此记念这个特殊时期的产物。

; 调用系统子程
_instruct_32_31_CallProcedure proc near ; DATA XREF: dseg02:0005D0C8o
pusha
mov     eax, [esp+20h+arg_4]
shl     eax, 10h
xor     ebx, ebx
mov     bx, [esp+20h+arg_0]
add     eax, ebx
add     eax, (offset set_textmode-20000h)
mov     ebp, eax
mov     ecx, [esp+20h+arg_8]
mov     esi, [esp+20h+arg_C]
imul    edi, esi, 4
cmp     esi, 0
jz      short loc_5E6A8
loc_5E698:
movsx   eax, ds:word_120000[ecx*2] ; 变量空间
push    eax
inc     ecx
dec     esi
cmp     esi, 0
jnz     short loc_5E698
loc_5E6A8:
call    ebp
add     esp, edi
mov     ecx, [esp+24h+arg_C]
mov     ds:word_120000[ecx*2], ax ; 变量空间
popa
retn

目前所有MOD的复刻版源码

包括:
《苍龙逐日》《再战江湖》《乡民闯江湖(PTT)》《茗城版》《笑梦游记》《再破菠萝》《群芳谱》的复刻时的源码。
这些复刻的版本有些并不完美,毕竟多数时候是引擎去适应游戏。如果有高手可以利用这些源码将这些老MOD变得更加完美,那应该是一件好事。
几点注意事项:
1. 所有源码均由s.weyl编写,对游戏本身的引擎部分已经说明不保留任何权利,但是MOD的原始修改者应享有每个MOD与原版不同之处的保留权利。
2. 《苍龙逐日》《再战江湖》《再破菠萝》的引擎可能错误比较多,也有些特殊修改的部分。这三个MOD是最早复刻的,当时一些算法还未弄清。完善度应是依次递增。
3. 《笑梦游记》可能存在部分错误。
4. 《乡民闯江湖》《茗城版》均使用的较新的源码,即将整个源码拆成多个文件。
5. 因我并未参与后来《群芳谱》的制作,所以并没有较新的源码。里面增加武功个数的方法有一定的参考价值。

http://www.txdx.net/thread-428021-1-2.html

Tuesday, September 08, 2009

在勇者系列中出场的变形金刚

客串出场……Takara榨取剩余价值……

首先可以看看下面这个网页,介绍比较全面。

http://www.tfclub.com/art/200408020001_5822.html

下面看看一些其他的图:

image

image image

雷神,或者翻译成顶天者,汽车人总司令。

在飞机上装履带的……这年代不是多变没法混……

image

雷神在勇者中的客串出场,情节不知道,听说是老大中的老大。头部似乎有些变化。

image

音速爆弹,雷神的小弟,也是出来客串。

image

大恐龙萨拉斯,机体的细节还是很多不同的。萨拉斯在TF系列中很没存在感……

image image

撒克巨人,这个角色很有名,现在穿了一身马甲就出来混了。怪不得是最强头领战士之一,头部可以任意换的……

image image

其实最囧的是这个……著名的六面兽……玩具设计史上的经典,被涂成了这样……

Monday, September 07, 2009

Rodimus 的形象

图片取自tfwiki.net和mamao2.cside.com。

Rodimus Prime,中文译名补天士、洛迪文等,是擎天柱之后的汽车人领袖。之前叫做Hot Rod,中文多翻译为热破(也有叫火棒、高速马力、罗德等),是一个汽车人的年轻战士。据说现在Hot Rod这个名字的版权已经不归Hasbro了,所以目前的玩具系列都叫Rodimus,只是前后缀不同,热破叫Hot Rodimus,补天士叫Rodimus Prime(日本叫Rodimus Convoy)。

没错,Rodimus的特点就是橙色的跑车或者货柜车。加上火焰涂装(其实一个货柜车涂成这样真的挺囧的……)。

不像Optimus的形象(包括动画和玩具)已经成坨成灾了,Rodimus的玩具系列还是数的过来的。

image

配音:我是个领袖!!…………(这个电子星球上哪来的布啊!)

下面是Rodimus的动画形象,非常少……

image

《The Movie》中的热破,很年轻,当时似乎担任丹尼尔的保姆(保父?)。

image

《The Movie》中的补天士,似乎变老了,这时身高也跟擎天柱和通天晓一样了(说实话,通天晓的身高一直是个问题……这人相当于擎天柱身上加了几个零件居然跟擎天柱一边高……)。

image

《Energon》中的补天士。只有这部动画里面补天士是与擎天柱地位基本同一数量级的角色。补天士是传说中的英雄,在内战中带领部分人物离开塞博特恩去寻找新的家园,而擎天柱留下来带领汽车人继续抵抗。

image

08动画,这个片的造型很美式……好吧,这是个领导……

下面……没了……

稍微提一下,补天士手臂上的轮胎在《头领战士》中的位置有过调整。

image

 

下面是玩具的形象。玩具比动画还是多些的,因为无论Hasbro还是Takara,总是出些莫名其妙的系列骗钱……

image

image

G1的热破和补天士,车型都很完美(补天士的车小了点),热破的人形还能看,补天士的……据说美国人当时对日本的设计师保密,没说这个是领导……我靠,这个形象除了枪大似乎没啥好的……而且这两个怎么都不像同一个人……

image

《Rebirth》中的目标战士热破,除了武器可以变成小人,据说模具还有细小的改良。

image

这是啥??

image

image

美版和日版的经典热破。颜色和涂装不同,日版还有部分电镀。

这个是历史上最好的热破玩具形象。

image

黑色限定版……有资格出黑色版的角色不多,还是被老美当领导看的……

image

image

钛系列,这个气势终于像个领导了。不过后面那个黑色的居然另起了个名字叫“飞天虎”(就是G1霸天虎的汽车合体),弄得购买欲都没了……

image

经典2.0,好难看……

image

Alt系列……Ford的车型,人形看起来很零碎……

image

KP系列……前面不涂成火焰还叫补天士吗……

image

Energon系列,这个造型很有气势,在整个系列中也属于优秀的。只是不是跑车了,像一个奇怪的卡车头。这是一个经典形象。

image

08动画……这次大家一起异形,不差它一个……

image

这个角色叫火区,而且……它有个红色版……这个不是补天士,只是有些像。不能是个跑车涂个火焰就是补天士吧……

以下属于黑历史……

Takara制作完《胜利之斗争》之后,又设计了很多新的变形机器人玩具,与Sunrise合作制作了勇者系列动画,很多以前TF设计中后来未使用的机体在这个系列被使用了。不止如此,后来他们连出场过的机体都拿来用,比如《胜利之斗争》中的萨拉斯,《地带》中的雷神和音速炸弹。这个影响不大,毕竟这几个角色在TF系列出场不多还都只在日本发售。后来有一个重涂六面兽的,样子非常囧……

Rodimus的一个设定确实在勇者系列中被使用过,传闻这是《Return of Convoy》中的形象,但是没有采用,而且这个系列也是只有日版漫画没有动画。由于资料稀少,在勇者系列中的动画形象很难找。不过玩具照片找到了……看了玩具照片之后,估计动画形象也没有想看的冲动了,看到也绝对认不出来……

image

这个是设计图吧,变形应该是一个消防车,你见过消防车上涂火焰吗…………

image image

image 

依据tfwiki.net的记述,这个变形的设计是来自补天士的消防车形象,但是不同的是,一个救护车变成了机体的手臂。所以没错,这个就是客串出场的补天士…………

这个系列的另一个机体与星之擎天柱很像,可以和这个“补天士”合体,合体的方式是把这个拆了,作为几个零件拼上去……

Saturday, August 29, 2009

女友送的补天士


P8260481 P8290489



昨日与Hanne聊发少年狂,想去收一个补天士。前天在淘宝网上看到一个109的经典版热破,差点就下单了,后来一商量,决定先去他的实体店看看。


一大早睡得很死,敲门声都没听见……



大概10点一刻的时候出来,到了崇文门附近的搜秀动漫城,发现那家店居然还没开(开店的人也不勤快……)。在附近转了一圈,居然看到这家店主正在开张,就过去问,居然没有!又问他网上不是才挂出来不久吗,他说网上更新比较慢,这个东西早就没货了。在同一层楼上转了一圈,基本上卖变形金刚的店都问过了,还打电话问了一家店主没来的,都说没有这个。



吃饭时间到了,先找地方吃东西,发现一家呷哺呷哺开张大吉5折酬宾,觉得很划算就拿了一个号,差了150多位,无奈转了一会之后还是在旁边一家好像是韩式的店吃了午饭。受呷哺的影响,他们不得不5折,不过总觉得他们的5折不光是价钱,连配料都折了。



中午找了一个网吧,又上淘宝看了看别人的店,找了两家北京的,还在同一个地方,叫天美时尚购物广场,感觉那个地方是不是也是卖这些东西。于是临时取消了在搜秀再转转的想法,直接去了天美,在新街口附近。



坐了大概40分钟的111电车,又走了20分钟左右终于到了这个奇怪的购物广场,到了6楼连呼上当,这里居然没几家门面是开着的,那两家店也是关的,连看都没法子。照着店面上贴的名片打电话问,也是没有这个货,而且对网上为什么有这个的消息也装糊涂,实在非常不负责任。


想了想,也快4点了,还是回中关村看看,也快要吃晚饭了。



47路车回到了中关村的动漫城,这里还没搜秀大,卖变形金刚的店也只有一家,显然他们也没有。在海龙倒是有卖黑色钛系列补天士的,不过还不是我们心中想要的那个。



又来到e世界地下看看。中关村标着动漫的实际上都在做电玩,还是难找到玩具店。基本没啥希望的时候到了这里的唯一一家玩具店来问问,想不到这里的那位mm店主有个朋友也做这个,而且还小有名气。打电话过去,他说他那里至少有4款补天士。我们这时根本搞不清楚是哪4款,无论如何这也算是今天最后的希望了,我们还是打算去看看。



这时地铁里面的人多得不像话,随着人流转到了安定门,发现没有那个店主说的C口,从B口出去走了一阵,坐124路车,最开始还走反方向半站,又过到马路另一边等车。124来得特别慢,大约半小时才过来,上面全是人。我们这时很着急,又只有3站地,就挤在了车门旁边,车慢慢爬到了小经厂。


找店面时把价钱210记成了店面号,幸好没这个编号……



终于到了39号,想不到这个大胡子店主真的有经典版的日版热破,还有两个!弄不好全北京还在卖的也就这两个了,跟他砍价无论如何砍不下来,看来人家真的是不着急。把钛的补天士拿在手里看了看,还是决定买了这个经典热破。


想去吃半价的火锅,结果没赶上。这顿一定要补上。


回到宿舍已经11点了,趁着水热洗了个澡,到了一半还是冷了下来。


把经典热破拿在手里,实在爱不释手。


Thursday, July 23, 2009

DOS时代的问题

以下是dos时期很多人问过的问题,当然现在这些问题大部分甚至在dos开发中已经解决了。以下只是为了记住这段历史。

 

对z.dat文件的开发是艰辛的,在你玩到新的MOD的时候,不要忘记背后许多人无私的努力。
以下是我整理的在发展过程中曾被提出的一些重要的技术问题,多数加上了我的简单评论,通过它们你可以了解到MOD技术开发的一些历史。你可以发现问问题最多的几个人都是如今很熟悉的名字,这是他们当年努力研究的见证。
这些问题中的大部分如今已经得到解决,少部分被认为难以解决或无必要解决。

1.看到伤害计算公式能改变,不知能否让公式加入更多影响元素?因为武功多元性太少了,希望加入一些特色,让每个武功不再只是比较"威力范围格数"如此简单。
比如公式能加入命中率,记得R*中的武功栏有一些没使用的位址变量,可使用一个作为命中率,计算方式大概为:
假设命中率85,if 随机(0-100)<85 then 伤害正常,else 伤害 x 85%。
计算公式时能访问该武功的命中率,不知可行否?甚至能再加入更多影响元素。(guest)
已经由“伤害公式事件”实现。

2.能否实现主角从场景a,经由事件遣送到场景b,且出来大地图是场景b的外面?(KG)
已经由KG等研究实现,并在《笑梦游记》中获得应用。原理为动态修改跳转口。

3.能不能扩展道具的种类代号?举个例子,就像攻击分为,0点,1线,2十字,3面一样,把物品用参数分类,武器,防具,暗器,药材,特殊等原来有的之外再详细分类。(龙吟星落)
已经由“物品调用事件”基本实现。

4.要是能做出更强大的战斗系统就好了,比如增加攻击反噬、点穴等状态,或者可以判断玩家战斗后一共使用了几回合等。(南宫梦)
反噬效果已经实现。特别地,已经有人在研究其他特技的实现,点穴因需要增加太多内容可能比较困难。回合数判断已经由“战斗起始事件”和“回合结束事件”实现。

5.当玩家装备某物品的时候,自动修改一些内存地址,比如装备裘千仞的鞋子,则开启水上飘,加上您之前说的把改变内存地址放到r*中,下次读档自动改变,就可以做好多新的功能。(南宫梦)
已经由“读档事件”实现。

6.能不能实现使用一个物品便执行一个指定的事件?(南宫梦)
已经由“物品调用事件”实现。

7.那些“用毒”“状态”那些选单(场景地图里的)可不可以从调用Z.dat改为调用事件?(KG)
已经实现。需要阅读原版的反汇编文件并手动修改指令。

8.能不能把大地图读取进度取消。(南宫梦)
能。

9.我将人物的生命上限调到9999但显示起来很不美观,不知道有没有解决的办法。(孤山印月)
已经解决。

10.对话的头像边框能不能自定义长宽?或者只要自定义长度就好了,因为我要导入的新游戏头像都很大,我怎么切割都放不进游戏的框框里,除非缩很小,但游戏效果就很丑,很像被打烂的脸,主要是长度,宽度应该够。(guest)
能,但是“对话框修改器”中并没有这个选项,需要手动修改。或者改用新对话指令。

11.修改人物状态栏显示的属性及位置。(KG)
已经可以,但是需要手动修改,比较复杂。

12.可不可以把一些文件放到目录里,比如把所有npc战斗文件放到一个目录里,把所有声音文件放到一个目录里?发现很多人拿到修改档后找不到可执行文件。(南宫梦)
仅复刻版有过这方面尝试。

13.我发现当物品贴图的起始位置过于靠后的话,大地图上第一次显示物品图片还是不正常。(南宫梦)
以前的修改器中漏改了一个地址,此外需要修改大地图实际贴图个数。

14.能不能扩大战斗的人数呢?(KG)
不能,但是已经可以在人数不足26个的时候添加人物。

15.能不能实现函数或过程。(南宫梦)
已经由50指令中的43号指令实现。

16.可否利用现在的指令,另外写一套战斗事件,就是战斗不用去战斗地图。直接在场景地图上,这样可以在战斗中利用事件层触发事件,因为战斗靠新的战斗事件控制,则可以随意定义伤害公式,使武功有更多变数,比如斗转星移之类有实现的可能。(无名)
这可能是一个伟大的想法,但更接近空中楼阁。即使使用高级语言重现战斗系统,代码也非常复杂,更何况是近似机器指令的50指令集。

17.能不能把那两个自宫武功的编号改掉?(KG)
参考前面的相关内容。

18.能不能任意指定物品显示的图片?(KG)
似乎是不能。

19.0.72有几个BUG:Z.dat方面:最高等级貌似不能超过30,否则当升级到31级等级自动变成64级。(KG)
参考前面的相关内容。

20.小宝商店最多能有几项?(KG)
从R文件的结构来看,似乎有7个地点,每个地点5种货物。但是游戏中只使用了5个地点。

21.什么时候可以修改大地图大小?(无名)
至今仍不能。并非是技术上的问题,而是许多数据结构需重新定义,现有的资源也大多无法使用。不过目前看来仍没有必要。

22.游戏中任意调出输入法,这个希望有时间能加上,现在很流行自创的,自创的话让大家自己输入名称不是很好吗。(南宫梦)
输入法的部分目前来看并不是那么简单,所以仍不能。仅复刻版能够调出输入框并使用系统输入法。

23.游戏的场景大小能变得更大吗?(南宫梦)
至今仍不能,问题也在于数据结构的重定义。

24.另外游戏中好像贴图最大200*200,再大游戏不支持,这个能改吗?(南宫梦)
从RLE8压缩的算法来看,应该能够更大,但是列数超过256的话图像格式会有问题,而行数似乎并无限制。但是最好不要这样做。

25.能否加上新的音乐,比较好的音质的。(qja)
仅复刻引擎能使用mp3文件。原Dos引擎的声音文件有很大限制。

26.我希望可以在遊戲內增設一個小地圖,可以較容易知道自己身處那裡。還有不要有水上飄,雖然是方便,但很不好看,可唔可以增設多些船,在地圖上中下都有架,較省時找船,
或者當主角一踏出陸地就會自動變做一架船,這樣就方便得多la~又不難看~(陸無雙)
增加一个小地图并不划算,我的建议是在罗盘上挂一个事件。复刻引擎中尝试过主角在海上自动变成船。

27.突破队友数上限,突破跟随的队友数上限,突破主角武功数上限。(Cloud)
技术上可以,但并不划算。可以使用变通的方法实现。

28.旧指令“得到物品”能显示数量。(guest)
已经有新指令。

29.问个问题,可以让一个人多装备几个东西哇,而且不分武器或者防具哇,譬如一个人可以穿5件衣服什么的?(kingzlw)
可以用“物品调用事件”写一个复杂的事件实现。

30.原来指令中有个场景变暗,能不能再弄个场景变半暗,这样可以弄出黑天的效果。(南宫梦)
已由KG制作出修改调色板的事件。

31.能否在原游戏的“人物状态”中某个位置或
用某个已有的状态(如“用毒能力”位置)来显示“资质”或“道德”等?(曾大虾)
以前并未实现是由于重定位表的问题。现在已经可以了。

32.修改伤害公式,当前内力或最大内力影响伤害,同样的七伤拳级别,内力999的张无忌和内力250的崆峒五老打出的伤害应该大有差别。内力700的铁丑使出的1级腐尸毒比内力50的阿紫的5级腐尸毒伤害要高。武学常识不累加,而取最高值。否则人越多武学常识越高。(碧落)
由“新版伤害公式”部分实现。

33.能扩展物品说明栏的字数吗?(guest)
物品名称出现了两次,有可能把其中一个合并到说明里并设法显示出来。但是似乎没有足够的显示位置。

34.或者新增的菜单指令能容纳6人以上,且可以选择要上场的人吗?(最多6人)(guest)
至今仍不能。但是KG似乎能够用其他方法解决这个问题。

35.能不能实现根据角色在战斗中的表现,如零伤害完成战斗,对敌方造成更多的伤害,给予额外的奖励。(江湖小虾)
大概可以,但是判断指令会写得很复杂吧。

36.秘笈可不可以限制修练次数。(lichao001486)
技术上可以,但是比较复杂。而且,一本书总不能看几次就坏掉吧。

37.队友列表和战斗选人可以改成显示4个汉字吧。(KG)
参考KG签名档。

38.还有能否增加这一功能:如练6脉需要10级一阳,10级缺3掌才能练18掌等判断指令。(张良计)
“物品调用指令”似乎可以实现这个想法。

39.废掉L键或改为别的键(这个应该好弄吧)(南宫梦)
容易。
虽然游泳的鱼这样说,但是我还没找到这个键值的位置。

40.以前有人说大地图飘云的速度能改吗?(guest)
可以,但需要找到控制的地方。
同上。

Wednesday, July 08, 2009

有关《北方密使》

一直以来想给《北方密使》写些什么。
我还是很喜欢这部游戏的,偶尔就会拿出来玩一遍。这个游戏有两个地方很有意思,一个是转职系统,一个是自动作战。
除了男女主角,其他人物都是可以任意转职的,而转职前的能力也都保留着。《北方密使》的前作《复仇魔神》中,即使之前学过剑招,如果转成非剑手的职业,还是不能使用剑法的。
对于我这种玩游戏都喜欢偷懒的人来说,自动作战是一个非常好的选项。在《复仇魔神》的AI中,法师类的角色总喜欢在战场后面加很多的状态,一直不肯冲上前去,而《北方密使》则是真正猛打猛冲,比较符合我的性格。
《北方密使》有两个主角,也有两条不同的线路。男主角名字叫白志超,女主角叫娜塔莉雅,从剧情来看,两个人似乎有些许的好感,但是游戏里面从没有明确提到。在最终的大战结束之后,两个人的对白使人感到坚强的娜塔莉雅也有柔弱的一面,只是不知那时她会不会把白志超当成一个依靠。而白志超和他身边的飞霜和萝莎莉似乎并没什么发展的可能,娜塔莉雅看起来也不会喜欢上她身边的伙伴。
《北方密使》里面的白志超武艺高强又有些玩世不恭,总是随着性子胡闹,跟《复仇魔神》里面沉稳中略带莽撞的性格完全不符。而在《复仇魔神》结尾的时候,很多人想让白志超当国家的首席剑士,但是最后他居然开溜了,这才是《北方密使》中塑造的男主角的性格。
我是先玩的《北方密使》后玩的《复仇魔神》,所以玩《复仇魔神》的时候,尽管白志超只是有大众的职业,但还是喜欢将他作为队中的第一剑手,刻意让他拥有队伍第一攻击手的位置。
总的来说,白志超在《北方密使》中的性格很讨人喜欢,但是故事里面却没什么女人缘。后来的娜塔莉雅成了她们部落的首领,不知两个人会不会有发展的可能。
《北方密使》的第一关名字叫“第一神剑”不知指的是白志超还是中途加入的刑天。

Saturday, June 20, 2009

事件的修改

群芳谱的代码扔给金圭子了,不知他能改到什么地步,会很深入吧。

此外许多新的修改需要用源码级实现。一些功能用脚本比较好。我发现某些实现用脚本比用代码更简单,更别提50指令了。

Tuesday, June 16, 2009

雨后


偶尔还是会下雨,但是太阳还会出来的。

Wednesday, June 03, 2009

近期的情况

最近比较忙,大概不能做源码的更新了。现在源码已经基本上稳定,kg 在进行 txdx 官方出品 MOD 的系统维护工作,我几乎不做什么事了。群芳的风波之后,这部分源码也基本上想找个其他人维护了。群芳的源码是修改得最多的,也不止一个人做过。

此外就是一些人提出了移植的方案,我的观点是将移植工作留给时间。当手机的性能足够和 PC 机相比的时候,移植也是水到渠成的事了。现在的手机平台大部分性能都不高。而鱼提出的 C + Lua 的解决方案无疑不是什么好办法,如果全用 C 编写会更加通用些。或者找一个好的 pascal 在其他平台的编译器也是一个可行的方案。

Monday, April 20, 2009

又是无题



很想写些文字。


但是没写出什么来,让生活多一些阳光吧。


即使天空下着雨,我们的世界永远都是晴天。


感谢你。


Monday, March 16, 2009

无题


当思念一个人的时候,好像很难集中精力思考其他问题。


Thursday, February 19, 2009

为Delphi的控制台程式添加图标

一般来说,在delphi中可以通过 Project – Options – Application 来加载图标,但是有时这个选项是灰掉的,特别在控制台程序中是不可用的。让它出现的方法如下:

在dpr文件uses部分添加 form
在begin之前添加 {$R *.res}
在运行的部分添加 Application.Initialize;

如果提示没有res文件的话,就自己建立一个,可以随意建立一个空文件用 工程名.res 命名,之后 Load Icon 就变成可用了。你可以注意到在我发布的源码中这些部分已经添加过,只是注释掉了。

这就是说,让 Load Icon 这个按钮不为灰色必须同时满足上面说的4个条件,即3处代码和一个res文件。这样实际上是认为此程序是一个基于Form的程序,而使得这个选项能够被使用。

但是在编译的时候,是否载入res文件则只由 {$R *.res} 是否存在决定,这就是说完全可以在载入图标之后将另外两处代码注释掉。

Tuesday, January 27, 2009

金庸群侠传之回忆

DOS下的安装程序总是非常无聊的,一大串白色的文字和永远不变的黑色背景。许多排文字刷过去之后,最好再看看磁盘空间是不是足够。毕竟100MB的空间在当时并不是一个小数目。

或许正版游戏的安装程序会绚丽一些?

经历大约两分钟左右硬盘的哀号之后,终于看到了游戏画面,一个拳套和一把剑和一个磁盘。拳套好像是拳击时候用的,中国古代可能没这个东西;而剑的做工看来十分粗糙,磁盘更不必提了,大侠们行侠仗义时是不会带这种可靠性低的东西的。

终于进了游戏,一个看起来明显不是人的东西讲了一些莫名其妙的话,而每句话都要等半天才能出现下一句。不要作任何怀疑,没有加载smartdrv的硬盘效率就是这么低。

image

终于软体之星把废话说完了,出来还得跟跟南贤废话。废话完了想存个档,再次经历一分钟的硬盘哀号之后,几个英文字输了出来,之后计算机死机了。

有一个软件叫诺顿,可以检测硬盘文件的逻辑错误,于是检测一番,果然有几个文件有错,修复之后满怀希望再次进入游戏存档(中间浪费至少一个小时),再次出错,于是陷入了一个存档出错查错再存档的死循环。

在经历了出招的不可理喻的速度之后,我决定放弃在486电脑上运行这个游戏的念头。

终于数月之后,找了一台Pentium 100MHz的电脑,重新找了一个安装版,终于能够顺利运行这个游戏了,于是开始了一个旷日持久的旅程。我开始并未打算能够通关,只是碰运气,能撞到啥算啥。

在用debug将主角的许多属性改为100之后,我发现还是到处被人灭掉。在这个武侠世界,光有体格是没用的。还要有绝世武功。

于是我试着将主角的第一门武功改成10级,我是绝不会老老实实打那680下的(这个计算结果其实是错误的)。于是我开始试着修改存档的其余部分,终于成功将野球拳改成了343级,在经历了一下莫名的满屏拳影之后,又回到了1级。大概是修改得太大了,于是再次修改,结果又变成了4级和了85级,终于85级在一下之后变成了10级,从此之后明白了e7 03代表着属性的终极。

而再次之前,第一次的失踪,是来自阎基的痛苦回忆,第二次则是番僧。这个江湖之上,主角只是个武功低劣的无名小辈。

那么我得到的第一本书是什么来着?是《飞狐外传》还是《书剑恩仇录》?后者的可能性也许大些,因为主角武力高便可以,而花大力气练胡斐我不一定干的出来。至少我记得我是喝着什么酒,扔了一大堆金蛇锥,才搞定了这个难缠的苗大伯。

练了一堆奇怪武功之后,本想抢到葵花宝典,体会一下东方不败的绝世神功,想不到这里的葵花宝典只是一本单纯增加属性的秘籍。于是读回先前的存档,把宝典给了石破天。

许多的回忆杂糅在一起,已经不记得是哪一次了:
武功全满之后,心想战斗经验不要浪费,就一直挂着一本医书,后来得到了50多个九转熊蛇丸。

主角练九阳神功特别的慢,张无忌好一点,但是因为攻击差抢经验少,也练得很慢。谁规定打架主角必须上的?

生生造化丹是个好东西,但是金轮法王身上的好像又不是,是啥呢?

令狐冲的独孤九剑,看到就能打到。

林平之居然冲上去单挑,结果全体失踪了。

程瑛虚竹狄云不跟我走,于是改掉道德,有多少都跟来吧。

经历过多方提示之后,终于干掉了10大邪派高手,成功通关了。

这是一个引擎,画面落后时代的游戏,但同时也是一个创意极度超前的游戏。中文游戏的历史上永远会有这一座伟大的丰碑。

Delphi中使用Lua脚本语言的几点注意

1. 想在delphi里面使用lua,如果不懂安装那么就可以不安装,把下来的lua.pas文件和两个dll文件放在工程目录里,并且在工程里的uses部分加上lua就可以了。

2. 如果想仅仅运行文件中的一个函数,似乎必须先运行整个文件,也就是需要两次调用pcall函数。这可能是运行函数之前需要先给出一个函数列表。

lua_pcall(Lua_script, 0, 0, 0);
lua_getglobal(Lua_script, functionname);
result := lua_pcall(Lua_script, 0, 1, 0);

3. 若函数的某个参数是表,即{1, 2, 3}这样的形式,那么如果想读取表中的第三个值(就是3),必须按照以下顺序使用4个函数:

lua_pushnumber(L, 3); //3指表中第3位
lua_gettable(L, -2); //-2指表在栈中的位置。这个例子里表参数是最后一个入栈,一般的说应是-1,但是由于方才又压入了一个值,所以变成了-2,同时,表在栈中的位置这个值会被出栈,而从表中读取到的值会入栈。
p := lua_tostring(L, -1); //把栈顶的数据读出来。
lua_pop(L, 1); //清栈。

4. lua的delphi译本似乎很多,我用的是http://www.matrix44.de/lua/下载的。

Thursday, January 15, 2009

Lua复刻版

由游泳的鱼制作,大部分使用脚本编写。

如果在2007年或2008前半年这个东西能出来的话,那确是一个伟大的进步,但是现在这个版本,与开了源的复刻版相比,竞争力并不大。

不过我可能是不适宜讲这些话的。

Sunday, January 04, 2009

换一个主题色


很久没更新,借MSN终于能重新登陆之机换一个主题。


看起来比较暗淡,说不定过几天再换一个。


Saturday, January 03, 2009

是不是该写点什么

但是该写什么呢?