|
mir2res文件结构
Grobal2.pas,,,客户端和服务端通用的文件,定义了一些消息标识,数据结构,消息操作函数
Actor.pas,,,精灵(包括人物heros,npc,怪物mon)类,但是主要是heros类,NPC以及mon类派生于actor类
FState.dfm,,,各个子窗口,如f11,,f9等快捷键调出的窗口等
clmain.dfm,,cl-client,,客户端主界面窗体,打开可以看到它use了Fstate.dfm
fstate.pas,,FState.dfm的模块文件,,结合DWinCtl.pas和delphix中的绘图函数绘制各个子窗口在DDraw下真实效果的模块
IntroScn.pas 游戏的引导场景实现,比如登录选人等
clmain.pas,,clmain.dfm对应的源程序文件,,处理了程序启动时的网络连接,载入的wil客户端文件,等一系列操作
WIL.pas 比较重要的文件之一,,在原delphix图像包装类的基础上改装而成,封装了wil文件及其全部操作(结合wmUtil)
clEvent.pas 消息管理器
DWinCtl.pas 提供几个在DX下使用的控件
mir2.res 可能只有一个图标吧,就是那个龙字样的
SoundUtil.pas wav文件夹内声音文件的调用操作
wemade.pal 调色板文件
mir2.dpr 工程文件
EDCode.pas 消息加解密函数,6BIT加密算法的具体实现,用wpe截到的封包都是加密格式的,去掉密文前的!和最后的@
ClFunc.pas 输助函数库
MapUnit.pas 地图单元
AxeMon.pas 怪物单元,包含怪物在客户端的攻击等效果的实现,由actor类派生,不知为什么命名为axemon斧怪?
怪物对主角的伤害等算法当然不包含在,这是服务器res的工作
HerbActor.pas BOSS怪
PlayScn.pas 相对于引导场景,这里是游戏主场景画面实现
DrawScrn.pas 整个游戏场景的最终绘图工作
Soundfx.h 音乐文件操作的预编译头
magiceff.pas 客户端魔法效果的绘制与表现,当然也不包括魔法伤害实现.
hutil32.pas,cliUtil.pas 包含了一些输助函数等
##########################################33333333333333333
unit Grobal2; //全局(服务器和客户端通用)消息,数据结构,函数等
interface
uses
Math,windows;
Const
BUFFERSIZE =1024; //缓冲定义
//客户端发送的命令
CM_SOFTCLOSE =0; //退出传奇(游戏程序,可能是游戏中大退,也可能时选人时退出)
//登录有关的命令 //CM: client msg,这些定义的消息都是客户端向服务端主动发送的
CM_IDPASSWORD =1; //客户端向服务器发送ID和密码
CM_QUERYUSERSTATE=2; //查询用户状态(用户登录进去,实际上是客户端向服务器索取查询最近一次
退出服务器前的状态的过程,服务器自动把用户最近一次下线以让游戏继续的一些信息返回到客户端)
CM_ADDNEWUSER =3; //新建用户,就是注册新账号,登录时选择了"新用户"并操作成功
CM_UPDATEUSER =4; //更新注册资料??
CM_SELECTSERVER =5; //选服务器,注意不是选区,盛大一区往往有(至多8个??group.dat中是这么写的)
//不止一个的服务器
CM_CHANGEPASSWORD =6; //修改密码
CM_NEWCHR =7; //创建新角色,注意不是上面所说的新建用户
CM_QUERYCHR =8; //登录成功,客户端显出左右角色的那一瞬
CM_DELCHR =9; //删除角色
CM_SELCHR =10; //选择角色开始游戏
CM_QUERYUSERNAME=11; //进入游戏,服务器返回角色名到客户端
CM_SAY =22; //角色发言
//客户端界面操作相关
CM_MAGICKEYCHANGE = 30; //魔法快捷键改变
CM_CREATEGROUP =42; //新建组队
CM_WANTMINIMAP =43; //用户点击了"小地图"按钮
CM_OPENGUILDDLG =45; //用户点击了"行会"按钮
CM_GROUPMODE=41; //关组还是开组
CM_ADDGROUPMEMBER =51; //组内添人
CM_DELGROUPMEMBER =52; //组内删人
CM_SPEEDHACKUSER =59; //用户加速作弊检测
CM_ADJUST_BONUS =60; //用户得到奖励??私服中比较明显,小号升级时会得出金钱声望等,不是很确定,
//求经过测试的高手的验证
CM_QUERYBAGITEMS=62; //查询包裹物品
CM_LOGINNOTICEOK = 63; //健康游戏忠告点了确实,进入游戏
//动作命令1
CM_TURN =4001; //转身(方向改变)
CM_WALK =4002; //走
CM_SITDOWN =4003; //挖
CM_RUN =4004; //跑
CM_HIT =4005; //普通物理近身攻击
CM_POWERHIT =4008; //攻杀
CM_LONGHIT =4009; //刺杀
CM_WIDEHIT =4010; //半月
CM_HEAVYHIT =4011; //烈火攻击
CM_BIGHIT =4012; //??
CM_THROW =4013; //抛符
CM_FIREHIT =4014; //??
CM_SPELL =4015; //施魔法
CM_CLICKNPC =3015; //用户点击了某个NPC进行交互
//动作命令2
CM_OPENDOOR =2001; //开门,人物走到地图的某个过门点时
CM_DROPITEM =2010; //从包裹里扔出物品到地图,此时人物如果在安全区可能会提示安全区不允许扔东西
CM_PICKUP =2011; //捡东西
CM_TAKEONITEM =2021; //装配装备到身上的装备位置
CM_TAKEOFFITEM = 2022; //从身上某个装备位置取下某个装备
CM_EAT =2023; //吃药
CM_BUTCH =2024; //54的野蛮?
//与商店NPC交易相关
CM_MERCHANTDLGSELECT =2030; //商品选择,大类
CM_MERCHANTQUERYSELLPRICE =2031; //返回价格,标准价格,我们知道商店用户卖入的有些东西掉持久或有特殊
//属性系统会自动加价
CM_MERCHANTQUERYREPAIRCOST =2032; //客户端向NPC取得修理费用
CM_USERSELLITEM =2040; //用户卖东西
CM_USERREPAIRITEM =2041; //用户修理东西
CM_USERSTORAGEITEM =2042; //用户寄存东西
CM_USERGETDETAILITEM =2043; //取得商品清单,比如点击"蛇眼戒指"大类,会出现一列蛇眼戒指供你选择
CM_USERBUYITEM =2044; //用户买入东西
CM_USERTAKEBACKSTORAGEITEM =2045; //用户向保管员取回东西
CM_USERMAKEDRUGITEM =2046; //用户制造毒药(其它物品)
CM_DROPGOLD =2050; //用户放下金钱到地上
CM_DEALTRY =2060; //开始交易,交易开始
CM_DEALCANCEL =2061; //取消交易
CM_DEALADDITEM =2062; //加东东到交易物品栏上
CM_DEALDELITEM =2063; //从交易物品栏上撤回东东???好像不允许哦
CM_DEALCHGGOLD =2064; //本来交易栏上金钱为0,,如有金钱交易,交易双方都会有这个消息
CM_DEALEND =2069; //交易成功,完成交易
CM_GUILDHOME =2070; //点击"行会主页"
CM_GUILDMEMBERLIST =2071; //点击"成员列表"
CM_GUILDADDMEMBER =2072; //增加成员
CM_GUILDDELMEMBER =2073; //踢人出行会
CM_GUILDUPDATENOTICE =2074; //修改行会公告
CM_GUILDUPDATERANKINFO =2075; //更新联盟信息(取消或建立联盟)
//装备项目
U_WEAPON =0; //武器
U_RIGHTHAND =1; //右手
U_DRESS =2; //衣服
U_HELMET =3; //头盔
U_NECKLACE =4; //项链
U_ARMRINGR =5; //右手戒指
U_ARMRINGL =6; //左手戒指
U_RINGR =7; //右戒指
U_RINGL =8; //左戒指
########################################################
//登录、新帐号、新角色、查询角色等
SM_NEWID_SUCCESS =101; //创建新账号成功
SM_NEWID_FAIL =102; //..失败
SM_PASSWD_FAIL =103; //验证失败,"服务器验证失败,需要重新登录"??
SM_NEEDUPDATE_ACCOUNT =104; //需要更新,注册后的ID会发生什么变化?
//私服中的普通ID经过充值??或者由普通ID变为会员ID,GM?
SM_UPDATEID_SUCCESS =105; //更新成功
SM_UPDATEID_FAIL =106; //更新失败
SM_PASSOK_SELECTSERVER = 107; //密码验证完成且密码正确,开始选服
SM_SELECTSERVER_OK =109; //选服成功
SM_QUERYCHR =111; //返回角色信息到客户端
SM_QUERYCHR_FAIL =112; //返回角色信息到客户端失败
SM_NEWCHR_SUCCESS =113; //新建角色成功
SM_NEWCHR_FAIL =114; //..失败
SM_CHGPASSWD_SUCCESS =115; //修改密码成功
SM_CHGPASSWD_FAIL =116; //..失败
SM_DELCHR_SUCCESS =117; //删除角色成功
SM_DELCHR_FAIL =118; //..失败
SM_STARTPLAY=119; //开始进入游戏世界(点了健康游戏忠告后进入游戏画面)
SM_STARTFAIL =120; //开始失败,玩传奇深有体会,有时选择角色,点健康游戏忠告后黑屏
SM_VERSION_FAIL =121; //客户端版本验证失败
SM_OUTOFCONNECTION =122; //超过最大连接数,强迫用户下线
SM_RECONNECT =125; //与服务器重连
SM_SENDNOTICE =202; //发送健康游戏忠告
SM_MYSTATUS =131; //我的状态,最近一次下线状态,如是否被毒,挂了就强制回城
SM_TIMECHECK_MSG = 227; //时钟检测,以免客户端作弊
SM_CHANGEMAP =201; //地图改变,进入新地图
SM_AREASTATE = 228; //周围状态
SM_NEWMAP =223; //新地图??
SM_MAPDESCRIPTION = 229; //地图描述,行会战地图?攻城区域?安全区域?
SM_LOGON =224; //logon
SM_CHANGELIGHT =240; //负重改变
SM_LAMPCHANGEDURA=241; //蜡烛持久改变
SM_LIGHTING =242; //免蜡开关
SM_OPENDOOR_OK=249; //通过过门点成功
SM_OPENDOOR_LOCK=250; //发现过门口是封锁的,以前盛大秘密通道去赤月的门要5分钟开一次
SM_CLOSEDOOR =251; //用户过门,门自行关闭
SM_DEATH=260; //正常死亡
SM_NOWDEATH =261; //秒杀?
SM_SKELETON=262; //尸体
SM_ALIVE =263; //复活??复活戒指
SM_ABILITY =264; //打开属性对话框,F11
SM_SUBABILITY=265; //打开输助属性对话框
SM_DAYCHANGING=266; //传奇界面右下角的太阳星星月亮
SM_WINEXP =267; //获得经验
SM_LEVELUP =268; //升级,左上角出现墨绿的升级字样
SM_HEALTHSPELLCHANGED =269; //治愈术使你的体力增加
SM_ADJUST_BONUS =280;
SM_STRUCK =310; //受攻击
SM_CHANGEFACE=311; //变脸,发型改变?
SM_OPENHEALTH=312; //
SM_CLOSEHEALTH =313; //
SM_INSTANCEHEALGUAGE=314; //实时治愈
SM_BREAKWEAPON=315; //武器破碎
//对话消息
SM_CRY=316; //喊话
SM_GROUPMESSAGE =347; //组内聊天!!
SM_GUILDMESSAGE =348; //行会聊天!~
SM_WHISPER=349; //私聊
SM_HEAR=351; //有人回你的话
SM_SYSMESSAGE=390; //系统消息,盛大一般红字,私服蓝字
SM_USERNAME =352; //
SM_CHANGENAMECOLOR=353; //名字颜色改变,白名,灰名,红名,黄名
#########################################################
mir2res究竟有没有使用到delphiX控件??? 其实mir2源程序仅仅用了delphix的DDraw接口而已
下面详细说一下
因为Dx不是Delphi本地的,所以在delphi中运用dx要对dx进行delphi本地的翻译
即C to pas
如一些变量,结构接口等的声明等,这个工作JEDI和delphix都完成了
JEDI内的directdraw.pas只是完成对ddraw.dll的调用工作,在此文件中你看不到详尽的绘图函数,现成的函数全在ddraw.dll中
而如果你查看delphix的dxdraw.pas(好像是这个文件名吧?)中的源程序,你就可以看到它的绘图函数,其实Delphix是与ddraw.dll独立的游戏开发引擎,绘图引擎,而mir2
仅仅采用了其dxdraws.pas中的某些绘图函数,因为mir2源程序仅仅需要用到这些delphix中的这些函数,阅读mir2的源程序都知道,像delphix中的精灵类等在mir2中是没有被采用的,一个例子就是wil文件都是改装了原delphix中的图像资源打包类文件而来的
2005-11-17 5:28:13 传奇为什么会很卡??掉线时这种效果最明显
人物起跑“走一动,卡一步”
那是因为传奇这种网络游戏的客户端和服务端是基于消息通讯的
Grobal2.pas,,,客户端和服务端通用的文件,定义了一些消息标识,数据结构,消息操作函数
当网卡或掉线时
人物起跑,,走动都在客户端和服务端存在着基于消息标识的交互
客户端不能及时向服务器发送消息或得不到服务器的反馈消息就会卡
(服务器当然不会卡:))
##########################################################
unit HerbActor; //herb:不能移动的怪物??
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grobal2, DxDraws, CliUtil, magiceff, Actor, WIl;
const
BEEQUEENBASE = 600; //角蝇?
DOORDEATHEFFECTBASE = 120; //door death effect base沙皇宫门还是城门?
WALLLEFTBROKENEFFECTBASE = 224; //wall left broken effect base 看来是城门
WALLRIGHTBROKENEFFECTBASE = 240; //。。
type
TDoorState = (dsOpen, dsClose, dsBroken);
TKillingHerb = class (TActor)
private
public
constructor Create; override;
destructor Destroy; override;
procedure CalcActorFrame; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
end;
TBeeQueen = class (TActor)
private
public
procedure CalcActorFrame; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
end;
TCentipedeKingMon = class (TKillingHerb) //蜈蚣王???触龙神??
public
procedure CalcActorFrame; override;
end;
TCastleDoor = class (TActor) //很明显是城门
private
EffectSurface: TDirectDrawSurface;
ax, ay: integer;
oldunitx, oldunity: integer;
procedure ApplyDoorState (dstate: TDoorState);
public
BoDoorOpen: Boolean; //Bo,,be on,,是否处于什么什么的状态
constructor Create; override;
procedure CalcActorFrame; override;
procedure LoadSurface; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
procedure ActionEnded; override;
procedure Run; override;
procedure DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean); override;
end;
TWallStructure = class (TActor)
private
EffectSurface: TDirectDrawSurface;
BrokenSurface: TDirectDrawSurface;
ax, ay, bx, by: integer;
deathframe: integer;
bomarkpos: Boolean; //给啊霸 阜绊 乐绰瘤
public
constructor Create; override;
procedure CalcActorFrame; override;
procedure LoadSurface; override;
function GetDefaultFrame (wmode: Boolean): integer; override;
procedure DrawChr (dsurface: TDirectDrawSurface; dx, dy: integer; blend: Boolean); override;
procedure Run; override;
end;
implementation
uses
ClMain;
|
|