X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。
| Revision | 153 (tree) |
|---|---|
| Time | 2016-09-28 01:32:55 |
| Author | |
AIにおいて、手榴弾を持っていない状態で「手榴弾投げ」パスの無限ループに突入した際の、バグ(仕様)を再現。
| @@ -1094,6 +1094,9 @@ | ||
| 1094 | 1094 | int selectweapon; |
| 1095 | 1095 | class weapon *weapon[TOTAL_HAVEWEAPON]; |
| 1096 | 1096 | int weaponid, nbs, i; |
| 1097 | + pointdata pdata; | |
| 1098 | + float posy2; | |
| 1099 | + float atan_rx, atan_ry; | |
| 1097 | 1100 | |
| 1098 | 1101 | for(int i=0; i<TOTAL_HAVEWEAPON; i++){ |
| 1099 | 1102 | weapon[i] = NULL; |
| @@ -1109,19 +1112,12 @@ | ||
| 1109 | 1112 | } |
| 1110 | 1113 | } |
| 1111 | 1114 | } |
| 1112 | - if( i == TOTAL_HAVEWEAPON ){ | |
| 1113 | - return 2; | |
| 1114 | - } | |
| 1115 | 1115 | |
| 1116 | - //手榴弾を持っていなければ、切り替える | |
| 1117 | - if( i != selectweapon ){ | |
| 1116 | + //手榴弾に切り替えられるなら、切り替える | |
| 1117 | + if( (i != TOTAL_HAVEWEAPON)&&(i != selectweapon) ){ | |
| 1118 | 1118 | ObjMgr->ChangeWeapon(ctrlid, i); |
| 1119 | 1119 | } |
| 1120 | 1120 | |
| 1121 | - pointdata pdata; | |
| 1122 | - float posy2; | |
| 1123 | - float atan_rx, atan_ry; | |
| 1124 | - | |
| 1125 | 1121 | //パスと人の高さを取得 |
| 1126 | 1122 | MoveNavi->GetPathPointData(&pdata); |
| 1127 | 1123 | posy2 = posy + VIEW_HEIGHT; |
| @@ -1132,6 +1128,24 @@ | ||
| 1132 | 1128 | //目標地点への角度を求める |
| 1133 | 1129 | CheckTargetAngle(posx, posy2, posz, rx*-1 + (float)M_PI/2, ry, pdata.x, pdata.y, pdata.z, 0.0f, &atan_rx, &atan_ry, NULL); |
| 1134 | 1130 | |
| 1131 | + //手榴弾を持っていなければ | |
| 1132 | + if( i == TOTAL_HAVEWEAPON ){ | |
| 1133 | + //※手榴弾を持っていない場合でも、このフレームではその方向へ向かせるよう処理する。 | |
| 1134 | + // この処理により、手榴弾を持っていない状態で かつ手榴弾投げの無限ループに陥った場合、手榴弾投げパスの方角を向き続ける。 | |
| 1135 | + // (本家XOPSの仕様) | |
| 1136 | + | |
| 1137 | + //旋回 | |
| 1138 | + if( atan_rx > 0.0f ){ | |
| 1139 | + ObjDriver->SetModeFlag(AI_CTRL_TURNLEFT); | |
| 1140 | + } | |
| 1141 | + if( atan_rx < 0.0f ){ | |
| 1142 | + ObjDriver->SetModeFlag(AI_CTRL_TURNRIGHT); | |
| 1143 | + } | |
| 1144 | + ArmAngle(); | |
| 1145 | + | |
| 1146 | + return 2; | |
| 1147 | + } | |
| 1148 | + | |
| 1135 | 1149 | //旋回 |
| 1136 | 1150 | if( atan_rx > 0.0f ){ |
| 1137 | 1151 | ObjDriver->SetModeFlag(AI_CTRL_TURNLEFT); |