• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#objective-cqtwindows誰得cocoapythonphprubygameguibathyscaphec翻訳omegat計画中(planning stage)frameworktwittertestdomvb.netdirectxbtronarduinopreviewerゲームエンジン

X operations(XOPS)に非常に近いFPSゲームを制作・リメイクし、成果物をオープンソースとして公開することを目的としたプロジェクトです。


Commit MetaInfo

Revision187 (tree)
Zeit2017-10-29 11:13:14
Autorxops-mikan

Log Message

ショットガン使用時の命中数・命中率計算を改善、死体として静止するまで銃弾・手榴弾・ゾンビ攻撃の当たり判定を行うように。

Ändern Zusammenfassung

Diff

--- trunk/gamemain.cpp (revision 186)
+++ trunk/gamemain.cpp (revision 187)
@@ -1805,7 +1805,8 @@
18051805 //プレイヤーのクラスを取得
18061806 human *myHuman = ObjMgr.GetPlayerHumanObject();
18071807
1808- int ontarget, kill, headshot;
1808+ float ontarget;
1809+ int kill, headshot;
18091810
18101811 //-----------------------------------
18111812
@@ -2918,15 +2919,19 @@
29182919
29192920 //暫定リザルト表示
29202921 if( strcmp(NewCommand, "result") == 0 ){
2922+ int intontarget;
29212923 float rate;
2924+
2925+ //命中率計算
2926+ intontarget = (int)floor(MainGameInfo.ontarget);
29222927 if( MainGameInfo.fire == 0 ){
29232928 rate = 0.0f;
29242929 }
29252930 else{
2926- rate = (float)MainGameInfo.ontarget / MainGameInfo.fire * 100;
2931+ rate = (float)intontarget / MainGameInfo.fire * 100;
29272932 }
29282933
2929- sprintf(str, "Time %02d:%02d / Fired %d / On target %d", framecnt/(int)GAMEFPS/60, framecnt/(int)GAMEFPS%60, MainGameInfo.fire, MainGameInfo.ontarget);
2934+ sprintf(str, "Time %02d:%02d / Fired %d / On target %d(%0.2f)", framecnt/(int)GAMEFPS/60, framecnt/(int)GAMEFPS%60, MainGameInfo.fire, intontarget, MainGameInfo.ontarget);
29302935 AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), str);
29312936 sprintf(str, "AR rate %.1f%% / Kill %d / HS %d", rate, MainGameInfo.kill, MainGameInfo.headshot);
29322937 AddInfoConsole(d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), str);
@@ -3728,12 +3733,16 @@
37283733 char mname[64];
37293734 char str[32];
37303735 float effectA = GetEffectAlphaLoop(framecnt, 1.0f, 0.8f, true);
3736+ int intontarget;
37313737 float rate;
3738+
3739+ //命中率計算
3740+ intontarget = (int)floor(GameInfoData.ontarget);
37323741 if( GameInfoData.fire == 0 ){
37333742 rate = 0.0f;
37343743 }
37353744 else{
3736- rate = (float)GameInfoData.ontarget / GameInfoData.fire * 100;
3745+ rate = (float)intontarget / GameInfoData.fire * 100;
37373746 }
37383747
37393748 //メモ:背景画像の描画は、自動的に行われる。
@@ -3763,7 +3772,7 @@
37633772 d3dg->Draw2DTextureFontText(SCREEN_WIDTH/2-strlen(str)*20/2, 210, str, d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), 20, 32);
37643773 sprintf(str, "Rounds fired %d", GameInfoData.fire);
37653774 d3dg->Draw2DTextureFontText(SCREEN_WIDTH/2-strlen(str)*20/2, 260, str, d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), 20, 32);
3766- sprintf(str, "Rounds on target %d", GameInfoData.ontarget);
3775+ sprintf(str, "Rounds on target %d", intontarget);
37673776 d3dg->Draw2DTextureFontText(SCREEN_WIDTH/2-strlen(str)*20/2, 310, str, d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), 20, 32);
37683777 sprintf(str, "Accuracy rate %.1f%%", rate);
37693778 d3dg->Draw2DTextureFontText(SCREEN_WIDTH/2-strlen(str)*20/2, 360, str, d3dg->GetColorCode(1.0f,1.0f,1.0f,1.0f), 20, 32);
--- trunk/gamemain.h (revision 186)
+++ trunk/gamemain.h (revision 187)
@@ -82,7 +82,7 @@
8282 bool missioncomplete; //!< ミッション完了
8383 unsigned int framecnt; //!< フレーム数
8484 int fire; //!< 射撃回数
85- int ontarget; //!< 命中数
85+ float ontarget; //!< 命中数
8686 int kill; //!< 倒した敵の数
8787 int headshot; //!< 敵の頭部に命中した数
8888 };
--- trunk/main.cpp (revision 186)
+++ trunk/main.cpp (revision 187)
@@ -72,6 +72,13 @@
7272 GetModuleFileName(NULL, path, MAX_PATH);
7373 PathRemoveFileSpec(path);
7474 SetCurrentDirectory(path);
75+
76+ //char str[24];
77+ //GameConfig.GetPlayerName(str);
78+ //MessageBox(NULL, str, "プレイヤー名", MB_OK);
79+ char str[255];
80+ strcpy(str, "[Information]\nThe compiler is the Debug mode.\nIf release the software, Switch compiler to Release mode.");
81+ MessageBox(NULL, str, GAMENAME, MB_OK);
7582 #endif
7683
7784 #ifdef ENABLE_DEBUGLOG
@@ -89,10 +96,30 @@
8996 }
9097 }
9198
99+ //ユーザー環境を出力
100+ GetOperatingEnvironment();
101+
102+ char infostr[64];
103+
104+ /*
92105 //ログに出力
106+ sprintf(infostr, "%d個", __argc);
107+ OutputLog.WriteLog(LOG_CHECK, "引数", infostr);
108+ for(int i=0; i<__argc; i++){
109+ sprintf(infostr, "引数[%d]", i);
110+ OutputLog.WriteLog(LOG_CHECK, infostr, __argv[i]);
111+ }
112+ */
113+
114+ //ログに出力
93115 OutputLog.WriteLog(LOG_CHECK, "起動", "エントリーポイント開始");
94116 #endif
95117
118+#ifdef _DEBUG
119+ //ログに出力
120+ OutputLog.WriteLog(LOG_CHECK, "起動", "Visual C++ デバッグモード");
121+#endif
122+
96123 //設定ファイル読み込み
97124 if( GameConfig.LoadFile("config.dat") == 1 ){
98125 MainWindow.ErrorInfo("config data open failed");
@@ -99,13 +126,16 @@
99126 return 1;
100127 }
101128
102-#ifdef _DEBUG
103- //char str[24];
104- //GameConfig.GetPlayerName(str);
105- //MessageBox(NULL, str, "プレイヤー名", MB_OK);
106- char str[255];
107- strcpy(str, "[Information]\nThe compiler is the Debug mode.\nIf release the software, Switch compiler to Release mode.");
108- MessageBox(NULL, str, GAMENAME, MB_OK);
129+#ifdef ENABLE_DEBUGLOG
130+ //ログに出力
131+ sprintf(infostr, "解像度:%d x %d", SCREEN_WIDTH, SCREEN_HEIGHT);
132+ OutputLog.WriteLog(LOG_CHECK, "環境", infostr);
133+ if( GameConfig.GetFullscreenFlag() == false ){
134+ OutputLog.WriteLog(LOG_CHECK, "環境", "ウィンドウモード:ウィンドウ");
135+ }
136+ else{
137+ OutputLog.WriteLog(LOG_CHECK, "環境", "ウィンドウモード:フルスクリーン");
138+ }
109139 #endif
110140
111141 //ウィンドウ初期化
--- trunk/object.cpp (revision 186)
+++ trunk/object.cpp (revision 187)
@@ -190,9 +190,7 @@
190190 //else{
191191 hp = 0;
192192 //}
193-#ifdef HUMAN_DEADBODY_COLLISION
194193 deadstate = 0;
195-#endif
196194 add_ry = 0.0f;
197195 id_texture = -1;
198196
@@ -258,9 +256,7 @@
258256 else{
259257 hp = 0;
260258 }
261-#ifdef HUMAN_DEADBODY_COLLISION
262259 deadstate = 0;
263-#endif
264260 add_ry = 0.0f;
265261 MoveFlag = 0x00;
266262 MoveFlag_lt = MoveFlag;
@@ -313,13 +309,8 @@
313309 //! @warning 完全に静止した状態を「死体」と判定します。倒れている最中の人は対象に含まれないため、hp <= 0 が全て死体と判定されるとは限りません。
314310 bool human::GetDeadFlag()
315311 {
316-#ifdef HUMAN_DEADBODY_COLLISION
317312 if( deadstate == 5 ){ return true; }
318313 return false;
319-#else
320- if( hp <= 0 ){ return true; }
321- return false;
322-#endif
323314 }
324315
325316 //! @brief チーム番号を設定(上書き)
@@ -1207,6 +1198,7 @@
12071198 rotation_y += add_ry;
12081199 if( rotation_y >= DegreeToRadian(90) ){
12091200 rotation_y = DegreeToRadian(90);
1201+ deadstate = 5;
12101202 return 3;
12111203 }
12121204 return 2;
@@ -1216,6 +1208,7 @@
12161208 rotation_y += add_ry;
12171209 if( rotation_y <= DegreeToRadian(-90) ){
12181210 rotation_y = DegreeToRadian(-90);
1211+ deadstate = 5;
12191212 return 3;
12201213 }
12211214 return 2;
@@ -1257,6 +1250,7 @@
12571250 //スコープモードを解除
12581251 SetDisableScope();
12591252
1253+ deadstate = 1;
12601254 return 1;
12611255 }
12621256
@@ -1596,15 +1590,7 @@
15961590 if( CollD == NULL ){ return 0; }
15971591 if( EnableFlag == false ){ return 0; }
15981592
1599-#ifdef HUMAN_DEADBODY_COLLISION
16001593 if( deadstate == 5 ){ return 3; }
1601-#else
1602- if( hp <= 0 ){
1603- if( fabs(rotation_y) >= DegreeToRadian(90) ){
1604- return 3;
1605- }
1606- }
1607-#endif
16081594
16091595 int WeaponReloadCnt;
16101596 float FallDistance;
@@ -2390,8 +2376,9 @@
23902376 //! @param _speed 弾速
23912377 //! @param _teamid チーム番号
23922378 //! @param _humanid 人のデータ番号
2379+//! @param _ontargetcnt 命中時のカウント数
23932380 //! @param init オブジェクトを初期化
2394-void bullet::SetParamData(int _attacks, int _penetration, int _speed, int _teamid, int _humanid, bool init)
2381+void bullet::SetParamData(int _attacks, int _penetration, int _speed, int _teamid, int _humanid, float _ontargetcnt, bool init)
23952382 {
23962383 attacks = _attacks;
23972384 penetration = _penetration;
@@ -2398,6 +2385,7 @@
23982385 speed = _speed;
23992386 teamid = _teamid;
24002387 humanid = _humanid;
2388+ ontargetcnt = _ontargetcnt;
24012389
24022390 if( init == true ){
24032391 cnt = 0;
@@ -2425,7 +2413,8 @@
24252413 //! @param _speed 弾速を受け取るポインタ(NULL可)
24262414 //! @param _teamid チーム番号を受け取るポインタ(NULL可)
24272415 //! @param _humanid 人のデータ番号を受け取るポインタ(NULL可)
2428-void bullet::GetParamData(int *_attacks, int *_penetration, int *_speed, int *_teamid, int *_humanid)
2416+//! @param _ontargetcnt 命中時のカウント数を受け取るポインタ(NULL可)
2417+void bullet::GetParamData(int *_attacks, int *_penetration, int *_speed, int *_teamid, int *_humanid, float *_ontargetcnt)
24292418 {
24302419 if( _attacks != NULL ){ *_attacks = attacks; }
24312420 if( _penetration != NULL ){ *_penetration = penetration; }
@@ -2432,6 +2421,7 @@
24322421 if( _speed != NULL ){ *_speed = speed; }
24332422 if( _teamid != NULL ){ *_teamid = teamid; }
24342423 if( _humanid != NULL ){ *_humanid = humanid; }
2424+ if( _ontargetcnt != NULL ){ *_ontargetcnt = ontargetcnt; }
24352425 }
24362426
24372427 //! @brief 計算を実行(弾の進行・時間消滅)
@@ -2493,9 +2483,10 @@
24932483 //! @param speed 初速
24942484 //! @param _teamid チーム番号
24952485 //! @param _humanid 人のデータ番号
2486+//! @param _ontargetcnt 命中時のカウント数
24962487 //! @param init オブジェクトを初期化
24972488 //! @attention 先に SetPosData() を実行してください。
2498-void grenade::SetParamData(float speed, int _teamid, int _humanid, bool init)
2489+void grenade::SetParamData(float speed, int _teamid, int _humanid, float _ontargetcnt, bool init)
24992490 {
25002491 move_x = cos(rotation_x) * cos(rotation_y) * speed;
25012492 move_y = sin(rotation_y) * speed;
@@ -2502,6 +2493,7 @@
25022493 move_z = sin(rotation_x) * cos(rotation_y) * speed;
25032494 teamid = _teamid;
25042495 humanid = _humanid;
2496+ ontargetcnt = _ontargetcnt;
25052497
25062498 if( init == true ){
25072499 cnt = 0;
@@ -2512,11 +2504,13 @@
25122504 //! @param _speed 速度を受け取るポインタ(NULL可)
25132505 //! @param _teamid チーム番号を受け取るポインタ(NULL可)
25142506 //! @param _humanid 人のデータ番号を受け取るポインタ(NULL可)
2515-void grenade::GetParamData(float *_speed, int *_teamid, int *_humanid)
2507+//! @param _ontargetcnt 命中時のカウント数を受け取るポインタ(NULL可)
2508+void grenade::GetParamData(float *_speed, int *_teamid, int *_humanid, float *_ontargetcnt)
25162509 {
25172510 if( _speed != NULL ){ *_speed = GetSpeed(); }
25182511 if( _teamid != NULL ){ *_teamid = teamid; }
25192512 if( _humanid != NULL ){ *_humanid = humanid; }
2513+ if( _ontargetcnt != NULL ){ *_ontargetcnt = ontargetcnt; }
25202514 }
25212515
25222516 //! @brief 速度を取得
--- trunk/object.h (revision 186)
+++ trunk/object.h (revision 187)
@@ -145,9 +145,7 @@
145145 int selectweapon; //!< 武器A/Bの選択
146146 int selectweaponcnt; //!< 武器の切り替えカウント
147147 int hp; //!< 体力
148-#ifdef HUMAN_DEADBODY_COLLISION
149148 int deadstate; //!< 死体になっているか
150-#endif
151149 float add_ry; //!< 死体の倒れる加速度
152150 float move_rx; //!< 移動角度
153151 int MoveFlag; //!< 移動方向を表すフラグ
@@ -290,6 +288,7 @@
290288 int speed; //!< 弾速
291289 int teamid; //!< チーム番号
292290 int humanid; //!< 人のデータ番号
291+ float ontargetcnt; //!< 命中時のカウント数
293292 int cnt; //!< カウント
294293
295294 public:
@@ -296,9 +295,9 @@
296295 bullet(int modelid = -1, int textureid = -1);
297296 ~bullet();
298297 virtual void SetPosData(float x, float y, float z, float rx, float ry);
299- virtual void SetParamData(int _attacks, int _penetration, int _speed, int _teamid, int _humanid, bool init);
298+ virtual void SetParamData(int _attacks, int _penetration, int _speed, int _teamid, int _humanid, float _ontargetcnt, bool init);
300299 virtual void GetPosData(float *x, float *y, float *z, float *rx, float *ry);
301- virtual void GetParamData(int *_attacks, int *_penetration, int *_speed, int *_teamid, int *_humanid);
300+ virtual void GetParamData(int *_attacks, int *_penetration, int *_speed, int *_teamid, int *_humanid, float *_ontargetcnt);
302301 virtual int RunFrame();
303302 virtual void Render(class D3DGraphics *d3dg);
304303 };
@@ -313,8 +312,8 @@
313312 public:
314313 grenade(int modelid = -1, int textureid = -1);
315314 ~grenade();
316- void SetParamData(float speed, int _teamid, int _humanid, bool init);
317- void GetParamData(float *_speed, int *_teamid, int *_humanid);
315+ void SetParamData(float speed, int _teamid, int _humanid, float _ontargetcnt, bool init);
316+ void GetParamData(float *_speed, int *_teamid, int *_humanid, float *_ontargetcnt);
318317 float GetSpeed();
319318 int RunFrame(class Collision *CollD);
320319 virtual void Render(D3DGraphics *d3dg);
--- trunk/objectmanager.cpp (revision 186)
+++ trunk/objectmanager.cpp (revision 187)
@@ -42,7 +42,7 @@
4242 EffectIndex = new effect[MAX_EFFECT];
4343
4444 framecnt = 0;
45- Human_ontarget = new int[MAX_HUMAN];
45+ Human_ontarget = new float[MAX_HUMAN];
4646 Human_kill = new int[MAX_HUMAN];
4747 Human_headshot = new int[MAX_HUMAN];
4848 Human_ShotFlag = new bool[MAX_HUMAN];
@@ -648,6 +648,7 @@
648648 int speed;
649649 int teamid;
650650 int humanid;
651+ float ontargetcnt;
651652 float vx, vy, vz;
652653 int HumanHead_id;
653654 int HumanUp_id;
@@ -669,7 +670,7 @@
669670
670671 //弾丸の座標を取得し、ベクトルを算出。
671672 in_bullet->GetPosData(&bx, &by, &bz, &brx, &bry);
672- in_bullet->GetParamData(&attacks, &penetration, &speed, &teamid, &humanid);
673+ in_bullet->GetParamData(&attacks, &penetration, &speed, &teamid, &humanid, &ontargetcnt);
673674 vx = cos(brx)*cos(bry);
674675 vy = sin(bry);
675676 vz = sin(brx)*cos(bry);
@@ -712,9 +713,9 @@
712713 //その人自身が発砲した弾なら処理しない。
713714 if( i == humanid ){ continue; }
714715
715- //使用されていないか、死亡していれば処理しない。
716+ //使用されていないか、死体ならば処理しない。
716717 if( HumanIndex[i].GetEnableFlag() == false ){ continue; }
717- if( HumanIndex[i].GetHP() <= 0 ){ continue; }
718+ if( HumanIndex[i].GetDeadFlag() == true ){ continue; }
718719
719720 //既に当たった人なら、処理しない。
720721 if( BulletObj_HumanIndex[objectID].GetIndexFlag(i) == true ){ continue; }
@@ -816,7 +817,7 @@
816817 //人の頭との衝突距離が最短ならば〜
817818 if( (HumanHead_Dist <= speed)&&(HumanHead_Dist < map_Dist)&&(HumanHead_Dist < HumanUp_Dist)&&(HumanHead_Dist < HumanLeg_Dist)&&(HumanHead_Dist < SmallObject_Dist) ){
818819 //人に当たった処理
819- HitBulletHuman(HumanHead_id, 0, bx + vx*(HumanHead_Dist+TotalDist), by + vy*(HumanHead_Dist+TotalDist), bz + vz*(HumanHead_Dist+TotalDist), brx, attacks, humanid);
820+ HitBulletHuman(HumanHead_id, 0, bx + vx*(HumanHead_Dist+TotalDist), by + vy*(HumanHead_Dist+TotalDist), bz + vz*(HumanHead_Dist+TotalDist), brx, attacks, humanid, ontargetcnt);
820821
821822 //対人判定用リスト設定
822823 BulletObj_HumanIndex[objectID].SetIndexFlag(HumanHead_id);
@@ -831,7 +832,7 @@
831832 //人の上半身との衝突距離が最短ならば〜
832833 if( (HumanUp_Dist <= speed)&&(HumanUp_Dist < map_Dist)&&(HumanUp_Dist < HumanHead_Dist)&&(HumanUp_Dist < HumanLeg_Dist)&&(HumanUp_Dist < SmallObject_Dist) ){
833834 //人に当たった処理
834- HitBulletHuman(HumanUp_id, 1, bx + vx*(HumanUp_Dist+TotalDist), by + vy*(HumanUp_Dist+TotalDist), bz + vz*(HumanUp_Dist+TotalDist), brx, attacks, humanid);
835+ HitBulletHuman(HumanUp_id, 1, bx + vx*(HumanUp_Dist+TotalDist), by + vy*(HumanUp_Dist+TotalDist), bz + vz*(HumanUp_Dist+TotalDist), brx, attacks, humanid, ontargetcnt);
835836
836837 //対人判定用リスト設定
837838 BulletObj_HumanIndex[objectID].SetIndexFlag(HumanUp_id);
@@ -846,7 +847,7 @@
846847 //人の足との衝突距離が最短ならば〜
847848 if( (HumanLeg_Dist <= speed)&&(HumanLeg_Dist < map_Dist)&&(HumanLeg_Dist < HumanHead_Dist)&&(HumanLeg_Dist < HumanUp_Dist)&&(HumanLeg_Dist < SmallObject_Dist) ){
848849 //人に当たった処理
849- HitBulletHuman(HumanLeg_id, 2, bx + vx*(HumanLeg_Dist+TotalDist), by + vy*(HumanLeg_Dist+TotalDist), bz + vz*(HumanLeg_Dist+TotalDist), brx, attacks, humanid);
850+ HitBulletHuman(HumanLeg_id, 2, bx + vx*(HumanLeg_Dist+TotalDist), by + vy*(HumanLeg_Dist+TotalDist), bz + vz*(HumanLeg_Dist+TotalDist), brx, attacks, humanid, ontargetcnt);
850851
851852 //対人判定用リスト設定
852853 BulletObj_HumanIndex[objectID].SetIndexFlag(HumanLeg_id);
@@ -887,7 +888,7 @@
887888 }
888889
889890 //設定を適用(特に攻撃力・貫通力)
890- in_bullet->SetParamData(attacks, penetration, speed, teamid, humanid, false);
891+ in_bullet->SetParamData(attacks, penetration, speed, teamid, humanid, ontargetcnt, false);
891892 }
892893
893894 return CollideFlag;
@@ -916,23 +917,28 @@
916917 //! @param brx 水平角度
917918 //! @param attacks 攻撃力
918919 //! @param Shothuman_id 発射した人の番号
919-void ObjectManager::HitBulletHuman(int HitHuman_id, int Hit_id, float x, float y, float z, float brx, int attacks, int Shothuman_id)
920+//! @param ontargetcnt 命中時のカウント数
921+void ObjectManager::HitBulletHuman(int HitHuman_id, int Hit_id, float x, float y, float z, float brx, int attacks, int Shothuman_id, float ontargetcnt)
920922 {
921923 int Shothuman_TeamID;
922924 int HitHuman_TeamID;
925+ int hp_old;
923926 int damage = 0;
924927 int paramid;
925928 HumanParameter Paraminfo;
926929 bool NotRobot;
927930
928- //使用されていないか、死亡していれば処理しない。
931+ //使用されていないか、死体ならば処理しない。
929932 if( HumanIndex[HitHuman_id].GetEnableFlag() == false ){ return; }
930- if( HumanIndex[HitHuman_id].GetHP() <= 0 ){ return; }
933+ if( HumanIndex[HitHuman_id].GetDeadFlag() == true ){ return; }
931934
932935 //発射元と対象人物のチーム番号取得
933936 HumanIndex[Shothuman_id].GetParamData(NULL, NULL, NULL, &Shothuman_TeamID);
934937 HumanIndex[HitHuman_id].GetParamData(NULL, NULL, NULL, &HitHuman_TeamID);
935938
939+ //ダメージ計算前のHP取得
940+ hp_old = HumanIndex[HitHuman_id].GetHP();
941+
936942 //人にダメージと衝撃を与える
937943 if( Hit_id == 0 ){ HumanIndex[HitHuman_id].HitBulletHead(attacks); }
938944 if( Hit_id == 1 ){ HumanIndex[HitHuman_id].HitBulletUp(attacks); }
@@ -976,14 +982,15 @@
976982 GameSound->HitHuman(x, y, z, Shothuman_TeamID);
977983
978984 //弾を発射した人の成果に加算
979- Human_ontarget[Shothuman_id] += 1;
985+ Human_ontarget[Shothuman_id] += ontargetcnt;
980986 if( Hit_id == 0 ){ Human_headshot[Shothuman_id] += 1; }
981- if( HumanIndex[HitHuman_id].GetHP() <= 0 ){
987+ if( (hp_old > 0)&&(HumanIndex[HitHuman_id].GetHP() <= 0) ){
988+ //ダメージ計算前に hp>0 でかつ、計算後に hp <= 0 なら、今回死亡した。
982989 Human_kill[Shothuman_id] += 1;
983990 }
984991
985992 //ログ関係の処理
986- if( HumanIndex[HitHuman_id].GetHP() <= 0 ){
993+ if( (hp_old > 0)&&(HumanIndex[HitHuman_id].GetHP() <= 0) ){
987994 //ダメージ計算前に hp>0 でかつ、計算後に hp <= 0 なら、今回死亡した。
988995
989996 int player_teamid;
@@ -1043,13 +1050,13 @@
10431050 float gx, gy, gz;
10441051 int teamid, humanid;
10451052 in_grenade->GetPosData(&gx, &gy, &gz, NULL, NULL);
1046- in_grenade->GetParamData(NULL, &teamid, &humanid);
1053+ in_grenade->GetParamData(NULL, &teamid, &humanid, NULL);
10471054
10481055 //人に爆風の当たり判定
10491056 for(int i=0; i<MAX_HUMAN; i++){
1050- //初期化されていないか、死亡していれば処理しない。
1057+ //初期化されていないか、死体ならば処理しない。
10511058 if( HumanIndex[i].GetEnableFlag() == false ){ continue; }
1052- if( HumanIndex[i].GetHP() <= 0 ){ continue; }
1059+ if( HumanIndex[i].GetDeadFlag() == true ){ continue; }
10531060
10541061 int HitHuman_TeamID;
10551062 float hx, hy, hz;
@@ -1094,6 +1101,11 @@
10941101 }
10951102
10961103 if( total_damage > 0 ){
1104+ int hp_old;
1105+
1106+ //ダメージ計算前のHP取得
1107+ hp_old = HumanIndex[i].GetHP();
1108+
10971109 //ダメージを反映
10981110 HumanIndex[i].HitGrenadeExplosion(total_damage);
10991111
@@ -1147,7 +1159,7 @@
11471159 HumanIndex[i].AddPosOrder(arx, ary, 2.2f/MAX_DAMAGE_GRENADE_DISTANCE * (MAX_DAMAGE_GRENADE_DISTANCE - sqrt(x*x + y*y + z*z)));
11481160
11491161 //ログ関係の処理
1150- if( HumanIndex[i].GetHP() <= 0 ){
1162+ if( (hp_old > 0)&&(HumanIndex[i].GetHP() <= 0) ){
11511163 //ダメージ計算前に hp>0 でかつ、計算後に hp <= 0 なら、今回死亡した。
11521164
11531165 int player_teamid;
@@ -1898,13 +1910,15 @@
18981910 //(ショットガンなど)発射する弾の数分繰り返す
18991911 for(int i=0; i<ParamData.burst; i++){
19001912 int attacks;
1913+ float ontargetcnt;
19011914 float rx2, ry2;
19021915
19031916 //(ショットガンなど)発射する弾が複数あれば
19041917 if( ParamData.burst > 1 ){
1905- //1個の弾あたりの攻撃力を算出
1906- //  全弾合わせて、攻撃力の2倍になるようにする。
1918+ //1個の弾あたりの攻撃力と命中時のカウント数を算出
1919+ //  全弾合わせて、2倍になるようにする。
19071920 attacks = (int)( (float)ParamData.attacks / ((float)ParamData.burst/2) );
1921+ ontargetcnt = 1.0f / ((float)ParamData.burst/2);
19081922
19091923 //さらに誤差を増やして拡散させる
19101924 int len;
@@ -1914,8 +1928,9 @@
19141928 ry2 = ry + sin(a)*len * DegreeToRadian(0.15f);
19151929 }
19161930 else{
1917- //そのまま攻撃力へ反映
1931+ //そのまま攻撃力と命中時のカウント数を反映
19181932 attacks = ParamData.attacks;
1933+ ontargetcnt = 1.0f;
19191934
19201935 //発射誤差はそのまま
19211936 rx2 = rx;
@@ -1928,7 +1943,7 @@
19281943
19291944 //銃弾を発射
19301945 newbullet->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx2, ry2);
1931- newbullet->SetParamData(attacks, ParamData.penetration, ParamData.speed * BULLET_SPEEDSCALE, teamid, human_id, true);
1946+ newbullet->SetParamData(attacks, ParamData.penetration, ParamData.speed * BULLET_SPEEDSCALE, teamid, human_id, ontargetcnt, true);
19321947 newbullet->SetEnableFlag(true);
19331948
19341949 //対人判定用リスト初期化
@@ -1947,7 +1962,7 @@
19471962
19481963 //手榴弾発射
19491964 newgrenade->SetPosData(pos_x, pos_y + WEAPONSHOT_HEIGHT, pos_z, rx, ry);
1950- newgrenade->SetParamData(8.0f, teamid, human_id, true);
1965+ newgrenade->SetParamData(8.0f, teamid, human_id, 1.0f, true);
19511966 newgrenade->SetEnableFlag(true);
19521967 }
19531968
@@ -2207,7 +2222,7 @@
22072222 if( MyHuman->GetEnableFlag() == false ){ return false; }
22082223 if( MyHuman->GetHP() <= 0 ){ return false; }
22092224 if( EnemyHuman->GetEnableFlag() == false ){ return false; }
2210- if( EnemyHuman->GetHP() <= 0 ){ return false; }
2225+ if( EnemyHuman->GetDeadFlag() == true ){ return false; }
22112226
22122227 float mx, my, mz, mrx, tx, ty, tz;
22132228 int mteam, tteam;
@@ -2250,7 +2265,7 @@
22502265
22512266 //使用されていないか、死亡していれば処理しない。
22522267 if( EnemyHuman->GetEnableFlag() == false ){ return; }
2253- if( EnemyHuman->GetHP() <= 0 ){ return; }
2268+ if( EnemyHuman->GetDeadFlag() == true ){ return; }
22542269
22552270 int MyHuman_dataID, MyHuman_TeamID;
22562271 int EnemyHuman_dataID, EnemyHuman_TeamID;
@@ -2260,6 +2275,7 @@
22602275 int paramid;
22612276 HumanParameter Paraminfo;
22622277 bool NotRobot;
2278+ int hp_old;
22632279
22642280 //ゾンビ側と攻撃を受ける側チーム番号取得
22652281 MyHuman->GetParamData(NULL, &MyHuman_dataID, NULL, &MyHuman_TeamID);
@@ -2282,6 +2298,9 @@
22822298 NotRobot = true;
22832299 }
22842300
2301+ //ダメージ計算前のHP取得
2302+ hp_old = EnemyHuman->GetHP();
2303+
22852304 //ダメージなどを計算
22862305 EnemyHuman->HitZombieAttack();
22872306
@@ -2309,7 +2328,7 @@
23092328 GameSound->HitHuman(tx, ty, tz, MyHuman_TeamID);
23102329
23112330 //ログ関係の処理
2312- if( EnemyHuman->GetHP() <= 0 ){
2331+ if( (hp_old > 0)&&(EnemyHuman->GetHP() <= 0) ){
23132332 //ダメージ計算前に hp>0 でかつ、計算後に hp <= 0 なら、今回死亡した。
23142333
23152334 int player_teamid;
@@ -2505,7 +2524,7 @@
25052524 {
25062525 //このフレームの戦歴を初期化
25072526 for(int i=0; i<MAX_HUMAN; i++){
2508- Human_ontarget[i] = 0;
2527+ Human_ontarget[i] = 0.0f;
25092528 Human_kill[i] = 0;
25102529 Human_headshot[i] = 0;
25112530 }
@@ -2582,7 +2601,7 @@
25822601
25832602 if( BulletIndex[i].GetEnableFlag() == true ){
25842603 //弾の座標と角度を取得
2585- BulletIndex[i].GetParamData(NULL, NULL, &speed, &teamid, NULL);
2604+ BulletIndex[i].GetParamData(NULL, NULL, &speed, &teamid, NULL, NULL);
25862605 BulletIndex[i].GetPosData(&bx, &by, &bz, &brx, &bry);
25872606 mx = cos(brx)*cos(bry)*speed;
25882607 my = sin(bry)*speed;
@@ -2638,7 +2657,7 @@
26382657 float x, y, z;
26392658 int teamid;
26402659 GrenadeIndex[i].GetPosData(&x, &y, &z, NULL, NULL);
2641- GrenadeIndex[i].GetParamData(NULL, &teamid, NULL);
2660+ GrenadeIndex[i].GetParamData(NULL, &teamid, NULL, NULL);
26422661 GameSound->GrenadeBound(x, y, z, teamid);
26432662 }
26442663 }
@@ -2697,7 +2716,7 @@
26972716 //! @param kill 倒した敵の数を受け取るポインタ
26982717 //! @param headshot 敵の頭部に命中した数を受け取るポインタ
26992718 //! @return 成功:true 失敗:false
2700-bool ObjectManager::GetHumanShotInfo(int id, int *ontarget, int *kill, int *headshot)
2719+bool ObjectManager::GetHumanShotInfo(int id, float *ontarget, int *kill, int *headshot)
27012720 {
27022721 if( (id < 0)||(MAX_HUMAN-1 < id) ){ return false; }
27032722 *ontarget = Human_ontarget[id];
--- trunk/objectmanager.h (revision 186)
+++ trunk/objectmanager.h (revision 187)
@@ -81,7 +81,7 @@
8181
8282 unsigned int framecnt; //!< フレーム数のカウント
8383
84- int *Human_ontarget; //!< 命中数
84+ float *Human_ontarget; //!< 命中数
8585 int *Human_kill; //!< 倒した敵の数
8686 int *Human_headshot; //!< 敵の頭部に命中した数
8787 bool *Human_ShotFlag; //!< 発砲フラグ(マズルフラッシュ用)
@@ -112,7 +112,7 @@
112112 bool CollideHuman(human *in_humanA, human *in_humanB);
113113 bool CollideBullet(bullet *in_bullet);
114114 void HitBulletMap(float x, float y, float z, int teamID);
115- void HitBulletHuman(int HitHuman_id, int Hit_id, float x, float y, float z, float brx, int attacks, int humanid);
115+ void HitBulletHuman(int HitHuman_id, int Hit_id, float x, float y, float z, float brx, int attacks, int humanid, float ontargetcnt);
116116 void HitBulletSmallObject(int HitSmallObject_id, float x, float y, float z, int attacks, int teamID);
117117 bool GrenadeExplosion(grenade *in_grenade);
118118 void DeadEffect(human *in_human);
@@ -169,7 +169,7 @@
169169 int CheckGameOverorComplete();
170170 bool GetObjectInfoTag(float camera_x, float camera_y, float camera_z, float camera_rx, float camera_ry, int *color, char *infostr);
171171 int Process(int cmdF5id, bool demomode, float camera_rx, float camera_ry, bool screen);
172- bool GetHumanShotInfo(int id, int *ontarget, int *kill, int *headshot);
172+ bool GetHumanShotInfo(int id, float *ontarget, int *kill, int *headshot);
173173 void Render(float camera_x, float camera_y, float camera_z, int HidePlayer);
174174 void RenderLog(int x, int y);
175175 void Cleanup();