《命令与征服:重制版》MOD制作图文教程
- 来源:3DM论坛
- 作者:bbitt
- 编辑:月色如画
首先对上边关于单位的代码段中关于可购买的阵营做一个补充 HOUSEF_GOOD, // OWNABLE: Ownable by house (bit field).
这段代码代表的是可购买的阵营 HOUSEF_GOOD 是GDI HOUSEF_BAD 是NOD ,如果设置成 HOUSEF_GOOD|(回车换行)HOUSEF_BAD, 就是两个阵营都能选。
四、上边给大家讲到了UDATA.CPP 中对于游戏中单位的修改。通过之前提到的对比方式我们可以在以下几个文件中查到并修改相关的一些数据。
AADATA.CPP 里面存放的是飞行单位的数据
BDATA.CPP 里面存放的是建筑物的数据
BBDATA.CPP 里面可以找到子弹相关数据(修改武器属性可以用到)
CONST.CPP 里面存放的是常量数据,我们可以在里面找到武器属性、弹头伤害等相关的数据
DEFINE.H 里面是一些定义 比如武器有哪些、弹头有哪些,因为没深层次研究所以不知道是否在这里增加武器。因为就算光在这里增加武器,没修改其他相关代码也没用。
飞行单位和建筑物的修改,我就不做过多介绍了,仔细看好 // 符号右边的相关注释,实在不知道怎么改对比一下同类其他单位或建筑物的代码,一般不会有什么大问题。
我们接下来讲一下CONST.CPP 中武器伤害的修改。
首先我们先通过之前查找单位相关代码中找到关于 第一武器和第二武器的代码。然后在 CONST.CPP 中查找你相关的武器代码,例如 WEAPON_M60MG (jeep的M60机枪)
可以看到以下的代码:
***************************************************************************
** 这些是各种武器及其特点
**
** 子弹类型 伤害,再次发射间隔,范围, 声音,动画 //右边的是武器代码
*/
WeaponTypeClass const Weapons[WEAPON_COUNT] = {
{BULLET_SNIPER, 125, 40, 0x0580, VOC_SNIPER, ANIM_NONE}, // WEAPON_RIFLE
{BULLET_SPREADFIRE, 25, 50, 0x0400, VOC_MINI, ANIM_GUN_N}, // WEAPON_CHAIN_GUN
{BULLET_BULLET, 1, 7, 0x01C0, VOC_RIFLE, ANIM_NONE}, // WEAPON_PISTOL
{BULLET_BULLET, 15, 20, 0x0200, VOC_MGUN2, ANIM_NONE}, // WEAPON_M16
{BULLET_TOW, 30, 60, 0x0400, VOC_BAZOOKA,ANIM_NONE}, // WEAPON_DRAGON
{BULLET_FLAME, 35, 50, 0x0200, VOC_FLAMER1,ANIM_FLAME_N}, // WEAPON_FLAMETHROWER
{BULLET_FLAME, 50, 50, 0x0200, VOC_FLAMER1,ANIM_FLAME_N}, // WEAPON_FLAME_TONGUE
{BULLET_CHEMSPRAY, 80, 70, 0x0200, VOC_FLAMER1,ANIM_CHEM_N}, // WEAPON_CHEMSPRAY
{BULLET_GRENADE, 50, 60, 0x0340, VOC_TOSS, ANIM_NONE}, // WEAPON_GRENADE
{BULLET_APDS, 25, 60, 0x0400, VOC_TANK2, ANIM_MUZZLE_FLASH}, // WEAPON_75MM
{BULLET_APDS, 30, 50, 0x04C0, VOC_TANK3, ANIM_MUZZLE_FLASH}, // WEAPON_105MM
{BULLET_APDS, 40, 80, 0x04C0, VOC_TANK4, ANIM_MUZZLE_FLASH}, // WEAPON_120MM
{BULLET_APDS, 40, 60, 0x0600, VOC_TANK4, ANIM_MUZZLE_FLASH}, // WEAPON_TURRET_GUN
{BULLET_SSM, 75, 80, 0x0500, VOC_ROCKET1,ANIM_NONE}, // WEAPON_MAMMOTH_TUSK
{BULLET_SSM2, 75, 80, 0x0600, VOC_ROCKET1,ANIM_NONE}, // WEAPON_MLRS
{BULLET_HE, 150, 65, 0x0600, VOC_TANK1, ANIM_MUZZLE_FLASH}, // WEAPON_155MM
{BULLET_BULLET, 15, 30, 0x0400, VOC_MGUN11, ANIM_GUN_N}, // WEAPON_M60MG
{BULLET_SSM, 60, 35, 0x0780, VOC_ROCKET2,ANIM_NONE}, // WEAPON_TOMAHAWK
{BULLET_SSM, 60, 40, 0x0680, VOC_ROCKET2,ANIM_NONE}, // WEAPON_TOW_TWO
{BULLET_NAPALM, 100, 20, 0x0480, VOC_NONE, ANIM_NONE}, // WEAPON_NAPALM
{BULLET_LASER, 200, 90, 0x0780, VOC_LASER, ANIM_NONE}, // WEAPON_OBELISK_LASER
{BULLET_SAM, 50, 50, 0x0780, VOC_ROCKET2,ANIM_NONE}, // WEAPON_NIKE
{BULLET_HONEST_JOHN, 100, 200, 0x0A00, VOC_ROCKET1,ANIM_NONE}, // WEAPON_HONEST_JOHN
{BULLET_HEADBUTT, 100, 30, 0x0180, VOC_DINOATK1,ANIM_NONE}, // WEAPON_STEG
{BULLET_TREXBITE, 155, 30, 0x0180, VOC_DINOATK1,ANIM_NONE}, // WEAPON_TREX
#ifdef PETROGLYPH_EXAMPLE_MOD
{BULLET_NUKE_LOB, 150, 130, 0x0B00, VOC_NUKE_LOB, ANIM_MUZZLE_FLASH}, // WEAPON_NUKE_LOB
#endif //PETROGLYPH_EXAMPLE_MOD
从上边代码可以看出M60机枪的默认属性
使用的子弹类型是BULLET_BULLET(普通子弹),伤害值——15,射击间隔(暂定为15=1秒)2秒,射击距离为0x0400(怎么计算不知道),声音为VOC_MGUN11,射击动画 ANIM_GUN_N
这段代码结合其他武器代码,我们可以修改伤害值不用说,比如把射击距离改的和155MM舰炮一样0x0600,子弹类型改成 BULLET_HE(高爆)或者 BULLET_NUKE_LOB (核弹)。
我们接下来看一下子弹的相关数据,以高爆弹 BULLET_HE为例,我们从BBDATA.CPP 里查到代码如下:
tatic BulletTypeClass const Class120mm(
BULLET_HE,
"120mm", // NAME: Text name of this unit type. 单位名称
true, // Flies over tall walls? 是否飞跃建筑物
false, // Homes in on target? 房屋是否列为目标
true, // Projectile arcs to the target? 向目标发射弧线弹道吗
false, // Is this a dropping bomb-like object? 这是否是一个炸弹
false, // Is this projectile invisible? 这个投射物不可见吗?
false, // Will it blow up even if it gets just NEAR to target? 接近目标,会爆炸吗?
false, // Does it have flickering flame animation? 是否有闪烁的火焰动画
false, // Can it run out of fuel? 是否会耗光燃料
true, // Is there no visual difference between projectile facings? 抛射面之间是否没有视觉差异
true, // Is projectile inherently inaccurate? 抛射本身就不准确吗?
false, // Translucent colors are used? 使用半透明的颜色
false, // Good against aircraft? 是否对飞机有好处
0, // ARMING: Time to arm projectile after launch. 发射后准备发射的时间
0, // RANGE: Inherent override range factor. 固有覆盖范围因子
MPH_MEDIUM_FAST, // SPEED: Miles per hour.
0, // ROT: Rate of turn (degrees per tick). 旋转速度
WARHEAD_HE, // WARHEAD: If fires weapon, warhead type 子弹的弹头类型
ANIM_ART_EXP1 // Explosion to use upon impact. 子弹爆炸的动画
);。
子弹的弹头相关数据还在 CONST.CPP 中,就在武器代码的下方:
/***************************************************************************
** 这些是各种弹头。
**
** 扩散系数, 是否摧毁墙壁,是否摧毁建筑, 是否摧毁泰矿, {装甲防御表} ///装甲防御表代表不同的装甲在该种弹头的攻击下受到的不同的伤害比例
** -vs- {无装甲, 木头, 铝质, 钢铁, 混凝土}
*/
WarheadTypeClass const Warheads[WARHEAD_COUNT] = {
{ 2,false,false,false,{0x100, 0x80, 0x90, 0x40, 0x40}}, // WARHEAD_SA Small arms -- good against infantry.
{ 6,true,true,true,{0xE0, 0xC0, 0x90, 0x40, 0x100}}, // WARHEAD_HE High explosive -- good against buildings & infantry.
{ 6,true,true,false,{0x40, 0xC0, 0xC0, 0x100, 0x80}}, // WARHEAD_AP Armor piercing -- good against armor.
{ 8,false,true,true,{0xE0, 0x100, 0xB0, 0x40, 0x80}}, // WARHEAD_FIRE Incendiary -- Good against flammables.
{ 4,false,false,false,{0x100, 0x100, 0x100, 0x100, 0x100}},// WARHEAD_LASER Light Amplification of Stimulated Emission by Radiation.
{ 7,true,true,true,{0x100, 0x100, 0xC0, 0xC0, 0xC0}}, // WARHEAD_PB Particle beam (neutron beam).
{ 4,false,false,false,{0x100, 0x20, 0x20, 0x10, 0x10}}, // WARHEAD_FIST Punching in hand-to-hand combat.
{ 4,false,false,false,{0x100, 0x20, 0x20, 0x10, 0x10}}, // WARHEAD_FOOT Kicking in hand-to-hand combat.
{ 4,false,false,false,{0x100, 0x08, 0x08, 0x08, 0x08}}, // WARHEAD_HOLLOW_POINT Sniper bullet type.
{255,false,false,false,{0x100, 0x01, 0x01, 0x01, 0x01}}, // WARHEAD_SPORE
{ 1, true,true,false,{0x100, 0xC0, 0x80, 0x20, 0x08}}, // WARHEAD_HEADBUTT
{ 1, true,true,false,{0x100, 0xC0, 0x80, 0x20, 0x08}}, // WARHEAD_FEEDME
};
对比一下各种弹头对于不同类型伤害,可以看出,WARHEAD_HE 弹头,对于无装甲目标的时候的伤害是最高的 0xE0 。只要不超过这个值你可以根据需要自己设置。
五,超级武器冷却间隔的设置
STEAM创意工厂已经有人放出了修改了冷却时间的MOD,这里就给大家讲一下搜索以及修改的原理
我们首先要知道两个要素:1 超级武器里的核武 NUKE ;2 时间 TIME ,其次要知道 TIME 这个要素肯定有很多地方会用到,相对的 NUKE 则会用到的地方少一些。
在 Microsoft Visual Studio 打开的源代码中按 CTRL+SHIFT+F 弹出搜索框,查找内容一栏输入 NUKE ,查找范围选择 当前项目 ,然后点 查找全部,会在下方出现 查找结果 。
我们从查找结果列表中可以看到列出的各个文件中包含 NUKE 这个代码的所有文件和相对应的代码语句。鼠标点击列表中的任意一项就会打开对应的文件以及定位到对应的语句。
通过查找列表可以看到 SOURCECODE\TIBERIANDAWN\DEFINES.H(320):#define NUKE_GONE_TIME 14*TICKS_PER_MINUTE 这一项中两个要查找的要素都包含。
点击该项打开文件,我们可以看到以下代码段:
/**********************************************************************
** These defines control the rate of ion cannon and airstrike recharging.
*/
#define NUKE_GONE_TIME 14*TICKS_PER_MINUTE //核武冷却时间
#define ION_CANNON_GONE_TIME 10*TICKS_PER_MINUTE //离子加农炮冷却时间
#define AIR_CANNON_GONE_TIME 8*TICKS_PER_MINUTE //空中打击冷却时间
#define OBELISK_ANIMATION_RATE 15
这就是超级武器的冷却时间。但是 TICKS_PER_MINUTE 是什么意思呢?用上边讲到的方法,我们查找 TICKS_PER_MINUTE ,在 ABSTRACT.CPP 文件中可以找到以下代码段:
/****************************************************************************
** Timer constants. These are used when setting the countdown timer.
** Note that this is based upon a timer that ticks every 60th of a second.
*/
#define TICKS_PER_SECOND 15
#define TICKS_PER_MINUTE (TICKS_PER_SECOND * 60)
#define TIMER_SECOND 60
#define TIMER_MINUTE (TIMER_SECOND*60)
这个是整个源代码中对于一些时间变量的定义。比如你查到的时间变量是 14*TICKS_PER_MINUTE ,这个是多久?通过这个定义就知道了,是14分钟。如果查到的是 14*TIMER_SECOND,就是14秒。
了解了时间变量 TICKS_PER_MINUTE 的含义,我们回到之前的超级武器冷却时间的代码段,就明白了该怎么设置了吧。3*TICKS_PER_SECOND ? 1*TICKS_PER_MINUTE?一切都随你所愿。如果想
彻底无冷却就改成 0*TICKS_PER_MINUTE 即可。
附件链接:https://pan.baidu.com/s/1O9OE6PWy4OM9unHSSizJjQ
提取码:cx1j
玩家点评 (0人参与,0条评论)
热门评论
全部评论