想要重启十字之门

这两天有好多朋友跟我提到魔力宝贝,也有朋友想要我帮他解包来获取一些图形资源。前些天还有朋友发邮件来向我讨要魔力宝典,很受感动和激励。腾讯版的魔力宝贝手游快上了,总体来说很棒、很值得去玩,但也毕竟不是曾经心目中的那个魔力了。

曾经也有一个魔力的梦,一直未完成的梦,时间一晃这么多年过去,是时候回来了。回看曾经地图编辑器的代码、数据包解析的文档,感觉既陌生又熟悉。经过这么些年,自己写代码的功力及游戏设计的能力到底是进步还是倒退?

还记得第一次解出图档的兴奋,还记得第一次拼出地图的激动,还记得第一次看到人物在游戏里行动时的感慨。感谢那么多前辈们对游戏的研究。

依稀记起七年前欠下了一个CrossGraph图形工具箱,打开当年的代码,现在也已经无法编译。是否应该把这个坑填上呢?

我回来了。

2018-4-17 22:33:40 评论(0) 十字之门
全文完 阅读全文

Delphi XE10.2 Tokyo开发Linux控制台程序

近来试了试在Delphi XE 10.2 Tokyo下开发Linux的控制台程序,挺简单的。

将 C:\Program Files (x86)\Embarcadero\Studio\19.0\PAServer\LinuxPAServer19.0.tar.gz 复制到Linux下,解压后直接运行./paserver即可开启PAServer,输入密码,默认端口64211。

在Delphi上添加Linux SDK,即可直接运行。

在CentOS 7 下遇到几个问题:

  • [DCC Error] E2597 C:\Program Files (x86)\Embarcadero\Studio\19.0\bin\ld-linux.exe: error: cannot find -lgcc_s

安装以下的包即可:

yum install glibc-static
yum install glibc-devel
yum install zlib-devel

如果还是不行再安装下面两个包:

yum install compat-libstdc++-33
yum install compat-gcc-44-c++

最后在Delphi中删掉之前的SDK和连接,重新添加即可。

  • TDBXError: Remote error: Authentication manager rejected user credentials. This may due to invalid combination of DS user name and password

该错误是Linux端的PAServer未输入密码导致,运行PAServer时指定密码即可。

执行程序安装在 ~/PAServer/scratch-dir/账户名-SDK连接/工程名 目录下。

2018-3-13 18:07:43 评论(1) 程序设计
全文完 阅读全文

Delphi获取CPU ID

CPU中提供了cpuid这个指令来获取有关CPU的一些信息。

在eax寄存器中传入功能号,即可在eax,ebx,ecx,edx中获取到CPU返回的信息。

eax 0
cpuid

所得到的ebx,ecx,edx组合为CPU的厂商信息,比如“AuthenticAMD”。

我们想要获取CPU的型号以及功能信息,需要在eax中传入1。返回的eax为CPU型号,ebx,ecx,edx为功能信息。

结合Delphi语法,在32位Delphi中获取CPU ID可以这样操作:

function GetCPUID: string;
var
  _eax, _ebx, _ecx, _edx: LongWord;
  s, s1, s2, s3: string;
begin
  asm
    mov eax,1
    cpuid
    mov _eax,eax
    mov _ebx,ebx
    mov _ecx,ecx
    mov _edx,edx
  end;
  Result := IntToHex(_edx, 8) + IntToHex(_eax, 8);
end;

该程序获取到的CPU ID同命令提示符下 wmic CPU get ProcessorID 指令相同。但这种Pascal混合汇编的方式在64位编译器下不被允许了。

64位程序每一个汇编代码应该单独为一个过程,不可混合Pascal代码。以下程序使用了R9寄存器,只能运行在64位程序下。

type
  TCPURec = record
    _eax: LongWord;
    _ebx: LongWord;
    _ecx: LongWord;
    _edx: LongWord;
  end;
function GetCPUInfo: TCPURec;
asm
  push r9
  mov r9, Result
  mov eax, 1
  cpuid
  mov [r9].TCPURec._eax, eax
  mov [r9].TCPURec._ebx, ebx
  mov [r9].TCPURec._ecx, ecx
  mov [r9].TCPURec._edx, edx
  pop r9
end;
function GetCPUID: string;
var
  Rec: TCPURec;
begin
  Rec := GetCPUInfo;
  Result := IntToHex(Rec._edx, 8) + IntToHex(Rec._eax, 8);
end;

查看了最新Delphi的源码,发现在System单元已经定义了CPU的信息,在单元初始化的时候,就已经加载了CPU信息,并存储在CPUIDTable数组中。系统已经做好根据32位或是64位程序条件编译走不同的代码,所以现在只需要很方便的这样调用就行了:

function GetCPUID: string;
begin
  Result := IntToHex(CPUIDTable[1].EDX, 8) + IntToHex(CPUIDTable[1].EAX, 8);
end;

以上程序在Delphi 10.2.2 Tokyo下调试通过,尚不清楚是从哪个版本开始加入的CPUIDTable。

另外,现在Intel的CPU在相同型号、相同批次的情况下,CPU ID很有可能是相同的,所以现在并不能用CPU ID来作为机器的唯一识别码。

关于CPUID指令和一些其他参考资料:
INTEL处理器识别和CPUID指令
Intel CPU的CPUID指令
CPUID 指令的使用
Delphi XE7 64位汇编
设备唯一标识方法(Unique Identifier):如何在Windows系统上获取设备的唯一标识

2018-3-8 12:34:43 评论(0) 程序设计
全文完 阅读全文

乌鲁木齐→喀什

昨晚在羊哥那过的夜,今天早上他才从伊犁回来。一晚上的硬座十分疲惫,等他睡醒同田田三人一同去吃饭。

在市区晃荡了一下午,晚上的火车去喀什。真正的旅程即将开始。

2016-8-16 21:44:29 评论(0) 旅行杂记
全文完 阅读全文

抵达乌市

经过40多个小时的颠簸,列车在晚点近3个小时之后,终于抵达乌鲁木齐站。新修的高铁上果然是高大上,只是各种配套都没跟上,四周都挺荒凉。径直走到西外环路,爬上一个还在建设中的高架桥,遥望远方的新市区还是挺漂亮。

在路边等不到去羊哥那的公交车,看身旁来了一辆去昌吉的大巴,立马决定去昌吉转转。

昌吉挺漂亮,街道宽敞干净,房子也盖得很整齐。无心在市中心逗留,叫了辆车直接去恐龙馆。

昌吉恐龙馆是中国第二大恐龙馆,里面陈列着亚洲最大的恐龙中加马门溪龙的化石。第一次见恐龙化石还是十分震撼,尤其是那近一米的头骨,这是何等的庞然大物啊。

参观完后还是决定回乌市。

2016-8-15 00:30:41 评论(0) 旅行杂记
全文完 阅读全文

进疆列车

火车依旧在奔跑,走走停停。上午被隔壁下铺的琅玡榜吵醒,看了看列车已经驶入陕西境内。快到西安,熟悉且怀念的地方。想起平板上有一集白鹿原,打开听一听陕西话。

一天的生活基本上都在吃、睡和电影中度过。看完电影吃点东西,吃完东西再看一部电影。

列车过了宝鸡进入甘肃天水。看着铁轨旁的国道,那都是当年途经的地方。窗外依然是黄土,偶尔长着低矮的灌木。西北缺水,土地贫瘠,生活着顽强的人们。突然想到黄土高原的“原”字,是不是指的就是“塬”。

到达兰州站,已经晚点一个小时。旅途已经开始近二十四小时,在火车上呆了一天的乘客们纷纷下车透气,车站俨然一幅集市的光影,叫卖的和购买的。

东西带得太多,只好努力地吃。苹果、桃子、李子,各种口味的泡面和火腿肠。上车时简直是遭罪。努力减轻明天的负担,也最后享受几天可以撑死的生活吧。

2016-8-14 00:29:40 评论(0) 旅行杂记
全文完 阅读全文

出发,新藏

又出发了,上海到乌鲁木齐。酝酿了很久的新藏线骑行,终于要开始了。一连好几天激动得睡不着觉,好久没有上路了。

怀念一个人在青藏高原骑行的感觉,笔直的道路,前方是雪山和未知,身旁是一望无际的草原和戈壁,成群的藏羚羊在原野上奔跑,野驴和野骆驼在呆萌地望着我。空气是那么的自由,每天享受着充足的阳光、稀薄的空气和狂野的大风。久违的感觉,久违的自在。

下午去几个朋友那里坐坐一一道别,后来弟弟和勋哥送我去了车站。

出发了,火车已开动。前方依然是自由和未知。众所周知新藏线是出名的高海拔、大逆风和几百公里的无人区。这回出行的条件有些艰苦,因此背上帐篷和睡袋,以及得背着至少两天以上的水和干粮。

火车上,漂亮的维族乘务员姐姐给安排了一个任务,巡视和留意车厢里是否有可疑人员,以及是否有乘客携带了水果刀等违禁物品,一旦发现要及时上报。

第一次即将踏上这片神奇的土地,还是有些许期待。美味的瓜果以及美丽的维族姑娘;雄伟的大山以及清澈的湖泊。

列车仍在前进,而我可能睡不着了。

2016-8-13 00:28:04 评论(0) 旅行杂记
全文完 阅读全文

Lua table转json (Delphi实现)

Lua的table真是无敌了,无比的强大。写了一个函数,将table转为宿主程序的JSON对象,用了qjson。

function ParseTable: TQJson;
var
  KeyType, ValueType: Integer;
  Key, Value: string;
  KeyIndex: Integer;
begin
  Result := TQJson.Create;
  if lua_istable(FLuaState, -1) then
  begin
    lua_pushnil(FLuaState);

    while lua_next(FLuaState, -2) > 0 do
    begin
      KeyType := lua_type(FLuaState, -2);
      ValueType := lua_type(FLuaState, -1);

      if ValueType = LUA_TTABLE then
      begin
        if KeyType = LUA_TNUMBER then //Key为数字,意为数组
        begin
          KeyIndex := lua_tointeger(FLuaState, -2);
          if Result.IsArray then
            Result.Add(ParseTable)
          else
            Result.ToArray.Add(ParseTable);
        end
        else begin
          Key := lua_tostring(FLuaState, -2);
          Result.Add(Key, ParseTable);
        end;
      end
      else begin
        if KeyType = LUA_TNUMBER then //Key为数字,意为数组
        begin
          KeyIndex := lua_tointeger(FLuaState, -2);
          Value := lua_tostring(FLuaState, -1);

          if Result.IsArray then
            Result.Add.AsString := Value
          else
            Result.ToArray.Add.AsString := Value;
        end
        else begin
          Key := lua_tostring(FLuaState, -2);
          Value := lua_tostring(FLuaState, -1);

          Result.Add(Key).AsString := Value;
        end;
      end;

      lua_pop(FLuaState, 1);
    end;
  end;
end;

注:FLuaState为lua_state。

使用方法:

把需要使用的table压入栈顶,然后调用该函数即可。

lua_getglobal(FLuaState, 't');
json := ParseTable(FLuaState);

 

2016-7-25 22:28:41 评论(4) 程序设计
全文完 阅读全文

Laravel5 nginx urlrewrite设置

搞了好几天Laravel,$_GET一直取不出值,才怀疑是不是nginx的urlrewrite配错了。

我之前写的配置是 try_files $uri $uri/ /index.php?$1;

经测试应该为 try_files $uri $uri/ /index.php?$query_string;

正确的设置如下:

server {
    listen       80;
    server_name  域名;
    root         x:/目录/public;

    location / {
        index    index.php index.htm index.html;
        try_files $uri $uri/ /index.php?$query_string;
        #try_files $uri $uri/ /index.php?$1;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}

2016-4-27 01:20:53 评论(0) 程序设计
全文完 阅读全文

Delphi Android开发放置了TFDGUIxWaitCursor仍然报错的问题

利用Delphi开发Android程序,使用SQLite数据库,在DataModule下放置了TFDGUIxWaitCursor仍然报错,

Object factory for class {3E9B315B-F456-4175-A864-B2573C4A2201}, provider [Forms], is missing. To register it, you can drop component [TFDGUIxWaitCursor] into your project

需要将TFDGUIxWaitCursor控件的Provider属性改为FMX才行。

2016-4-13 08:55:09 评论(0) 程序设计
全文完 阅读全文
1/29, 288 « 123456 »