Welcome to the POSSESSION.jp!

We are the global gaming community from Japan. By registering with us, you'll be able to discuss, share and private message with other members of our community.
POSSESSION は日本発祥のゲーミングコミュニティです。 私たちのコミュニティに参加して、様々なディスカッションや情報共有をしてみましょう。

SignUp Now!

第一回 どんどこZE最強SMG武器決定戦 ~PSE Edition~

Urucy

uwu
Staff member
Joined
Apr 14, 2019
Messages
59
Steam
View
タイトルどおり、今回はZEにおいてどのSMGが最強なのか、ここではっきりさせたいと思います

文章がほぼプログラム関係になってしまったので結果だけ聞きたい方向け: MP9優勝です

ここで言う最強の定義とは、銃を撃ち続けた際の火力、つまり、結局撃ち続けたらどれが強いん?ってやつを比較します。(DPS最強は言うまでもなくMP9とP90が最強です)

PSEの弾数設定は標準のCSGOの弾数とは違ってカスタマイズされています。2019/12/09時点での弾数は以下の通りです。

MP9: 45
Mac10: 50
MP7, MP5, UMP, P90, Bizon: 60

それぞれのSMGに設定されているRPM(1分間に大体どれくらいバンバン撃てるか)、リロードタイム、FireReadyタイム(リロードが入ってから撃ち始めるまでの時間)はバラバラなので、ずっと撃ち続けた際にどんどんずれが出てくるわけです。

なのでそうなってしまうと一概にこれが最強と決めることが出来ません。
そこで、約300発撃ち切る時このSMGの継続火力が一番高い、約500発撃ち切る時...というふうに目標弾数を決めて計算してみたいと思います。

まずそれぞれのSMGのRPMとFireReadyタイムを整理します。
有志により既にデータが収集されていたので、そこから取得します。
ソースはこちらから ↓

- CSGO Weapon Spreadsheet (Last Weapon Update: November 18, 2019) - Google スプレッドシート -


自分でフレーム数を数える事も考えましたが、録画のフレームレートにより色々変わってきそうなのと自分の目を信頼出来ないのでやめました

MP9 => RPM: 857.14, FireReady: 2.13sec
Mac10 => RPM: 800, FireReady: 2.57sec
MP7 => RPM: 750, FireReady: 3.13sec
MP5 => RPM: 750, FireReady: 2.94sec
UMP => RPM: 666.67 , FireReady: 3.43sec
P90 => RPM: 857.14, FireReady: 3.37sec
Bizon => RPM: 750, FireReady: 2.43sec

必要なデータが揃ったので、計算をしましょう。
なんか弾数が60のSMGが多いので、とりあえず目標弾数をキリの良さそうな300, 600, 900でそれぞれ比較してみたいと思います。

計算は {1000 / 1000ms / RPM / 60)} * Ammo + FireReady を1ループとし、目標弾数に達したときのタイムを比較します。(コード中では撃ち途中で目標弾数になった時もカバーしています。)
{1000 / 1000ms / RPM / 60)}は、
まず RPM / 60 が1秒あたりに撃てる弾の数です。ミリ秒をこれで割ると1発あたりの撃つ時間みたいなのが出てくるはずなので、それを秒に戻すために更に1/1000にします。
なのでこれが1発あたりの時間です、たぶん。
※追記 これ書き終わってから気づいたんですけど、さっきのスプレッドシートにデータがありました。計算方法は切り捨てとか除いて同じなのでこのまま行きます。

タイムが短いほど、目標弾数を撃ちきるまでが短い事を意味するので、一番短いSMGが一番最強です(語彙力)

僕は自分で計算したくないので、プログラムにやってもらいます。
使用言語はRustです。

C-like:
use std::collections::BTreeMap;

fn main() {
    let mut weapon_map = BTreeMap::new();

    // <weapon_name, (ammo, rpm, fire ready time)>
    weapon_map.insert("MP9",   (45, 857.14, 2.13));
    weapon_map.insert("Mac10", (50, 800.00, 2.57));
    weapon_map.insert("MP7",   (60, 750.00, 3.13));
    weapon_map.insert("MP5",   (60, 750.00, 2.94));
    weapon_map.insert("UMP",   (60, 666.67, 3.43));
    weapon_map.insert("P90",   (60, 857.14, 3.37));
    weapon_map.insert("Bizon", (60, 750.00, 2.43));

    for goal_ammo in [300, 600, 900, 1200, 1500, 1800].iter() {
        println!("-------- goal ammo = {} --------", *goal_ammo);
        for (weapon_name, weapon_data) in &weapon_map {
            println!("{}: {}sec", weapon_name, calc_time(*goal_ammo, *weapon_data));
        }
        println!("");
    }
}

fn calc_time(goal_ammo: i32, data: (i32, f32, f32)) -> f32 {
    let ammo = data.0;
    let rpm = data.1;
    let fire_ready = data.2;

    let how_many_have_1loop = (goal_ammo / ammo) as f32;
    let surplus_ammo = (goal_ammo % ammo) as f32;

    // 1000.0 / (rpm / 60.0) = ms time per 1ammo
    let one_ammo_time = 1000.0 / 1000.0 / (rpm / 60.0);
    let one_loop_time = one_ammo_time * (ammo as f32) + fire_ready;

    if surplus_ammo == 0.0 {
        one_loop_time * how_many_have_1loop - fire_ready
    }
    else {
        (one_loop_time * how_many_have_1loop) + (one_ammo_time * surplus_ammo)
    }
}
結果は以下の通りになりました。

Code:
-------- goal ammo = 300 --------
Bizon: 33.719997sec
MP5: 35.76sec
MP7: 36.519997sec
MP9: 33.780067sec
Mac10: 35.350002sec
P90: 34.480072sec
UMP: 40.719864sec

-------- goal ammo = 600 --------
Bizon: 69.869995sec
MP5: 74.45999sec
MP7: 76.17sec
MP9: 69.69014sec
Mac10: 73.270004sec
P90: 72.33014sec
UMP: 84.86973sec

-------- goal ammo = 900 --------
Bizon: 106.02sec
MP5: 113.159996sec
MP7: 115.82sec
MP9: 103.47021sec
Mac10: 111.19sec
P90: 110.18021sec
UMP: 129.0196sec
300発まではBizonがわずかに強そうです。が、総合的に見て、
最強はMP9です。MP9を使いましょう。MP9優勝。

...
......
.........
............
...............
..................
.....................
........................

このままだと面白くない、せっかくなので1200, 1500, 1800も測ってみましょう。

Code:
-------- goal ammo = 1200 --------
Bizon: 142.17sec
MP5: 151.85999sec
MP7: 155.46999sec
MP9: 139.38028sec
Mac10: 149.11sec
P90: 148.03029sec
UMP: 173.16946sec

-------- goal ammo = 1500 --------
Bizon: 178.31999sec
MP5: 190.56sec
MP7: 195.12sec
MP9: 175.29034sec
Mac10: 187.03sec
P90: 185.88036sec
UMP: 217.31934sec

-------- goal ammo = 1800 --------
Bizon: 214.47sec
MP5: 229.26sec
MP7: 234.76999sec
MP9: 209.0704sec
Mac10: 224.95sec
P90: 223.73042sec
UMP: 261.4692sec
最強はMP9です。MP9を使いましょう。(2回目)

えー、ここまでつらつらとクソみたいな文章を書いてきたんですけど、実はこれ全部建前で、
本当の目的はBizonをベースとしてそのほかの武器の継続火力を同じにするような弾数を計算することが目的です。
見てわかるとおり現状のMP9が強すぎるので、MP9をナーフしつつ他の武器の弾数を調整し、まぁ大体火力同じくらいだしどの武器使っても一緒や、くらいにしたいってやつです。

さっき使用したコードを少し変えて、Bizonが64発(これはおじさんからの提案)、目標弾数が300, 600, 900, 1200, 1500, 1800だったときのタイムを大体同じくらいになるように計算してみます。
全く同じにすることは出来ないため、他のSMG > Bizon、つまりBizonより1歩遅く計算します。

まず目標弾数を定数に置きます。const GOAL_AMMO_DATA: [i32; 6] = [300, 600, 900, 1200, 1500, 1800];

で、main関数を少し弄って次のような感じにします。

C-like:
fn main() {
    let mut _ammo_range: Vec<i32> = (30..200).collect();
    _ammo_range.reverse();
    let mut weapon_map = BTreeMap::new();

    // <weapon_name, (ammo, rpm, fire ready time)>
    weapon_map.insert("MP9",   (857.14, 2.13));
    weapon_map.insert("Mac10", (800.00, 2.57));
    weapon_map.insert("MP7",   (750.00, 3.13));
    weapon_map.insert("MP5",   (750.00, 2.94));
    weapon_map.insert("UMP",   (666.67, 3.43));
    weapon_map.insert("P90",   (857.14, 3.37));

    for goal_ammo in GOAL_AMMO_DATA.iter() {
        let bizon_time = calc_time(*goal_ammo, (64, 750.00, 2.43));

        println!("-------- goal ammo = {} --------", *goal_ammo);
        println!("bizon time: {}", *bizon_time);

        for (weapon_name, weapon_data) in &weapon_map {
            let rpm = weapon_data.0;
            let fire_ready = weapon_data.1;

            for ammo in &_ammo_range {
                let time = calc_time(*goal_ammo, (*ammo, rpm, fire_ready));
                if time <= *bizon_time {
                    continue;
                }
                else {
                    println!("{} => time: {}, recommand_ammo: {}", weapon_name, time, ammo);
                    break;
                }
            }
        }
        println!("");
    }
}
終わりです。実行結果はこんな感じになりました。

Code:
-------- goal ammo = 300 --------
bizon time: 33.72
MP5 => time: 35.760002, recommand_ammo: 74
MP7 => time: 36.52, recommand_ammo: 74
MP9 => time: 33.78007, recommand_ammo: 49
Mac10 => time: 35.35, recommand_ammo: 59
P90 => time: 34.48007, recommand_ammo: 74
UMP => time: 33.859867, recommand_ammo: 149

-------- goal ammo = 600 --------
bizon time: 69.87
MP5 => time: 71.520004, recommand_ammo: 74
MP7 => time: 69.91, recommand_ammo: 85
MP9 => time: 71.82014, recommand_ammo: 42
Mac10 => time: 70.7, recommand_ammo: 59
P90 => time: 72.33013, recommand_ammo: 66
UMP => time: 71.149734, recommand_ammo: 119

-------- goal ammo = 900 --------
bizon time: 106.020004
MP5 => time: 107.28001, recommand_ammo: 74
MP7 => time: 106.43001, recommand_ammo: 81
MP9 => time: 107.73021, recommand_ammo: 42
Mac10 => time: 106.049995, recommand_ammo: 59
P90 => time: 106.8102, recommand_ammo: 69
UMP => time: 108.439606, recommand_ammo: 112

-------- goal ammo = 1200 --------
bizon time: 139.74
MP5 => time: 140.1, recommand_ammo: 79
MP7 => time: 139.82, recommand_ammo: 85
MP9 => time: 141.51028, recommand_ammo: 44
Mac10 => time: 141.4, recommand_ammo: 59
P90 => time: 141.29027, recommand_ammo: 70
UMP => time: 142.29947, recommand_ammo: 119

-------- goal ammo = 1500 --------
bizon time: 175.89001
MP5 => time: 178.80002, recommand_ammo: 74
MP7 => time: 176.34001, recommand_ammo: 83
MP9 => time: 177.42035, recommand_ammo: 44
Mac10 => time: 176.75, recommand_ammo: 59
P90 => time: 179.14034, recommand_ammo: 68
UMP => time: 176.15935, recommand_ammo: 124

-------- goal ammo = 1800 --------
bizon time: 212.04001
MP5 => time: 214.56001, recommand_ammo: 74
MP7 => time: 212.86002, recommand_ammo: 81
MP9 => time: 213.33041, recommand_ammo: 43
Mac10 => time: 212.09999, recommand_ammo: 59
P90 => time: 213.6204, recommand_ammo: 69
UMP => time: 213.4492, recommand_ammo: 119
それぞれの目標弾数においてどのくらいの弾数設定にすれば同じくらいになるのか、これでわかりましたね。
目標達成です、おしまい!
 
Last edited:

Urucy

uwu
Staff member
Joined
Apr 14, 2019
Messages
59
Steam
View
  • Thread Starter Thread Starter
  • #2
~ おまけ
M249とNegevを加えた比較データと、おすすめ弾数設定

Code:
-------- goal ammo = 300 --------
Bizon: 33.719997sec
M249: 35.399998sec
MP5: 35.76sec
MP7: 36.519997sec
MP9: 33.780067sec
Mac10: 35.350002sec
Negev: 33.9sec
P90: 34.480072sec
UMP: 40.719864sec

-------- goal ammo = 600 --------
Bizon: 69.869995sec
M249: 76.5sec
MP5: 74.45999sec
MP7: 76.17sec
MP9: 69.69014sec
Mac10: 73.270004sec
Negev: 67.8sec
P90: 72.33014sec
UMP: 84.86973sec

-------- goal ammo = 900 --------
Bizon: 106.02sec
M249: 117.6sec
MP5: 113.159996sec
MP7: 115.82sec
MP9: 103.47021sec
Mac10: 111.19sec
Negev: 107.4sec
P90: 110.18021sec
UMP: 129.0196sec

-------- goal ammo = 1200 --------
Bizon: 142.17sec
M249: 158.7sec
MP5: 151.85999sec
MP7: 155.46999sec
MP9: 139.38028sec
Mac10: 149.11sec
Negev: 141.3sec
P90: 148.03029sec
UMP: 173.16946sec

-------- goal ammo = 1500 --------
Bizon: 178.31999sec
M249: 199.8sec
MP5: 190.56sec
MP7: 195.12sec
MP9: 175.29034sec
Mac10: 187.03sec
Negev: 175.2sec
P90: 185.88036sec
UMP: 217.31934sec

-------- goal ammo = 1800 --------
Bizon: 214.47sec
M249: 240.9sec
MP5: 229.26sec
MP7: 234.76999sec
MP9: 209.0704sec
Mac10: 224.95sec
Negev: 214.8sec
P90: 223.73042sec
UMP: 261.4692sec
Code:
-------- goal ammo = 300 --------
bizon time: 33.72
M249 => time: 35.399998, recommand_ammo: 149
Negev => time: 33.9, recommand_ammo: 149

-------- goal ammo = 600 --------
bizon time: 69.87
M249 => time: 70.799995, recommand_ammo: 149
Negev => time: 73.5, recommand_ammo: 119

-------- goal ammo = 900 --------
bizon time: 106.020004
M249 => time: 106.2, recommand_ammo: 149
Negev => time: 107.4, recommand_ammo: 128

-------- goal ammo = 1200 --------
bizon time: 139.74
M249 => time: 141.59999, recommand_ammo: 149
Negev => time: 141.3, recommand_ammo: 133

-------- goal ammo = 1500 --------
bizon time: 175.89001
M249 => time: 176.99998, recommand_ammo: 149
Negev => time: 180.9, recommand_ammo: 124

-------- goal ammo = 1800 --------
bizon time: 212.04001
M249 => time: 212.4, recommand_ammo: 149
Negev => time: 214.8, recommand_ammo: 128
 
Last edited:

Urucy

uwu
Staff member
Joined
Apr 14, 2019
Messages
59
Steam
View
  • Thread Starter Thread Starter
  • #3
データ計算が一部間違っていたので、コードを直してデータを更新しました。
具体的には、撃ち途中ではなく撃ち切ったときの時間計算で、最後のfire readyタイムが不必要なところを含めて計算していた部分を条件分岐で引くようにしました。

C-like:
if surplus_ammo == 0.0 {
    one_loop_time * how_many_have_1loop - fire_ready
}
else {
    (one_loop_time * how_many_have_1loop) + (one_ammo_time * surplus_ammo)
}
 

Neiva

New Member
Joined
Apr 27, 2019
Messages
1
Steam
View
While people have calculated these before, Bizon always comes out on top!
Mp9 was 50 bullets for a while on PSE making it optimal for Boss Fights but was nerfed.
Mp9 45 Bullets vs Bizon 60 bullets, no comparison. Bizon can hold back longer and is more accurate.

But at the end of the day, use what you're comfortable and can play best with :)
 

Rune

New Member
Joined
Mar 10, 2017
Messages
2
Steam
View
what i'm see here, you calculate every SMGs and " suggested their recommend ammo per clip " so they can deal equal DPS.
in the end, players only use gun that comfortable to play with.

this mechanism should not be a problem in Zombie Escape since we're not going to kill someone with 50k Hp or more.
but this thread actually has good information :) for players who playing competitive and zombie riot
 
Last edited:

Urucy

uwu
Staff member
Joined
Apr 14, 2019
Messages
59
Steam
View
  • Thread Starter Thread Starter
  • #8
although i wrote "continuous firepower", but the goal was to make the firepower of all SMGs almost equal in the BOSS battle.
but, each map has a different BOSS HP, so i think it is absolutely impossible to make them equal.
my calculated data is just for reference purposes, but it actually adjusted the PSE's SMG Ammo.
 

Rune

New Member
Joined
Mar 10, 2017
Messages
2
Steam
View
since mappers ( maybe ) using boss and NPCs as breakable property (like windows and doors ), have a good fire rate is priority to break it fast, i actually agree with you, but behind of it, we're not only fighting boss we also has zombie team which is mean they're players, having too much ammo only make them in disavantage, just imagine every humans has 100 ammo and zombie only has 7000 HP * since zombie is a unit like human, shooting their head can deal more damage. * in the end, it's how the team holding their position 1 mess up, everyone would be mess up as well. so i don't have to say more.

sadly some maps are CT sided, where Zombie team has limited space to move as they please.
*and dreamin_v2 TP mecanism yet still worse. :))
 
Top