版主:

图文——标题:关于创建人物的技能

楼主发表于: 2006年12月11日 16:20:07 短消息
ャ誮絮`.oノ
  • 级别 注册用户
  • 称谓 小石头
  • 精华 0
  • 发贴 0
  • 积分 0
  • 游戏网金币 0
  • 在线时间 0小时
  • 注册时间 2007-1-22
  • 最后登陆 2007-1-22

关于创建人物的技能

文章出处:铁资网  作者: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

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

$Page1$

快速回复

登录名:
密码: 马上注册! 如果您还不是游戏网会员请点击马上注册,如果您是......
心情:
:revertSmile50: :revertSmile51: :revertSmile52: :revertSmile53: :revertSmile55: :revertSmile56: :revertSmile57: :revertSmile58: :revertSmile60: :revertSmile61: :revertSmile63: :revertSmile65: :revertSmile66: :revertSmile67: :revertSmile70:
内容:
验证码: 看不清?点击图片换图(游客回复需通过认证才能显示,想立即看到回复,请注册登录)
[完成后可按 Ctrl+Enter 回复]推荐朋友,获得无限社区积分!
  • 游戏网声明:
  • 本社区(http://bbs.youxi.com)所载所有内容皆为网友上传。 游戏网只为网友提供空间和平台,并不代表本网赞同其观点和对其真实性负责。如因作品内容、版权和其它问题需要同本网联系的,请于该信息发布之日起30日内进行。
  • 文明回贴是一种美德,尊重他人等于尊重自己!