当前位置:铁资首页>>铁血联盟>>心得体会>>正文
关于创建人物的技能
文章出处:铁资网  作者:sniper0214  发布时间:2005-03-11
  在网上一直没有找到关于创建人物的技能的详细说明,前几天下载了一份源代码,看了看,总结如下.
关于16个问题的答案和技能的关系见附件,其中第1和12题选则答案1时获得的技能和性别有关(F代表女性,M代表男性).

通过该表可以看出有10道题的回答和人物的技能有关,也就是说最多可以选择10个技能,如何从这10个中选出2个呢?我会把部分源代码贴出来并加以分析.

1.根据问题的题号和答案的号码确定要获得什么技能并保存起来(代码过长,在这里就不贴了).

2.根据人物属性从保存的技能列表中除去某些不符合人物属性的技能,具体如下
a.如果机械能力等于0,则除去电子学.
if ( pProfile->bMechanical == 0 )
{
// without mechanical, electronics is useless
iIndex = FindSkillInSkillsList( ELECTRONICS );
while ( iIndex != -1 )
{
RemoveSkillFromSkillsList( iIndex );
iIndex = FindSkillInSkillsList( ELECTRONICS );
}
}

b.如果人物的机械x智力/100x灵巧/100+25小于50,则除去撬锁
INT32 iValue = pProfile->bMechanical;
iValue = ( iValue * pProfile->bWisdom ) / 100;
iValue = ( iValue * pProfile->bDexterity ) / 100;
if ( iValue + gbSkillTraitBonus[ LOCKPICKING ] < 50 )
{
// not good enough for lockpicking!
// so is lockpicking
iIndex = FindSkillInSkillsList( LOCKPICKING );
while ( iIndex != -1 )
{
RemoveSkillFromSkillsList( iIndex );
iIndex = FindSkillInSkillsList( LOCKPICKING );
}
}
gbSkillTraitBous[LOCKPICKING] = 25

c.如果人物的枪法等于0,则除去自动武器,双手武器,重武器
if ( pProfile->bMarksmanship == 0 )
{
// without marksmanship, the following traits are useless:
// auto weapons, heavy weapons
iIndex = FindSkillInSkillsList( AUTO_WEAPS );
while ( iIndex != -1 )
{
RemoveSkillFromSkillsList( iIndex );
iIndex = FindSkillInSkillsList( AUTO_WEAPS );
}
// so is lockpicking
iIndex = FindSkillInSkillsList( HEAVY_WEAPS );
while ( iIndex != -1 )
{
RemoveSkillFromSkillsList( iIndex );
iIndex = FindSkillInSkillsList( HEAVY_WEAPS );
}
}

3.然后在选择的技能中随机抽取两个并保证不同时为双手武器或电子学(由于是随机抽取,所以在在回答问题时不要选择2个以上的技能),作为人物的两个技能
iDiceValue = Random( iLastElementInSkillsList );
//iLastElementInSkillsList是获得的技能总数
//Random产生一个比指定数小的随机数

// set attitude
iSkillA = SkillsList[ iDiceValue ];

// second dice value
iDiceValue = Random( iLastElementInSkillsList );

iSkillB = SkillsList[ iDiceValue ];

// allow expert level for generated merc so you CAN have two of the same
// but there is no such thing as expert level for electronics
while ( iSkillA == iSkillB && ( iSkillB == ELECTRONICS || iSkillB == AMBIDEXT ) )
{
// remove electronics as an option and roll again
RemoveSkillFromSkillsList( iDiceValue );
if ( iLastElementInSkillsList == 0 )
{
// ok, only one trait!
iSkillB = NO_SKILLTRAIT;
break;
}
else
{
iDiceValue = Random( iLastElementInSkillsList );
iSkillB = SkillsList[ iDiceValue ];
}
}

4.最后根据人物性别,肖像,属性决定人物是否强壮,条件是:男性,肖像为第1,7,8张,力量大于等于75,这时人物图像会变壮,武术技能会改为徒手搏斗.女性无法变得强壮,也无法获得武术技能,武术技能会改为徒手搏斗.

BOOLEAN ShouldThisMercHaveABigBody( void )
{
// should this merc be a big body typ
if ( ( iPortraitNumber == 0 ) || ( iPortraitNumber == 6 ) || ( iPortraitNumber == 7 ) )
{
if ( gMercProfiles[ PLAYER_GENERATED_CHARACTER_ID + LaptopSaveInfo.iVoiceId ].bStrength >= 75 )
{
return( TRUE );
}
}

return( FALSE );
}

// body type
if ( fCharacterIsMale )
{
// male
// big or regular
if( ShouldThisMercHaveABigBody())
{
gMercProfiles[ PLAYER_GENERATED_CHARACTER_ID + LaptopSaveInfo.iVoiceId ].ubBodyType = BIGMALE;
if( iSkillA == MARTIALARTS )
{
iSkillA = HANDTOHAND;
}
if( iSkillB == MARTIALARTS )
{
iSkillB = HANDTOHAND;
}
}
else
{
gMercProfiles[ PLAYER_GENERATED_CHARACTER_ID + LaptopSaveInfo.iVoiceId ].ubBodyType = REGMALE;
}
}
else
{
// female
gMercProfiles[ PLAYER_GENERATED_CHARACTER_ID + LaptopSaveInfo.iVoiceId ].ubBodyType = REGFEMALE;
if( iSkillA == MARTIALARTS )
{
iSkillA = HANDTOHAND;
}
if( iSkillB == MARTIALARTS )
{
iSkillB = HANDTOHAND;
}
}

从源代码可以看出16个问题反映了人物3种属性:技能,个性和人格,其中个性部分似乎被忽略了.
void AddAPersonalityToPersonalityList(INT8 bPersonlity)
{
// CJC, Oct 26 98: prevent personality list from being generated
// because no dialogue was written to support PC personality quotes

// BUT we can manage this for PSYCHO okay

if ( bPersonlity != PSYCHO )
{
return;
}

// will add a persoanlity to persoanlity list
if( iLastElementInPersonalityList < ATTITUDE_LIST_SIZE)
{
// add element
PersonalityList[ iLastElementInPersonalityList ] = ( INT32 )bPersonlity;

// increment attitude list counter
iLastElementInPersonalityList++;
}

return;
}

第9题的第2个选项和第12题的第7个选项的处理结果和代码的注释不符,不知道大家现在玩的版本中是否已改正,在附件中用?标记,建议不要选择这两个答案.

人物的性格是从选择次数最多的性格中随机选择一个.
void CreatePlayerAttitude( void )
{
// this function will 'roll a die' and decide if any attitude does exists
INT32 iDiceValue = 0;
INT32 iCounter = 0, iCounter2 = 0;

INT32 iAttitudeHits[NUM_ATTITUDES] = { 0 };
INT32 iHighestHits = 0;
INT32 iNumAttitudesWithHighestHits = 0;

iAttitude = ATT_NORMAL;

if ( iLastElementInAttitudeList == 0 )
{
return;
}

// count # of hits for each attitude
for ( iCounter = 0; iCounter < iLastElementInAttitudeList; iCounter++ )
{
iAttitudeHits[ AttitudeList[ iCounter ] ]++;
}

// find highest # of hits for any attitude
for ( iCounter = 0; iCounter < NUM_ATTITUDES; iCounter++ )
{
if ( iAttitudeHits[ iCounter ] )
{
if ( iAttitudeHits[ iCounter ] > iHighestHits )
{
iHighestHits = __max( iHighestHits, iAttitudeHits[ iCounter ] );
iNumAttitudesWithHighestHits = 1;
}
else if ( iAttitudeHits[ iCounter ] == iHighestHits )
{
iNumAttitudesWithHighestHits++;
}
}
}

// roll dice
iDiceValue = Random( iNumAttitudesWithHighestHits + 1 );

// find attitude
for ( iCounter = 0; iCounter < NUM_ATTITUDES; iCounter++ )
{
if ( iAttitudeHits[ iCounter ] == iHighestHits )
{
if ( iCounter2 == iDiceValue )
{
// this is it!
iAttitude = iCounter2;
break;
}
else
{
// one of the next attitudes...
iCounter2++;
}
}
}

}

如果有不对的地方请大家指出,并附上16个问题的答案以及人物的属性和获得的技能,我会进行修改.


可以获得的物品

得到防弹衣
产生一个100以内的随机数,小于智力,得到头盔
得到水壶
如果枪法小于80,得到BERETTA 93R和子弹,否则得到MP5K和子弹
医疗大于等于60,得到医疗箱,否则若医疗大于等于30,得到急救包
机械大于等于50,得到工具箱
爆破大于等于50,得到TNT

有撬锁,得到开门工具
有空手搏斗,得到指环
有电子学,得到金属探测器
有夜视,得到照明棒
有投掷,得到飞刀
有潜行,得到消声器
有刀技,得到战斗刀
有伪装,得到伪装箱

  [本文结束]

[返回顶部][责任编辑:巴比] 

§相关文章§
·[WF]野火全日记(全攻略)
·关于铁人模式下的生存原则
·佣兵的废都——UC攻略
·揭开真相:JA2误区/疑问大
·铁血各版本介绍
·子弹的伤害力计算
·为了生存-中断能力的计算
·暗杀&扒枪小议
§推荐文章§
·JA3D超酷最新壁纸!!!
·[WF]夜战攻坚初探
·RUB心得体会
·将死狙击手!
·UC物品表
·扒枪指北
Copyright©2003-2005 铁资网&铁血联盟资讯网.All rights reserved.
本站所有原创图文资料版权属原作者所有,转载请务必联系原作者并请注明本站出处.
Powered by: dedeCMS Version 2.1