Skip navigation.

找寻那曾经失去的浪漫

落漠、忘却、无际、衷情、失落、……

幸福是什么?是爱情?是事业?还是汇编(ASM)?

  最近一个频道在放电视剧《第8号当铺》,里面有一个当铺,典出人可以将自己的爱情、亲情、友情、歌声、味觉、事业、洞察力等等互换。
  当铺老板的夫人在其临死前说:“为你相夫教子,是幸福!为了持家,是幸福!为你等待,是幸福!”
  后又有一位立誓要让自己的歌声可以传遍全世界的少女,要用自己一生的爱情,去换取一生的成就。她说:“有人需要爱情,有人需要事业。如果他想要的是功成名就,而你偏要给他爱情,他会幸福吗?”

  最近我在写一段代码,有一个设计在标准C/C++中无法实现,想来想去我用汇编完成了。这时,一个完全不符合C++标准的功能在我的程序中出现了。当然,这个功能会带来很大的易用性。此时的我觉得:“懂汇编真是太幸福了!”

机缘还是巧合

  今天朋友请吃饭,32个人,摆了三大桌。

  我这桌有一个不是游戏界的人士,他自我介绍了一下,在他和别人谈论一番后。发现一个很有意思的事情:他就是“魔力使者”的原作者。一时觉得很搞笑,原来那个曾经被我停权N多帐号,斗智斗勇的人居然是他。后由于红客联盟事件,他不再做任何破解相关之事,才转手他人。

  冤家易解不易结。其实,在做反外挂的那段时间,我过的很愉快!有对手才有竞争,有竞争才能互相成长。

非静态类成员函数指针解决方案 (含Borland版与Microsoft版)

第2次更新:修正设计错误,指向任何类成员函数
第1次更新:任何类无需从_Object派生

#include<stdio.h>
#include<stddef.h>

class _Object{};

#if defined(SetEventCall)||defined(CallEvent)||defined(DefineEvent)
    #error SetEventCall,CallEvent,DefineEvent 已经定义
#endif//

#ifdef __BORLANDC__

    #define SetEventCall(event_obj,obj,event_func)          event_obj=obj->event_func
    #define CallEvent(event_obj)                            event_obj
    #define DefineEvent(result,name,intro)                  result (__closure *name)intro

#else

    #pragma warning(disable:4311)

    template <typename T> struct EventFunc
    {
        unsigned __int32 this_address;
        unsigned __int32 func_address;

        _Object *This;
        T Func;

        EventFunc()
        {
            this_address=offsetof(EventFunc,This);
            this_address+=(unsigned __int32)this;

            func_address=offsetof(EventFunc,Func);
            func_address+=(unsigned __int32)this;
        }
    };


    #define SetEventCall(event_obj,obj,event_func)      {   \
                                                        unsigned __int32 this_address=event_obj.this_address;   \
                                                        unsigned __int32 func_address=event_obj.func_address;   \
                                                        \
                                                        {   \
                                                            __asm mov eax,this_address  \
                                                            __asm mov ebx,obj   \
                                                            __asm mov [eax],ebx \
                                                            \
                                                            __asm mov eax,func_address  \
                                                            __asm mov ebx,event_func    \
                                                            __asm mov [eax],ebx \
                                                        }   \
                                                    }

    #define CallEvent(event_obj)                    (event_obj.This->*(event_obj.Func))             //(*(event_obj.This).*(event_obj.Func))

    #define DefineEvent(result,name,intro)          EventFunc<result (_Object:: *)intro> name;
#endif//__BORLANDC__

class Button
{
public:

    DefineEvent(void,OnClick,(Button *,int));           //定义事件,原型为: void OnClick(Button *,int)

public:

    Button()
    {
        printf("Button this=%p\n",this);
    }

    void TestButtonClick()
    {
        CallEvent(OnClick)(this,0);                     //呼叫OnClick,原型为: OnClick(this,0)
    }
};

class Test
{
    Button *button;

public:

    void OnButtonClick(Button *but,int)
    {
        printf("Test::OnButtonClick,this=%p,but=%p\n",this,but);
    };

public:

    Test()
    {
        printf("Test this=%p\n",this);

        button=new Button;

        SetEventCall(button->OnClick,this,OnButtonClick);               //设定button->OnClick事件的处理函数为this->OnButtonClick

        button->TestButtonClick();
    }
};

void main(int,char **)
{
    Test *test;

#ifdef __BORLANDC__
    printf("Compiler: Borland C/C++ or Turbo C/C++ %d.%d%d\n",(__BORLANDC__>>8),((__BORLANDC__&0xF0)>>4),(__BORLANDC__&0x0F));
#endif
#ifdef _MSC_VER
    printf("Compiler: Microsoft C/C++ %.2f (Visual C/C++ %.2f)\n",_MSC_VER/100.f,_MSC_VER/100.f-6);
#endif//

    printf("Compile Time: %s %s\n\n",__DATE__,__TIME__);

    test=new Test;

    delete test;
}

Compiler: Borland C/C++ or Turbo C/C++ 5.82
Compile Time: Dec 23 2006 17:34:48

Test this=00902D50
Button this=00902D64
Test::OnButtonClick,this=00902D50,but=00902D64

Compiler: Microsoft C/C++ 14.00 (Visual C/C++ 8.00)
Compile Time: Dec 23 2006 17:34:00

Test this=003826D0
Button this=00382700
Test::OnButtonClick,this=003826D0,but=00382700

心跳回忆→樱花大战→空之轨迹

  最近有人问我“自己的RPG”弄的怎么样了,我说在按步就班的前进。第一步是文字冒险养成,第二步是带战棋的文字冒险养成,第三步是带场景可编辑走路的RPG。

  结果说了半天他还是没搞懂什么意思,之后给举个例子:“第一步:心跳回忆,第二步:樱花大战,第三步:英雄传说6空之轨迹”。说完后发现他这三个游戏都没玩过,不过还好他知道这三个游戏类型是养成、养成+战棋、RPG。

  其实这段时间我发现,虽然是很简单的《心跳回忆》,但还是有很多朋友有兴趣制作类似的游戏。而战棋则也能吸引到不少商业游戏开发伙伴,而RPG则依旧是几多欢喜欢几多愁。

Welcome To the NHK

昨天看了《Welcome To the NHK》的第19集,个人感觉所有玩网络游戏,做网络游戏的人都应该看一下这个动画片。

特别是第16集和第19集,
16集讲的是玩游戏者要面对现实的残酷:起初男配角拿着笔记本电脑对男主角说:“嗨!我就是Mari”。(Mari,网络游戏中的一个女性角色),然后一串话向男主角讲述了如果继续这样玩游戏下去会产生的后果。

而第19集讲的是一个网络游戏中原来帮助过主角的人对主角的忠告,最后一句是:“登出吧!永远!”

ps.NHK:日本NHK电视台,在动画片中趣解为“日本家里蹲协会”。

在大宇生涯的终结

网星的研发部人员已经并到北京软星了,他们从今天开始将在那里上班。2个和我一样不愿意去软星的人则开始了 又一段无业生涯。

7年来:不管是大宇软星还是网史艾或是网星乐园,都带给了我无限的欢乐和荣耀;不管是研发还是维护或是与台籍、日籍人员交流,都带给我知识技巧的增长和惊喜。

在我即将冲向另一片天空,创造自己的游戏时。让我向大宇集团,向北京软星、向网史艾、向网星乐园深深的表示感谢。

再见了!有缘再会!

时间并不重要,生命才是宝贵的

记得这句话是某部电影里一个很重要的过场角色说的。

但如果谁在加班盛行的公司里对同事大声说的话,八成会让他的上司很不爽吧!

看到某位同事加班很累了,但还坚持来上班。我当时脱口而出了这句话,她当时笑着说谢谢,而上司没什么反映。
-----------------------------------------------------------------

国庆节七天长假,告诫所有还在加班的朋友:“时间并不重要,生命才是宝贵的!”

自己的游戏,自己的RPG

有两则值得我提的事情:

一是《BCB-Tools》软件作者,一位澳大利亚的程序员,在没有收入后,开放了他作品的源代码,并痛斥一些程序员。这位高手开发《BCB-Tools》系列控件长达8年,但靠这些得到的收入不足一万美元,如今已经陷入了负债累累的情况。

二是有一些朋友在GameRes论坛上问到《古月》的ONLINE RPG套件有赚到过多少钱的问题。我可以很明确的告诉大家:没有真正收到过钱!

至今《古月》的作品列表里到是不少,但有1/2以上是我自己开发的,1/3是朋友开发的,只有剩下的1/6才是授权用户开发的。而这剩下的1/6的客户中,真正给了钱的也是少之又少。还不如那占1/3份额的朋友给的价值多。按1-3万元购买企业授权的用户所支付的总额还不如按1000元购买个人授权的总额多。

这些公司或团体不是以游戏还未出售、就是以游戏不赚钱、公司负资产中……等等为理由。

单单的引擎本身,价格不过是1到3万元,销售就如此困难。而相比价格高达几十倍的ONLINE RPG套件就更不用说了,根本没有任何人愿意为它付费。

我们没有能力去追债,更没有能力去打官司。也好在我们(指上面讲到的1/2和1/3部分的人)不靠卖引擎过活,引擎卖出去多少,我们表面上并不关心。因为引擎本身最初的目的就是为我们自己而开发的,只要有进步那就是好的。

好了,我不再为《古月》的低销量、低收入做任何说明。

从今年年初开始,我们已经开始了一款RPG/Online RPG的开发,总计划投资10-20万元人民币。而最重要的是这款游戏是由我们以个人名义合作开发的,所有开发时间均为个人私有时间,所有资金全部来自个人,未来也不会接受任何一家公司的投资,更不会接受任何一家公司的收购。

也许会有人说我太过于个人英雄主义了,也有人说Online RPG不是几个人,几十万投资就能做出来的。

但是,这又怎么样?事实告诉我:我无法再相信任何一家公司会投资来帮助我完成“自己的RPG”这个梦想。

为了我的梦想,我只能自己做,别无选择。

第7年

大宇北京软星成立已经6年了,而网星也已成立4年了。
而今天是北京软星第7年的第一天,也是我在大宇的第七年的第一天。

纪念意义的日子2000年8月14日,难忘的地方:上地南路6号院3号楼2层,2楼外侧蓝白双色的标志已及SOFTSTAR的字样还没有去掉。

RPG

有过很多人问我:“你最强的是什么?”,我从来都是回答:“RPG”

我并非受近几年的MMORPG浪潮影响,而是受到了十多年前《仙剑奇侠传》的影响。

十一年前,1995年,我和另外两位朋友买了一套盒装版《仙剑奇侠传》,售价是320元人民币。几个月后的我已经可以像走在自己的家里一样在《仙剑》的迷宫中穿梭了。而同样我的编程目标也从数据库软件转向了游戏。

从此Watcom C/C++, DOS/4GW, VESA/VBE, int 33h,...这些词汇开始充满了我的生活。

是的,从那时起,我和无数的中国业余游戏开发者一样,以做一款RPG为志向前进着,努力着。

2000年的我,怀着无比憧憬的心情加盟了刚刚成立的大宇资讯北京软星,我的员工编号小于10哦。而我接手的正是《仙剑奇侠传》的第一款外传──《仙剑客栈》。虽然我是一个心思的想做RPG,但必境没有什么好选的,《仙剑客栈》也无所谓了。

2001年,有一位台北大宇的前辈问我:“愿不愿意跟我到上海,去做《仙剑3》?”,我推辞了,我觉得我的实力还不够。他和我聊了许久,表现出一种莫名的无奈,我们开始预测之后的事情。

之后的2-3年,所有的预测全部一一应验,除了那位前辈也离开了大宇这件事之外。

曾经有很长一段时间,我十分的迷茫:以RPG为理想而奋斗已过去十年;在大宇的日子也将在5天之后进入第七年。虽说这些年来有做出过不少的RPG,但确没有一款大作出自我手。要怪大宇吗?是自己放弃了《仙剑3》。还是要怪自己?

整天脑子里都在想着RPG的各种相关技术问题,而在工作中,却全然用不上,是不是很好笑呢?

RPG,我依然为你奋斗!即便没有人喝彩,即便没有公司愿意帮助,即便是一个人。
我,...永远的RPG。
Download Opera, the fastest and most secure browser
July 2009
S M T W T F S
June 2009August 2009
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31