Wikibooks
jawikibooks
https://ja.wikibooks.org/wiki/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8
MediaWiki 1.39.0-wmf.23
first-letter
メディア
特別
トーク
利用者
利用者・トーク
Wikibooks
Wikibooks・トーク
ファイル
ファイル・トーク
MediaWiki
MediaWiki・トーク
テンプレート
テンプレート・トーク
ヘルプ
ヘルプ・トーク
カテゴリ
カテゴリ・トーク
Transwiki
Transwiki‐ノート
TimedText
TimedText talk
モジュール
モジュール・トーク
Gadget
Gadget talk
Gadget definition
Gadget definition talk
高等学校工業 化学工学/単位換算
0
18384
206200
77483
2022-08-04T03:47:20Z
Ef3
694
/* SI基本単位 */ 2019年に定義が変更され、教科書によっては変更が反映されていないので、<del>旧定義</del>・<ins>新定義</ins>を併記した。{{See|w:SI基本単位の再定義 (2019年)}}
wikitext
text/x-wiki
化学工業では、物理量の単位系は'''国際単位系'''である'''SI単位'''を、なるべく用いる。
SI単位系については、高校物理の標準的な教科書に、かかれています。
ほんの数十年前までの昔(※ 執筆時点は2013年。)は、国や業界ごとに、さまざまな単位があったが、それだと換算の手間がかかるなど、不便なことがおおいので、単位を統一する必要が生じた。
現在は、単位を、なるべくSI単位系に単位を統一するのが主流である。
日本国のJIS規格や計量法でも、原則的にSI単位系を採用している。
また、国際規格のISO規格でも、原則的にSI単位系を採用している。
== SI基本単位 ==
{{Wikipedia|SI基本単位}}
{{Wikipedia|SI組立単位}}
国際単位系では7つの[[w:SI基本単位|基本単位]]と、それ以外の単位は基本単位を組み合わせた[[w:SI組立単位|組立単位]]としている。
SI単位系で基礎とする単位は、長さの単位にはメートル法を基礎として、質量の単位はキログラムを基礎とする。時間の単位は秒を基礎とする。温度はケルビン温度を基礎とする。
7つの基本単位をまとめると、
基本単位は'''時間''' (s)、'''長さ''' (m)、'''質量''' (kg)、'''電流''' (A)、'''熱力学温度''' (K)、'''物質量''' (mol)、'''光度''' (cd) である。
{| class="wikitable"
|+ SI基本単位
!rowspan="2" style="width:6em;"|量
!colspan="2" |基本単位
!rowspan="2" |定義<ref>{{Cite web|language=en|url=https://www.bipm.org/utils/common/pdf/si-brochure/SI-Brochure-9-concise-EN.pdf|work=A concise summary of the International System of Units, SI|title=Table 1: The seven base units of the SI|page=2|accessdate=2022-08-04}}</ref>
|-
!style="width:6em;"|名称
!style="width:3em;"|記号
|-
!時間
|'''[[w:秒|秒]]'''||s
| [[w:セシウム|セシウム]]133原子の[[w:基底状態|基底状態]]の2つの[[w:超微細構造|超微細構造]]準位間の遷移に対応する放射の周期の{{val|9192631770}}倍に等しい時間
|-
!長さ
|'''[[w:|メートル]]'''||m
| 真空中で1[[w:秒]]間の{{val|299792458|u=分}}の1の時間に[[w:光|光]]が進む行程の長さ
|-
!質量
|'''[[w:キログラム|キログラム]]'''||kg
|<del>[[w:国際キログラム原器|国際キログラム原器]]([[w:プラチナ|プラチナ]]90%、[[w:イリジウム|イリジウム]]10%からなる[[w:合金|合金]]で直径・高さともに39mmの円柱の質量</del><hr>[[w:プランク定数|プランク定数]]を{{val|6.62607015e-34|u=ジュール秒}}とすることによって定まる質量
|-
!電流
|'''[[w:アンペア|アンペア]]'''||A
|<del>無限に長く、無限に小さい円形断面積を持つ2本の直線状導体を真空中に1メートルの間隔で平行においたとき、導体の長さ1メートルにつき2×10<sup>-7</sup>[[w:|ニュートン]]の力を及ぼしあう導体のそれぞれに流れる電流の大きさ</del><hr><ins>[[w:電気素量|電気素量]]を{{val|1.602176634e-19|u=[[w:クーロン|クーロン]]}}とすることによって定まる電流</ins>
|-
!熱力学温度
|'''[[w:ケルビン|ケルビン]]'''||K
|<del>水の[[w:三重点|三重点]]の[[w:熱力学温度|熱力学温度]]の1/273.16。</del><hr><ins>[[w:ボルツマン定数|ボルツマン定数]]を{{val|1.380649e-23|u=[[w:ジュール|ジュール]]毎[[w:ケルビン|ケルビン]]}}とすることによって定まる温度。</ins>温度間隔も同じ単位
|-
!物質量
|'''[[w:モル|モル]]'''||mol
|<del>0.012kgの[[w:|炭素|炭素12]]に含まれる原子と等しい数の構成要素を含む系の物質量。<br />モルを使うときは、構成要素 (entités élémentaires) が指定されなければならないが、それは[[w:|原子]]、[[w:|分子]]、[[w:|イオン]]、[[w:|電子]]、その他の粒子またはこの種の粒子の特定の集合体であってよい</del><hr><ins>{{val|6.02214076|e=23}}([[w:アボガドロ数|アボガドロ数]])の要素粒子で構成された系の物質量</ins>
|-
!光度
|'''[[w:カンデラ|カンデラ]]'''||cd
|周波数 540×10<sup>12</sup>[[w:ヘルツ|ヘルツ]]の単色放射を放出し、所定方向の放射強度が1/683[[w:ワット|ワット]]毎[[w:ステラジアン|ステラジアン]]である光源のその方向における光度
|-
|colspan=4 | 2019年に定義が変更され、教科書によっては変更が反映されていないので、<del>旧定義</del>・<ins>新定義</ins>を併記した。{{See|w:SI基本単位の再定義 (2019年)}}
|}
== 組立単位 ==
SI組立単位、およびその他のSI組立単位を列挙する。世の中に存在する量は限りなくあり、全てを挙げることは不可能であるので、その一例を挙げる。
=== 表2 基本単位を用いて表される一貫性のあるSI組立単位の例 ===
{| class="wikitable"
!組立量
!名称
!記号
|-
|面積
|平方メートル
|m<sup>2</sup>
|-
|体積
|立方メートル
|m<sup>3</sup>
|-
|速さ・速度
|メートル毎秒
|m/s
|-
|加速度
|メートル毎秒毎秒
|m/s<sup>2</sup>
|-
|密度(質量密度)
|キログラム毎立方メートル
|kg/m<sup>3</sup>
|-
|面密度
|キログラム毎平方メートル
|kg/m<sup>2</sup>
|-
|電流密度
|アンペア毎平方メートル
|A·m<sup>-2</sup>
|-
|磁界の強さ
|アンペア毎メートル
|A/m
|-
|モル濃度
|モル毎立方メートル
|mol/m<sup>3</sup>
|-
|モル濃度
|キログラム毎立方メートル
|kg/m<sup>3</sup>
|-
|}
=== 表3 固有の名称と記号で表される一貫性のあるSI組立単位 ===
いくつかのSI組立単位には、利便性の観点から固有の名称と記号が与えられている。固有の名称を持つSI組立単位は、下記に示す22個である。下方の4つの単位は、健康保護の観点から特別に固有の名称を与えられたものである。
{| class="wikitable"
!組立量
!名称
!記号
!他のSI単位<br />による表し方
!SI基本単位<br />による表し方
|-
|[[w:角度|平面角]]
|[[w:ラジアン|ラジアン]] (radian)
|rad
|1
|m/m
|-
|[[w:立体角|立体角]]
|[[w:ステラジアン|ステラジアン]] (steradian)
|sr
|1
|m<sup>2</sup>/m<sup>2</sup>
|-
|[[w:周波数|周波数]]
|[[w:ヘルツ|ヘルツ]] (hertz)
|Hz
|
|s<sup>-1</sup>
|-
|[[w:力|力]]
|[[w:ニュートン|ニュートン]] (newton)
|N
|
|m·kg·s<sup>-2</sup>
|-
|[[w:圧力|圧力]]・[[w:応力|応力]]
|[[w:パスカル|パスカル]] (pascal)
|Pa
|N/m<sup>2</sup>
|m<sup>-1</sup>·kg·s<sup>-2</sup>
|-
|[[w:エネルギー|エネルギー]]・[[w:仕事 (物理学)|仕事]]・[[w:熱量|熱量]]
|[[w:ジュール (単位)|ジュール]] (joule)
|J
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|[[w:仕事率|仕事率]]
|[[w:|ワット]] (watt)
|W
|J/s
|m<sup>2</sup>·kg·s<sup>-3</sup>
|-
|[[w:電荷|電荷]]・[[w:電気量|電気量]]
|[[w:|クーロン]] (coulomb)
|C
|
|s·A
|-
|[[w:電位差|電位差]] ([[w:電圧|電圧]])・[[w:起電力|起電力]]
|[[w:ボルト (単位)|ボルト]] (volt)
|V
|W/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-1</sup>
|-
|[[w:電気容量|電気容量]]
|[[w:ファラド|ファラド]] (farad)
|F
|C/V
|m<sup>-2</sup>·kg<sup>-1</sup>·s<sup>4</sup>·A<sup>2</sup>
|-
|[[w:電気抵抗|電気抵抗]]
|[[w:オーム|オーム]] (ohm)
|Ω
|V/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-2</sup>
|-
|[[w:|磁束]]
|[[w:|ウェーバ]] (weber)
|Wb
|V·s
|m<sup>2</sup>·kg·s<sup>-2</sup>·A<sup>-1</sup>
|-
|[[w:|セルシウス温度]]
|[[w:|セルシウス度]]
|℃
|K
|
|-
|[[w:光束|光束]]
|[[w:ルーメン|ルーメン]] (lumen)
|lm
|cd·sr
|cd·m<sup>2</sup>/m<sup>2</sup> = cd
|-
|}
=== 表4 単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例 ===
固有の名称を持つSI組立単位は、SI基本単位や他のSI組立単位と組み合わせて他の組立量を表すために用いることができる。
{| class="wikitable"
!組立量
!名称
!記号
!SI基本単位<br />による表し方
|-
|粘度
|パスカル秒
|Pa·s
|m<sup>-1</sup>·kg·s<sup>-1</sup>
|-
|力のモーメント
|ニュートンメートル
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|表面張力
|ニュートン毎メートル
|N/m
|kg·s<sup>-2</sup>
|-
|角速度
|ラジアン毎秒
|rad/s
|m·m<sup>-1</sup>·s<sup>-1</sup> = s<sup>-1</sup>
|-
|角加速度
|ラジアン毎秒毎秒
|rad/s<sup>2</sup>
|m·m<sup>-1</sup>·s<sup>-2</sup> = s<sup>-2</sup>
|-
|熱流束
|ワット毎平方メートル
|W/m<sup>2</sup>
|kg·s<sup>-3</sup>
|-
|熱容量
|ジュール毎ケルビン
|J/K
|m<sup>2</sup>·kg·s<sup>-2</sup>·K<sup>-1</sup>
|-
|比熱容量
|ジュール毎キログラム毎ケルビン
|J/(kg·K)
|m<sup>2</sup>·s<sup>-2</sup>·K<sup>-1</sup>
|-
|熱伝導率
|ワット毎メートル毎ケルビン
|W/(m·K)
|m·kg·s<sup>-3</sup>·K<sup>-1</sup>
|-
|}
jpg5d9lish05w2xmybs89t9yyauluoa
206201
206200
2022-08-04T05:02:11Z
Ef3
694
/* 表2 基本単位を用いて表される一貫性のあるSI組立単位の例 */ モル濃度が2つあり、内容が密度(重複)だったので削除。マークアップ修正。
wikitext
text/x-wiki
化学工業では、物理量の単位系は'''国際単位系'''である'''SI単位'''を、なるべく用いる。
SI単位系については、高校物理の標準的な教科書に、かかれています。
ほんの数十年前までの昔(※ 執筆時点は2013年。)は、国や業界ごとに、さまざまな単位があったが、それだと換算の手間がかかるなど、不便なことがおおいので、単位を統一する必要が生じた。
現在は、単位を、なるべくSI単位系に単位を統一するのが主流である。
日本国のJIS規格や計量法でも、原則的にSI単位系を採用している。
また、国際規格のISO規格でも、原則的にSI単位系を採用している。
== SI基本単位 ==
{{Wikipedia|SI基本単位}}
{{Wikipedia|SI組立単位}}
国際単位系では7つの[[w:SI基本単位|基本単位]]と、それ以外の単位は基本単位を組み合わせた[[w:SI組立単位|組立単位]]としている。
SI単位系で基礎とする単位は、長さの単位にはメートル法を基礎として、質量の単位はキログラムを基礎とする。時間の単位は秒を基礎とする。温度はケルビン温度を基礎とする。
7つの基本単位をまとめると、
基本単位は'''時間''' (s)、'''長さ''' (m)、'''質量''' (kg)、'''電流''' (A)、'''熱力学温度''' (K)、'''物質量''' (mol)、'''光度''' (cd) である。
{| class="wikitable"
|+ SI基本単位
!rowspan="2" style="width:6em;"|量
!colspan="2" |基本単位
!rowspan="2" |定義<ref>{{Cite web|language=en|url=https://www.bipm.org/utils/common/pdf/si-brochure/SI-Brochure-9-concise-EN.pdf|work=A concise summary of the International System of Units, SI|title=Table 1: The seven base units of the SI|page=2|accessdate=2022-08-04}}</ref>
|-
!style="width:6em;"|名称
!style="width:3em;"|記号
|-
!時間
|'''[[w:秒|秒]]'''||s
| [[w:セシウム|セシウム]]133原子の[[w:基底状態|基底状態]]の2つの[[w:超微細構造|超微細構造]]準位間の遷移に対応する放射の周期の{{val|9192631770}}倍に等しい時間
|-
!長さ
|'''[[w:|メートル]]'''||m
| 真空中で1[[w:秒]]間の{{val|299792458|u=分}}の1の時間に[[w:光|光]]が進む行程の長さ
|-
!質量
|'''[[w:キログラム|キログラム]]'''||kg
|<del>[[w:国際キログラム原器|国際キログラム原器]]([[w:プラチナ|プラチナ]]90%、[[w:イリジウム|イリジウム]]10%からなる[[w:合金|合金]]で直径・高さともに39mmの円柱の質量</del><hr>[[w:プランク定数|プランク定数]]を{{val|6.62607015e-34|u=ジュール秒}}とすることによって定まる質量
|-
!電流
|'''[[w:アンペア|アンペア]]'''||A
|<del>無限に長く、無限に小さい円形断面積を持つ2本の直線状導体を真空中に1メートルの間隔で平行においたとき、導体の長さ1メートルにつき2×10<sup>-7</sup>[[w:|ニュートン]]の力を及ぼしあう導体のそれぞれに流れる電流の大きさ</del><hr><ins>[[w:電気素量|電気素量]]を{{val|1.602176634e-19|u=[[w:クーロン|クーロン]]}}とすることによって定まる電流</ins>
|-
!熱力学温度
|'''[[w:ケルビン|ケルビン]]'''||K
|<del>水の[[w:三重点|三重点]]の[[w:熱力学温度|熱力学温度]]の1/273.16。</del><hr><ins>[[w:ボルツマン定数|ボルツマン定数]]を{{val|1.380649e-23|u=[[w:ジュール|ジュール]]毎[[w:ケルビン|ケルビン]]}}とすることによって定まる温度。</ins>温度間隔も同じ単位
|-
!物質量
|'''[[w:モル|モル]]'''||mol
|<del>0.012kgの[[w:|炭素|炭素12]]に含まれる原子と等しい数の構成要素を含む系の物質量。<br />モルを使うときは、構成要素 (entités élémentaires) が指定されなければならないが、それは[[w:|原子]]、[[w:|分子]]、[[w:|イオン]]、[[w:|電子]]、その他の粒子またはこの種の粒子の特定の集合体であってよい</del><hr><ins>{{val|6.02214076|e=23}}([[w:アボガドロ数|アボガドロ数]])の要素粒子で構成された系の物質量</ins>
|-
!光度
|'''[[w:カンデラ|カンデラ]]'''||cd
|周波数 540×10<sup>12</sup>[[w:ヘルツ|ヘルツ]]の単色放射を放出し、所定方向の放射強度が1/683[[w:ワット|ワット]]毎[[w:ステラジアン|ステラジアン]]である光源のその方向における光度
|-
|colspan=4 | 2019年に定義が変更され、教科書によっては変更が反映されていないので、<del>旧定義</del>・<ins>新定義</ins>を併記した。{{See|w:SI基本単位の再定義 (2019年)}}
|}
== 組立単位 ==
SI組立単位、およびその他のSI組立単位を列挙する。世の中に存在する量は限りなくあり、全てを挙げることは不可能であるので、その一例を挙げる。
=== 表2 基本単位を用いて表される一貫性のあるSI組立単位の例 ===
:{| class="wikitable"
|+ SI組立単位の例
!組立量(誘導量)
!名称
!記号
|-
!面積
|平方メートル
|style="text-align:center"|m<sup>2</sup>
|-
!体積
|立方メートル
|style="text-align:center"|m<sup>3</sup>
|-
!速さ・速度
|メートル毎秒
|style="text-align:center"|m/s
|-
!加速度
|メートル毎秒毎秒
|style="text-align:center"|m/s<sup>2</sup>
|-
!密度(質量密度)
|キログラム毎立方メートル
|style="text-align:center"|kg/m<sup>3</sup>
|-
!面密度
|キログラム毎平方メートル
|style="text-align:center"|kg/m<sup>2</sup>
|-
!電流密度
|アンペア毎平方メートル
|style="text-align:center"|A·m<sup>-2</sup>
|-
!磁界の強さ
|アンペア毎メートル
|style="text-align:center"|A/m
|-
!モル濃度
|モル毎立方メートル
|style="text-align:center"|mol/m<sup>3</sup>
|-
|}
=== 表3 固有の名称と記号で表される一貫性のあるSI組立単位 ===
いくつかのSI組立単位には、利便性の観点から固有の名称と記号が与えられている。固有の名称を持つSI組立単位は、下記に示す22個である。下方の4つの単位は、健康保護の観点から特別に固有の名称を与えられたものである。
{| class="wikitable"
!組立量
!名称
!記号
!他のSI単位<br />による表し方
!SI基本単位<br />による表し方
|-
|[[w:角度|平面角]]
|[[w:ラジアン|ラジアン]] (radian)
|rad
|1
|m/m
|-
|[[w:立体角|立体角]]
|[[w:ステラジアン|ステラジアン]] (steradian)
|sr
|1
|m<sup>2</sup>/m<sup>2</sup>
|-
|[[w:周波数|周波数]]
|[[w:ヘルツ|ヘルツ]] (hertz)
|Hz
|
|s<sup>-1</sup>
|-
|[[w:力|力]]
|[[w:ニュートン|ニュートン]] (newton)
|N
|
|m·kg·s<sup>-2</sup>
|-
|[[w:圧力|圧力]]・[[w:応力|応力]]
|[[w:パスカル|パスカル]] (pascal)
|Pa
|N/m<sup>2</sup>
|m<sup>-1</sup>·kg·s<sup>-2</sup>
|-
|[[w:エネルギー|エネルギー]]・[[w:仕事 (物理学)|仕事]]・[[w:熱量|熱量]]
|[[w:ジュール (単位)|ジュール]] (joule)
|J
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|[[w:仕事率|仕事率]]
|[[w:|ワット]] (watt)
|W
|J/s
|m<sup>2</sup>·kg·s<sup>-3</sup>
|-
|[[w:電荷|電荷]]・[[w:電気量|電気量]]
|[[w:|クーロン]] (coulomb)
|C
|
|s·A
|-
|[[w:電位差|電位差]] ([[w:電圧|電圧]])・[[w:起電力|起電力]]
|[[w:ボルト (単位)|ボルト]] (volt)
|V
|W/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-1</sup>
|-
|[[w:電気容量|電気容量]]
|[[w:ファラド|ファラド]] (farad)
|F
|C/V
|m<sup>-2</sup>·kg<sup>-1</sup>·s<sup>4</sup>·A<sup>2</sup>
|-
|[[w:電気抵抗|電気抵抗]]
|[[w:オーム|オーム]] (ohm)
|Ω
|V/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-2</sup>
|-
|[[w:|磁束]]
|[[w:|ウェーバ]] (weber)
|Wb
|V·s
|m<sup>2</sup>·kg·s<sup>-2</sup>·A<sup>-1</sup>
|-
|[[w:|セルシウス温度]]
|[[w:|セルシウス度]]
|℃
|K
|
|-
|[[w:光束|光束]]
|[[w:ルーメン|ルーメン]] (lumen)
|lm
|cd·sr
|cd·m<sup>2</sup>/m<sup>2</sup> = cd
|-
|}
=== 表4 単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例 ===
固有の名称を持つSI組立単位は、SI基本単位や他のSI組立単位と組み合わせて他の組立量を表すために用いることができる。
{| class="wikitable"
!組立量
!名称
!記号
!SI基本単位<br />による表し方
|-
|粘度
|パスカル秒
|Pa·s
|m<sup>-1</sup>·kg·s<sup>-1</sup>
|-
|力のモーメント
|ニュートンメートル
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|表面張力
|ニュートン毎メートル
|N/m
|kg·s<sup>-2</sup>
|-
|角速度
|ラジアン毎秒
|rad/s
|m·m<sup>-1</sup>·s<sup>-1</sup> = s<sup>-1</sup>
|-
|角加速度
|ラジアン毎秒毎秒
|rad/s<sup>2</sup>
|m·m<sup>-1</sup>·s<sup>-2</sup> = s<sup>-2</sup>
|-
|熱流束
|ワット毎平方メートル
|W/m<sup>2</sup>
|kg·s<sup>-3</sup>
|-
|熱容量
|ジュール毎ケルビン
|J/K
|m<sup>2</sup>·kg·s<sup>-2</sup>·K<sup>-1</sup>
|-
|比熱容量
|ジュール毎キログラム毎ケルビン
|J/(kg·K)
|m<sup>2</sup>·s<sup>-2</sup>·K<sup>-1</sup>
|-
|熱伝導率
|ワット毎メートル毎ケルビン
|W/(m·K)
|m·kg·s<sup>-3</sup>·K<sup>-1</sup>
|-
|}
t25m5q977kofw0jjhqbldvhm5lbq18c
206202
206201
2022-08-04T05:04:29Z
Ef3
694
/* 脚註*/
wikitext
text/x-wiki
化学工業では、物理量の単位系は'''国際単位系'''である'''SI単位'''を、なるべく用いる。
SI単位系については、高校物理の標準的な教科書に、かかれています。
ほんの数十年前までの昔(※ 執筆時点は2013年。)は、国や業界ごとに、さまざまな単位があったが、それだと換算の手間がかかるなど、不便なことがおおいので、単位を統一する必要が生じた。
現在は、単位を、なるべくSI単位系に単位を統一するのが主流である。
日本国のJIS規格や計量法でも、原則的にSI単位系を採用している。
また、国際規格のISO規格でも、原則的にSI単位系を採用している。
== SI基本単位 ==
{{Wikipedia|SI基本単位}}
{{Wikipedia|SI組立単位}}
国際単位系では7つの[[w:SI基本単位|基本単位]]と、それ以外の単位は基本単位を組み合わせた[[w:SI組立単位|組立単位]]としている。
SI単位系で基礎とする単位は、長さの単位にはメートル法を基礎として、質量の単位はキログラムを基礎とする。時間の単位は秒を基礎とする。温度はケルビン温度を基礎とする。
7つの基本単位をまとめると、
基本単位は'''時間''' (s)、'''長さ''' (m)、'''質量''' (kg)、'''電流''' (A)、'''熱力学温度''' (K)、'''物質量''' (mol)、'''光度''' (cd) である。
{| class="wikitable"
|+ SI基本単位
!rowspan="2" style="width:6em;"|量
!colspan="2" |基本単位
!rowspan="2" |定義<ref>{{Cite web|language=en|url=https://www.bipm.org/utils/common/pdf/si-brochure/SI-Brochure-9-concise-EN.pdf|work=A concise summary of the International System of Units, SI|title=Table 1: The seven base units of the SI|page=2|accessdate=2022-08-04}}</ref>
|-
!style="width:6em;"|名称
!style="width:3em;"|記号
|-
!時間
|'''[[w:秒|秒]]'''||s
| [[w:セシウム|セシウム]]133原子の[[w:基底状態|基底状態]]の2つの[[w:超微細構造|超微細構造]]準位間の遷移に対応する放射の周期の{{val|9192631770}}倍に等しい時間
|-
!長さ
|'''[[w:|メートル]]'''||m
| 真空中で1[[w:秒]]間の{{val|299792458|u=分}}の1の時間に[[w:光|光]]が進む行程の長さ
|-
!質量
|'''[[w:キログラム|キログラム]]'''||kg
|<del>[[w:国際キログラム原器|国際キログラム原器]]([[w:プラチナ|プラチナ]]90%、[[w:イリジウム|イリジウム]]10%からなる[[w:合金|合金]]で直径・高さともに39mmの円柱の質量</del><hr>[[w:プランク定数|プランク定数]]を{{val|6.62607015e-34|u=ジュール秒}}とすることによって定まる質量
|-
!電流
|'''[[w:アンペア|アンペア]]'''||A
|<del>無限に長く、無限に小さい円形断面積を持つ2本の直線状導体を真空中に1メートルの間隔で平行においたとき、導体の長さ1メートルにつき2×10<sup>-7</sup>[[w:|ニュートン]]の力を及ぼしあう導体のそれぞれに流れる電流の大きさ</del><hr><ins>[[w:電気素量|電気素量]]を{{val|1.602176634e-19|u=[[w:クーロン|クーロン]]}}とすることによって定まる電流</ins>
|-
!熱力学温度
|'''[[w:ケルビン|ケルビン]]'''||K
|<del>水の[[w:三重点|三重点]]の[[w:熱力学温度|熱力学温度]]の1/273.16。</del><hr><ins>[[w:ボルツマン定数|ボルツマン定数]]を{{val|1.380649e-23|u=[[w:ジュール|ジュール]]毎[[w:ケルビン|ケルビン]]}}とすることによって定まる温度。</ins>温度間隔も同じ単位
|-
!物質量
|'''[[w:モル|モル]]'''||mol
|<del>0.012kgの[[w:|炭素|炭素12]]に含まれる原子と等しい数の構成要素を含む系の物質量。<br />モルを使うときは、構成要素 (entités élémentaires) が指定されなければならないが、それは[[w:|原子]]、[[w:|分子]]、[[w:|イオン]]、[[w:|電子]]、その他の粒子またはこの種の粒子の特定の集合体であってよい</del><hr><ins>{{val|6.02214076|e=23}}([[w:アボガドロ数|アボガドロ数]])の要素粒子で構成された系の物質量</ins>
|-
!光度
|'''[[w:カンデラ|カンデラ]]'''||cd
|周波数 540×10<sup>12</sup>[[w:ヘルツ|ヘルツ]]の単色放射を放出し、所定方向の放射強度が1/683[[w:ワット|ワット]]毎[[w:ステラジアン|ステラジアン]]である光源のその方向における光度
|-
|colspan=4 | 2019年に定義が変更され、教科書によっては変更が反映されていないので、<del>旧定義</del>・<ins>新定義</ins>を併記した。{{See|w:SI基本単位の再定義 (2019年)}}
|}
== 組立単位 ==
SI組立単位、およびその他のSI組立単位を列挙する。世の中に存在する量は限りなくあり、全てを挙げることは不可能であるので、その一例を挙げる。
=== 表2 基本単位を用いて表される一貫性のあるSI組立単位の例 ===
:{| class="wikitable"
|+ SI組立単位の例
!組立量(誘導量)
!名称
!記号
|-
!面積
|平方メートル
|style="text-align:center"|m<sup>2</sup>
|-
!体積
|立方メートル
|style="text-align:center"|m<sup>3</sup>
|-
!速さ・速度
|メートル毎秒
|style="text-align:center"|m/s
|-
!加速度
|メートル毎秒毎秒
|style="text-align:center"|m/s<sup>2</sup>
|-
!密度(質量密度)
|キログラム毎立方メートル
|style="text-align:center"|kg/m<sup>3</sup>
|-
!面密度
|キログラム毎平方メートル
|style="text-align:center"|kg/m<sup>2</sup>
|-
!電流密度
|アンペア毎平方メートル
|style="text-align:center"|A·m<sup>-2</sup>
|-
!磁界の強さ
|アンペア毎メートル
|style="text-align:center"|A/m
|-
!モル濃度
|モル毎立方メートル
|style="text-align:center"|mol/m<sup>3</sup>
|-
|}
=== 表3 固有の名称と記号で表される一貫性のあるSI組立単位 ===
いくつかのSI組立単位には、利便性の観点から固有の名称と記号が与えられている。固有の名称を持つSI組立単位は、下記に示す22個である。下方の4つの単位は、健康保護の観点から特別に固有の名称を与えられたものである。
{| class="wikitable"
!組立量
!名称
!記号
!他のSI単位<br />による表し方
!SI基本単位<br />による表し方
|-
|[[w:角度|平面角]]
|[[w:ラジアン|ラジアン]] (radian)
|rad
|1
|m/m
|-
|[[w:立体角|立体角]]
|[[w:ステラジアン|ステラジアン]] (steradian)
|sr
|1
|m<sup>2</sup>/m<sup>2</sup>
|-
|[[w:周波数|周波数]]
|[[w:ヘルツ|ヘルツ]] (hertz)
|Hz
|
|s<sup>-1</sup>
|-
|[[w:力|力]]
|[[w:ニュートン|ニュートン]] (newton)
|N
|
|m·kg·s<sup>-2</sup>
|-
|[[w:圧力|圧力]]・[[w:応力|応力]]
|[[w:パスカル|パスカル]] (pascal)
|Pa
|N/m<sup>2</sup>
|m<sup>-1</sup>·kg·s<sup>-2</sup>
|-
|[[w:エネルギー|エネルギー]]・[[w:仕事 (物理学)|仕事]]・[[w:熱量|熱量]]
|[[w:ジュール (単位)|ジュール]] (joule)
|J
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|[[w:仕事率|仕事率]]
|[[w:|ワット]] (watt)
|W
|J/s
|m<sup>2</sup>·kg·s<sup>-3</sup>
|-
|[[w:電荷|電荷]]・[[w:電気量|電気量]]
|[[w:|クーロン]] (coulomb)
|C
|
|s·A
|-
|[[w:電位差|電位差]] ([[w:電圧|電圧]])・[[w:起電力|起電力]]
|[[w:ボルト (単位)|ボルト]] (volt)
|V
|W/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-1</sup>
|-
|[[w:電気容量|電気容量]]
|[[w:ファラド|ファラド]] (farad)
|F
|C/V
|m<sup>-2</sup>·kg<sup>-1</sup>·s<sup>4</sup>·A<sup>2</sup>
|-
|[[w:電気抵抗|電気抵抗]]
|[[w:オーム|オーム]] (ohm)
|Ω
|V/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-2</sup>
|-
|[[w:|磁束]]
|[[w:|ウェーバ]] (weber)
|Wb
|V·s
|m<sup>2</sup>·kg·s<sup>-2</sup>·A<sup>-1</sup>
|-
|[[w:|セルシウス温度]]
|[[w:|セルシウス度]]
|℃
|K
|
|-
|[[w:光束|光束]]
|[[w:ルーメン|ルーメン]] (lumen)
|lm
|cd·sr
|cd·m<sup>2</sup>/m<sup>2</sup> = cd
|-
|}
=== 表4 単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例 ===
固有の名称を持つSI組立単位は、SI基本単位や他のSI組立単位と組み合わせて他の組立量を表すために用いることができる。
{| class="wikitable"
!組立量
!名称
!記号
!SI基本単位<br />による表し方
|-
|粘度
|パスカル秒
|Pa·s
|m<sup>-1</sup>·kg·s<sup>-1</sup>
|-
|力のモーメント
|ニュートンメートル
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|表面張力
|ニュートン毎メートル
|N/m
|kg·s<sup>-2</sup>
|-
|角速度
|ラジアン毎秒
|rad/s
|m·m<sup>-1</sup>·s<sup>-1</sup> = s<sup>-1</sup>
|-
|角加速度
|ラジアン毎秒毎秒
|rad/s<sup>2</sup>
|m·m<sup>-1</sup>·s<sup>-2</sup> = s<sup>-2</sup>
|-
|熱流束
|ワット毎平方メートル
|W/m<sup>2</sup>
|kg·s<sup>-3</sup>
|-
|熱容量
|ジュール毎ケルビン
|J/K
|m<sup>2</sup>·kg·s<sup>-2</sup>·K<sup>-1</sup>
|-
|比熱容量
|ジュール毎キログラム毎ケルビン
|J/(kg·K)
|m<sup>2</sup>·s<sup>-2</sup>·K<sup>-1</sup>
|-
|熱伝導率
|ワット毎メートル毎ケルビン
|W/(m·K)
|m·kg·s<sup>-3</sup>·K<sup>-1</sup>
|-
|}
== 脚註 ==
<references />
dz4ig0tag3138ld2h3halzy703upyos
206203
206202
2022-08-04T05:09:44Z
Ef3
694
キャプション
wikitext
text/x-wiki
化学工業では、物理量の単位系は'''国際単位系'''である'''SI単位'''を、なるべく用いる。
SI単位系については、高校物理の標準的な教科書に、かかれています。
ほんの数十年前までの昔(※ 執筆時点は2013年。)は、国や業界ごとに、さまざまな単位があったが、それだと換算の手間がかかるなど、不便なことがおおいので、単位を統一する必要が生じた。
現在は、単位を、なるべくSI単位系に単位を統一するのが主流である。
日本国のJIS規格や計量法でも、原則的にSI単位系を採用している。
また、国際規格のISO規格でも、原則的にSI単位系を採用している。
== SI基本単位 ==
{{Wikipedia|SI基本単位}}
国際単位系では7つの[[w:SI基本単位|基本単位]]と、それ以外の単位は基本単位を組み合わせた[[w:SI組立単位|組立単位]]としている。
SI単位系で基礎とする単位は、長さの単位にはメートル法を基礎として、質量の単位はキログラムを基礎とする。時間の単位は秒を基礎とする。温度はケルビン温度を基礎とする。
7つの基本単位をまとめると、
基本単位は'''時間''' (s)、'''長さ''' (m)、'''質量''' (kg)、'''電流''' (A)、'''熱力学温度''' (K)、'''物質量''' (mol)、'''光度''' (cd) である。
:{| class="wikitable"
|+ 表1:SI基本単位
!rowspan="2" style="width:6em;"|量
!colspan="2" |基本単位
!rowspan="2" |定義<ref>{{Cite web|language=en|url=https://www.bipm.org/utils/common/pdf/si-brochure/SI-Brochure-9-concise-EN.pdf|work=A concise summary of the International System of Units, SI|title=Table 1: The seven base units of the SI|page=2|accessdate=2022-08-04}}</ref>
|-
!style="width:6em;"|名称
!style="width:3em;"|記号
|-
!時間
|'''[[w:秒|秒]]'''||s
| [[w:セシウム|セシウム]]133原子の[[w:基底状態|基底状態]]の2つの[[w:超微細構造|超微細構造]]準位間の遷移に対応する放射の周期の{{val|9192631770}}倍に等しい時間
|-
!長さ
|'''[[w:|メートル]]'''||m
| 真空中で1[[w:秒]]間の{{val|299792458|u=分}}の1の時間に[[w:光|光]]が進む行程の長さ
|-
!質量
|'''[[w:キログラム|キログラム]]'''||kg
|<del>[[w:国際キログラム原器|国際キログラム原器]]([[w:プラチナ|プラチナ]]90%、[[w:イリジウム|イリジウム]]10%からなる[[w:合金|合金]]で直径・高さともに39mmの円柱の質量</del><hr>[[w:プランク定数|プランク定数]]を{{val|6.62607015e-34|u=ジュール秒}}とすることによって定まる質量
|-
!電流
|'''[[w:アンペア|アンペア]]'''||A
|<del>無限に長く、無限に小さい円形断面積を持つ2本の直線状導体を真空中に1メートルの間隔で平行においたとき、導体の長さ1メートルにつき2×10<sup>-7</sup>[[w:|ニュートン]]の力を及ぼしあう導体のそれぞれに流れる電流の大きさ</del><hr><ins>[[w:電気素量|電気素量]]を{{val|1.602176634e-19|u=[[w:クーロン|クーロン]]}}とすることによって定まる電流</ins>
|-
!熱力学温度
|'''[[w:ケルビン|ケルビン]]'''||K
|<del>水の[[w:三重点|三重点]]の[[w:熱力学温度|熱力学温度]]の1/273.16。</del><hr><ins>[[w:ボルツマン定数|ボルツマン定数]]を{{val|1.380649e-23|u=[[w:ジュール|ジュール]]毎[[w:ケルビン|ケルビン]]}}とすることによって定まる温度。</ins>温度間隔も同じ単位
|-
!物質量
|'''[[w:モル|モル]]'''||mol
|<del>0.012kgの[[w:|炭素|炭素12]]に含まれる原子と等しい数の構成要素を含む系の物質量。<br />モルを使うときは、構成要素 (entités élémentaires) が指定されなければならないが、それは[[w:|原子]]、[[w:|分子]]、[[w:|イオン]]、[[w:|電子]]、その他の粒子またはこの種の粒子の特定の集合体であってよい</del><hr><ins>{{val|6.02214076|e=23}}([[w:アボガドロ数|アボガドロ数]])の要素粒子で構成された系の物質量</ins>
|-
!光度
|'''[[w:カンデラ|カンデラ]]'''||cd
|周波数 540×10<sup>12</sup>[[w:ヘルツ|ヘルツ]]の単色放射を放出し、所定方向の放射強度が1/683[[w:ワット|ワット]]毎[[w:ステラジアン|ステラジアン]]である光源のその方向における光度
|-
|colspan=4 | 2019年に定義が変更され、教科書によっては変更が反映されていないので、<del>旧定義</del>・<ins>新定義</ins>を併記した。{{See|w:SI基本単位の再定義 (2019年)}}
|}
== 組立単位 ==
{{Wikipedia|SI組立単位}}
SI組立単位、およびその他のSI組立単位を列挙する。世の中に存在する量は限りなくあり、全てを挙げることは不可能であるので、その一例を挙げる。
=== 表2 基本単位を用いて表される一貫性のあるSI組立単位の例 ===
:{| class="wikitable"
|+ 表2:基本単位を用いて表される 一貫性のあるSI組立単位の例
!組立量(誘導量)
!名称
!記号
|-
!面積
|平方メートル
|style="text-align:center"|m<sup>2</sup>
|-
!体積
|立方メートル
|style="text-align:center"|m<sup>3</sup>
|-
!速さ・速度
|メートル毎秒
|style="text-align:center"|m/s
|-
!加速度
|メートル毎秒毎秒
|style="text-align:center"|m/s<sup>2</sup>
|-
!密度(質量密度)
|キログラム毎立方メートル
|style="text-align:center"|kg/m<sup>3</sup>
|-
!面密度
|キログラム毎平方メートル
|style="text-align:center"|kg/m<sup>2</sup>
|-
!電流密度
|アンペア毎平方メートル
|style="text-align:center"|A·m<sup>-2</sup>
|-
!磁界の強さ
|アンペア毎メートル
|style="text-align:center"|A/m
|-
!モル濃度
|モル毎立方メートル
|style="text-align:center"|mol/m<sup>3</sup>
|-
|}
=== 表3 固有の名称と記号で表される一貫性のあるSI組立単位 ===
いくつかのSI組立単位には、利便性の観点から固有の名称と記号が与えられている。固有の名称を持つSI組立単位は、下記に示す22個である。下方の4つの単位は、健康保護の観点から特別に固有の名称を与えられたものである。
:{| class="wikitable"
|+ 表3:固有の名称と記号で表される一貫性のあるSI組立単位
!組立量
!名称
!記号
!他のSI単位<br />による表し方
!SI基本単位<br />による表し方
|-
|[[w:角度|平面角]]
|[[w:ラジアン|ラジアン]] (radian)
|rad
|1
|m/m
|-
|[[w:立体角|立体角]]
|[[w:ステラジアン|ステラジアン]] (steradian)
|sr
|1
|m<sup>2</sup>/m<sup>2</sup>
|-
|[[w:周波数|周波数]]
|[[w:ヘルツ|ヘルツ]] (hertz)
|Hz
|
|s<sup>-1</sup>
|-
|[[w:力|力]]
|[[w:ニュートン|ニュートン]] (newton)
|N
|
|m·kg·s<sup>-2</sup>
|-
|[[w:圧力|圧力]]・[[w:応力|応力]]
|[[w:パスカル|パスカル]] (pascal)
|Pa
|N/m<sup>2</sup>
|m<sup>-1</sup>·kg·s<sup>-2</sup>
|-
|[[w:エネルギー|エネルギー]]・[[w:仕事 (物理学)|仕事]]・[[w:熱量|熱量]]
|[[w:ジュール (単位)|ジュール]] (joule)
|J
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|[[w:仕事率|仕事率]]
|[[w:|ワット]] (watt)
|W
|J/s
|m<sup>2</sup>·kg·s<sup>-3</sup>
|-
|[[w:電荷|電荷]]・[[w:電気量|電気量]]
|[[w:|クーロン]] (coulomb)
|C
|
|s·A
|-
|[[w:電位差|電位差]] ([[w:電圧|電圧]])・[[w:起電力|起電力]]
|[[w:ボルト (単位)|ボルト]] (volt)
|V
|W/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-1</sup>
|-
|[[w:電気容量|電気容量]]
|[[w:ファラド|ファラド]] (farad)
|F
|C/V
|m<sup>-2</sup>·kg<sup>-1</sup>·s<sup>4</sup>·A<sup>2</sup>
|-
|[[w:電気抵抗|電気抵抗]]
|[[w:オーム|オーム]] (ohm)
|Ω
|V/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-2</sup>
|-
|[[w:|磁束]]
|[[w:|ウェーバ]] (weber)
|Wb
|V·s
|m<sup>2</sup>·kg·s<sup>-2</sup>·A<sup>-1</sup>
|-
|[[w:|セルシウス温度]]
|[[w:|セルシウス度]]
|℃
|K
|
|-
|[[w:光束|光束]]
|[[w:ルーメン|ルーメン]] (lumen)
|lm
|cd·sr
|cd·m<sup>2</sup>/m<sup>2</sup> = cd
|-
|}
=== 表4 単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例 ===
固有の名称を持つSI組立単位は、SI基本単位や他のSI組立単位と組み合わせて他の組立量を表すために用いることができる。
:{| class="wikitable"
|+ 表4:単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例
!組立量
!名称
!記号
!SI基本単位<br />による表し方
|-
|粘度
|パスカル秒
|Pa·s
|m<sup>-1</sup>·kg·s<sup>-1</sup>
|-
|力のモーメント
|ニュートンメートル
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|表面張力
|ニュートン毎メートル
|N/m
|kg·s<sup>-2</sup>
|-
|角速度
|ラジアン毎秒
|rad/s
|m·m<sup>-1</sup>·s<sup>-1</sup> = s<sup>-1</sup>
|-
|角加速度
|ラジアン毎秒毎秒
|rad/s<sup>2</sup>
|m·m<sup>-1</sup>·s<sup>-2</sup> = s<sup>-2</sup>
|-
|熱流束
|ワット毎平方メートル
|W/m<sup>2</sup>
|kg·s<sup>-3</sup>
|-
|熱容量
|ジュール毎ケルビン
|J/K
|m<sup>2</sup>·kg·s<sup>-2</sup>·K<sup>-1</sup>
|-
|比熱容量
|ジュール毎キログラム毎ケルビン
|J/(kg·K)
|m<sup>2</sup>·s<sup>-2</sup>·K<sup>-1</sup>
|-
|熱伝導率
|ワット毎メートル毎ケルビン
|W/(m·K)
|m·kg·s<sup>-3</sup>·K<sup>-1</sup>
|-
|}
== 脚註 ==
<references />
mb4p8fbvklinmrb5s9jmgsx3r1oenip
206205
206203
2022-08-04T07:32:11Z
Ef3
694
/* SI基本単位 */ SI では、7つの定義定数は次のように定義される。
wikitext
text/x-wiki
化学工業では、物理量の単位系は'''国際単位系'''である'''SI単位'''を、なるべく用いる。
SI単位系については、高校物理の標準的な教科書に、かかれています。
ほんの数十年前までの昔(※ 執筆時点は2013年。)は、国や業界ごとに、さまざまな単位があったが、それだと換算の手間がかかるなど、不便なことがおおいので、単位を統一する必要が生じた。
現在は、単位を、なるべくSI単位系に単位を統一するのが主流である。
日本国のJIS規格や計量法でも、原則的にSI単位系を採用している。
また、国際規格のISO規格でも、原則的にSI単位系を採用している。
== SI基本単位 ==
{{Wikipedia|SI基本単位}}
国際単位系では7つの[[w:SI基本単位|基本単位]]と、それ以外の単位は基本単位を組み合わせた[[w:SI組立単位|組立単位]]としている<ref>2019年の定義改定以前は、SIを定義するために基本単位と組立単位という概念が使われていた。この2つの分類区分は、定義定数に基づく現在のSIにおいて必須でなくなったが、その利便性が高く広く普及していることから、引続き保持される。</ref>。
SI単位系で基礎とする単位は、長さの単位にはメートル法を基礎として、質量の単位はキログラムを基礎とする。時間の単位は秒を基礎とする。温度はケルビン温度を基礎とする。
7つの基本単位をまとめると、
基本単位は'''時間''' (s)、'''長さ''' (m)、'''質量''' (kg)、'''電流''' (A)、'''熱力学温度''' (K)、'''物質量''' (mol)、'''光度''' (cd) である。
;SI では、7つの定義定数は次のように定義される。
:; セシウム 133 原子の摂動を受けない基底状態の超微細構造遷移周波数 ∆νCs: {{val|9192631770|u=[[w:ヘルツ|Hz]]}}
:; 真空中の光の速さ c : {{val|299792458|u=[[w:メートル毎秒|m/s]]}}
:; プランク定数 h : {{val|6.62607015|e=-34|u=[[w:ジュール|J]] [[w:秒|s]]}}
:; 電気素量 e : {{val|1.602176634|e=-19|u=[[w:クーロン|C]]}}
:; ボルツマン定数 k : {{val|1.380649|e=-23|u=[[w:ジュール|J]]/[[w:ケルビン|K]]}}
:; アボガドロ定数 NA : {{val|6.02214076|e=23|u=mol<sup>-1</sup>}}
:; 周波数 {{val|540|e=12|u=Hz}}の単色放射の視感効果度 Kcd : {{val|683|u=lm/W}}
これらは、定義値であり不確かさを含まない。
:{| class="wikitable"
|+ 表1:SI基本単位
!rowspan="2" style="width:6em;"|量
!colspan="2" |基本単位
!rowspan="2" |定義<ref>{{Cite web|language=en|url=https://www.bipm.org/utils/common/pdf/si-brochure/SI-Brochure-9-concise-EN.pdf|work=A concise summary of the International System of Units, SI|title=Table 1: The seven base units of the SI|page=2|accessdate=2022-08-04}}</ref>
|-
!style="width:6em;"|名称
!style="width:3em;"|記号
|-
!時間
|'''[[w:秒|秒]]'''||s
| [[w:セシウム|セシウム]]133原子の[[w:基底状態|基底状態]]の2つの[[w:超微細構造|超微細構造]]準位間の遷移に対応する放射の周期の{{val|9192631770}}倍に等しい時間
|-
!長さ
|'''[[w:|メートル]]'''||m
| 真空中で1[[w:秒|秒]]間の{{val|299792458|u=メートル毎秒}}の1の時間に[[w:光|光]]が進む行程の長さ
|-
!質量
|'''[[w:キログラム|キログラム]]'''||kg
|<del>[[w:国際キログラム原器|国際キログラム原器]]([[w:プラチナ|プラチナ]]90%、[[w:イリジウム|イリジウム]]10%からなる[[w:合金|合金]]で直径・高さともに39mmの円柱の質量</del><hr>[[w:プランク定数|プランク定数]]を{{val|6.62607015e-34|u=ジュール秒}}とすることによって定まる質量
|-
!電流
|'''[[w:アンペア|アンペア]]'''||A
|<del>無限に長く、無限に小さい円形断面積を持つ2本の直線状導体を真空中に1メートルの間隔で平行においたとき、導体の長さ1メートルにつき2×10<sup>-7</sup>[[w:|ニュートン]]の力を及ぼしあう導体のそれぞれに流れる電流の大きさ</del><hr><ins>[[w:電気素量|電気素量]]を{{val|1.602176634e-19|u=[[w:クーロン|クーロン]]}}とすることによって定まる電流</ins>
|-
!熱力学温度
|'''[[w:ケルビン|ケルビン]]'''||K
|<del>水の[[w:三重点|三重点]]の[[w:熱力学温度|熱力学温度]]の1/273.16。</del><hr><ins>[[w:ボルツマン定数|ボルツマン定数]]を{{val|1.380649e-23|u=[[w:ジュール|ジュール]]毎[[w:ケルビン|ケルビン]]}}とすることによって定まる温度。</ins>温度間隔も同じ単位
|-
!物質量
|'''[[w:モル|モル]]'''||mol
|<del>0.012kgの[[w:|炭素|炭素12]]に含まれる原子と等しい数の構成要素を含む系の物質量。<br />モルを使うときは、構成要素 (entités élémentaires) が指定されなければならないが、それは[[w:|原子]]、[[w:|分子]]、[[w:|イオン]]、[[w:|電子]]、その他の粒子またはこの種の粒子の特定の集合体であってよい</del><hr><ins>{{val|6.02214076|e=23}}([[w:アボガドロ数|アボガドロ数]])の要素粒子で構成された系の物質量</ins>
|-
!光度
|'''[[w:カンデラ|カンデラ]]'''||cd
|周波数 540×10<sup>12</sup>[[w:ヘルツ|ヘルツ]]の単色放射を放出し、所定方向の放射強度が1/683[[w:ワット|ワット]]毎[[w:ステラジアン|ステラジアン]]である光源のその方向における光度
|-
|colspan=4 | 2019年に定義が変更され、教科書によっては変更が反映されていないので、<del>旧定義</del>・<ins>新定義</ins>を併記した。{{See|w:SI基本単位の再定義 (2019年)}}
|}
== 組立単位 ==
{{Wikipedia|SI組立単位}}
SI組立単位、およびその他のSI組立単位を列挙する。世の中に存在する量は限りなくあり、全てを挙げることは不可能であるので、その一例を挙げる。
=== 表2 基本単位を用いて表される一貫性のあるSI組立単位の例 ===
:{| class="wikitable"
|+ 表2:基本単位を用いて表される 一貫性のあるSI組立単位の例
!組立量(誘導量)
!名称
!記号
|-
!面積
|平方メートル
|style="text-align:center"|m<sup>2</sup>
|-
!体積
|立方メートル
|style="text-align:center"|m<sup>3</sup>
|-
!速さ・速度
|メートル毎秒
|style="text-align:center"|m/s
|-
!加速度
|メートル毎秒毎秒
|style="text-align:center"|m/s<sup>2</sup>
|-
!密度(質量密度)
|キログラム毎立方メートル
|style="text-align:center"|kg/m<sup>3</sup>
|-
!面密度
|キログラム毎平方メートル
|style="text-align:center"|kg/m<sup>2</sup>
|-
!電流密度
|アンペア毎平方メートル
|style="text-align:center"|A·m<sup>-2</sup>
|-
!磁界の強さ
|アンペア毎メートル
|style="text-align:center"|A/m
|-
!モル濃度
|モル毎立方メートル
|style="text-align:center"|mol/m<sup>3</sup>
|-
|}
=== 表3 固有の名称と記号で表される一貫性のあるSI組立単位 ===
いくつかのSI組立単位には、利便性の観点から固有の名称と記号が与えられている。固有の名称を持つSI組立単位は、下記に示す22個である。下方の4つの単位は、健康保護の観点から特別に固有の名称を与えられたものである。
:{| class="wikitable"
|+ 表3:固有の名称と記号で表される一貫性のあるSI組立単位
!組立量
!名称
!記号
!他のSI単位<br />による表し方
!SI基本単位<br />による表し方
|-
|[[w:角度|平面角]]
|[[w:ラジアン|ラジアン]] (radian)
|rad
|1
|m/m
|-
|[[w:立体角|立体角]]
|[[w:ステラジアン|ステラジアン]] (steradian)
|sr
|1
|m<sup>2</sup>/m<sup>2</sup>
|-
|[[w:周波数|周波数]]
|[[w:ヘルツ|ヘルツ]] (hertz)
|Hz
|
|s<sup>-1</sup>
|-
|[[w:力|力]]
|[[w:ニュートン|ニュートン]] (newton)
|N
|
|m·kg·s<sup>-2</sup>
|-
|[[w:圧力|圧力]]・[[w:応力|応力]]
|[[w:パスカル|パスカル]] (pascal)
|Pa
|N/m<sup>2</sup>
|m<sup>-1</sup>·kg·s<sup>-2</sup>
|-
|[[w:エネルギー|エネルギー]]・[[w:仕事 (物理学)|仕事]]・[[w:熱量|熱量]]
|[[w:ジュール (単位)|ジュール]] (joule)
|J
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|[[w:仕事率|仕事率]]
|[[w:|ワット]] (watt)
|W
|J/s
|m<sup>2</sup>·kg·s<sup>-3</sup>
|-
|[[w:電荷|電荷]]・[[w:電気量|電気量]]
|[[w:|クーロン]] (coulomb)
|C
|
|s·A
|-
|[[w:電位差|電位差]] ([[w:電圧|電圧]])・[[w:起電力|起電力]]
|[[w:ボルト (単位)|ボルト]] (volt)
|V
|W/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-1</sup>
|-
|[[w:電気容量|電気容量]]
|[[w:ファラド|ファラド]] (farad)
|F
|C/V
|m<sup>-2</sup>·kg<sup>-1</sup>·s<sup>4</sup>·A<sup>2</sup>
|-
|[[w:電気抵抗|電気抵抗]]
|[[w:オーム|オーム]] (ohm)
|Ω
|V/A
|m<sup>2</sup>·kg·s<sup>-3</sup>·A<sup>-2</sup>
|-
|[[w:|磁束]]
|[[w:|ウェーバ]] (weber)
|Wb
|V·s
|m<sup>2</sup>·kg·s<sup>-2</sup>·A<sup>-1</sup>
|-
|[[w:|セルシウス温度]]
|[[w:|セルシウス度]]
|℃
|K
|
|-
|[[w:光束|光束]]
|[[w:ルーメン|ルーメン]] (lumen)
|lm
|cd·sr
|cd·m<sup>2</sup>/m<sup>2</sup> = cd
|-
|}
=== 表4 単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例 ===
固有の名称を持つSI組立単位は、SI基本単位や他のSI組立単位と組み合わせて他の組立量を表すために用いることができる。
:{| class="wikitable"
|+ 表4:単位の中に固有の名称と記号を含む一貫性のあるSI組立単位の例
!組立量
!名称
!記号
!SI基本単位<br />による表し方
|-
|粘度
|パスカル秒
|Pa·s
|m<sup>-1</sup>·kg·s<sup>-1</sup>
|-
|力のモーメント
|ニュートンメートル
|N·m
|m<sup>2</sup>·kg·s<sup>-2</sup>
|-
|表面張力
|ニュートン毎メートル
|N/m
|kg·s<sup>-2</sup>
|-
|角速度
|ラジアン毎秒
|rad/s
|m·m<sup>-1</sup>·s<sup>-1</sup> = s<sup>-1</sup>
|-
|角加速度
|ラジアン毎秒毎秒
|rad/s<sup>2</sup>
|m·m<sup>-1</sup>·s<sup>-2</sup> = s<sup>-2</sup>
|-
|熱流束
|ワット毎平方メートル
|W/m<sup>2</sup>
|kg·s<sup>-3</sup>
|-
|熱容量
|ジュール毎ケルビン
|J/K
|m<sup>2</sup>·kg·s<sup>-2</sup>·K<sup>-1</sup>
|-
|比熱容量
|ジュール毎キログラム毎ケルビン
|J/(kg·K)
|m<sup>2</sup>·s<sup>-2</sup>·K<sup>-1</sup>
|-
|熱伝導率
|ワット毎メートル毎ケルビン
|W/(m·K)
|m·kg·s<sup>-3</sup>·K<sup>-1</sup>
|-
|}
== 脚註 ==
<references />
mlnsi5ujl0gxdax8azf729norhg8gfx
Wikijunior:算数の図形/点
0
18669
206204
149888
2022-08-04T07:29:22Z
久保田航介
69643
/* 点の大きさ */改善
wikitext
text/x-wiki
'''点'''(てん)とは、位置だけを持ち、体積(物の大きさのこと)・面積(物の表面の広さのこと)・長さ(物の両端間の距離のこと)を持たない図形です。
== 点の大きさ ==
点には'''一切の体積や面積、そして長さがありません'''。
体積・面積・長さが全くない、というのはあなたたちの直感に反するかもしれません。しかし、この考え方はこれから算数を考えていく上でとても重要になってきますから、今は納得できなくても、とりあえず受け入れてみてください。きっと、分かるようになりますから。
点には体積・面積・長さがないと言いましたが、これはつまり、点は描き表すことが出来ない、ということです。
:当たり前ですが、[[File:Disc Plain black.svg|32px]] これは点ではありません。
:また、[[File:Disc Plain black.svg|8px]] これも違います。
:そして、[[File:Disc Plain black.svg|2px]] これでもありません。
:本当の点は、「 」これです。
全く見えませんね。でも、点とは本来そういう物なのです。とても書くことの難しい、書くことも出来ないものです。'''点は無限に小さい図形'''と言えるでしょう。つまり、「点を描く」ということは、不可能であるはずです。
しかし、実際に点を扱うときに全く見えないのでは困りますから、実際には点は目に見える形で書きます。
== 点の役割 ==
点は、とても正確な位置をしめすことが出来ます。なぜなら点には大きさが無いので、少しもぶれることなく、示したい場所を示すことが出来るからです。
{{発展|小学生|数学における点の名称}}
数学において、点に名前をつけることがあります。そういった時、例えば <math>P</math> のように、[[中学校英語 第1学年#アルファベット|アルファベット(中学生以降で習います)]]の大文字を使います。
== 点と線・平面の位置関係 ==
いくつかの点が同じ線の上にある場合、それらの点が'''同一線上にある'''といいます。また、いくつかの点が同じ平面上にある場合、それらの点が'''同一平面上にある'''といいます。
二つ以下の点は常に同一線上にあります。また、三つ以下の点は常に同一平面上にあります。
[[Category:算数 (ウィキジュニア)|図形 てん]]
b930t8cil9cdpo4ikto1p9lhsdm2ub4
ゲームプログラミング/バランス調整
0
27004
206190
206167
2022-08-03T14:15:27Z
Honooo
14373
/* ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか? */ 6本目のコラムまで終了。7/9。
wikitext
text/x-wiki
{{substub}}
現在の版の著者達は、ゲーム戦闘の調整の経験はないので、現状では本ページの内容は調べ物としては役立ちません。経験があり、かつ人間性も良好な人の協力をお待ちしています。
==本ページの目的==
本科目『ゲームプログラミング』は、科目名に「プログラミング」とあるとおり、ゲームクリエイターのための教材ではなくプログラマーのための教材です。
従って、話題がプログラミング的な技術的な話題に片寄っています。一般のゲームクリエイターを目指す人には、本書のバランス調整の記述は到底、役立ちません。
プログラマーが、とりあえず何か趣味でゲームを作る際、バランス調整についての調べ物の手間を少なくするためだけの目的の教科書です。
……と、前編集者Suj. は書いたんだけど、その割にはこの人物の私欲を満たすためだけの駄文が結構くどくど書かれてる気がするんだけど…
気のせいか?まあまだちゃんと読んでないしね、熱でもあるのカナ? コロナか^^?
==バランス調整==
ゲームには難易度というものがあるが、そのゲームの面白さのため、あるいは商品としての購買力アップのため、調整し、最適値を見出す必要があるだろう。敵の強さや主人公の強さ、それらを調整し、最適値を見出すための調査、テストプレイなどが必要だ。
より普遍的に、バグ修正、操作性の改善、仕様実装の更新、そして今書いたバランス調整、ゲームを面白く、評価を高めるための様々な改善を、一般にチューニングと呼んでいる。
英語では、難易度の調整のことを「レベルデザイン」と言う。このレベルとは、高低差の意味で、欧米での昔の3Dゲームにおける、マップの高低差を意図しているらしい。このレベルを調整するツールをレベルエディタというが、このマップの高低差の調整で難易度が変わるので、しだいにレベルデザインが難易度の調整の意味になっていったという<ref>川上大典ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日第1版第1刷、P.57</ref>。
難易度デザイン、という言葉も使われている<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.58</ref>。
そして、難易度の調整にはマップの処理もあるので、3Dゲームのレベルデザイン担当者は、MAYAなどの3Dグラフィックツールの技能を持っているスタッフが多いという<ref>吉冨賢介『ゲームプランナー入門』、P234</ref>。
===詰み、を避けたい===
製品として販売するゲーム、そしてそうでなくとも、プレイヤーがセーブした時点でクリア不能な状況、仕様になっている、つまり、プログラムの流れとして事実上そうなっている、これを「詰み」、と呼んでいますが、それは避ける必要がある。
これはプログラムの構造の問題ですが、ゲームは進行の仕様自体かなりの複雑さを持っていますから、制作者が気付かないうちにプレイヤーがそこに追い込まれる可能性があり、これは娯楽であるゲームとしては避けたい事態です<ref name="twogc78">蛭田健司『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖』、翔泳社、2016年4月14日初版第1刷発行、P78</ref>。
まず、ゲーム全体のバランスとして、平均的なプレイヤーなら、妥当な労力でクリアできる調整も必要でしょう。
ゲームプレイで詰みに追い込まれるのは、プログラムの構造の悪さでもありますが、それを見つけ出すためには、具体的にテストプレイにおいて、少なくとも誰か一人のテストプレイヤーが、そのゲーム内で想定できるクリア困難な状況から、実際に挽回してクリアしたという、事実、実績が必要です。
つまりコンピュータープログラムで常にセキュリティの問題が発生するのと同様に、ゲームプログラムでは構造が複雑になりすぎて、詰みがプログラマーの想定を超えて発生する可能性があるので、実際のプレイで、実際のプレイヤーの現実の巻き返しで確認して調整したい、という事ですね<ref name="twogc78" />。
そして一方難易度調整として、平均的プレイヤーが平均的な労力でクリアできるようにしておきたい。
ちなみに現編集者の昔のゲームプレイ経験ですが、初代ファミコン版のファイナルファンタジーですね、番号は幾つだったか……市販の攻略本を読みながらプレイしていたのですが、あるところまでいった時点で、攻略本を読んでも、どう考えても先に進めない状況に陥り、まあ私のプレイヤーとしての技量にも問題あったのかもしれませんが、結局にっちもさっちもいかなくなって、プレイを放棄してクリアしないまま積みゲーになってしまったことがあります。もちろんそれでそのゲームの仕様が悪かったと主張するつもりはありませんが、プレイヤーの私としてはその時点で完全に詰んでしまったわけです。
===実はゲームプレイヤーだけではなく、あらゆる人間が面倒くさい、俺も、あんたもね^^===
……しかしあんまり面倒くさがると、結局最後には偉い人に怒られてしまうのがこの社会の常です^^;;;。
一般にゲームプレイヤーがプレイ中に面倒くさがることは、覚えること、計算すること、配ること、だと言われています<ref>『ゲームプランとデザインの教科書』,P342</ref>。
ゲーム中に、Wolfram|Alpha が使えるような仕様にすると、案外よかったりしてね^^
===ゲーム制作者はいろいろ考えて作っているだろうけど、プレイヤーだってそれに負けずに考えてプレイしている===
プレーヤーも制作者も、時代の流れとともに、色々な変遷はありますよね。
時々指摘されるようですが、昔よりの最近の方が、ゲームの難しさに関する感受性が大きくて、割と簡単にこのゲームは難しいと指摘されることが多い、と、言われている。
たとえば携帯ゲームにおいて、平均的なゲームプレイヤーがクリアまでに5回ゲームオーバーになるように調整されたゲームは、今では「難しい」ゲームと判断される<ref>『ゲームプランナーの新しい教科書』、P210</ref>。つまり昔のプレイヤーの方が我慢強かったってこと??
一方平均的なプレイヤーならゲームオーバーにならない難易度のゲームは、やさしいゲームと呼ばれることが多い。
だからもはやゲームの難しい易しいという言葉さえ、相対的で、結構人によって判断が違う。
2011~2013年頃のテレビ番組で、ゲーム業界を取材した番組、夜中の番組で、こういうものがあったという。
「昔の子供は、難しいゲームをプレイしたとき、「このゲームは難しい」と答えていたが、今の子供は「このゲームはつまらない」 と答える」
しかし実はテレビというのはこの社会で一番いい加減なメディアで、常に制作者に都合のいい印象操作、不当なイメージ操作が行われている。
つまり昔の子供より今の子供の方が愚かだというイメージを作りたいだけで、インチキな企業のためのいんちきな広告としての意味以外何も持たないだろう。
===商業だろうとそうでなかろうとゲーム制作はプレイヤーの事を考える、難易度はどうする?===
『ナナのリテラシー』という漫画、作者はゲーム好きで、ゲーム雑誌でも描いていたことがあるようです。ビジネス系しかもノウハウ系かな?2巻がゲーム会社回。
ゲーム会社の隅の老人経営者曰く(この漫画内の話ですよ)、「誰もが飛び越せる絶妙な難易度の壁をクリアさせる」、これがゲーム作りのコツじゃ^^!!!
この漫画、前編集者が書くにはかなり、そこそこ取材されているという。
「PS」(プレステ)のロードは、「1回のロードで2WMが限界。どんなマップも2メガに入れなくちゃいけない。会話も音楽も全部ね。」なんて描写があるらしい。
この老人の主張は作品自体の主張でも作者の主張でもないというが、しかし前編集者は重要な事だと考えているようだ。
しかし誰もが飛び越せる絶妙な壁をクリアさせて、消費者に快楽を与えて、ガッポガッポも儲けるにしても、人間には個性があり、性格や性質にもばらつきがある。
全ての人に等しく、偉そうに試練を与えて、それを乗り越えたから気持ちいい、と自己満足に等しく浸らせることは難しい。
だから、インチキにガッポがっぽ儲けるためには(←しつこい^^;;;)、ターゲット層をある程度はしぼりこむ必要がある<ref>『ゲームプランとデザインの教科書』、P.97 </ref>。
「遊んだプレイヤー全員が満足するものを、目指さない」との記述がある書籍もある<ref>塩川洋介『ゲームデザイン プロフェッショナル』、技術評論社、2020年10月3日 第1刷発行、P.173</ref>。ただこれはテストプレイヤーの意見を重視しすぎて振り回されないように、という意図がある記述だという。
ターゲット層を絞りこむには、実在の人物をイメージするのが良いと言う。「20代社会人男性が」、ではなく、自分の知人・友人・家族、あの人を面白がらせたい!!、と、いうのがいいようだ<ref>『ゲームデザイン プロフェッショナル』、P205</ref>。
{{コラム|カラケオは気持ちよく歌いたい^^|
80年代~90年代にカラオケが流行した。と、いっても今でも、盛んだけどね。俺も好き^^
カラオケの難易度は、利用者が楽しめるように易しめに作られているようですね。というか前の項目で書いた、絶妙な難易度らしいよ。そこそこ難しく、それを乗り越えると俺は偉いと自己満足にふけれるらしい。岡田斗司夫が90年代後半にその指摘をしていたというが、しかし本当に前編集者は岡田斗司夫が好きなのね^^;;;。
小室哲哉の曲が典型的にそれだという人もいるらしい。そういえば、NHKアニメーション「だぁ!だぁ!だぁ!」のエンディングは凄く良かったな^^。いや、もちろんこれは只の雑談ですが^^;;;。
エヴァンゲリオンの残酷な天使のテーゼは、監督やスポンサーのレコード会社プロデューサーが、子供でも歌いやすいように作曲してくれと作曲家に依頼している。
確かに凝った楽曲の割に、カラオケで歌いやすい^^
}}
{{コラム|作者の意図通りに視聴者が受け取るとは限らない。作者の意図とは全く別に受け手は作品を楽しむ。それが嫌ならそもそも創作するなよ。|
商業作品であるなら、最終的には売上によって作品の是非が決まる、なんて前編集者は書いてるけど、インチキ書くなよ、あくまでも金は商売としての是非、作品としての価値、意義は別の話だよ。
しかしこいつほんとにアフリマンなのね。金と物質以外何も見えないのか。
ゲームの話題としては、味の善し悪しはプレイヤーが決める、という言葉があるようですね<ref>『ゲームデザイン プロフェッショナル』、P.167</ref>。ターゲット層が、美味い^^!!、と、いう作品を作りたい。
ジブリアニメの『となりのトトロ』は、子供たちにアニメばかり見ずに外で遊ぶように啓蒙するようなストーリーを作者・監督の宮崎駿は目指したと言われています。
ところでこれ↑前編集者の文章だけど、完全なる虚偽だよ、いいかがんにしろ。あのねー、宮崎さんという人は確かに少し偏屈な大人だから、その手の事は時々言うけど、映画を作る時は基本的に、見た人に楽しんでほしい、夢のような時間を過ごしてほしい、そしてこの社会に生まれてよかったと、子供も大人も思ってほしい、そういう思いで、常にそれが第一テーマで漫画映画を作ってるの。
すじ肉先輩さー、あんた俺や他の編集者を何度も知ったかぶりって書いたけど、結局あんたが人類史上、唯一最大の知ったかぶりだね。そもそもあんた、トトロ、観てないんじゃないの?
ほんとにあんたってなにも見えてないのね。「うちの子は、よく宮崎先生のアニメを見ています。面白いアニメを作ってくださり有難うございます」なんて感想は全く問題ないだろ。宮崎氏だってありがたく受け取ってるよ。それに対してアニメばかり観ずに外で遊べ!!なんて言うのはお前とお前の同類のキチガイだけだ。
あとガンダムやエヴァンゲリオンでも似たような逸話があるとのことだが、こっちはどうでもいい。そもそもこれを作っている連中は、宮崎氏ほど切迫した気持ちで作っているわけではなく、ただ金が欲しくて自分が偉いと思いたいだけだから、作った方がどう思おうが、そいつらに金を与えて養ってる連中がどう思おうが、大したことじゃあないだろ?
}}
===チュートリアル===
ゲームをプレイするための、操作方法をプレイヤーが知って覚えるための入門的なイベントをチュートリアルというようですね。実は現編集者はあまり、特に最近はほとんどコンピューターゲームはしないので、ここの執筆をしつつもゲームについてはあまり知らない。
ただここの主要執筆者で、ゲーム大好き、プログラム大好き、アニメ大好き、自分自身も一応絵描き、そしてハイルオタキングの E.Suj. かなりひどい内容の文章を大量に書き散らすので、このサイトの参加者として嫌々多少書き直しをせざるを得ない。
そこでチュートリアル、これはふつうゲーム自体に組み込まれ、初盤がそれになりますが、これは別モードにすると良いという指摘がある<ref>『ゲームプランとデザインの教科書』、P401</ref>。
『不思議のダンジョン2 風来のシレン』が、このスタイルを採用している。
とはいえプレイヤーが必ずチュートリアルをプレイしなければ、ゲームを楽しめない構成なら、あまり大きな意味があるとも思えないが、しかしそうでない場合も多いだろう。
ゲーム構成の選択手として考えてもいいだろう。
===技能の習得としてのゲーム===
====ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか?====
まあゲームをしていることで、プレイヤーは何らかの行為、練習を繰り返して、技能様の物を身につけていく、と、考えても、いい? まあいいか、とりあえずはそう見なしましょう。
ですからそこでプレイヤーが身に着ける技能を想定しておくと、上手にバランス調整が出来るという。
すじにく大先生が愛読している文献では、「教育的難易度」という用語を使っています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版第1刷発行、225ページ</ref>。まあゲーム関係者で教育について分かってる奴なんて、ほとんどいないだろうけど…
ここでの教育難易度とは、むしろ大先生の意図とは逆で、ある敵を攻略するのにプレイヤーがなんらかの操作が必要な時、まず1個だけのその敵の撃破用の操作技能だけをプレイヤーが修得できれば攻略できるようにしろと、つまり、プレイヤーが技能を覚えやすいように、難易度を下げろという事でしょう。
前編集者は本質的キチガイなので、とにかく世の中で自分が偉いことが何より大事なので「教育」という言葉を使いたい。一方で割と似たようなことを語る時に、学習という言葉を使っている文献もある<ref>『ゲームプランとデザインの教科書』、P.61 </ref>。要するにこの本の筆者の方が、E.Suj. よりまともな人間だという事でしょう。
ただ、プレイヤーの技能の習得という視点は、バランス調整の時に一番重要になるという。確かにゲームは技能や知恵、解決のための何らかの手段、鍛錬も必要だが、一方では間違いなく娯楽で、面白いものであるはずだ。
そしてゲームをすることで、自分の思考力が磨かれて、成長したという感慨を持つプレイヤーも多いようで<ref>https://www.teu.ac.jp/ap_page/koukai/2019_03_3endo.pdf 66ページ</ref>、全くその気持ちを否定する意図はないが、でもねー、ゲームっていうのは結局遊びなんだよ?
ゲーミフィケーションなんて言葉を使っていい気になっている連中もいるようだけど、まあその概念や運動がまったく意味を持たないとは言わないが、でもやっぱりゲームは娯楽であり遊びであり、ある程度堕落した、ある程度常識的な硬い世界からは非難される要素があるもので、あまり理屈を並べて自分たちの世界が高級なものだと主張しない方がいいんじゃあない?
{{コラム|ゲーミフィケーション|
どうもゲーム業界の連中が、自分たちの仕事を美化して、正当化したいため、ゲーミフィケーションがどうの、なんて言いだしたようだよ<ref>https://news.denfaminicogamer.jp/kikakuthetower/190731a</ref>。
2019年にゲーミフィケーション学会設立。もっともこの運動や概念がまったく意味がないものだとは、現編集者も言わない。確かにゲーム的な行為を、もう少し遊びから離れて、現実の有用な出来事に結び付けようというのは、それほど間違っていないし、意義はある。
2013年ごろからすでに、企業の新人研修で、ゲームの要素を取り入れた研修などがされていたようだ。
岸本好弘(ファミスタの父、と呼ばれているらしい)の言では、「ゲームの本質っていうのは、人間が頭で想像することの素晴らしさ」<ref>https://www.fantasy.co.jp/edutainment/article/interview16</ref>ってことらしいけど、なんか軽い言葉だね。想像には意義があるが、それってほんとに頭でするもの?
40年前(※1980頃?)、
:「そのころアーケードゲームのデザインで言われていたのは、初めてそのゲームに挑戦したプレイヤーでも3分間程度は遊べるようにすること。「もう一度チャレンジしたら、先に進めそうだ!」と、プレイヤーの気持ちが動くように制作すること」
ってことだけど、そうすれば子供が100円玉いっぱい入れて、お前らが儲かるってだけだろ?
:「これって、現在IT業界で言われるUX、ユーザーエクスペリエンスですよね。ゲーム業界では理論化、言語化していなかったけれど、40年前から現代に通じることをやっていたんだなと思いました。」
何かそれらしい言葉だけ踊ってかっこつけてるようにしか聞こえん^^;;;。
:「ゲームって全部「そそのかし」なんです。ゲームをプレイしていて、Aの洞窟に行きなさいとか、Bの洞窟には行くなとは言われないですよね。プレイヤーが2つの洞窟をぱっと見たときに「こっちの洞窟に宝があるかも!」って見えるように作っているんです。これを「そそのかし」って言うんです。」
まあそれはそれでいいけど、それってそんなに大したことかね?
: (抜粋)「先生は答えを教えるのではなく、生徒が自分で「わかった!」、「僕が一人で気が付いた!」と思わせることが大切。」
思わせるっていうのがすごいし、傲慢だよな。お前は神か?
: 「ゲームをデザインするのも授業をデザインするのも同じです。楽しいと思うことやワクワクすることは脳の働きを最大限にする。だから、つらいことを我慢するのはよくない。脳が楽しいと感じることがとても大切なんです。」
お前みたいな奴って、すぐ脳がどうのって言うよな。まあ楽しいことやワクワクするのが大事なのは認めるが、人生つらいことを我慢しなければいけない時なんてしょっちゅうだよ。後ゲームと授業は別物にしろ、一緒にするな。
しかし思うんだけど、ゲーム業界の奴らって、自分たちの仕事に少しやましさがあるから、教育と結び付けて、高級なものに仕立て上げたいんじゃあないの?
まあゲーム的な教育っていうのはありだが、やはりゲームの本質は遊びで娯楽で、しかも堕落だよ。
}}
{{コラム|すじ肉しちゅ~は今日も右手を上げて、「ハイル、オタキング!!!」と言った。|
1990年代後半に、オタキング岡田斗司夫は、著書『世紀の大怪獣!!オカダ―岡田斗司夫のお蔵出し 』(おそらく)で、マリオカートを例に、市販のゲームソフトの多くは達成感を味合わせるものだと指摘した。
岡田に言わせれば、ゲーム文化以前の人生の趣味の多くは、必ずしも努力の量と、上達とが比例しない。スポーツ、絵画、しかしこれほんと?もちろん厳密に量を考えて、グダグダ気色悪い比較をすれば、そう見えることはあるけど、少なくとも人間、何かをすれば必ず、それなりに得るものがあるはずなんだけどね。
しかしファミコン以降のコンピュータ式のゲームでは努力は無駄にならず、ほぼ必ずといっていいくらい、少なくとも初心者レベルの範囲でなら、プレイして練習すれば上達するように設計されていると、岡田の著書では述べられている。
ふーん、要するにゲームプレイヤーって、ゲーム制作者が作った達成感が欲しいから、金払うってわけね。
岡田が言うには、人生はゲームみたいに甘くないし、もしかしたらゲームは現実逃避で不健全かもしれないけど、でも大人だって親だって達成感をもっと感じたいんだぜ・・・だから今日も娘といっしょにマリオカートをプレイしている、と書いてたって言うけど、そもそも現実逃避や不健全から達成感って手に入る?
なんか頭のおかしい奴はやたら達成感って言うんだけど、それってほんとに欲しい?
いや、もちろんある程度は欲しいけど、でもそんな重要な事かね? もっと人生で必要なもの、いっぱいないかね?
}}
{{コラム|ガイナックスとはオタキング岡田斗司夫が創業した、アニメーションとコンピューターゲームの制作会社である。|
ガイナックスは、コンピューターゲームも作っていたね。確か、美少女18禁ソフトもあったよね。
1991年、『プリンセスメーカー』、育成シミュレーションゲーム。確かに赤井孝美さんのグラフィックは魅力的だった。
少女を光源氏的に育成するゲームだったか、キャラクター育成ゲームのはしりだね<ref>STUDIO SHIN『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版 第2刷 発行、P182</ref>。
98年にはコナミ社『ときめきメモリアル』というのが出た。ただこれは育成というよりは、美少女との恋愛疑似体験ゲームみたいな、まあ俺はやったことないから詳細は知らないけど、まあ美少女と上手に付き合えるように、男性キャラクターを育成する要素はあったのかね。
「プリンセスメーカー」→「同級生」→「ときメモ」の流れがあるって、ある評論家は言う。
良くわからないけど、岡田斗司夫はゲーム制作会社の社長でもあるんだから、前のコラムの達成感がどうののたわごとに意義を認めろって、すじ肉は書くんだけど、なんなのこいつ。
岡田斗司夫の肩書に関する議論って意味ある?
別にアニメ評論家でも、会社社長でも、なんでも勝手に名乗って威張っていればいいけど、でもやっぱり岡田斗司夫の肩書は、オタキングだよね。
}}
{{コラム|プリンセスメーカーdeathpenalty|
少女育成ゲーム・プリンセスメーカーは全滅時の損失が軽いのが、割と画期的だったようです。戦闘で全滅すると、拠点に戻されたうえ、1か月経過する。
全滅時の損失のことを和製英語でデス ペナルティといいます。英語では dead damage と云うらしい(DDと略すようです)。英語の death penalty は「死刑」の意味だって。
つまりどうやら、デスペナルティが軽くても、面白いはRPG は作れるらしい。
;デスルーラ
全滅しても拠点に戻るだけのシステムだと、拠点に戻りたい場合にわざと全滅する方法を使える。これを和製英語で「デスルーラ」と言う。ルーラとはドラクエの移動魔法ルーラのこと。
全滅したときに拠点に戻るゲームでは、拠点に戻れなくするイベントは不可能。
全滅したら拠点に戻れるからね。ただ、戦いが起こらなければどうかな?
どちらにしろこの議論、意味ある?
ただ例外的に全滅したとき拠点以外に戻る、っていう事は仕様で作れるよね。
}}
{{コラム|Roblox,Among_Us|
現編集者は現在は基本的に、コンピューターゲームはしない生活、でもほんのちょっと前、思うところあって、MicrosoftStore,Xbox 経由で、すこしゲームをしていた時期があった。
そしてMicrosoftStore はなんだかんだでゲームを売り込んでくるよね。
その時思ったんだけど、Roblox って面白そうだよねー。プレイはしていないんだけど、広告や表示を見ると、これ絶対面白いなって直感的に思う。
だからこのゲームのユーザーやプレイヤー、あるいは関係者にこのページの執筆してほしいな^^
後、Among_Us っていうのも面白そう。何か皮肉がすごく効いてそうだね。
}}
{{コラム|デスペナルティ関連|
このコラム、前編集者が、(この話題は、後述の商学書『メイド・イン・ジャパンは負けるのか』の話題と関連するので、残す必要がある。)ってメモを張っていたんだけど、読んでみたんだけど、現編集者Hにはちょっと話が見えなくてね。おそらくRPG をやりこんでいる人は内容が良くわかるんだろうけど、現編集者にとってはかなりの部分が???????だね。だからできるだけまとめる一方で、詳細不明の部分は前編集者の記述をそのまま残しました。
;帰り道を通せんぼするイベントは、詰みのリスクが高くなる。
サガシリーズはどこでもセーブできるが、この場合、帰り道を通せんぼするイベントは、上手に設計しないとクリア不能になる恐れがある。
ファミコン~スーファミ時代のドラクエとファイナルファンタジー、GB版サガとロマサガには帰り道を通せんぼするイベントは無いように見える。
ロマサガ1の氷結城の帰り道で通せんぼするボス敵がいる。しかし会話選択肢で戦闘を回避すると、詰みを避けられる。
古い時代のサガ系とロマサガでは、ダンジョン奥まで探検すると、最深部に一方通行のダンジョン出口がある。これは帰り道短縮の意味と、テンポ感向上(プレイヤーが既に理解していることを再度要求しないから)の効果がある。
しかしこの場合、もしダンジョンに一方通行出口がない場合、プレイヤーは帰り道にボス戦があると予測する。これはネタバレになってよくない。ドラクエは、最後の一方通行出口をあまり用意しないが、この狙いがあるのだろう。
このようにゲームのルール設定が、可能なイベントやマップを限定する。
}}
さて上記のデスペナルティのコラムで説明したように、ゲームのシリーズ作品は、そのシリーズを通してルールがおおむね一緒です。
このことと、「ゲームのルールによって搭載されるイベントがある程度は決まる」という事を合わせて考えると、どうなるでしょうか。
そう、シリーズ作品によって、搭載されるイベントの傾向が決まってしまうのです。
問題は、これがマンネリ化につながるおそれがあること、少なくともビジネス書ではそう見られていることです。
これは別にwikiのオリジナル意見ではなく、文脈は違いますが、商学書『メイド・イン・ジャパンは負けるのか』という2010年ごろの書籍で、
シリーズ化とマンネリ化との相互関係が語られています。
さらにその書籍によれば、基本的に家庭用ゲーム機の作品群の多くはゲーム性の根幹が90年代あたりから以降の作品は変わっておらず、変わったのはグラフィックが細かくなっただけ、というふうに見られています。
ただし、書籍は2010年ごろの出版物なので、もしかしたらスマホゲームやソシャゲの流行している2020年代の現代なら、分析結果は違うのかもしれません。
もっともゲーム会社からすれば反論もあるかもしれませんし、たとえば、
「でも消費者が、新シリーズや新ジャンルを出してもロクに買わねえじゃねえか・・・」とか
「グラフィックよりゲーム性とか口先では消費者は言うけど、でもそういうグラ軽視のゲームを消費者は買ってくれないんだよね」とか
「素人はみなそう言うんだよね。でも自分じゃ作ってくんないし少しでも試作品の手本すら見せてくんない」とか思うかもしれませんが、
とりあえず、世間にはそういう意見があります。
けっしてゲームオタクだけがそういうマンネリ化の意見を言ってるのではなく、外部の商学あたりからもそう見られています。ただし書籍の商学者の分析が正しいかどうかは知りませんが。
1980年代のような家庭用ゲーム黎明期や1995年頃のソフト容量が飛躍的に伸びたプレステ1時代ならともかく、そうそう新しくて画期的かつリアリティと説得力ありそうなルールなんて、思いつくものではありません。難しい問題です。また、マンガ産業やアニメ産業は黎明期をとっくに過ぎてしまいましたが、それでもマンガもアニメも産業は続いています。2010年台のゲーム産業だって、もしかしたらスマホゲーム黎明期、ソシャゲ黎明期なのかもしれません。2010年以降の現代のゲーム産業については、当wikiは中立性の立場上、これ以上は解説しません。
{{コラム|岡田斗司夫のアノマリー理論|
古典的な理論を言うと、アニメ評論家の岡田斗司夫が「アノマリー」(「片寄り」という意味の用語)で言ってる例ですが(『東大オタク学講座』にある理論)、ゲームのバランス調整にはそもそも、岡田の理屈によると普遍性はなく、どうしても作者の世界観が反映されます。
たとえば、『シムシティ』というアメリカ人の作った都市運営シミュレーションのゲームでは、原発が効果的な投資であるのですが、そして火力発電所よりも原子力発電所が効果的なのですが、岡田はこれを作者のアメリカ的な都市政策観の反映だとしています。
そのほか、岡田は、ドラクエシリーズに対して、「なぜ作者の堀井さんは、作中で父親と子の関係に、どの作品でも、こだわりたがるんだろう? なにかあったんじゃねえの?」的なゲスい勘繰りもしています。
作家の「個性」というのは、一般人から見れば「異常性」でもあるわけです(ただし、法律を守る程度の最低限の一般性は作家だろうが必要ですが)。個性というのは長所ではなく、欠点の裏返しでもあるわけであり、その欠点すら大人はうまく自分で活用しなければならないのでしょう。
}}
==== 本文 ====
もちろん作品によっては例外もあるでしょうが、しかし上述で紹介したような様々な視点の異なる複数のゲームクリエイターなどゲーム業界人が、「教育」や「成長」などあたかも学習的な用語を使っている事は、念頭に置くと良いかと思います。
ゲームにおける教育的な要素はもちろん擬似的なものです(ゲームに限らず一般のアニメや漫画も同様です。もし本格的に世間一般で通用する意味での「学習」をしたいなら高校~大学レベルの国語・数学・英語・理科・社会科などの参考書などを読もう)。
さて調整の話題に戻ります。
たとえば、アクションゲームの調整なら、
もし敵が飛び道具を使ってくるなら、まずプレイヤーは物陰に隠れて移動して近づくとか、あるいはプレイヤーも飛び道具で応戦するとか、そういうプレイ技法が必要でしょう。
文献『ゲームプランナー集中講座』(吉沢秀雄 著)でも、飛び道具を使ってくる敵には、ゲーム序盤では、まず物陰にかくれて敵の攻撃を避けるなどのプレイ技法をプレイヤーに習得できればよいというくらいまで、(序盤の)難易度を簡単にすべきだと、その文献『ゲームプランナー集中講座』では主張されています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、226ページ</ref>。
まず、序盤の飛び道具つかいの敵なら、プレイヤーが上述のような物陰に隠れる技法を実践できていたら、その敵を簡単に倒せるように難易度を調整します。
このため、序盤ではけっして、敵の攻撃をさけるための物陰の部分には、ゲーム作者はワナなどを仕掛けないでおき、物影には敵も配置しないようにするくらいで、良いのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、226ページ</ref>。
たとえば、飛び道具を使ってくる敵は、そいつに攻撃を当てるまでは難しいが、しかし敵の防御力を低くしておいて、もし敵が(プレイヤーからの)攻撃を受けたら、敵はすぐに倒されてしまう・・・のような強さの敵としてパラメータ調整しておくのが良いでしょう。
つまり、プレイヤーに教えたいスキルとして、そのアクションゲームを通して、飛び道具を使ってくる敵の対処法を教えるのです。
ゲーム後半で難易度を上げる場合は、けっして敵を単にやたらと頑丈にするのではなくて、
敵の強さはそこそこでいいので、
たとえば
ステージのギミックや敵の行動などを今までの敵と複合化させたりする等の設計により、過去にプレイヤーの習得したプレイ技法の組み合わせの練習・習得をプレイヤーに要求したりとかして、プレイヤーに今まで習得した単一のプレイ技法の複合の習得を要求するようにすると、プレイヤーも成長できますし、あきづらくなるし、いいことづくめです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、228ページ</ref>。
(ただし、あまりにも膨大なプレイ技法どうしを組み合わせるような過大な技法をプレイヤーに要求しないように、(作者がプレイヤーに)要求する技法の数にも限度は必要でしょう。)
なお、余談だが、「難易度」の「高い」「低い」の意味は、
:「むずかしい」=「難易度が高い」
:「やさしい」=「難易度が低い」
である。
ゲームを難しくする目的は、プレイヤーに創意工夫を呼び起こすためです。創意工夫を呼び起こさない難しさは不要かもしれません。
書籍『ゲームプランナー入門』によれば、ボス戦などの難しいエリアの目的は、プレイヤーが自らのプレイスキルの程度を試したり、あるいはRPGなどならキャラクターユニットの成長を試すためのものです<ref>吉冨賢介『ゲームプランナー入門』、P60</ref>。また、「歯ごたえ」などの表現の意味も、こういった意味であると書籍では述べています。
;制限の必要性
制限の必要性とは、たとえば、ゲーム中での主人公が丈夫で死にづらいのは構いませんが、しかしどんなに敵の攻撃を食らっても死なずに倒れずに不死身なのは駄目です。
また、主人公の所持金が多いのは構いませんが、しかし所持金が無限大なのは駄目なのです。
また、敵の動きが少し単純なのは構いませんが、しかし、プレイヤーが油断しすぎているのにプレイヤーが負けないのは駄目です(たとえばアクションゲームで一時停止ボタン(ポーズボタン)を押さずにトイレに行ってウンコを数分してきても、ウンコから戻ってきてもキャラが負けてないのは明らかに駄目)。
このような駄目な例のゲームのままでは、プレイヤーが創意工夫をしなくなってしまいます。
このため、そのゲームでのゲームオーバー条件を、作者は早めに決めておきます。ゲームオーバーが用意されていないと、スリルが出ないのです<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.254</ref>。
あまり気が乗らないでしょうが、しかし、ゲームにはゲームオーバーや敗北の条件が必要ですし、プレイヤーには敗北を回避するように努力してもらわなければなりません。
;解法を1つに限らない
書籍『ゲームプランナー入門』(吉冨賢介 著)によると、たとえばスーパーマリオ1のステージ1-1の最初の敵のクリボーの対処でも、クリボーを踏んでやっつけるか、それともジャンプして飛び越えて次に進んでしまうか、マリオがブロックの上に乗ってクリボーが通り過ぎるのをやりすごすか、などなど幾つもの選択肢があると、例を挙げています<ref>吉冨賢介『ゲームプランナー入門』、P55</ref>。けっして、「たった一つの正解」ではないと述べています<ref>吉冨賢介『ゲームプランナー入門』、P55</ref>。
このように解法を複数用意することで、プレイヤーに創意工夫を呼び起こしやすくなります。
==== 他メディアとの違い ====
===== マンガ・アニメのバランス調整との違い =====
マンガやアニメのバランス調整というか、物語での敵の強さの見せ方と、ゲームでの敵の強さのありかたは、少し差異があります。
マンガ・アニメだと、たいてい強敵は、主人公がなんとか苦戦しながら倒せるギリギリの強さになっています。たしか1982年『鳥山明のヘタッピマンガ研究所』(1982年『鳥山明のヘタッピマンガ研究所』)の時点で、すでに、マンガやアニメや特撮(ウルトラマン)などの敵の強さは、そういうふうに設計されていることが説明されています。
しかしゲームでは普通、このようなギリギリの強敵にしてないほうが安全です。
マンガやアニメの強敵よりも、やや弱めにしておく必要があります。そうしないと、プレイヤーに創意工夫が生まれません。
具体例を考えるなら、分かりやすい例が、先ほど漫画家の鳥山明さんを例にあげましたが、その鳥山さんのドラゴンボールの原作マンガとゲーム版でのボス敵の強さの違いです。ゲーム版『激神フリーザ』だと、たとえばクリリンでもちょっと鍛えて頑張ればザーボン(ナメック星編の中ボス敵)を倒せるようになっています(原作マンガだとクリリンはザーボンを倒せない)。別に鳥山さんの作品だけでなく、ほかの多くの作家のマンガやアニメのゲーム版も、大体、同様に、原作マンガや原作アニメでは倒せなかったボス強敵がゲーム版では頑張れば倒せるようになっています。
理論的に考察するなら、マンガやアニメでは、一回の戦闘での強敵の倒しかたが一通りしかなく、いちばん読者に魅力的に見える奇想天外・破天荒な倒しかたで、敵を倒します。なのでマンガやアニメでは、ギリギリ倒せる強さのほうが良いのしょう。
しかしゲームの強敵では、多くのプレイヤーの、それぞれ異なる色々なアイデアに対応した倒し方を何通りも準備する必要があるので、ゲームでの強敵の強さは、ギリギリ倒せる状態よりも少し弱めにする必要があります。
==== 「廃人」 ====
ゲーム用語で「廃人」(はいじん)という表現があります。「廃人」とは、たとえば通信機能のあるネトゲRPGなどで、普通の社会人だとレベル上げが引きこもりプレイヤー追いつかずに(社会人が)クリアできないようなゲームにおいて、高レベルプレイヤーである引きこもりプレイヤーや無職プレイヤーなどを揶揄する意味です。
2010年以降の近年は課金ゲームなどにも「廃人」という言葉が使われます。一般の市販ゲームは高くても1万円程度ですが、それと比較して多額すぎる数十万円や数百万円の金額をゲームに課金するプレイヤーのことです。
書籍『ゲームプランとデザインの教科書』でも、この問題をサラっとですが、きちんと紹介しています。書籍中では「廃課金ユーザー」という表現を使っています<ref>『ゲームプランとデザインの教科書』、P66</ref>。書籍『ゲームデザインとぼくらの教科書』でも、廃課金ユーザーが社会問題化したことに触れられています<ref>『ゲームプランとデザインの教科書』、P66</ref>。
アニメーターだってゲームをする暇があるなら絵を描いていたからアニメーターとして通用しているわけです。アニメーターの就職前の第一趣味はゲーマーではないでしょう(イラスト制作やアニメ制作のはずです)。
=== ゲーム作家の体感の難易度はズレやすい ===
プログラミングというよりゲームデザインの話題かもしれないが、そのゲームの簡単さ・難しさといった難易のバランス調整も、コツがいろいろとある。
==== 具体的な方法 ====
結論から言うと、多くのゲームデザインの文献で、やや簡単めに調整されたバランスでゲームを作るのが安全であると主張されている。
たとえば書籍『ゲームプランナーの新しい教科書』(STUDIO SHIN 著、翔泳社)でも、作者がやや簡単だと思うくらいに作ると良くなる場合が多いという経験則が語られている<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版第2刷発行、54ページ</ref>。
また、書籍『ゲームプランナー集中講座』(吉沢秀雄、SBクリエイティブ)でも同様に、調整で迷って、プレイヤーにとっては易しいほうの案Aと難しいほうの案Bとがあったら、ゲーム本編には、やさしいほうの案Aを採用するのが良い、と主張しています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、235ページ</ref>。
難しいほうの案Bは、クリアに不要なサブ・ステージとか、そういうステージに流用すればいいのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P207および235ページ</ref>。
ちなみに、文献『ゲームプランナーの新しい教科書』によれば、RPGにおいて、クリアに不要なイベントのことを「任意イベント」と言います。一方、クリアに絶対な必要なイベントのことは「強制イベント」といいます<ref>STUDIO SHIN著『ゲームプランナーの新しい教科書』、P198</ref>。
つまり、サブ・ステージや任意イベントの難易度については、本編の強制イベントの難易度よりも少し難しくしても構わないのです。文献『ゲームプランナー集中講座』によれば、むしろ、多様なプレイヤーに対応するためにサブ・ステージや任意イベントの難易度の設計は、本編強制イベントとは難易度を変えるほうが望ましいというか、そういう設計テクニックとしてサブ・ステージや任意イベントが用意されているような側面もあるようです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P208</ref>。
書籍『ゲームプランナー入門』(吉冨賢介 著)でも、基本的に作り手は「簡単」だと思っていても、初めてプレイするプレイヤーには難しいという現象がよくあることを述べています<ref>吉冨賢介『ゲームプランナー入門』、P56</ref>。
==== 例外 ====
例外的なプレイヤーもいます。プレイヤーの中には、たとえばRPGなら、レベル上げそのものが好きな人もいます。
また、たとえばゲーマーでない一般人でも、たとえば電卓で「+1」を押しまくって計算結果をカウントアップしていく暇つぶしをしたことある人も多いでしょう。
ですが、レベル上げが好きなRPGゲーマーでも、彼らがプレイしたがるゲームの多くは、なぜか、レベル上げがそれほど好きでない種類のゲーマーも楽しめるゲームばかりです。
ドラクエ、ファイナルファンタジー、女神転生、テイルズ、・・・などなどのシリーズは、どれも商業の人気ゲームは、レベル上げがそれほど好きでなくても、ストーリーや戦術性などでも楽しめるようになっています。
本当にレベル上げだけが好きなら、ストーリー一切無しのレベル上げだけのゲームをプレイすれば充分ですし、フリーゲームなどでそれに近いゲームはあります。しかし、商業の世界では、そういうストーリー無し、あるいは戦術性が無しのゲームの話を聞きません。
これはどういうことでしょうか。
ゲームでなくマンガ業界の例で考えて見ましょう。
たとえば、少年ジャンプの読者には、メインの読者層は若い男の子ですが、
しかし実際には成人男性の読者もいますし、それどころか女性読者もいます。
しかし少年ジャンプは、あくまでも、メインの読者層が男の子であることを貫く編集姿勢であることが、
ジャンプ漫画の裏側を描いたマンガ『バクマン』では描かれています。
バクマンによると、たとえ少女の読者がいても、その少女は、
「男の子が読んでるマンガを自分も読んでみたい」と思うような女の子なので、
だからジャンプの取るべき編集姿勢としては、あくまで男の子向けを貫かないといけない、
といった内容が説かれています。
ゲームも同様でしょう。
==== 背景事情 ====
一般的にゲーム作家の側は、自作のゲームをプレイしたときの体感の難易度(なんいど)が、(他のプレイヤーよりも)自作ゲームを「やさしめ」に感じてしまいまちである。
つまり、本当は難しいゲームなのに、作家自身は「やさしい」と錯覚しやすい傾向がある。なお、この現象を俗に(ぞくに)「作者バイアス」と日本では言う。
;歴史
まず、1990年代のゲーム雑誌『ゲーム批評』にもある歴史的事実として、下記のような事例がすでに1990年代から知られています。
すでに1990年代の時点でゲーム評論雑誌『ゲーム批評』において、新人のゲームプランナーは企画提案の際に既存ゲームを難しくアレンジした提案をしがちだという報告がありました。
雑誌『ゲーム批評』によると、たしか、たとえばもし自社がスーパーマリオのようなゲームを作ろうとしている場合、新人はよく、「マリオのこの部分が簡単すぎるから、わが社はここを難しくしましょう」という提案をしがちだということです。
たとえば、スーパーファミコン版マリオ(スーパーマリオワールド)では、地上ステージでは多くのステージで、マリオに空を飛ばせれば、敵に遭遇せずにステージのゴールまで行けるように設計されています。
それを新人は「飛んでしまうと簡単なので、つまらない」と考えがちらしく、なので「空中に敵キャラを多く配置しましょう」という感じの案を提出しがちだということです。
たとえば
「空中に狼(オオカミ)を配置するのはどうでしょう? アメリカの昔のSFドラマに『超音速攻撃ヘリ エアーウルフ』という作品もありますので、パロディにもなって大人にもウケます」みたいな提案を出したりしがち、らしいです。(このほか、ゴルフゲームでウルフを空飛ばせる駄洒落(ゴルフでウルフ)アイデアなどの披露もあるとかゲーム批評では書かれていた気がするが(というか元々ゴルフゲームの提案で、上司役からのダメだしの根拠にマリオを例にする批評記事だったかもしれないが、本wiki本ページの文脈にあまり関係ないので、ゴルフの話は割愛させてもらう。)
ですが、マリオの地上ステージの空中に敵が少ないのは、ゲームが苦手なプレイヤーのための救済措置だったり、あるいは既に途中まで攻略したけどミスでステージ冒頭に戻されたあとの再チャレンジなどで興味ない体験済みステージ前半を無視するための工夫だったりするので、よって空中の安全性は必要な要素でしょう。
しかし、エアーウルフ的な提案では、そういう分析が抜け落ちています。
ともかく、このように、バランス調整では「予備知識が無いと、多くのゲーム製作者は、ゲームを難しく設計しがち」だというゲーム業界の経験則がもう1990年代からあります。私たちは、歴史にも学びましょう。
:※ ある編集者Aがなんとなく印象でゲームデザイン本などに「ゲーム作家はあまりネットの批評を参考にしない。ゲームを作った事のない人の批評なので、トンチンカンな批評も多いからだ」といったような情報があったような気がしたのですが、
:しかしあらためて書籍を確認してみると、少なくとも『ゲーム作りの発想法と企画書の作り方』や『ゲームプランとデザインの教科書』や『レベルデザイン指南書』では、そのような記述は確認されませんでした。
:下記のコラムは、その情報も背景にしています。
:どうやら、もしそういう記述の文献があっても、必ずしも商業ゲーム業界の多数意見とは限らないようです。
:あるいはその情報は、もしかしたら書籍による情報ではなく、ゲーム雑誌などのwebサイトの意見だったかもしれません(※ 読者に出典などをご存知の方がいたら、情報提供の編集をしていただけると、さいわいです)。よくゲーム雑誌の会社がwebサイトなどに商業ゲーム作家へのインタビュー文など掲載しています。
:一応、『ゲームデザイン プロフェッショナル』では、書籍後半のセクションの題名で大きく「一次情報以外、個性には役立たない」と銘打って、
:「インターネットやSNS」などについて、「そうした情報は知識として役に立つことはありますが、ゲームデザイナーが個性を発揮するうえではあまり役に立ちません」と説明している<ref>『ゲームデザイン プロフェショナル』、P314</ref>。
{{コラム|マリオメーカーのクリアチェック、ほか|
マリオついでに話すと、『マリオメーカー』という任天堂のつくった、マリオのゲームの素材を使って、
マリオメーカー購入者でも自分でマリオ風アクションゲームを作れるというゲームがあります。
このマリオメーカーというゲームでは、自作したゲームを任天堂のwebサイトに投稿・公開する際、クリアしてからでないと、投稿・保存できない仕組みになっています。
実は、マリオメーカーが発売される前、インターネット上には「改造マリオ」といって、マリオのROMを違法改造して、自作ステージをつくって無料公開などをする人たちがいました。
改造マリオはそもそも著作権侵害であり違法なのですが、その他にも問題点として、作成されたステージがやたらと難しすぎてクリア困難なステージばかりで溢れていた、という問題もありました。
しかしインターネット上では、そのようなクリア困難なゲームが、ネットのマニア達にはウケており、動画サイトなどではそのような超絶な高難度ステージが話題だったのです。
社会科学の格言で、「犬が人をかんでもニュースにならないが、人が犬をかむとニュースになる」という有名な格言があります。つまり、実際には統計的には少ない事例のほうがニュースとして話題になりやすいという、社会の法則があります。
また、アンケート調査などの心理学的ノウハウとして、「あなたは○○を買いますか?」と「あなたは○○を好きですか?」と聞いたときでは、
アンケート結果の傾向がかなり異なり、多くの人が、「○○を好きですか?」と質問されても決して実際に好きなものを答えるのではなく、
世間から賞賛されそうな趣味趣向の場合にだけ回答で「はい、好きです」と答えるようであるという、分析結果があります。
まさに改造マリオと本来の合法マリオの関係がそれです。
マリオメーカーでクリアチェックが必須なのは、せめて作者自身がクリアできるゲームをつくれ、常識的なプレイ時間で上達してクリアできるゲームをつくれ、というような任天堂の思いが伝わってきます。
おそらく任天堂の社内でも開発ゲームでは、各ステージのクリアチェックなどが行われているのでしょう。
}}
{{コラム|ネット民の感性は信用できるか?|
インターネット上には無料コンテンツがあふれておりますが、そのような無料コンテンツを楽しむ人たちのセンスは、一般の消費者のセンスとは異なりますし、もし仮に有料だとしても自分がカネを払うつもりもないものを平気で「面白い」と言える人たちも多く居ます。
それでも実際にプレイをした上での感想を言うならまだしも、しかしプレイヤーの人数よりも世界には無料動画の視聴だけをして感想を言うだけの人たちのほうが多いのです。
しかしそれすらも動画サイトでゲーム画面を長時間見ているので、まだしもマシなほうで、もっと酷いのになると、匿名掲示板で誰が言ったかも分からない批評や評論を真に受けて、あたかも実際にプレイしたかのように表面を装う人たちすらも多くいます。
マンガ業界も同じ問題に気づいてるようです。マンガ『ラーメン発見伝』(小学館ビッグコミックスペリオール )では、作中のライバル役のラーメン屋経営者(いわゆる「ラーメンハゲ」)が、ネットの情報をもとにラーメンの実際の食べたときの味を無視してラーメン評論をする自称ラーメンマニアに陰口で悪態をついています。これにリアリティを感じるマンガ出版社があるわけですから、つまりマンガ出版社の目からも、世間一般の人って多くがそういうネットの風評に左右される人達だよねと見られているわけです。
本wikiもネットの情報の一部なので、鵜呑みにしないでください。お金は掛かりますが、参考文献などとして記載されているゲーム関連に役立ちそうな書籍を、読者は実際に何冊か買って、書籍の実物を読むなどしてください。あるいは実際にゲーム制作やプログラミングをするなどして、確かめてください、
文献『ゲームデザイン プロフェッショナル』では、著者の塩川氏が言うには、口コミやレビュー、プレイ動画によって「知った気になる」ことを有害であると戒めています<ref>『ゲームデザイン プロフェッショナル』、P.282</ref>。
だからゲーム作品を調査するなら、実際にクリアするまでプレイするか、あるいは十分なプレイ時間を投じてプレイしてみなければ、ゲームデザイナーにはあまり役立たないと、塩川氏は忠告しています。
たとえ短時間のプレイでは楽しく感じても、長時間のプレイや繰り返しの演出をされた場合には楽しくないような場合もあるので、だから長時間のプレイをして確認してみる必要があるとのことです。(以上、『ゲームデザイン プロフェッショナル』を参考にした。著作権の事情のため、言い回しや文体は多少は変えてある。)
ただ、これは一見するとゲーム作家には、「偏見なく自作を最後までプレイをしてもらえそう」とか思えそうですが、しかしプロの作家は暇人ではないので、同人ゲームまで含めて何でもかんでもプレイすることはできません。
塩川氏は、著作の別のページでは。若者に進めるゲームプレイとして、とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いと言ってます<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
これは裏を返すと、もし人気作や商業的な成功作でなければ、そもそもプレイすらしてもらえない、ということを意味します。塩川氏本人はそう言ってなくても、現実世界の時間は有限であるので、作品1つあたりのプレイ時間を延ばすことはつまり、1多くのプレイしてもらえない作品が生まれます。
つまり、塩川氏のプレイスタイルは、前提として、あるゲームについてプレイを開始するまでの条件が、めちゃくちゃ厳しいわけです。
イラスト業界でも類似の指南の事例があり、「アニメ私塾」といわれる有名イラストレーターは、YouTube動画などでプロのアニメ作品の模写の練習を進めていますが、しかし、おおむね発言内容「アニメ線画の模写ですら時間が何十分も掛かるので、練習に入る前にまず、その構図やデザインなどが自分にとって模写をする価値があるものかどうかを判定して、もし価値あると判定できた場合だけを模写しろ」と、判定にけっこう頭を使いなさい、と指南しています。
しかも「アニメ私塾」氏は、1枚の模写をどの程度まで模写すればいいかという質問に対しては「(模写先の手本に)似るまで模写しろ」とまで言っています。まるで、その1枚の手本を、模写のゲームクリアをするまで模写し続けるわけです。
さて、色々とゲームファンの問題点をいくつか前の段落で言いましたが、それでもゲームはアニメや漫画と比べるとまだしもマシであり、なぜならゲームではプレイヤーと、プレイしてない人たちの区別がしやすいからです。
これがアニメや漫画になると、もはや違法サイトで違法配布されたマンガを読んでるだけの人なのか、
実際に購入してプレイした人なのかの区別が困難になります。
実際、中国や韓国などでは、違法の無料配布されてしまったマンガがネットに溢れてしまった時期があり、
そのような事情もあり金融業界などはマンガ産業への投資を渋り、代わりに課金をしやすいオンラインゲームに投資をしたという経緯があります。
}}
文献『ゲームプランとデザインの教科書』によると、アナログゲーム(カードゲームやボードゲームなど)の設計の例ですが、ネット上の意見ではなく実際の目の前のテストプレイヤーの意見であっても、気を使ったりして本音を言わないことも多いので、意見や感想よりも実際のプレイを観察して、「プレイヤーがルールを勘違いしてないか?」など色々と観察するのが良いといわれています<ref>『ゲームプランとデザインの教科書』、P338</ref>。
{{コラム|イナズマイレブンの人気投票呼びかけ事件|
イナズマイレブンという、男子小中学生くらいの子供をターゲットにした、サッカーのゲームおよびそのアニメ化作品があります。実際、ゲームなどでも平仮名を多用しているし、アニメなどでも振り仮名が多いですので、常識的に小学生くらいの子供がターゲットでしょう。
さて、このイナヅマイレブンの公式サイトが、ネット上での登場キャラクターの人気投票を行いました。
作品中で、「五条」(ごじょう)というマイナーな中学生キャラで、おっさんぽい顔のメガネで目が隠れて何を考えて分からない不気味な雰囲気の悪役っぽいキャラがいるのですが、ある有名な匿名掲示板のスレッドで、このキャラクターへの組織票の投票を呼びかけました。
その掲示板は、どう考えても子供が見ないような掲示板なのですが、しかし投票の結果、五条が一位になりました。
もし「ターゲット層の小学生の子供達が実は五条が一番好きだった」という理由ならそれでも構わないのですが、しかし投票の前後で「五条が子供に一番人気」という現象は特に観測されませんでした。「五条も子供に人気」という現象はあるかもしれません。ですが、「五条が子供に人気」という現象は結局は起きていないでしょう。
ネットの投票では、このような不合理な亊がたびたび起きます。
まず、年齢制限などをすることが不可能な場合が多いです。
また、本来なら「一人一票」などとしたくても、技術的な理由で不可能な場合もあります。
例えば、一人一票のために例えばツイッターなど外部サイトのアカウントを要求しようにも、しかし子供だとネット上のアカウント持つこと自体が不可能な場合もあります。たとえばツイッターの場合、年齢制限として13歳以下は利用不可能ですので、結果的に、小学生むけのアニメの人気投票をツイッターからの投票を呼びかけようとしても、技術的に不可能です。
アイドルグループのAKBなどでは、発売するCDに投票券などをつけることで、本当にカネを出して商品を購入したターゲット層だけが投票できるように工夫する場合もあります。ただし、AKB方式はこれで別の問題があり、一人の熱心なマニアが何票も投票したくて一人で何枚も同じ曲のCDを買うなどする、一般人とはかけ離れた購入行動をする事例があります。
また、アカウントなどを要求しない投票の場合、一日ごとに追加投票できてしまう場合があります。だから暇な人ほど、多くの投票をしてしまいます。
;「美人投票」
経済学で、「ケインズの美人投票」という理論があります。これは、金融における株の購入行動では、人々は自分が良いと思っている株を買うのではなく、世間が「この株は上がるだろう」と思っているだろうと予想した株を買うというものです。
ですが、この五条の投票の場合はもはや美人投票ですらありません。ネットのある集団が、自分たちのコミュニティをアピールするために、意図的に、子供からは美男子・美形・好印象だと思われないであろうと予想したキャラに投票しているわけです。まるで逆美人投票です。
;ノイジー・マイノリティ
世の中には、「口数は多い割には、人数は少ない」という集団があるのです。そのような集団を称して ノイジー・マイノリティ と言い、「うるさい少数派」という意味です。
しかし、うるさいだけの人に限って、企業などからは嫌われるので仕事がなかったりして、ネット上では口数が多いのです。
よく仕事や学生でも学校や家の軽作業などで、「口ばっかり動かしてないで、手を動かせ」などと年上から注意される事があると思いますが、まるでその逆の集団です。手を動かさない人は、口数でしかアピールできないのです。投票とは、そういう人にすら投票権を与えるという意味でもあります。
アニメやマンガなどの投票に関わらず、現実の政治の国会議員などへの投票でも、ある政治家へのネット掲示板などでの賛同は多いが、しかし実際に選挙をしてみると支持票がそれほど多くないという事例もよくあります。
また、暴力団などでは「総会屋」と言って、企業の株を少数でいいので購入し、株主総会での意見をよそおって、難癖をつけるぞとおどすことで、金品を要求するという手口も平成初期までは、よくありました(現在は規制されており、総会屋しづらくなっています)。一株など少数の株でも発言できてしまうので、こういう悪事が出来てしまったのです。
}}
文献『レベルデザイン徹底指南書』では、現実世界で自分が新しいスキルを1つ覚えたら、古いスキル1つはどれか封印する必要があることを説いています。たとえば会社で自らの希望によってグラフィッカーからプランナーに役職が変わったら、グラフィッカー時代のスキルは封印する必要があります<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。(参考文献では「デザイナー」と言ってますが、デザイナーは多義語でありイラストレーターの他にも開発リーダーなどの事を言う場合もあるので、本セクションでは「グラフィッカー」に言い換えた。)プランナーがグラフィッカーの仕事まで掛け持ちしたら、過労死してしまいます。
現実世界の仕事では時間が限られているので、そういうスキル封印が必要なのです。
{{コラム|一人で何でもできるか?|
「と学会」の人が2010年ごろにニコニコ生放送の番組に出演したときに言ってたのですが、どこかのマンガ出版社に対して、「と学会」のその人はマンガ原作者にネタ提供したことあるとの事です。
大衆は、漫画家を一人で何でもできる万能の人だと錯覚したいので、そういう大衆を喜ばせるために、アドバイザーが隠れて、漫画家の知らないネタでしかも読者にウケそうなネタのアイデアを提供をするのです。マンガ作品のクレジットには書かれませんが、そういうビジネスがあります。
もっとも、業界によってはアドバイザーがクレジットに記載される場合もあります。たとえばテレビドラマやアニメなどだと、「考証」や「監修」などで、関連するジャンルの専門家がアドバイスすることもあります。たとえばNHKの歴史大河ドラマなら、東大あたりの大学教授で歴史学教授といったプロの歴史学者が、監修についている場合もあります。
アニメではそこまで行かなくても、ミリタリー物のアニメなどで、実際に銃器を仕事であつかった経験のある人が監修をついていたり、軍事雑誌の記者などが監修についたりとか、そういうこともあります。
}}
{{コラム|可処分時間|
21世紀のビジネス用語で「可処分時間」という概念があります。
もともと「可処分所得」という経理などの用語があり、
「可処分所得」とは労働者が給料のうち、税金や社会保険料など支払いが義務付けられているものを差し引いた、
残りの(法的には)自由に使えるぶんの金額です。
実際には、水道光熱費といった公共料金など自由といえるかどうか分かりませんが、この議論では本質的ではないので深入りしないでおきます。
さて、可処分時間とは、可処分所得になぞらえて、可処分時間とは、おおむね、「1日のうちの自分の起きている時間のうち、労働時間などを差し引いた、残りの自由に使える時間」という意味です。
可処分所得に限りがあるように、可処分時間にも限りがあります。だから、商売の競争とは、消費者の可処分所得の奪い合いであると同時に、消費者の可処分時間の奪い合いでもあるのです。
1つの他人の作品に投じる可処分時間を増やしたら、当然ですが、他の作品への可処分時間の投入量が減ります。
こういう厳然たる事実があります。「可処分時間」という用語までクリエイターが覚える必要はないでしょうが、しかし消費者の時間に限りがあるという事実からは決して逃げることができないのです。しかもよく評論で「エンタメ界隈は、可処分時間の奪い合いの産業である」とも言われます。
クリエイターだって時間に限りがあります。たとえば、休日にもし自主制作の作品をつくっていたら、当然ですが、他人の作品を鑑賞する時間は減ります。
}}
=== クリア保証と戦術性のジレンマ ===
==== クリア保証 ====
ドラクエのレベル成長のシステムは画期的であり、どう画期的かを一言でいうと「クリア保証」である<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>。どういう事かというと、参考文献のリンク先の記事にも書いてあるが、ファミコン以前の1980年代のアーケードゲームではプレイヤーが上手い操作を学習しないとクリアできなかったが、しかしファミコン以降の家庭用RPGでは、プレイヤーの興味ないことは学習しないでも、代わりにレベル上げなどに多少の時間を掛ければゲームクリアできるようになったのである。
たとえば、プレイヤーが攻略法のわからないダンジョンでも、最悪の場合でも経験値かせぎに多少の時間を掛ければ、そのダンジョンのボスを倒せるなどして、かならず最後にはゲームクリアが出来る、というような事でもある。
その他の例では、たとえばゲーム終盤になってから未探検だった序盤の一部ダンジョンを冒険する際、プレイヤーには既にもっと難しいダンジョンを冒険してるのでその未探検ダンジョンから学習できることは少ないが、プレイヤーキャラのレベルが高いために未探検の序盤ダンジョンの敵はプレイヤーにはすでに弱くなっているので、その残っていた未探検ダンジョンにあまり苦労せずに時間を掛けなくてもダンジョンクリアできるように、難易度が上手い感じに自動調節<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>されるなど、RPGのレベルシステムおよび類似システムにはそういった側面もある。
要するに、
:* クリア保証、
:* 難易度の自動調整機能、
の2つが、ドラクエ的なレベルシステムの面白さの本質的・醍醐味であるとのことである。
リンク先の人の意見ではないが、このクリア保証のないデザインのRPGは(RPGでも古いゲームやフリーゲームなどで時々みかける)、表面的にはドラクエ的なインターフェースやステータス画面であっても、中身は似て非なるものであろう。
ファミコン時代の古いゲームなどのバランス調整の失敗(作者にとっては意図的かもしれないが)でよくある失敗として、レベルの上昇の上限を低いところに設定しすぎて、クリア困難になる事例があった(ドラクエ2がそれに近い)。なので、現代への教訓としては、そもそもレベル制限は十分にとるのが安全であろう。
RPGに限らず一般に、ゲームの後半に行くに従って、次ステージ攻略などのための事前準備の増加や、試行錯誤の時間の増加に時間のかかるようになっていく事が多い。そして、ステージクリアに必要な時間の増加が、ゲームを苦手とするプレイヤーに、そのゲームのクリアを諦めさせて挫折感を味あわせてしまう原因になる場合が、少なからずある<ref>[http://endohlab.org/paper/whydoplayersdrop.pdf 遠藤雅伸『ひとはなぜゲームを途中でやめるのか?-ゲームデザイン由来の理由-』6.まとめ] 2020年12月21日に閲覧して確認. </ref>。
=== 自由度 ===
文献『ゲームクリエイターの仕事』(翔泳社)によると、一本道のゲームではなく攻略ルートが複数あって自由度があるゲームの場合、それら複数のルートも考慮する必要があります。ゲームの自由度が多くなれば、その「場合の数」に応じて、調整の際に考慮する事項も増えます<ref>『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖!』、P78</ref>。
=== 勉強の方法論 ===
※ バランス調整に限った話題ではないが、他に適した単元が見つからないし、メインページに書くほどでもないので、間借り(まがり)的にバランス調整のページで書くことにする。
==== 共通言語 ====
ゲーム業界人たちは商売人なので、いろんなゲームをプレイするように推奨します。しかし現実には、それは費用的にも時間的にも不可能です。
商業ゲーム会社でゲームデザイナーになりたいのなら、人気作のゲーム知識は必要です。手本とするためという理由の他にも、スタッフなどに開発コンセプトなどを説明するためにも過去作のゲーム知識が必要になります」(いわゆる「共通言語」)<ref>『ゲームデザイン プロフェッショナル』、P278</ref>。
とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いといわれています<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
==== 前後比較 ====
ゲーム制作において、人気作や人気シリーズを、手本の中心にすえる必要があるが、しかし、けっして人気ゲームだけをマネしようとしてはいけない。名作が名作である意義を確認するためには、同時代の他社の作品や、それ以前の過去の作家の作品に、どういう欠点があったを把握する必要がある。そうした前後関係の比較により、理解が深まる<ref>[https://news.denfaminicogamer.jp/interview/200615a/3 吉田寛・松永伸司『“ゲームらしさ”をもっと深く語りたい!そんなあなたのためのゲームスタディーズ入門』、電ファミニコゲーマー、2020年6月15日 12:02 ] 2020年11月27日に閲覧して確認.</ref>。
なお、同様のノウハウはアニメ研究の業界でも1990年代から語られており、たとえばアニメ評論家の岡田斗司夫や氷川竜介などが、絶版になってしまったが岡田らの共著『国際おたく大学―1998年 最前線からの研究報告』などの書籍の中で例を述べており<!-- 手元にその本が無いので、もしかしたら別の著作かもしれないが、岡田らの共著のどれかではある。 -->、たとえばアニメのガンダム初代がリアリティゆえに名作であることを評論したいならば、それ以前の時代のロボットアニメが如何にリアリティが欠けていたかを実際にビデオなどで視聴するなりして確認しなければならないと岡田・氷川らは述べていた。
ともかく、ゲームでも、名作ばかりプレイしていてもダメであり、つまり知名度だけでプレイするゲームを選んでいては、他のクリエイターに利用されて養分になるだけであろう。
岡田斗司夫と「と学会」の著作した『 岡田の国際おたく大学―1998年 最前線からの研究報告』では、書籍中で、ゲーム作家を経験した演劇作家の鴻上尚史(こうがみ しょうじ)の失敗例を東大生が取材したレポートを紹介しているのですが、岡田がそのレポートを評して言うには、おおむね「成功例から学ぶたがる人は多いが、しかし成功例だけから学ぶのは素人。プロは失敗例にこそ学ぶ。」というような感じのことを言っています。
工学の世界では、『失敗学』という概念が畑村洋太郎によって提唱されており、2002年の畑村の論文<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>や、2000年には畑村の著作『失敗学のすすめ』が出版されています。
(wikipedia日本語版には「2005年」に出版とあるが、間違いである。2002年の論文で、2000年の畑村の著作が参考文献とされている<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>。)
実は、2000年よりも前に、ゲーム産業限定ですが岡田が「失敗にこそ学ぶべき」といった内容のことを提唱しています。なお、畑村の論文の末尾の参考文献欄には、『 1) 畑村 洋太郎 編 著:続・続 実際の設計― 失敗に学ぶ .日刊工業新聞社,1996.』とあります。
{{コラム|失敗とスポーツの例え話|
ビジネス書で昔からよく言われるのですが、新しいことへのチャレンジには失敗はつきものです。
でも、新しいことにチャレンジして経験を蓄えることが、今後の成功につながるのです。もし失敗をおそれて新しいことにチャレンジしなくなったら、もはや次の成功にはつながりません。
失敗しないけれど成功もしないで市場から淘汰されることになるよりも、失敗してもいいのでそれ以上の大成功をおさめて市場で行き続けることができればいいのです。
よくビジネス評論ではスポーツに喩えられるのですが、スポーツのサッカーや野球などの試合にたとえれば、3点を奪われても、こちらが5点を得て結果的に勝てればいいのです。
逆に、1点しか奪われなくても、こちらの得点が0点なら、試合には負けます。
だから、「試合での負け」に相当するような致命的な失敗さえ、回避できればいいのです
「たとえ失敗しても、試合に負けなければいい」のです。「失点しても、試合に負けなければいい」のです。
塩川氏も、失点しても試合に勝てれば良いという内容のことを書籍で発言しています<ref>『ゲームデザイン プロフェッショナル』、P.334</ref>。
さて塩川氏の著作では、失点でない単なる「ミス」を「不具合の発生」、「失点」をユーザーの不利益、「負け」を「売り上げの低下やユーザーの離脱」(長いので抜粋)などと定義しています。
塩川氏の意図は分かりませんが、少なくとも新しいことにチャレンジすれば、未知の失敗は起きますので、ITソフト業界なら、それによる不具合の発生が起きます。
その不具合の結果、ユーザーに不利益が一時的に生じることはあります。しかし、そういう一時的な不利益は、新分野の開拓では避けられません。
ユーザーで実験する前の、最低限の手元や仲間内での実験は必要でしょうが、しかし未然の実験で今後のすべてのミスを防止することは不可能です。
}}
=== 異業種の立場を想像しよう ===
ゲームにかぎらず、文芸でもイラスト趣味でも、、狭いコミュニティ内の内輪ウケばかりに特化していって衰退していっている文化は多い。そうならないように気をつけよう。
内輪受けのマニア化による初心者忌避による衰退をうまく表現できている言い回しとして、プロレス業界の格言ですが「マニアが業界を潰す」という格言があります。なお、この発言は2012年に新日本プロレスリングを買収したゲーム会社のブシロードが買収時に述べた発言「すべてのジャンルはマニアが潰す」が元になっているので、まさにゲーム業界の反省にもとづく考察でもあります<ref> [https://newspicks.com/news/4135958/body/ 『【最終話・木谷高明】すべてのジャンルはマニアが潰す』 2019/10/5 ] 2021年11月7日に確認</ref>。(ブシロードの文脈とは違うかもしれませんが(出展の外部リンク先が有料なので読んでいないので)、本wikiでもおそらく後述していますが、ゲーム業界では1990~2000年の一時期、ジャンルによってはゲームが高難易度化した作品が多くなって、そのため新規参入者が苦手と感じてプレイヤーが減って衰退縮小していったジャンルが幾つかありました。)
なので、ゲーム製作のこういった予備知識のないファンコミュニティの意見ばかりを鵜呑みにして聞いていると、初心者を遠ざけた高難易度ゲームと化してしまうおそれもあります。
特にゲームセンターにある対戦格闘ゲームでは、「初心者狩り」といって、初心者が筐体で練習したくても、熟練プレイヤーが参入して初心者を負かして初心者がゲームプレイヤーになるので、初心者は練習できない。・・・その結果、気がついたらそのゲームの新規参入層が減っていった・・・という事例がありました。
ゲームにかぎらず、スポーツなどの競技の人気でも、似たような現象が見られます。競技というジャンル自体が技巧などを競うものなので仕方ない面もありますが、なんとかして初心者を遠ざけない工夫はゲーム屋には必要でしょう。
ともかく、上述のような色々な理由で、作家側は、体感の難易度が、本当は難しめのゲームなのに「やさしめ」に感じがちである。
実際、日本のゲーム史でも、1990年代の前半ごろは、ゲームの難易度が「むずかしめ」に調整されがちであった。しかし、その結果、世間では「最近のゲームは難しい」と感じる人が増え、日本のゲーム人気は一時期、衰退し、アニメ産業などに人気を取られる事態になった。
{{コラム|作者は答えを知ってしまっている|
バランス調整とは少し違いますが、作者はネタバレを知ってるので、シナリオに感動できないわけです。
これは、ハドソン(ゲーム会社名)の『新桃太郎伝説』(スーファミ版)の攻略本『新桃太郎伝説 究極本』(KKベストセラーズ 刊)で、作者の さくま あきら が、読者インタビューに答える形でそう言っています。
ゲーム雑誌での読者からの「ゲーム中、もっとも印象に残ったシーンはどこですか?」という旨の質問に対し、さくま氏は「作者はシナリオの答えを知ってるので、もっとも印象に残るとかそういうのはありません」的な内容の返答をしています。
}}
;ティッシュテスター
さて、作者バイアスでバランスが分からなくなるのは作者だけではなく、テストプレイヤーやデバッガーも、そのゲームに慣れてゆくと、次第に感覚が一般プレイヤーとズレていき、テストプレイヤー達もゲームの適切なバランス側が分からなくなっていく。
このことを比喩した表現として、「ティッシュ テスター」(tissue tester)という用語がある。使い捨てティッシュが1枚あたり1度しか使えないように、そのゲームに予備知識の無いテスターも、一度しか使えないのである。「フレッシュミート」(新鮮な肉、fresh meat)とも言います。
かといって、テストプレイヤーの人数にも限りがあるので、ゲーム作者は、たとえ自作ゲームのバランス調整が不完全でも、最低限の調整をしたら、もう「えいやっ」と(フリーゲームや同人ゲームなら)ゲームのver1.00および以降バージョンを出さざるを得ない。
単にバグを探すだけのデバッグ用テストならティッシュテスターでなくても可能ですが、しかしバランス調整ではティッシュテスターがいたほうが効率的です。
=== 要素の相互関係 ===
==== 概要 ====
文献『ゲームデザイン プロフェッショナル』によると、調整は、関連あるものを、まとめて同時期に、ただし1個ずつ調整していきます<ref>『ゲームデザイン プロフェッショナル』、P.182</ref>。
このため、まだ関連ある要素を実装しきっていない段階では、調整しません。だから開発の最初から調整することは、まず無いでしょう。
しかし、場合によっては、要素の実装をそろうの待つと調整開始の時期が遅くなりすぎてしまい、計画に支障が出る場合があります。そういう場合、ある程度のまとまりのある実装ができた段階で、調整をするようです。
具体的な調整の判断基準については、参考文献『ゲームデザイン プロフェッショナル』を買ってお読みください。
もし読者が練習として、てっとり早くレベルデザイン・バランス調整の経験を積みたい場合、角川書店(現: KADOKAWA)の『RPGツクール』という制作ツールで実際にゲームを作ってみるのが良いでしょう。文献『レベルデザイン徹底指南書』(大久保磨 著)でも、RPGツクールによる練習・勉強を進めています<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。
==== マップと敵の相互関係 ====
ゲームバランスを決めるのは、敵の強さだけでなく、マップの構成、さらにRPGのダンジョンなら宝箱の中にあるアイテムや装備品の強さ、などなどのさまざまな要素が加わります。
宝箱もマップの構成要素ですから、広い意味では宝箱もマップだとすると、つまり敵そのもののの強さだけでなく、マップもバランス調整に大きく影響します。だから、もし仮に時間が無限にあるのなら、理想的には、ダンジョンなど各ステージののマップが実装されてからバランス調整を行うのが理想でしょう。
しかし、実際には、マップの実装は、なかなか時間の掛かることです。特に、マップを考えることは、そのステージの世界観などを考えることでもあるので、そういった理系的ではない文系的なことも考えなければなりません。
マップに敵を組み込む方式で調整する場合だとマップの実装を待っている間にはバランス調整が出来ないのも、なかなか難しい問題です。
だからマップと敵の調整の順序は、おそらく人や会社によって色々な方式があると思います。たとえば、
:マップを作ってからそのマップに敵を組み込んでみてプレイしてみて、敵の強さを決めるのか、
:それとも敵の強さを決めてから、マップを決めるのか、
:あるいはマップと敵を別々に決めてから、最後に組み合わせて微調整するのか、
などなどです。
ご自身の作品にあった方式をお選びください。
===== 始めよければ全てよし =====
さて、ゲームが長編になる場合、まずはプロトタイプ的に、序盤をやや多めに通しプレイをして、とりあえず序盤のバランスがゲームとして面白くなるように調整すると良いでしょう。
書籍『ゲームプランナー集中講座』でも、ゲームの初めと終わりの印象がよければ、途中のバランスが少しくらい悪くても楽しんでもらえると述べています<ref>『ゲームプランナー集中講座』、P236</ref>。
:※ なお、アニメ産業でも、実はテレビアニメは、第1話と最終話だけ、他のエピソードよりも予算が多めに作られるのが普通です(特に公言はされてないが、多くの作品で明らかにクオリティが違う場合が多い)。
とはいえ、ゲーム制作当初は、そもそも終盤のストーリーがまだ未完成だったりするので、意図せずとも、こういったプロトタイプ的に序盤をやや多めに調整する方法が自然に行われる事になるでしょう。
商業作品でも、たとえば攻略本やファンブックなどに書いてあるゲーム開発裏話などを見ると、RPGでは、(プレイヤーからは数値の見えない)敵の強さのほうを動かすことで、バランスを調整するという事例などもよく紹介されています。よくある話が、最終ボスなどの能力値です。原理的には、敵側の能力値ではなく、味方の能力値で調整したり、あるいは装備品で調整したりしてもイイはずですが、しかしよく開発裏話に出てくるのは、なぜか敵側の能力値の話題ばかりです。
たとえば、スーファミRPG『新 桃太郎伝説』では、最終ボスのパラメータのほうを調整していることが、KKベストセラーズ(出版社名)から出た攻略本『新桃太郎伝説究極本』に書かれています。(調整前はボスはもっとHPが多かった。)
:※ただし、あくまでRPG限定の話題。アクションゲームなどでは、違うかもしれない。
また、こういった調整順序の前提として、調整はゲーム序盤から順番に、ゲーム後半に向かって調整していくしかありません。
そのため、古いゲームなどでは、よくゲーム後半で、調整不足のために、極端に難しかったり、あるいは逆にあっけなく簡単すぎる後半だったりなどの話題も、よく聞きます。ドラクエ2の後半ダンジョンであるロンダルキア洞窟とその次ステージが典型です。
さて、プレイヤーに目立つ部分(たとえば味方キャラの能力値や装備品の性能など)を基準にして調整するといって、けっして全く数値をイジラないというワケではないのです。あくまで、(調整による変動幅の大きい敵能力値と比べたら、)「比較的には、味方キャラ関連の数値は、調整による数値の変動の幅が小さめ。敵の能力値は、調整による変動の幅が大きい。」という事にすぎません。
{{コラム|ノイマン「ゲーム理論」で説明できないのがテレビゲーム|
日本の人類学者の中沢新一は、ノイマンのゲーム理論で説明できないのが昨今のコンピュータゲームの特徴だと言っています。その発言の出典は忘れたのですが、人類学者で有名な中沢新一は近年、ゲーム産業に関心を持ち、たとえばナムコ出身の遠藤雅信などとも対談しています<ref>https://news.denfaminicogamer.jp/kikakuthetower/nakagawa-endo_bb/2 『ゼビウスからポケモンGOまで… 国内ゲーム史を遠藤雅伸氏と『現代ゲーム全史』著者が振り返る。中沢新一氏も壇上に登場!【イベントレポ】』 2017年4月12日 12:30 公開 ] 2022年1月18日に確認. </ref>。(なお、リンク先イベント記事の司会役の「中川」氏とゲストの「中沢」氏は別人なので、混同しないように)
ゲーム理論の用途としては、現代日本の学問では、政治的局面での外交戦略などを語る際によく政治学書で用いられたりします。ただし、そのゲーム理論でも、中沢新一によると、それでコンピュータゲームを語るのは不足だという事です。
中沢は特に言及していないですが、数学的にモデル化するなら、政策応用なら「国際情勢」など外交的な制約によって出力にとりうる値1個あたりの幅や個数が2~3個に限定されたりのような、値の個数が十分に小さくて有限の整数個の場合でないと、なかなかゲーム理論の応用は効果を発揮しません。
(20世紀の天才数学者 フォン・ノイマンの)『ゲーム理論』のような出力値に選べる個数が極端に少ない理論は、コンピュータゲームの調整では不足でしょう。本ページでも、ノイマンのゲーム理論については、版にもよりますが、このコラム以外では特に言及していないだろうと思います(2022年1月までの時点では、ノイマンのゲーム理論には言及していない)。
さて中沢の意見ではないですが、そもそもゲーム理論についてノイマンについての出典として、たしか数学者の森毅(もり つよし)のエッセイ本だったと思いますが、ゲーム理論はもともとノイマンが第二次大戦中の亡命中か何かにトランプのポーカーを参考に考えついたらしいです。
ネット上のゲーム評論では、経済由来の表現でよく使われる表現は、ゲーム理論ではなく「インフレ」「デフレ」などといった表現です。
経済学を知らなくてもゲームは製作できるでしょうが、どうしても経済学を参考にするなら、ゲーム理論よりも物価政策のほうを勉強したほうが良いかもしれません。
一応、書籍『ゲーム作りの発想法と企画書の作り方』ではゲーム理論も紹介されていますが、しかし具体的にどうゲーム作りにゲーム理論を応用するかは書かれていません<ref>『ゲーム作りの発想法と企画書の作り方』、P64</ref>。
}}
=== 各論(デザイン的なこと) ===
どの程度、レベル上昇でキャラクターを強くすればいいかについては、ハドソン社あたりでの有名な慣習があり、新しく訪れたダンジョンなどでは「レベルが3上がると、敵を1撃で倒せるようにすべし」という有名な基準があります<ref>『ゲームプランとデザインの教科書』、P.94、 ※ 著者のひとりの「平川らいあん」氏はハドソン出身</ref>。他社ゲームでは別かもしれませんが、だいたいスーファミ時代の桃太郎伝説シリーズはこんな感じに調整されているはずです。
== RPGのダメージ計算式 ==
=== 特化型が有利になりやすい ===
文献『ゲームプランとデザインの教科書』によると、ファミコン時代のゲームに限らず、21世紀の現代的なゲームでも、「なんでも平均的にできる」キャラクターよりも「○○だけなら自分が一番強い」といった感じの特化型のキャラクターが戦闘では強くなりやすい傾向があります<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.227</ref>。対して、バランス型は「器用貧乏」になりやすいのが現状です<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、、2018年11月1日 第1版 第1刷、P.227</ref>。
なお文献『ゲーム作りの発想法と企画書の作り方』によると、ダメージ計算式を考えるのは(プログラマーの仕事ではなく)ゲームデザイナーの仕事です<ref>『ゲーム作りの発想法と企画書の作り方』、P145</ref>。
では、特化型が有利になりやすい原理を、これから説明していきます。
たとえば、キャラクターに能力をプレイヤーが自由に選んで振り分け配分できるシステムのゲームがあったとしましょう。(商業ゲームでも、いくつかの作品で、似たようなシステムのRPGがあります。)
説明の単純化のため、合計値が必ず100だとしましょう。
つまり、たとえば下記のようになります。
;作成キャラの能力例
:(※ 合計100)
ちから: 10
たいりょく: 30
しゅびりょく: 10
すばやさ: 40
きようさ: 10
さて、別の作成キャラ例を考えます。
;平均型キャラA
ちから: 20
たいりょく:20
しゅびりょく: 20
すばやさ: 20
きようさ: 20
:(※ 合計100)
のように、能力値を平均にふりわけたキャラクターと
合計値は同じですが、特定のパラメータに特化して能力値を振り分けした
;特化型キャラB
ちから: 40
たいりょく:20
しゅびりょく: 30
すばやさ: 5
きようさ: 5
:(※ 合計100)
のようなキャラクターを、
コンピュータ上でRPGの戦闘システムのアルゴリズム上で対戦させた場合、
ほとんどの20世紀のRPGのアルゴリズムでは、特化型のキャラBのほうが勝ち、つまり特化型のほうが強くなってしまいます。
さらに言うと、たいてい「攻撃力」のような、敵にダメージを与える意味のパラメーターに振り割ったほうが、キャラクターが強くなるゲームのほうが多いです。(ファミコン時代から、ウィザードリィ1の攻略本でそういわれていました。敵モンスター『ワイバーン』あたりの攻略法として「攻撃は最大の防御」という格言を出しています。表紙の黒かった攻略本なので、たぶんゲームアーツの本。『ウィザードリィ攻略の手引き』(MIA BOOKS)かと思われます。)
なぜこうなるかと言うと、なぜなら、もし攻撃力が上がると、敵を倒すのに要するターン数も減少するので、結果的に敵を倒すまでに自キャラの受けるダメージ量も減るからです。(なお、現実の軍事学でも、似たような事が言われており、戦術論ですが、クラウゼヴィッツ(近代ドイツの軍事学者の一人)は防御重視の作戦よりも攻撃重視の作戦のほうが有利だと述べています。防御だけで攻撃しなければ、現実でもゲ-ムでも戦闘では絶対に勝てません。)
裏を返せば、平均型能力のキャラは、多くのゲームシステムでは弱くなりがちです。
パラメータの振り分けは自由ではないですが、ドラクエ2(ファミコン版)でいう、サマルトリア王子が弱くなる現象です。ファイナルファンタジー3・5の赤魔導師も、似たような弱点を抱えています。
理由はいろいろとありますが、バランス側の弱くなりやすい理由のひとつとして、参考文献などは特には無いですが、
:・ウィザードリィやドラクエなどの古いRPGのアルゴリズムが、特化型に有利になっているという歴史的な経緯。
:・命中率などの確率に関わるパラメータ(「器用さ」)のある場合、パラメータ割り振り前から既にある程度の底上げ補正がされている場合が多いので、わざわざ命中率を上げると割り損になる。
:・「すばやさ」(素早さ)が攻撃の順番にしか影響しない場合、素早さが低くても1ターンに1度は攻撃できるので、素早さを上げると損。
などの理由があるでしょうか。
命中率に関しては、多くのRPGで、攻撃が外れるのは、プレイヤーに不満感を与えるので、たいていのゲームでは、ゲーム序盤のレベル1のキャラであっても、数値上での「命中率」や「器用さ」などの表向きの命中率が低くても、たとえば「命中率 40」と表示されていても、実際のゲーム内部での命中率はたとえば+20%されてて本当の命中率が60%だったりするような場合もあります。
このような底上げ命中率のあるシステムだと、20%底上げされる場合、命中率を80%以上に育てるのは損です。なぜなら100%以上には上がりようが無いからです。
命中率が101%以上の場合に特殊な追加スキルなどを獲得できるなら別ですが(たとえば、クリティカルヒットの確率がけっこう増えるとか)、たいていの古いゲームでは、そこまでの手入れをしていません。おそらく調整に時間が掛かるからでしょう。
=== ダメージ計算式 ===
さて、RPGの戦闘におけるダメージの計算式(「ダメージ計算式」といいます)に、アルテリオス計算式というのがあります。これは、昔のゲーム『アルテリオス』で採用された計算式なのですが、
攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
という計算式です。
ドラクエやファイナルファンタジーのシリーズの計算式はもっと複雑なのですが、どのRPGでもダメージ計算式の基本的な設計思想・方針はアルテリオス計算式と同じです。
アルテリオス以外のダメージ計算式でも、たとえば
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
というような感じの計算式である作品も多いです。
せいぜい、変数の前に定数係数が掛かっている程度です。
なぜ、どの会社のRPGでも、この程度の中学校レベルの単純な計算式なのかというと、バランス調整が簡単だからです。
バランス調整するのは人間なので、もし、ダメージ計算式があまりに複雑な方程式であると(たとえば量子物理のシュレーディンガー方程式みたいなのだったりすると)、そもそもバランス調整担当の社員が理解できません。
そして、このアルテリオス式を見ると分かるのですが、
:攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
もし自軍の攻撃力が0の場合、敵にダメージを与えられないので(ダメージが0)、絶対に負けてしまいます。つまり、攻撃力が敵の守備力を下回る場合も、絶対に負けるのです。
一方、「すばやさ」パラメータが戦闘の先攻/後攻の順番にしか影響しない場合、素早さが0であっても、勝つことは可能です。
また、守備力が0であっても、勝つことは可能です。
このように、パラメータの種類ごとに、そのゲームにおいて重視・軽視の差があり、不公平になっている事が多いのです。
また、バランス型の能力値のキャラクターの場合、せっかく「ちから」を上げて攻撃力を上げても、守備側の守備力を下回っていると、ダメージ0になってしまい、絶対に負けます。
つまり、
自分の攻撃力 > 敵の守備力
でないと、アルテリオス式では必ず負けるのです。
一方、
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
のように係数を掛けた計算式の場合、
守備力を1ポイント増やしても、その効果は25%減少されます。(たとえばレベルアップの際に上昇パラメータを一種類選べるシステムの場合、守備力を選ぶと損になる場合が多い。)
いっぽう、攻撃力を1ポイント増やすと、効果は30%増しです。
このように、計算式によって、有利/不利なパラメータという格差が生じます。
=== DPS (Damage Per Second) の概念 ===
:※ 出典は無いが、あまりに有名な概念なので、さすがに消さない。
最近のRPGゲームには攻撃コマンド選択時に「二段斬り」などのスキル選択ができます。
スキルを設計するとき、昔の初心者のやりがちなミスとして、最近は減ってきましたが、スキルの結果の見かけの数値にゴマかされて、実はスキルが強くなってない特技を設計してしまうミスが時々ありました。
たとえば典型的なのは特技『ためる』です。これは、次回ターン時のダメージを数倍に倍増し、次回ターンの1回だけ、ダメージを倍増させる特技です。
この『ためる』は必ず、次回ターン時のダメージが2倍を超えないと(たとえば2.5倍にならないと)、無意味です。
なぜなら、『ためる』コマンドを選択したターンは、攻撃をしてないからです。
つまり、スキルを使わずに普通に2ターン通常攻撃した場合、ダメージ量は単純計算で
:1+1=2
より、2ターンぶんのダメージです。
いっぽう、『ためる』コマンドを使えば、それがもし2倍しかダメージが倍増しない場合、
:0+2=2
で、結果は同じ通常攻撃2発ぶんのダメージのままです。
計算すれば子供でも分かる理屈ですが、しかしファミコン時代には市販の商業ゲームですら、こういうミスがありました。たとえばファイナルファンタジー3の職業『空手家』のスキル『ためる』です。
このようなミスを犯さないために必要な概念としては、'''DPS''' ('''D'''amage '''P'''er '''S'''econd) の概念が便利でしょう。DPS とは1秒あたりのダメージ量、という意味です。
もともと欧米のアクションゲームについての理論研究に由来する用語なので、単位が 秒 (second)になっていますが、RPGに応用する場合には単位をターンに変えるなどして工夫しましょう。
このDPSの概念を使って、上述の『ためる』コマンドの設計ミスを説明すれば、つまり、1ターンあたりのダメージ量(DPS)が上昇していないのが問題点です。
では、私たちが改善策を考えましょう。数学的に考えれば中学レベルで充分で、
: 0 + x > 2
を満たす変数xを設計するだけの問題です。
なので、たとえば、『ためる』後の攻撃ダメージ量を「2.5倍」とか「3倍」とかの数値に設計すればいいのです。
では、次に応用問題を考えましょう。
「『ためる』を2回続けると、さらにダメージ量がアップ」などのシステムを導入するときも、必ずDPSが増えるようにしましょう。
たとえば、この場合、ダメージを与えるのに最低3ターンが必要なので、不等式を考えれば、
変数xについての
:0 + 0 + x > 3
を満たさないといけません。
つまり、『ためる』2回後のダメージ量は、最低でも「3.5倍」のように3を超える数値、あるいは整数に限定すれば、たとえば「4倍」とか「5倍」とかになっている必要があります。
== KPI ==
Key Performance Indicator という経営的な指標があり、『レベルデザイン徹底指南書』P140 および 『ゲームプランとデザインの教科書』P70 によると、共通しているのは後述の内容です。なお、『ゲームプランとデザインの教科書』P67 によると、オンラインゲームの運営などで使われる用語ですが、別にゲーム業界限定の用語ではありません。
;DAU(Daily Active User)
:デイリー・アクティブ・ユーザー
DAUとは、その日に遊んでくれたユーザーの人数です。
;MAU(Mathly Active User)
:マンスリー・アクティブ・ユーザー
MAUとは、その月に遊んでくれたユーザーの人数です。
;WAU(Weekly Active User)
:ウィークリー・アクティブ・ユーザー
WAUとは、その週に遊んでくれたユーザーの人数です。
;PU(Paying User)
:ペイング・ユーザー
課金ユーザーの人数のことです。その日を課金ユーザー人数をDPU、その月の課金ユーザー人数をMPUと言います<ref>『レベルデザイン徹底指南書』、P140</ref>。
;課金率
たとえば、ある月のユーザ数のうちの課金ユーザーの割合など、
一定期間中の課金ユーザーの割合を言ったりしますす<ref>『レベルデザイン徹底指南書』、P140</ref>。
あるいは、全ユーザーのうちの課金ユーザーのことだったりしますす<ref>『ゲームプランとデザインの教科書』、P70</ref>。(書籍によって、内容が微妙に違う)
;継続率
前月と比べて今月はどんだけユーザーが残っているかとか、あるいは前週と比べて今週はどんだけユーザーが残っているかのことを、
継続率といいます。
(以上)
このほかにも、色々な指標があります。
== 参考文献・脚注など ==
3vzaiv67dcxs6h2txdipdhjtd718u8n
206191
206190
2022-08-03T20:18:59Z
Honooo
14373
/* ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか? */最後のコラムの前まで修正。8/9。
wikitext
text/x-wiki
{{substub}}
現在の版の著者達は、ゲーム戦闘の調整の経験はないので、現状では本ページの内容は調べ物としては役立ちません。経験があり、かつ人間性も良好な人の協力をお待ちしています。
==本ページの目的==
本科目『ゲームプログラミング』は、科目名に「プログラミング」とあるとおり、ゲームクリエイターのための教材ではなくプログラマーのための教材です。
従って、話題がプログラミング的な技術的な話題に片寄っています。一般のゲームクリエイターを目指す人には、本書のバランス調整の記述は到底、役立ちません。
プログラマーが、とりあえず何か趣味でゲームを作る際、バランス調整についての調べ物の手間を少なくするためだけの目的の教科書です。
……と、前編集者Suj. は書いたんだけど、その割にはこの人物の私欲を満たすためだけの駄文が結構くどくど書かれてる気がするんだけど…
気のせいか?まあまだちゃんと読んでないしね、熱でもあるのカナ? コロナか^^?
==バランス調整==
ゲームには難易度というものがあるが、そのゲームの面白さのため、あるいは商品としての購買力アップのため、調整し、最適値を見出す必要があるだろう。敵の強さや主人公の強さ、それらを調整し、最適値を見出すための調査、テストプレイなどが必要だ。
より普遍的に、バグ修正、操作性の改善、仕様実装の更新、そして今書いたバランス調整、ゲームを面白く、評価を高めるための様々な改善を、一般にチューニングと呼んでいる。
英語では、難易度の調整のことを「レベルデザイン」と言う。このレベルとは、高低差の意味で、欧米での昔の3Dゲームにおける、マップの高低差を意図しているらしい。このレベルを調整するツールをレベルエディタというが、このマップの高低差の調整で難易度が変わるので、しだいにレベルデザインが難易度の調整の意味になっていったという<ref>川上大典ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日第1版第1刷、P.57</ref>。
難易度デザイン、という言葉も使われている<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.58</ref>。
そして、難易度の調整にはマップの処理もあるので、3Dゲームのレベルデザイン担当者は、MAYAなどの3Dグラフィックツールの技能を持っているスタッフが多いという<ref>吉冨賢介『ゲームプランナー入門』、P234</ref>。
===詰み、を避けたい===
製品として販売するゲーム、そしてそうでなくとも、プレイヤーがセーブした時点でクリア不能な状況、仕様になっている、つまり、プログラムの流れとして事実上そうなっている、これを「詰み」、と呼んでいますが、それは避ける必要がある。
これはプログラムの構造の問題ですが、ゲームは進行の仕様自体かなりの複雑さを持っていますから、制作者が気付かないうちにプレイヤーがそこに追い込まれる可能性があり、これは娯楽であるゲームとしては避けたい事態です<ref name="twogc78">蛭田健司『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖』、翔泳社、2016年4月14日初版第1刷発行、P78</ref>。
まず、ゲーム全体のバランスとして、平均的なプレイヤーなら、妥当な労力でクリアできる調整も必要でしょう。
ゲームプレイで詰みに追い込まれるのは、プログラムの構造の悪さでもありますが、それを見つけ出すためには、具体的にテストプレイにおいて、少なくとも誰か一人のテストプレイヤーが、そのゲーム内で想定できるクリア困難な状況から、実際に挽回してクリアしたという、事実、実績が必要です。
つまりコンピュータープログラムで常にセキュリティの問題が発生するのと同様に、ゲームプログラムでは構造が複雑になりすぎて、詰みがプログラマーの想定を超えて発生する可能性があるので、実際のプレイで、実際のプレイヤーの現実の巻き返しで確認して調整したい、という事ですね<ref name="twogc78" />。
そして一方難易度調整として、平均的プレイヤーが平均的な労力でクリアできるようにしておきたい。
ちなみに現編集者の昔のゲームプレイ経験ですが、初代ファミコン版のファイナルファンタジーですね、番号は幾つだったか……市販の攻略本を読みながらプレイしていたのですが、あるところまでいった時点で、攻略本を読んでも、どう考えても先に進めない状況に陥り、まあ私のプレイヤーとしての技量にも問題あったのかもしれませんが、結局にっちもさっちもいかなくなって、プレイを放棄してクリアしないまま積みゲーになってしまったことがあります。もちろんそれでそのゲームの仕様が悪かったと主張するつもりはありませんが、プレイヤーの私としてはその時点で完全に詰んでしまったわけです。
===実はゲームプレイヤーだけではなく、あらゆる人間が面倒くさい、俺も、あんたもね^^===
……しかしあんまり面倒くさがると、結局最後には偉い人に怒られてしまうのがこの社会の常です^^;;;。
一般にゲームプレイヤーがプレイ中に面倒くさがることは、覚えること、計算すること、配ること、だと言われています<ref>『ゲームプランとデザインの教科書』,P342</ref>。
ゲーム中に、Wolfram|Alpha が使えるような仕様にすると、案外よかったりしてね^^
===ゲーム制作者はいろいろ考えて作っているだろうけど、プレイヤーだってそれに負けずに考えてプレイしている===
プレーヤーも制作者も、時代の流れとともに、色々な変遷はありますよね。
時々指摘されるようですが、昔よりの最近の方が、ゲームの難しさに関する感受性が大きくて、割と簡単にこのゲームは難しいと指摘されることが多い、と、言われている。
たとえば携帯ゲームにおいて、平均的なゲームプレイヤーがクリアまでに5回ゲームオーバーになるように調整されたゲームは、今では「難しい」ゲームと判断される<ref>『ゲームプランナーの新しい教科書』、P210</ref>。つまり昔のプレイヤーの方が我慢強かったってこと??
一方平均的なプレイヤーならゲームオーバーにならない難易度のゲームは、やさしいゲームと呼ばれることが多い。
だからもはやゲームの難しい易しいという言葉さえ、相対的で、結構人によって判断が違う。
2011~2013年頃のテレビ番組で、ゲーム業界を取材した番組、夜中の番組で、こういうものがあったという。
「昔の子供は、難しいゲームをプレイしたとき、「このゲームは難しい」と答えていたが、今の子供は「このゲームはつまらない」 と答える」
しかし実はテレビというのはこの社会で一番いい加減なメディアで、常に制作者に都合のいい印象操作、不当なイメージ操作が行われている。
つまり昔の子供より今の子供の方が愚かだというイメージを作りたいだけで、インチキな企業のためのいんちきな広告としての意味以外何も持たないだろう。
===商業だろうとそうでなかろうとゲーム制作はプレイヤーの事を考える、難易度はどうする?===
『ナナのリテラシー』という漫画、作者はゲーム好きで、ゲーム雑誌でも描いていたことがあるようです。ビジネス系しかもノウハウ系かな?2巻がゲーム会社回。
ゲーム会社の隅の老人経営者曰く(この漫画内の話ですよ)、「誰もが飛び越せる絶妙な難易度の壁をクリアさせる」、これがゲーム作りのコツじゃ^^!!!
この漫画、前編集者が書くにはかなり、そこそこ取材されているという。
「PS」(プレステ)のロードは、「1回のロードで2WMが限界。どんなマップも2メガに入れなくちゃいけない。会話も音楽も全部ね。」なんて描写があるらしい。
この老人の主張は作品自体の主張でも作者の主張でもないというが、しかし前編集者は重要な事だと考えているようだ。
しかし誰もが飛び越せる絶妙な壁をクリアさせて、消費者に快楽を与えて、ガッポガッポも儲けるにしても、人間には個性があり、性格や性質にもばらつきがある。
全ての人に等しく、偉そうに試練を与えて、それを乗り越えたから気持ちいい、と自己満足に等しく浸らせることは難しい。
だから、インチキにガッポがっぽ儲けるためには(←しつこい^^;;;)、ターゲット層をある程度はしぼりこむ必要がある<ref>『ゲームプランとデザインの教科書』、P.97 </ref>。
「遊んだプレイヤー全員が満足するものを、目指さない」との記述がある書籍もある<ref>塩川洋介『ゲームデザイン プロフェッショナル』、技術評論社、2020年10月3日 第1刷発行、P.173</ref>。ただこれはテストプレイヤーの意見を重視しすぎて振り回されないように、という意図がある記述だという。
ターゲット層を絞りこむには、実在の人物をイメージするのが良いと言う。「20代社会人男性が」、ではなく、自分の知人・友人・家族、あの人を面白がらせたい!!、と、いうのがいいようだ<ref>『ゲームデザイン プロフェッショナル』、P205</ref>。
{{コラム|カラケオは気持ちよく歌いたい^^|
80年代~90年代にカラオケが流行した。と、いっても今でも、盛んだけどね。俺も好き^^
カラオケの難易度は、利用者が楽しめるように易しめに作られているようですね。というか前の項目で書いた、絶妙な難易度らしいよ。そこそこ難しく、それを乗り越えると俺は偉いと自己満足にふけれるらしい。岡田斗司夫が90年代後半にその指摘をしていたというが、しかし本当に前編集者は岡田斗司夫が好きなのね^^;;;。
小室哲哉の曲が典型的にそれだという人もいるらしい。そういえば、NHKアニメーション「だぁ!だぁ!だぁ!」のエンディングは凄く良かったな^^。いや、もちろんこれは只の雑談ですが^^;;;。
エヴァンゲリオンの残酷な天使のテーゼは、監督やスポンサーのレコード会社プロデューサーが、子供でも歌いやすいように作曲してくれと作曲家に依頼している。
確かに凝った楽曲の割に、カラオケで歌いやすい^^
}}
{{コラム|作者の意図通りに視聴者が受け取るとは限らない。作者の意図とは全く別に受け手は作品を楽しむ。それが嫌ならそもそも創作するなよ。|
商業作品であるなら、最終的には売上によって作品の是非が決まる、なんて前編集者は書いてるけど、インチキ書くなよ、あくまでも金は商売としての是非、作品としての価値、意義は別の話だよ。
しかしこいつほんとにアフリマンなのね。金と物質以外何も見えないのか。
ゲームの話題としては、味の善し悪しはプレイヤーが決める、という言葉があるようですね<ref>『ゲームデザイン プロフェッショナル』、P.167</ref>。ターゲット層が、美味い^^!!、と、いう作品を作りたい。
ジブリアニメの『となりのトトロ』は、子供たちにアニメばかり見ずに外で遊ぶように啓蒙するようなストーリーを作者・監督の宮崎駿は目指したと言われています。
ところでこれ↑前編集者の文章だけど、完全なる虚偽だよ、いいかがんにしろ。あのねー、宮崎さんという人は確かに少し偏屈な大人だから、その手の事は時々言うけど、映画を作る時は基本的に、見た人に楽しんでほしい、夢のような時間を過ごしてほしい、そしてこの社会に生まれてよかったと、子供も大人も思ってほしい、そういう思いで、常にそれが第一テーマで漫画映画を作ってるの。
すじ肉先輩さー、あんた俺や他の編集者を何度も知ったかぶりって書いたけど、結局あんたが人類史上、唯一最大の知ったかぶりだね。そもそもあんた、トトロ、観てないんじゃないの?
ほんとにあんたってなにも見えてないのね。「うちの子は、よく宮崎先生のアニメを見ています。面白いアニメを作ってくださり有難うございます」なんて感想は全く問題ないだろ。宮崎氏だってありがたく受け取ってるよ。それに対してアニメばかり観ずに外で遊べ!!なんて言うのはお前とお前の同類のキチガイだけだ。
あとガンダムやエヴァンゲリオンでも似たような逸話があるとのことだが、こっちはどうでもいい。そもそもこれを作っている連中は、宮崎氏ほど切迫した気持ちで作っているわけではなく、ただ金が欲しくて自分が偉いと思いたいだけだから、作った方がどう思おうが、そいつらに金を与えて養ってる連中がどう思おうが、大したことじゃあないだろ?
}}
===チュートリアル===
ゲームをプレイするための、操作方法をプレイヤーが知って覚えるための入門的なイベントをチュートリアルというようですね。実は現編集者はあまり、特に最近はほとんどコンピューターゲームはしないので、ここの執筆をしつつもゲームについてはあまり知らない。
ただここの主要執筆者で、ゲーム大好き、プログラム大好き、アニメ大好き、自分自身も一応絵描き、そしてハイルオタキングの E.Suj. かなりひどい内容の文章を大量に書き散らすので、このサイトの参加者として嫌々多少書き直しをせざるを得ない。
そこでチュートリアル、これはふつうゲーム自体に組み込まれ、初盤がそれになりますが、これは別モードにすると良いという指摘がある<ref>『ゲームプランとデザインの教科書』、P401</ref>。
『不思議のダンジョン2 風来のシレン』が、このスタイルを採用している。
とはいえプレイヤーが必ずチュートリアルをプレイしなければ、ゲームを楽しめない構成なら、あまり大きな意味があるとも思えないが、しかしそうでない場合も多いだろう。
ゲーム構成の選択手として考えてもいいだろう。
===技能の習得としてのゲーム===
====ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか?====
まあゲームをしていることで、プレイヤーは何らかの行為、練習を繰り返して、技能様の物を身につけていく、と、考えても、いい? まあいいか、とりあえずはそう見なしましょう。
ですからそこでプレイヤーが身に着ける技能を想定しておくと、上手にバランス調整が出来るという。
すじにく大先生が愛読している文献では、「教育的難易度」という用語を使っています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版第1刷発行、225ページ</ref>。まあゲーム関係者で教育について分かってる奴なんて、ほとんどいないだろうけど…
ここでの教育難易度とは、むしろ大先生の意図とは逆で、ある敵を攻略するのにプレイヤーがなんらかの操作が必要な時、まず1個だけのその敵の撃破用の操作技能だけをプレイヤーが修得できれば攻略できるようにしろと、つまり、プレイヤーが技能を覚えやすいように、難易度を下げろという事でしょう。
前編集者は本質的キチガイなので、とにかく世の中で自分が偉いことが何より大事なので「教育」という言葉を使いたい。一方で割と似たようなことを語る時に、学習という言葉を使っている文献もある<ref>『ゲームプランとデザインの教科書』、P.61 </ref>。要するにこの本の筆者の方が、E.Suj. よりまともな人間だという事でしょう。
ただ、プレイヤーの技能の習得という視点は、バランス調整の時に一番重要になるという。確かにゲームは技能や知恵、解決のための何らかの手段、鍛錬も必要だが、一方では間違いなく娯楽で、面白いものであるはずだ。
そしてゲームをすることで、自分の思考力が磨かれて、成長したという感慨を持つプレイヤーも多いようで<ref>https://www.teu.ac.jp/ap_page/koukai/2019_03_3endo.pdf 66ページ</ref>、全くその気持ちを否定する意図はないが、でもねー、ゲームっていうのは結局遊びなんだよ?
ゲーミフィケーションなんて言葉を使っていい気になっている連中もいるようだけど、まあその概念や運動がまったく意味を持たないとは言わないが、でもやっぱりゲームは娯楽であり遊びであり、ある程度堕落した、ある程度常識的な硬い世界からは非難される要素があるもので、あまり理屈を並べて自分たちの世界が高級なものだと主張しない方がいいんじゃあない?
{{コラム|ゲーミフィケーション|
どうもゲーム業界の連中が、自分たちの仕事を美化して、正当化したいため、ゲーミフィケーションがどうの、なんて言いだしたようだよ<ref>https://news.denfaminicogamer.jp/kikakuthetower/190731a</ref>。
2019年にゲーミフィケーション学会設立。もっともこの運動や概念がまったく意味がないものだとは、現編集者も言わない。確かにゲーム的な行為を、もう少し遊びから離れて、現実の有用な出来事に結び付けようというのは、それほど間違っていないし、意義はある。
2013年ごろからすでに、企業の新人研修で、ゲームの要素を取り入れた研修などがされていたようだ。
岸本好弘(ファミスタの父、と呼ばれているらしい)の言では、「ゲームの本質っていうのは、人間が頭で想像することの素晴らしさ」<ref>https://www.fantasy.co.jp/edutainment/article/interview16</ref>ってことらしいけど、なんか軽い言葉だね。想像には意義があるが、それってほんとに頭でするもの?
40年前(※1980頃?)、
:「そのころアーケードゲームのデザインで言われていたのは、初めてそのゲームに挑戦したプレイヤーでも3分間程度は遊べるようにすること。「もう一度チャレンジしたら、先に進めそうだ!」と、プレイヤーの気持ちが動くように制作すること」
ってことだけど、そうすれば子供が100円玉いっぱい入れて、お前らが儲かるってだけだろ?
:「これって、現在IT業界で言われるUX、ユーザーエクスペリエンスですよね。ゲーム業界では理論化、言語化していなかったけれど、40年前から現代に通じることをやっていたんだなと思いました。」
何かそれらしい言葉だけ踊ってかっこつけてるようにしか聞こえん^^;;;。
:「ゲームって全部「そそのかし」なんです。ゲームをプレイしていて、Aの洞窟に行きなさいとか、Bの洞窟には行くなとは言われないですよね。プレイヤーが2つの洞窟をぱっと見たときに「こっちの洞窟に宝があるかも!」って見えるように作っているんです。これを「そそのかし」って言うんです。」
まあそれはそれでいいけど、それってそんなに大したことかね?
: (抜粋)「先生は答えを教えるのではなく、生徒が自分で「わかった!」、「僕が一人で気が付いた!」と思わせることが大切。」
思わせるっていうのがすごいし、傲慢だよな。お前は神か?
: 「ゲームをデザインするのも授業をデザインするのも同じです。楽しいと思うことやワクワクすることは脳の働きを最大限にする。だから、つらいことを我慢するのはよくない。脳が楽しいと感じることがとても大切なんです。」
お前みたいな奴って、すぐ脳がどうのって言うよな。まあ楽しいことやワクワクするのが大事なのは認めるが、人生つらいことを我慢しなければいけない時なんてしょっちゅうだよ。後ゲームと授業は別物にしろ、一緒にするな。
しかし思うんだけど、ゲーム業界の奴らって、自分たちの仕事に少しやましさがあるから、教育と結び付けて、高級なものに仕立て上げたいんじゃあないの?
まあゲーム的な教育っていうのはありだが、やはりゲームの本質は遊びで娯楽で、しかも堕落だよ。
}}
{{コラム|すじ肉しちゅ~は今日も右手を上げて、「ハイル、オタキング!!!」と言った。|
1990年代後半に、オタキング岡田斗司夫は、著書『世紀の大怪獣!!オカダ―岡田斗司夫のお蔵出し 』(おそらく)で、マリオカートを例に、市販のゲームソフトの多くは達成感を味合わせるものだと指摘した。
岡田に言わせれば、ゲーム文化以前の人生の趣味の多くは、必ずしも努力の量と、上達とが比例しない。スポーツ、絵画、しかしこれほんと?もちろん厳密に量を考えて、グダグダ気色悪い比較をすれば、そう見えることはあるけど、少なくとも人間、何かをすれば必ず、それなりに得るものがあるはずなんだけどね。
しかしファミコン以降のコンピュータ式のゲームでは努力は無駄にならず、ほぼ必ずといっていいくらい、少なくとも初心者レベルの範囲でなら、プレイして練習すれば上達するように設計されていると、岡田の著書では述べられている。
ふーん、要するにゲームプレイヤーって、ゲーム制作者が作った達成感が欲しいから、金払うってわけね。
岡田が言うには、人生はゲームみたいに甘くないし、もしかしたらゲームは現実逃避で不健全かもしれないけど、でも大人だって親だって達成感をもっと感じたいんだぜ・・・だから今日も娘といっしょにマリオカートをプレイしている、と書いてたって言うけど、そもそも現実逃避や不健全から達成感って手に入る?
なんか頭のおかしい奴はやたら達成感って言うんだけど、それってほんとに欲しい?
いや、もちろんある程度は欲しいけど、でもそんな重要な事かね? もっと人生で必要なもの、いっぱいないかね?
}}
{{コラム|ガイナックスとはオタキング岡田斗司夫が創業した、アニメーションとコンピューターゲームの制作会社である。|
ガイナックスは、コンピューターゲームも作っていたね。確か、美少女18禁ソフトもあったよね。
1991年、『プリンセスメーカー』、育成シミュレーションゲーム。確かに赤井孝美さんのグラフィックは魅力的だった。
少女を光源氏的に育成するゲームだったか、キャラクター育成ゲームのはしりだね<ref>STUDIO SHIN『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版 第2刷 発行、P182</ref>。
98年にはコナミ社『ときめきメモリアル』というのが出た。ただこれは育成というよりは、美少女との恋愛疑似体験ゲームみたいな、まあ俺はやったことないから詳細は知らないけど、まあ美少女と上手に付き合えるように、男性キャラクターを育成する要素はあったのかね。
「プリンセスメーカー」→「同級生」→「ときメモ」の流れがあるって、ある評論家は言う。
良くわからないけど、岡田斗司夫はゲーム制作会社の社長でもあるんだから、前のコラムの達成感がどうののたわごとに意義を認めろって、すじ肉は書くんだけど、なんなのこいつ。
岡田斗司夫の肩書に関する議論って意味ある?
別にアニメ評論家でも、会社社長でも、なんでも勝手に名乗って威張っていればいいけど、でもやっぱり岡田斗司夫の肩書は、オタキングだよね。
}}
{{コラム|プリンセスメーカーdeathpenalty|
少女育成ゲーム・プリンセスメーカーは全滅時の損失が軽いのが、割と画期的だったようです。戦闘で全滅すると、拠点に戻されたうえ、1か月経過する。
全滅時の損失のことを和製英語でデス ペナルティといいます。英語では dead damage と云うらしい(DDと略すようです)。英語の death penalty は「死刑」の意味だって。
つまりどうやら、デスペナルティが軽くても、面白いはRPG は作れるらしい。
;デスルーラ
全滅しても拠点に戻るだけのシステムだと、拠点に戻りたい場合にわざと全滅する方法を使える。これを和製英語で「デスルーラ」と言う。ルーラとはドラクエの移動魔法ルーラのこと。
全滅したときに拠点に戻るゲームでは、拠点に戻れなくするイベントは不可能。
全滅したら拠点に戻れるからね。ただ、戦いが起こらなければどうかな?
どちらにしろこの議論、意味ある?
ただ例外的に全滅したとき拠点以外に戻る、っていう事は仕様で作れるよね。
}}
{{コラム|Roblox,Among_Us|
現編集者は現在は基本的に、コンピューターゲームはしない生活、でもほんのちょっと前、思うところあって、MicrosoftStore,Xbox 経由で、すこしゲームをしていた時期があった。
そしてMicrosoftStore はなんだかんだでゲームを売り込んでくるよね。
その時思ったんだけど、Roblox って面白そうだよねー。プレイはしていないんだけど、広告や表示を見ると、これ絶対面白いなって直感的に思う。
だからこのゲームのユーザーやプレイヤー、あるいは関係者にこのページの執筆してほしいな^^
後、Among_Us っていうのも面白そう。何か皮肉がすごく効いてそうだね。
}}
{{コラム|デスペナルティ関連|
このコラム、前編集者が、(この話題は、後述の商学書『メイド・イン・ジャパンは負けるのか』の話題と関連するので、残す必要がある。)ってメモを張っていたんだけど、読んでみたんだけど、現編集者Hにはちょっと話が見えなくてね。おそらくRPG をやりこんでいる人は内容が良くわかるんだろうけど、現編集者にとってはかなりの部分が???????だね。だからできるだけまとめる一方で、詳細不明の部分は前編集者の記述をそのまま残しました。
;帰り道を通せんぼするイベントは、詰みのリスクが高くなる。
サガシリーズはどこでもセーブできるが、この場合、帰り道を通せんぼするイベントは、上手に設計しないとクリア不能になる恐れがある。
ファミコン~スーファミ時代のドラクエとファイナルファンタジー、GB版サガとロマサガには帰り道を通せんぼするイベントは無いように見える。
ロマサガ1の氷結城の帰り道で通せんぼするボス敵がいる。しかし会話選択肢で戦闘を回避すると、詰みを避けられる。
古い時代のサガ系とロマサガでは、ダンジョン奥まで探検すると、最深部に一方通行のダンジョン出口がある。これは帰り道短縮の意味と、テンポ感向上(プレイヤーが既に理解していることを再度要求しないから)の効果がある。
しかしこの場合、もしダンジョンに一方通行出口がない場合、プレイヤーは帰り道にボス戦があると予測する。これはネタバレになってよくない。ドラクエは、最後の一方通行出口をあまり用意しないが、この狙いがあるのだろう。
このようにゲームのルール設定が、可能なイベントやマップを限定する。
}}
さて、ゲームのシリーズ物は、ルールが一様になる傾向がある。
だから、シリーズ作品によって搭載されるイベントの傾向も決まってくる。
イベントの傾向が限定されると、マンネリ化につながる恐れもある。
『メイド・イン・ジャパンは負けるのか』という2010年ごろの書籍でも、
シリーズ化とマンネリ化との相互関係が語られていて、基本的に家庭用ゲーム機の作品群の多くはゲーム性の根幹が90年代以降の作品は変わっておらず、変わったのはグラフィックが細かくなっただけ、と書かれている。
しかしゲーム会社からすれば、新規の斬新な発想のゲームはむしろ売れないと見られている。
グラフィック重視は、商業ゲームでは非常に重要と考えられているらしい。
そしてゲーム評論家は偉そうな批判はするが、自分では結局ゲームを作らない。
1980年代は、家庭用ゲーム黎明期。1995年ごろ、プレステ1時代からソフト容量が飛躍的に伸びた。
昔はゲームに勢いがあったが、今となっては、新しくて画期的かつリアリティと説得力のあるルールを思いつくこと自体、そんな簡単な事ではない。
漫画産業やアニメーション産業は黎明期をとっくに過ぎたようだが、結局今でもこの産業は続いている。そもそも、ラジオ、新聞、書籍、オールドメディアと呼んでいい産業も、今、しっかり続いている。2010年代のゲーム産業だって、もしかしたらスマホゲーム黎明期、ソーシャルゲーム黎明期なのかもしれない。
{{コラム|岡田斗司夫のアノマリー理論|
古典的な理論を言うと、アニメ評論家の岡田斗司夫が「アノマリー」(「片寄り」という意味の用語)で言ってる例ですが(『東大オタク学講座』にある理論)、ゲームのバランス調整にはそもそも、岡田の理屈によると普遍性はなく、どうしても作者の世界観が反映されます。
たとえば、『シムシティ』というアメリカ人の作った都市運営シミュレーションのゲームでは、原発が効果的な投資であるのですが、そして火力発電所よりも原子力発電所が効果的なのですが、岡田はこれを作者のアメリカ的な都市政策観の反映だとしています。
そのほか、岡田は、ドラクエシリーズに対して、「なぜ作者の堀井さんは、作中で父親と子の関係に、どの作品でも、こだわりたがるんだろう? なにかあったんじゃねえの?」的なゲスい勘繰りもしています。
作家の「個性」というのは、一般人から見れば「異常性」でもあるわけです(ただし、法律を守る程度の最低限の一般性は作家だろうが必要ですが)。個性というのは長所ではなく、欠点の裏返しでもあるわけであり、その欠点すら大人はうまく自分で活用しなければならないのでしょう。
}}
==== 本文 ====
もちろん作品によっては例外もあるでしょうが、しかし上述で紹介したような様々な視点の異なる複数のゲームクリエイターなどゲーム業界人が、「教育」や「成長」などあたかも学習的な用語を使っている事は、念頭に置くと良いかと思います。
ゲームにおける教育的な要素はもちろん擬似的なものです(ゲームに限らず一般のアニメや漫画も同様です。もし本格的に世間一般で通用する意味での「学習」をしたいなら高校~大学レベルの国語・数学・英語・理科・社会科などの参考書などを読もう)。
さて調整の話題に戻ります。
たとえば、アクションゲームの調整なら、
もし敵が飛び道具を使ってくるなら、まずプレイヤーは物陰に隠れて移動して近づくとか、あるいはプレイヤーも飛び道具で応戦するとか、そういうプレイ技法が必要でしょう。
文献『ゲームプランナー集中講座』(吉沢秀雄 著)でも、飛び道具を使ってくる敵には、ゲーム序盤では、まず物陰にかくれて敵の攻撃を避けるなどのプレイ技法をプレイヤーに習得できればよいというくらいまで、(序盤の)難易度を簡単にすべきだと、その文献『ゲームプランナー集中講座』では主張されています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、226ページ</ref>。
まず、序盤の飛び道具つかいの敵なら、プレイヤーが上述のような物陰に隠れる技法を実践できていたら、その敵を簡単に倒せるように難易度を調整します。
このため、序盤ではけっして、敵の攻撃をさけるための物陰の部分には、ゲーム作者はワナなどを仕掛けないでおき、物影には敵も配置しないようにするくらいで、良いのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、226ページ</ref>。
たとえば、飛び道具を使ってくる敵は、そいつに攻撃を当てるまでは難しいが、しかし敵の防御力を低くしておいて、もし敵が(プレイヤーからの)攻撃を受けたら、敵はすぐに倒されてしまう・・・のような強さの敵としてパラメータ調整しておくのが良いでしょう。
つまり、プレイヤーに教えたいスキルとして、そのアクションゲームを通して、飛び道具を使ってくる敵の対処法を教えるのです。
ゲーム後半で難易度を上げる場合は、けっして敵を単にやたらと頑丈にするのではなくて、
敵の強さはそこそこでいいので、
たとえば
ステージのギミックや敵の行動などを今までの敵と複合化させたりする等の設計により、過去にプレイヤーの習得したプレイ技法の組み合わせの練習・習得をプレイヤーに要求したりとかして、プレイヤーに今まで習得した単一のプレイ技法の複合の習得を要求するようにすると、プレイヤーも成長できますし、あきづらくなるし、いいことづくめです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、228ページ</ref>。
(ただし、あまりにも膨大なプレイ技法どうしを組み合わせるような過大な技法をプレイヤーに要求しないように、(作者がプレイヤーに)要求する技法の数にも限度は必要でしょう。)
なお、余談だが、「難易度」の「高い」「低い」の意味は、
:「むずかしい」=「難易度が高い」
:「やさしい」=「難易度が低い」
である。
ゲームを難しくする目的は、プレイヤーに創意工夫を呼び起こすためです。創意工夫を呼び起こさない難しさは不要かもしれません。
書籍『ゲームプランナー入門』によれば、ボス戦などの難しいエリアの目的は、プレイヤーが自らのプレイスキルの程度を試したり、あるいはRPGなどならキャラクターユニットの成長を試すためのものです<ref>吉冨賢介『ゲームプランナー入門』、P60</ref>。また、「歯ごたえ」などの表現の意味も、こういった意味であると書籍では述べています。
;制限の必要性
制限の必要性とは、たとえば、ゲーム中での主人公が丈夫で死にづらいのは構いませんが、しかしどんなに敵の攻撃を食らっても死なずに倒れずに不死身なのは駄目です。
また、主人公の所持金が多いのは構いませんが、しかし所持金が無限大なのは駄目なのです。
また、敵の動きが少し単純なのは構いませんが、しかし、プレイヤーが油断しすぎているのにプレイヤーが負けないのは駄目です(たとえばアクションゲームで一時停止ボタン(ポーズボタン)を押さずにトイレに行ってウンコを数分してきても、ウンコから戻ってきてもキャラが負けてないのは明らかに駄目)。
このような駄目な例のゲームのままでは、プレイヤーが創意工夫をしなくなってしまいます。
このため、そのゲームでのゲームオーバー条件を、作者は早めに決めておきます。ゲームオーバーが用意されていないと、スリルが出ないのです<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.254</ref>。
あまり気が乗らないでしょうが、しかし、ゲームにはゲームオーバーや敗北の条件が必要ですし、プレイヤーには敗北を回避するように努力してもらわなければなりません。
;解法を1つに限らない
書籍『ゲームプランナー入門』(吉冨賢介 著)によると、たとえばスーパーマリオ1のステージ1-1の最初の敵のクリボーの対処でも、クリボーを踏んでやっつけるか、それともジャンプして飛び越えて次に進んでしまうか、マリオがブロックの上に乗ってクリボーが通り過ぎるのをやりすごすか、などなど幾つもの選択肢があると、例を挙げています<ref>吉冨賢介『ゲームプランナー入門』、P55</ref>。けっして、「たった一つの正解」ではないと述べています<ref>吉冨賢介『ゲームプランナー入門』、P55</ref>。
このように解法を複数用意することで、プレイヤーに創意工夫を呼び起こしやすくなります。
==== 他メディアとの違い ====
===== マンガ・アニメのバランス調整との違い =====
マンガやアニメのバランス調整というか、物語での敵の強さの見せ方と、ゲームでの敵の強さのありかたは、少し差異があります。
マンガ・アニメだと、たいてい強敵は、主人公がなんとか苦戦しながら倒せるギリギリの強さになっています。たしか1982年『鳥山明のヘタッピマンガ研究所』(1982年『鳥山明のヘタッピマンガ研究所』)の時点で、すでに、マンガやアニメや特撮(ウルトラマン)などの敵の強さは、そういうふうに設計されていることが説明されています。
しかしゲームでは普通、このようなギリギリの強敵にしてないほうが安全です。
マンガやアニメの強敵よりも、やや弱めにしておく必要があります。そうしないと、プレイヤーに創意工夫が生まれません。
具体例を考えるなら、分かりやすい例が、先ほど漫画家の鳥山明さんを例にあげましたが、その鳥山さんのドラゴンボールの原作マンガとゲーム版でのボス敵の強さの違いです。ゲーム版『激神フリーザ』だと、たとえばクリリンでもちょっと鍛えて頑張ればザーボン(ナメック星編の中ボス敵)を倒せるようになっています(原作マンガだとクリリンはザーボンを倒せない)。別に鳥山さんの作品だけでなく、ほかの多くの作家のマンガやアニメのゲーム版も、大体、同様に、原作マンガや原作アニメでは倒せなかったボス強敵がゲーム版では頑張れば倒せるようになっています。
理論的に考察するなら、マンガやアニメでは、一回の戦闘での強敵の倒しかたが一通りしかなく、いちばん読者に魅力的に見える奇想天外・破天荒な倒しかたで、敵を倒します。なのでマンガやアニメでは、ギリギリ倒せる強さのほうが良いのしょう。
しかしゲームの強敵では、多くのプレイヤーの、それぞれ異なる色々なアイデアに対応した倒し方を何通りも準備する必要があるので、ゲームでの強敵の強さは、ギリギリ倒せる状態よりも少し弱めにする必要があります。
==== 「廃人」 ====
ゲーム用語で「廃人」(はいじん)という表現があります。「廃人」とは、たとえば通信機能のあるネトゲRPGなどで、普通の社会人だとレベル上げが引きこもりプレイヤー追いつかずに(社会人が)クリアできないようなゲームにおいて、高レベルプレイヤーである引きこもりプレイヤーや無職プレイヤーなどを揶揄する意味です。
2010年以降の近年は課金ゲームなどにも「廃人」という言葉が使われます。一般の市販ゲームは高くても1万円程度ですが、それと比較して多額すぎる数十万円や数百万円の金額をゲームに課金するプレイヤーのことです。
書籍『ゲームプランとデザインの教科書』でも、この問題をサラっとですが、きちんと紹介しています。書籍中では「廃課金ユーザー」という表現を使っています<ref>『ゲームプランとデザインの教科書』、P66</ref>。書籍『ゲームデザインとぼくらの教科書』でも、廃課金ユーザーが社会問題化したことに触れられています<ref>『ゲームプランとデザインの教科書』、P66</ref>。
アニメーターだってゲームをする暇があるなら絵を描いていたからアニメーターとして通用しているわけです。アニメーターの就職前の第一趣味はゲーマーではないでしょう(イラスト制作やアニメ制作のはずです)。
=== ゲーム作家の体感の難易度はズレやすい ===
プログラミングというよりゲームデザインの話題かもしれないが、そのゲームの簡単さ・難しさといった難易のバランス調整も、コツがいろいろとある。
==== 具体的な方法 ====
結論から言うと、多くのゲームデザインの文献で、やや簡単めに調整されたバランスでゲームを作るのが安全であると主張されている。
たとえば書籍『ゲームプランナーの新しい教科書』(STUDIO SHIN 著、翔泳社)でも、作者がやや簡単だと思うくらいに作ると良くなる場合が多いという経験則が語られている<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版第2刷発行、54ページ</ref>。
また、書籍『ゲームプランナー集中講座』(吉沢秀雄、SBクリエイティブ)でも同様に、調整で迷って、プレイヤーにとっては易しいほうの案Aと難しいほうの案Bとがあったら、ゲーム本編には、やさしいほうの案Aを採用するのが良い、と主張しています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、235ページ</ref>。
難しいほうの案Bは、クリアに不要なサブ・ステージとか、そういうステージに流用すればいいのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P207および235ページ</ref>。
ちなみに、文献『ゲームプランナーの新しい教科書』によれば、RPGにおいて、クリアに不要なイベントのことを「任意イベント」と言います。一方、クリアに絶対な必要なイベントのことは「強制イベント」といいます<ref>STUDIO SHIN著『ゲームプランナーの新しい教科書』、P198</ref>。
つまり、サブ・ステージや任意イベントの難易度については、本編の強制イベントの難易度よりも少し難しくしても構わないのです。文献『ゲームプランナー集中講座』によれば、むしろ、多様なプレイヤーに対応するためにサブ・ステージや任意イベントの難易度の設計は、本編強制イベントとは難易度を変えるほうが望ましいというか、そういう設計テクニックとしてサブ・ステージや任意イベントが用意されているような側面もあるようです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P208</ref>。
書籍『ゲームプランナー入門』(吉冨賢介 著)でも、基本的に作り手は「簡単」だと思っていても、初めてプレイするプレイヤーには難しいという現象がよくあることを述べています<ref>吉冨賢介『ゲームプランナー入門』、P56</ref>。
==== 例外 ====
例外的なプレイヤーもいます。プレイヤーの中には、たとえばRPGなら、レベル上げそのものが好きな人もいます。
また、たとえばゲーマーでない一般人でも、たとえば電卓で「+1」を押しまくって計算結果をカウントアップしていく暇つぶしをしたことある人も多いでしょう。
ですが、レベル上げが好きなRPGゲーマーでも、彼らがプレイしたがるゲームの多くは、なぜか、レベル上げがそれほど好きでない種類のゲーマーも楽しめるゲームばかりです。
ドラクエ、ファイナルファンタジー、女神転生、テイルズ、・・・などなどのシリーズは、どれも商業の人気ゲームは、レベル上げがそれほど好きでなくても、ストーリーや戦術性などでも楽しめるようになっています。
本当にレベル上げだけが好きなら、ストーリー一切無しのレベル上げだけのゲームをプレイすれば充分ですし、フリーゲームなどでそれに近いゲームはあります。しかし、商業の世界では、そういうストーリー無し、あるいは戦術性が無しのゲームの話を聞きません。
これはどういうことでしょうか。
ゲームでなくマンガ業界の例で考えて見ましょう。
たとえば、少年ジャンプの読者には、メインの読者層は若い男の子ですが、
しかし実際には成人男性の読者もいますし、それどころか女性読者もいます。
しかし少年ジャンプは、あくまでも、メインの読者層が男の子であることを貫く編集姿勢であることが、
ジャンプ漫画の裏側を描いたマンガ『バクマン』では描かれています。
バクマンによると、たとえ少女の読者がいても、その少女は、
「男の子が読んでるマンガを自分も読んでみたい」と思うような女の子なので、
だからジャンプの取るべき編集姿勢としては、あくまで男の子向けを貫かないといけない、
といった内容が説かれています。
ゲームも同様でしょう。
==== 背景事情 ====
一般的にゲーム作家の側は、自作のゲームをプレイしたときの体感の難易度(なんいど)が、(他のプレイヤーよりも)自作ゲームを「やさしめ」に感じてしまいまちである。
つまり、本当は難しいゲームなのに、作家自身は「やさしい」と錯覚しやすい傾向がある。なお、この現象を俗に(ぞくに)「作者バイアス」と日本では言う。
;歴史
まず、1990年代のゲーム雑誌『ゲーム批評』にもある歴史的事実として、下記のような事例がすでに1990年代から知られています。
すでに1990年代の時点でゲーム評論雑誌『ゲーム批評』において、新人のゲームプランナーは企画提案の際に既存ゲームを難しくアレンジした提案をしがちだという報告がありました。
雑誌『ゲーム批評』によると、たしか、たとえばもし自社がスーパーマリオのようなゲームを作ろうとしている場合、新人はよく、「マリオのこの部分が簡単すぎるから、わが社はここを難しくしましょう」という提案をしがちだということです。
たとえば、スーパーファミコン版マリオ(スーパーマリオワールド)では、地上ステージでは多くのステージで、マリオに空を飛ばせれば、敵に遭遇せずにステージのゴールまで行けるように設計されています。
それを新人は「飛んでしまうと簡単なので、つまらない」と考えがちらしく、なので「空中に敵キャラを多く配置しましょう」という感じの案を提出しがちだということです。
たとえば
「空中に狼(オオカミ)を配置するのはどうでしょう? アメリカの昔のSFドラマに『超音速攻撃ヘリ エアーウルフ』という作品もありますので、パロディにもなって大人にもウケます」みたいな提案を出したりしがち、らしいです。(このほか、ゴルフゲームでウルフを空飛ばせる駄洒落(ゴルフでウルフ)アイデアなどの披露もあるとかゲーム批評では書かれていた気がするが(というか元々ゴルフゲームの提案で、上司役からのダメだしの根拠にマリオを例にする批評記事だったかもしれないが、本wiki本ページの文脈にあまり関係ないので、ゴルフの話は割愛させてもらう。)
ですが、マリオの地上ステージの空中に敵が少ないのは、ゲームが苦手なプレイヤーのための救済措置だったり、あるいは既に途中まで攻略したけどミスでステージ冒頭に戻されたあとの再チャレンジなどで興味ない体験済みステージ前半を無視するための工夫だったりするので、よって空中の安全性は必要な要素でしょう。
しかし、エアーウルフ的な提案では、そういう分析が抜け落ちています。
ともかく、このように、バランス調整では「予備知識が無いと、多くのゲーム製作者は、ゲームを難しく設計しがち」だというゲーム業界の経験則がもう1990年代からあります。私たちは、歴史にも学びましょう。
:※ ある編集者Aがなんとなく印象でゲームデザイン本などに「ゲーム作家はあまりネットの批評を参考にしない。ゲームを作った事のない人の批評なので、トンチンカンな批評も多いからだ」といったような情報があったような気がしたのですが、
:しかしあらためて書籍を確認してみると、少なくとも『ゲーム作りの発想法と企画書の作り方』や『ゲームプランとデザインの教科書』や『レベルデザイン指南書』では、そのような記述は確認されませんでした。
:下記のコラムは、その情報も背景にしています。
:どうやら、もしそういう記述の文献があっても、必ずしも商業ゲーム業界の多数意見とは限らないようです。
:あるいはその情報は、もしかしたら書籍による情報ではなく、ゲーム雑誌などのwebサイトの意見だったかもしれません(※ 読者に出典などをご存知の方がいたら、情報提供の編集をしていただけると、さいわいです)。よくゲーム雑誌の会社がwebサイトなどに商業ゲーム作家へのインタビュー文など掲載しています。
:一応、『ゲームデザイン プロフェッショナル』では、書籍後半のセクションの題名で大きく「一次情報以外、個性には役立たない」と銘打って、
:「インターネットやSNS」などについて、「そうした情報は知識として役に立つことはありますが、ゲームデザイナーが個性を発揮するうえではあまり役に立ちません」と説明している<ref>『ゲームデザイン プロフェショナル』、P314</ref>。
{{コラム|マリオメーカーのクリアチェック、ほか|
マリオついでに話すと、『マリオメーカー』という任天堂のつくった、マリオのゲームの素材を使って、
マリオメーカー購入者でも自分でマリオ風アクションゲームを作れるというゲームがあります。
このマリオメーカーというゲームでは、自作したゲームを任天堂のwebサイトに投稿・公開する際、クリアしてからでないと、投稿・保存できない仕組みになっています。
実は、マリオメーカーが発売される前、インターネット上には「改造マリオ」といって、マリオのROMを違法改造して、自作ステージをつくって無料公開などをする人たちがいました。
改造マリオはそもそも著作権侵害であり違法なのですが、その他にも問題点として、作成されたステージがやたらと難しすぎてクリア困難なステージばかりで溢れていた、という問題もありました。
しかしインターネット上では、そのようなクリア困難なゲームが、ネットのマニア達にはウケており、動画サイトなどではそのような超絶な高難度ステージが話題だったのです。
社会科学の格言で、「犬が人をかんでもニュースにならないが、人が犬をかむとニュースになる」という有名な格言があります。つまり、実際には統計的には少ない事例のほうがニュースとして話題になりやすいという、社会の法則があります。
また、アンケート調査などの心理学的ノウハウとして、「あなたは○○を買いますか?」と「あなたは○○を好きですか?」と聞いたときでは、
アンケート結果の傾向がかなり異なり、多くの人が、「○○を好きですか?」と質問されても決して実際に好きなものを答えるのではなく、
世間から賞賛されそうな趣味趣向の場合にだけ回答で「はい、好きです」と答えるようであるという、分析結果があります。
まさに改造マリオと本来の合法マリオの関係がそれです。
マリオメーカーでクリアチェックが必須なのは、せめて作者自身がクリアできるゲームをつくれ、常識的なプレイ時間で上達してクリアできるゲームをつくれ、というような任天堂の思いが伝わってきます。
おそらく任天堂の社内でも開発ゲームでは、各ステージのクリアチェックなどが行われているのでしょう。
}}
{{コラム|ネット民の感性は信用できるか?|
インターネット上には無料コンテンツがあふれておりますが、そのような無料コンテンツを楽しむ人たちのセンスは、一般の消費者のセンスとは異なりますし、もし仮に有料だとしても自分がカネを払うつもりもないものを平気で「面白い」と言える人たちも多く居ます。
それでも実際にプレイをした上での感想を言うならまだしも、しかしプレイヤーの人数よりも世界には無料動画の視聴だけをして感想を言うだけの人たちのほうが多いのです。
しかしそれすらも動画サイトでゲーム画面を長時間見ているので、まだしもマシなほうで、もっと酷いのになると、匿名掲示板で誰が言ったかも分からない批評や評論を真に受けて、あたかも実際にプレイしたかのように表面を装う人たちすらも多くいます。
マンガ業界も同じ問題に気づいてるようです。マンガ『ラーメン発見伝』(小学館ビッグコミックスペリオール )では、作中のライバル役のラーメン屋経営者(いわゆる「ラーメンハゲ」)が、ネットの情報をもとにラーメンの実際の食べたときの味を無視してラーメン評論をする自称ラーメンマニアに陰口で悪態をついています。これにリアリティを感じるマンガ出版社があるわけですから、つまりマンガ出版社の目からも、世間一般の人って多くがそういうネットの風評に左右される人達だよねと見られているわけです。
本wikiもネットの情報の一部なので、鵜呑みにしないでください。お金は掛かりますが、参考文献などとして記載されているゲーム関連に役立ちそうな書籍を、読者は実際に何冊か買って、書籍の実物を読むなどしてください。あるいは実際にゲーム制作やプログラミングをするなどして、確かめてください、
文献『ゲームデザイン プロフェッショナル』では、著者の塩川氏が言うには、口コミやレビュー、プレイ動画によって「知った気になる」ことを有害であると戒めています<ref>『ゲームデザイン プロフェッショナル』、P.282</ref>。
だからゲーム作品を調査するなら、実際にクリアするまでプレイするか、あるいは十分なプレイ時間を投じてプレイしてみなければ、ゲームデザイナーにはあまり役立たないと、塩川氏は忠告しています。
たとえ短時間のプレイでは楽しく感じても、長時間のプレイや繰り返しの演出をされた場合には楽しくないような場合もあるので、だから長時間のプレイをして確認してみる必要があるとのことです。(以上、『ゲームデザイン プロフェッショナル』を参考にした。著作権の事情のため、言い回しや文体は多少は変えてある。)
ただ、これは一見するとゲーム作家には、「偏見なく自作を最後までプレイをしてもらえそう」とか思えそうですが、しかしプロの作家は暇人ではないので、同人ゲームまで含めて何でもかんでもプレイすることはできません。
塩川氏は、著作の別のページでは。若者に進めるゲームプレイとして、とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いと言ってます<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
これは裏を返すと、もし人気作や商業的な成功作でなければ、そもそもプレイすらしてもらえない、ということを意味します。塩川氏本人はそう言ってなくても、現実世界の時間は有限であるので、作品1つあたりのプレイ時間を延ばすことはつまり、1多くのプレイしてもらえない作品が生まれます。
つまり、塩川氏のプレイスタイルは、前提として、あるゲームについてプレイを開始するまでの条件が、めちゃくちゃ厳しいわけです。
イラスト業界でも類似の指南の事例があり、「アニメ私塾」といわれる有名イラストレーターは、YouTube動画などでプロのアニメ作品の模写の練習を進めていますが、しかし、おおむね発言内容「アニメ線画の模写ですら時間が何十分も掛かるので、練習に入る前にまず、その構図やデザインなどが自分にとって模写をする価値があるものかどうかを判定して、もし価値あると判定できた場合だけを模写しろ」と、判定にけっこう頭を使いなさい、と指南しています。
しかも「アニメ私塾」氏は、1枚の模写をどの程度まで模写すればいいかという質問に対しては「(模写先の手本に)似るまで模写しろ」とまで言っています。まるで、その1枚の手本を、模写のゲームクリアをするまで模写し続けるわけです。
さて、色々とゲームファンの問題点をいくつか前の段落で言いましたが、それでもゲームはアニメや漫画と比べるとまだしもマシであり、なぜならゲームではプレイヤーと、プレイしてない人たちの区別がしやすいからです。
これがアニメや漫画になると、もはや違法サイトで違法配布されたマンガを読んでるだけの人なのか、
実際に購入してプレイした人なのかの区別が困難になります。
実際、中国や韓国などでは、違法の無料配布されてしまったマンガがネットに溢れてしまった時期があり、
そのような事情もあり金融業界などはマンガ産業への投資を渋り、代わりに課金をしやすいオンラインゲームに投資をしたという経緯があります。
}}
文献『ゲームプランとデザインの教科書』によると、アナログゲーム(カードゲームやボードゲームなど)の設計の例ですが、ネット上の意見ではなく実際の目の前のテストプレイヤーの意見であっても、気を使ったりして本音を言わないことも多いので、意見や感想よりも実際のプレイを観察して、「プレイヤーがルールを勘違いしてないか?」など色々と観察するのが良いといわれています<ref>『ゲームプランとデザインの教科書』、P338</ref>。
{{コラム|イナズマイレブンの人気投票呼びかけ事件|
イナズマイレブンという、男子小中学生くらいの子供をターゲットにした、サッカーのゲームおよびそのアニメ化作品があります。実際、ゲームなどでも平仮名を多用しているし、アニメなどでも振り仮名が多いですので、常識的に小学生くらいの子供がターゲットでしょう。
さて、このイナヅマイレブンの公式サイトが、ネット上での登場キャラクターの人気投票を行いました。
作品中で、「五条」(ごじょう)というマイナーな中学生キャラで、おっさんぽい顔のメガネで目が隠れて何を考えて分からない不気味な雰囲気の悪役っぽいキャラがいるのですが、ある有名な匿名掲示板のスレッドで、このキャラクターへの組織票の投票を呼びかけました。
その掲示板は、どう考えても子供が見ないような掲示板なのですが、しかし投票の結果、五条が一位になりました。
もし「ターゲット層の小学生の子供達が実は五条が一番好きだった」という理由ならそれでも構わないのですが、しかし投票の前後で「五条が子供に一番人気」という現象は特に観測されませんでした。「五条も子供に人気」という現象はあるかもしれません。ですが、「五条が子供に人気」という現象は結局は起きていないでしょう。
ネットの投票では、このような不合理な亊がたびたび起きます。
まず、年齢制限などをすることが不可能な場合が多いです。
また、本来なら「一人一票」などとしたくても、技術的な理由で不可能な場合もあります。
例えば、一人一票のために例えばツイッターなど外部サイトのアカウントを要求しようにも、しかし子供だとネット上のアカウント持つこと自体が不可能な場合もあります。たとえばツイッターの場合、年齢制限として13歳以下は利用不可能ですので、結果的に、小学生むけのアニメの人気投票をツイッターからの投票を呼びかけようとしても、技術的に不可能です。
アイドルグループのAKBなどでは、発売するCDに投票券などをつけることで、本当にカネを出して商品を購入したターゲット層だけが投票できるように工夫する場合もあります。ただし、AKB方式はこれで別の問題があり、一人の熱心なマニアが何票も投票したくて一人で何枚も同じ曲のCDを買うなどする、一般人とはかけ離れた購入行動をする事例があります。
また、アカウントなどを要求しない投票の場合、一日ごとに追加投票できてしまう場合があります。だから暇な人ほど、多くの投票をしてしまいます。
;「美人投票」
経済学で、「ケインズの美人投票」という理論があります。これは、金融における株の購入行動では、人々は自分が良いと思っている株を買うのではなく、世間が「この株は上がるだろう」と思っているだろうと予想した株を買うというものです。
ですが、この五条の投票の場合はもはや美人投票ですらありません。ネットのある集団が、自分たちのコミュニティをアピールするために、意図的に、子供からは美男子・美形・好印象だと思われないであろうと予想したキャラに投票しているわけです。まるで逆美人投票です。
;ノイジー・マイノリティ
世の中には、「口数は多い割には、人数は少ない」という集団があるのです。そのような集団を称して ノイジー・マイノリティ と言い、「うるさい少数派」という意味です。
しかし、うるさいだけの人に限って、企業などからは嫌われるので仕事がなかったりして、ネット上では口数が多いのです。
よく仕事や学生でも学校や家の軽作業などで、「口ばっかり動かしてないで、手を動かせ」などと年上から注意される事があると思いますが、まるでその逆の集団です。手を動かさない人は、口数でしかアピールできないのです。投票とは、そういう人にすら投票権を与えるという意味でもあります。
アニメやマンガなどの投票に関わらず、現実の政治の国会議員などへの投票でも、ある政治家へのネット掲示板などでの賛同は多いが、しかし実際に選挙をしてみると支持票がそれほど多くないという事例もよくあります。
また、暴力団などでは「総会屋」と言って、企業の株を少数でいいので購入し、株主総会での意見をよそおって、難癖をつけるぞとおどすことで、金品を要求するという手口も平成初期までは、よくありました(現在は規制されており、総会屋しづらくなっています)。一株など少数の株でも発言できてしまうので、こういう悪事が出来てしまったのです。
}}
文献『レベルデザイン徹底指南書』では、現実世界で自分が新しいスキルを1つ覚えたら、古いスキル1つはどれか封印する必要があることを説いています。たとえば会社で自らの希望によってグラフィッカーからプランナーに役職が変わったら、グラフィッカー時代のスキルは封印する必要があります<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。(参考文献では「デザイナー」と言ってますが、デザイナーは多義語でありイラストレーターの他にも開発リーダーなどの事を言う場合もあるので、本セクションでは「グラフィッカー」に言い換えた。)プランナーがグラフィッカーの仕事まで掛け持ちしたら、過労死してしまいます。
現実世界の仕事では時間が限られているので、そういうスキル封印が必要なのです。
{{コラム|一人で何でもできるか?|
「と学会」の人が2010年ごろにニコニコ生放送の番組に出演したときに言ってたのですが、どこかのマンガ出版社に対して、「と学会」のその人はマンガ原作者にネタ提供したことあるとの事です。
大衆は、漫画家を一人で何でもできる万能の人だと錯覚したいので、そういう大衆を喜ばせるために、アドバイザーが隠れて、漫画家の知らないネタでしかも読者にウケそうなネタのアイデアを提供をするのです。マンガ作品のクレジットには書かれませんが、そういうビジネスがあります。
もっとも、業界によってはアドバイザーがクレジットに記載される場合もあります。たとえばテレビドラマやアニメなどだと、「考証」や「監修」などで、関連するジャンルの専門家がアドバイスすることもあります。たとえばNHKの歴史大河ドラマなら、東大あたりの大学教授で歴史学教授といったプロの歴史学者が、監修についている場合もあります。
アニメではそこまで行かなくても、ミリタリー物のアニメなどで、実際に銃器を仕事であつかった経験のある人が監修をついていたり、軍事雑誌の記者などが監修についたりとか、そういうこともあります。
}}
{{コラム|可処分時間|
21世紀のビジネス用語で「可処分時間」という概念があります。
もともと「可処分所得」という経理などの用語があり、
「可処分所得」とは労働者が給料のうち、税金や社会保険料など支払いが義務付けられているものを差し引いた、
残りの(法的には)自由に使えるぶんの金額です。
実際には、水道光熱費といった公共料金など自由といえるかどうか分かりませんが、この議論では本質的ではないので深入りしないでおきます。
さて、可処分時間とは、可処分所得になぞらえて、可処分時間とは、おおむね、「1日のうちの自分の起きている時間のうち、労働時間などを差し引いた、残りの自由に使える時間」という意味です。
可処分所得に限りがあるように、可処分時間にも限りがあります。だから、商売の競争とは、消費者の可処分所得の奪い合いであると同時に、消費者の可処分時間の奪い合いでもあるのです。
1つの他人の作品に投じる可処分時間を増やしたら、当然ですが、他の作品への可処分時間の投入量が減ります。
こういう厳然たる事実があります。「可処分時間」という用語までクリエイターが覚える必要はないでしょうが、しかし消費者の時間に限りがあるという事実からは決して逃げることができないのです。しかもよく評論で「エンタメ界隈は、可処分時間の奪い合いの産業である」とも言われます。
クリエイターだって時間に限りがあります。たとえば、休日にもし自主制作の作品をつくっていたら、当然ですが、他人の作品を鑑賞する時間は減ります。
}}
=== クリア保証と戦術性のジレンマ ===
==== クリア保証 ====
ドラクエのレベル成長のシステムは画期的であり、どう画期的かを一言でいうと「クリア保証」である<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>。どういう事かというと、参考文献のリンク先の記事にも書いてあるが、ファミコン以前の1980年代のアーケードゲームではプレイヤーが上手い操作を学習しないとクリアできなかったが、しかしファミコン以降の家庭用RPGでは、プレイヤーの興味ないことは学習しないでも、代わりにレベル上げなどに多少の時間を掛ければゲームクリアできるようになったのである。
たとえば、プレイヤーが攻略法のわからないダンジョンでも、最悪の場合でも経験値かせぎに多少の時間を掛ければ、そのダンジョンのボスを倒せるなどして、かならず最後にはゲームクリアが出来る、というような事でもある。
その他の例では、たとえばゲーム終盤になってから未探検だった序盤の一部ダンジョンを冒険する際、プレイヤーには既にもっと難しいダンジョンを冒険してるのでその未探検ダンジョンから学習できることは少ないが、プレイヤーキャラのレベルが高いために未探検の序盤ダンジョンの敵はプレイヤーにはすでに弱くなっているので、その残っていた未探検ダンジョンにあまり苦労せずに時間を掛けなくてもダンジョンクリアできるように、難易度が上手い感じに自動調節<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>されるなど、RPGのレベルシステムおよび類似システムにはそういった側面もある。
要するに、
:* クリア保証、
:* 難易度の自動調整機能、
の2つが、ドラクエ的なレベルシステムの面白さの本質的・醍醐味であるとのことである。
リンク先の人の意見ではないが、このクリア保証のないデザインのRPGは(RPGでも古いゲームやフリーゲームなどで時々みかける)、表面的にはドラクエ的なインターフェースやステータス画面であっても、中身は似て非なるものであろう。
ファミコン時代の古いゲームなどのバランス調整の失敗(作者にとっては意図的かもしれないが)でよくある失敗として、レベルの上昇の上限を低いところに設定しすぎて、クリア困難になる事例があった(ドラクエ2がそれに近い)。なので、現代への教訓としては、そもそもレベル制限は十分にとるのが安全であろう。
RPGに限らず一般に、ゲームの後半に行くに従って、次ステージ攻略などのための事前準備の増加や、試行錯誤の時間の増加に時間のかかるようになっていく事が多い。そして、ステージクリアに必要な時間の増加が、ゲームを苦手とするプレイヤーに、そのゲームのクリアを諦めさせて挫折感を味あわせてしまう原因になる場合が、少なからずある<ref>[http://endohlab.org/paper/whydoplayersdrop.pdf 遠藤雅伸『ひとはなぜゲームを途中でやめるのか?-ゲームデザイン由来の理由-』6.まとめ] 2020年12月21日に閲覧して確認. </ref>。
=== 自由度 ===
文献『ゲームクリエイターの仕事』(翔泳社)によると、一本道のゲームではなく攻略ルートが複数あって自由度があるゲームの場合、それら複数のルートも考慮する必要があります。ゲームの自由度が多くなれば、その「場合の数」に応じて、調整の際に考慮する事項も増えます<ref>『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖!』、P78</ref>。
=== 勉強の方法論 ===
※ バランス調整に限った話題ではないが、他に適した単元が見つからないし、メインページに書くほどでもないので、間借り(まがり)的にバランス調整のページで書くことにする。
==== 共通言語 ====
ゲーム業界人たちは商売人なので、いろんなゲームをプレイするように推奨します。しかし現実には、それは費用的にも時間的にも不可能です。
商業ゲーム会社でゲームデザイナーになりたいのなら、人気作のゲーム知識は必要です。手本とするためという理由の他にも、スタッフなどに開発コンセプトなどを説明するためにも過去作のゲーム知識が必要になります」(いわゆる「共通言語」)<ref>『ゲームデザイン プロフェッショナル』、P278</ref>。
とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いといわれています<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
==== 前後比較 ====
ゲーム制作において、人気作や人気シリーズを、手本の中心にすえる必要があるが、しかし、けっして人気ゲームだけをマネしようとしてはいけない。名作が名作である意義を確認するためには、同時代の他社の作品や、それ以前の過去の作家の作品に、どういう欠点があったを把握する必要がある。そうした前後関係の比較により、理解が深まる<ref>[https://news.denfaminicogamer.jp/interview/200615a/3 吉田寛・松永伸司『“ゲームらしさ”をもっと深く語りたい!そんなあなたのためのゲームスタディーズ入門』、電ファミニコゲーマー、2020年6月15日 12:02 ] 2020年11月27日に閲覧して確認.</ref>。
なお、同様のノウハウはアニメ研究の業界でも1990年代から語られており、たとえばアニメ評論家の岡田斗司夫や氷川竜介などが、絶版になってしまったが岡田らの共著『国際おたく大学―1998年 最前線からの研究報告』などの書籍の中で例を述べており<!-- 手元にその本が無いので、もしかしたら別の著作かもしれないが、岡田らの共著のどれかではある。 -->、たとえばアニメのガンダム初代がリアリティゆえに名作であることを評論したいならば、それ以前の時代のロボットアニメが如何にリアリティが欠けていたかを実際にビデオなどで視聴するなりして確認しなければならないと岡田・氷川らは述べていた。
ともかく、ゲームでも、名作ばかりプレイしていてもダメであり、つまり知名度だけでプレイするゲームを選んでいては、他のクリエイターに利用されて養分になるだけであろう。
岡田斗司夫と「と学会」の著作した『 岡田の国際おたく大学―1998年 最前線からの研究報告』では、書籍中で、ゲーム作家を経験した演劇作家の鴻上尚史(こうがみ しょうじ)の失敗例を東大生が取材したレポートを紹介しているのですが、岡田がそのレポートを評して言うには、おおむね「成功例から学ぶたがる人は多いが、しかし成功例だけから学ぶのは素人。プロは失敗例にこそ学ぶ。」というような感じのことを言っています。
工学の世界では、『失敗学』という概念が畑村洋太郎によって提唱されており、2002年の畑村の論文<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>や、2000年には畑村の著作『失敗学のすすめ』が出版されています。
(wikipedia日本語版には「2005年」に出版とあるが、間違いである。2002年の論文で、2000年の畑村の著作が参考文献とされている<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>。)
実は、2000年よりも前に、ゲーム産業限定ですが岡田が「失敗にこそ学ぶべき」といった内容のことを提唱しています。なお、畑村の論文の末尾の参考文献欄には、『 1) 畑村 洋太郎 編 著:続・続 実際の設計― 失敗に学ぶ .日刊工業新聞社,1996.』とあります。
{{コラム|失敗とスポーツの例え話|
ビジネス書で昔からよく言われるのですが、新しいことへのチャレンジには失敗はつきものです。
でも、新しいことにチャレンジして経験を蓄えることが、今後の成功につながるのです。もし失敗をおそれて新しいことにチャレンジしなくなったら、もはや次の成功にはつながりません。
失敗しないけれど成功もしないで市場から淘汰されることになるよりも、失敗してもいいのでそれ以上の大成功をおさめて市場で行き続けることができればいいのです。
よくビジネス評論ではスポーツに喩えられるのですが、スポーツのサッカーや野球などの試合にたとえれば、3点を奪われても、こちらが5点を得て結果的に勝てればいいのです。
逆に、1点しか奪われなくても、こちらの得点が0点なら、試合には負けます。
だから、「試合での負け」に相当するような致命的な失敗さえ、回避できればいいのです
「たとえ失敗しても、試合に負けなければいい」のです。「失点しても、試合に負けなければいい」のです。
塩川氏も、失点しても試合に勝てれば良いという内容のことを書籍で発言しています<ref>『ゲームデザイン プロフェッショナル』、P.334</ref>。
さて塩川氏の著作では、失点でない単なる「ミス」を「不具合の発生」、「失点」をユーザーの不利益、「負け」を「売り上げの低下やユーザーの離脱」(長いので抜粋)などと定義しています。
塩川氏の意図は分かりませんが、少なくとも新しいことにチャレンジすれば、未知の失敗は起きますので、ITソフト業界なら、それによる不具合の発生が起きます。
その不具合の結果、ユーザーに不利益が一時的に生じることはあります。しかし、そういう一時的な不利益は、新分野の開拓では避けられません。
ユーザーで実験する前の、最低限の手元や仲間内での実験は必要でしょうが、しかし未然の実験で今後のすべてのミスを防止することは不可能です。
}}
=== 異業種の立場を想像しよう ===
ゲームにかぎらず、文芸でもイラスト趣味でも、、狭いコミュニティ内の内輪ウケばかりに特化していって衰退していっている文化は多い。そうならないように気をつけよう。
内輪受けのマニア化による初心者忌避による衰退をうまく表現できている言い回しとして、プロレス業界の格言ですが「マニアが業界を潰す」という格言があります。なお、この発言は2012年に新日本プロレスリングを買収したゲーム会社のブシロードが買収時に述べた発言「すべてのジャンルはマニアが潰す」が元になっているので、まさにゲーム業界の反省にもとづく考察でもあります<ref> [https://newspicks.com/news/4135958/body/ 『【最終話・木谷高明】すべてのジャンルはマニアが潰す』 2019/10/5 ] 2021年11月7日に確認</ref>。(ブシロードの文脈とは違うかもしれませんが(出展の外部リンク先が有料なので読んでいないので)、本wikiでもおそらく後述していますが、ゲーム業界では1990~2000年の一時期、ジャンルによってはゲームが高難易度化した作品が多くなって、そのため新規参入者が苦手と感じてプレイヤーが減って衰退縮小していったジャンルが幾つかありました。)
なので、ゲーム製作のこういった予備知識のないファンコミュニティの意見ばかりを鵜呑みにして聞いていると、初心者を遠ざけた高難易度ゲームと化してしまうおそれもあります。
特にゲームセンターにある対戦格闘ゲームでは、「初心者狩り」といって、初心者が筐体で練習したくても、熟練プレイヤーが参入して初心者を負かして初心者がゲームプレイヤーになるので、初心者は練習できない。・・・その結果、気がついたらそのゲームの新規参入層が減っていった・・・という事例がありました。
ゲームにかぎらず、スポーツなどの競技の人気でも、似たような現象が見られます。競技というジャンル自体が技巧などを競うものなので仕方ない面もありますが、なんとかして初心者を遠ざけない工夫はゲーム屋には必要でしょう。
ともかく、上述のような色々な理由で、作家側は、体感の難易度が、本当は難しめのゲームなのに「やさしめ」に感じがちである。
実際、日本のゲーム史でも、1990年代の前半ごろは、ゲームの難易度が「むずかしめ」に調整されがちであった。しかし、その結果、世間では「最近のゲームは難しい」と感じる人が増え、日本のゲーム人気は一時期、衰退し、アニメ産業などに人気を取られる事態になった。
{{コラム|作者は答えを知ってしまっている|
バランス調整とは少し違いますが、作者はネタバレを知ってるので、シナリオに感動できないわけです。
これは、ハドソン(ゲーム会社名)の『新桃太郎伝説』(スーファミ版)の攻略本『新桃太郎伝説 究極本』(KKベストセラーズ 刊)で、作者の さくま あきら が、読者インタビューに答える形でそう言っています。
ゲーム雑誌での読者からの「ゲーム中、もっとも印象に残ったシーンはどこですか?」という旨の質問に対し、さくま氏は「作者はシナリオの答えを知ってるので、もっとも印象に残るとかそういうのはありません」的な内容の返答をしています。
}}
;ティッシュテスター
さて、作者バイアスでバランスが分からなくなるのは作者だけではなく、テストプレイヤーやデバッガーも、そのゲームに慣れてゆくと、次第に感覚が一般プレイヤーとズレていき、テストプレイヤー達もゲームの適切なバランス側が分からなくなっていく。
このことを比喩した表現として、「ティッシュ テスター」(tissue tester)という用語がある。使い捨てティッシュが1枚あたり1度しか使えないように、そのゲームに予備知識の無いテスターも、一度しか使えないのである。「フレッシュミート」(新鮮な肉、fresh meat)とも言います。
かといって、テストプレイヤーの人数にも限りがあるので、ゲーム作者は、たとえ自作ゲームのバランス調整が不完全でも、最低限の調整をしたら、もう「えいやっ」と(フリーゲームや同人ゲームなら)ゲームのver1.00および以降バージョンを出さざるを得ない。
単にバグを探すだけのデバッグ用テストならティッシュテスターでなくても可能ですが、しかしバランス調整ではティッシュテスターがいたほうが効率的です。
=== 要素の相互関係 ===
==== 概要 ====
文献『ゲームデザイン プロフェッショナル』によると、調整は、関連あるものを、まとめて同時期に、ただし1個ずつ調整していきます<ref>『ゲームデザイン プロフェッショナル』、P.182</ref>。
このため、まだ関連ある要素を実装しきっていない段階では、調整しません。だから開発の最初から調整することは、まず無いでしょう。
しかし、場合によっては、要素の実装をそろうの待つと調整開始の時期が遅くなりすぎてしまい、計画に支障が出る場合があります。そういう場合、ある程度のまとまりのある実装ができた段階で、調整をするようです。
具体的な調整の判断基準については、参考文献『ゲームデザイン プロフェッショナル』を買ってお読みください。
もし読者が練習として、てっとり早くレベルデザイン・バランス調整の経験を積みたい場合、角川書店(現: KADOKAWA)の『RPGツクール』という制作ツールで実際にゲームを作ってみるのが良いでしょう。文献『レベルデザイン徹底指南書』(大久保磨 著)でも、RPGツクールによる練習・勉強を進めています<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。
==== マップと敵の相互関係 ====
ゲームバランスを決めるのは、敵の強さだけでなく、マップの構成、さらにRPGのダンジョンなら宝箱の中にあるアイテムや装備品の強さ、などなどのさまざまな要素が加わります。
宝箱もマップの構成要素ですから、広い意味では宝箱もマップだとすると、つまり敵そのもののの強さだけでなく、マップもバランス調整に大きく影響します。だから、もし仮に時間が無限にあるのなら、理想的には、ダンジョンなど各ステージののマップが実装されてからバランス調整を行うのが理想でしょう。
しかし、実際には、マップの実装は、なかなか時間の掛かることです。特に、マップを考えることは、そのステージの世界観などを考えることでもあるので、そういった理系的ではない文系的なことも考えなければなりません。
マップに敵を組み込む方式で調整する場合だとマップの実装を待っている間にはバランス調整が出来ないのも、なかなか難しい問題です。
だからマップと敵の調整の順序は、おそらく人や会社によって色々な方式があると思います。たとえば、
:マップを作ってからそのマップに敵を組み込んでみてプレイしてみて、敵の強さを決めるのか、
:それとも敵の強さを決めてから、マップを決めるのか、
:あるいはマップと敵を別々に決めてから、最後に組み合わせて微調整するのか、
などなどです。
ご自身の作品にあった方式をお選びください。
===== 始めよければ全てよし =====
さて、ゲームが長編になる場合、まずはプロトタイプ的に、序盤をやや多めに通しプレイをして、とりあえず序盤のバランスがゲームとして面白くなるように調整すると良いでしょう。
書籍『ゲームプランナー集中講座』でも、ゲームの初めと終わりの印象がよければ、途中のバランスが少しくらい悪くても楽しんでもらえると述べています<ref>『ゲームプランナー集中講座』、P236</ref>。
:※ なお、アニメ産業でも、実はテレビアニメは、第1話と最終話だけ、他のエピソードよりも予算が多めに作られるのが普通です(特に公言はされてないが、多くの作品で明らかにクオリティが違う場合が多い)。
とはいえ、ゲーム制作当初は、そもそも終盤のストーリーがまだ未完成だったりするので、意図せずとも、こういったプロトタイプ的に序盤をやや多めに調整する方法が自然に行われる事になるでしょう。
商業作品でも、たとえば攻略本やファンブックなどに書いてあるゲーム開発裏話などを見ると、RPGでは、(プレイヤーからは数値の見えない)敵の強さのほうを動かすことで、バランスを調整するという事例などもよく紹介されています。よくある話が、最終ボスなどの能力値です。原理的には、敵側の能力値ではなく、味方の能力値で調整したり、あるいは装備品で調整したりしてもイイはずですが、しかしよく開発裏話に出てくるのは、なぜか敵側の能力値の話題ばかりです。
たとえば、スーファミRPG『新 桃太郎伝説』では、最終ボスのパラメータのほうを調整していることが、KKベストセラーズ(出版社名)から出た攻略本『新桃太郎伝説究極本』に書かれています。(調整前はボスはもっとHPが多かった。)
:※ただし、あくまでRPG限定の話題。アクションゲームなどでは、違うかもしれない。
また、こういった調整順序の前提として、調整はゲーム序盤から順番に、ゲーム後半に向かって調整していくしかありません。
そのため、古いゲームなどでは、よくゲーム後半で、調整不足のために、極端に難しかったり、あるいは逆にあっけなく簡単すぎる後半だったりなどの話題も、よく聞きます。ドラクエ2の後半ダンジョンであるロンダルキア洞窟とその次ステージが典型です。
さて、プレイヤーに目立つ部分(たとえば味方キャラの能力値や装備品の性能など)を基準にして調整するといって、けっして全く数値をイジラないというワケではないのです。あくまで、(調整による変動幅の大きい敵能力値と比べたら、)「比較的には、味方キャラ関連の数値は、調整による数値の変動の幅が小さめ。敵の能力値は、調整による変動の幅が大きい。」という事にすぎません。
{{コラム|ノイマン「ゲーム理論」で説明できないのがテレビゲーム|
日本の人類学者の中沢新一は、ノイマンのゲーム理論で説明できないのが昨今のコンピュータゲームの特徴だと言っています。その発言の出典は忘れたのですが、人類学者で有名な中沢新一は近年、ゲーム産業に関心を持ち、たとえばナムコ出身の遠藤雅信などとも対談しています<ref>https://news.denfaminicogamer.jp/kikakuthetower/nakagawa-endo_bb/2 『ゼビウスからポケモンGOまで… 国内ゲーム史を遠藤雅伸氏と『現代ゲーム全史』著者が振り返る。中沢新一氏も壇上に登場!【イベントレポ】』 2017年4月12日 12:30 公開 ] 2022年1月18日に確認. </ref>。(なお、リンク先イベント記事の司会役の「中川」氏とゲストの「中沢」氏は別人なので、混同しないように)
ゲーム理論の用途としては、現代日本の学問では、政治的局面での外交戦略などを語る際によく政治学書で用いられたりします。ただし、そのゲーム理論でも、中沢新一によると、それでコンピュータゲームを語るのは不足だという事です。
中沢は特に言及していないですが、数学的にモデル化するなら、政策応用なら「国際情勢」など外交的な制約によって出力にとりうる値1個あたりの幅や個数が2~3個に限定されたりのような、値の個数が十分に小さくて有限の整数個の場合でないと、なかなかゲーム理論の応用は効果を発揮しません。
(20世紀の天才数学者 フォン・ノイマンの)『ゲーム理論』のような出力値に選べる個数が極端に少ない理論は、コンピュータゲームの調整では不足でしょう。本ページでも、ノイマンのゲーム理論については、版にもよりますが、このコラム以外では特に言及していないだろうと思います(2022年1月までの時点では、ノイマンのゲーム理論には言及していない)。
さて中沢の意見ではないですが、そもそもゲーム理論についてノイマンについての出典として、たしか数学者の森毅(もり つよし)のエッセイ本だったと思いますが、ゲーム理論はもともとノイマンが第二次大戦中の亡命中か何かにトランプのポーカーを参考に考えついたらしいです。
ネット上のゲーム評論では、経済由来の表現でよく使われる表現は、ゲーム理論ではなく「インフレ」「デフレ」などといった表現です。
経済学を知らなくてもゲームは製作できるでしょうが、どうしても経済学を参考にするなら、ゲーム理論よりも物価政策のほうを勉強したほうが良いかもしれません。
一応、書籍『ゲーム作りの発想法と企画書の作り方』ではゲーム理論も紹介されていますが、しかし具体的にどうゲーム作りにゲーム理論を応用するかは書かれていません<ref>『ゲーム作りの発想法と企画書の作り方』、P64</ref>。
}}
=== 各論(デザイン的なこと) ===
どの程度、レベル上昇でキャラクターを強くすればいいかについては、ハドソン社あたりでの有名な慣習があり、新しく訪れたダンジョンなどでは「レベルが3上がると、敵を1撃で倒せるようにすべし」という有名な基準があります<ref>『ゲームプランとデザインの教科書』、P.94、 ※ 著者のひとりの「平川らいあん」氏はハドソン出身</ref>。他社ゲームでは別かもしれませんが、だいたいスーファミ時代の桃太郎伝説シリーズはこんな感じに調整されているはずです。
== RPGのダメージ計算式 ==
=== 特化型が有利になりやすい ===
文献『ゲームプランとデザインの教科書』によると、ファミコン時代のゲームに限らず、21世紀の現代的なゲームでも、「なんでも平均的にできる」キャラクターよりも「○○だけなら自分が一番強い」といった感じの特化型のキャラクターが戦闘では強くなりやすい傾向があります<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.227</ref>。対して、バランス型は「器用貧乏」になりやすいのが現状です<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、、2018年11月1日 第1版 第1刷、P.227</ref>。
なお文献『ゲーム作りの発想法と企画書の作り方』によると、ダメージ計算式を考えるのは(プログラマーの仕事ではなく)ゲームデザイナーの仕事です<ref>『ゲーム作りの発想法と企画書の作り方』、P145</ref>。
では、特化型が有利になりやすい原理を、これから説明していきます。
たとえば、キャラクターに能力をプレイヤーが自由に選んで振り分け配分できるシステムのゲームがあったとしましょう。(商業ゲームでも、いくつかの作品で、似たようなシステムのRPGがあります。)
説明の単純化のため、合計値が必ず100だとしましょう。
つまり、たとえば下記のようになります。
;作成キャラの能力例
:(※ 合計100)
ちから: 10
たいりょく: 30
しゅびりょく: 10
すばやさ: 40
きようさ: 10
さて、別の作成キャラ例を考えます。
;平均型キャラA
ちから: 20
たいりょく:20
しゅびりょく: 20
すばやさ: 20
きようさ: 20
:(※ 合計100)
のように、能力値を平均にふりわけたキャラクターと
合計値は同じですが、特定のパラメータに特化して能力値を振り分けした
;特化型キャラB
ちから: 40
たいりょく:20
しゅびりょく: 30
すばやさ: 5
きようさ: 5
:(※ 合計100)
のようなキャラクターを、
コンピュータ上でRPGの戦闘システムのアルゴリズム上で対戦させた場合、
ほとんどの20世紀のRPGのアルゴリズムでは、特化型のキャラBのほうが勝ち、つまり特化型のほうが強くなってしまいます。
さらに言うと、たいてい「攻撃力」のような、敵にダメージを与える意味のパラメーターに振り割ったほうが、キャラクターが強くなるゲームのほうが多いです。(ファミコン時代から、ウィザードリィ1の攻略本でそういわれていました。敵モンスター『ワイバーン』あたりの攻略法として「攻撃は最大の防御」という格言を出しています。表紙の黒かった攻略本なので、たぶんゲームアーツの本。『ウィザードリィ攻略の手引き』(MIA BOOKS)かと思われます。)
なぜこうなるかと言うと、なぜなら、もし攻撃力が上がると、敵を倒すのに要するターン数も減少するので、結果的に敵を倒すまでに自キャラの受けるダメージ量も減るからです。(なお、現実の軍事学でも、似たような事が言われており、戦術論ですが、クラウゼヴィッツ(近代ドイツの軍事学者の一人)は防御重視の作戦よりも攻撃重視の作戦のほうが有利だと述べています。防御だけで攻撃しなければ、現実でもゲ-ムでも戦闘では絶対に勝てません。)
裏を返せば、平均型能力のキャラは、多くのゲームシステムでは弱くなりがちです。
パラメータの振り分けは自由ではないですが、ドラクエ2(ファミコン版)でいう、サマルトリア王子が弱くなる現象です。ファイナルファンタジー3・5の赤魔導師も、似たような弱点を抱えています。
理由はいろいろとありますが、バランス側の弱くなりやすい理由のひとつとして、参考文献などは特には無いですが、
:・ウィザードリィやドラクエなどの古いRPGのアルゴリズムが、特化型に有利になっているという歴史的な経緯。
:・命中率などの確率に関わるパラメータ(「器用さ」)のある場合、パラメータ割り振り前から既にある程度の底上げ補正がされている場合が多いので、わざわざ命中率を上げると割り損になる。
:・「すばやさ」(素早さ)が攻撃の順番にしか影響しない場合、素早さが低くても1ターンに1度は攻撃できるので、素早さを上げると損。
などの理由があるでしょうか。
命中率に関しては、多くのRPGで、攻撃が外れるのは、プレイヤーに不満感を与えるので、たいていのゲームでは、ゲーム序盤のレベル1のキャラであっても、数値上での「命中率」や「器用さ」などの表向きの命中率が低くても、たとえば「命中率 40」と表示されていても、実際のゲーム内部での命中率はたとえば+20%されてて本当の命中率が60%だったりするような場合もあります。
このような底上げ命中率のあるシステムだと、20%底上げされる場合、命中率を80%以上に育てるのは損です。なぜなら100%以上には上がりようが無いからです。
命中率が101%以上の場合に特殊な追加スキルなどを獲得できるなら別ですが(たとえば、クリティカルヒットの確率がけっこう増えるとか)、たいていの古いゲームでは、そこまでの手入れをしていません。おそらく調整に時間が掛かるからでしょう。
=== ダメージ計算式 ===
さて、RPGの戦闘におけるダメージの計算式(「ダメージ計算式」といいます)に、アルテリオス計算式というのがあります。これは、昔のゲーム『アルテリオス』で採用された計算式なのですが、
攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
という計算式です。
ドラクエやファイナルファンタジーのシリーズの計算式はもっと複雑なのですが、どのRPGでもダメージ計算式の基本的な設計思想・方針はアルテリオス計算式と同じです。
アルテリオス以外のダメージ計算式でも、たとえば
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
というような感じの計算式である作品も多いです。
せいぜい、変数の前に定数係数が掛かっている程度です。
なぜ、どの会社のRPGでも、この程度の中学校レベルの単純な計算式なのかというと、バランス調整が簡単だからです。
バランス調整するのは人間なので、もし、ダメージ計算式があまりに複雑な方程式であると(たとえば量子物理のシュレーディンガー方程式みたいなのだったりすると)、そもそもバランス調整担当の社員が理解できません。
そして、このアルテリオス式を見ると分かるのですが、
:攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
もし自軍の攻撃力が0の場合、敵にダメージを与えられないので(ダメージが0)、絶対に負けてしまいます。つまり、攻撃力が敵の守備力を下回る場合も、絶対に負けるのです。
一方、「すばやさ」パラメータが戦闘の先攻/後攻の順番にしか影響しない場合、素早さが0であっても、勝つことは可能です。
また、守備力が0であっても、勝つことは可能です。
このように、パラメータの種類ごとに、そのゲームにおいて重視・軽視の差があり、不公平になっている事が多いのです。
また、バランス型の能力値のキャラクターの場合、せっかく「ちから」を上げて攻撃力を上げても、守備側の守備力を下回っていると、ダメージ0になってしまい、絶対に負けます。
つまり、
自分の攻撃力 > 敵の守備力
でないと、アルテリオス式では必ず負けるのです。
一方、
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
のように係数を掛けた計算式の場合、
守備力を1ポイント増やしても、その効果は25%減少されます。(たとえばレベルアップの際に上昇パラメータを一種類選べるシステムの場合、守備力を選ぶと損になる場合が多い。)
いっぽう、攻撃力を1ポイント増やすと、効果は30%増しです。
このように、計算式によって、有利/不利なパラメータという格差が生じます。
=== DPS (Damage Per Second) の概念 ===
:※ 出典は無いが、あまりに有名な概念なので、さすがに消さない。
最近のRPGゲームには攻撃コマンド選択時に「二段斬り」などのスキル選択ができます。
スキルを設計するとき、昔の初心者のやりがちなミスとして、最近は減ってきましたが、スキルの結果の見かけの数値にゴマかされて、実はスキルが強くなってない特技を設計してしまうミスが時々ありました。
たとえば典型的なのは特技『ためる』です。これは、次回ターン時のダメージを数倍に倍増し、次回ターンの1回だけ、ダメージを倍増させる特技です。
この『ためる』は必ず、次回ターン時のダメージが2倍を超えないと(たとえば2.5倍にならないと)、無意味です。
なぜなら、『ためる』コマンドを選択したターンは、攻撃をしてないからです。
つまり、スキルを使わずに普通に2ターン通常攻撃した場合、ダメージ量は単純計算で
:1+1=2
より、2ターンぶんのダメージです。
いっぽう、『ためる』コマンドを使えば、それがもし2倍しかダメージが倍増しない場合、
:0+2=2
で、結果は同じ通常攻撃2発ぶんのダメージのままです。
計算すれば子供でも分かる理屈ですが、しかしファミコン時代には市販の商業ゲームですら、こういうミスがありました。たとえばファイナルファンタジー3の職業『空手家』のスキル『ためる』です。
このようなミスを犯さないために必要な概念としては、'''DPS''' ('''D'''amage '''P'''er '''S'''econd) の概念が便利でしょう。DPS とは1秒あたりのダメージ量、という意味です。
もともと欧米のアクションゲームについての理論研究に由来する用語なので、単位が 秒 (second)になっていますが、RPGに応用する場合には単位をターンに変えるなどして工夫しましょう。
このDPSの概念を使って、上述の『ためる』コマンドの設計ミスを説明すれば、つまり、1ターンあたりのダメージ量(DPS)が上昇していないのが問題点です。
では、私たちが改善策を考えましょう。数学的に考えれば中学レベルで充分で、
: 0 + x > 2
を満たす変数xを設計するだけの問題です。
なので、たとえば、『ためる』後の攻撃ダメージ量を「2.5倍」とか「3倍」とかの数値に設計すればいいのです。
では、次に応用問題を考えましょう。
「『ためる』を2回続けると、さらにダメージ量がアップ」などのシステムを導入するときも、必ずDPSが増えるようにしましょう。
たとえば、この場合、ダメージを与えるのに最低3ターンが必要なので、不等式を考えれば、
変数xについての
:0 + 0 + x > 3
を満たさないといけません。
つまり、『ためる』2回後のダメージ量は、最低でも「3.5倍」のように3を超える数値、あるいは整数に限定すれば、たとえば「4倍」とか「5倍」とかになっている必要があります。
== KPI ==
Key Performance Indicator という経営的な指標があり、『レベルデザイン徹底指南書』P140 および 『ゲームプランとデザインの教科書』P70 によると、共通しているのは後述の内容です。なお、『ゲームプランとデザインの教科書』P67 によると、オンラインゲームの運営などで使われる用語ですが、別にゲーム業界限定の用語ではありません。
;DAU(Daily Active User)
:デイリー・アクティブ・ユーザー
DAUとは、その日に遊んでくれたユーザーの人数です。
;MAU(Mathly Active User)
:マンスリー・アクティブ・ユーザー
MAUとは、その月に遊んでくれたユーザーの人数です。
;WAU(Weekly Active User)
:ウィークリー・アクティブ・ユーザー
WAUとは、その週に遊んでくれたユーザーの人数です。
;PU(Paying User)
:ペイング・ユーザー
課金ユーザーの人数のことです。その日を課金ユーザー人数をDPU、その月の課金ユーザー人数をMPUと言います<ref>『レベルデザイン徹底指南書』、P140</ref>。
;課金率
たとえば、ある月のユーザ数のうちの課金ユーザーの割合など、
一定期間中の課金ユーザーの割合を言ったりしますす<ref>『レベルデザイン徹底指南書』、P140</ref>。
あるいは、全ユーザーのうちの課金ユーザーのことだったりしますす<ref>『ゲームプランとデザインの教科書』、P70</ref>。(書籍によって、内容が微妙に違う)
;継続率
前月と比べて今月はどんだけユーザーが残っているかとか、あるいは前週と比べて今週はどんだけユーザーが残っているかのことを、
継続率といいます。
(以上)
このほかにも、色々な指標があります。
== 参考文献・脚注など ==
mvlotfydx4raf0k3kxh2g08rqxgq6lj
206192
206191
2022-08-03T21:10:43Z
Honooo
14373
/* ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか? */ 9/9。
wikitext
text/x-wiki
{{substub}}
現在の版の著者達は、ゲーム戦闘の調整の経験はないので、現状では本ページの内容は調べ物としては役立ちません。経験があり、かつ人間性も良好な人の協力をお待ちしています。
==本ページの目的==
本科目『ゲームプログラミング』は、科目名に「プログラミング」とあるとおり、ゲームクリエイターのための教材ではなくプログラマーのための教材です。
従って、話題がプログラミング的な技術的な話題に片寄っています。一般のゲームクリエイターを目指す人には、本書のバランス調整の記述は到底、役立ちません。
プログラマーが、とりあえず何か趣味でゲームを作る際、バランス調整についての調べ物の手間を少なくするためだけの目的の教科書です。
……と、前編集者Suj. は書いたんだけど、その割にはこの人物の私欲を満たすためだけの駄文が結構くどくど書かれてる気がするんだけど…
気のせいか?まあまだちゃんと読んでないしね、熱でもあるのカナ? コロナか^^?
==バランス調整==
ゲームには難易度というものがあるが、そのゲームの面白さのため、あるいは商品としての購買力アップのため、調整し、最適値を見出す必要があるだろう。敵の強さや主人公の強さ、それらを調整し、最適値を見出すための調査、テストプレイなどが必要だ。
より普遍的に、バグ修正、操作性の改善、仕様実装の更新、そして今書いたバランス調整、ゲームを面白く、評価を高めるための様々な改善を、一般にチューニングと呼んでいる。
英語では、難易度の調整のことを「レベルデザイン」と言う。このレベルとは、高低差の意味で、欧米での昔の3Dゲームにおける、マップの高低差を意図しているらしい。このレベルを調整するツールをレベルエディタというが、このマップの高低差の調整で難易度が変わるので、しだいにレベルデザインが難易度の調整の意味になっていったという<ref>川上大典ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日第1版第1刷、P.57</ref>。
難易度デザイン、という言葉も使われている<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.58</ref>。
そして、難易度の調整にはマップの処理もあるので、3Dゲームのレベルデザイン担当者は、MAYAなどの3Dグラフィックツールの技能を持っているスタッフが多いという<ref>吉冨賢介『ゲームプランナー入門』、P234</ref>。
===詰み、を避けたい===
製品として販売するゲーム、そしてそうでなくとも、プレイヤーがセーブした時点でクリア不能な状況、仕様になっている、つまり、プログラムの流れとして事実上そうなっている、これを「詰み」、と呼んでいますが、それは避ける必要がある。
これはプログラムの構造の問題ですが、ゲームは進行の仕様自体かなりの複雑さを持っていますから、制作者が気付かないうちにプレイヤーがそこに追い込まれる可能性があり、これは娯楽であるゲームとしては避けたい事態です<ref name="twogc78">蛭田健司『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖』、翔泳社、2016年4月14日初版第1刷発行、P78</ref>。
まず、ゲーム全体のバランスとして、平均的なプレイヤーなら、妥当な労力でクリアできる調整も必要でしょう。
ゲームプレイで詰みに追い込まれるのは、プログラムの構造の悪さでもありますが、それを見つけ出すためには、具体的にテストプレイにおいて、少なくとも誰か一人のテストプレイヤーが、そのゲーム内で想定できるクリア困難な状況から、実際に挽回してクリアしたという、事実、実績が必要です。
つまりコンピュータープログラムで常にセキュリティの問題が発生するのと同様に、ゲームプログラムでは構造が複雑になりすぎて、詰みがプログラマーの想定を超えて発生する可能性があるので、実際のプレイで、実際のプレイヤーの現実の巻き返しで確認して調整したい、という事ですね<ref name="twogc78" />。
そして一方難易度調整として、平均的プレイヤーが平均的な労力でクリアできるようにしておきたい。
ちなみに現編集者の昔のゲームプレイ経験ですが、初代ファミコン版のファイナルファンタジーですね、番号は幾つだったか……市販の攻略本を読みながらプレイしていたのですが、あるところまでいった時点で、攻略本を読んでも、どう考えても先に進めない状況に陥り、まあ私のプレイヤーとしての技量にも問題あったのかもしれませんが、結局にっちもさっちもいかなくなって、プレイを放棄してクリアしないまま積みゲーになってしまったことがあります。もちろんそれでそのゲームの仕様が悪かったと主張するつもりはありませんが、プレイヤーの私としてはその時点で完全に詰んでしまったわけです。
===実はゲームプレイヤーだけではなく、あらゆる人間が面倒くさい、俺も、あんたもね^^===
……しかしあんまり面倒くさがると、結局最後には偉い人に怒られてしまうのがこの社会の常です^^;;;。
一般にゲームプレイヤーがプレイ中に面倒くさがることは、覚えること、計算すること、配ること、だと言われています<ref>『ゲームプランとデザインの教科書』,P342</ref>。
ゲーム中に、Wolfram|Alpha が使えるような仕様にすると、案外よかったりしてね^^
===ゲーム制作者はいろいろ考えて作っているだろうけど、プレイヤーだってそれに負けずに考えてプレイしている===
プレーヤーも制作者も、時代の流れとともに、色々な変遷はありますよね。
時々指摘されるようですが、昔よりの最近の方が、ゲームの難しさに関する感受性が大きくて、割と簡単にこのゲームは難しいと指摘されることが多い、と、言われている。
たとえば携帯ゲームにおいて、平均的なゲームプレイヤーがクリアまでに5回ゲームオーバーになるように調整されたゲームは、今では「難しい」ゲームと判断される<ref>『ゲームプランナーの新しい教科書』、P210</ref>。つまり昔のプレイヤーの方が我慢強かったってこと??
一方平均的なプレイヤーならゲームオーバーにならない難易度のゲームは、やさしいゲームと呼ばれることが多い。
だからもはやゲームの難しい易しいという言葉さえ、相対的で、結構人によって判断が違う。
2011~2013年頃のテレビ番組で、ゲーム業界を取材した番組、夜中の番組で、こういうものがあったという。
「昔の子供は、難しいゲームをプレイしたとき、「このゲームは難しい」と答えていたが、今の子供は「このゲームはつまらない」 と答える」
しかし実はテレビというのはこの社会で一番いい加減なメディアで、常に制作者に都合のいい印象操作、不当なイメージ操作が行われている。
つまり昔の子供より今の子供の方が愚かだというイメージを作りたいだけで、インチキな企業のためのいんちきな広告としての意味以外何も持たないだろう。
===商業だろうとそうでなかろうとゲーム制作はプレイヤーの事を考える、難易度はどうする?===
『ナナのリテラシー』という漫画、作者はゲーム好きで、ゲーム雑誌でも描いていたことがあるようです。ビジネス系しかもノウハウ系かな?2巻がゲーム会社回。
ゲーム会社の隅の老人経営者曰く(この漫画内の話ですよ)、「誰もが飛び越せる絶妙な難易度の壁をクリアさせる」、これがゲーム作りのコツじゃ^^!!!
この漫画、前編集者が書くにはかなり、そこそこ取材されているという。
「PS」(プレステ)のロードは、「1回のロードで2WMが限界。どんなマップも2メガに入れなくちゃいけない。会話も音楽も全部ね。」なんて描写があるらしい。
この老人の主張は作品自体の主張でも作者の主張でもないというが、しかし前編集者は重要な事だと考えているようだ。
しかし誰もが飛び越せる絶妙な壁をクリアさせて、消費者に快楽を与えて、ガッポガッポも儲けるにしても、人間には個性があり、性格や性質にもばらつきがある。
全ての人に等しく、偉そうに試練を与えて、それを乗り越えたから気持ちいい、と自己満足に等しく浸らせることは難しい。
だから、インチキにガッポがっぽ儲けるためには(←しつこい^^;;;)、ターゲット層をある程度はしぼりこむ必要がある<ref>『ゲームプランとデザインの教科書』、P.97 </ref>。
「遊んだプレイヤー全員が満足するものを、目指さない」との記述がある書籍もある<ref>塩川洋介『ゲームデザイン プロフェッショナル』、技術評論社、2020年10月3日 第1刷発行、P.173</ref>。ただこれはテストプレイヤーの意見を重視しすぎて振り回されないように、という意図がある記述だという。
ターゲット層を絞りこむには、実在の人物をイメージするのが良いと言う。「20代社会人男性が」、ではなく、自分の知人・友人・家族、あの人を面白がらせたい!!、と、いうのがいいようだ<ref>『ゲームデザイン プロフェッショナル』、P205</ref>。
{{コラム|カラケオは気持ちよく歌いたい^^|
80年代~90年代にカラオケが流行した。と、いっても今でも、盛んだけどね。俺も好き^^
カラオケの難易度は、利用者が楽しめるように易しめに作られているようですね。というか前の項目で書いた、絶妙な難易度らしいよ。そこそこ難しく、それを乗り越えると俺は偉いと自己満足にふけれるらしい。岡田斗司夫が90年代後半にその指摘をしていたというが、しかし本当に前編集者は岡田斗司夫が好きなのね^^;;;。
小室哲哉の曲が典型的にそれだという人もいるらしい。そういえば、NHKアニメーション「だぁ!だぁ!だぁ!」のエンディングは凄く良かったな^^。いや、もちろんこれは只の雑談ですが^^;;;。
エヴァンゲリオンの残酷な天使のテーゼは、監督やスポンサーのレコード会社プロデューサーが、子供でも歌いやすいように作曲してくれと作曲家に依頼している。
確かに凝った楽曲の割に、カラオケで歌いやすい^^
}}
{{コラム|作者の意図通りに視聴者が受け取るとは限らない。作者の意図とは全く別に受け手は作品を楽しむ。それが嫌ならそもそも創作するなよ。|
商業作品であるなら、最終的には売上によって作品の是非が決まる、なんて前編集者は書いてるけど、インチキ書くなよ、あくまでも金は商売としての是非、作品としての価値、意義は別の話だよ。
しかしこいつほんとにアフリマンなのね。金と物質以外何も見えないのか。
ゲームの話題としては、味の善し悪しはプレイヤーが決める、という言葉があるようですね<ref>『ゲームデザイン プロフェッショナル』、P.167</ref>。ターゲット層が、美味い^^!!、と、いう作品を作りたい。
ジブリアニメの『となりのトトロ』は、子供たちにアニメばかり見ずに外で遊ぶように啓蒙するようなストーリーを作者・監督の宮崎駿は目指したと言われています。
ところでこれ↑前編集者の文章だけど、完全なる虚偽だよ、いいかがんにしろ。あのねー、宮崎さんという人は確かに少し偏屈な大人だから、その手の事は時々言うけど、映画を作る時は基本的に、見た人に楽しんでほしい、夢のような時間を過ごしてほしい、そしてこの社会に生まれてよかったと、子供も大人も思ってほしい、そういう思いで、常にそれが第一テーマで漫画映画を作ってるの。
すじ肉先輩さー、あんた俺や他の編集者を何度も知ったかぶりって書いたけど、結局あんたが人類史上、唯一最大の知ったかぶりだね。そもそもあんた、トトロ、観てないんじゃないの?
ほんとにあんたってなにも見えてないのね。「うちの子は、よく宮崎先生のアニメを見ています。面白いアニメを作ってくださり有難うございます」なんて感想は全く問題ないだろ。宮崎氏だってありがたく受け取ってるよ。それに対してアニメばかり観ずに外で遊べ!!なんて言うのはお前とお前の同類のキチガイだけだ。
あとガンダムやエヴァンゲリオンでも似たような逸話があるとのことだが、こっちはどうでもいい。そもそもこれを作っている連中は、宮崎氏ほど切迫した気持ちで作っているわけではなく、ただ金が欲しくて自分が偉いと思いたいだけだから、作った方がどう思おうが、そいつらに金を与えて養ってる連中がどう思おうが、大したことじゃあないだろ?
}}
===チュートリアル===
ゲームをプレイするための、操作方法をプレイヤーが知って覚えるための入門的なイベントをチュートリアルというようですね。実は現編集者はあまり、特に最近はほとんどコンピューターゲームはしないので、ここの執筆をしつつもゲームについてはあまり知らない。
ただここの主要執筆者で、ゲーム大好き、プログラム大好き、アニメ大好き、自分自身も一応絵描き、そしてハイルオタキングの E.Suj. かなりひどい内容の文章を大量に書き散らすので、このサイトの参加者として嫌々多少書き直しをせざるを得ない。
そこでチュートリアル、これはふつうゲーム自体に組み込まれ、初盤がそれになりますが、これは別モードにすると良いという指摘がある<ref>『ゲームプランとデザインの教科書』、P401</ref>。
『不思議のダンジョン2 風来のシレン』が、このスタイルを採用している。
とはいえプレイヤーが必ずチュートリアルをプレイしなければ、ゲームを楽しめない構成なら、あまり大きな意味があるとも思えないが、しかしそうでない場合も多いだろう。
ゲーム構成の選択手として考えてもいいだろう。
===技能の習得としてのゲーム===
====ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか?====
まあゲームをしていることで、プレイヤーは何らかの行為、練習を繰り返して、技能様の物を身につけていく、と、考えても、いい? まあいいか、とりあえずはそう見なしましょう。
ですからそこでプレイヤーが身に着ける技能を想定しておくと、上手にバランス調整が出来るという。
すじにく大先生が愛読している文献では、「教育的難易度」という用語を使っています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版第1刷発行、225ページ</ref>。まあゲーム関係者で教育について分かってる奴なんて、ほとんどいないだろうけど…
ここでの教育難易度とは、むしろ大先生の意図とは逆で、ある敵を攻略するのにプレイヤーがなんらかの操作が必要な時、まず1個だけのその敵の撃破用の操作技能だけをプレイヤーが修得できれば攻略できるようにしろと、つまり、プレイヤーが技能を覚えやすいように、難易度を下げろという事でしょう。
前編集者は本質的キチガイなので、とにかく世の中で自分が偉いことが何より大事なので「教育」という言葉を使いたい。一方で割と似たようなことを語る時に、学習という言葉を使っている文献もある<ref>『ゲームプランとデザインの教科書』、P.61 </ref>。要するにこの本の筆者の方が、E.Suj. よりまともな人間だという事でしょう。
ただ、プレイヤーの技能の習得という視点は、バランス調整の時に一番重要になるという。確かにゲームは技能や知恵、解決のための何らかの手段、鍛錬も必要だが、一方では間違いなく娯楽で、面白いものであるはずだ。
そしてゲームをすることで、自分の思考力が磨かれて、成長したという感慨を持つプレイヤーも多いようで<ref>https://www.teu.ac.jp/ap_page/koukai/2019_03_3endo.pdf 66ページ</ref>、全くその気持ちを否定する意図はないが、でもねー、ゲームっていうのは結局遊びなんだよ?
ゲーミフィケーションなんて言葉を使っていい気になっている連中もいるようだけど、まあその概念や運動がまったく意味を持たないとは言わないが、でもやっぱりゲームは娯楽であり遊びであり、ある程度堕落した、ある程度常識的な硬い世界からは非難される要素があるもので、あまり理屈を並べて自分たちの世界が高級なものだと主張しない方がいいんじゃあない?
{{コラム|ゲーミフィケーション|
どうもゲーム業界の連中が、自分たちの仕事を美化して、正当化したいため、ゲーミフィケーションがどうの、なんて言いだしたようだよ<ref>https://news.denfaminicogamer.jp/kikakuthetower/190731a</ref>。
2019年にゲーミフィケーション学会設立。もっともこの運動や概念がまったく意味がないものだとは、現編集者も言わない。確かにゲーム的な行為を、もう少し遊びから離れて、現実の有用な出来事に結び付けようというのは、それほど間違っていないし、意義はある。
2013年ごろからすでに、企業の新人研修で、ゲームの要素を取り入れた研修などがされていたようだ。
岸本好弘(ファミスタの父、と呼ばれているらしい)の言では、「ゲームの本質っていうのは、人間が頭で想像することの素晴らしさ」<ref>https://www.fantasy.co.jp/edutainment/article/interview16</ref>ってことらしいけど、なんか軽い言葉だね。想像には意義があるが、それってほんとに頭でするもの?
40年前(※1980頃?)、
:「そのころアーケードゲームのデザインで言われていたのは、初めてそのゲームに挑戦したプレイヤーでも3分間程度は遊べるようにすること。「もう一度チャレンジしたら、先に進めそうだ!」と、プレイヤーの気持ちが動くように制作すること」
ってことだけど、そうすれば子供が100円玉いっぱい入れて、お前らが儲かるってだけだろ?
:「これって、現在IT業界で言われるUX、ユーザーエクスペリエンスですよね。ゲーム業界では理論化、言語化していなかったけれど、40年前から現代に通じることをやっていたんだなと思いました。」
何かそれらしい言葉だけ踊ってかっこつけてるようにしか聞こえん^^;;;。
:「ゲームって全部「そそのかし」なんです。ゲームをプレイしていて、Aの洞窟に行きなさいとか、Bの洞窟には行くなとは言われないですよね。プレイヤーが2つの洞窟をぱっと見たときに「こっちの洞窟に宝があるかも!」って見えるように作っているんです。これを「そそのかし」って言うんです。」
まあそれはそれでいいけど、それってそんなに大したことかね?
: (抜粋)「先生は答えを教えるのではなく、生徒が自分で「わかった!」、「僕が一人で気が付いた!」と思わせることが大切。」
思わせるっていうのがすごいし、傲慢だよな。お前は神か?
: 「ゲームをデザインするのも授業をデザインするのも同じです。楽しいと思うことやワクワクすることは脳の働きを最大限にする。だから、つらいことを我慢するのはよくない。脳が楽しいと感じることがとても大切なんです。」
お前みたいな奴って、すぐ脳がどうのって言うよな。まあ楽しいことやワクワクするのが大事なのは認めるが、人生つらいことを我慢しなければいけない時なんてしょっちゅうだよ。後ゲームと授業は別物にしろ、一緒にするな。
しかし思うんだけど、ゲーム業界の奴らって、自分たちの仕事に少しやましさがあるから、教育と結び付けて、高級なものに仕立て上げたいんじゃあないの?
まあゲーム的な教育っていうのはありだが、やはりゲームの本質は遊びで娯楽で、しかも堕落だよ。
}}
{{コラム|すじ肉しちゅ~は今日も右手を上げて、「ハイル、オタキング!!!」と言った。|
1990年代後半に、オタキング岡田斗司夫は、著書『世紀の大怪獣!!オカダ―岡田斗司夫のお蔵出し 』(おそらく)で、マリオカートを例に、市販のゲームソフトの多くは達成感を味合わせるものだと指摘した。
岡田に言わせれば、ゲーム文化以前の人生の趣味の多くは、必ずしも努力の量と、上達とが比例しない。スポーツ、絵画、しかしこれほんと?もちろん厳密に量を考えて、グダグダ気色悪い比較をすれば、そう見えることはあるけど、少なくとも人間、何かをすれば必ず、それなりに得るものがあるはずなんだけどね。
しかしファミコン以降のコンピュータ式のゲームでは努力は無駄にならず、ほぼ必ずといっていいくらい、少なくとも初心者レベルの範囲でなら、プレイして練習すれば上達するように設計されていると、岡田の著書では述べられている。
ふーん、要するにゲームプレイヤーって、ゲーム制作者が作った達成感が欲しいから、金払うってわけね。
岡田が言うには、人生はゲームみたいに甘くないし、もしかしたらゲームは現実逃避で不健全かもしれないけど、でも大人だって親だって達成感をもっと感じたいんだぜ・・・だから今日も娘といっしょにマリオカートをプレイしている、と書いてたって言うけど、そもそも現実逃避や不健全から達成感って手に入る?
なんか頭のおかしい奴はやたら達成感って言うんだけど、それってほんとに欲しい?
いや、もちろんある程度は欲しいけど、でもそんな重要な事かね? もっと人生で必要なもの、いっぱいないかね?
}}
{{コラム|ガイナックスとはオタキング岡田斗司夫が創業した、アニメーションとコンピューターゲームの制作会社である。|
ガイナックスは、コンピューターゲームも作っていたね。確か、美少女18禁ソフトもあったよね。
1991年、『プリンセスメーカー』、育成シミュレーションゲーム。確かに赤井孝美さんのグラフィックは魅力的だった。
少女を光源氏的に育成するゲームだったか、キャラクター育成ゲームのはしりだね<ref>STUDIO SHIN『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版 第2刷 発行、P182</ref>。
98年にはコナミ社『ときめきメモリアル』というのが出た。ただこれは育成というよりは、美少女との恋愛疑似体験ゲームみたいな、まあ俺はやったことないから詳細は知らないけど、まあ美少女と上手に付き合えるように、男性キャラクターを育成する要素はあったのかね。
「プリンセスメーカー」→「同級生」→「ときメモ」の流れがあるって、ある評論家は言う。
良くわからないけど、岡田斗司夫はゲーム制作会社の社長でもあるんだから、前のコラムの達成感がどうののたわごとに意義を認めろって、すじ肉は書くんだけど、なんなのこいつ。
岡田斗司夫の肩書に関する議論って意味ある?
別にアニメ評論家でも、会社社長でも、なんでも勝手に名乗って威張っていればいいけど、でもやっぱり岡田斗司夫の肩書は、オタキングだよね。
}}
{{コラム|プリンセスメーカーdeathpenalty|
少女育成ゲーム・プリンセスメーカーは全滅時の損失が軽いのが、割と画期的だったようです。戦闘で全滅すると、拠点に戻されたうえ、1か月経過する。
全滅時の損失のことを和製英語でデス ペナルティといいます。英語では dead damage と云うらしい(DDと略すようです)。英語の death penalty は「死刑」の意味だって。
つまりどうやら、デスペナルティが軽くても、面白いはRPG は作れるらしい。
;デスルーラ
全滅しても拠点に戻るだけのシステムだと、拠点に戻りたい場合にわざと全滅する方法を使える。これを和製英語で「デスルーラ」と言う。ルーラとはドラクエの移動魔法ルーラのこと。
全滅したときに拠点に戻るゲームでは、拠点に戻れなくするイベントは不可能。
全滅したら拠点に戻れるからね。ただ、戦いが起こらなければどうかな?
どちらにしろこの議論、意味ある?
ただ例外的に全滅したとき拠点以外に戻る、っていう事は仕様で作れるよね。
}}
{{コラム|Roblox,Among_Us|
現編集者は現在は基本的に、コンピューターゲームはしない生活、でもほんのちょっと前、思うところあって、MicrosoftStore,Xbox 経由で、すこしゲームをしていた時期があった。
そしてMicrosoftStore はなんだかんだでゲームを売り込んでくるよね。
その時思ったんだけど、Roblox って面白そうだよねー。プレイはしていないんだけど、広告や表示を見ると、これ絶対面白いなって直感的に思う。
だからこのゲームのユーザーやプレイヤー、あるいは関係者にこのページの執筆してほしいな^^
後、Among_Us っていうのも面白そう。何か皮肉がすごく効いてそうだね。
}}
{{コラム|デスペナルティ関連|
このコラム、前編集者が、(この話題は、後述の商学書『メイド・イン・ジャパンは負けるのか』の話題と関連するので、残す必要がある。)ってメモを張っていたんだけど、読んでみたんだけど、現編集者Hにはちょっと話が見えなくてね。おそらくRPG をやりこんでいる人は内容が良くわかるんだろうけど、現編集者にとってはかなりの部分が???????だね。だからできるだけまとめる一方で、詳細不明の部分は前編集者の記述をそのまま残しました。
;帰り道を通せんぼするイベントは、詰みのリスクが高くなる。
サガシリーズはどこでもセーブできるが、この場合、帰り道を通せんぼするイベントは、上手に設計しないとクリア不能になる恐れがある。
ファミコン~スーファミ時代のドラクエとファイナルファンタジー、GB版サガとロマサガには帰り道を通せんぼするイベントは無いように見える。
ロマサガ1の氷結城の帰り道で通せんぼするボス敵がいる。しかし会話選択肢で戦闘を回避すると、詰みを避けられる。
古い時代のサガ系とロマサガでは、ダンジョン奥まで探検すると、最深部に一方通行のダンジョン出口がある。これは帰り道短縮の意味と、テンポ感向上(プレイヤーが既に理解していることを再度要求しないから)の効果がある。
しかしこの場合、もしダンジョンに一方通行出口がない場合、プレイヤーは帰り道にボス戦があると予測する。これはネタバレになってよくない。ドラクエは、最後の一方通行出口をあまり用意しないが、この狙いがあるのだろう。
このようにゲームのルール設定が、可能なイベントやマップを限定する。
}}
さて、ゲームのシリーズ物は、ルールが一様になる傾向がある。
だから、シリーズ作品によって搭載されるイベントの傾向も決まってくる。
イベントの傾向が限定されると、マンネリ化につながる恐れもある。
『メイド・イン・ジャパンは負けるのか』という2010年ごろの書籍でも、
シリーズ化とマンネリ化との相互関係が語られていて、基本的に家庭用ゲーム機の作品群の多くはゲーム性の根幹が90年代以降の作品は変わっておらず、変わったのはグラフィックが細かくなっただけ、と書かれている。
しかしゲーム会社からすれば、新規の斬新な発想のゲームはむしろ売れないと見られている。
グラフィック重視は、商業ゲームでは非常に重要と考えられているらしい。
そしてゲーム評論家は偉そうな批判はするが、自分では結局ゲームを作らない。
1980年代は、家庭用ゲーム黎明期。1995年ごろ、プレステ1時代からソフト容量が飛躍的に伸びた。
昔はゲームに勢いがあったが、今となっては、新しくて画期的かつリアリティと説得力のあるルールを思いつくこと自体、そんな簡単な事ではない。
漫画産業やアニメーション産業は黎明期をとっくに過ぎたようだが、結局今でもこの産業は続いている。そもそも、ラジオ、新聞、書籍、オールドメディアと呼んでいい産業も、今、しっかり続いている。2010年代のゲーム産業だって、もしかしたらスマホゲーム黎明期、ソーシャルゲーム黎明期なのかもしれない。
{{コラム|オタキングアノマリー論|
オタキングによるアノマリー(片寄り)論(『東大オタク学講座』に記述あり)によると、ゲームのバランス調整は結局普遍性は持たず、作家の世界観が反映されるものになる、という。
都市運営シミュレーション『シムシティ』、アメリカ製のゲームですが、ここでは火力発電所よりも原子力発電所の方が効果的な投資になっている。これは現実の経済情勢を正しく反映しているか?
これは現実の経済分析の話だが、現編集者はYESだと思っている。巨大なお金が動いているからこそ、いまだにこの国は原発をやめられない。
そして岡田はこの設定をアメリカ的な都市政策観の反映だとしている。しかし岡田はこのゲームの感覚を片寄りだと思っているのか?
そのほか、岡田は、ドラクエシリーズに対して、「なぜ作者の堀井さんは、作中で父親と子の関係に、どの作品でも、こだわりたがるんだろう? なにかあったんじゃねえの?」的なゲスい勘繰りもしています。
↑ちなみに上の段落は前編集者、E.Suj.の記述をそのまま残したものだが、まあね、オタキングがゲスい人間なのは、オタク全員が知っているからね^^;;;。
ここで書いたシムシティに関する議論と堀井氏に関する議論はどうも別の話のように見える。
つまり前編集者の議論は当初から混乱しているのだが、結局E.Suj. は作家の個性とは異常性の裏返しだと言いたいらしい。つまり個性とは長所ではなく、欠点の別形態だと。
では現編集者はこのE.Suj. に質問したいが、結局人間、個性持っていたほうがいいの?持っていない方がいいの?
大人は欠点すらうまく自分で活用しなければいけない、なんて書いてるけど、そんなこと上手く出来ている大人なんて、この地球上に一人もいないよ。
}}
==== 本文 ====
もちろん作品によっては例外もあるでしょうが、しかし上述で紹介したような様々な視点の異なる複数のゲームクリエイターなどゲーム業界人が、「教育」や「成長」などあたかも学習的な用語を使っている事は、念頭に置くと良いかと思います。
ゲームにおける教育的な要素はもちろん擬似的なものです(ゲームに限らず一般のアニメや漫画も同様です。もし本格的に世間一般で通用する意味での「学習」をしたいなら高校~大学レベルの国語・数学・英語・理科・社会科などの参考書などを読もう)。
さて調整の話題に戻ります。
たとえば、アクションゲームの調整なら、
もし敵が飛び道具を使ってくるなら、まずプレイヤーは物陰に隠れて移動して近づくとか、あるいはプレイヤーも飛び道具で応戦するとか、そういうプレイ技法が必要でしょう。
文献『ゲームプランナー集中講座』(吉沢秀雄 著)でも、飛び道具を使ってくる敵には、ゲーム序盤では、まず物陰にかくれて敵の攻撃を避けるなどのプレイ技法をプレイヤーに習得できればよいというくらいまで、(序盤の)難易度を簡単にすべきだと、その文献『ゲームプランナー集中講座』では主張されています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、226ページ</ref>。
まず、序盤の飛び道具つかいの敵なら、プレイヤーが上述のような物陰に隠れる技法を実践できていたら、その敵を簡単に倒せるように難易度を調整します。
このため、序盤ではけっして、敵の攻撃をさけるための物陰の部分には、ゲーム作者はワナなどを仕掛けないでおき、物影には敵も配置しないようにするくらいで、良いのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、226ページ</ref>。
たとえば、飛び道具を使ってくる敵は、そいつに攻撃を当てるまでは難しいが、しかし敵の防御力を低くしておいて、もし敵が(プレイヤーからの)攻撃を受けたら、敵はすぐに倒されてしまう・・・のような強さの敵としてパラメータ調整しておくのが良いでしょう。
つまり、プレイヤーに教えたいスキルとして、そのアクションゲームを通して、飛び道具を使ってくる敵の対処法を教えるのです。
ゲーム後半で難易度を上げる場合は、けっして敵を単にやたらと頑丈にするのではなくて、
敵の強さはそこそこでいいので、
たとえば
ステージのギミックや敵の行動などを今までの敵と複合化させたりする等の設計により、過去にプレイヤーの習得したプレイ技法の組み合わせの練習・習得をプレイヤーに要求したりとかして、プレイヤーに今まで習得した単一のプレイ技法の複合の習得を要求するようにすると、プレイヤーも成長できますし、あきづらくなるし、いいことづくめです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、228ページ</ref>。
(ただし、あまりにも膨大なプレイ技法どうしを組み合わせるような過大な技法をプレイヤーに要求しないように、(作者がプレイヤーに)要求する技法の数にも限度は必要でしょう。)
なお、余談だが、「難易度」の「高い」「低い」の意味は、
:「むずかしい」=「難易度が高い」
:「やさしい」=「難易度が低い」
である。
ゲームを難しくする目的は、プレイヤーに創意工夫を呼び起こすためです。創意工夫を呼び起こさない難しさは不要かもしれません。
書籍『ゲームプランナー入門』によれば、ボス戦などの難しいエリアの目的は、プレイヤーが自らのプレイスキルの程度を試したり、あるいはRPGなどならキャラクターユニットの成長を試すためのものです<ref>吉冨賢介『ゲームプランナー入門』、P60</ref>。また、「歯ごたえ」などの表現の意味も、こういった意味であると書籍では述べています。
;制限の必要性
制限の必要性とは、たとえば、ゲーム中での主人公が丈夫で死にづらいのは構いませんが、しかしどんなに敵の攻撃を食らっても死なずに倒れずに不死身なのは駄目です。
また、主人公の所持金が多いのは構いませんが、しかし所持金が無限大なのは駄目なのです。
また、敵の動きが少し単純なのは構いませんが、しかし、プレイヤーが油断しすぎているのにプレイヤーが負けないのは駄目です(たとえばアクションゲームで一時停止ボタン(ポーズボタン)を押さずにトイレに行ってウンコを数分してきても、ウンコから戻ってきてもキャラが負けてないのは明らかに駄目)。
このような駄目な例のゲームのままでは、プレイヤーが創意工夫をしなくなってしまいます。
このため、そのゲームでのゲームオーバー条件を、作者は早めに決めておきます。ゲームオーバーが用意されていないと、スリルが出ないのです<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.254</ref>。
あまり気が乗らないでしょうが、しかし、ゲームにはゲームオーバーや敗北の条件が必要ですし、プレイヤーには敗北を回避するように努力してもらわなければなりません。
;解法を1つに限らない
書籍『ゲームプランナー入門』(吉冨賢介 著)によると、たとえばスーパーマリオ1のステージ1-1の最初の敵のクリボーの対処でも、クリボーを踏んでやっつけるか、それともジャンプして飛び越えて次に進んでしまうか、マリオがブロックの上に乗ってクリボーが通り過ぎるのをやりすごすか、などなど幾つもの選択肢があると、例を挙げています<ref>吉冨賢介『ゲームプランナー入門』、P55</ref>。けっして、「たった一つの正解」ではないと述べています<ref>吉冨賢介『ゲームプランナー入門』、P55</ref>。
このように解法を複数用意することで、プレイヤーに創意工夫を呼び起こしやすくなります。
==== 他メディアとの違い ====
===== マンガ・アニメのバランス調整との違い =====
マンガやアニメのバランス調整というか、物語での敵の強さの見せ方と、ゲームでの敵の強さのありかたは、少し差異があります。
マンガ・アニメだと、たいてい強敵は、主人公がなんとか苦戦しながら倒せるギリギリの強さになっています。たしか1982年『鳥山明のヘタッピマンガ研究所』(1982年『鳥山明のヘタッピマンガ研究所』)の時点で、すでに、マンガやアニメや特撮(ウルトラマン)などの敵の強さは、そういうふうに設計されていることが説明されています。
しかしゲームでは普通、このようなギリギリの強敵にしてないほうが安全です。
マンガやアニメの強敵よりも、やや弱めにしておく必要があります。そうしないと、プレイヤーに創意工夫が生まれません。
具体例を考えるなら、分かりやすい例が、先ほど漫画家の鳥山明さんを例にあげましたが、その鳥山さんのドラゴンボールの原作マンガとゲーム版でのボス敵の強さの違いです。ゲーム版『激神フリーザ』だと、たとえばクリリンでもちょっと鍛えて頑張ればザーボン(ナメック星編の中ボス敵)を倒せるようになっています(原作マンガだとクリリンはザーボンを倒せない)。別に鳥山さんの作品だけでなく、ほかの多くの作家のマンガやアニメのゲーム版も、大体、同様に、原作マンガや原作アニメでは倒せなかったボス強敵がゲーム版では頑張れば倒せるようになっています。
理論的に考察するなら、マンガやアニメでは、一回の戦闘での強敵の倒しかたが一通りしかなく、いちばん読者に魅力的に見える奇想天外・破天荒な倒しかたで、敵を倒します。なのでマンガやアニメでは、ギリギリ倒せる強さのほうが良いのしょう。
しかしゲームの強敵では、多くのプレイヤーの、それぞれ異なる色々なアイデアに対応した倒し方を何通りも準備する必要があるので、ゲームでの強敵の強さは、ギリギリ倒せる状態よりも少し弱めにする必要があります。
==== 「廃人」 ====
ゲーム用語で「廃人」(はいじん)という表現があります。「廃人」とは、たとえば通信機能のあるネトゲRPGなどで、普通の社会人だとレベル上げが引きこもりプレイヤー追いつかずに(社会人が)クリアできないようなゲームにおいて、高レベルプレイヤーである引きこもりプレイヤーや無職プレイヤーなどを揶揄する意味です。
2010年以降の近年は課金ゲームなどにも「廃人」という言葉が使われます。一般の市販ゲームは高くても1万円程度ですが、それと比較して多額すぎる数十万円や数百万円の金額をゲームに課金するプレイヤーのことです。
書籍『ゲームプランとデザインの教科書』でも、この問題をサラっとですが、きちんと紹介しています。書籍中では「廃課金ユーザー」という表現を使っています<ref>『ゲームプランとデザインの教科書』、P66</ref>。書籍『ゲームデザインとぼくらの教科書』でも、廃課金ユーザーが社会問題化したことに触れられています<ref>『ゲームプランとデザインの教科書』、P66</ref>。
アニメーターだってゲームをする暇があるなら絵を描いていたからアニメーターとして通用しているわけです。アニメーターの就職前の第一趣味はゲーマーではないでしょう(イラスト制作やアニメ制作のはずです)。
=== ゲーム作家の体感の難易度はズレやすい ===
プログラミングというよりゲームデザインの話題かもしれないが、そのゲームの簡単さ・難しさといった難易のバランス調整も、コツがいろいろとある。
==== 具体的な方法 ====
結論から言うと、多くのゲームデザインの文献で、やや簡単めに調整されたバランスでゲームを作るのが安全であると主張されている。
たとえば書籍『ゲームプランナーの新しい教科書』(STUDIO SHIN 著、翔泳社)でも、作者がやや簡単だと思うくらいに作ると良くなる場合が多いという経験則が語られている<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版第2刷発行、54ページ</ref>。
また、書籍『ゲームプランナー集中講座』(吉沢秀雄、SBクリエイティブ)でも同様に、調整で迷って、プレイヤーにとっては易しいほうの案Aと難しいほうの案Bとがあったら、ゲーム本編には、やさしいほうの案Aを採用するのが良い、と主張しています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、235ページ</ref>。
難しいほうの案Bは、クリアに不要なサブ・ステージとか、そういうステージに流用すればいいのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P207および235ページ</ref>。
ちなみに、文献『ゲームプランナーの新しい教科書』によれば、RPGにおいて、クリアに不要なイベントのことを「任意イベント」と言います。一方、クリアに絶対な必要なイベントのことは「強制イベント」といいます<ref>STUDIO SHIN著『ゲームプランナーの新しい教科書』、P198</ref>。
つまり、サブ・ステージや任意イベントの難易度については、本編の強制イベントの難易度よりも少し難しくしても構わないのです。文献『ゲームプランナー集中講座』によれば、むしろ、多様なプレイヤーに対応するためにサブ・ステージや任意イベントの難易度の設計は、本編強制イベントとは難易度を変えるほうが望ましいというか、そういう設計テクニックとしてサブ・ステージや任意イベントが用意されているような側面もあるようです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P208</ref>。
書籍『ゲームプランナー入門』(吉冨賢介 著)でも、基本的に作り手は「簡単」だと思っていても、初めてプレイするプレイヤーには難しいという現象がよくあることを述べています<ref>吉冨賢介『ゲームプランナー入門』、P56</ref>。
==== 例外 ====
例外的なプレイヤーもいます。プレイヤーの中には、たとえばRPGなら、レベル上げそのものが好きな人もいます。
また、たとえばゲーマーでない一般人でも、たとえば電卓で「+1」を押しまくって計算結果をカウントアップしていく暇つぶしをしたことある人も多いでしょう。
ですが、レベル上げが好きなRPGゲーマーでも、彼らがプレイしたがるゲームの多くは、なぜか、レベル上げがそれほど好きでない種類のゲーマーも楽しめるゲームばかりです。
ドラクエ、ファイナルファンタジー、女神転生、テイルズ、・・・などなどのシリーズは、どれも商業の人気ゲームは、レベル上げがそれほど好きでなくても、ストーリーや戦術性などでも楽しめるようになっています。
本当にレベル上げだけが好きなら、ストーリー一切無しのレベル上げだけのゲームをプレイすれば充分ですし、フリーゲームなどでそれに近いゲームはあります。しかし、商業の世界では、そういうストーリー無し、あるいは戦術性が無しのゲームの話を聞きません。
これはどういうことでしょうか。
ゲームでなくマンガ業界の例で考えて見ましょう。
たとえば、少年ジャンプの読者には、メインの読者層は若い男の子ですが、
しかし実際には成人男性の読者もいますし、それどころか女性読者もいます。
しかし少年ジャンプは、あくまでも、メインの読者層が男の子であることを貫く編集姿勢であることが、
ジャンプ漫画の裏側を描いたマンガ『バクマン』では描かれています。
バクマンによると、たとえ少女の読者がいても、その少女は、
「男の子が読んでるマンガを自分も読んでみたい」と思うような女の子なので、
だからジャンプの取るべき編集姿勢としては、あくまで男の子向けを貫かないといけない、
といった内容が説かれています。
ゲームも同様でしょう。
==== 背景事情 ====
一般的にゲーム作家の側は、自作のゲームをプレイしたときの体感の難易度(なんいど)が、(他のプレイヤーよりも)自作ゲームを「やさしめ」に感じてしまいまちである。
つまり、本当は難しいゲームなのに、作家自身は「やさしい」と錯覚しやすい傾向がある。なお、この現象を俗に(ぞくに)「作者バイアス」と日本では言う。
;歴史
まず、1990年代のゲーム雑誌『ゲーム批評』にもある歴史的事実として、下記のような事例がすでに1990年代から知られています。
すでに1990年代の時点でゲーム評論雑誌『ゲーム批評』において、新人のゲームプランナーは企画提案の際に既存ゲームを難しくアレンジした提案をしがちだという報告がありました。
雑誌『ゲーム批評』によると、たしか、たとえばもし自社がスーパーマリオのようなゲームを作ろうとしている場合、新人はよく、「マリオのこの部分が簡単すぎるから、わが社はここを難しくしましょう」という提案をしがちだということです。
たとえば、スーパーファミコン版マリオ(スーパーマリオワールド)では、地上ステージでは多くのステージで、マリオに空を飛ばせれば、敵に遭遇せずにステージのゴールまで行けるように設計されています。
それを新人は「飛んでしまうと簡単なので、つまらない」と考えがちらしく、なので「空中に敵キャラを多く配置しましょう」という感じの案を提出しがちだということです。
たとえば
「空中に狼(オオカミ)を配置するのはどうでしょう? アメリカの昔のSFドラマに『超音速攻撃ヘリ エアーウルフ』という作品もありますので、パロディにもなって大人にもウケます」みたいな提案を出したりしがち、らしいです。(このほか、ゴルフゲームでウルフを空飛ばせる駄洒落(ゴルフでウルフ)アイデアなどの披露もあるとかゲーム批評では書かれていた気がするが(というか元々ゴルフゲームの提案で、上司役からのダメだしの根拠にマリオを例にする批評記事だったかもしれないが、本wiki本ページの文脈にあまり関係ないので、ゴルフの話は割愛させてもらう。)
ですが、マリオの地上ステージの空中に敵が少ないのは、ゲームが苦手なプレイヤーのための救済措置だったり、あるいは既に途中まで攻略したけどミスでステージ冒頭に戻されたあとの再チャレンジなどで興味ない体験済みステージ前半を無視するための工夫だったりするので、よって空中の安全性は必要な要素でしょう。
しかし、エアーウルフ的な提案では、そういう分析が抜け落ちています。
ともかく、このように、バランス調整では「予備知識が無いと、多くのゲーム製作者は、ゲームを難しく設計しがち」だというゲーム業界の経験則がもう1990年代からあります。私たちは、歴史にも学びましょう。
:※ ある編集者Aがなんとなく印象でゲームデザイン本などに「ゲーム作家はあまりネットの批評を参考にしない。ゲームを作った事のない人の批評なので、トンチンカンな批評も多いからだ」といったような情報があったような気がしたのですが、
:しかしあらためて書籍を確認してみると、少なくとも『ゲーム作りの発想法と企画書の作り方』や『ゲームプランとデザインの教科書』や『レベルデザイン指南書』では、そのような記述は確認されませんでした。
:下記のコラムは、その情報も背景にしています。
:どうやら、もしそういう記述の文献があっても、必ずしも商業ゲーム業界の多数意見とは限らないようです。
:あるいはその情報は、もしかしたら書籍による情報ではなく、ゲーム雑誌などのwebサイトの意見だったかもしれません(※ 読者に出典などをご存知の方がいたら、情報提供の編集をしていただけると、さいわいです)。よくゲーム雑誌の会社がwebサイトなどに商業ゲーム作家へのインタビュー文など掲載しています。
:一応、『ゲームデザイン プロフェッショナル』では、書籍後半のセクションの題名で大きく「一次情報以外、個性には役立たない」と銘打って、
:「インターネットやSNS」などについて、「そうした情報は知識として役に立つことはありますが、ゲームデザイナーが個性を発揮するうえではあまり役に立ちません」と説明している<ref>『ゲームデザイン プロフェショナル』、P314</ref>。
{{コラム|マリオメーカーのクリアチェック、ほか|
マリオついでに話すと、『マリオメーカー』という任天堂のつくった、マリオのゲームの素材を使って、
マリオメーカー購入者でも自分でマリオ風アクションゲームを作れるというゲームがあります。
このマリオメーカーというゲームでは、自作したゲームを任天堂のwebサイトに投稿・公開する際、クリアしてからでないと、投稿・保存できない仕組みになっています。
実は、マリオメーカーが発売される前、インターネット上には「改造マリオ」といって、マリオのROMを違法改造して、自作ステージをつくって無料公開などをする人たちがいました。
改造マリオはそもそも著作権侵害であり違法なのですが、その他にも問題点として、作成されたステージがやたらと難しすぎてクリア困難なステージばかりで溢れていた、という問題もありました。
しかしインターネット上では、そのようなクリア困難なゲームが、ネットのマニア達にはウケており、動画サイトなどではそのような超絶な高難度ステージが話題だったのです。
社会科学の格言で、「犬が人をかんでもニュースにならないが、人が犬をかむとニュースになる」という有名な格言があります。つまり、実際には統計的には少ない事例のほうがニュースとして話題になりやすいという、社会の法則があります。
また、アンケート調査などの心理学的ノウハウとして、「あなたは○○を買いますか?」と「あなたは○○を好きですか?」と聞いたときでは、
アンケート結果の傾向がかなり異なり、多くの人が、「○○を好きですか?」と質問されても決して実際に好きなものを答えるのではなく、
世間から賞賛されそうな趣味趣向の場合にだけ回答で「はい、好きです」と答えるようであるという、分析結果があります。
まさに改造マリオと本来の合法マリオの関係がそれです。
マリオメーカーでクリアチェックが必須なのは、せめて作者自身がクリアできるゲームをつくれ、常識的なプレイ時間で上達してクリアできるゲームをつくれ、というような任天堂の思いが伝わってきます。
おそらく任天堂の社内でも開発ゲームでは、各ステージのクリアチェックなどが行われているのでしょう。
}}
{{コラム|ネット民の感性は信用できるか?|
インターネット上には無料コンテンツがあふれておりますが、そのような無料コンテンツを楽しむ人たちのセンスは、一般の消費者のセンスとは異なりますし、もし仮に有料だとしても自分がカネを払うつもりもないものを平気で「面白い」と言える人たちも多く居ます。
それでも実際にプレイをした上での感想を言うならまだしも、しかしプレイヤーの人数よりも世界には無料動画の視聴だけをして感想を言うだけの人たちのほうが多いのです。
しかしそれすらも動画サイトでゲーム画面を長時間見ているので、まだしもマシなほうで、もっと酷いのになると、匿名掲示板で誰が言ったかも分からない批評や評論を真に受けて、あたかも実際にプレイしたかのように表面を装う人たちすらも多くいます。
マンガ業界も同じ問題に気づいてるようです。マンガ『ラーメン発見伝』(小学館ビッグコミックスペリオール )では、作中のライバル役のラーメン屋経営者(いわゆる「ラーメンハゲ」)が、ネットの情報をもとにラーメンの実際の食べたときの味を無視してラーメン評論をする自称ラーメンマニアに陰口で悪態をついています。これにリアリティを感じるマンガ出版社があるわけですから、つまりマンガ出版社の目からも、世間一般の人って多くがそういうネットの風評に左右される人達だよねと見られているわけです。
本wikiもネットの情報の一部なので、鵜呑みにしないでください。お金は掛かりますが、参考文献などとして記載されているゲーム関連に役立ちそうな書籍を、読者は実際に何冊か買って、書籍の実物を読むなどしてください。あるいは実際にゲーム制作やプログラミングをするなどして、確かめてください、
文献『ゲームデザイン プロフェッショナル』では、著者の塩川氏が言うには、口コミやレビュー、プレイ動画によって「知った気になる」ことを有害であると戒めています<ref>『ゲームデザイン プロフェッショナル』、P.282</ref>。
だからゲーム作品を調査するなら、実際にクリアするまでプレイするか、あるいは十分なプレイ時間を投じてプレイしてみなければ、ゲームデザイナーにはあまり役立たないと、塩川氏は忠告しています。
たとえ短時間のプレイでは楽しく感じても、長時間のプレイや繰り返しの演出をされた場合には楽しくないような場合もあるので、だから長時間のプレイをして確認してみる必要があるとのことです。(以上、『ゲームデザイン プロフェッショナル』を参考にした。著作権の事情のため、言い回しや文体は多少は変えてある。)
ただ、これは一見するとゲーム作家には、「偏見なく自作を最後までプレイをしてもらえそう」とか思えそうですが、しかしプロの作家は暇人ではないので、同人ゲームまで含めて何でもかんでもプレイすることはできません。
塩川氏は、著作の別のページでは。若者に進めるゲームプレイとして、とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いと言ってます<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
これは裏を返すと、もし人気作や商業的な成功作でなければ、そもそもプレイすらしてもらえない、ということを意味します。塩川氏本人はそう言ってなくても、現実世界の時間は有限であるので、作品1つあたりのプレイ時間を延ばすことはつまり、1多くのプレイしてもらえない作品が生まれます。
つまり、塩川氏のプレイスタイルは、前提として、あるゲームについてプレイを開始するまでの条件が、めちゃくちゃ厳しいわけです。
イラスト業界でも類似の指南の事例があり、「アニメ私塾」といわれる有名イラストレーターは、YouTube動画などでプロのアニメ作品の模写の練習を進めていますが、しかし、おおむね発言内容「アニメ線画の模写ですら時間が何十分も掛かるので、練習に入る前にまず、その構図やデザインなどが自分にとって模写をする価値があるものかどうかを判定して、もし価値あると判定できた場合だけを模写しろ」と、判定にけっこう頭を使いなさい、と指南しています。
しかも「アニメ私塾」氏は、1枚の模写をどの程度まで模写すればいいかという質問に対しては「(模写先の手本に)似るまで模写しろ」とまで言っています。まるで、その1枚の手本を、模写のゲームクリアをするまで模写し続けるわけです。
さて、色々とゲームファンの問題点をいくつか前の段落で言いましたが、それでもゲームはアニメや漫画と比べるとまだしもマシであり、なぜならゲームではプレイヤーと、プレイしてない人たちの区別がしやすいからです。
これがアニメや漫画になると、もはや違法サイトで違法配布されたマンガを読んでるだけの人なのか、
実際に購入してプレイした人なのかの区別が困難になります。
実際、中国や韓国などでは、違法の無料配布されてしまったマンガがネットに溢れてしまった時期があり、
そのような事情もあり金融業界などはマンガ産業への投資を渋り、代わりに課金をしやすいオンラインゲームに投資をしたという経緯があります。
}}
文献『ゲームプランとデザインの教科書』によると、アナログゲーム(カードゲームやボードゲームなど)の設計の例ですが、ネット上の意見ではなく実際の目の前のテストプレイヤーの意見であっても、気を使ったりして本音を言わないことも多いので、意見や感想よりも実際のプレイを観察して、「プレイヤーがルールを勘違いしてないか?」など色々と観察するのが良いといわれています<ref>『ゲームプランとデザインの教科書』、P338</ref>。
{{コラム|イナズマイレブンの人気投票呼びかけ事件|
イナズマイレブンという、男子小中学生くらいの子供をターゲットにした、サッカーのゲームおよびそのアニメ化作品があります。実際、ゲームなどでも平仮名を多用しているし、アニメなどでも振り仮名が多いですので、常識的に小学生くらいの子供がターゲットでしょう。
さて、このイナヅマイレブンの公式サイトが、ネット上での登場キャラクターの人気投票を行いました。
作品中で、「五条」(ごじょう)というマイナーな中学生キャラで、おっさんぽい顔のメガネで目が隠れて何を考えて分からない不気味な雰囲気の悪役っぽいキャラがいるのですが、ある有名な匿名掲示板のスレッドで、このキャラクターへの組織票の投票を呼びかけました。
その掲示板は、どう考えても子供が見ないような掲示板なのですが、しかし投票の結果、五条が一位になりました。
もし「ターゲット層の小学生の子供達が実は五条が一番好きだった」という理由ならそれでも構わないのですが、しかし投票の前後で「五条が子供に一番人気」という現象は特に観測されませんでした。「五条も子供に人気」という現象はあるかもしれません。ですが、「五条が子供に人気」という現象は結局は起きていないでしょう。
ネットの投票では、このような不合理な亊がたびたび起きます。
まず、年齢制限などをすることが不可能な場合が多いです。
また、本来なら「一人一票」などとしたくても、技術的な理由で不可能な場合もあります。
例えば、一人一票のために例えばツイッターなど外部サイトのアカウントを要求しようにも、しかし子供だとネット上のアカウント持つこと自体が不可能な場合もあります。たとえばツイッターの場合、年齢制限として13歳以下は利用不可能ですので、結果的に、小学生むけのアニメの人気投票をツイッターからの投票を呼びかけようとしても、技術的に不可能です。
アイドルグループのAKBなどでは、発売するCDに投票券などをつけることで、本当にカネを出して商品を購入したターゲット層だけが投票できるように工夫する場合もあります。ただし、AKB方式はこれで別の問題があり、一人の熱心なマニアが何票も投票したくて一人で何枚も同じ曲のCDを買うなどする、一般人とはかけ離れた購入行動をする事例があります。
また、アカウントなどを要求しない投票の場合、一日ごとに追加投票できてしまう場合があります。だから暇な人ほど、多くの投票をしてしまいます。
;「美人投票」
経済学で、「ケインズの美人投票」という理論があります。これは、金融における株の購入行動では、人々は自分が良いと思っている株を買うのではなく、世間が「この株は上がるだろう」と思っているだろうと予想した株を買うというものです。
ですが、この五条の投票の場合はもはや美人投票ですらありません。ネットのある集団が、自分たちのコミュニティをアピールするために、意図的に、子供からは美男子・美形・好印象だと思われないであろうと予想したキャラに投票しているわけです。まるで逆美人投票です。
;ノイジー・マイノリティ
世の中には、「口数は多い割には、人数は少ない」という集団があるのです。そのような集団を称して ノイジー・マイノリティ と言い、「うるさい少数派」という意味です。
しかし、うるさいだけの人に限って、企業などからは嫌われるので仕事がなかったりして、ネット上では口数が多いのです。
よく仕事や学生でも学校や家の軽作業などで、「口ばっかり動かしてないで、手を動かせ」などと年上から注意される事があると思いますが、まるでその逆の集団です。手を動かさない人は、口数でしかアピールできないのです。投票とは、そういう人にすら投票権を与えるという意味でもあります。
アニメやマンガなどの投票に関わらず、現実の政治の国会議員などへの投票でも、ある政治家へのネット掲示板などでの賛同は多いが、しかし実際に選挙をしてみると支持票がそれほど多くないという事例もよくあります。
また、暴力団などでは「総会屋」と言って、企業の株を少数でいいので購入し、株主総会での意見をよそおって、難癖をつけるぞとおどすことで、金品を要求するという手口も平成初期までは、よくありました(現在は規制されており、総会屋しづらくなっています)。一株など少数の株でも発言できてしまうので、こういう悪事が出来てしまったのです。
}}
文献『レベルデザイン徹底指南書』では、現実世界で自分が新しいスキルを1つ覚えたら、古いスキル1つはどれか封印する必要があることを説いています。たとえば会社で自らの希望によってグラフィッカーからプランナーに役職が変わったら、グラフィッカー時代のスキルは封印する必要があります<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。(参考文献では「デザイナー」と言ってますが、デザイナーは多義語でありイラストレーターの他にも開発リーダーなどの事を言う場合もあるので、本セクションでは「グラフィッカー」に言い換えた。)プランナーがグラフィッカーの仕事まで掛け持ちしたら、過労死してしまいます。
現実世界の仕事では時間が限られているので、そういうスキル封印が必要なのです。
{{コラム|一人で何でもできるか?|
「と学会」の人が2010年ごろにニコニコ生放送の番組に出演したときに言ってたのですが、どこかのマンガ出版社に対して、「と学会」のその人はマンガ原作者にネタ提供したことあるとの事です。
大衆は、漫画家を一人で何でもできる万能の人だと錯覚したいので、そういう大衆を喜ばせるために、アドバイザーが隠れて、漫画家の知らないネタでしかも読者にウケそうなネタのアイデアを提供をするのです。マンガ作品のクレジットには書かれませんが、そういうビジネスがあります。
もっとも、業界によってはアドバイザーがクレジットに記載される場合もあります。たとえばテレビドラマやアニメなどだと、「考証」や「監修」などで、関連するジャンルの専門家がアドバイスすることもあります。たとえばNHKの歴史大河ドラマなら、東大あたりの大学教授で歴史学教授といったプロの歴史学者が、監修についている場合もあります。
アニメではそこまで行かなくても、ミリタリー物のアニメなどで、実際に銃器を仕事であつかった経験のある人が監修をついていたり、軍事雑誌の記者などが監修についたりとか、そういうこともあります。
}}
{{コラム|可処分時間|
21世紀のビジネス用語で「可処分時間」という概念があります。
もともと「可処分所得」という経理などの用語があり、
「可処分所得」とは労働者が給料のうち、税金や社会保険料など支払いが義務付けられているものを差し引いた、
残りの(法的には)自由に使えるぶんの金額です。
実際には、水道光熱費といった公共料金など自由といえるかどうか分かりませんが、この議論では本質的ではないので深入りしないでおきます。
さて、可処分時間とは、可処分所得になぞらえて、可処分時間とは、おおむね、「1日のうちの自分の起きている時間のうち、労働時間などを差し引いた、残りの自由に使える時間」という意味です。
可処分所得に限りがあるように、可処分時間にも限りがあります。だから、商売の競争とは、消費者の可処分所得の奪い合いであると同時に、消費者の可処分時間の奪い合いでもあるのです。
1つの他人の作品に投じる可処分時間を増やしたら、当然ですが、他の作品への可処分時間の投入量が減ります。
こういう厳然たる事実があります。「可処分時間」という用語までクリエイターが覚える必要はないでしょうが、しかし消費者の時間に限りがあるという事実からは決して逃げることができないのです。しかもよく評論で「エンタメ界隈は、可処分時間の奪い合いの産業である」とも言われます。
クリエイターだって時間に限りがあります。たとえば、休日にもし自主制作の作品をつくっていたら、当然ですが、他人の作品を鑑賞する時間は減ります。
}}
=== クリア保証と戦術性のジレンマ ===
==== クリア保証 ====
ドラクエのレベル成長のシステムは画期的であり、どう画期的かを一言でいうと「クリア保証」である<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>。どういう事かというと、参考文献のリンク先の記事にも書いてあるが、ファミコン以前の1980年代のアーケードゲームではプレイヤーが上手い操作を学習しないとクリアできなかったが、しかしファミコン以降の家庭用RPGでは、プレイヤーの興味ないことは学習しないでも、代わりにレベル上げなどに多少の時間を掛ければゲームクリアできるようになったのである。
たとえば、プレイヤーが攻略法のわからないダンジョンでも、最悪の場合でも経験値かせぎに多少の時間を掛ければ、そのダンジョンのボスを倒せるなどして、かならず最後にはゲームクリアが出来る、というような事でもある。
その他の例では、たとえばゲーム終盤になってから未探検だった序盤の一部ダンジョンを冒険する際、プレイヤーには既にもっと難しいダンジョンを冒険してるのでその未探検ダンジョンから学習できることは少ないが、プレイヤーキャラのレベルが高いために未探検の序盤ダンジョンの敵はプレイヤーにはすでに弱くなっているので、その残っていた未探検ダンジョンにあまり苦労せずに時間を掛けなくてもダンジョンクリアできるように、難易度が上手い感じに自動調節<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>されるなど、RPGのレベルシステムおよび類似システムにはそういった側面もある。
要するに、
:* クリア保証、
:* 難易度の自動調整機能、
の2つが、ドラクエ的なレベルシステムの面白さの本質的・醍醐味であるとのことである。
リンク先の人の意見ではないが、このクリア保証のないデザインのRPGは(RPGでも古いゲームやフリーゲームなどで時々みかける)、表面的にはドラクエ的なインターフェースやステータス画面であっても、中身は似て非なるものであろう。
ファミコン時代の古いゲームなどのバランス調整の失敗(作者にとっては意図的かもしれないが)でよくある失敗として、レベルの上昇の上限を低いところに設定しすぎて、クリア困難になる事例があった(ドラクエ2がそれに近い)。なので、現代への教訓としては、そもそもレベル制限は十分にとるのが安全であろう。
RPGに限らず一般に、ゲームの後半に行くに従って、次ステージ攻略などのための事前準備の増加や、試行錯誤の時間の増加に時間のかかるようになっていく事が多い。そして、ステージクリアに必要な時間の増加が、ゲームを苦手とするプレイヤーに、そのゲームのクリアを諦めさせて挫折感を味あわせてしまう原因になる場合が、少なからずある<ref>[http://endohlab.org/paper/whydoplayersdrop.pdf 遠藤雅伸『ひとはなぜゲームを途中でやめるのか?-ゲームデザイン由来の理由-』6.まとめ] 2020年12月21日に閲覧して確認. </ref>。
=== 自由度 ===
文献『ゲームクリエイターの仕事』(翔泳社)によると、一本道のゲームではなく攻略ルートが複数あって自由度があるゲームの場合、それら複数のルートも考慮する必要があります。ゲームの自由度が多くなれば、その「場合の数」に応じて、調整の際に考慮する事項も増えます<ref>『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖!』、P78</ref>。
=== 勉強の方法論 ===
※ バランス調整に限った話題ではないが、他に適した単元が見つからないし、メインページに書くほどでもないので、間借り(まがり)的にバランス調整のページで書くことにする。
==== 共通言語 ====
ゲーム業界人たちは商売人なので、いろんなゲームをプレイするように推奨します。しかし現実には、それは費用的にも時間的にも不可能です。
商業ゲーム会社でゲームデザイナーになりたいのなら、人気作のゲーム知識は必要です。手本とするためという理由の他にも、スタッフなどに開発コンセプトなどを説明するためにも過去作のゲーム知識が必要になります」(いわゆる「共通言語」)<ref>『ゲームデザイン プロフェッショナル』、P278</ref>。
とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いといわれています<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
==== 前後比較 ====
ゲーム制作において、人気作や人気シリーズを、手本の中心にすえる必要があるが、しかし、けっして人気ゲームだけをマネしようとしてはいけない。名作が名作である意義を確認するためには、同時代の他社の作品や、それ以前の過去の作家の作品に、どういう欠点があったを把握する必要がある。そうした前後関係の比較により、理解が深まる<ref>[https://news.denfaminicogamer.jp/interview/200615a/3 吉田寛・松永伸司『“ゲームらしさ”をもっと深く語りたい!そんなあなたのためのゲームスタディーズ入門』、電ファミニコゲーマー、2020年6月15日 12:02 ] 2020年11月27日に閲覧して確認.</ref>。
なお、同様のノウハウはアニメ研究の業界でも1990年代から語られており、たとえばアニメ評論家の岡田斗司夫や氷川竜介などが、絶版になってしまったが岡田らの共著『国際おたく大学―1998年 最前線からの研究報告』などの書籍の中で例を述べており<!-- 手元にその本が無いので、もしかしたら別の著作かもしれないが、岡田らの共著のどれかではある。 -->、たとえばアニメのガンダム初代がリアリティゆえに名作であることを評論したいならば、それ以前の時代のロボットアニメが如何にリアリティが欠けていたかを実際にビデオなどで視聴するなりして確認しなければならないと岡田・氷川らは述べていた。
ともかく、ゲームでも、名作ばかりプレイしていてもダメであり、つまり知名度だけでプレイするゲームを選んでいては、他のクリエイターに利用されて養分になるだけであろう。
岡田斗司夫と「と学会」の著作した『 岡田の国際おたく大学―1998年 最前線からの研究報告』では、書籍中で、ゲーム作家を経験した演劇作家の鴻上尚史(こうがみ しょうじ)の失敗例を東大生が取材したレポートを紹介しているのですが、岡田がそのレポートを評して言うには、おおむね「成功例から学ぶたがる人は多いが、しかし成功例だけから学ぶのは素人。プロは失敗例にこそ学ぶ。」というような感じのことを言っています。
工学の世界では、『失敗学』という概念が畑村洋太郎によって提唱されており、2002年の畑村の論文<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>や、2000年には畑村の著作『失敗学のすすめ』が出版されています。
(wikipedia日本語版には「2005年」に出版とあるが、間違いである。2002年の論文で、2000年の畑村の著作が参考文献とされている<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>。)
実は、2000年よりも前に、ゲーム産業限定ですが岡田が「失敗にこそ学ぶべき」といった内容のことを提唱しています。なお、畑村の論文の末尾の参考文献欄には、『 1) 畑村 洋太郎 編 著:続・続 実際の設計― 失敗に学ぶ .日刊工業新聞社,1996.』とあります。
{{コラム|失敗とスポーツの例え話|
ビジネス書で昔からよく言われるのですが、新しいことへのチャレンジには失敗はつきものです。
でも、新しいことにチャレンジして経験を蓄えることが、今後の成功につながるのです。もし失敗をおそれて新しいことにチャレンジしなくなったら、もはや次の成功にはつながりません。
失敗しないけれど成功もしないで市場から淘汰されることになるよりも、失敗してもいいのでそれ以上の大成功をおさめて市場で行き続けることができればいいのです。
よくビジネス評論ではスポーツに喩えられるのですが、スポーツのサッカーや野球などの試合にたとえれば、3点を奪われても、こちらが5点を得て結果的に勝てればいいのです。
逆に、1点しか奪われなくても、こちらの得点が0点なら、試合には負けます。
だから、「試合での負け」に相当するような致命的な失敗さえ、回避できればいいのです
「たとえ失敗しても、試合に負けなければいい」のです。「失点しても、試合に負けなければいい」のです。
塩川氏も、失点しても試合に勝てれば良いという内容のことを書籍で発言しています<ref>『ゲームデザイン プロフェッショナル』、P.334</ref>。
さて塩川氏の著作では、失点でない単なる「ミス」を「不具合の発生」、「失点」をユーザーの不利益、「負け」を「売り上げの低下やユーザーの離脱」(長いので抜粋)などと定義しています。
塩川氏の意図は分かりませんが、少なくとも新しいことにチャレンジすれば、未知の失敗は起きますので、ITソフト業界なら、それによる不具合の発生が起きます。
その不具合の結果、ユーザーに不利益が一時的に生じることはあります。しかし、そういう一時的な不利益は、新分野の開拓では避けられません。
ユーザーで実験する前の、最低限の手元や仲間内での実験は必要でしょうが、しかし未然の実験で今後のすべてのミスを防止することは不可能です。
}}
=== 異業種の立場を想像しよう ===
ゲームにかぎらず、文芸でもイラスト趣味でも、、狭いコミュニティ内の内輪ウケばかりに特化していって衰退していっている文化は多い。そうならないように気をつけよう。
内輪受けのマニア化による初心者忌避による衰退をうまく表現できている言い回しとして、プロレス業界の格言ですが「マニアが業界を潰す」という格言があります。なお、この発言は2012年に新日本プロレスリングを買収したゲーム会社のブシロードが買収時に述べた発言「すべてのジャンルはマニアが潰す」が元になっているので、まさにゲーム業界の反省にもとづく考察でもあります<ref> [https://newspicks.com/news/4135958/body/ 『【最終話・木谷高明】すべてのジャンルはマニアが潰す』 2019/10/5 ] 2021年11月7日に確認</ref>。(ブシロードの文脈とは違うかもしれませんが(出展の外部リンク先が有料なので読んでいないので)、本wikiでもおそらく後述していますが、ゲーム業界では1990~2000年の一時期、ジャンルによってはゲームが高難易度化した作品が多くなって、そのため新規参入者が苦手と感じてプレイヤーが減って衰退縮小していったジャンルが幾つかありました。)
なので、ゲーム製作のこういった予備知識のないファンコミュニティの意見ばかりを鵜呑みにして聞いていると、初心者を遠ざけた高難易度ゲームと化してしまうおそれもあります。
特にゲームセンターにある対戦格闘ゲームでは、「初心者狩り」といって、初心者が筐体で練習したくても、熟練プレイヤーが参入して初心者を負かして初心者がゲームプレイヤーになるので、初心者は練習できない。・・・その結果、気がついたらそのゲームの新規参入層が減っていった・・・という事例がありました。
ゲームにかぎらず、スポーツなどの競技の人気でも、似たような現象が見られます。競技というジャンル自体が技巧などを競うものなので仕方ない面もありますが、なんとかして初心者を遠ざけない工夫はゲーム屋には必要でしょう。
ともかく、上述のような色々な理由で、作家側は、体感の難易度が、本当は難しめのゲームなのに「やさしめ」に感じがちである。
実際、日本のゲーム史でも、1990年代の前半ごろは、ゲームの難易度が「むずかしめ」に調整されがちであった。しかし、その結果、世間では「最近のゲームは難しい」と感じる人が増え、日本のゲーム人気は一時期、衰退し、アニメ産業などに人気を取られる事態になった。
{{コラム|作者は答えを知ってしまっている|
バランス調整とは少し違いますが、作者はネタバレを知ってるので、シナリオに感動できないわけです。
これは、ハドソン(ゲーム会社名)の『新桃太郎伝説』(スーファミ版)の攻略本『新桃太郎伝説 究極本』(KKベストセラーズ 刊)で、作者の さくま あきら が、読者インタビューに答える形でそう言っています。
ゲーム雑誌での読者からの「ゲーム中、もっとも印象に残ったシーンはどこですか?」という旨の質問に対し、さくま氏は「作者はシナリオの答えを知ってるので、もっとも印象に残るとかそういうのはありません」的な内容の返答をしています。
}}
;ティッシュテスター
さて、作者バイアスでバランスが分からなくなるのは作者だけではなく、テストプレイヤーやデバッガーも、そのゲームに慣れてゆくと、次第に感覚が一般プレイヤーとズレていき、テストプレイヤー達もゲームの適切なバランス側が分からなくなっていく。
このことを比喩した表現として、「ティッシュ テスター」(tissue tester)という用語がある。使い捨てティッシュが1枚あたり1度しか使えないように、そのゲームに予備知識の無いテスターも、一度しか使えないのである。「フレッシュミート」(新鮮な肉、fresh meat)とも言います。
かといって、テストプレイヤーの人数にも限りがあるので、ゲーム作者は、たとえ自作ゲームのバランス調整が不完全でも、最低限の調整をしたら、もう「えいやっ」と(フリーゲームや同人ゲームなら)ゲームのver1.00および以降バージョンを出さざるを得ない。
単にバグを探すだけのデバッグ用テストならティッシュテスターでなくても可能ですが、しかしバランス調整ではティッシュテスターがいたほうが効率的です。
=== 要素の相互関係 ===
==== 概要 ====
文献『ゲームデザイン プロフェッショナル』によると、調整は、関連あるものを、まとめて同時期に、ただし1個ずつ調整していきます<ref>『ゲームデザイン プロフェッショナル』、P.182</ref>。
このため、まだ関連ある要素を実装しきっていない段階では、調整しません。だから開発の最初から調整することは、まず無いでしょう。
しかし、場合によっては、要素の実装をそろうの待つと調整開始の時期が遅くなりすぎてしまい、計画に支障が出る場合があります。そういう場合、ある程度のまとまりのある実装ができた段階で、調整をするようです。
具体的な調整の判断基準については、参考文献『ゲームデザイン プロフェッショナル』を買ってお読みください。
もし読者が練習として、てっとり早くレベルデザイン・バランス調整の経験を積みたい場合、角川書店(現: KADOKAWA)の『RPGツクール』という制作ツールで実際にゲームを作ってみるのが良いでしょう。文献『レベルデザイン徹底指南書』(大久保磨 著)でも、RPGツクールによる練習・勉強を進めています<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。
==== マップと敵の相互関係 ====
ゲームバランスを決めるのは、敵の強さだけでなく、マップの構成、さらにRPGのダンジョンなら宝箱の中にあるアイテムや装備品の強さ、などなどのさまざまな要素が加わります。
宝箱もマップの構成要素ですから、広い意味では宝箱もマップだとすると、つまり敵そのもののの強さだけでなく、マップもバランス調整に大きく影響します。だから、もし仮に時間が無限にあるのなら、理想的には、ダンジョンなど各ステージののマップが実装されてからバランス調整を行うのが理想でしょう。
しかし、実際には、マップの実装は、なかなか時間の掛かることです。特に、マップを考えることは、そのステージの世界観などを考えることでもあるので、そういった理系的ではない文系的なことも考えなければなりません。
マップに敵を組み込む方式で調整する場合だとマップの実装を待っている間にはバランス調整が出来ないのも、なかなか難しい問題です。
だからマップと敵の調整の順序は、おそらく人や会社によって色々な方式があると思います。たとえば、
:マップを作ってからそのマップに敵を組み込んでみてプレイしてみて、敵の強さを決めるのか、
:それとも敵の強さを決めてから、マップを決めるのか、
:あるいはマップと敵を別々に決めてから、最後に組み合わせて微調整するのか、
などなどです。
ご自身の作品にあった方式をお選びください。
===== 始めよければ全てよし =====
さて、ゲームが長編になる場合、まずはプロトタイプ的に、序盤をやや多めに通しプレイをして、とりあえず序盤のバランスがゲームとして面白くなるように調整すると良いでしょう。
書籍『ゲームプランナー集中講座』でも、ゲームの初めと終わりの印象がよければ、途中のバランスが少しくらい悪くても楽しんでもらえると述べています<ref>『ゲームプランナー集中講座』、P236</ref>。
:※ なお、アニメ産業でも、実はテレビアニメは、第1話と最終話だけ、他のエピソードよりも予算が多めに作られるのが普通です(特に公言はされてないが、多くの作品で明らかにクオリティが違う場合が多い)。
とはいえ、ゲーム制作当初は、そもそも終盤のストーリーがまだ未完成だったりするので、意図せずとも、こういったプロトタイプ的に序盤をやや多めに調整する方法が自然に行われる事になるでしょう。
商業作品でも、たとえば攻略本やファンブックなどに書いてあるゲーム開発裏話などを見ると、RPGでは、(プレイヤーからは数値の見えない)敵の強さのほうを動かすことで、バランスを調整するという事例などもよく紹介されています。よくある話が、最終ボスなどの能力値です。原理的には、敵側の能力値ではなく、味方の能力値で調整したり、あるいは装備品で調整したりしてもイイはずですが、しかしよく開発裏話に出てくるのは、なぜか敵側の能力値の話題ばかりです。
たとえば、スーファミRPG『新 桃太郎伝説』では、最終ボスのパラメータのほうを調整していることが、KKベストセラーズ(出版社名)から出た攻略本『新桃太郎伝説究極本』に書かれています。(調整前はボスはもっとHPが多かった。)
:※ただし、あくまでRPG限定の話題。アクションゲームなどでは、違うかもしれない。
また、こういった調整順序の前提として、調整はゲーム序盤から順番に、ゲーム後半に向かって調整していくしかありません。
そのため、古いゲームなどでは、よくゲーム後半で、調整不足のために、極端に難しかったり、あるいは逆にあっけなく簡単すぎる後半だったりなどの話題も、よく聞きます。ドラクエ2の後半ダンジョンであるロンダルキア洞窟とその次ステージが典型です。
さて、プレイヤーに目立つ部分(たとえば味方キャラの能力値や装備品の性能など)を基準にして調整するといって、けっして全く数値をイジラないというワケではないのです。あくまで、(調整による変動幅の大きい敵能力値と比べたら、)「比較的には、味方キャラ関連の数値は、調整による数値の変動の幅が小さめ。敵の能力値は、調整による変動の幅が大きい。」という事にすぎません。
{{コラム|ノイマン「ゲーム理論」で説明できないのがテレビゲーム|
日本の人類学者の中沢新一は、ノイマンのゲーム理論で説明できないのが昨今のコンピュータゲームの特徴だと言っています。その発言の出典は忘れたのですが、人類学者で有名な中沢新一は近年、ゲーム産業に関心を持ち、たとえばナムコ出身の遠藤雅信などとも対談しています<ref>https://news.denfaminicogamer.jp/kikakuthetower/nakagawa-endo_bb/2 『ゼビウスからポケモンGOまで… 国内ゲーム史を遠藤雅伸氏と『現代ゲーム全史』著者が振り返る。中沢新一氏も壇上に登場!【イベントレポ】』 2017年4月12日 12:30 公開 ] 2022年1月18日に確認. </ref>。(なお、リンク先イベント記事の司会役の「中川」氏とゲストの「中沢」氏は別人なので、混同しないように)
ゲーム理論の用途としては、現代日本の学問では、政治的局面での外交戦略などを語る際によく政治学書で用いられたりします。ただし、そのゲーム理論でも、中沢新一によると、それでコンピュータゲームを語るのは不足だという事です。
中沢は特に言及していないですが、数学的にモデル化するなら、政策応用なら「国際情勢」など外交的な制約によって出力にとりうる値1個あたりの幅や個数が2~3個に限定されたりのような、値の個数が十分に小さくて有限の整数個の場合でないと、なかなかゲーム理論の応用は効果を発揮しません。
(20世紀の天才数学者 フォン・ノイマンの)『ゲーム理論』のような出力値に選べる個数が極端に少ない理論は、コンピュータゲームの調整では不足でしょう。本ページでも、ノイマンのゲーム理論については、版にもよりますが、このコラム以外では特に言及していないだろうと思います(2022年1月までの時点では、ノイマンのゲーム理論には言及していない)。
さて中沢の意見ではないですが、そもそもゲーム理論についてノイマンについての出典として、たしか数学者の森毅(もり つよし)のエッセイ本だったと思いますが、ゲーム理論はもともとノイマンが第二次大戦中の亡命中か何かにトランプのポーカーを参考に考えついたらしいです。
ネット上のゲーム評論では、経済由来の表現でよく使われる表現は、ゲーム理論ではなく「インフレ」「デフレ」などといった表現です。
経済学を知らなくてもゲームは製作できるでしょうが、どうしても経済学を参考にするなら、ゲーム理論よりも物価政策のほうを勉強したほうが良いかもしれません。
一応、書籍『ゲーム作りの発想法と企画書の作り方』ではゲーム理論も紹介されていますが、しかし具体的にどうゲーム作りにゲーム理論を応用するかは書かれていません<ref>『ゲーム作りの発想法と企画書の作り方』、P64</ref>。
}}
=== 各論(デザイン的なこと) ===
どの程度、レベル上昇でキャラクターを強くすればいいかについては、ハドソン社あたりでの有名な慣習があり、新しく訪れたダンジョンなどでは「レベルが3上がると、敵を1撃で倒せるようにすべし」という有名な基準があります<ref>『ゲームプランとデザインの教科書』、P.94、 ※ 著者のひとりの「平川らいあん」氏はハドソン出身</ref>。他社ゲームでは別かもしれませんが、だいたいスーファミ時代の桃太郎伝説シリーズはこんな感じに調整されているはずです。
== RPGのダメージ計算式 ==
=== 特化型が有利になりやすい ===
文献『ゲームプランとデザインの教科書』によると、ファミコン時代のゲームに限らず、21世紀の現代的なゲームでも、「なんでも平均的にできる」キャラクターよりも「○○だけなら自分が一番強い」といった感じの特化型のキャラクターが戦闘では強くなりやすい傾向があります<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.227</ref>。対して、バランス型は「器用貧乏」になりやすいのが現状です<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、、2018年11月1日 第1版 第1刷、P.227</ref>。
なお文献『ゲーム作りの発想法と企画書の作り方』によると、ダメージ計算式を考えるのは(プログラマーの仕事ではなく)ゲームデザイナーの仕事です<ref>『ゲーム作りの発想法と企画書の作り方』、P145</ref>。
では、特化型が有利になりやすい原理を、これから説明していきます。
たとえば、キャラクターに能力をプレイヤーが自由に選んで振り分け配分できるシステムのゲームがあったとしましょう。(商業ゲームでも、いくつかの作品で、似たようなシステムのRPGがあります。)
説明の単純化のため、合計値が必ず100だとしましょう。
つまり、たとえば下記のようになります。
;作成キャラの能力例
:(※ 合計100)
ちから: 10
たいりょく: 30
しゅびりょく: 10
すばやさ: 40
きようさ: 10
さて、別の作成キャラ例を考えます。
;平均型キャラA
ちから: 20
たいりょく:20
しゅびりょく: 20
すばやさ: 20
きようさ: 20
:(※ 合計100)
のように、能力値を平均にふりわけたキャラクターと
合計値は同じですが、特定のパラメータに特化して能力値を振り分けした
;特化型キャラB
ちから: 40
たいりょく:20
しゅびりょく: 30
すばやさ: 5
きようさ: 5
:(※ 合計100)
のようなキャラクターを、
コンピュータ上でRPGの戦闘システムのアルゴリズム上で対戦させた場合、
ほとんどの20世紀のRPGのアルゴリズムでは、特化型のキャラBのほうが勝ち、つまり特化型のほうが強くなってしまいます。
さらに言うと、たいてい「攻撃力」のような、敵にダメージを与える意味のパラメーターに振り割ったほうが、キャラクターが強くなるゲームのほうが多いです。(ファミコン時代から、ウィザードリィ1の攻略本でそういわれていました。敵モンスター『ワイバーン』あたりの攻略法として「攻撃は最大の防御」という格言を出しています。表紙の黒かった攻略本なので、たぶんゲームアーツの本。『ウィザードリィ攻略の手引き』(MIA BOOKS)かと思われます。)
なぜこうなるかと言うと、なぜなら、もし攻撃力が上がると、敵を倒すのに要するターン数も減少するので、結果的に敵を倒すまでに自キャラの受けるダメージ量も減るからです。(なお、現実の軍事学でも、似たような事が言われており、戦術論ですが、クラウゼヴィッツ(近代ドイツの軍事学者の一人)は防御重視の作戦よりも攻撃重視の作戦のほうが有利だと述べています。防御だけで攻撃しなければ、現実でもゲ-ムでも戦闘では絶対に勝てません。)
裏を返せば、平均型能力のキャラは、多くのゲームシステムでは弱くなりがちです。
パラメータの振り分けは自由ではないですが、ドラクエ2(ファミコン版)でいう、サマルトリア王子が弱くなる現象です。ファイナルファンタジー3・5の赤魔導師も、似たような弱点を抱えています。
理由はいろいろとありますが、バランス側の弱くなりやすい理由のひとつとして、参考文献などは特には無いですが、
:・ウィザードリィやドラクエなどの古いRPGのアルゴリズムが、特化型に有利になっているという歴史的な経緯。
:・命中率などの確率に関わるパラメータ(「器用さ」)のある場合、パラメータ割り振り前から既にある程度の底上げ補正がされている場合が多いので、わざわざ命中率を上げると割り損になる。
:・「すばやさ」(素早さ)が攻撃の順番にしか影響しない場合、素早さが低くても1ターンに1度は攻撃できるので、素早さを上げると損。
などの理由があるでしょうか。
命中率に関しては、多くのRPGで、攻撃が外れるのは、プレイヤーに不満感を与えるので、たいていのゲームでは、ゲーム序盤のレベル1のキャラであっても、数値上での「命中率」や「器用さ」などの表向きの命中率が低くても、たとえば「命中率 40」と表示されていても、実際のゲーム内部での命中率はたとえば+20%されてて本当の命中率が60%だったりするような場合もあります。
このような底上げ命中率のあるシステムだと、20%底上げされる場合、命中率を80%以上に育てるのは損です。なぜなら100%以上には上がりようが無いからです。
命中率が101%以上の場合に特殊な追加スキルなどを獲得できるなら別ですが(たとえば、クリティカルヒットの確率がけっこう増えるとか)、たいていの古いゲームでは、そこまでの手入れをしていません。おそらく調整に時間が掛かるからでしょう。
=== ダメージ計算式 ===
さて、RPGの戦闘におけるダメージの計算式(「ダメージ計算式」といいます)に、アルテリオス計算式というのがあります。これは、昔のゲーム『アルテリオス』で採用された計算式なのですが、
攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
という計算式です。
ドラクエやファイナルファンタジーのシリーズの計算式はもっと複雑なのですが、どのRPGでもダメージ計算式の基本的な設計思想・方針はアルテリオス計算式と同じです。
アルテリオス以外のダメージ計算式でも、たとえば
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
というような感じの計算式である作品も多いです。
せいぜい、変数の前に定数係数が掛かっている程度です。
なぜ、どの会社のRPGでも、この程度の中学校レベルの単純な計算式なのかというと、バランス調整が簡単だからです。
バランス調整するのは人間なので、もし、ダメージ計算式があまりに複雑な方程式であると(たとえば量子物理のシュレーディンガー方程式みたいなのだったりすると)、そもそもバランス調整担当の社員が理解できません。
そして、このアルテリオス式を見ると分かるのですが、
:攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
もし自軍の攻撃力が0の場合、敵にダメージを与えられないので(ダメージが0)、絶対に負けてしまいます。つまり、攻撃力が敵の守備力を下回る場合も、絶対に負けるのです。
一方、「すばやさ」パラメータが戦闘の先攻/後攻の順番にしか影響しない場合、素早さが0であっても、勝つことは可能です。
また、守備力が0であっても、勝つことは可能です。
このように、パラメータの種類ごとに、そのゲームにおいて重視・軽視の差があり、不公平になっている事が多いのです。
また、バランス型の能力値のキャラクターの場合、せっかく「ちから」を上げて攻撃力を上げても、守備側の守備力を下回っていると、ダメージ0になってしまい、絶対に負けます。
つまり、
自分の攻撃力 > 敵の守備力
でないと、アルテリオス式では必ず負けるのです。
一方、
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
のように係数を掛けた計算式の場合、
守備力を1ポイント増やしても、その効果は25%減少されます。(たとえばレベルアップの際に上昇パラメータを一種類選べるシステムの場合、守備力を選ぶと損になる場合が多い。)
いっぽう、攻撃力を1ポイント増やすと、効果は30%増しです。
このように、計算式によって、有利/不利なパラメータという格差が生じます。
=== DPS (Damage Per Second) の概念 ===
:※ 出典は無いが、あまりに有名な概念なので、さすがに消さない。
最近のRPGゲームには攻撃コマンド選択時に「二段斬り」などのスキル選択ができます。
スキルを設計するとき、昔の初心者のやりがちなミスとして、最近は減ってきましたが、スキルの結果の見かけの数値にゴマかされて、実はスキルが強くなってない特技を設計してしまうミスが時々ありました。
たとえば典型的なのは特技『ためる』です。これは、次回ターン時のダメージを数倍に倍増し、次回ターンの1回だけ、ダメージを倍増させる特技です。
この『ためる』は必ず、次回ターン時のダメージが2倍を超えないと(たとえば2.5倍にならないと)、無意味です。
なぜなら、『ためる』コマンドを選択したターンは、攻撃をしてないからです。
つまり、スキルを使わずに普通に2ターン通常攻撃した場合、ダメージ量は単純計算で
:1+1=2
より、2ターンぶんのダメージです。
いっぽう、『ためる』コマンドを使えば、それがもし2倍しかダメージが倍増しない場合、
:0+2=2
で、結果は同じ通常攻撃2発ぶんのダメージのままです。
計算すれば子供でも分かる理屈ですが、しかしファミコン時代には市販の商業ゲームですら、こういうミスがありました。たとえばファイナルファンタジー3の職業『空手家』のスキル『ためる』です。
このようなミスを犯さないために必要な概念としては、'''DPS''' ('''D'''amage '''P'''er '''S'''econd) の概念が便利でしょう。DPS とは1秒あたりのダメージ量、という意味です。
もともと欧米のアクションゲームについての理論研究に由来する用語なので、単位が 秒 (second)になっていますが、RPGに応用する場合には単位をターンに変えるなどして工夫しましょう。
このDPSの概念を使って、上述の『ためる』コマンドの設計ミスを説明すれば、つまり、1ターンあたりのダメージ量(DPS)が上昇していないのが問題点です。
では、私たちが改善策を考えましょう。数学的に考えれば中学レベルで充分で、
: 0 + x > 2
を満たす変数xを設計するだけの問題です。
なので、たとえば、『ためる』後の攻撃ダメージ量を「2.5倍」とか「3倍」とかの数値に設計すればいいのです。
では、次に応用問題を考えましょう。
「『ためる』を2回続けると、さらにダメージ量がアップ」などのシステムを導入するときも、必ずDPSが増えるようにしましょう。
たとえば、この場合、ダメージを与えるのに最低3ターンが必要なので、不等式を考えれば、
変数xについての
:0 + 0 + x > 3
を満たさないといけません。
つまり、『ためる』2回後のダメージ量は、最低でも「3.5倍」のように3を超える数値、あるいは整数に限定すれば、たとえば「4倍」とか「5倍」とかになっている必要があります。
== KPI ==
Key Performance Indicator という経営的な指標があり、『レベルデザイン徹底指南書』P140 および 『ゲームプランとデザインの教科書』P70 によると、共通しているのは後述の内容です。なお、『ゲームプランとデザインの教科書』P67 によると、オンラインゲームの運営などで使われる用語ですが、別にゲーム業界限定の用語ではありません。
;DAU(Daily Active User)
:デイリー・アクティブ・ユーザー
DAUとは、その日に遊んでくれたユーザーの人数です。
;MAU(Mathly Active User)
:マンスリー・アクティブ・ユーザー
MAUとは、その月に遊んでくれたユーザーの人数です。
;WAU(Weekly Active User)
:ウィークリー・アクティブ・ユーザー
WAUとは、その週に遊んでくれたユーザーの人数です。
;PU(Paying User)
:ペイング・ユーザー
課金ユーザーの人数のことです。その日を課金ユーザー人数をDPU、その月の課金ユーザー人数をMPUと言います<ref>『レベルデザイン徹底指南書』、P140</ref>。
;課金率
たとえば、ある月のユーザ数のうちの課金ユーザーの割合など、
一定期間中の課金ユーザーの割合を言ったりしますす<ref>『レベルデザイン徹底指南書』、P140</ref>。
あるいは、全ユーザーのうちの課金ユーザーのことだったりしますす<ref>『ゲームプランとデザインの教科書』、P70</ref>。(書籍によって、内容が微妙に違う)
;継続率
前月と比べて今月はどんだけユーザーが残っているかとか、あるいは前週と比べて今週はどんだけユーザーが残っているかのことを、
継続率といいます。
(以上)
このほかにも、色々な指標があります。
== 参考文献・脚注など ==
rp0wcj51zyrl9s6fzrp07d8d80j695y
206206
206192
2022-08-04T11:07:05Z
Honooo
14373
/* 本文 */
wikitext
text/x-wiki
{{substub}}
現在の版の著者達は、ゲーム戦闘の調整の経験はないので、現状では本ページの内容は調べ物としては役立ちません。経験があり、かつ人間性も良好な人の協力をお待ちしています。
==本ページの目的==
本科目『ゲームプログラミング』は、科目名に「プログラミング」とあるとおり、ゲームクリエイターのための教材ではなくプログラマーのための教材です。
従って、話題がプログラミング的な技術的な話題に片寄っています。一般のゲームクリエイターを目指す人には、本書のバランス調整の記述は到底、役立ちません。
プログラマーが、とりあえず何か趣味でゲームを作る際、バランス調整についての調べ物の手間を少なくするためだけの目的の教科書です。
……と、前編集者Suj. は書いたんだけど、その割にはこの人物の私欲を満たすためだけの駄文が結構くどくど書かれてる気がするんだけど…
気のせいか?まあまだちゃんと読んでないしね、熱でもあるのカナ? コロナか^^?
==バランス調整==
ゲームには難易度というものがあるが、そのゲームの面白さのため、あるいは商品としての購買力アップのため、調整し、最適値を見出す必要があるだろう。敵の強さや主人公の強さ、それらを調整し、最適値を見出すための調査、テストプレイなどが必要だ。
より普遍的に、バグ修正、操作性の改善、仕様実装の更新、そして今書いたバランス調整、ゲームを面白く、評価を高めるための様々な改善を、一般にチューニングと呼んでいる。
英語では、難易度の調整のことを「レベルデザイン」と言う。このレベルとは、高低差の意味で、欧米での昔の3Dゲームにおける、マップの高低差を意図しているらしい。このレベルを調整するツールをレベルエディタというが、このマップの高低差の調整で難易度が変わるので、しだいにレベルデザインが難易度の調整の意味になっていったという<ref>川上大典ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日第1版第1刷、P.57</ref>。
難易度デザイン、という言葉も使われている<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.58</ref>。
そして、難易度の調整にはマップの処理もあるので、3Dゲームのレベルデザイン担当者は、MAYAなどの3Dグラフィックツールの技能を持っているスタッフが多いという<ref>吉冨賢介『ゲームプランナー入門』、P234</ref>。
===詰み、を避けたい===
製品として販売するゲーム、そしてそうでなくとも、プレイヤーがセーブした時点でクリア不能な状況、仕様になっている、つまり、プログラムの流れとして事実上そうなっている、これを「詰み」、と呼んでいますが、それは避ける必要がある。
これはプログラムの構造の問題ですが、ゲームは進行の仕様自体かなりの複雑さを持っていますから、制作者が気付かないうちにプレイヤーがそこに追い込まれる可能性があり、これは娯楽であるゲームとしては避けたい事態です<ref name="twogc78">蛭田健司『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖』、翔泳社、2016年4月14日初版第1刷発行、P78</ref>。
まず、ゲーム全体のバランスとして、平均的なプレイヤーなら、妥当な労力でクリアできる調整も必要でしょう。
ゲームプレイで詰みに追い込まれるのは、プログラムの構造の悪さでもありますが、それを見つけ出すためには、具体的にテストプレイにおいて、少なくとも誰か一人のテストプレイヤーが、そのゲーム内で想定できるクリア困難な状況から、実際に挽回してクリアしたという、事実、実績が必要です。
つまりコンピュータープログラムで常にセキュリティの問題が発生するのと同様に、ゲームプログラムでは構造が複雑になりすぎて、詰みがプログラマーの想定を超えて発生する可能性があるので、実際のプレイで、実際のプレイヤーの現実の巻き返しで確認して調整したい、という事ですね<ref name="twogc78" />。
そして一方難易度調整として、平均的プレイヤーが平均的な労力でクリアできるようにしておきたい。
ちなみに現編集者の昔のゲームプレイ経験ですが、初代ファミコン版のファイナルファンタジーですね、番号は幾つだったか……市販の攻略本を読みながらプレイしていたのですが、あるところまでいった時点で、攻略本を読んでも、どう考えても先に進めない状況に陥り、まあ私のプレイヤーとしての技量にも問題あったのかもしれませんが、結局にっちもさっちもいかなくなって、プレイを放棄してクリアしないまま積みゲーになってしまったことがあります。もちろんそれでそのゲームの仕様が悪かったと主張するつもりはありませんが、プレイヤーの私としてはその時点で完全に詰んでしまったわけです。
===実はゲームプレイヤーだけではなく、あらゆる人間が面倒くさい、俺も、あんたもね^^===
……しかしあんまり面倒くさがると、結局最後には偉い人に怒られてしまうのがこの社会の常です^^;;;。
一般にゲームプレイヤーがプレイ中に面倒くさがることは、覚えること、計算すること、配ること、だと言われています<ref>『ゲームプランとデザインの教科書』,P342</ref>。
ゲーム中に、Wolfram|Alpha が使えるような仕様にすると、案外よかったりしてね^^
===ゲーム制作者はいろいろ考えて作っているだろうけど、プレイヤーだってそれに負けずに考えてプレイしている===
プレーヤーも制作者も、時代の流れとともに、色々な変遷はありますよね。
時々指摘されるようですが、昔よりの最近の方が、ゲームの難しさに関する感受性が大きくて、割と簡単にこのゲームは難しいと指摘されることが多い、と、言われている。
たとえば携帯ゲームにおいて、平均的なゲームプレイヤーがクリアまでに5回ゲームオーバーになるように調整されたゲームは、今では「難しい」ゲームと判断される<ref>『ゲームプランナーの新しい教科書』、P210</ref>。つまり昔のプレイヤーの方が我慢強かったってこと??
一方平均的なプレイヤーならゲームオーバーにならない難易度のゲームは、やさしいゲームと呼ばれることが多い。
だからもはやゲームの難しい易しいという言葉さえ、相対的で、結構人によって判断が違う。
2011~2013年頃のテレビ番組で、ゲーム業界を取材した番組、夜中の番組で、こういうものがあったという。
「昔の子供は、難しいゲームをプレイしたとき、「このゲームは難しい」と答えていたが、今の子供は「このゲームはつまらない」 と答える」
しかし実はテレビというのはこの社会で一番いい加減なメディアで、常に制作者に都合のいい印象操作、不当なイメージ操作が行われている。
つまり昔の子供より今の子供の方が愚かだというイメージを作りたいだけで、インチキな企業のためのいんちきな広告としての意味以外何も持たないだろう。
===商業だろうとそうでなかろうとゲーム制作はプレイヤーの事を考える、難易度はどうする?===
『ナナのリテラシー』という漫画、作者はゲーム好きで、ゲーム雑誌でも描いていたことがあるようです。ビジネス系しかもノウハウ系かな?2巻がゲーム会社回。
ゲーム会社の隅の老人経営者曰く(この漫画内の話ですよ)、「誰もが飛び越せる絶妙な難易度の壁をクリアさせる」、これがゲーム作りのコツじゃ^^!!!
この漫画、前編集者が書くにはかなり、そこそこ取材されているという。
「PS」(プレステ)のロードは、「1回のロードで2WMが限界。どんなマップも2メガに入れなくちゃいけない。会話も音楽も全部ね。」なんて描写があるらしい。
この老人の主張は作品自体の主張でも作者の主張でもないというが、しかし前編集者は重要な事だと考えているようだ。
しかし誰もが飛び越せる絶妙な壁をクリアさせて、消費者に快楽を与えて、ガッポガッポも儲けるにしても、人間には個性があり、性格や性質にもばらつきがある。
全ての人に等しく、偉そうに試練を与えて、それを乗り越えたから気持ちいい、と自己満足に等しく浸らせることは難しい。
だから、インチキにガッポがっぽ儲けるためには(←しつこい^^;;;)、ターゲット層をある程度はしぼりこむ必要がある<ref>『ゲームプランとデザインの教科書』、P.97 </ref>。
「遊んだプレイヤー全員が満足するものを、目指さない」との記述がある書籍もある<ref>塩川洋介『ゲームデザイン プロフェッショナル』、技術評論社、2020年10月3日 第1刷発行、P.173</ref>。ただこれはテストプレイヤーの意見を重視しすぎて振り回されないように、という意図がある記述だという。
ターゲット層を絞りこむには、実在の人物をイメージするのが良いと言う。「20代社会人男性が」、ではなく、自分の知人・友人・家族、あの人を面白がらせたい!!、と、いうのがいいようだ<ref>『ゲームデザイン プロフェッショナル』、P205</ref>。
{{コラム|カラケオは気持ちよく歌いたい^^|
80年代~90年代にカラオケが流行した。と、いっても今でも、盛んだけどね。俺も好き^^
カラオケの難易度は、利用者が楽しめるように易しめに作られているようですね。というか前の項目で書いた、絶妙な難易度らしいよ。そこそこ難しく、それを乗り越えると俺は偉いと自己満足にふけれるらしい。岡田斗司夫が90年代後半にその指摘をしていたというが、しかし本当に前編集者は岡田斗司夫が好きなのね^^;;;。
小室哲哉の曲が典型的にそれだという人もいるらしい。そういえば、NHKアニメーション「だぁ!だぁ!だぁ!」のエンディングは凄く良かったな^^。いや、もちろんこれは只の雑談ですが^^;;;。
エヴァンゲリオンの残酷な天使のテーゼは、監督やスポンサーのレコード会社プロデューサーが、子供でも歌いやすいように作曲してくれと作曲家に依頼している。
確かに凝った楽曲の割に、カラオケで歌いやすい^^
}}
{{コラム|作者の意図通りに視聴者が受け取るとは限らない。作者の意図とは全く別に受け手は作品を楽しむ。それが嫌ならそもそも創作するなよ。|
商業作品であるなら、最終的には売上によって作品の是非が決まる、なんて前編集者は書いてるけど、インチキ書くなよ、あくまでも金は商売としての是非、作品としての価値、意義は別の話だよ。
しかしこいつほんとにアフリマンなのね。金と物質以外何も見えないのか。
ゲームの話題としては、味の善し悪しはプレイヤーが決める、という言葉があるようですね<ref>『ゲームデザイン プロフェッショナル』、P.167</ref>。ターゲット層が、美味い^^!!、と、いう作品を作りたい。
ジブリアニメの『となりのトトロ』は、子供たちにアニメばかり見ずに外で遊ぶように啓蒙するようなストーリーを作者・監督の宮崎駿は目指したと言われています。
ところでこれ↑前編集者の文章だけど、完全なる虚偽だよ、いいかがんにしろ。あのねー、宮崎さんという人は確かに少し偏屈な大人だから、その手の事は時々言うけど、映画を作る時は基本的に、見た人に楽しんでほしい、夢のような時間を過ごしてほしい、そしてこの社会に生まれてよかったと、子供も大人も思ってほしい、そういう思いで、常にそれが第一テーマで漫画映画を作ってるの。
すじ肉先輩さー、あんた俺や他の編集者を何度も知ったかぶりって書いたけど、結局あんたが人類史上、唯一最大の知ったかぶりだね。そもそもあんた、トトロ、観てないんじゃないの?
ほんとにあんたってなにも見えてないのね。「うちの子は、よく宮崎先生のアニメを見ています。面白いアニメを作ってくださり有難うございます」なんて感想は全く問題ないだろ。宮崎氏だってありがたく受け取ってるよ。それに対してアニメばかり観ずに外で遊べ!!なんて言うのはお前とお前の同類のキチガイだけだ。
あとガンダムやエヴァンゲリオンでも似たような逸話があるとのことだが、こっちはどうでもいい。そもそもこれを作っている連中は、宮崎氏ほど切迫した気持ちで作っているわけではなく、ただ金が欲しくて自分が偉いと思いたいだけだから、作った方がどう思おうが、そいつらに金を与えて養ってる連中がどう思おうが、大したことじゃあないだろ?
}}
===チュートリアル===
ゲームをプレイするための、操作方法をプレイヤーが知って覚えるための入門的なイベントをチュートリアルというようですね。実は現編集者はあまり、特に最近はほとんどコンピューターゲームはしないので、ここの執筆をしつつもゲームについてはあまり知らない。
ただここの主要執筆者で、ゲーム大好き、プログラム大好き、アニメ大好き、自分自身も一応絵描き、そしてハイルオタキングの E.Suj. かなりひどい内容の文章を大量に書き散らすので、このサイトの参加者として嫌々多少書き直しをせざるを得ない。
そこでチュートリアル、これはふつうゲーム自体に組み込まれ、初盤がそれになりますが、これは別モードにすると良いという指摘がある<ref>『ゲームプランとデザインの教科書』、P401</ref>。
『不思議のダンジョン2 風来のシレン』が、このスタイルを採用している。
とはいえプレイヤーが必ずチュートリアルをプレイしなければ、ゲームを楽しめない構成なら、あまり大きな意味があるとも思えないが、しかしそうでない場合も多いだろう。
ゲーム構成の選択手として考えてもいいだろう。
===技能の習得としてのゲーム===
====ゲームをプレイしていることで、プレイヤーは何を知って、何を身につけているか?====
まあゲームをしていることで、プレイヤーは何らかの行為、練習を繰り返して、技能様の物を身につけていく、と、考えても、いい? まあいいか、とりあえずはそう見なしましょう。
ですからそこでプレイヤーが身に着ける技能を想定しておくと、上手にバランス調整が出来るという。
すじにく大先生が愛読している文献では、「教育的難易度」という用語を使っています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版第1刷発行、225ページ</ref>。まあゲーム関係者で教育について分かってる奴なんて、ほとんどいないだろうけど…
ここでの教育難易度とは、むしろ大先生の意図とは逆で、ある敵を攻略するのにプレイヤーがなんらかの操作が必要な時、まず1個だけのその敵の撃破用の操作技能だけをプレイヤーが修得できれば攻略できるようにしろと、つまり、プレイヤーが技能を覚えやすいように、難易度を下げろという事でしょう。
前編集者は本質的キチガイなので、とにかく世の中で自分が偉いことが何より大事なので「教育」という言葉を使いたい。一方で割と似たようなことを語る時に、学習という言葉を使っている文献もある<ref>『ゲームプランとデザインの教科書』、P.61 </ref>。要するにこの本の筆者の方が、E.Suj. よりまともな人間だという事でしょう。
ただ、プレイヤーの技能の習得という視点は、バランス調整の時に一番重要になるという。確かにゲームは技能や知恵、解決のための何らかの手段、鍛錬も必要だが、一方では間違いなく娯楽で、面白いものであるはずだ。
そしてゲームをすることで、自分の思考力が磨かれて、成長したという感慨を持つプレイヤーも多いようで<ref>https://www.teu.ac.jp/ap_page/koukai/2019_03_3endo.pdf 66ページ</ref>、全くその気持ちを否定する意図はないが、でもねー、ゲームっていうのは結局遊びなんだよ?
ゲーミフィケーションなんて言葉を使っていい気になっている連中もいるようだけど、まあその概念や運動がまったく意味を持たないとは言わないが、でもやっぱりゲームは娯楽であり遊びであり、ある程度堕落した、ある程度常識的な硬い世界からは非難される要素があるもので、あまり理屈を並べて自分たちの世界が高級なものだと主張しない方がいいんじゃあない?
{{コラム|ゲーミフィケーション|
どうもゲーム業界の連中が、自分たちの仕事を美化して、正当化したいため、ゲーミフィケーションがどうの、なんて言いだしたようだよ<ref>https://news.denfaminicogamer.jp/kikakuthetower/190731a</ref>。
2019年にゲーミフィケーション学会設立。もっともこの運動や概念がまったく意味がないものだとは、現編集者も言わない。確かにゲーム的な行為を、もう少し遊びから離れて、現実の有用な出来事に結び付けようというのは、それほど間違っていないし、意義はある。
2013年ごろからすでに、企業の新人研修で、ゲームの要素を取り入れた研修などがされていたようだ。
岸本好弘(ファミスタの父、と呼ばれているらしい)の言では、「ゲームの本質っていうのは、人間が頭で想像することの素晴らしさ」<ref>https://www.fantasy.co.jp/edutainment/article/interview16</ref>ってことらしいけど、なんか軽い言葉だね。想像には意義があるが、それってほんとに頭でするもの?
40年前(※1980頃?)、
:「そのころアーケードゲームのデザインで言われていたのは、初めてそのゲームに挑戦したプレイヤーでも3分間程度は遊べるようにすること。「もう一度チャレンジしたら、先に進めそうだ!」と、プレイヤーの気持ちが動くように制作すること」
ってことだけど、そうすれば子供が100円玉いっぱい入れて、お前らが儲かるってだけだろ?
:「これって、現在IT業界で言われるUX、ユーザーエクスペリエンスですよね。ゲーム業界では理論化、言語化していなかったけれど、40年前から現代に通じることをやっていたんだなと思いました。」
何かそれらしい言葉だけ踊ってかっこつけてるようにしか聞こえん^^;;;。
:「ゲームって全部「そそのかし」なんです。ゲームをプレイしていて、Aの洞窟に行きなさいとか、Bの洞窟には行くなとは言われないですよね。プレイヤーが2つの洞窟をぱっと見たときに「こっちの洞窟に宝があるかも!」って見えるように作っているんです。これを「そそのかし」って言うんです。」
まあそれはそれでいいけど、それってそんなに大したことかね?
: (抜粋)「先生は答えを教えるのではなく、生徒が自分で「わかった!」、「僕が一人で気が付いた!」と思わせることが大切。」
思わせるっていうのがすごいし、傲慢だよな。お前は神か?
: 「ゲームをデザインするのも授業をデザインするのも同じです。楽しいと思うことやワクワクすることは脳の働きを最大限にする。だから、つらいことを我慢するのはよくない。脳が楽しいと感じることがとても大切なんです。」
お前みたいな奴って、すぐ脳がどうのって言うよな。まあ楽しいことやワクワクするのが大事なのは認めるが、人生つらいことを我慢しなければいけない時なんてしょっちゅうだよ。後ゲームと授業は別物にしろ、一緒にするな。
しかし思うんだけど、ゲーム業界の奴らって、自分たちの仕事に少しやましさがあるから、教育と結び付けて、高級なものに仕立て上げたいんじゃあないの?
まあゲーム的な教育っていうのはありだが、やはりゲームの本質は遊びで娯楽で、しかも堕落だよ。
}}
{{コラム|すじ肉しちゅ~は今日も右手を上げて、「ハイル、オタキング!!!」と言った。|
1990年代後半に、オタキング岡田斗司夫は、著書『世紀の大怪獣!!オカダ―岡田斗司夫のお蔵出し 』(おそらく)で、マリオカートを例に、市販のゲームソフトの多くは達成感を味合わせるものだと指摘した。
岡田に言わせれば、ゲーム文化以前の人生の趣味の多くは、必ずしも努力の量と、上達とが比例しない。スポーツ、絵画、しかしこれほんと?もちろん厳密に量を考えて、グダグダ気色悪い比較をすれば、そう見えることはあるけど、少なくとも人間、何かをすれば必ず、それなりに得るものがあるはずなんだけどね。
しかしファミコン以降のコンピュータ式のゲームでは努力は無駄にならず、ほぼ必ずといっていいくらい、少なくとも初心者レベルの範囲でなら、プレイして練習すれば上達するように設計されていると、岡田の著書では述べられている。
ふーん、要するにゲームプレイヤーって、ゲーム制作者が作った達成感が欲しいから、金払うってわけね。
岡田が言うには、人生はゲームみたいに甘くないし、もしかしたらゲームは現実逃避で不健全かもしれないけど、でも大人だって親だって達成感をもっと感じたいんだぜ・・・だから今日も娘といっしょにマリオカートをプレイしている、と書いてたって言うけど、そもそも現実逃避や不健全から達成感って手に入る?
なんか頭のおかしい奴はやたら達成感って言うんだけど、それってほんとに欲しい?
いや、もちろんある程度は欲しいけど、でもそんな重要な事かね? もっと人生で必要なもの、いっぱいないかね?
}}
{{コラム|ガイナックスとはオタキング岡田斗司夫が創業した、アニメーションとコンピューターゲームの制作会社である。|
ガイナックスは、コンピューターゲームも作っていたね。確か、美少女18禁ソフトもあったよね。
1991年、『プリンセスメーカー』、育成シミュレーションゲーム。確かに赤井孝美さんのグラフィックは魅力的だった。
少女を光源氏的に育成するゲームだったか、キャラクター育成ゲームのはしりだね<ref>STUDIO SHIN『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版 第2刷 発行、P182</ref>。
98年にはコナミ社『ときめきメモリアル』というのが出た。ただこれは育成というよりは、美少女との恋愛疑似体験ゲームみたいな、まあ俺はやったことないから詳細は知らないけど、まあ美少女と上手に付き合えるように、男性キャラクターを育成する要素はあったのかね。
「プリンセスメーカー」→「同級生」→「ときメモ」の流れがあるって、ある評論家は言う。
良くわからないけど、岡田斗司夫はゲーム制作会社の社長でもあるんだから、前のコラムの達成感がどうののたわごとに意義を認めろって、すじ肉は書くんだけど、なんなのこいつ。
岡田斗司夫の肩書に関する議論って意味ある?
別にアニメ評論家でも、会社社長でも、なんでも勝手に名乗って威張っていればいいけど、でもやっぱり岡田斗司夫の肩書は、オタキングだよね。
}}
{{コラム|プリンセスメーカーdeathpenalty|
少女育成ゲーム・プリンセスメーカーは全滅時の損失が軽いのが、割と画期的だったようです。戦闘で全滅すると、拠点に戻されたうえ、1か月経過する。
全滅時の損失のことを和製英語でデス ペナルティといいます。英語では dead damage と云うらしい(DDと略すようです)。英語の death penalty は「死刑」の意味だって。
つまりどうやら、デスペナルティが軽くても、面白いはRPG は作れるらしい。
;デスルーラ
全滅しても拠点に戻るだけのシステムだと、拠点に戻りたい場合にわざと全滅する方法を使える。これを和製英語で「デスルーラ」と言う。ルーラとはドラクエの移動魔法ルーラのこと。
全滅したときに拠点に戻るゲームでは、拠点に戻れなくするイベントは不可能。
全滅したら拠点に戻れるからね。ただ、戦いが起こらなければどうかな?
どちらにしろこの議論、意味ある?
ただ例外的に全滅したとき拠点以外に戻る、っていう事は仕様で作れるよね。
}}
{{コラム|Roblox,Among_Us|
現編集者は現在は基本的に、コンピューターゲームはしない生活、でもほんのちょっと前、思うところあって、MicrosoftStore,Xbox 経由で、すこしゲームをしていた時期があった。
そしてMicrosoftStore はなんだかんだでゲームを売り込んでくるよね。
その時思ったんだけど、Roblox って面白そうだよねー。プレイはしていないんだけど、広告や表示を見ると、これ絶対面白いなって直感的に思う。
だからこのゲームのユーザーやプレイヤー、あるいは関係者にこのページの執筆してほしいな^^
後、Among_Us っていうのも面白そう。何か皮肉がすごく効いてそうだね。
}}
{{コラム|デスペナルティ関連|
このコラム、前編集者が、(この話題は、後述の商学書『メイド・イン・ジャパンは負けるのか』の話題と関連するので、残す必要がある。)ってメモを張っていたんだけど、読んでみたんだけど、現編集者Hにはちょっと話が見えなくてね。おそらくRPG をやりこんでいる人は内容が良くわかるんだろうけど、現編集者にとってはかなりの部分が???????だね。だからできるだけまとめる一方で、詳細不明の部分は前編集者の記述をそのまま残しました。
;帰り道を通せんぼするイベントは、詰みのリスクが高くなる。
サガシリーズはどこでもセーブできるが、この場合、帰り道を通せんぼするイベントは、上手に設計しないとクリア不能になる恐れがある。
ファミコン~スーファミ時代のドラクエとファイナルファンタジー、GB版サガとロマサガには帰り道を通せんぼするイベントは無いように見える。
ロマサガ1の氷結城の帰り道で通せんぼするボス敵がいる。しかし会話選択肢で戦闘を回避すると、詰みを避けられる。
古い時代のサガ系とロマサガでは、ダンジョン奥まで探検すると、最深部に一方通行のダンジョン出口がある。これは帰り道短縮の意味と、テンポ感向上(プレイヤーが既に理解していることを再度要求しないから)の効果がある。
しかしこの場合、もしダンジョンに一方通行出口がない場合、プレイヤーは帰り道にボス戦があると予測する。これはネタバレになってよくない。ドラクエは、最後の一方通行出口をあまり用意しないが、この狙いがあるのだろう。
このようにゲームのルール設定が、可能なイベントやマップを限定する。
}}
さて、ゲームのシリーズ物は、ルールが一様になる傾向がある。
だから、シリーズ作品によって搭載されるイベントの傾向も決まってくる。
イベントの傾向が限定されると、マンネリ化につながる恐れもある。
『メイド・イン・ジャパンは負けるのか』という2010年ごろの書籍でも、
シリーズ化とマンネリ化との相互関係が語られていて、基本的に家庭用ゲーム機の作品群の多くはゲーム性の根幹が90年代以降の作品は変わっておらず、変わったのはグラフィックが細かくなっただけ、と書かれている。
しかしゲーム会社からすれば、新規の斬新な発想のゲームはむしろ売れないと見られている。
グラフィック重視は、商業ゲームでは非常に重要と考えられているらしい。
そしてゲーム評論家は偉そうな批判はするが、自分では結局ゲームを作らない。
1980年代は、家庭用ゲーム黎明期。1995年ごろ、プレステ1時代からソフト容量が飛躍的に伸びた。
昔はゲームに勢いがあったが、今となっては、新しくて画期的かつリアリティと説得力のあるルールを思いつくこと自体、そんな簡単な事ではない。
漫画産業やアニメーション産業は黎明期をとっくに過ぎたようだが、結局今でもこの産業は続いている。そもそも、ラジオ、新聞、書籍、オールドメディアと呼んでいい産業も、今、しっかり続いている。2010年代のゲーム産業だって、もしかしたらスマホゲーム黎明期、ソーシャルゲーム黎明期なのかもしれない。
{{コラム|オタキングアノマリー論|
オタキングによるアノマリー(片寄り)論(『東大オタク学講座』に記述あり)によると、ゲームのバランス調整は結局普遍性は持たず、作家の世界観が反映されるものになる、という。
都市運営シミュレーション『シムシティ』、アメリカ製のゲームですが、ここでは火力発電所よりも原子力発電所の方が効果的な投資になっている。これは現実の経済情勢を正しく反映しているか?
これは現実の経済分析の話だが、現編集者はYESだと思っている。巨大なお金が動いているからこそ、いまだにこの国は原発をやめられない。
そして岡田はこの設定をアメリカ的な都市政策観の反映だとしている。しかし岡田はこのゲームの感覚を片寄りだと思っているのか?
そのほか、岡田は、ドラクエシリーズに対して、「なぜ作者の堀井さんは、作中で父親と子の関係に、どの作品でも、こだわりたがるんだろう? なにかあったんじゃねえの?」的なゲスい勘繰りもしています。
↑ちなみに上の段落は前編集者、E.Suj.の記述をそのまま残したものだが、まあね、オタキングがゲスい人間なのは、オタク全員が知っているからね^^;;;。
ここで書いたシムシティに関する議論と堀井氏に関する議論はどうも別の話のように見える。
つまり前編集者の議論は当初から混乱しているのだが、結局E.Suj. は作家の個性とは異常性の裏返しだと言いたいらしい。つまり個性とは長所ではなく、欠点の別形態だと。
では現編集者はこのE.Suj. に質問したいが、結局人間、個性持っていたほうがいいの?持っていない方がいいの?
大人は欠点すらうまく自分で活用しなければいけない、なんて書いてるけど、そんなこと上手く出来ている大人なんて、この地球上に一人もいないよ。
}}
====本文====
さて、上述までの再編集により、前編集者E.Suj, の邪念から生まれた、ゲーム-教育-成長のインチキ理論は完全に否定できたと思う。
結局前編集者もゲームにおける教育論は疑似的なものだと記述してるが、そんなら最初っからそんなこと書くな。
地獄のような長時間の再編集を終え、やっと話を本題のバランス調整にもどせることになった。
まずアクションゲームの調整。
敵が飛び道具で来るならどうする?
もちろん事実上はほぼ無限の対応策があるが、例えば、物陰に隠れながら移動して近づく、あるいはこちらも飛び道具で応戦とか、幾つか具体策は見えるでしょう。
(しかしよく考えたら、この行動って、E.Suj.のこのサイトでの行動とそっくりだよね^^;;;。)
基本的にゲームバランス調整では、例えば、物陰に隠れて攻撃を避けるなどの具体的技法、そして事実上それはそのゲームでの有効策なのですが、プレイヤーがこの対応策を覚えるように導く、そしてそれを可能なものにするため難易度を下げる、これが必要だと言います<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日初版第1刷発行、226ページ</ref>。
一つの方針としては、必要だと思われる技能をプレイヤーが行っていると判断したら、しかも一度には基本的に一つ、その敵を簡単に倒せるようなプログラムにする。
とにかく特定の方向にプレーヤーを導く意図を持つ、つまり導きたい方向にプレイヤーが行為すれば、難易度が下がる。だから、飛び道具を避ける物陰には、罠も無ければ敵もいない<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日初版第1刷発行、226ページ</ref>。
あれっ、今気づいたんだけど、新約聖書には、狭き門から入れ、って言葉があったよね…。
基本的には前編集をわかり易く書き直してるだけなんだけど…
とにかくこの場合、推奨されるパラメーター設定は、目的の敵を妥当な経過で主人公が攻撃したら、敵はすぐ倒せるようにしておけって書いてるんだけど、これって広き門じゃあない?
とにかくこの前編集は、あらゆるプログラムを駆使して、プレイヤーが特定の行動をするよう導けって書いてある…。
まあしかしまとめ編集を続けるかね…
大抵のゲームは先に進むと難易度が上がっていくようだが、いや、これ自体事実かどうか怪しいが、仮にそうするとした場合、その難易度の上がった敵のギミックや行動は、制作者が導く行動を複数、と言ってもごく少数の複合だろうが、プレイヤーがなしたら、敵を倒せるようにしたら良いという。複合技をプレイヤーが繰り出すことで、成長した感や、興奮を、ユーザーは感じるだろう<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、228ページ</ref>。
前編集者は、ゲームの後半難易度を上げるのは、プレイヤーに創意工夫を呼び起こすためと書いている。
確かに難易度が上がれば、創意工夫して解決を目指すのはゲームだけではない。しかし現編集者が問題を感じるのは、常にプログラムの手妻を駆使して、特定行動にユーザを導けと主張している点だ。
これは実はアメリカの過去の宇宙開発で宇宙に送る実験動物を調教、教育した方法と全く同じだ。
とにかくゲーム制作者の中に、このような馬鹿げた教育論を持っている愚か者はそこそこいそうだが。
このインチキな前編集者の愛読書には、ボス戦などの難しいイベントの目的は、プレイヤーが自分自身の技量を試す、自分がこのゲームにおける熟練プレイヤーか試す、そこにあるという。歯ごたえのある敵と戦って、自分がこのゲームにはまっているかどうか知る事が出来る、そういうことだろう<ref>吉冨賢介『ゲームプランナー入門』、P60</ref>。
;やはり何事も制限はあるか?
例えば主人公が不死身なら、まあゲームになりませんよね。何らかの弱いところは必ずあるでしょう。
所持金が無限とか、無いですよね。お前はドラえもんのポケットか?^^;;;
敵もそこそこ強いよね、あんまり弱いのはちょっと。
(たとえばアクションゲームで一時停止ボタン(ポーズボタン)を押さずにトイレに行ってウンコを数分してきても、ウンコから戻ってきてもキャラが負けてないのは明らかに駄目)。
↑ちなみにこれは前編集者の記述だけど、ん~、まあ、残しておくか^^;;;。
だから前編集者としては、プレイヤーに創意工夫を求める。まあもっともプレイヤーが創意工夫しないゲームなんて、この世にないけど。
だからゲームオーバーはやっぱり必要だということか<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日第1版第1刷、P.254</ref>。
だから前編集者はゲームには敗北とそれを回避するための努力が必要だと主張する。
まあでもこのサイトの別の場所でも書いたけど、E.Suj.は努力なんて全くしてないけどね。ただ毎日欲望のまま手を動かしてるだけ。
;真実は一つ^^!!!本当?とりあえず解法は複数^^!!!!
スーパーマリオのステージ1-1の最初のクリボーをどうする? (解1)踏んずけてやる^^!!!(解2)そのクリボーを飛び越えてこっちに来い!!!^^(解3)ブロックに乗って、絶景哉^^。
==== 他メディアとの違い ====
===== マンガ・アニメのバランス調整との違い =====
マンガやアニメのバランス調整というか、物語での敵の強さの見せ方と、ゲームでの敵の強さのありかたは、少し差異があります。
マンガ・アニメだと、たいてい強敵は、主人公がなんとか苦戦しながら倒せるギリギリの強さになっています。たしか1982年『鳥山明のヘタッピマンガ研究所』(1982年『鳥山明のヘタッピマンガ研究所』)の時点で、すでに、マンガやアニメや特撮(ウルトラマン)などの敵の強さは、そういうふうに設計されていることが説明されています。
しかしゲームでは普通、このようなギリギリの強敵にしてないほうが安全です。
マンガやアニメの強敵よりも、やや弱めにしておく必要があります。そうしないと、プレイヤーに創意工夫が生まれません。
具体例を考えるなら、分かりやすい例が、先ほど漫画家の鳥山明さんを例にあげましたが、その鳥山さんのドラゴンボールの原作マンガとゲーム版でのボス敵の強さの違いです。ゲーム版『激神フリーザ』だと、たとえばクリリンでもちょっと鍛えて頑張ればザーボン(ナメック星編の中ボス敵)を倒せるようになっています(原作マンガだとクリリンはザーボンを倒せない)。別に鳥山さんの作品だけでなく、ほかの多くの作家のマンガやアニメのゲーム版も、大体、同様に、原作マンガや原作アニメでは倒せなかったボス強敵がゲーム版では頑張れば倒せるようになっています。
理論的に考察するなら、マンガやアニメでは、一回の戦闘での強敵の倒しかたが一通りしかなく、いちばん読者に魅力的に見える奇想天外・破天荒な倒しかたで、敵を倒します。なのでマンガやアニメでは、ギリギリ倒せる強さのほうが良いのしょう。
しかしゲームの強敵では、多くのプレイヤーの、それぞれ異なる色々なアイデアに対応した倒し方を何通りも準備する必要があるので、ゲームでの強敵の強さは、ギリギリ倒せる状態よりも少し弱めにする必要があります。
==== 「廃人」 ====
ゲーム用語で「廃人」(はいじん)という表現があります。「廃人」とは、たとえば通信機能のあるネトゲRPGなどで、普通の社会人だとレベル上げが引きこもりプレイヤー追いつかずに(社会人が)クリアできないようなゲームにおいて、高レベルプレイヤーである引きこもりプレイヤーや無職プレイヤーなどを揶揄する意味です。
2010年以降の近年は課金ゲームなどにも「廃人」という言葉が使われます。一般の市販ゲームは高くても1万円程度ですが、それと比較して多額すぎる数十万円や数百万円の金額をゲームに課金するプレイヤーのことです。
書籍『ゲームプランとデザインの教科書』でも、この問題をサラっとですが、きちんと紹介しています。書籍中では「廃課金ユーザー」という表現を使っています<ref>『ゲームプランとデザインの教科書』、P66</ref>。書籍『ゲームデザインとぼくらの教科書』でも、廃課金ユーザーが社会問題化したことに触れられています<ref>『ゲームプランとデザインの教科書』、P66</ref>。
アニメーターだってゲームをする暇があるなら絵を描いていたからアニメーターとして通用しているわけです。アニメーターの就職前の第一趣味はゲーマーではないでしょう(イラスト制作やアニメ制作のはずです)。
=== ゲーム作家の体感の難易度はズレやすい ===
プログラミングというよりゲームデザインの話題かもしれないが、そのゲームの簡単さ・難しさといった難易のバランス調整も、コツがいろいろとある。
==== 具体的な方法 ====
結論から言うと、多くのゲームデザインの文献で、やや簡単めに調整されたバランスでゲームを作るのが安全であると主張されている。
たとえば書籍『ゲームプランナーの新しい教科書』(STUDIO SHIN 著、翔泳社)でも、作者がやや簡単だと思うくらいに作ると良くなる場合が多いという経験則が語られている<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、2018年3月10日 初版第2刷発行、54ページ</ref>。
また、書籍『ゲームプランナー集中講座』(吉沢秀雄、SBクリエイティブ)でも同様に、調整で迷って、プレイヤーにとっては易しいほうの案Aと難しいほうの案Bとがあったら、ゲーム本編には、やさしいほうの案Aを採用するのが良い、と主張しています<ref>吉沢秀雄『ゲームプランナー入門講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、235ページ</ref>。
難しいほうの案Bは、クリアに不要なサブ・ステージとか、そういうステージに流用すればいいのです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P207および235ページ</ref>。
ちなみに、文献『ゲームプランナーの新しい教科書』によれば、RPGにおいて、クリアに不要なイベントのことを「任意イベント」と言います。一方、クリアに絶対な必要なイベントのことは「強制イベント」といいます<ref>STUDIO SHIN著『ゲームプランナーの新しい教科書』、P198</ref>。
つまり、サブ・ステージや任意イベントの難易度については、本編の強制イベントの難易度よりも少し難しくしても構わないのです。文献『ゲームプランナー集中講座』によれば、むしろ、多様なプレイヤーに対応するためにサブ・ステージや任意イベントの難易度の設計は、本編強制イベントとは難易度を変えるほうが望ましいというか、そういう設計テクニックとしてサブ・ステージや任意イベントが用意されているような側面もあるようです<ref>吉沢秀雄『ゲームプランナー集中講座』SBクリエイティブ、2015年12月29日 初版 第1刷発行、P208</ref>。
書籍『ゲームプランナー入門』(吉冨賢介 著)でも、基本的に作り手は「簡単」だと思っていても、初めてプレイするプレイヤーには難しいという現象がよくあることを述べています<ref>吉冨賢介『ゲームプランナー入門』、P56</ref>。
==== 例外 ====
例外的なプレイヤーもいます。プレイヤーの中には、たとえばRPGなら、レベル上げそのものが好きな人もいます。
また、たとえばゲーマーでない一般人でも、たとえば電卓で「+1」を押しまくって計算結果をカウントアップしていく暇つぶしをしたことある人も多いでしょう。
ですが、レベル上げが好きなRPGゲーマーでも、彼らがプレイしたがるゲームの多くは、なぜか、レベル上げがそれほど好きでない種類のゲーマーも楽しめるゲームばかりです。
ドラクエ、ファイナルファンタジー、女神転生、テイルズ、・・・などなどのシリーズは、どれも商業の人気ゲームは、レベル上げがそれほど好きでなくても、ストーリーや戦術性などでも楽しめるようになっています。
本当にレベル上げだけが好きなら、ストーリー一切無しのレベル上げだけのゲームをプレイすれば充分ですし、フリーゲームなどでそれに近いゲームはあります。しかし、商業の世界では、そういうストーリー無し、あるいは戦術性が無しのゲームの話を聞きません。
これはどういうことでしょうか。
ゲームでなくマンガ業界の例で考えて見ましょう。
たとえば、少年ジャンプの読者には、メインの読者層は若い男の子ですが、
しかし実際には成人男性の読者もいますし、それどころか女性読者もいます。
しかし少年ジャンプは、あくまでも、メインの読者層が男の子であることを貫く編集姿勢であることが、
ジャンプ漫画の裏側を描いたマンガ『バクマン』では描かれています。
バクマンによると、たとえ少女の読者がいても、その少女は、
「男の子が読んでるマンガを自分も読んでみたい」と思うような女の子なので、
だからジャンプの取るべき編集姿勢としては、あくまで男の子向けを貫かないといけない、
といった内容が説かれています。
ゲームも同様でしょう。
==== 背景事情 ====
一般的にゲーム作家の側は、自作のゲームをプレイしたときの体感の難易度(なんいど)が、(他のプレイヤーよりも)自作ゲームを「やさしめ」に感じてしまいまちである。
つまり、本当は難しいゲームなのに、作家自身は「やさしい」と錯覚しやすい傾向がある。なお、この現象を俗に(ぞくに)「作者バイアス」と日本では言う。
;歴史
まず、1990年代のゲーム雑誌『ゲーム批評』にもある歴史的事実として、下記のような事例がすでに1990年代から知られています。
すでに1990年代の時点でゲーム評論雑誌『ゲーム批評』において、新人のゲームプランナーは企画提案の際に既存ゲームを難しくアレンジした提案をしがちだという報告がありました。
雑誌『ゲーム批評』によると、たしか、たとえばもし自社がスーパーマリオのようなゲームを作ろうとしている場合、新人はよく、「マリオのこの部分が簡単すぎるから、わが社はここを難しくしましょう」という提案をしがちだということです。
たとえば、スーパーファミコン版マリオ(スーパーマリオワールド)では、地上ステージでは多くのステージで、マリオに空を飛ばせれば、敵に遭遇せずにステージのゴールまで行けるように設計されています。
それを新人は「飛んでしまうと簡単なので、つまらない」と考えがちらしく、なので「空中に敵キャラを多く配置しましょう」という感じの案を提出しがちだということです。
たとえば
「空中に狼(オオカミ)を配置するのはどうでしょう? アメリカの昔のSFドラマに『超音速攻撃ヘリ エアーウルフ』という作品もありますので、パロディにもなって大人にもウケます」みたいな提案を出したりしがち、らしいです。(このほか、ゴルフゲームでウルフを空飛ばせる駄洒落(ゴルフでウルフ)アイデアなどの披露もあるとかゲーム批評では書かれていた気がするが(というか元々ゴルフゲームの提案で、上司役からのダメだしの根拠にマリオを例にする批評記事だったかもしれないが、本wiki本ページの文脈にあまり関係ないので、ゴルフの話は割愛させてもらう。)
ですが、マリオの地上ステージの空中に敵が少ないのは、ゲームが苦手なプレイヤーのための救済措置だったり、あるいは既に途中まで攻略したけどミスでステージ冒頭に戻されたあとの再チャレンジなどで興味ない体験済みステージ前半を無視するための工夫だったりするので、よって空中の安全性は必要な要素でしょう。
しかし、エアーウルフ的な提案では、そういう分析が抜け落ちています。
ともかく、このように、バランス調整では「予備知識が無いと、多くのゲーム製作者は、ゲームを難しく設計しがち」だというゲーム業界の経験則がもう1990年代からあります。私たちは、歴史にも学びましょう。
:※ ある編集者Aがなんとなく印象でゲームデザイン本などに「ゲーム作家はあまりネットの批評を参考にしない。ゲームを作った事のない人の批評なので、トンチンカンな批評も多いからだ」といったような情報があったような気がしたのですが、
:しかしあらためて書籍を確認してみると、少なくとも『ゲーム作りの発想法と企画書の作り方』や『ゲームプランとデザインの教科書』や『レベルデザイン指南書』では、そのような記述は確認されませんでした。
:下記のコラムは、その情報も背景にしています。
:どうやら、もしそういう記述の文献があっても、必ずしも商業ゲーム業界の多数意見とは限らないようです。
:あるいはその情報は、もしかしたら書籍による情報ではなく、ゲーム雑誌などのwebサイトの意見だったかもしれません(※ 読者に出典などをご存知の方がいたら、情報提供の編集をしていただけると、さいわいです)。よくゲーム雑誌の会社がwebサイトなどに商業ゲーム作家へのインタビュー文など掲載しています。
:一応、『ゲームデザイン プロフェッショナル』では、書籍後半のセクションの題名で大きく「一次情報以外、個性には役立たない」と銘打って、
:「インターネットやSNS」などについて、「そうした情報は知識として役に立つことはありますが、ゲームデザイナーが個性を発揮するうえではあまり役に立ちません」と説明している<ref>『ゲームデザイン プロフェショナル』、P314</ref>。
{{コラム|マリオメーカーのクリアチェック、ほか|
マリオついでに話すと、『マリオメーカー』という任天堂のつくった、マリオのゲームの素材を使って、
マリオメーカー購入者でも自分でマリオ風アクションゲームを作れるというゲームがあります。
このマリオメーカーというゲームでは、自作したゲームを任天堂のwebサイトに投稿・公開する際、クリアしてからでないと、投稿・保存できない仕組みになっています。
実は、マリオメーカーが発売される前、インターネット上には「改造マリオ」といって、マリオのROMを違法改造して、自作ステージをつくって無料公開などをする人たちがいました。
改造マリオはそもそも著作権侵害であり違法なのですが、その他にも問題点として、作成されたステージがやたらと難しすぎてクリア困難なステージばかりで溢れていた、という問題もありました。
しかしインターネット上では、そのようなクリア困難なゲームが、ネットのマニア達にはウケており、動画サイトなどではそのような超絶な高難度ステージが話題だったのです。
社会科学の格言で、「犬が人をかんでもニュースにならないが、人が犬をかむとニュースになる」という有名な格言があります。つまり、実際には統計的には少ない事例のほうがニュースとして話題になりやすいという、社会の法則があります。
また、アンケート調査などの心理学的ノウハウとして、「あなたは○○を買いますか?」と「あなたは○○を好きですか?」と聞いたときでは、
アンケート結果の傾向がかなり異なり、多くの人が、「○○を好きですか?」と質問されても決して実際に好きなものを答えるのではなく、
世間から賞賛されそうな趣味趣向の場合にだけ回答で「はい、好きです」と答えるようであるという、分析結果があります。
まさに改造マリオと本来の合法マリオの関係がそれです。
マリオメーカーでクリアチェックが必須なのは、せめて作者自身がクリアできるゲームをつくれ、常識的なプレイ時間で上達してクリアできるゲームをつくれ、というような任天堂の思いが伝わってきます。
おそらく任天堂の社内でも開発ゲームでは、各ステージのクリアチェックなどが行われているのでしょう。
}}
{{コラム|ネット民の感性は信用できるか?|
インターネット上には無料コンテンツがあふれておりますが、そのような無料コンテンツを楽しむ人たちのセンスは、一般の消費者のセンスとは異なりますし、もし仮に有料だとしても自分がカネを払うつもりもないものを平気で「面白い」と言える人たちも多く居ます。
それでも実際にプレイをした上での感想を言うならまだしも、しかしプレイヤーの人数よりも世界には無料動画の視聴だけをして感想を言うだけの人たちのほうが多いのです。
しかしそれすらも動画サイトでゲーム画面を長時間見ているので、まだしもマシなほうで、もっと酷いのになると、匿名掲示板で誰が言ったかも分からない批評や評論を真に受けて、あたかも実際にプレイしたかのように表面を装う人たちすらも多くいます。
マンガ業界も同じ問題に気づいてるようです。マンガ『ラーメン発見伝』(小学館ビッグコミックスペリオール )では、作中のライバル役のラーメン屋経営者(いわゆる「ラーメンハゲ」)が、ネットの情報をもとにラーメンの実際の食べたときの味を無視してラーメン評論をする自称ラーメンマニアに陰口で悪態をついています。これにリアリティを感じるマンガ出版社があるわけですから、つまりマンガ出版社の目からも、世間一般の人って多くがそういうネットの風評に左右される人達だよねと見られているわけです。
本wikiもネットの情報の一部なので、鵜呑みにしないでください。お金は掛かりますが、参考文献などとして記載されているゲーム関連に役立ちそうな書籍を、読者は実際に何冊か買って、書籍の実物を読むなどしてください。あるいは実際にゲーム制作やプログラミングをするなどして、確かめてください、
文献『ゲームデザイン プロフェッショナル』では、著者の塩川氏が言うには、口コミやレビュー、プレイ動画によって「知った気になる」ことを有害であると戒めています<ref>『ゲームデザイン プロフェッショナル』、P.282</ref>。
だからゲーム作品を調査するなら、実際にクリアするまでプレイするか、あるいは十分なプレイ時間を投じてプレイしてみなければ、ゲームデザイナーにはあまり役立たないと、塩川氏は忠告しています。
たとえ短時間のプレイでは楽しく感じても、長時間のプレイや繰り返しの演出をされた場合には楽しくないような場合もあるので、だから長時間のプレイをして確認してみる必要があるとのことです。(以上、『ゲームデザイン プロフェッショナル』を参考にした。著作権の事情のため、言い回しや文体は多少は変えてある。)
ただ、これは一見するとゲーム作家には、「偏見なく自作を最後までプレイをしてもらえそう」とか思えそうですが、しかしプロの作家は暇人ではないので、同人ゲームまで含めて何でもかんでもプレイすることはできません。
塩川氏は、著作の別のページでは。若者に進めるゲームプレイとして、とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いと言ってます<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
これは裏を返すと、もし人気作や商業的な成功作でなければ、そもそもプレイすらしてもらえない、ということを意味します。塩川氏本人はそう言ってなくても、現実世界の時間は有限であるので、作品1つあたりのプレイ時間を延ばすことはつまり、1多くのプレイしてもらえない作品が生まれます。
つまり、塩川氏のプレイスタイルは、前提として、あるゲームについてプレイを開始するまでの条件が、めちゃくちゃ厳しいわけです。
イラスト業界でも類似の指南の事例があり、「アニメ私塾」といわれる有名イラストレーターは、YouTube動画などでプロのアニメ作品の模写の練習を進めていますが、しかし、おおむね発言内容「アニメ線画の模写ですら時間が何十分も掛かるので、練習に入る前にまず、その構図やデザインなどが自分にとって模写をする価値があるものかどうかを判定して、もし価値あると判定できた場合だけを模写しろ」と、判定にけっこう頭を使いなさい、と指南しています。
しかも「アニメ私塾」氏は、1枚の模写をどの程度まで模写すればいいかという質問に対しては「(模写先の手本に)似るまで模写しろ」とまで言っています。まるで、その1枚の手本を、模写のゲームクリアをするまで模写し続けるわけです。
さて、色々とゲームファンの問題点をいくつか前の段落で言いましたが、それでもゲームはアニメや漫画と比べるとまだしもマシであり、なぜならゲームではプレイヤーと、プレイしてない人たちの区別がしやすいからです。
これがアニメや漫画になると、もはや違法サイトで違法配布されたマンガを読んでるだけの人なのか、
実際に購入してプレイした人なのかの区別が困難になります。
実際、中国や韓国などでは、違法の無料配布されてしまったマンガがネットに溢れてしまった時期があり、
そのような事情もあり金融業界などはマンガ産業への投資を渋り、代わりに課金をしやすいオンラインゲームに投資をしたという経緯があります。
}}
文献『ゲームプランとデザインの教科書』によると、アナログゲーム(カードゲームやボードゲームなど)の設計の例ですが、ネット上の意見ではなく実際の目の前のテストプレイヤーの意見であっても、気を使ったりして本音を言わないことも多いので、意見や感想よりも実際のプレイを観察して、「プレイヤーがルールを勘違いしてないか?」など色々と観察するのが良いといわれています<ref>『ゲームプランとデザインの教科書』、P338</ref>。
{{コラム|イナズマイレブンの人気投票呼びかけ事件|
イナズマイレブンという、男子小中学生くらいの子供をターゲットにした、サッカーのゲームおよびそのアニメ化作品があります。実際、ゲームなどでも平仮名を多用しているし、アニメなどでも振り仮名が多いですので、常識的に小学生くらいの子供がターゲットでしょう。
さて、このイナヅマイレブンの公式サイトが、ネット上での登場キャラクターの人気投票を行いました。
作品中で、「五条」(ごじょう)というマイナーな中学生キャラで、おっさんぽい顔のメガネで目が隠れて何を考えて分からない不気味な雰囲気の悪役っぽいキャラがいるのですが、ある有名な匿名掲示板のスレッドで、このキャラクターへの組織票の投票を呼びかけました。
その掲示板は、どう考えても子供が見ないような掲示板なのですが、しかし投票の結果、五条が一位になりました。
もし「ターゲット層の小学生の子供達が実は五条が一番好きだった」という理由ならそれでも構わないのですが、しかし投票の前後で「五条が子供に一番人気」という現象は特に観測されませんでした。「五条も子供に人気」という現象はあるかもしれません。ですが、「五条が子供に人気」という現象は結局は起きていないでしょう。
ネットの投票では、このような不合理な亊がたびたび起きます。
まず、年齢制限などをすることが不可能な場合が多いです。
また、本来なら「一人一票」などとしたくても、技術的な理由で不可能な場合もあります。
例えば、一人一票のために例えばツイッターなど外部サイトのアカウントを要求しようにも、しかし子供だとネット上のアカウント持つこと自体が不可能な場合もあります。たとえばツイッターの場合、年齢制限として13歳以下は利用不可能ですので、結果的に、小学生むけのアニメの人気投票をツイッターからの投票を呼びかけようとしても、技術的に不可能です。
アイドルグループのAKBなどでは、発売するCDに投票券などをつけることで、本当にカネを出して商品を購入したターゲット層だけが投票できるように工夫する場合もあります。ただし、AKB方式はこれで別の問題があり、一人の熱心なマニアが何票も投票したくて一人で何枚も同じ曲のCDを買うなどする、一般人とはかけ離れた購入行動をする事例があります。
また、アカウントなどを要求しない投票の場合、一日ごとに追加投票できてしまう場合があります。だから暇な人ほど、多くの投票をしてしまいます。
;「美人投票」
経済学で、「ケインズの美人投票」という理論があります。これは、金融における株の購入行動では、人々は自分が良いと思っている株を買うのではなく、世間が「この株は上がるだろう」と思っているだろうと予想した株を買うというものです。
ですが、この五条の投票の場合はもはや美人投票ですらありません。ネットのある集団が、自分たちのコミュニティをアピールするために、意図的に、子供からは美男子・美形・好印象だと思われないであろうと予想したキャラに投票しているわけです。まるで逆美人投票です。
;ノイジー・マイノリティ
世の中には、「口数は多い割には、人数は少ない」という集団があるのです。そのような集団を称して ノイジー・マイノリティ と言い、「うるさい少数派」という意味です。
しかし、うるさいだけの人に限って、企業などからは嫌われるので仕事がなかったりして、ネット上では口数が多いのです。
よく仕事や学生でも学校や家の軽作業などで、「口ばっかり動かしてないで、手を動かせ」などと年上から注意される事があると思いますが、まるでその逆の集団です。手を動かさない人は、口数でしかアピールできないのです。投票とは、そういう人にすら投票権を与えるという意味でもあります。
アニメやマンガなどの投票に関わらず、現実の政治の国会議員などへの投票でも、ある政治家へのネット掲示板などでの賛同は多いが、しかし実際に選挙をしてみると支持票がそれほど多くないという事例もよくあります。
また、暴力団などでは「総会屋」と言って、企業の株を少数でいいので購入し、株主総会での意見をよそおって、難癖をつけるぞとおどすことで、金品を要求するという手口も平成初期までは、よくありました(現在は規制されており、総会屋しづらくなっています)。一株など少数の株でも発言できてしまうので、こういう悪事が出来てしまったのです。
}}
文献『レベルデザイン徹底指南書』では、現実世界で自分が新しいスキルを1つ覚えたら、古いスキル1つはどれか封印する必要があることを説いています。たとえば会社で自らの希望によってグラフィッカーからプランナーに役職が変わったら、グラフィッカー時代のスキルは封印する必要があります<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。(参考文献では「デザイナー」と言ってますが、デザイナーは多義語でありイラストレーターの他にも開発リーダーなどの事を言う場合もあるので、本セクションでは「グラフィッカー」に言い換えた。)プランナーがグラフィッカーの仕事まで掛け持ちしたら、過労死してしまいます。
現実世界の仕事では時間が限られているので、そういうスキル封印が必要なのです。
{{コラム|一人で何でもできるか?|
「と学会」の人が2010年ごろにニコニコ生放送の番組に出演したときに言ってたのですが、どこかのマンガ出版社に対して、「と学会」のその人はマンガ原作者にネタ提供したことあるとの事です。
大衆は、漫画家を一人で何でもできる万能の人だと錯覚したいので、そういう大衆を喜ばせるために、アドバイザーが隠れて、漫画家の知らないネタでしかも読者にウケそうなネタのアイデアを提供をするのです。マンガ作品のクレジットには書かれませんが、そういうビジネスがあります。
もっとも、業界によってはアドバイザーがクレジットに記載される場合もあります。たとえばテレビドラマやアニメなどだと、「考証」や「監修」などで、関連するジャンルの専門家がアドバイスすることもあります。たとえばNHKの歴史大河ドラマなら、東大あたりの大学教授で歴史学教授といったプロの歴史学者が、監修についている場合もあります。
アニメではそこまで行かなくても、ミリタリー物のアニメなどで、実際に銃器を仕事であつかった経験のある人が監修をついていたり、軍事雑誌の記者などが監修についたりとか、そういうこともあります。
}}
{{コラム|可処分時間|
21世紀のビジネス用語で「可処分時間」という概念があります。
もともと「可処分所得」という経理などの用語があり、
「可処分所得」とは労働者が給料のうち、税金や社会保険料など支払いが義務付けられているものを差し引いた、
残りの(法的には)自由に使えるぶんの金額です。
実際には、水道光熱費といった公共料金など自由といえるかどうか分かりませんが、この議論では本質的ではないので深入りしないでおきます。
さて、可処分時間とは、可処分所得になぞらえて、可処分時間とは、おおむね、「1日のうちの自分の起きている時間のうち、労働時間などを差し引いた、残りの自由に使える時間」という意味です。
可処分所得に限りがあるように、可処分時間にも限りがあります。だから、商売の競争とは、消費者の可処分所得の奪い合いであると同時に、消費者の可処分時間の奪い合いでもあるのです。
1つの他人の作品に投じる可処分時間を増やしたら、当然ですが、他の作品への可処分時間の投入量が減ります。
こういう厳然たる事実があります。「可処分時間」という用語までクリエイターが覚える必要はないでしょうが、しかし消費者の時間に限りがあるという事実からは決して逃げることができないのです。しかもよく評論で「エンタメ界隈は、可処分時間の奪い合いの産業である」とも言われます。
クリエイターだって時間に限りがあります。たとえば、休日にもし自主制作の作品をつくっていたら、当然ですが、他人の作品を鑑賞する時間は減ります。
}}
=== クリア保証と戦術性のジレンマ ===
==== クリア保証 ====
ドラクエのレベル成長のシステムは画期的であり、どう画期的かを一言でいうと「クリア保証」である<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>。どういう事かというと、参考文献のリンク先の記事にも書いてあるが、ファミコン以前の1980年代のアーケードゲームではプレイヤーが上手い操作を学習しないとクリアできなかったが、しかしファミコン以降の家庭用RPGでは、プレイヤーの興味ないことは学習しないでも、代わりにレベル上げなどに多少の時間を掛ければゲームクリアできるようになったのである。
たとえば、プレイヤーが攻略法のわからないダンジョンでも、最悪の場合でも経験値かせぎに多少の時間を掛ければ、そのダンジョンのボスを倒せるなどして、かならず最後にはゲームクリアが出来る、というような事でもある。
その他の例では、たとえばゲーム終盤になってから未探検だった序盤の一部ダンジョンを冒険する際、プレイヤーには既にもっと難しいダンジョンを冒険してるのでその未探検ダンジョンから学習できることは少ないが、プレイヤーキャラのレベルが高いために未探検の序盤ダンジョンの敵はプレイヤーにはすでに弱くなっているので、その残っていた未探検ダンジョンにあまり苦労せずに時間を掛けなくてもダンジョンクリアできるように、難易度が上手い感じに自動調節<ref>[https://news.denfaminicogamer.jp/column05/170905b 『「レベルを上げて物理で殴る」の素晴らしさをゲームデザイナー視点で語ろう。ドラクエで学ぶ「RPGメカニクス」の3大メリット【ゲームの話を言語化したい:第四回】』2017年9月5日 16:30 ] 2020年12月21日に閲覧して確認.</ref>されるなど、RPGのレベルシステムおよび類似システムにはそういった側面もある。
要するに、
:* クリア保証、
:* 難易度の自動調整機能、
の2つが、ドラクエ的なレベルシステムの面白さの本質的・醍醐味であるとのことである。
リンク先の人の意見ではないが、このクリア保証のないデザインのRPGは(RPGでも古いゲームやフリーゲームなどで時々みかける)、表面的にはドラクエ的なインターフェースやステータス画面であっても、中身は似て非なるものであろう。
ファミコン時代の古いゲームなどのバランス調整の失敗(作者にとっては意図的かもしれないが)でよくある失敗として、レベルの上昇の上限を低いところに設定しすぎて、クリア困難になる事例があった(ドラクエ2がそれに近い)。なので、現代への教訓としては、そもそもレベル制限は十分にとるのが安全であろう。
RPGに限らず一般に、ゲームの後半に行くに従って、次ステージ攻略などのための事前準備の増加や、試行錯誤の時間の増加に時間のかかるようになっていく事が多い。そして、ステージクリアに必要な時間の増加が、ゲームを苦手とするプレイヤーに、そのゲームのクリアを諦めさせて挫折感を味あわせてしまう原因になる場合が、少なからずある<ref>[http://endohlab.org/paper/whydoplayersdrop.pdf 遠藤雅伸『ひとはなぜゲームを途中でやめるのか?-ゲームデザイン由来の理由-』6.まとめ] 2020年12月21日に閲覧して確認. </ref>。
=== 自由度 ===
文献『ゲームクリエイターの仕事』(翔泳社)によると、一本道のゲームではなく攻略ルートが複数あって自由度があるゲームの場合、それら複数のルートも考慮する必要があります。ゲームの自由度が多くなれば、その「場合の数」に応じて、調整の際に考慮する事項も増えます<ref>『ゲームクリエイターの仕事 イマドキのゲーム制作現場を大解剖!』、P78</ref>。
=== 勉強の方法論 ===
※ バランス調整に限った話題ではないが、他に適した単元が見つからないし、メインページに書くほどでもないので、間借り(まがり)的にバランス調整のページで書くことにする。
==== 共通言語 ====
ゲーム業界人たちは商売人なので、いろんなゲームをプレイするように推奨します。しかし現実には、それは費用的にも時間的にも不可能です。
商業ゲーム会社でゲームデザイナーになりたいのなら、人気作のゲーム知識は必要です。手本とするためという理由の他にも、スタッフなどに開発コンセプトなどを説明するためにも過去作のゲーム知識が必要になります」(いわゆる「共通言語」)<ref>『ゲームデザイン プロフェッショナル』、P278</ref>。
とりあえずゲーム業界志望なら、まずは人気作や、過去の人気作、自分が作っているゲームのジャンルに近いものを選ぶのが良いといわれています<ref>『ゲームデザイン プロフェッショナル』、P280</ref>。
==== 前後比較 ====
ゲーム制作において、人気作や人気シリーズを、手本の中心にすえる必要があるが、しかし、けっして人気ゲームだけをマネしようとしてはいけない。名作が名作である意義を確認するためには、同時代の他社の作品や、それ以前の過去の作家の作品に、どういう欠点があったを把握する必要がある。そうした前後関係の比較により、理解が深まる<ref>[https://news.denfaminicogamer.jp/interview/200615a/3 吉田寛・松永伸司『“ゲームらしさ”をもっと深く語りたい!そんなあなたのためのゲームスタディーズ入門』、電ファミニコゲーマー、2020年6月15日 12:02 ] 2020年11月27日に閲覧して確認.</ref>。
なお、同様のノウハウはアニメ研究の業界でも1990年代から語られており、たとえばアニメ評論家の岡田斗司夫や氷川竜介などが、絶版になってしまったが岡田らの共著『国際おたく大学―1998年 最前線からの研究報告』などの書籍の中で例を述べており<!-- 手元にその本が無いので、もしかしたら別の著作かもしれないが、岡田らの共著のどれかではある。 -->、たとえばアニメのガンダム初代がリアリティゆえに名作であることを評論したいならば、それ以前の時代のロボットアニメが如何にリアリティが欠けていたかを実際にビデオなどで視聴するなりして確認しなければならないと岡田・氷川らは述べていた。
ともかく、ゲームでも、名作ばかりプレイしていてもダメであり、つまり知名度だけでプレイするゲームを選んでいては、他のクリエイターに利用されて養分になるだけであろう。
岡田斗司夫と「と学会」の著作した『 岡田の国際おたく大学―1998年 最前線からの研究報告』では、書籍中で、ゲーム作家を経験した演劇作家の鴻上尚史(こうがみ しょうじ)の失敗例を東大生が取材したレポートを紹介しているのですが、岡田がそのレポートを評して言うには、おおむね「成功例から学ぶたがる人は多いが、しかし成功例だけから学ぶのは素人。プロは失敗例にこそ学ぶ。」というような感じのことを言っています。
工学の世界では、『失敗学』という概念が畑村洋太郎によって提唱されており、2002年の畑村の論文<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>や、2000年には畑村の著作『失敗学のすすめ』が出版されています。
(wikipedia日本語版には「2005年」に出版とあるが、間違いである。2002年の論文で、2000年の畑村の著作が参考文献とされている<ref>[https://www.jstage.jst.go.jp/article/jjlp1960/43/2/43_2_182/_pdf 『失敗学のすすめ』]</ref>。)
実は、2000年よりも前に、ゲーム産業限定ですが岡田が「失敗にこそ学ぶべき」といった内容のことを提唱しています。なお、畑村の論文の末尾の参考文献欄には、『 1) 畑村 洋太郎 編 著:続・続 実際の設計― 失敗に学ぶ .日刊工業新聞社,1996.』とあります。
{{コラム|失敗とスポーツの例え話|
ビジネス書で昔からよく言われるのですが、新しいことへのチャレンジには失敗はつきものです。
でも、新しいことにチャレンジして経験を蓄えることが、今後の成功につながるのです。もし失敗をおそれて新しいことにチャレンジしなくなったら、もはや次の成功にはつながりません。
失敗しないけれど成功もしないで市場から淘汰されることになるよりも、失敗してもいいのでそれ以上の大成功をおさめて市場で行き続けることができればいいのです。
よくビジネス評論ではスポーツに喩えられるのですが、スポーツのサッカーや野球などの試合にたとえれば、3点を奪われても、こちらが5点を得て結果的に勝てればいいのです。
逆に、1点しか奪われなくても、こちらの得点が0点なら、試合には負けます。
だから、「試合での負け」に相当するような致命的な失敗さえ、回避できればいいのです
「たとえ失敗しても、試合に負けなければいい」のです。「失点しても、試合に負けなければいい」のです。
塩川氏も、失点しても試合に勝てれば良いという内容のことを書籍で発言しています<ref>『ゲームデザイン プロフェッショナル』、P.334</ref>。
さて塩川氏の著作では、失点でない単なる「ミス」を「不具合の発生」、「失点」をユーザーの不利益、「負け」を「売り上げの低下やユーザーの離脱」(長いので抜粋)などと定義しています。
塩川氏の意図は分かりませんが、少なくとも新しいことにチャレンジすれば、未知の失敗は起きますので、ITソフト業界なら、それによる不具合の発生が起きます。
その不具合の結果、ユーザーに不利益が一時的に生じることはあります。しかし、そういう一時的な不利益は、新分野の開拓では避けられません。
ユーザーで実験する前の、最低限の手元や仲間内での実験は必要でしょうが、しかし未然の実験で今後のすべてのミスを防止することは不可能です。
}}
=== 異業種の立場を想像しよう ===
ゲームにかぎらず、文芸でもイラスト趣味でも、、狭いコミュニティ内の内輪ウケばかりに特化していって衰退していっている文化は多い。そうならないように気をつけよう。
内輪受けのマニア化による初心者忌避による衰退をうまく表現できている言い回しとして、プロレス業界の格言ですが「マニアが業界を潰す」という格言があります。なお、この発言は2012年に新日本プロレスリングを買収したゲーム会社のブシロードが買収時に述べた発言「すべてのジャンルはマニアが潰す」が元になっているので、まさにゲーム業界の反省にもとづく考察でもあります<ref> [https://newspicks.com/news/4135958/body/ 『【最終話・木谷高明】すべてのジャンルはマニアが潰す』 2019/10/5 ] 2021年11月7日に確認</ref>。(ブシロードの文脈とは違うかもしれませんが(出展の外部リンク先が有料なので読んでいないので)、本wikiでもおそらく後述していますが、ゲーム業界では1990~2000年の一時期、ジャンルによってはゲームが高難易度化した作品が多くなって、そのため新規参入者が苦手と感じてプレイヤーが減って衰退縮小していったジャンルが幾つかありました。)
なので、ゲーム製作のこういった予備知識のないファンコミュニティの意見ばかりを鵜呑みにして聞いていると、初心者を遠ざけた高難易度ゲームと化してしまうおそれもあります。
特にゲームセンターにある対戦格闘ゲームでは、「初心者狩り」といって、初心者が筐体で練習したくても、熟練プレイヤーが参入して初心者を負かして初心者がゲームプレイヤーになるので、初心者は練習できない。・・・その結果、気がついたらそのゲームの新規参入層が減っていった・・・という事例がありました。
ゲームにかぎらず、スポーツなどの競技の人気でも、似たような現象が見られます。競技というジャンル自体が技巧などを競うものなので仕方ない面もありますが、なんとかして初心者を遠ざけない工夫はゲーム屋には必要でしょう。
ともかく、上述のような色々な理由で、作家側は、体感の難易度が、本当は難しめのゲームなのに「やさしめ」に感じがちである。
実際、日本のゲーム史でも、1990年代の前半ごろは、ゲームの難易度が「むずかしめ」に調整されがちであった。しかし、その結果、世間では「最近のゲームは難しい」と感じる人が増え、日本のゲーム人気は一時期、衰退し、アニメ産業などに人気を取られる事態になった。
{{コラム|作者は答えを知ってしまっている|
バランス調整とは少し違いますが、作者はネタバレを知ってるので、シナリオに感動できないわけです。
これは、ハドソン(ゲーム会社名)の『新桃太郎伝説』(スーファミ版)の攻略本『新桃太郎伝説 究極本』(KKベストセラーズ 刊)で、作者の さくま あきら が、読者インタビューに答える形でそう言っています。
ゲーム雑誌での読者からの「ゲーム中、もっとも印象に残ったシーンはどこですか?」という旨の質問に対し、さくま氏は「作者はシナリオの答えを知ってるので、もっとも印象に残るとかそういうのはありません」的な内容の返答をしています。
}}
;ティッシュテスター
さて、作者バイアスでバランスが分からなくなるのは作者だけではなく、テストプレイヤーやデバッガーも、そのゲームに慣れてゆくと、次第に感覚が一般プレイヤーとズレていき、テストプレイヤー達もゲームの適切なバランス側が分からなくなっていく。
このことを比喩した表現として、「ティッシュ テスター」(tissue tester)という用語がある。使い捨てティッシュが1枚あたり1度しか使えないように、そのゲームに予備知識の無いテスターも、一度しか使えないのである。「フレッシュミート」(新鮮な肉、fresh meat)とも言います。
かといって、テストプレイヤーの人数にも限りがあるので、ゲーム作者は、たとえ自作ゲームのバランス調整が不完全でも、最低限の調整をしたら、もう「えいやっ」と(フリーゲームや同人ゲームなら)ゲームのver1.00および以降バージョンを出さざるを得ない。
単にバグを探すだけのデバッグ用テストならティッシュテスターでなくても可能ですが、しかしバランス調整ではティッシュテスターがいたほうが効率的です。
=== 要素の相互関係 ===
==== 概要 ====
文献『ゲームデザイン プロフェッショナル』によると、調整は、関連あるものを、まとめて同時期に、ただし1個ずつ調整していきます<ref>『ゲームデザイン プロフェッショナル』、P.182</ref>。
このため、まだ関連ある要素を実装しきっていない段階では、調整しません。だから開発の最初から調整することは、まず無いでしょう。
しかし、場合によっては、要素の実装をそろうの待つと調整開始の時期が遅くなりすぎてしまい、計画に支障が出る場合があります。そういう場合、ある程度のまとまりのある実装ができた段階で、調整をするようです。
具体的な調整の判断基準については、参考文献『ゲームデザイン プロフェッショナル』を買ってお読みください。
もし読者が練習として、てっとり早くレベルデザイン・バランス調整の経験を積みたい場合、角川書店(現: KADOKAWA)の『RPGツクール』という制作ツールで実際にゲームを作ってみるのが良いでしょう。文献『レベルデザイン徹底指南書』(大久保磨 著)でも、RPGツクールによる練習・勉強を進めています<ref>大久保磨『レベルデザイン徹底指南書』、2016年12月14日 初版 第1刷発行、P81</ref>。
==== マップと敵の相互関係 ====
ゲームバランスを決めるのは、敵の強さだけでなく、マップの構成、さらにRPGのダンジョンなら宝箱の中にあるアイテムや装備品の強さ、などなどのさまざまな要素が加わります。
宝箱もマップの構成要素ですから、広い意味では宝箱もマップだとすると、つまり敵そのもののの強さだけでなく、マップもバランス調整に大きく影響します。だから、もし仮に時間が無限にあるのなら、理想的には、ダンジョンなど各ステージののマップが実装されてからバランス調整を行うのが理想でしょう。
しかし、実際には、マップの実装は、なかなか時間の掛かることです。特に、マップを考えることは、そのステージの世界観などを考えることでもあるので、そういった理系的ではない文系的なことも考えなければなりません。
マップに敵を組み込む方式で調整する場合だとマップの実装を待っている間にはバランス調整が出来ないのも、なかなか難しい問題です。
だからマップと敵の調整の順序は、おそらく人や会社によって色々な方式があると思います。たとえば、
:マップを作ってからそのマップに敵を組み込んでみてプレイしてみて、敵の強さを決めるのか、
:それとも敵の強さを決めてから、マップを決めるのか、
:あるいはマップと敵を別々に決めてから、最後に組み合わせて微調整するのか、
などなどです。
ご自身の作品にあった方式をお選びください。
===== 始めよければ全てよし =====
さて、ゲームが長編になる場合、まずはプロトタイプ的に、序盤をやや多めに通しプレイをして、とりあえず序盤のバランスがゲームとして面白くなるように調整すると良いでしょう。
書籍『ゲームプランナー集中講座』でも、ゲームの初めと終わりの印象がよければ、途中のバランスが少しくらい悪くても楽しんでもらえると述べています<ref>『ゲームプランナー集中講座』、P236</ref>。
:※ なお、アニメ産業でも、実はテレビアニメは、第1話と最終話だけ、他のエピソードよりも予算が多めに作られるのが普通です(特に公言はされてないが、多くの作品で明らかにクオリティが違う場合が多い)。
とはいえ、ゲーム制作当初は、そもそも終盤のストーリーがまだ未完成だったりするので、意図せずとも、こういったプロトタイプ的に序盤をやや多めに調整する方法が自然に行われる事になるでしょう。
商業作品でも、たとえば攻略本やファンブックなどに書いてあるゲーム開発裏話などを見ると、RPGでは、(プレイヤーからは数値の見えない)敵の強さのほうを動かすことで、バランスを調整するという事例などもよく紹介されています。よくある話が、最終ボスなどの能力値です。原理的には、敵側の能力値ではなく、味方の能力値で調整したり、あるいは装備品で調整したりしてもイイはずですが、しかしよく開発裏話に出てくるのは、なぜか敵側の能力値の話題ばかりです。
たとえば、スーファミRPG『新 桃太郎伝説』では、最終ボスのパラメータのほうを調整していることが、KKベストセラーズ(出版社名)から出た攻略本『新桃太郎伝説究極本』に書かれています。(調整前はボスはもっとHPが多かった。)
:※ただし、あくまでRPG限定の話題。アクションゲームなどでは、違うかもしれない。
また、こういった調整順序の前提として、調整はゲーム序盤から順番に、ゲーム後半に向かって調整していくしかありません。
そのため、古いゲームなどでは、よくゲーム後半で、調整不足のために、極端に難しかったり、あるいは逆にあっけなく簡単すぎる後半だったりなどの話題も、よく聞きます。ドラクエ2の後半ダンジョンであるロンダルキア洞窟とその次ステージが典型です。
さて、プレイヤーに目立つ部分(たとえば味方キャラの能力値や装備品の性能など)を基準にして調整するといって、けっして全く数値をイジラないというワケではないのです。あくまで、(調整による変動幅の大きい敵能力値と比べたら、)「比較的には、味方キャラ関連の数値は、調整による数値の変動の幅が小さめ。敵の能力値は、調整による変動の幅が大きい。」という事にすぎません。
{{コラム|ノイマン「ゲーム理論」で説明できないのがテレビゲーム|
日本の人類学者の中沢新一は、ノイマンのゲーム理論で説明できないのが昨今のコンピュータゲームの特徴だと言っています。その発言の出典は忘れたのですが、人類学者で有名な中沢新一は近年、ゲーム産業に関心を持ち、たとえばナムコ出身の遠藤雅信などとも対談しています<ref>https://news.denfaminicogamer.jp/kikakuthetower/nakagawa-endo_bb/2 『ゼビウスからポケモンGOまで… 国内ゲーム史を遠藤雅伸氏と『現代ゲーム全史』著者が振り返る。中沢新一氏も壇上に登場!【イベントレポ】』 2017年4月12日 12:30 公開 ] 2022年1月18日に確認. </ref>。(なお、リンク先イベント記事の司会役の「中川」氏とゲストの「中沢」氏は別人なので、混同しないように)
ゲーム理論の用途としては、現代日本の学問では、政治的局面での外交戦略などを語る際によく政治学書で用いられたりします。ただし、そのゲーム理論でも、中沢新一によると、それでコンピュータゲームを語るのは不足だという事です。
中沢は特に言及していないですが、数学的にモデル化するなら、政策応用なら「国際情勢」など外交的な制約によって出力にとりうる値1個あたりの幅や個数が2~3個に限定されたりのような、値の個数が十分に小さくて有限の整数個の場合でないと、なかなかゲーム理論の応用は効果を発揮しません。
(20世紀の天才数学者 フォン・ノイマンの)『ゲーム理論』のような出力値に選べる個数が極端に少ない理論は、コンピュータゲームの調整では不足でしょう。本ページでも、ノイマンのゲーム理論については、版にもよりますが、このコラム以外では特に言及していないだろうと思います(2022年1月までの時点では、ノイマンのゲーム理論には言及していない)。
さて中沢の意見ではないですが、そもそもゲーム理論についてノイマンについての出典として、たしか数学者の森毅(もり つよし)のエッセイ本だったと思いますが、ゲーム理論はもともとノイマンが第二次大戦中の亡命中か何かにトランプのポーカーを参考に考えついたらしいです。
ネット上のゲーム評論では、経済由来の表現でよく使われる表現は、ゲーム理論ではなく「インフレ」「デフレ」などといった表現です。
経済学を知らなくてもゲームは製作できるでしょうが、どうしても経済学を参考にするなら、ゲーム理論よりも物価政策のほうを勉強したほうが良いかもしれません。
一応、書籍『ゲーム作りの発想法と企画書の作り方』ではゲーム理論も紹介されていますが、しかし具体的にどうゲーム作りにゲーム理論を応用するかは書かれていません<ref>『ゲーム作りの発想法と企画書の作り方』、P64</ref>。
}}
=== 各論(デザイン的なこと) ===
どの程度、レベル上昇でキャラクターを強くすればいいかについては、ハドソン社あたりでの有名な慣習があり、新しく訪れたダンジョンなどでは「レベルが3上がると、敵を1撃で倒せるようにすべし」という有名な基準があります<ref>『ゲームプランとデザインの教科書』、P.94、 ※ 著者のひとりの「平川らいあん」氏はハドソン出身</ref>。他社ゲームでは別かもしれませんが、だいたいスーファミ時代の桃太郎伝説シリーズはこんな感じに調整されているはずです。
== RPGのダメージ計算式 ==
=== 特化型が有利になりやすい ===
文献『ゲームプランとデザインの教科書』によると、ファミコン時代のゲームに限らず、21世紀の現代的なゲームでも、「なんでも平均的にできる」キャラクターよりも「○○だけなら自分が一番強い」といった感じの特化型のキャラクターが戦闘では強くなりやすい傾向があります<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.227</ref>。対して、バランス型は「器用貧乏」になりやすいのが現状です<ref>川上大典 ほか著『ゲームプランとデザインの教科書』、秀和システム、、2018年11月1日 第1版 第1刷、P.227</ref>。
なお文献『ゲーム作りの発想法と企画書の作り方』によると、ダメージ計算式を考えるのは(プログラマーの仕事ではなく)ゲームデザイナーの仕事です<ref>『ゲーム作りの発想法と企画書の作り方』、P145</ref>。
では、特化型が有利になりやすい原理を、これから説明していきます。
たとえば、キャラクターに能力をプレイヤーが自由に選んで振り分け配分できるシステムのゲームがあったとしましょう。(商業ゲームでも、いくつかの作品で、似たようなシステムのRPGがあります。)
説明の単純化のため、合計値が必ず100だとしましょう。
つまり、たとえば下記のようになります。
;作成キャラの能力例
:(※ 合計100)
ちから: 10
たいりょく: 30
しゅびりょく: 10
すばやさ: 40
きようさ: 10
さて、別の作成キャラ例を考えます。
;平均型キャラA
ちから: 20
たいりょく:20
しゅびりょく: 20
すばやさ: 20
きようさ: 20
:(※ 合計100)
のように、能力値を平均にふりわけたキャラクターと
合計値は同じですが、特定のパラメータに特化して能力値を振り分けした
;特化型キャラB
ちから: 40
たいりょく:20
しゅびりょく: 30
すばやさ: 5
きようさ: 5
:(※ 合計100)
のようなキャラクターを、
コンピュータ上でRPGの戦闘システムのアルゴリズム上で対戦させた場合、
ほとんどの20世紀のRPGのアルゴリズムでは、特化型のキャラBのほうが勝ち、つまり特化型のほうが強くなってしまいます。
さらに言うと、たいてい「攻撃力」のような、敵にダメージを与える意味のパラメーターに振り割ったほうが、キャラクターが強くなるゲームのほうが多いです。(ファミコン時代から、ウィザードリィ1の攻略本でそういわれていました。敵モンスター『ワイバーン』あたりの攻略法として「攻撃は最大の防御」という格言を出しています。表紙の黒かった攻略本なので、たぶんゲームアーツの本。『ウィザードリィ攻略の手引き』(MIA BOOKS)かと思われます。)
なぜこうなるかと言うと、なぜなら、もし攻撃力が上がると、敵を倒すのに要するターン数も減少するので、結果的に敵を倒すまでに自キャラの受けるダメージ量も減るからです。(なお、現実の軍事学でも、似たような事が言われており、戦術論ですが、クラウゼヴィッツ(近代ドイツの軍事学者の一人)は防御重視の作戦よりも攻撃重視の作戦のほうが有利だと述べています。防御だけで攻撃しなければ、現実でもゲ-ムでも戦闘では絶対に勝てません。)
裏を返せば、平均型能力のキャラは、多くのゲームシステムでは弱くなりがちです。
パラメータの振り分けは自由ではないですが、ドラクエ2(ファミコン版)でいう、サマルトリア王子が弱くなる現象です。ファイナルファンタジー3・5の赤魔導師も、似たような弱点を抱えています。
理由はいろいろとありますが、バランス側の弱くなりやすい理由のひとつとして、参考文献などは特には無いですが、
:・ウィザードリィやドラクエなどの古いRPGのアルゴリズムが、特化型に有利になっているという歴史的な経緯。
:・命中率などの確率に関わるパラメータ(「器用さ」)のある場合、パラメータ割り振り前から既にある程度の底上げ補正がされている場合が多いので、わざわざ命中率を上げると割り損になる。
:・「すばやさ」(素早さ)が攻撃の順番にしか影響しない場合、素早さが低くても1ターンに1度は攻撃できるので、素早さを上げると損。
などの理由があるでしょうか。
命中率に関しては、多くのRPGで、攻撃が外れるのは、プレイヤーに不満感を与えるので、たいていのゲームでは、ゲーム序盤のレベル1のキャラであっても、数値上での「命中率」や「器用さ」などの表向きの命中率が低くても、たとえば「命中率 40」と表示されていても、実際のゲーム内部での命中率はたとえば+20%されてて本当の命中率が60%だったりするような場合もあります。
このような底上げ命中率のあるシステムだと、20%底上げされる場合、命中率を80%以上に育てるのは損です。なぜなら100%以上には上がりようが無いからです。
命中率が101%以上の場合に特殊な追加スキルなどを獲得できるなら別ですが(たとえば、クリティカルヒットの確率がけっこう増えるとか)、たいていの古いゲームでは、そこまでの手入れをしていません。おそらく調整に時間が掛かるからでしょう。
=== ダメージ計算式 ===
さて、RPGの戦闘におけるダメージの計算式(「ダメージ計算式」といいます)に、アルテリオス計算式というのがあります。これは、昔のゲーム『アルテリオス』で採用された計算式なのですが、
攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
という計算式です。
ドラクエやファイナルファンタジーのシリーズの計算式はもっと複雑なのですが、どのRPGでもダメージ計算式の基本的な設計思想・方針はアルテリオス計算式と同じです。
アルテリオス以外のダメージ計算式でも、たとえば
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
というような感じの計算式である作品も多いです。
せいぜい、変数の前に定数係数が掛かっている程度です。
なぜ、どの会社のRPGでも、この程度の中学校レベルの単純な計算式なのかというと、バランス調整が簡単だからです。
バランス調整するのは人間なので、もし、ダメージ計算式があまりに複雑な方程式であると(たとえば量子物理のシュレーディンガー方程式みたいなのだったりすると)、そもそもバランス調整担当の社員が理解できません。
そして、このアルテリオス式を見ると分かるのですが、
:攻撃側の攻撃力 - 守備側の守備力 = 守備側のダメージ
もし自軍の攻撃力が0の場合、敵にダメージを与えられないので(ダメージが0)、絶対に負けてしまいます。つまり、攻撃力が敵の守備力を下回る場合も、絶対に負けるのです。
一方、「すばやさ」パラメータが戦闘の先攻/後攻の順番にしか影響しない場合、素早さが0であっても、勝つことは可能です。
また、守備力が0であっても、勝つことは可能です。
このように、パラメータの種類ごとに、そのゲームにおいて重視・軽視の差があり、不公平になっている事が多いのです。
また、バランス型の能力値のキャラクターの場合、せっかく「ちから」を上げて攻撃力を上げても、守備側の守備力を下回っていると、ダメージ0になってしまい、絶対に負けます。
つまり、
自分の攻撃力 > 敵の守備力
でないと、アルテリオス式では必ず負けるのです。
一方、
:1.3×攻撃側の攻撃力 - 0.75 × 守備側の守備力 = 守備側のダメージ
のように係数を掛けた計算式の場合、
守備力を1ポイント増やしても、その効果は25%減少されます。(たとえばレベルアップの際に上昇パラメータを一種類選べるシステムの場合、守備力を選ぶと損になる場合が多い。)
いっぽう、攻撃力を1ポイント増やすと、効果は30%増しです。
このように、計算式によって、有利/不利なパラメータという格差が生じます。
=== DPS (Damage Per Second) の概念 ===
:※ 出典は無いが、あまりに有名な概念なので、さすがに消さない。
最近のRPGゲームには攻撃コマンド選択時に「二段斬り」などのスキル選択ができます。
スキルを設計するとき、昔の初心者のやりがちなミスとして、最近は減ってきましたが、スキルの結果の見かけの数値にゴマかされて、実はスキルが強くなってない特技を設計してしまうミスが時々ありました。
たとえば典型的なのは特技『ためる』です。これは、次回ターン時のダメージを数倍に倍増し、次回ターンの1回だけ、ダメージを倍増させる特技です。
この『ためる』は必ず、次回ターン時のダメージが2倍を超えないと(たとえば2.5倍にならないと)、無意味です。
なぜなら、『ためる』コマンドを選択したターンは、攻撃をしてないからです。
つまり、スキルを使わずに普通に2ターン通常攻撃した場合、ダメージ量は単純計算で
:1+1=2
より、2ターンぶんのダメージです。
いっぽう、『ためる』コマンドを使えば、それがもし2倍しかダメージが倍増しない場合、
:0+2=2
で、結果は同じ通常攻撃2発ぶんのダメージのままです。
計算すれば子供でも分かる理屈ですが、しかしファミコン時代には市販の商業ゲームですら、こういうミスがありました。たとえばファイナルファンタジー3の職業『空手家』のスキル『ためる』です。
このようなミスを犯さないために必要な概念としては、'''DPS''' ('''D'''amage '''P'''er '''S'''econd) の概念が便利でしょう。DPS とは1秒あたりのダメージ量、という意味です。
もともと欧米のアクションゲームについての理論研究に由来する用語なので、単位が 秒 (second)になっていますが、RPGに応用する場合には単位をターンに変えるなどして工夫しましょう。
このDPSの概念を使って、上述の『ためる』コマンドの設計ミスを説明すれば、つまり、1ターンあたりのダメージ量(DPS)が上昇していないのが問題点です。
では、私たちが改善策を考えましょう。数学的に考えれば中学レベルで充分で、
: 0 + x > 2
を満たす変数xを設計するだけの問題です。
なので、たとえば、『ためる』後の攻撃ダメージ量を「2.5倍」とか「3倍」とかの数値に設計すればいいのです。
では、次に応用問題を考えましょう。
「『ためる』を2回続けると、さらにダメージ量がアップ」などのシステムを導入するときも、必ずDPSが増えるようにしましょう。
たとえば、この場合、ダメージを与えるのに最低3ターンが必要なので、不等式を考えれば、
変数xについての
:0 + 0 + x > 3
を満たさないといけません。
つまり、『ためる』2回後のダメージ量は、最低でも「3.5倍」のように3を超える数値、あるいは整数に限定すれば、たとえば「4倍」とか「5倍」とかになっている必要があります。
== KPI ==
Key Performance Indicator という経営的な指標があり、『レベルデザイン徹底指南書』P140 および 『ゲームプランとデザインの教科書』P70 によると、共通しているのは後述の内容です。なお、『ゲームプランとデザインの教科書』P67 によると、オンラインゲームの運営などで使われる用語ですが、別にゲーム業界限定の用語ではありません。
;DAU(Daily Active User)
:デイリー・アクティブ・ユーザー
DAUとは、その日に遊んでくれたユーザーの人数です。
;MAU(Mathly Active User)
:マンスリー・アクティブ・ユーザー
MAUとは、その月に遊んでくれたユーザーの人数です。
;WAU(Weekly Active User)
:ウィークリー・アクティブ・ユーザー
WAUとは、その週に遊んでくれたユーザーの人数です。
;PU(Paying User)
:ペイング・ユーザー
課金ユーザーの人数のことです。その日を課金ユーザー人数をDPU、その月の課金ユーザー人数をMPUと言います<ref>『レベルデザイン徹底指南書』、P140</ref>。
;課金率
たとえば、ある月のユーザ数のうちの課金ユーザーの割合など、
一定期間中の課金ユーザーの割合を言ったりしますす<ref>『レベルデザイン徹底指南書』、P140</ref>。
あるいは、全ユーザーのうちの課金ユーザーのことだったりしますす<ref>『ゲームプランとデザインの教科書』、P70</ref>。(書籍によって、内容が微妙に違う)
;継続率
前月と比べて今月はどんだけユーザーが残っているかとか、あるいは前週と比べて今週はどんだけユーザーが残っているかのことを、
継続率といいます。
(以上)
このほかにも、色々な指標があります。
== 参考文献・脚注など ==
ezo7jh5g1xh1rnzub1vx6d296l0avbc
ゲームプログラミング/書類/集団作業の場合の書類と書き方
0
27227
206207
206130
2022-08-04T11:13:21Z
Honooo
14373
/* ※例 */ 前文のみ再編集。1/4。
wikitext
text/x-wiki
{{substub}}このページの主要執筆者は、ゲーム業界経験者ではないので(2022/1時点)、ここの記述は調べ物としては役立ちません。
2022/1時点でゲームプログラミングと直接の関係ない話題が長い、という問題があるので、より簡潔、かつ分かり易い記事への編集にご協力いただけたら幸いです。もっとも現編集者Hは、解ってるならそれを書いた奴が書き直せ、そもそも余計なことは最初から書くな、…とは思いますが…。
このページは、教科書としてゲームプログラミングの方針を説明する際に、どうしても書類についての説明が必要だから記述されています。現状では、一般IT業界や製造業などの設計図を参考に説明がなされています。
== 本書の目的 ==
本書は、ゲームデザイナーのための教科書ではありません。
メインページ、「[[ゲームプログラミング]]」の題名どおり、プログラマーのための教科書です。プログラマーがゲーム制作に興味をもって実際に作り始める際に、調べ物の手間を減らすために書かれた参考書籍です。
ゲームデザインに関する解説を望む方は、別途、他の参考資料に当たってみてください。
==「仕様書」==
ここでいう「仕様書」とは、ゲームの設計図のことです<ref>川上大典ほか『ゲームプランとデザインの教科書』、秀和システム、2018年11月1日 第1版 第1刷、P.126</ref>。しかも職業的に集団でゲームを作るときの書類です。
ではまず、「設計図」とは何か、について、考えていきましょう。これは普通科高校では学習しない事項です。
ゲーム業界では、「仕様書」を含む書類群の「発注書」には、決められたルールや書式はありません。だから作るゲーム内容や製作チームごとに、適切な発注書のありかたを毎回考える事になります<ref>『ゲームデザイン プロフェッショナル』、P.145</ref>。
職業的なゲーム開発では、一般に
:発注 → 実装 → 調整
というプロセスを経て<ref>『ゲームデザイン プロフェッショナル』、P.61</ref>、最終的にとりあえずの完成になります。
ゲーム産業での「仕様書」は、発注の段階での書類です。
==集団ゲーム制作での解説文==
発売禁止になってしまった書籍(おそらく。しかし何故?)『国際おたく大学―1998年 最前線からの研究報告』(岡田斗司夫ほか、光文社)に書いてあった事例なのですが、G.O.D.と言うイマジニア社のRPGゲームに対する大学生(岡田は当時、大学講師だった)の取材があって、そのGODの開発に参加した劇作家の鴻上尚史(こうかみ しょうじ)氏と、エニックスの堀井雄二(ほりい ゆうじ)氏とが、対談した経緯が、紹介されていました。
劇作家の鴻上は、ゲームに演劇のリアリティを入れようとして、スタッフに「間(ま)を意識したシナリオを書いてほしい」と要求したが、うまく行かずに難航したと体験談を述べています。
対談相手の堀井は、鴻上のその体験談に対し「『(※ここで3秒休止)』とか書くと良いですよ」と、指示書で具体的に書くと良い、とアドバイスした、と、岡田の書籍にある大学生のレポートにあります。
おそらくドラゴンクエストのゲーム開発でも、このように具体的な指定を必要に応じて出していた・いるものと思われます。
21世紀現代の、商業ゲームの現場でも同様であり、書籍『ゲームデザイン プロフェッショナル』にもありますが(※かぎカッコ内が引用)、「もっとかっこよく調整してほしい」という問題であれば、たとえば「もっと目立たせたいので、アニメーションのシルエットを全体的に今より少しだけ大きくしてほしい」<ref>『ゲームデザイン プロフェッショナル』、P296</ref>という具体的な指定が妥当でしょう。
== 集団作業に必要な書類 ==
===設計図===
IT業界やゲーム業界では、集団作業で制作開始をしようとする際、まず、いきなり設計図を作るのではなく、まず先に試作品(しさくひん、英語で「プロトタイプ」proto-type)のプログラムを作り、企画で考えた各種システムなどのアイデアが有効かどうかを検証します。
そのプロトタイプで、企画のアイデアが本当に有効であるかを確認してから、もし有効だったら、本格的な制作を開始します。
もしかしたら会社によっては、企画会議(もしくは企画の打ち合わせ)よりも先にプロトタイプを作るかもしれません。
さて、会社へのプロトタイプ提出で、制作続行・制作本格化の賛同が会社から得られたとしましょう。
IT業界でも製造業でも、どこの業界でも集団作業で、制作の合意を作るさい、必要な書類は、おおむね、
:作業者用の具体的な「完成予想図」
です。
しかしゲーム業界の場合、いきなり完成予想図に相当する「仕様書」は書けないので、書籍『ゲームデザインプロフェッショナル』によるとまずゲーム中の大まかな実装予定事項を記述した『企画概要書』という書類を作成することもあると言われています<ref>『ゲームデザインプロフェッショナル』、P139</ref>。ただしこの「企画概要書」は、名前に「企画」とはついているものの、どちらかというと仕様書の方針を大まかに打ち合わせするための書類に近いので、いわゆる「企画書」とは異なります。
なお、一般のIT企業でよく書かれる「要求事項書」は、ゲーム書籍では紹介されていないので、おそらくゲーム業界では書かないのが普通だと思われます。(たとえば『ゲームプランナー入門』(吉冨賢介、技術評論社)や『ゲームプランナーの新しい教科書』(STUDIO SHIN著、 翔泳社)などを読んでも、『企画書』と『仕様書』は触れられていても、要求事項書については全く触れられてない。)
===ゲーム業界での技術職===
言葉というのは同じ国の国語でも、その業種や職場、社会集団で、微妙に違った使われ方をすることも多く、技術職、という言葉もゲーム業界での特別な使い方があるようですね。
この業界では、グラフィックデザイナ-やサウンドクリエイターやプログラマーが「技術職」<ref>『ゲームプランとデザインの教科書』、P125</ref>。技術職 = ¬(not)企画職、という事で、プロデュ-サーやプランナーやディレクターなどの「企画職」でない製作スタッフが技術職です。
ただ現編集者はプロデューサーとディレクターは対立する職種だというイメージはありますね。プロデューサーは企画職だろうけど、ディレクターは、"実"制作職ではないかな?
===企画書===
*PREP法
基本的にビジネス上の書類は、結論を一番先に書く構成法が望ましいですね。もちろん商業ゲーム制作の現場でもそうでしょう。文献『ゲームプランナー入門』では、具体例として、PREP法を紹介しています。
PREP法とは、
:Point(結論)→Reason(理由)→Example(具体例)→Point(結論)。
ほかにもホールパート法やSDS法などがありますが、どれも冒頭で結論を示した後詳細を伝える方法で、ビジネス文書はやはり、その形式が常道でしょう<ref>『ゲームプランナー入門』、P141</ref>。
しかしこの社会、ビジネスが重要なのは事実だが結局、他者の行為や仕事をただ自分の欲望と利益に使い、他者の存在や詳細に興味のない人間は、とにかく結論だけを先に聞きたがるし、それ以外の事には事実上何の興味も持っていないでしょう。
*ゲームのルール
常識的な判断としては、ゲームにはルールがあるものですよね。ルールのないゲームというのは、ふつうあまり考えつかないし、イメージできない。
ですからゲーム企画書としては、ルールの説明が必要になる。キャラクター設定や世界観の解説があったとして、ルール説明がない企画書はふつう受け入れられない<ref>『ゲームプランとデザインの教科書』、P83</ref>。
ただ今ではゲームジャンルの固定化が進んでいるので、ルールはくどくど説明する必要はない、という場合はある。
企画書を誰が書くかという問題もある。業界の内部の重要人物か、全く外部の業界経験の無い人物か。
どちらににろ常識判断としては、ある程度のゲームルールの解説は必要だろう。
*プレイ人数
企画書には、ゲームのプレイ人数の記述も必要<ref>『ゲームプランナー入門』、P159</ref>。
ほんとの昔は、一人か二人でプレイするのがコンピューターゲームだったのですが、もはや時代は変わりましたね。インターネットを駆使して多人数プレイ、ソーシャルゲームなんてものも出てきました。
<!--(:※ ここから先、セクション末尾まで文章の編集者が異なります。編集者Hによる文章です。なお出典のある部分は編集者Hではなく別の編集者Sによるものです。)←すじ肉先輩さー、この記述は無いわ^^;;。だってこれって、みなさーん、以下の馬鹿文はHが書いたんだからね、俺、Sujの文じゃあないよ、馬鹿なのはHであって、俺じゃあないから。Sujはちゃんと出典は全部書いてんだよ^^、って言ってるのと同じだよね^^;;;;;-->
さて、企画書に関しては、よくない企画の典型例というのはあるようですね。特に特定人物のネームバリューに依存した企画は良くないし、批判の対象になることも多いようです。ゲームとしては、イラストレーターや声優に超大物を起用することを強調した企画書ですね。
出典として『テリー伊藤のお笑い大蔵省極秘情報』あたり、確実に特定はできませんが、木村拓也のタレント性に頼った企画は、著者のテリー伊藤によってよくない企画の例として指摘されていたようです。
もっともテリー伊藤という人物自身が、ビートたけしの面白さ、彼を起用したことの良さによって世に出て知られるようになった人物なので、そんな事言っていいのかね、などと現編集者は少し思いますが…。
また今回の本題、ゲーム業界でもそういう良くない企画書が提出されることは多いようです。元ゲーム業界人でゲーム評論家の あべひろき が、90年代の著書で、過去にゲーム関連会社に勤務してたときの体験談を書いています。企画書の精査をしているときに、「人気声優の○○さん起用!」と書かれていたものがあったが、あべ氏がその声優の所属する声優事務所に確認の電話をとると、なんの商談も声優とも事務所ともされていなかったという事です。
もっとも企画書とは企画に過ぎないのではないだろうか?これらの他人のネームバリューに頼った企画が良くないのは事実だが、企画が通って実現する見込みが決定する以前は、むしろ声優本人や事務所にアクセスすることはないのが普通だろう。
もちろん企画者がその事務者や声優と懇意にしてる場合は、あらかじめ話をする可能性はあるが、しかし企画段階ではそもそも現実のビジネスになる可能性はそれほど高くない。声優や事務所にとってもその段階でもっともらしく話をされても、むしろ困惑するだけではないだろうか?
ただこういう他人任せの企画は、「プロデューサー的企画」と呼ばれるようです<ref>吉冨賢介『ゲームプランナー入門』、P71</ref>。クリエイティブな企画とは言えないわけですが、しかし商業的な娯楽作品には、クリエイターだけではなく、プロデューサーも絶対必要でしょう。
一般に企画でも他の仕事でも、他者の力や権威、その後の作業などに頼り切った態度は、どんな場所でも嫌われて批判されますし、それは職業の場だけではないでしょう。
また、ゲームの企画に関してもう一つの話題として、アメリカでも売ることに成功したドンキーコングの、ディレクターの宮本茂(任天堂)は、「人間の生理的なところを体感できるゲームを作れば、それがユニバーサル」、だと、語っていたようです<ref>川村元気『理系に学ぶ』、ダイヤモンド社、2016年4月21日第1刷発行、P89</ref>。
===「仕様書」、「企画書」===
商業的なゲーム制作では、一般に、
発注 → 実装 → 調整
の過程を辿ります。
そして発注段階で重要な書類は、「企画書」と「仕様書」の二つです。まず『企画書』で作るゲームのコンセプトを固めてから、あとで『仕様書』で、より詳細に内容をを決める、という順序をとります<ref>『ゲームプランとデザインの教科書』、P43およびP45</ref>。
企画書<ref name="gcs72">蛭田健司『ゲームクリエイターの仕事』、翔泳社、2016年4月1日初版第1刷発行、72ページ</ref>は社内だけでなく協力会社にも見せる資料であり、開発者・協力者に対して手短かに、そのゲームの全体的なコンセプトを伝えるためのものです。
仕様書は、ゲーム制作では「設計図」であり、「完成予想図」であるといっていいでしょう。企画書よりより詳細にゲームの内容を決め、指定しています。
さて、話を進める前に、商業的に集団でゲームを作る場合の他の書類や必要事項の名称について、ここで簡単に書いておきます。
まず「発注書」とは,発注時に作られる、必要な書類群のことでしょう。「企画書」と「仕様書」も含みます。
「指示書」はむしろ、実装や調整段階でなされる、具体的なゲーム演出上の指定でしょうね。
試作品(しさくひん、英語で「プロトタイプ」proto-type)や企画会議(もしくは企画の打ち合わせ)なんて言葉も出てきますが、こういうのはあえてクドクド説明しなくても、直感的にイメージわきますよね。
『企画概要書』とは企画書とは異なるもので、仕様書に準ずる書類で、仕様書の方針を大まかに打ち合わせするためゲーム中の大まかな実装予定事項を記述している書類です。
『原案書』<ref name="gcs72" />は社内だけで企画がペイするかどうかの検討を決算書などを参考に分析・会議するための書類です。
こういう書類や用語に関する言葉の使い方は、商業的集団的なゲーム制作の場として妥当と思われるものをまとめてみましたが、もちろん職場によって、会社によって使い方や意味が微妙に変わってくる場合はあるでしょう。
さらにゲーム以外の一般IT業界や製造業でもそれぞれの慣習があり、今回の説明が成り立たない、そしてそこはより一般的な職場ですから、それぞれより一般的な言葉の使い方があると思います。
さて、コンセプトの具体例として、書籍『ゲームプランとデザインの教科書』によると、たとえば『ポケットモンスター』のメインのコンセプトは、「通信ケーブルを伝わって、ポケモンが入ったカプセルが移動して交換する」、が始まりだそうです<ref>『ゲームプランとデザインの教科書』、P109</ref>。
また、書籍『ゲームプランナー入門』(吉冨賢介 著)によると、『メタルギア』シリーズのコンセプトは、「敵に見つからないように進む」、とのことですね<ref>吉冨賢介『ゲームプランナー入門』、P108</ref>。
イラストや音楽の発注は、一般的には企画が決まった後でしょう。
そもそもイラストレーションや音楽を対価を払って提供してもらったとして、それを実作品に使用しないのは、作者にとっては不本意なことだと思います。
アニメーターの故大塚康生氏は、アニメーション演出家が安易にアニメーターに大量の絵を描かせ、そこからいいもの、利用できるものだけ取捨選択する方法を批判していましたし、一般的に手仕事には作者の思い入れがありますから、安易な大量生産品と同じ取り扱いはできないと思います。
もっとも一方で、あるアメリカの日本人アニメーターが、同僚の日本人アニメーターが、自分の描いたものを日本の家族や友人たちが見ることができないことを不満に思っていた、という事を批判的に語っていたのを、現編集者は聞いたことがあります。
しかしゲームの場合、例外的にイラストや音楽が先行する場合はありますね。
RPG『クロノトリガー』は、企画の当初からイラストレーターをつとめた漫画家・鳥山明のイラストがあって、それをもとに作品を作ったと、鳥山のマンガの編集者であった元・少年ジャンプ編集の鳥嶋和彦は述べています。<ref name="tskdq">[https://news.denfaminicogamer.jp/projectbook/torishima/2]</ref>決めシーンなどのキービジュアルを先に決め、それに合うように設定を練りこんでいくという方式で、クロノは作られたようです。
企画書の制作ツールとしては、清書としては、オフィスソフトの「PowerPoint」と、アドビの「Illustrator」、または、アドビのソフトウェアは高価なので代わりにフリーソフトの「Inkscape」および「GIMP」がよく使われます<ref>川上大典ほか著『ゲームプランとデザインの教科書』、秀和システム、、2018年11月1日第1版第1刷、P.281</ref>。なお、Illustrator および Inkscape は、ベクトル画像を描画するソフトウェアです。
ただし、下書きなどでは、タッチペンと何らかの画像ソフト、またはタッチペン用メモソフトで下書きすることもあります。
業界で、ゲームプランナーと呼ばれる職種は、仕様書作成や進捗管理、テスト&デバッグ、スタッフとのコミュニケーション、などが仕事ですね<ref>『ゲームプランとデザインの教科書』、P.9</ref>。
また、ゲーム制作に関して、だれもが様々なアイディアを持っていると思いますが、メモを取って、もし忘れてもメモで思い出せるようにするといいですね<ref>『ゲームプランとデザインの教科書』、P.20</ref>。
アマチュアの企画なら、実際にプロトタイプ(プレイできる試作品のこと)を作って実作品で企画、仕様を説明してしまったほうが早いかもしれません。
参考文献『ゲームプランとデザインの教科書』でも、(試作品を)「ゲームプランナーを志す中で企画書や仕様書を書きながら、ぜひ自分でも作ってみましょう。プログラムや3Dモデルを簡単なものでいいので作ってゲームに仕上げてみましょう。」と述べています<ref>『ゲームプランとデザインの教科書』、P.3</ref>。
上記の本の図表によると、企画書では、「競合情報」、「世界観」、「ストーリー」なども記述して欲しいようです<ref>『ゲームプランとデザインの教科書』、P.43 </ref>。世界観とストーリーが分けられているのです。
物語とその舞台ですね。我々自身もこの世界で自分という役を演じている役者ですよね^^
{{コラム|ゲームの企画書とアニメーションの企画書|
商業アニメーションの世界では、企画の段階でストーリーの概要が決まっているようです。ただこれは、アニメーション作品の企画として、当然に必要とされる要素であるから記述されているわけで、実制作の過程で、実際のスタッフの意向により大幅に変更されることもあります。また、これらの企画では、キャラクター設定やキャラクターイラストのデザインも当然必要であり、かなり明確な形で提出されています。
たとえば、アニメ業界の企画書ですが、1990年代のアニメ『新世紀エヴァンゲリオン』の企画書の掲載されている『新世紀エヴァンゲリオン (ニュータイプ100%コレクション) 』(1997年2月28日初版発行、85~88ページ)を読むと、『企書画』の段階でもう、キャラクターイラストが主役だけでなくその友人や周囲の大人なども含めて、ほとんどのキャラクターでイラスト紹介されており、さらに全部の話数ぶんの粗筋と見せ場・意図を2~3行ていどで説明しています(ただし第1話と最終3話(24~26話)のみ説明が5行以上くらいと長い)。
因みに現編集者は実際にアニメーション業界で企画書を書いたことがありますが、その時に上司、制作会社の重役に指摘されたのは、1クール(3か月)か2クール分の実際のストーリーの具体内容を書いてほしい、との事でした。
一方ゲーム業界では、そういうキャラクター設定やストーリーは、企画段階では決まっていなくて、もし書かれていても邪魔だと感じられるようです<ref>吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、149ページ</ref>。
業界の企画書で、強調してほしい内容とは、ゲームシステムと、そうシステムを設計した根拠のようです。なぜなら、ゲームの企画書でいう「コンセプトが重要」、と言う際の「コンセプト」の意味とは、ゲームシステムやゲームルールを設計した根拠のことだからです<ref>吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、108ページあたり</ref>。
とはいえ、ゲーム業界の企画書でも、ゲームの世界観が「中世西洋ファンタジー風」なのか、「現代日本」か、「近未来SF風」なのか、などの設定はある様です。ネット上で公開されている商業ゲ-ム企画書からその様子が分かりますが、しかし、最初の企画書の段階で決まってる世界観はその程度まで、です。
背景としては、ビジネスモデルが根本的にアニメーション業界とゲーム業界とでは違う、という事情があるのでしょう。
}}
{{コラム|キャラクター重視の物語論|
アニメ―ション業界のビジネスモデルは、キャラクタービジネスだと言われています。1990年代の徳間書店のアニメーションに関する書籍(アニメージュ10周年記念)で、徳間の編集者が1980年代のアニメ業界を振り返ると、これはキャラクタービジネスだろうと、たとえば銀河鉄道999のアニメ―ションの人気も、メーテルなどのキャラクターの人気なのだという分析があり、アニメージュ創刊当時の『銀河鉄道999』特集では、ストーリー解説ではなく、キャラクターに焦点を当てた記事を組んだと、述懐(じゅっかい)しています。
また、漫画産業もキャラクター重視のようです。主人公に共感させるための様々な演出が凝らされている。そして主人公が身近に感じられることが重要だと指摘されています<ref name="tskdq" />。
これは日本人が物語軽視というよりは、海外でも同様であり、むしろ物語とはキャラクターを描くという要素が非常に大きいという事でしょう。多くのミステリの中でも「シャーロック・ホームズ」や「007」の人気が非常に高いのも、キャラクター性と結びついた作品だからでしょうね<ref name="tskdq" />。
1982年頃『鳥山明のヘタッピマンガ研究所』では、おおむね「マンガとは人間を描くことだ」という主張がなされています。
現編集者の記憶では、漫画がキャラクターだという主張を強くしたのは、漫画原作者であり、劇画村塾の開設者である、故[[w:小池一夫|小池一夫]]氏でしょう。上述の書籍の共著者、さくまあきら氏も、劇画村塾出身ですから、さもありなんということですね。
アニメ評論家の岡田斗司夫氏は、対談集『マジメな話』で、「古代ギリシア人や古代ローマ人はとても論理的で学問も発達していたが、一方でギリシア神話やギリシア悲劇が普及していた、人間には物語が必要なのだろう、自分達の社会の仕組みを、物語になぞらえて理解する、物語が学問や科学に匹敵する」といったことを述べていました。
ギリシア神話では実に人間的な神々の物語が語られていきます。
また、政治学者小室直樹氏は、別の書籍、おそらく、『日本人のための宗教原論』あたりで、「幼少期の子供にとっての、父親の力強さと畏怖のイメージ」こそが神のイメージだろうと述べています。ギリシア神話の最高神ゼウスは、明らかに父性を示していますよね。
これはユダヤ教やキリスト教の神のイメージだと考えてもいいと思います。この辺[[w:父なる神]]あたりに面白い記述がありますし、一方でイスラム教は神に父性を見出さない、などの興味深い分析も書かれています。
また、RPGゲーム『真・女神転生』では、裏設定ですが、作中の「悪魔」とは、力の象徴であり、それは父親を暗喩しているというコンセプトがあります(たしか公式ファンブック『CLUB邪教の館』あたりに記載がある)。だからこのゲームの主人公は、父親がいない母子家庭の子供だという事になっています。
}}
{{コラム|ゲームにおけるキャラクター|
ゲームの世界は、ソーシャルゲームや美少女ゲーム等はありますが、一般的にはキャラクター重視のメディアではないようです。シューティングゲーム『ゼビウス』のキャラクター性とか、『平安京エイリアン』のキャラクター性など、想像力を最大限に駆使すれば見出せないことはないですが、常識的にはキャラクターの魅力は提供されてはいないでしょう。
ゲーム学という概念を推進している人達は、ナラティブ(「叙述」という意味)といって、スーパーマリオなどのように作中にストーリー説明文が無いゲームのことを説明しているようです。
今現在では、可愛いキャラクターや恰好いいキャラクターを作品に取り込めるのなら、それを除外する必要はないでしょう。しかし現実の人気ゲームでは、キャラクター性があいまい、あるいはほとんど見出せないゲームも多いですよね。
ゲームのキャラクターは、開発途上で変更される可能性もある。海外展開しているゲームは、相手国の風習、社会状況に合わせて、キャラクター設定を変える場合もある。
今現在は、ソーシャルゲームでもキャラクターゲームは人気ですが、昔はそうではありませんでした。1990年代は、多くのゲームファンの間では、「キャラクターゲームはつまらない」と言われていました。
2002年にシリーズ発売開始されたRPG『ドットハック』シリーズの企画コンセプトは、面白いキャラクターゲームを実現することであり、2003年当時の社長(松山洋)がラジオ番組『ドットハックレイディオ』に出演した時に、「キャラクターゲームがつまらない」という一般的に言われている常識を打破したい、それがコンセプトだ、と述べていました。
しかし実際には1990年時点で魅力的なキャラクターゲームもありましたし、大ヒットすることは無くても、一部の大きな人気は得られていたようです。
}}
{{コラム|企画が実制作に移ること|
1990年代後半に書籍を出し始めた、元ゲーム業界人・阿部広樹氏は、ゲーム会社から請け負って、そこで頓挫した、或いは難航した企画を練り直しする仕事をしていたようです。彼の著作ではその経験、経緯が語られています。
扱った一つの企画が、ガンダム風の巨大ロボット操作ゲームで、企画として完成度の高いものでした。
主要機体の巨大ロボットのグラフィック設定画は線画が完成していて、機体パイロットである主人公の顔グラフィック線画もある、ロボットの設定サイズ(「全長○○メートル」、「主要武器:○○」など)なども含む、仕様書がすでに用意されていました。
機体の名前には「メタトロン」や(たしか)「サンダルフォン」と、ネットの普及していなかった当時では調べるのにも手間のかかるユダヤ教の大天使の名前がつけられていました。
阿部氏も、このゲームは実現するだろうと、期待を込めて企画を進めていたようです。
しかし現実にはこのロボットゲーム企画は対象のゲーム会社では採用されず、実際に制作されることはありませんでした。このようにゲームの企画は、企画だけで終了してしまうものが沢山あります。
一般的に商業ゲームの製作は、本当にペイするかどうか、経営者や出資者の審査、判断の上、実制作に取り掛かるでしょう。
企画を作る方も仕事として取り組んでいるのですから、「没になるかもしれない」といって手抜きするはずもなく、内容的にも、前設定の完成度としても、どれも相当の力と手間暇をかけて企画を練りこんでゆくでしょう。
しかし結果は結果としてありますよね。採用される保証はないしされないほうが実際多い。その判断が正しかったかどうかはまた別の話ですがね。
}}
{{コラム|他業種、一般的な意味での『企画書』|
企画書にもいろいろな段階があります。
#本当に企画の初期段階の、内部関係者しか見ない、思いつきを書きなぐったような企画提案の書類(厚さはせいぜい2~3ページくらいまで?)
#企画が熟成してスポンサーや外部に見せられるようになった段階、もしくはその直前くらいの企画書(10ページを超える程度)
#パワーポイントなどを使ってプロジェクタ-で見せるプレゼン資料の「企画書」
多くの業界の企画書で学生や外部の人間が見るのは 2.か 3.でしょう。
1990年代後半のゲーム評論家の阿部広樹の他者との共著による書籍によると、彼はゲーム業界で企画に関するトラブルを解決する仕事をしていたようですが、ある案件で、「当時の人気アニメ声優を起用!」など書かれた企画書をトラブル解決のために扱いましたが、彼らが調査した時には相手先のアニメ声優および声優事務所には全く話が行っておらず、対応にも難航したようです。ただ、本Wikiの別の場所でも指摘しましたが、企画時点では、その手の手続きを踏む必要はないでしょう。企画は企画にすぎませんし、実現の見通しが大きくはないその時点で話を持ってこられても、声優も事務所も、対応しようがないと思う。ただ、前編集者の記述では、許可をとれそうな見込みもないと書いてあるから、よほどのビッグネーム声優、要するにその声優の知名度だけをあてにしている企画ですから、悪い企画の例として非難されても仕方ないのかもしれません。しかし現編集者がさらに邪推、想像するに、彼らに企画トラブルの解決を依頼したゲーム会社は、自分たちは零細で知名度もパワーもないので、とてもその有名声優にはアクセスできない、ですからトラブル解決を稼業にしている業者なら、上手にその声優にアクセスしてくれるのでは?という期待があったのではないでしょうか?だとしたら、この事案に対する阿部氏らの態度、そして後になってわざわざ自らの著書でその出来事、関係者を愚弄して、それで自分たちが正しいかのように言うこの人物の姿勢は、職業人、仕事人として問題があるのではないでしょうか?
さて、ある程度企画が本格化してくると、スポンサーに提示するプレゼン用の資料とは別に、詳細な設定や企画意図を説明する、「詳述企画書(ここでの仮の名称)」も作られていきます。この書類は今後の作業のためのひな型の意味もあり、具体的にどんなキャラクターが出てくるか、イラストなども描かれます。
因みに、「ゲーム 企画書」でグーグル検索してみると、企画書としては 1.~3. そして今書いた「詳述企画書」が混然と表示され、書類として種類や趣旨は明確化されていないようです。企業が求職者を採用するために、企画書を求める場合は、プレゼン資料が最適のようですね。採用担当者にとって一番読みやすい資料だからでしょう。
企画書として、説得力のある内容なら、採用され実制作に移る可能性も高くなるのでしょうね。そのために指摘される事として、冒頭部分で、この企画と既存の作品の違い、今までの状況からの改善点、そして実際の改良の実現の見通しと方針を示すといい様です。これは「企画意図」や「コンセプト」と呼ばれますね。
「改善点→(競合他社の)現状説明→改善案の詳細」を、詳細企画書で段階的に説明するといいですね。新聞記事の書き方で、起承転結ならぬ「結・起・承」(けつきしょう)というのがあるので、それを参考にするのもいいでしょう。
また、売り込み先の消費者として想定しているターゲット層の指定も必要です。年齢はいくつくらいなのか、性別は男性か女性か、などですね。
企画の詳細を作りこんである場合や、すでにゲームソフトを実装してある場合のシステムの説明では、単にフローチャートを図示するだけでなく、そのシステムでプレイヤーは何ができるのか、簡単な遊び方の概要説明、等を加えるといいですね。
}}
{{コラム|日産自動車の社内講習でのアニメーション業界人の講演|
どこの企業でも社員向けの講習会はそれなりにあるでしょうが、日産自動車では過去、アニメーション制作会社の幹部を招いて、営業マンや企画職の社員のために講演してもらったことがあるようです。
テレビアニメーション『輪廻のラグランジェ』が2012年に放映されていた前後、日産が取材協力として制作に参加していたので、CG雑誌で、日産の講演会の様子が紹介されていました。
アニメーション業界では、実在しない物体や機械のイメージを、メカニック設定などで詳細にイメージを作り、絵コンテマンや、原画・動画のスタッフ間でその具体設計を共有するので、自動車製造業界でも参考になる要素があると考えられたようです。
日産の担当者は、制作会社の幹部の講演会に手ごたえを感じたので、もっと話を聞かせてほしいと要望すると、『輪廻のラグランジェ』の製作会社を紹介してくれたので、その会社にも講演をお願いし、さらに制作会社側の取材協力にも積極的に応じて、異業種同士のコラボレーションが形成されていったようです。
}}
さて、ゲームの『仕様書』はそのゲームの設計図なので、起こりうる全てのパターンを網羅して設計を指定する必要があります…と言いたいところですが、そもそも本当にすべての操作に対する反応をもれなく記述できるのか? しかしできる出来ないにかかわらず、創作物が世に出れば、それはコンピューターアプリケーションとして、ユーザーに自由に操作される。その時仕様と創作物が、合理的に網羅的に作られていれば、プレーヤーはストレスなく、ゲームを楽しむ事が出来るでしょう。
;検品、検収
さて、一般に技術系の業界では、図面などの設計図は、検品のさいのチェックリストを兼ねています。(ただし、ゲーム業界での「仕様書」が検品チェックリストを兼ねているかどうかは、2022/01時点、著者側の調査不足で不明。)
しかし検品自体はゲーム業界でも行っている。協力会社から納品されたプログラムも、仕様を満たしているかチェックするだろう。
そしてチェックを通ったら、合格した製品として正式に受け取る。
納品物を合格として認めて受け取ることを「検収」(けんしゅう)という。(ゲーム業界でも)<ref name="creator_work:77">蛭田健司『ゲームクリエイターの仕事』、翔泳社、2016年4月1日初版第1刷発行、77ページ</ref>。ゲームの仕様書は、この検収を考慮に入れて書くのがいいだろう。
つまり逆に納品物が合格していないと判断されると、受け入れない、検収しない、納品者に作り直しを要求することになるだろう<ref>蛭田健司『ゲームクリエイターの仕事』、翔泳社、2016年4月1日初版第1刷発行、76ページ</ref>。
商業ゲーム界では、営業マンが見積もりをするときの根拠は、仕様書、という事になる<ref name="creator_work:77" />。
外注テストに関しては、仕様書では不十分で、テスト用の別資料を用意する<ref>『ゲームプランとデザインの教科書』,P9</ref>。
バグチェックを外注しない場合は、「仕様書」を根拠にする場合が多いという<ref>吉冨賢介『ゲームプランナー入門』、P20およびP199</ref>。
つまりやはり、製品の仕様の基盤は仕様書、正しい仕様は、仕様書に書かれている事だという事になる。
開発後半のデバッグ段階などのバグチェックの段階に入る前に、仕様書を最新のゲームの状態とそろえる<ref>吉冨賢介『ゲームプランナー入門』、P238</ref>。つまりこれは、ゲームの仕様が制作過程で変わっていったら、逆に仕様書を書き換えて、実際の仕様に合わせるという事だ。
==作成工程==
===完成予想図===
仕様書はゲームの設計図。この書類を基盤にプログラマー、グラフィッカー、製作スタッフたちは作業を進める。しかし、ゲームの場合は、いきなり完成図を明確に決定するのは困難な場合が多い。そうなると方便的に大まかな設計、決定を作っていくという事になるだろう。事実、現実の業界では、大まかな「企画概要書」から詳細な「仕様書」へと、段階的に仕様が決まっていく<ref>『ゲームデザイン プロフェッショナル』、P.141</ref>。
一般的な製造業でもゲーム業界でも、あいまいな指定は事故のもとだと考えている。「とにかく、かっこいい感じでお願いします」なんて言いたくなることもあるけど、危険らしい<ref>『ゲームデザイン プロフェッショナル』、P.60</ref>。相手の「かっこいい」のイメージが、有り得ないものだったりする場合、あるよね^^;;;。
しかし場合によっては例外もあるようだ。裁量とか、阿吽の呼吸といったものも、人間関係ではある。しかし技術を語る場合、設計とは極力あいまいさは排除するものだろう。
ゲームでは、他者に発注するときは、ある程度相手の裁量にゆだねた方が良い場合もある<ref>『ゲームデザイン プロフェッショナル』、P.134</ref>。しかしその場合も、具体的にどういう実装予定のもので、どこに裁量を与えるのか明確にする必要があるという。裁量の発注については、『ゲームデザイン プロフェッショナル』本書を読めと、前編集者は書く。
とにかくこの編集者によると、Wikibooks をはじめ、Web上のWiki には何の価値もないと言う。世の中唯一価値のある文献は市販されている書籍で、Wikiの利用意味はその価値のある素晴らしい書籍を、出典としての記述を参考に、知ることだと言う。
それなら、Wiki書くのなんて辞めて、本屋でも始めたら?
===各機能の予想図の決定===
ソフトウェアの完成予想図は、画面を基準にすると伝わりやすい。
結局パソコン、情報機器を使っている時は画面を見ますからね。
<pre>
△△モードの××画面
Aボタン: ダッシュ(走る)。押すとキャラが十字キーの選択方向にダッシュするようにプログラムする
Bボタン: ジャンプ。押すとキャラが上方向にジャンプするようにプログラムする
</pre>
とか、こんな風に書くといいのではないでしょうか。それぞれのモード、画面での機能の満たすべき情報の一覧、を伝えておきたいですね。
ユーザ視点での仕様の事は、「外部仕様」、というようです。
ですからソフトウェア設計者は、各モードについて、画面表示、操作などの外部仕様の一覧を用意したいですね。
これは完成予想図でもある。
一方ソースコードの詳細は、内部仕様ですね。
商業ゲーム界では、原則的に内部仕様に関する書類は、あまり書かないようです。とはいえ設計項目の、ファイルや変数の具体的な記述は、ある程度は仕様書に書かれる。
そして外部仕様は「画面仕様」だけではない。例えばアクションゲームのモンスターの動き方のパターン、RPGのダメージ計算式、プレイヤーが具体的に実感できる仕様は、仕様書において指摘しておきたい。
ゲーム完成予想図とは、各種外部仕様を具体的にわかりやすく記述することになるだろう。
==※例==
一冊の完成予想図の中で、説明が重複し、同じ記述が複数あるのは好ましくない。
ある記述内容が変更になる時、重複した先も変更しなければいけなくなる<ref>吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、228ページ、</ref>。
一般的製造業の製図でもこのルールは守られている。一つの末端部分の図面はそれだけで完結し、他の部分を参照しないようにしている。
ではここからは、ウディタのサンプルゲームを具体例に説明しよう。
本来サンプルがあれば仕様書は不要という事になるが、今回は説明用として、サンプルから仕様書を書き起こす。
まずサンプルゲームのメニュー画面、
:相談
:アイテム
:特殊技能
:装備
:システム
:セーブ
と、6つのコマンドがある。
上から4つめの「装備」にカーソルを合わせた状態で決定ボタンを押すとキャラクター選択に移り、十字キーで目的のキャラクターを選択して決定ボタンを押すと、装備画面に移る。
さて、これを仕様書に書くと…
【'''装備キャラクター選択画面'''】
'''遷移直後の変化'''
メニュー欄に「装備」コマンド位置に決定後カーソル画像「○○○.bmp」を表示。
キャラクター選択欄のカーソルの点滅が開始。キャラクター選択用の点滅用カーソルの画像は「△△△.bmp」。
'''ボタン押の反応'''
キャラ選択欄で十字キーの方向にいる隣または次のキャラクターを選択でき、そのキャラの選択欄にて点滅カーソルが点滅表示される。
決定キーを押すと、選択中キャラクターの『装備部位の選択画面』に移る。
キャンセルキーを押すと『メニュー画面』に移る。
'''画像リソース'''
○○○.bmp :メニュー欄用の決定中カーソル画像
△△△.bmp :キャラクター選択欄用の点滅用カーソル画像
という感じ? その画面とやりとりする相手先の画面の名前と、あとはその画面の読み込むファイル、無駄なことは書かない、他の画面や他ファイルについては書かないほうが良い。
上述の仕様書の書式の参考は、吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、221ページ、の例『各画面の仕様書の例』の書式。
『装備部位の選択画面』に移ったあとの説明は続けて書かず、別途、たとえば『装備フロー仕様書』のような仕様書を作成せよ。
仕様変更で、『装備』コマンドの位置が(サンプルゲームでは上から4番目だが)上から6個目に変わったら、「メニューの装備コマンドは上から4番目にある」と書いた書類は全部作り直しになってしまう、そういう事態を避けたい。
そのため、あえて書類をモジュール化する。全体像は把握しづらくなるが、しかし全体像の把握については、そのための専用フローチャートを書類に設け、修正の手間が波及しないようにする。
例えば…
'''装備フロー仕様'''
【 メニュー画面 】
決定ボタン ↓ ↑ キャンセルボタン
【 キャラクター選択画面 】
決定ボタン ↓ ↑ キャンセルボタン
【 装備品 選択画面 】
とかね。
フローチャートの作図をしたい場合は、オフィスソフトのパワーポイントの図形描画の機能で作図が可能。フローチャートの描き方はJISで決まっているので、それを参考に。中学校の技術家庭科でも習うのでその教科書を引っ張り出してきても良い。
例えば装備部分の選択画面は、
:右手
:左手
:身体
:装飾1
:装飾2
これがこう変更されると…
:武器
:盾
:頭
:身体
:腕
:装飾
書類上の「装備部位の選択画面の「右手」選択にカーソルの合わさった状態で移る」というような記述はすべて書き直さざるを得ない。
そこでまず、『メニュー画面』や『キャラクター選択画面』では、他画面、例えば『装備部位選択画面』の具体的項目名称とその遷移法は書かないようにする。
『キャラクター選択画面』の仕様は、例えば、「選択キャラクターの『装備部位選択画面』に移る。」と書く。
「画面の変更時は原則、その画面のいちばん上のメニュー項目にカーソルの合わさった状態で画面が移る」と書く。
例えば装備関係のフローを描くときは、
:マップ画面 → 決定ボタン → メニュー画面 → 「装備」を選択で決定ボタン → キャラクター選択 → 決定ボタン → 装備品選択画面
と、続けて書くのはよくない。フローを分解する。
'''メニュー選択フロー'''
【 マップ画面 】
決定ボタン ↓ ↑ キャンセルボタン
【 メニュー画面 】
'''装備関係フロー'''
【 メニュー画面 】
決定ボタン ↓ ↑ キャンセルボタン
【 キャラクター選択画面 】
決定ボタン ↓ ↑ キャンセルボタン
【 装備品 選択画面 】
こういう2分割でしょうか。
意味的にまとまりのある単位ごとに階層をフロー分割したい。
かといって、5分割や10分割と、階層が大きくなりすぎるのは、多重下請けのいんちき業界みたいなので、多くてもせいぜい3分割でしょうね。
そしてフロー同士を結ぶ記述が必要。
【メニュー画面仕様】
'''表示項目リスト'''
決定ボタンで下記の項目を選択できる。
・相談 :決定すればメニュー相談フローに移行
・アイテム :決定すればメニューアイテムフローに移行
・特殊技能 :決定すればメニュー特殊技能フローに移行
・装備 :決定すればメニュー装備フローに移行
・システム :決定すればメニューシステムフローに移行
・セーブ :決定すればメニューセーブフローに移行
'''非表示項目'''
・キャンセルボタンでマップ画面に戻る
とか?
なお、各画面での遷移先の画面の説明と、フロー図での遷移先の画面との説明が重複しているけど、まあ気にしない、気にしない^^;;;。
参考文献の『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』の209ページ「状態遷移フローの例」と211ページ「各画面の仕様書の例」とでも、遷移先の画面の説明はそれぞれ重複しています。まあ場合によってはいつものようにこの後の記述でそこそこ言い訳するかもしれないけど…^^;;;
;一枚の図面の中での重複は、すじ肉大先生が許してくださる^^
というのは、例えば機能の似たものを二つ作る時、2個目の説明では、「○○については△△と同じ」と、書けるからね<ref>吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、229ページ、</ref>。
同じ一枚の図面なら、これで良い。
「○○については△△と同じ」「~~~と同じ」のように書いて具体的には書かない。<ref>吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、229ページ、</ref>。
;その他
画面名やファイル名の名前は、具体的にしたい<ref>吉富賢介『ゲームプランナー入門 アイデア・企画書・仕様書の技術から就職まで』、技術評論社、2019年5月2日、213ページ、</ref>。
たとえば、上述のウディタのサンプルゲームの画面は
:「マップ画面」、「メニュー画面」、「装備キャラクター選択画面」、「装備部位選択画面」と、したいね。
例えば
「画面1」、「画面2」、「画面3」、…
とか、
「メイン画面」、「メニュー画面」、「サブメニュー画面1」、「サブメニュー画面2」、…
にしたいときはあるし、事実上これは、命名の手間は省けるんだけど、他人に伝わりにくいので、ここは少し手間をかけて、具体的に内容ある命名にしたい。
===== 要求事項書はゲーム業界では書かない場合もある =====
IT業界でいう「要求事項」とは、顧客などから、完成品の満たすべき要件を聞き取ったりしたりして、完成品の満たすべき要件をまとめた書類のことです。
しかしゲーム業界では、ゲームプランニングの書籍を読んでも要求事項書は紹介されてない状態です。(たとえば『ゲームプランナー入門』(吉冨賢介、技術評論社)や『ゲームプランナーの新しい教科書』(STUDIO SHIN著、 翔泳社)などを読んでも、『企画書』と『仕様書』は触れられていても、要求事項書については全く触れられてない。)
個人製作のゲームでは、要求事項書は、まず不要です(自分で作ればいいので)。
個人製作では要求事項は不要ですが、比較のために下記に概要を記載しておきます。
まず、要求事項書は、発注者と受注者の両方の打ち合わせによって書きます。
なおゲーム業界でも、(要求事項書ではなく)発注書ですので立場は逆の種類ですが、その発注の成果物が作中でどういう目的で使われるのかなどの意図・用途を伝えるのが良い<ref>『ゲームデザイン プロフェッショナル』、P296</ref>とされています。
==== データ暫定値 ====
ゲーム中の、たとえばRPG武器の「攻撃力」などのデータの数値は、あらかじめ作者が、すべての項目の想定値を具体値で設計図に記述します
<ref>[https://www.youtube.com/watch?v=KVdtNiB_lIQ 【ゲーム企画】 ゲーム仕様書の書き方 - YouTube] ゲームのしくみチャンネル、2015/12/11、 2020年3月14日に閲覧</ref>。
CSVファイルなどでエクセルなどで記述しておきます。
【剣データ暫定値】
銅の剣: 攻撃力 7
鉄の剣: 攻撃力 18
ハガネの剣: 攻撃力 37
ミスリルの剣: 攻撃力 70
ほのおの剣: 攻撃力 57
(※ 剣ではランク5は欠番とする)
デスブリンガー: 攻撃力 150
備前長船: 攻撃力 250
聖剣エクスカリバー: 攻撃力 450
魔剣レーヴァテイン: 攻撃力 450
みたいに、暫定値でいいので、とりあえずの具体的指示も必要です。
ただし、これはあくまで暫定的な値でありますので、今後の調整で変更する可能性があります。
==== データ仕様書 ====
データ仕様書とは、たとえばRPGなら
:攻撃力: 敵の守備力との計算によってダメージを算出する
のようなパラメータ計算式の定義を行った仕様書のことです<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、96ページ、2018年3月10日 初版第2刷発行、92ページ</ref>。
そして、この「データ仕様書」は、デバッグのための資料になります。デバッガーが、この資料と実際の動作を照合することで、仕様どおりにプログラムが動いているかを確認します<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、96ページ、2018年3月10日 初版第2刷発行、92ページ</ref>。
どうもアイテム(「やくそう」とか「毒消し」などのアイテム)価格などの「100」(100ゴールド)とか「200」(200ゴールド)とかの具体値のあるデータ表のことをSTUDIO SHIN 氏は「仕様書」と言っている<ref>STUDIO SHIN 著『ゲームプランナーの新しい教科書』、翔泳社、96ページ、2018年3月10日 初版第2刷発行、261ページ</ref>。本当は「100」になるべき数値が「200」になっている場合、「仕様書」で簡単に確認できるとSTUDIO SHIN 氏は言っている。)
一般に、RPGの仕様書は、すごく分厚くなるといわれています。(アニメ評論家の岡田斗司夫が1990年代のむかし、彼の言うには、彼の伝聞によると、ある有名RPGの仕様書は、その書類の量の表現として(ページ数ではなく)キログラム単位で表現されるくらいだと言われています。岡田さんは彼の著書『オタク学講座』などの書籍で、そういった伝聞を述べています。有名作の仕様書だと、ちょっとした電話帳みたいに分厚くて重い書類が、場合によっては何冊かあるらしいです。おそらく、データ台帳に、攻撃力などのデータだけでなく、さらに設計の背景となる要求事項などもマトメて書いた上での重量でしょう。)
;攻略本と『仕様書』
ゲームの攻略本にある、アイテムの効果値や、敵の能力値などといった数値の一覧などは、おそらく、そのゲームのデータ台帳から、転記されていると思われます。
よく、「仕様書をもとに攻略本が作られる」と言いますが、しかし攻略本の制作に必要なのは、プログラム部分の設計図などではなく、実際に入力された各データを記載したデータ台帳のハズです。
ただし、実際には市販の攻略本には、記載ミスなどもあります。
また、制作側が情報を隠していたりして、攻略本に記載された情報と、実際のゲームプログラム内の数値とが違っている場合もあります。
== 他部署との連絡の仕事をするのは誰なのか ==
ゲーム業界では、プランナーと言われる役職の人が、連絡網の中心になって、いろいろな部署のあいだの情報伝達をします。
<div style="font-size:120%;">
<pre>
ディレクター ━━━ プランナー ━━━━┳━ プログラマ
┃
┣━ グラフィッカー
┃
┣━ デバッガー
</pre>
</div>
のような感じです。(ディレクターの上に、さらにプロデューサー、プロデューサーの上には社長などがいるが、省略する。)
このプランナーは、ゲーム業界の場合、中間管理職のような権限もあって、各部署(プログラマ部署やグラフィッカー部署など)とディレクター(監督みたいな役職)のあいだのやりとりもします。
:※ 一般の企業での連絡網の場合については、企業ごとの差異が大きいので、説明を省略する。
「プランナー」というと、てっきりプラン「計画」を練る仕事化のように思いがちですが、しかし、どっちかというと、計画を練るというより、たとえばテレビ業界でいう「AD」アシスタントディレクターのようなイメージのほうが近いかもしれません。
実際、書籍『ゲームプランナー入門』(吉冨賢介 著)によると、プランナ-にはTV業界でいう「AD」のような側面があると述べています<ref>吉冨賢介『ゲームプランナー入門』、P236</ref>。
== イラスト・音楽などの外注や打ち合わせ ==
イラスト・音楽に限った話ではないですが、文献『ゲームデザイン プロフェッショナル』によると、発注フォーマットに業界共通のルールは存在しないので、だから開発する作品に適したフォーマットを考える必要があります<ref>『ゲームデザイン プロフェッショナル』、P.146</ref>。
また、発注の際には、発注の目的まで、発注相手には説明できることが望ましいとのことです。
何らかの発注をする際、事前にチェック項目リストを作る必要があります<ref>『ゲームデザイン プロフェッショナル』、P.159</ref>。
=== 外注する場合 ===
自分にイラストや音楽をつくる能力が無い場合で、イラスト素材や音楽素材の調達をしたい際、イラストレーターなどの専門家に外注することになります。
打ち合わせをする際、たとえばイラストなら、発注元の画力にもよりますが、
:構図、
:希望のポーズ、
:塗り方、
:テイスト、
などの指示が必要です<ref>『ゲームプランとデザインの教科書』、P.128</ref>。
あと、絵を書かない人が勘違いしがちなことですが、「イラストレーター」を名乗っている人は、あくまでイラストだけが専門的であるので、一般に、イラストレーターは漫画を書けません<ref>『ゲームプランとデザインの教科書』、P.128</ref>。アニメも作れません。
イラストも漫画も両方とも作れる人のほうが、希少ケースなのです<ref>『ゲームプランとデザインの教科書』、P.128</ref>。(たとえばアニメ業界のジブリの宮崎監督のような、イラストもアニメも漫画もかけるような人は、かなり例外的なケースです。)
なので、イラスト、漫画、アニメ、などは、それぞれの専門家ごとに分けて注文なり依頼なりをすべきです<ref>畑大典 ほか著『ゲーム作りの発想法と企画書の作り方』、総合科学出版、2020年11月19日 第1版 第1刷発行、P168</ref>。
ゲーム作家によっては、キャラクターイラストの発注をするときはモデルとなるアイドルや俳優などの情報を添えて発注するゲーム作家もいます<ref>畑大典 ほか著『ゲーム作りの発想法と企画書の作り方』、総合科学出版、2020年11月19日 第1版 第1刷発行、P168</ref>。
:ラフ画などを用意してどんなシーンでどんなキャラのどんな構図を書いてほしいか等の大体の要望を具体的に伝える、
というのも重要ですが、もうひとつ必要になるかもしれない事として、
:なぜ、その構図が作中でどういう目的で使われるのかなどの意図・用途を伝える<ref>『ゲームデザイン プロフェッショナル』、P296</ref>、
という事が重要です。
『ゲームデザイン プロフェッショナル』によると、発注の意図・用途を伝える際も、長いと意図説明が書類の場合は書類を読んでもらえないし、口頭でも相手の頭に入らないので、だから発注者は要点を短く的確な言葉であらわさなければあらないということです<ref>『ゲームデザイン プロフェッショナル』、P295</ref>。
個々から先は別に文献の内容ではないですが、そもそもなぜ用途を伝えるのが必要かというと、相手のほうがその分野ではプロだからですし、発注元は往々にしてイラストは素人だからです。
発注元が素人の場合、プロのイラストレーターに用途を伝えると、たとえば、当初に発注元の考えていた構図などが実は不適切である、という情報が返ってくる可能性もあります。
このようなフィードバックのある場合、発注元がデザインを再検討する必要になる可能性もあります。
そもそも発注元は、あまりイラストや音楽などの分野を知らないので、だからこそ事前の打ち合わせによる、デザイン意図の確認が必要なわけです。
つまり、たとえるなら「作業指示」と考えるよりも、どこかの営業マンとの事前の打ち合わせのようなものだと考えるのがイメージ的には適切かもしれません。
たとえば住宅をリフォームする場合なども、事前に何度もリフォーム会社の営業マンとの商談をして、イメージを共有するのが普通です。イメージ的には、これに近いのかもしれません。イメージ的には、イラストレーターとか作曲家などアーティストに対する外注・発注も、こんな感じでしょう。
;その他
書籍『ゲーム作りの発想法と企画書の作り方』によると、アダルトゲームではシナリオも外注の場合が多くあるとのことです<ref>畑大典 著『ゲーム作りの発想法と企画書の作り方』、総合科学出版、2020年11月19日 第1版 第1刷発行、P129</ref>。
;発注されるイラストレーター側からの視点
これはイラスト-レーター側からの視点では、発注者の要求事項に従った絵を描かなければならないわけです。
だからもし、提出しようとする絵が、まったく要求事項に従えてなければ、ダメな絵となり、発注者は納品受け取りを拒否するので、絵はリテイク(書き直し)になります。
たとえば、アニメイラスト系絵描き向けの教本『クリエイターのためのおんなのこデータベース2008 -ファッション編-』によると、
もしイラスト発注の要求事項が「セーラー服の少女を描いてください」なのに、
もしイラストレーターがブレザー服の少女を描いて提出してきたら、
どんなに可愛く上手にブレザー少女が描けてようが、リテイクです<ref>『クリエイターのためのおんなのこデータベース2008 -ファッション編-』、編著 おんなのこデータベース制作委員会、ジャイブ株式会社(出版社名)、2008年7月5日 初版発行、P.208</ref>。
イラストレーター向けの教本などでもきちんと教育されているように、まともなイラストレーターは、こういう社会のルールがきちんと分かっています。
裏を返せば、こういう社会ルールが分かってない絵描きは、自称「イラストレーター」です。
イラストレーターにとっては当然の、社会のルールだと思いますよね。しかし世間には、イラストレーター業界に興味ない人は、この当然の社会ルールが分からない人が、少なくとも2005年より前の昔は世間に多くいました(下記コラムで説明する)。
{{コラム|絵の仕事は自由業ではない|
根本的な問題として、さすがに最近は無くなってきたと思いますが、ほんの2005~08年ぐらいまで、
世間には絵の仕事を、「自由に絵が描ける」と勘違いしている人がいました。また、「漫画や絵の仕事は、競争を気にしなくていい」という類の、良く分からない勘違いもありました。
どうやら、勘違いの原因は、小学校の図工のお絵かきや、中学校・高校の美術の授業が、そういうなるべく自由なテーマで絵を描かせるので、どうもイラスト関係の仕事までそうかと勘違いをする人が、ほんの2008年くらいまで昔は少なからず居たのです。
さんざんマンガ評論やアニメ評論などで「漫画の打ち切り」だとか「アニメの放映打ち切り」とか言われても、あるいは評論誌など読まなくても友人どうしの雑談でそういう話をしても、しかしその「打ち切り」情報が脳内にある勘違い「小学校の図工のような自由な仕事 <nowiki>=</nowiki> プロ絵描き」という勘違いの修正に結びつかないようです。
だから漫画家の江川達也は苦言として、雑誌コラム(おそらく『SPA』)で2001~2005年ごろの意見ですが、当時のゆとり教育の賛成論者がなんだか漫画業界について「漫画家は、競争が無くて自由に漫画を描ける仕事」だと勘違いしているような言説が散見されたことに対し、江川は苦言でおおむね「漫画家はとても競争の厳しい世界だ。ふざけたことを言うな」といったような感じの批判を雑誌コラムで述べていました。
漫画家はプロデビューするまでだって競争がありますし、デビューしてからも不人気だったら打ち切りですし、競争はとても厳しいです。
漫画に限らず、どうも世間にはイラストレーターや漫画家を、なぜか競争のない業界だと勘違いしている人が好くなからずいます。昭和の時代は、漫画家を終身雇用だと勘違いしている人もいました。
昭和時代にデビューした漫画家の小林よしのりは、自身が漫画家プロデビューするまでは、勘違いで、「マンガ出版社は、漫画家が死ぬまで面倒を見てくれる、まるで公務員のような終身雇用の業界が漫画業界」だと思っていたと、著書『ゴーマニズム宣言』で自身の勘違いを白状しています。
それでも昭和の時代なら、まだ漫画業界がよく知られていなかったので、世間一般の終身雇用の常識に照らし合わせて勘違いしてしまうのも、無理ありません。ですが、平成が10年以上も過ぎた2001年以降にこの手の勘違いをしている人もおり、もう手の施しようのない人です。
}}
=== 絵の「クオリティ」とは ===
何かのゲームデザイン本によると、「クオリティ」とは、イラスト発注などの言葉のようです。
その書籍では「クオリティ」の意味は説明していないのですが、ゲーム業界で言うクオリティと一般の英語のqualityは少々、意味が異なります。
ゲーム業界には、イラストや音楽などに対して「クオリティ」という言葉があります。英語ではqualityは「品質」という意味ですが、しかし日本のゲーム業界でいう「クオリティ」にもその意味はあるもののニュアンスはやや違います。
たとえばイラストの例なら、どんなに「ポーズと構図はこうしてください」とか「メインカラーはこうしてください」とかの発注要件を守ってイラストレーターが絵を描いて提出しても、しかしその絵の画風がターゲット層の消費者たちの好みの画風でなければ、ゲームが売れずにゲーム会社は商売になりません。
少なくとも2010年以降、ゲームファンの絵柄の好みは、素人では描けないような細密かつCG特有のグラデーションなどを活用した絵柄が消費者層の好みです。そういう求められた画風である細かい絵である素材を出せる能力のことも「絵のうまさ」と捉えて、ゲーム業界では「クオリティ」と呼んでいるようです。
逆に言うと、たとえばマンガ家の手塚治虫『鉄腕アトム』の原作のような簡素な絵でどんなに上手い絵をゲーム発注者に提出しても、おそらく「クオリティが高い」とは言われないでしょう。
絵の場合、昨今の消費者の好みが、細かく線を描きこまれたりグラデーションなどCG機能を多く使ったアニメ風イラストまたは細かいリアルCG風イラストといった絵柄なので、そういう絵がゲーム業界では「クオリティが高い」のように言われたりもします。
;業界によって要求される画風が異なる
ゲーム業界の絵を描く能力は、マンガ業界やアニメ業界で求められる能力とは異なります。
マンガ業界の場合、まず白黒印刷で表現できる絵柄でないといけませんし、印刷の解像度の問題もあるので、カラー表現は求められない場合も多いし、またグラデーションも利用が困難です。だからマンガ業界ではグラデーションではなく、スクリーントーンを使います。そもそも製作ソフトウェアからして、イラスト製作用ソフトではなく専用のマンガ製作用ソフト(『コミックスタジオ』など)を使ってマンガが描かれています。週刊マンガと月刊マンガでも、絵柄の傾向が違っています。試しに線画部分だけでいいので漫画を模写などをしてみれば分かると思いますが、週刊漫画の絵柄は比較的に短時間で模写できるような線の少ない絵柄になっている場合が多いえす。
アニメ業界の場合、動画マンが動画を何枚も描かないといけないので、原画ではなるべく1枚あたりの線を減らす必要があります。1枚イラストでは「撮影」と言ってCG処理などで光の表現などのためにフィルタ加工などもしますが、しかしゲーム業界と比較するとアニメ業界の手書きアニメ用イラストのCG処理は簡素な処理です。
ゲーム業界とアニメ業界では、人気の絵柄におけるCG加工の傾向が逆のことも多く、だからアニメ業界のような多くの人が真似して描けるようにデザインされた絵柄は、ゲーム消費者にはウケていません。
世間では美少女キャラの瞳が大きいだけで「アニメ絵」とか言いますが、しかし実際には瞳の大きい美少女キャラでも、アニメ業界とゲーム業界とマンガ業界とでは、求められているデザインがまったく違うのです。
アニメ業界とゲーム業界とで「原画」や「仕上げ」など共通の用語が使われる場合もありますが、内実、意味は違っています。
もっとも、近年ではアニメ業界もゲーム業界やライトノベル業界(雑誌媒体なら月刊誌である場合が多い)などの影響を受けて、細かい絵が増えてきました。アニメの原作がゲームやライトノベル作品である場合も多いので、そういう作品は当然、細かい絵が求められるわけです。
なお、アニメ業界の場合、細かい絵を描くことはクオリティとは呼ばずに「カロリー」と呼ぶことが多いです。どうやら栄養の「カロリー」由来の表現らしく、作画に求められる手間や負担というような感じらしいです。「作画カロリー」などといった表現もアニメ業界にあります。
細かい絵や、細かい動き、やたらと凝った動きや構図などを描く際、「この絵はカロリーが高い」のように表現するようです。
「クオリティ」という言葉を聴いているとあたかも「業界を越えて共通の絵のうまさがある」とでも錯覚するかもしれませんが、しかし上述のように要求される絵柄や画力は、業界ごとに違います。
;週間マンガ・アニメの後日修正
なお、実は週間漫画は、雑誌掲載時の絵柄と、単行本掲載時とで、絵柄が微妙に違う場合があります。雑誌掲載時だと、週間ペースの掲載に追いつかせるために、省略できそうな背景などの書き込みを減らしている場合もあります。なので、実はそういう省略された部分を、単行本化に向けて後で、アシスタントや、専門の会社などが、細部を仕上げているわけです。
単行本の話ではないのですが、2012年ぐらいにBSあたりで放映されたマンガ業界特集番組では、実はマンガのアシスタント専門の会社が存在することを紹介しています。細かな統計は忘れましたが、その番組によると、現代(ただし放映当時の2012年頃)の漫画家の多くは、実は連載作家ではなくアシスタントとのことです。今のマンガ産業は、実は分業制なのです(なおアニメ産業は昭和後期~平成初期からとっくに分業制)。
アニメも、実はテレビ放映時とブルーレイ・DVDなどの円盤メディアとで、絵柄が少しだけ微妙に違う場合などがあります。放映後に細部を直すのです。
=== マンガ・アニメ業界での「芸術」・「自由」の裏の意味 ===
文献『ゲームプランナー集中講座』によれば、ゲーム作りに必要な資質としては、作家性<ref>『ゲームプランナー集中講座』、P246</ref>のほかにも「人を楽しませたいと思う気持ち」<ref>『ゲームプランナー集中講座』、P246</ref>が必要です。
また、同文献によれば、ゲーム会社では自己表現は求められていません<ref>『ゲームプランナー集中講座』、P246</ref>。もし本当に自己表現をした人は、ゲーム会社ではなく1人で芸術家を志望するべきだと文献『ゲームプランナー集中講座』では述べています<ref>『ゲームプランナー集中講座』、P246</ref>。
作家性は必要ですが<ref>『ゲームプランナー集中講座』、P246</ref>、しかし自己表現は求められていないという、バランス感覚が問われます。
ゲーム業界への就職では自分の作品があるとアピールポイントになり多くのゲームプランナー入門書でもプロトタイプなどの作品づくりを推奨していますが、しかし自己表現は求められていないことに注意する必要があります。
さて、ゲーム会社だけでなくイラスト業界やマンガ業界も、似たような見解です。
『クリエイターのためのおんなのこデータベース2008 -ファッション編-』によると依頼内容を無視して自由に絵を描こうとする人は、けっして「プロ」ではなく、それは「芸術家」だとのことです<ref>『クリエイターのためのおんなのこデータベース2008 -ファッション編-』、編著 おんなのこデータベース制作委員会、ジャイブ株式会社(出版社名)、2008年7月5日 初版発行、P.198</ref>。
==== 「芸術」 ====
「芸術」といえば、漫画『サルでも描けるまんが教室』では、漫画家志望者が芸術かぶれになることを、とても戒めています。
{{コラム|サル漫の芸術かぶれ回|
サル漫の芸術かぶれ回では、作中の漫画家コンビのシナリオ担当の竹熊と作画担当の相原が、漫画の執筆中に、
芸術かぶれを煩った作画担当キャラの相原コージが、まず、おおむね「俺たちはこんなくだらない漫画を描いてていいのだろうか」みたいなことをつぶやきます。
それに対して竹熊が心配したか「どうした相原?」とたずねると、
相原の細かなセイルフは忘れましたが、相原は「俺たちはもっと本質的な作品を作るべきではないか?」とか
「資本主義などという下らない次元にとらわれてはいけないのではないか」とか、
「俺たちは国や大企業におどらされていてはいけない」とか、
なんかそんな感じのことを言います。
すると、竹熊はまず相原をぶん殴ったあと、
竹熊は「お前は芸術をぜんぜん分かっちゃいない!」と説教し、
相原が「そんなことない」というと、
竹熊が「じゃあ、お前のいう芸術とは何かと言ってみろ?」と問い詰めると、
相原が「それは、人間の内面の真実ってゆうか」とつぶやくと
竹熊はめっちゃあきれたような見下したような表情で、「にんげんのぉー、ないめんのしんじつぅ~」みたいにつぶやき返します。
そしてそのあと、竹熊はおおむね、
「お前は権威にとらわれてはいけないとはいうが、じゃあお前のその意見は、どこかの芸術大学の教授の権威にすがっているだけではないか!?」とか
:「お前こそ、政府や商業メデイアによる宣伝のつくった権威にとらわれているだけじゃないか」とか、
:「お前は芸術教授の権威にあやかって自分も地位と名誉が欲しいだけだし、結局、お前はカネが欲しいだけなのだ。」
なんかそんな感じのツッコミをします。
このあとも竹熊のツッコミは続きますが、続きを知りたい方はサル漫を購入してください(ネタバレになるので続きは省略)。
ともかく、マンガ業界やアニメ業界でいう『芸術』には、こういう隠れた意味があります。
アニメ『新世紀エヴァンゲリオン』の総監督の人はサル漫の大ファンですし、総監督は竹熊とも対談したことあるので、つまりアニメ業界でも自称「芸術家」はまあ似たような扱いです。
}}
==== 「私小説」 ====
{{コラム|売り上げと文化は違う|
文学史でいう「私小説」と、マンガ・アニメ業界でいう「私小説」とは、意味が異なります。
現代でもアニメ評論などでは、「私小説」というのを否定的な意味で、「頭でっかちのインテリが書いた、世の中に文句を言ってるだけのことを、さも深い洞察かのように装うとしてるだけの、売れない小説」のような意味で使っていたり、あるいは「世間知らずの漫画家やアニメ監督の書いた、世の中に文句を言ってるだけの(以下略)マンガやアニメ作品の脚本みたいなもの」のような意味で使われることもあります。
たとえば1998年の岡田斗司夫の対談集『マジメな話』でも、当時のエヴァンゲリオンの映画版を「私小説」だと対談相手の推理小説家・今野敏(こんの びん)が批判していたりしました。「クリエイターよ、メッセージはあるか」というタイトルの対談です。
なお、名前の漢字が似ているアニメーター・今敏(こん さとし)とは全くの別人ですので、混同しないように。そもそも今敏はエヴァンゲリオンの制作スタッフの一員です。アニメーター・今敏は、全く、岡田とは対談'''していない'''です。
さて、文学史でも、売上と、後世に語られる作品が異なることはあり、たとえば大正文学の売上のベストセラーは、
:倉田百三『出家とその弟子』、
:島田清次郎『地上』、
:賀川豊彦『死線を越えて』、
が大正時代の三大ベストセラーですが、しかし今や彼らは文学史の教科書には、滅多にのりません。せいぜい高校日本史の教科書で、倉田が少し紹介されているくらいです。
現代の教科書でよく大正時代の小説家として紹介される芥川龍之介は、じつは当時は倉田・島田らほどには売れてない作家です。また、「私小説」といわれるジャンルは実は売れていません。(もっとも、芥川が私小説を書き出したのは晩年のこと。このコラムでは、芥川の伝記については立ち入らない。)
食い違いの原因は、芥川が小説連載していた大阪毎日新聞による芥川をブランド化するイメージ戦略の成功や、あるいは第二次大戦後になって教育界隈の左翼運動家たちが文学史を左翼イデオロギーに都合よく書き替えたことなどが考えられますが、しかし新聞社や左翼ごときに書き換えられるぐらいに戦前の文学史が研究不足であったことが、そもそもの根本原因でしょうか。
ともかく、「私小説」というジャンルは、そもそも大正時代の当時は、大して売れていません。
}}
=== ローポリ関連の作画 ===
単元『[[ゲームプログラミング/3Dグラフィック#ローポリ制作手法的なこと]]』で説明した。
== レポートは結論だけを読んでも分かるように書く ==
レポートなどは、ゲーム業界なら、途中を読み飛ばしても、内容がおおまかに分かるように書かなければなりません。
別に冒頭で結論を述べる必要はありませんが(会社による)、しかし、仮に書類のページの順序どおりに上司が読まなくても、
レポート全体の内容を把握できるように書かなければならないでしょう。
== 中卒でも分かるように書類を書く ==
ゲームに限らないのですが、企業でレポートなど種類を新人などに書かせると、時々、教科書などを丸写しするような人がいます。しかし、そういう丸写しは、多くの企業で、一般的な企業では不要です。コードの解説というより、企業で何かの解説レポートを書く際の基本ですが。
書籍『ゲームデザイン プロフェッショナル』によると、ゲーム開発で必要なチーム内での言葉選びについては、「中学生の知識でも理解できる言葉を使うこと」とあります。そのほか、言いやすいフレーズを使うことも必要です<ref>『ゲームデザイン プロフェッショナル』、P101</ref>。
ぶっちゃけ、このwikiのこの科目の教科書のようなのは、中学生レベルの知識で読解できないので、ダメでしょう。読者は、このwikiを反面教師にしてください。
書籍『ゲームデザイン プロフェッショナル』は特に述べてはいませんが、企業というのは、従業員の過去の学歴や経歴がバラバラなのです。普通科高校を卒業して就職する人もいれば、業界に近い専門学校に入った人もいますし、商業高校や工業高校などに進学していた人もいますし、大卒や院卒もいます。
日本では高校進学率が100%ですが、しかし高校は選択科目などが多いので、共通知識はどの選択科目を選んだかで差異が多いので、なかなか高校を基準に合わせるのは難しい業種も多いのです(ただし、製造業なら工業高校卒のように、一部の業界では学校の種類を絞って基準にすることがある)。
なので、一般の多くの企業では、従業員がどういった学歴でも情報伝達が上手く行くように、中学レベルでも分かるような物言いが、企業では原則必要になります。大卒社員であっても、そういうふうに言い回しを直すトレーニングをしたりします。
== 脚注・参考文献 ==
25bbfc2ehmj0gu7ef1msiqkga24eukl
Go
0
28505
206193
204287
2022-08-03T22:36:39Z
Ef3
694
/* Go 1.19 の変更点 */ 2022年8月にリリースされた Go 1.19 はジェネリックスのポリシングとともに、ドキュメントコメントや新しいメモリモデルなどの新機能が追加されたバージョンです。 ジェネリックス — 微妙な問題やコーナー ケースへの対応と、パフォーマンスの向上 (一部のジェネリック プログラムで最大 20% 向上) 。 Docコメント( Doc comments ) — 新たにリンク、リスト、およびより明確な見出し構文をサポート。 「Go Doc Comments」も参照 メモリモデル — happens-before 関係の正式な定義が、C、C++、Java、JavaScript、Rust、および Swift で使用されるメモリ モデルと一致するように改訂されました。 os/exec パッケージは PATH ルックアップ — (セキュリティー上の理由で)相対パスを参照しなくなりました。 ガベージコレクター — ソフトメモリ制限のサポートが追加されました。 Build Constraints — unix が追加されました。
wikitext
text/x-wiki
:{{Pathnav|メインページ|工学|情報技術|プログラミング}}
Goは、Googleの開発したプログラミング言語のひとつです。
Goは、システムプログラミングを念頭に置いて設計された汎用言語です<ref name="Introduction">{{cite book
| url = https://golang.org/ref/spec#Introduction
| title = The Go Programming Language Specification
| chapter = Introduction¶
| date = Jul 26, 2021
| publisher = The Go website
}}</ref>。
強く型付け・ガベージコレクション・・コンカレントプログラミングをサポートしています。
プログラムはパッケージから構築され、その特性により依存関係を効率的に管理することができます。
文法はコンパクトで解析が簡単なため、統合開発環境などの自動ツールで簡単に解析することができます。
尚、公式サイトのドメイン名 golang.org から '''''golang''''' と表記される場合もありますが、このプログラミング言語の正式名称は '''''Go''''' です。
__TOC__
== 目次 ==
;チュートリアル篇
: [[/環境構築|環境構築]]
: [[/実行の方法|実行の方法]] {{---}} [[Go/実行の方法#Hello, World|Hello, World]]
: [[/文法の概要|文法の概要]]
: [[/変数|変数と型変換]]
: [[/算術演算と数学関数|算術演算と数学関数]]
: [[/条件分岐と繰り返し|条件分岐と繰り返し]] {{---}} if, switch, select, for, break, continue, return
: [[/関数|関数]]
: [[/メソッドとインターフェース|メソッドとインターフェース]]
: [[/再帰的関数呼出し|再帰的関数呼出し]]
: [[/メソッドチェイン|メソッドチェイン]]
: [[/defer,panicとrecover|defer,panicとrecover]]
: [[/並行処理|並行処理]]
: [[/配列とスライス|配列型とスライス型]]
: [[/マップ|マップ型]]
: [[/構造体|構造体型と構造体スライス]]
: [[/Goのプログラムがどんなアセンブリにコンパイルされるか?|Goのプログラムがどんなアセンブリにコンパイルされるか?]] {{---}} go tool objdump
: [[/クロスコンパイル|クロスコンパイル]] {{---}} GOOS, GOARCH
: [[/cgoでGoのコードからCの関数を利用する|cgoでGoのコードからCの関数を利用する]] {{---}} cgo
: [[/Goのコードでgoのバージョンを調べる方法|Goのコードでgoのバージョンを調べる方法]]
: [[/HTTP|HTTP]]
: [[/ファイル入出力|ファイル入出力]]
;リファレンス篇
: [[/ソースコードの表現方法|ソースコードの表現方法]]
: [[/キーワードと宣言済み識別子|キーワードと宣言済み識別子]] {{---}} [[/キーワードと宣言済み識別子#キーワード|キーワード]]・[[/キーワードと宣言済み識別子#宣言済み識別子|宣言済み識別子]]([[/キーワードと宣言済み識別子#組込み型|組込み型]]・[[/キーワードと宣言済み識別子#組込み関数|組込み関数]])
: [[/字句的要素|字句的要素]]
: [[/定数と変数|定数と変数]] {{---}} [[/定数と変数#定数|定数]]([[/定数と変数#iota|iota]])・[[/定数と変数#変数|変数]]
: [[/型|型]]
: [[/型と値の特性|型と値の特性]]
: [[/ブロック・宣言とスコープ|ブロック・宣言とスコープ]] {{---}} [[/ブロック・宣言とスコープ#ブロック|ブロック]]・[[/ブロック・宣言とスコープ#宣言とスコープ|宣言とスコープ]]・
: [[/式|式]] {{---}} [[/式#演算子|演算子]]
: [[/文|文]]
: [[/パッケージ|パッケージ]]
: [[/プログラムの初期化と実行|プログラムの初期化と実行]]
: [[/エラー|エラー]]
: [[/EBNF|EBNF]]
;[[/標準ライブラリー|標準ライブラリー篇]]
== Go 1.19 の変更点 ==
2022年8月にリリースされた Go 1.19 はジェネリックスのポリシングとともに、ドキュメントコメントや新しいメモリモデルなどの新機能が追加されたバージョンです<ref>{{cite book
| url = https://go.dev/doc/go1.19
| title = Go 1.19 Release Notes - The Go Programming Language
| date = 2022/08/02
| accessdate = 2022-08-04
}}</ref><ref>{{cite book
| url = https://go.dev/blog/go1.19
| title = Go 1.19 is released! - The Go Programming Language
| date = 2022/08/02
| accessdate = 2022-08-04
}}</ref>。
* ジェネリックス {{---}} 微妙な問題やコーナー ケースへの対応と、パフォーマンスの向上 (一部のジェネリック プログラムで最大 20% 向上) 。
* Docコメント( ''Doc comments'' ) {{---}} 新たにリンク、リスト、およびより明確な見出し構文をサポート。{{See also|[https://go.dev/doc/comment Go Doc Comments]}}
* メモリモデル {{---}} happens-before 関係の正式な定義が、C、C++、Java、JavaScript、Rust、および Swift で使用されるメモリ モデルと一致するように改訂されました。
* os/exec パッケージは PATH ルックアップ {{---}} (セキュリティー上の理由で)相対パスを参照しなくなりました。
* ガベージコレクター {{---}} ソフトメモリ制限のサポートが追加されました。
* Build Constraints {{---}} unix が追加されました。
== Go 1.18 の変更点 ==
2022年3月にリリースされた Go 1.18 はジェネリックスに代表される新機能が追加されたバージョンです<ref>{{cite book
| url = https://go.dev/doc/go1.18
| title = Go 1.18 Release Notes - The Go Programming Language
| date = 2022/03/10
| accessdate = 2022-08-04
}}</ref>。
ここでは、言語に関する変更を中心に変更点を解説します。
Go 1.18 には、型パラメータプロポーザル<ref>{{cite book
| url=https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md
| title=Type Parameters Proposal
| accessdate=2021-09-30
}}</ref>で説明されたジェネリック機能の実装が含まれています。
以下は、最も目に付く変更点のリストです。
* 関数と型宣言の構文に型パラメータが使えるようになりました。⇒ [[/関数#ジェネリック関数]]
* パラメータ化された関数や型は、その後に角括弧で型引数のリストを記述することでインスタンス化することができます。
* 新しいトークン ~ が演算子および区切子(punctuation)に追加されました。⇒ [[/字句的要素#演算子と区切子]]
* インターフェイス型の構文では、任意の型(インターフェイスの型名だけでなく)、unionや~T型要素を埋め込むことができるようになりました。このようなインターフェースは、型制約としてのみ使用することができます。インターフェイスはメソッドと同様に型の集合を定義するようになりました。⇒ [[/型#インターフェース型]]
* 新しい事前宣言された識別子<code>any</code>は空のインターフェースの別名です。これは <code>interface{} </code>の代わりに使用することができます。
* 新しい宣言済み識別子 <code>comparable</code> は <code>==</code> や <code>!=</code> を使って比較できる全ての型の集合を表すインターフェースです.
ジェネリックを使った実験的なパッケージが3つあり、便利かもしれません。これらのパッケージは x/exp リポジトリにあります。これらのパッケージの API は Go 1 の保証の対象外であり、ジェネリックの経験を積むにつれて変更される可能性があります。
;golang.org/x/exp/constraints
:<code>constraints.Ordered</code>のようなジェネリックコードに便利な制約です。
;golang.org/x/exp/slices
:任意の要素タイプのスライス上で操作するジェネリック関数のコレクションです。
;golang.org/x/exp/maps
:任意のキーや要素タイプのマップ上で操作するジェネリック関数のコレクションです。
<!--
現在のジェネリックの実装には、以下のような既知の制限があります。
Go コンパイラーはジェネリック関数やメソッドの内部で型宣言を扱うことができません。将来のリリースでこの機能のサポートを提供したいと考えています。
Go コンパイラはあらかじめ宣言された関数 real、imag、complex でのパラメータ型の引数を受け付けません。将来のリリースでこの制限を取り除く予定です。
Goコンパイラは、mがPの制約インタフェースによって明示的に宣言されている 場合にのみ、パラメータ型Pの値xに対するメソッドmの呼び出しをサポートします。同様に、メソッド値 x.m とメソッド式 P.m も、P のすべての型が m を実装しているという事実によって m が P のメソッドセットにある可能性があるにもかかわらず、m が P によって明示的に宣言された場合にのみサポートされます。
Go コンパイラーは、型パラメーターの型セット内のすべての型がフィールド f を持っていても、x が型パラメーター型の構造体フィールド x.f へのアクセスをサポートしません。
型パラメータや型パラメータへのポインタを構造体型の無名フィールドとして埋め込むことは許されません。同様に,インタフェース型に型パラメータを埋め込むことも許されません.これらが今後許可されるかどうかは、現時点では不明です。
2つ以上の項を持つユニオン要素は,空でないメソッド集合を持つインタフェース型を含んではならない。これが許可されるようになるかどうかは、今のところ不明です。
ジェネリックもまた、Go のエコシステムにとって大きな変化を意味します。いくつかのコア ツールをジェネリックスのサポートで更新しましたが、やるべきことはまだたくさんあります。残りのツール、ドキュメント、ライブラリがこの言語の変更に追いつくには時間がかかるでしょう。
-->
==脚註 ==
<references />
== 参考文献 ==
*{{cite book
| url = https://golang.org/ref/spec
| title = The Go Programming Language Specification
| date = Jul 26, 2021
| publisher = The Go website
}}
**{{cite book
| url = https://hiwane.github.io/gospec-ja/
| title = Go プログラミング言語仕様
| date = 2021/02/10
}}
== 外部リンク ==
{{Wikipedia|Go (プログラミング言語)|Go}}
{{Wikiversity|Topic:Go|Go}}
* [https://golang.org/ The Go Programming Language] - 公式サイト
* [https://play.golang.org/ The Go Playground]
{{DEFAULTSORT:GO}}
[[カテゴリ:Go|*]]
[[Category:プログラミング言語]]
{{NDC|007.64}}
djmci7je37lfyxpwk1ef4bsswdhtbga
音響学
0
33727
206210
196055
2022-08-04T11:34:01Z
2001:318:E10D:1D:D937:7B96:1EFB:CCA4
/* 音楽音響の応用 */
wikitext
text/x-wiki
{{Navi|[[音楽]] > [[音楽理論]] > '''音響学'''}}
音響学は、音、特にその生成、伝達、効果について研究する学門です。音響学は、生成、伝達、制御される音の性質によって、多くの応用が可能です。
音楽のような好ましい音の場合、音響学の主な用途は、音楽をできるだけよく響かせることです。交通騒音のような好ましくない音の場合、音響学の主な用途は騒音の低減です。
音響学のもう一つの主要な分野は、ソナーシステムや非破壊材料検査などの検知に応用される超音波の分野です。本書では、音響学の基礎と主な応用例について説明していきます。
※本書は、[https://en.m.wikibooks.org/wiki/Main_Page 英語版Wikibooks]の[https://en.m.wikibooks.org/wiki/Acoustics Acoustics]を翻訳したものです。一部翻訳ミスがあるかもしれません。ご了承ください。<br />また翻訳を修正・改善・加筆してくださる皆様のご協力を心からお待ちしています。
== 基礎 ==
#[[音響学の基礎]] {{進捗簡易|100%|2022-03-21}}
#[[室内音響学の基礎]] {{進捗簡易|100%|2022-03-21}}
#[[音響心理学の基礎]] {{進捗簡易|100%|2022-03-21}}
#[[音速]] {{進捗簡易|100%|2022-03-21}}
#[[フィルタの設計と実装]] {{進捗簡易|00%|2022-03-21}}
#[[ヘルムホルツ共鳴器の流れによる発振]] {{進捗簡易|00%|2022-03-21}}
#[[アクティブ制御]] {{進捗簡易|00%|2022-03-21}}
== 応用 ==
===運輸業界への応用 ===
#[[ローター・ステーター相互作用]]
#[[カーマフラー]]
#[[ソニックブーム]]
#[[ソナー]]
#[[車内音の伝達]]
=== 室内音響への応用 ===
#[[無響室・残響室]]
#[[室内音響の基本的な処理]]
=== 音響心理学への応用 ===
#[[人間の声帯]]
#[[聴覚の閾値/痛み]]
=== 音楽音響の応用 ===
#[[アコースティックギターの仕組み]]
#[[マリンバの基本的な音響特性]]
#[[ベッセル関数とティンパニ]]
#[[ヴァイオリンの音響|バイオリンの音響]]
#[[マイクの技術]]
#[[マイクの設計と操作]]
#[[音響拡声器]]
#[[密閉型サブウーファーの設計]]
=== その他の応用 ===
#[[バスレフ型エンクロージャーの設計]]
#[[高分子薄膜音響フィルター]]
#[[油圧システムにおける騒音]]
#[[冷却ファンの騒音]]
#[[圧電振動子]]
#[[雷の発生と伝搬]]
{{NDC|424}}
[[Category:音楽理論|おんがくりろん]]
[[Category:物理学]]
p6blcowm9xwfhl4gp43a8eubzgdwcqu
音響心理学の基礎
0
33769
206208
195935
2022-08-04T11:24:50Z
2001:318:E10D:1D:D937:7B96:1EFB:CCA4
/* 音の知覚 */
wikitext
text/x-wiki
{{Navi|[[音楽]] > [[音楽理論]] > [[音響学]] > '''音響心理学の基礎'''}}
[https://ja.m.wikipedia.org/wiki/%E3%82%B0%E3%82%B9%E3%82%BF%E3%83%95%E3%83%BB%E3%83%95%E3%82%A7%E3%83%92%E3%83%8A%E3%83%BC グスタフ・テオドール・フェヒナー]によって発表された有名な原理により、知覚の感覚は直線的な法則ではなく、対数的な法則に従うことが知られています。光の強さの知覚や重さの感覚も、この法則に従います。このことから、音響の分野でも対数の尺度を使うことが正当化されます。80 dB (10-4 W/m²) の音は、70 dB (10-5 W/m²) の音の2倍の音量に見えますが、2つの音響パワーの間には10の因子があるのです。これは非常にナイーブな法則ですが、聴覚的な感覚を表現しようとすることで、音響学の新しい考え方につながりました。それが音響心理学の狙いです。現代でも、人間の聴覚の神経生理学的なメカニズムがうまくモデル化されていないため、音響心理学に取り組むには、音のさまざまな側面を最もよく表現する指標を見つけるしかありません。
== 音の知覚 ==
音の知覚の研究は、人間の耳の仕組みが複雑であるため、限界があります。下図は知覚の領域と痛みと聴き取りの閾値を表したものです。痛覚の閾値は周波数に依存しません(可聴帯域で120dB程度)。反対に、聞き取り閾値は、すべての等ラウドネス曲線と同様に、周波数に依存します。
[[Image:Audible.JPG|center]]
== phonsとsones ==
=== phons ===
人間の耳には周波数感受性があるため、同じ強さの2つの音は同じ大きさにはなりません。100 Hzで80 dBの音は、3 kHzで80 dBの音ほど大きくはないのです。倍音の大きさを表すために、phon(フォーンと発音する)と言う新しい単位が使われます。X phonsは「1000 HzでX dBの音量」というような意味で使われます。もう一つの方法として、イコールラウドネスカーブ(別名フレッチャーカーブ)が使われるようになりました。
[[Image:Curve isofoniche.svg|center]]
=== sones ===
現在使われているもう一つの尺度は、音の大きさの経験則に基づくsone (ソーンと発音する)です。この法則は、音が2倍の大きさに感じられるには、音の強さを10倍にしなければならないというものです。デシベル(またはphon)スケールでは、10dB(またはphons)の増加に相当します。soneスケールの目的は、これらのスケールを線形に変換することです。
<math>\log (S) = 0,03(L_{ph} - 40)</math>
ここで、Sはsone、<math>L_{ph}</math>はphonを表します。変換表は次の通りです。
{| class="wikitable" style="text-align:center;"
!Phons || Sones
|-
|100 || 64
|-
|90 || 32
|-
|80 || 16
|-
|70 || 8
|-
|60 || 4
|-
|50 || 2
|-
|40 || 1
|}
== 測定基準 ==
ここでは、人間の主観的な感覚を予測する方法を提供するために、5つの音響心理学的パラメータを紹介しましょう。
=== dB A ===
soneやphonスケールで騒音知覚を測定することは容易ではありません。広く使われている測定方法は、音圧レベルを周波数分割に従って重み付けする方法です。密度スペクトルの各周波数に対して、レベル補正が行われます。異なる音の強さにおける人間の耳を近似するために、様々な種類の重み付け(dB A、dB B、dB C)が存在するが、最も一般的に使用されているのはdB Aフィルターです。そのカーブは、40phonの耳の等ラウドネスカーブに一致するように作られており、結果としてphonスケールの良い近似となるのです。
<center>[[Image:dba.JPG]]</center>
例:倍音が40dBの音に対して、200Hzで-10dBの補正がかかるので、この音は30dB Aとなる。
=== ラウドネス (Loudness) ===
音の強さを測定するものです。ラウドネスはsone単位で測定でき、音響心理学では支配的な指標となっています。
=== トナリティー (Tonality) ===
人間の耳は純粋な倍音に非常に敏感であるため、この指標は非常に重要なものです。ノイズスペクトルに含まれる純粋な音の数を測定します。例えば、広帯域の音は、非常に低い階調を持っています。
=== ラフネス (Roughness) ===
音の時間的変化に対する人間の知覚を表しています。この指標はasper で測定されます。
=== シャープネス (Sharpness) ===
シャープネスは、音のスペクトルの特徴と関連しています。高周波の信号は、シャープネスの値が高くなります。この指標はacumで測定されます。
=== ブロッキング効果 (Blocking effect) ===
正弦波は、帯域を狭めたホワイトノイズによってマスキングされることがあります。ホワイトノイズとは、パワースペクトル密度が平坦なランダムな信号のことです。言い換えれば、この信号のパワースペクトル密度は、与えられた帯域幅を持つ、どの中心周波数でも、どの帯域でも同じパワーを持っています。ホワイトノイズの強度が十分に高ければ、正弦波は聞こえなくなります。例えば、騒がしい環境(街中や作業場)では、誰かの話し声を聞き分けるために注意深くならないといけないことです。
emnqu2p8jqmjbaz21e3lwikrbehya0b
206209
206208
2022-08-04T11:28:39Z
2001:318:E10D:1D:D937:7B96:1EFB:CCA4
/* phonsとsones */
wikitext
text/x-wiki
{{Navi|[[音楽]] > [[音楽理論]] > [[音響学]] > '''音響心理学の基礎'''}}
[https://ja.m.wikipedia.org/wiki/%E3%82%B0%E3%82%B9%E3%82%BF%E3%83%95%E3%83%BB%E3%83%95%E3%82%A7%E3%83%92%E3%83%8A%E3%83%BC グスタフ・テオドール・フェヒナー]によって発表された有名な原理により、知覚の感覚は直線的な法則ではなく、対数的な法則に従うことが知られています。光の強さの知覚や重さの感覚も、この法則に従います。このことから、音響の分野でも対数の尺度を使うことが正当化されます。80 dB (10-4 W/m²) の音は、70 dB (10-5 W/m²) の音の2倍の音量に見えますが、2つの音響パワーの間には10の因子があるのです。これは非常にナイーブな法則ですが、聴覚的な感覚を表現しようとすることで、音響学の新しい考え方につながりました。それが音響心理学の狙いです。現代でも、人間の聴覚の神経生理学的なメカニズムがうまくモデル化されていないため、音響心理学に取り組むには、音のさまざまな側面を最もよく表現する指標を見つけるしかありません。
== 音の知覚 ==
音の知覚の研究は、人間の耳の仕組みが複雑であるため、限界があります。下図は知覚の領域と痛みと聴き取りの閾値を表したものです。痛覚の閾値は周波数に依存しません(可聴帯域で120dB程度)。反対に、聞き取り閾値は、すべての等ラウドネス曲線と同様に、周波数に依存します。
[[Image:Audible.JPG|center]]
== phonsとsones ==
=== phons ===
人間の耳には周波数感受性があるため、同じ強さの2つの音は同じ大きさにはなりません。100 Hzで80 dBの音は、3 kHzで80 dBの音ほど大きくはないのです。倍音の大きさを表すために、phon(フォーンと発音する)と言う新しい単位が使われます。X phonsは「1000 HzでX dBの音量」というような意味で使われます。もう一つの方法として、等ラウドネス曲線(別名でフレッチャー曲線)が使われるようになりました。
[[Image:Curve isofoniche.svg|center]]
=== sones ===
現在使われているもう一つの尺度は、音の大きさの経験則に基づくsone (ソーンと発音する)です。この法則は、音が2倍の大きさに感じられるには、音の強さを10倍にしなければならないというものです。デシベル(またはphon)スケールでは、10dB(またはphons)の増加に相当します。soneスケールの目的は、これらのスケールを線形に変換することです。
<math>\log (S) = 0,03(L_{ph} - 40)</math>
ここで、Sはsone、<math>L_{ph}</math>はphonを表します。変換表は次の通りです。
{| class="wikitable" style="text-align:center;"
!Phons || Sones
|-
|100 || 64
|-
|90 || 32
|-
|80 || 16
|-
|70 || 8
|-
|60 || 4
|-
|50 || 2
|-
|40 || 1
|}
== 測定基準 ==
ここでは、人間の主観的な感覚を予測する方法を提供するために、5つの音響心理学的パラメータを紹介しましょう。
=== dB A ===
soneやphonスケールで騒音知覚を測定することは容易ではありません。広く使われている測定方法は、音圧レベルを周波数分割に従って重み付けする方法です。密度スペクトルの各周波数に対して、レベル補正が行われます。異なる音の強さにおける人間の耳を近似するために、様々な種類の重み付け(dB A、dB B、dB C)が存在するが、最も一般的に使用されているのはdB Aフィルターです。そのカーブは、40phonの耳の等ラウドネスカーブに一致するように作られており、結果としてphonスケールの良い近似となるのです。
<center>[[Image:dba.JPG]]</center>
例:倍音が40dBの音に対して、200Hzで-10dBの補正がかかるので、この音は30dB Aとなる。
=== ラウドネス (Loudness) ===
音の強さを測定するものです。ラウドネスはsone単位で測定でき、音響心理学では支配的な指標となっています。
=== トナリティー (Tonality) ===
人間の耳は純粋な倍音に非常に敏感であるため、この指標は非常に重要なものです。ノイズスペクトルに含まれる純粋な音の数を測定します。例えば、広帯域の音は、非常に低い階調を持っています。
=== ラフネス (Roughness) ===
音の時間的変化に対する人間の知覚を表しています。この指標はasper で測定されます。
=== シャープネス (Sharpness) ===
シャープネスは、音のスペクトルの特徴と関連しています。高周波の信号は、シャープネスの値が高くなります。この指標はacumで測定されます。
=== ブロッキング効果 (Blocking effect) ===
正弦波は、帯域を狭めたホワイトノイズによってマスキングされることがあります。ホワイトノイズとは、パワースペクトル密度が平坦なランダムな信号のことです。言い換えれば、この信号のパワースペクトル密度は、与えられた帯域幅を持つ、どの中心周波数でも、どの帯域でも同じパワーを持っています。ホワイトノイズの強度が十分に高ければ、正弦波は聞こえなくなります。例えば、騒がしい環境(街中や作業場)では、誰かの話し声を聞き分けるために注意深くならないといけないことです。
rhhy2qww7v8q2k0xy1xf6wezjazuxmt
テンプレート:Val
10
35283
206194
2022-08-04T03:09:44Z
Ef3
694
import from: https://ja.wikipedia.org/w/index.php?title=Template:Val&oldid=86889341
wikitext
text/x-wiki
<includeonly>{{{{{|safesubst:}}}#invoke:val|main}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
brlsfhppmajb86ubvmfmbbfc74wl08v
モジュール:Val
828
35284
206195
2022-08-04T03:14:44Z
Ef3
694
import from: https://ja.wikipedia.org/w/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Val&oldid=88024392
Scribunto
text/plain
-- For Template:Val, output a number and optional unit.
-- Format options include scientific and uncertainty notations.
local data_module = 'Module:Val/units'
local convert_module = 'Module:Convert'
local function valerror(msg, nocat, iswarning)
-- Return formatted message text for an error or warning.
-- Can append "#FormattingError" to URL of a page with a problem to find it.
local anchor = '<span id="FormattingError"></span>'
local body, category
if nocat or mw.title.getCurrentTitle():inNamespaces(1, 2, 3, 5) then
-- No category in Talk, User, User_talk, or Wikipedia_talk.
category = ''
else
category = '[[Category:Pages with incorrect formatting templates use]]'
end
iswarning = false -- problems are infrequent so try showing large error so editor will notice
if iswarning then
body = '<sup class="noprint Inline-Template" style="white-space:nowrap;">' ..
'[[Template:Val|<span title="' ..
msg:gsub('"', '"') ..
'">warning</span>]]</sup>'
else
body = '<strong class="error">' ..
'Error in {{[[Template:val|val]]}}: ' ..
msg ..
'</strong>'
end
return anchor .. body .. category
end
local range_types = {
-- No need for ' ' because nowrap applies to all output.
[","] = ", ",
["by"] = " by ",
["-"] = "–",
["–"] = "–",
["and"] = " and ",
["or"] = " or " ,
["to"] = " to " ,
["x"] = " × ",
["×"] = " × ",
["/"] = "/",
["~"] = "〜",
["〜"] = "〜",
}
local range_repeat_unit = {
-- WP:UNIT wants unit repeated when a "multiply" range is used.
["x"] = true,
["×"] = true,
}
local function extract_item(index, numbers, arg)
-- Extract an item from arg and store the result in numbers[index].
-- If no argument or if argument is valid, return nil (no error);
-- otherwise, return an error message.
-- The stored result is:
-- * a table for a number (empty if there was no specified number); or
-- * a string for range text
-- Input like 1e3 is regarded as invalid for all except argument 1
-- which accepts e notation as an alternative to the 'e' argument.
-- Input commas are removed so 1,234 is the same as 1234.
local which = index
local function fail(msg)
local description
if which == 'e' then
description = 'exponent parameter (<b>e</b>)'
else
description = 'parameter ' .. which
end
return description .. ' ' .. (msg or 'is not a valid number') .. '.'
end
local result = {}
local range = range_types[arg]
if range then
if type(index) == 'number' and (index % 2 == 0) then
if index == 2 then
if numbers[1] and numbers[1].exp then
return fail('cannot use a range if the first parameter includes "e"')
end
numbers.has_ranges = true
else
if not numbers.has_ranges then
return fail('needs a range in parameter 2')
end
end
numbers[index] = range
if range_repeat_unit[arg] then
-- Any "repeat" range forces unit (if any) to be repeated for all items.
numbers.isrepeat = true
end
return nil
end
return fail('does not accept a range')
end
if numbers.has_ranges and type(index) == 'number' and (index % 2 == 0) then
return fail('should be a range')
end
if index == 'e' then
local e = numbers[1] and numbers[1].exp
if e then
if arg then
return fail('cannot be used if the first parameter includes "e"')
end
arg = e
which = 1
end
end
if arg and arg ~= '' then
arg = arg:gsub(',', '')
if arg:sub(1, 1) == '(' and arg:sub(-1) == ')' then
result.parens = true
arg = arg:sub(2, -2)
end
local a, b = arg:match('^(.+)[Ee](.+)$')
if a then
if index == 1 then
arg = a
result.exp = b
else
return fail('cannot use e notation')
end
end
local isnegative, propersign, prefix
local minus = '−'
prefix, arg = arg:match('^(.-)([%d.]+)$')
local value = tonumber(arg)
if not value then
return fail()
end
if arg:sub(1, 1) == '.' then
arg = '0' .. arg
end
if prefix == '' then
-- Ignore.
elseif prefix == '±' then
-- Display for first number, ignore for others.
if index == 1 then
propersign = '±'
end
elseif prefix == '+' then
propersign = '+'
elseif prefix == '-' or prefix == minus then
propersign = minus
isnegative = true
else
return fail()
end
result.clean = arg
result.sign = propersign or ''
result.value = isnegative and -value or value
end
numbers[index] = result
return nil -- no error
end
local function get_args(numbers, args)
-- Extract arguments and store the results in numbers.
-- Return nothing (no error) if ok; otherwise, return an error message.
for index = 1, 99 do
local which = index
local arg = args[which] -- has been trimmed
if not arg then
which = 'e'
arg = args[which]
end
local msg = extract_item(which, numbers, arg)
if msg then
return msg
end
if which == 'e' then
break
end
if index > 19 then
return 'too many parameters'
end
end
if numbers.has_ranges and (#numbers % 2 == 0) then
return 'need a number after the last parameter because it is a range.'
end
end
local function get_scale(text, ucode)
-- Return the value of text as a number, or throw an error.
-- This supports extremely basic expressions of the form:
-- a / b
-- a ^ b
-- where a and b are numbers or 'pi'.
local n = tonumber(text)
if n then
return n
end
n = text:gsub('pi', math.pi)
for _, op in ipairs({ '/', '^' }) do
local a, b = n:match('^(.-)' .. op .. '(.*)$')
if a then
a = tonumber(a)
b = tonumber(b)
if a and b then
if op == '/' then
return a / b
elseif op == '^' then
return a ^ b
end
end
break
end
end
error('Unit "' .. ucode .. '" has invalid scale "' .. text .. '"')
end
local function get_builtin_unit(ucode, definitions)
-- Return table of information for the specified built-in unit, or nil if not known.
-- Each defined unit code must be followed by two spaces (not tab characters).
local _, pos = definitions:find('\n' .. ucode .. ' ', 1, true)
if pos then
local endline = definitions:find('%s*\n', pos)
if endline then
local result = {}
local n = 0
local text = definitions:sub(pos + 1, endline - 1):gsub('%s%s+', '\t')
for item in (text .. '\t'):gmatch('(%S.-)\t') do
if item == 'ALIAS' then
result.alias = true
elseif item == 'ANGLE' then
result.isangle = true
result.nospace = true
elseif item == 'NOSPACE' then
result.nospace = true
elseif item == 'SI' then
result.si = true
else
n = n + 1
if n == 1 then
local link, symbol = item:match('^%[%[([^|]+)|(.+)%]%]$')
if link then
result.symbol = symbol
result.link = link
n = 2
else
result.symbol = item
end
elseif n == 2 then
result.link = item
elseif n == 3 then
result.scale_text = item
result.scale = get_scale(item, ucode)
else
result.more_ignored = item
break
end
end
end
if result.si then
local s = result.symbol
if ucode == 'mc' .. s or ucode == 'mu' .. s then
result.ucode = 'µ' .. s -- unit code for convert should be this
end
end
if n >= 2 or (n >= 1 and result.alias) then
return result
end
-- Ignore invalid definition, treating it as a comment.
end
end
end
local function convert_lookup(ucode, value, scaled_top, want_link, si, options)
local lookup = require(convert_module)._unit
return lookup(ucode, {
value = value,
scaled_top = scaled_top,
link = want_link,
si = si,
sort = options.sortable,
})
end
local function get_unit(ucode, value, scaled_top, options)
local want_link = options.want_link
if scaled_top then
want_link = options.want_per_link
end
local data = mw.loadData(data_module)
local result = options.want_longscale and
get_builtin_unit(ucode, data.builtin_units_long_scale) or
get_builtin_unit(ucode, data.builtin_units)
local si, use_convert
if result then
if result.alias then
ucode = result.symbol
use_convert = true
end
if result.scale then
-- Setting si means convert will use the unit as given, and the sort key
-- will be calculated from the value without any extra scaling that may
-- occur if convert found the unit code. For example, if val defines the
-- unit 'year' with a scale and if si were not set, convert would also apply
-- its own scale because convert knows that a year is 31,557,600 seconds.
si = { result.symbol, result.link }
value = value * result.scale
end
if result.si then
ucode = result.ucode or ucode
si = { result.symbol, result.link }
use_convert = true
end
else
result = {}
use_convert = true
end
local convert_unit = convert_lookup(ucode, value, scaled_top, want_link, si, options)
result.sortkey = convert_unit.sortspan
if use_convert then
result.text = convert_unit.text
result.scaled_top = convert_unit.scaled_value
else
if want_link then
result.text = '[[' .. result.link .. '|' .. result.symbol .. ']]'
else
result.text = result.symbol
end
result.scaled_top = value
end
return result
end
local function makeunit(value, options)
-- Return table of information for the requested unit and options, or
-- return nil if no unit.
options = options or {}
local unit
local ucode = options.u
local percode = options.per
if ucode then
unit = get_unit(ucode, value, nil, options)
elseif percode then
unit = { nospace = true, scaled_top = value }
else
return nil
end
local text = unit.text or ''
local sortkey = unit.sortkey
if percode then
local function bracketed(code, text)
return code:find('[*./]') and '(' .. text .. ')' or text
end
local perunit = get_unit(percode, 1, unit.scaled_top, options)
text = (ucode and bracketed(ucode, text) or '') ..
'/' .. bracketed(percode, perunit.text)
sortkey = perunit.sortkey
end
if not (unit.nospace or options.nospace) then
text = ' ' .. text
end
return { text = text, isangle = unit.isangle, sortkey = sortkey }
end
local function list_units(mode)
-- Return wikitext to list the built-in units.
-- A unit code should not contain wikimarkup so don't bother escaping.
local data = mw.loadData(data_module)
local definitions = data.builtin_units .. data.builtin_units_long_scale
local last_was_blank = true
local n = 0
local result = {}
local function add(line)
if line == '' then
last_was_blank = true
else
if last_was_blank and n > 0 then
n = n + 1
result[n] = ''
end
last_was_blank = false
n = n + 1
result[n] = line
end
end
local si_prefixes = {
-- These are the prefixes recognized by convert; u is accepted for micro.
y = 'y',
z = 'z',
a = 'a',
f = 'f',
p = 'p',
n = 'n',
u = 'µ',
['µ'] = 'µ',
m = 'm',
c = 'c',
d = 'd',
da = 'da',
h = 'h',
k = 'k',
M = 'M',
G = 'G',
T = 'T',
P = 'P',
E = 'E',
Z = 'Z',
Y = 'Y',
}
local function is_valid(ucode, unit)
if unit and not unit.more_ignored then
assert(type(unit.symbol) == 'string' and unit.symbol ~= '')
if unit.alias then
if unit.link or unit.scale_text or unit.si then
return false
end
end
if unit.si then
if unit.scale_text then
return false
end
ucode = unit.ucode or ucode
local base = unit.symbol
if ucode == base then
unit.display = base
return true
end
local plen = #ucode - #base
if plen > 0 then
local prefix = si_prefixes[ucode:sub(1, plen)]
if prefix and ucode:sub(plen + 1) == base then
unit.display = prefix .. base
return true
end
end
else
unit.display = unit.symbol
return true
end
end
return false
end
local lookup = require(convert_module)._unit
local function show_convert(ucode, unit)
-- If a built-in unit defines a scale or sets the SI flag, any unit defined in
-- convert is not used (the scale or SI prefix's scale is used for a sort key).
-- If there is no scale or SI flag, and the unit is not defined in convert,
-- the sort key may not be correct; this allows such units to be identified.
if not (unit.si or unit.scale_text) then
if mode == 'convert' then
unit.show = not lookup(unit.alias and unit.symbol or ucode).unknown
unit.show_text = 'CONVERT'
elseif mode == 'unknown' then
unit.show = lookup(unit.alias and unit.symbol or ucode).unknown
unit.show_text = 'UNKNOWN'
elseif not unit.alias then
-- Show convert's scale in square brackets ('[1]' for an unknown unit).
-- Don't show scale for an alias because it's misleading for temperature
-- and an alias is probably not useful for anything else.
local scale = lookup(ucode, {value=1, sort='on'}).scaled_value
if type(scale) == 'number' then
scale = string.format('%.5g', scale):gsub('e%+?(%-?)0*(%d+)', 'e%1%2')
else
scale = '?'
end
unit.show = true
unit.show_text = '[' .. scale .. ']'
end
end
end
for line in definitions:gmatch('([^\n]*)\n') do
local pos, _ = line:find(' ', 1, true)
if pos then
local ucode = line:sub(1, pos - 1)
local unit = get_builtin_unit(ucode, '\n' .. line .. '\n')
if is_valid(ucode, unit) then
show_convert(ucode, unit)
local flags, text
if unit.alias then
text = unit.symbol
else
text = '[[' .. unit.link .. '|' .. unit.display .. ']]'
end
if unit.isangle then
unit.nospace = nil -- don't show redundant flag
end
for _, f in ipairs({
{ 'alias', 'ALIAS' },
{ 'isangle', 'ANGLE' },
{ 'nospace', 'NOSPACE' },
{ 'si', 'SI' },
{ 'scale_text', unit.scale_text },
{ 'show', unit.show_text },
}) do
if unit[f[1]] then
local t = f[2]
if t:match('^%u+$') then
t = '<small>' .. t .. '</small>'
end
if flags then
flags = flags .. ' ' .. t
else
flags = t
end
end
end
if flags then
text = text .. ' • ' .. flags
end
add(ucode .. ' = ' .. text .. '<br />')
else
add(line .. ' ◆ <b>invalid definition</b><br />')
end
else
add(line)
end
end
return table.concat(result, '\n')
end
-- Creates tables where each element is a different group of the number
local function groups(num)
local nstr = tostring(num)
local decimalloc = nstr:find('.', 1, true)
local int_part, frac_part
if decimalloc == nil then
int_part = nstr
else
int_part = nstr:sub(1, decimalloc-1)
frac_part = nstr:sub(decimalloc + 1)
end
-- only define ret_i as an empty table, let ret_d stay nil
local ret_i,ret_d = {}
if int_part:len() ~= 4 then
-- Loop to handle most of the groupings; from right to left, so that if a group has less than 3 members, it will be the first group
while int_part:len() > 3 do
-- Insert in first spot, since we're moving backwards
table.insert(ret_i,1,int_part:sub(-3))
int_part = int_part:sub(1,-4)
end
end
-- handle any left over numbers
if int_part:len() > 0 then
table.insert(ret_i,1,int_part)
end
if decimalloc ~= nil then
ret_d = {}
if frac_part:len() ~= 4 then
while frac_part:len() > 3 do
table.insert(ret_d,frac_part:sub(1,3))
frac_part = frac_part:sub(4)
end
end
if frac_part:len() > 0 then
table.insert(ret_d,frac_part)
end
end
return ret_i,ret_d
end
-- local delimit_groups = require('Module:Gapnum').groups
local function delimit(sign, numstr, fmt)
-- Return sign and numstr (unsigned digits or '.' only) after formatting.
-- Four-digit integers are not formatted with gaps.
fmt = (fmt or ''):lower()
if fmt == 'none' or (fmt == '' and #numstr == 4 and numstr:match('^%d+$')) then
return sign .. numstr
end
-- Group number by integer and decimal parts.
-- If there is no decimal part, delimit_groups returns only one table.
local ipart, dpart = groups(numstr)
local result
if fmt == 'commas' then
result = sign .. table.concat(ipart, ',')
if dpart then
result = result .. '.' .. table.concat(dpart)
end
else
-- Delimit with a small gap by default.
local groups = {}
groups[1] = table.remove(ipart, 1)
for _, v in ipairs(ipart) do
table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>')
end
if dpart then
table.insert(groups, '.' .. (table.remove(dpart, 1) or ''))
for _, v in ipairs(dpart) do
table.insert(groups, '<span style="margin-left:.25em;">' .. v .. '</span>')
end
end
result = sign .. table.concat(groups)
end
return result
end
local function sup_sub(sup, sub, align)
-- Return the same result as Module:Su except val defaults to align=right.
if align == 'l' or align == 'left' then
align = 'left'
elseif align == 'c' or align == 'center' then
align = 'center'
else
align = 'right'
end
return '<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:' ..
align .. ';">' .. sup .. '<br />' .. sub .. '</span>'
end
local function range_text(items, unit_table, options)
local fmt = options.fmt
local nend = items.nend or ''
if items.isrepeat or unit_table.isangle then
nend = nend .. unit_table.text
end
local text = ''
for i = 1, #items do
if i % 2 == 0 then
text = text .. items[i]
else
text = text .. delimit(items[i].sign, items[i].clean, fmt) .. nend
end
end
return text
end
local function uncertainty_text(uncertainty, unit_table, options)
local angle, text, need_parens
if unit_table.isangle then
angle = unit_table.text
end
local upper = uncertainty.upper or {}
local lower = uncertainty.lower or {}
local uncU = upper.clean
if uncU then
local fmt = options.fmt
local uncL = lower.clean
if uncL then
uncU = delimit('+', uncU, fmt) .. (upper.errend or '')
uncL = delimit('−', uncL, fmt) .. (lower.errend or '')
if angle then
uncU = uncU .. angle
uncL = uncL .. angle
end
text = (angle or '') ..
'<span style="margin-left:0.3em;">' ..
sup_sub(uncU, uncL, options.align) ..
'</span>'
else
if upper.parens then
text = '(' .. uncU .. ')' -- old template did not delimit
else
text = (angle or '') ..
'<span style="margin-left:0.3em;margin-right:0.15em;">±</span>' ..
delimit('', uncU, fmt)
need_parens = true
end
if uncertainty.errend then
text = text .. uncertainty.errend
end
if angle then
text = text .. angle
end
end
else
if angle then
text = angle
end
end
return text, need_parens
end
local function _main(values, unit_spec, options)
if options.sandbox then
data_module = data_module .. '/sandbox'
convert_module = convert_module .. '/sandbox'
end
local action = options.action
if action then
if action == 'list' then
-- Kludge: am using the align parameter (a=xxx) for type of list.
return list_units(options.align)
end
return valerror('invalid action "' .. action .. '".', options.nocat)
end
local number = values.number or (values.numbers and values.numbers[1]) or {}
local e_10 = options.e or {}
local novalue = (number.value == nil and e_10.clean == nil)
local fmt = options.fmt
local want_sort = true
local sortable = options.sortable
if sortable == 'off' or (sortable == nil and novalue) then
want_sort = false
elseif sortable == 'debug' then
-- Same as sortable = 'on' but the sort key is displayed.
else
sortable = 'on'
end
local sort_value = 1
if want_sort then
sort_value = number.value or 1
if e_10.value and sort_value ~= 0 then
-- The 'if' avoids {{val|0|e=1234}} giving an invalid sort_value due to overflow.
sort_value = sort_value * 10^e_10.value
end
end
local unit_table = makeunit(sort_value, {
u = unit_spec.u,
want_link = unit_spec.want_link,
per = unit_spec.per,
want_per_link = unit_spec.want_per_link,
nospace = novalue,
want_longscale = unit_spec.want_longscale,
sortable = sortable,
})
local sortkey
if unit_table then
if want_sort then
sortkey = unit_table.sortkey
end
else
unit_table = { text = '' }
if want_sort then
sortkey = convert_lookup('dummy', sort_value, nil, nil, nil, { sortable = sortable }).sortspan
end
end
local final_unit = unit_table.isangle and '' or unit_table.text
local e_text, n_text, need_parens
local uncertainty = values.uncertainty
if uncertainty then
if number.clean then
n_text = delimit(number.sign, number.clean, fmt) .. (number.nend or '')
local text
text, need_parens = uncertainty_text(uncertainty, unit_table, options)
if text then
n_text = n_text .. text
end
else
n_text = ''
end
else
if values.numbers.isrepeat then
final_unit = ''
end
n_text = range_text(values.numbers, unit_table, options)
need_parens = true
end
if e_10.clean then
if need_parens then
n_text = '(' .. n_text .. ')'
end
e_text = '10<sup>' .. delimit(e_10.sign, e_10.clean, fmt) .. '</sup>'
if number.clean then
e_text = '<span style="margin-left:0.25em;margin-right:0.15em;">×</span>' .. e_text
end
else
e_text = ''
end
local result =
(sortkey or '') ..
(options.prefix or '') ..
n_text ..
e_text ..
final_unit ..
(options.suffix or '')
if result ~= '' then
result = '<span class="nowrap">' .. result .. '</span>'
end
return result .. (options.warning or '')
end
local function check_parameters(args, has_ranges, nocat)
-- Return warning text for the first problem parameter found, or nothing if ok.
local whitelist = {
a = true,
action = true,
debug = true,
e = true,
['end'] = true,
errend = true,
['+errend'] = true,
['-errend'] = true,
fmt = true,
['long scale'] = true,
long_scale = true,
longscale = true,
nocategory = true,
p = true,
s = true,
sortable = true,
u = true,
ul = true,
up = true,
upl = true,
}
for k, v in pairs(args) do
if type(k) == 'string' and not whitelist[k] then
local warning = 'Val parameter "' .. k .. '=' .. v .. '" is not supported'
return valerror(warning, nocat, true)
end
end
if not has_ranges and args[4] then
return valerror('Val parameter 4 ignored', nocat, true)
end
end
local function main(frame)
local getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame, {wrappers = { 'Template:Val' }})
local nocat = args.nocategory
local numbers = {} -- table of number tables, perhaps with range text
local msg = get_args(numbers, args)
if msg then
return valerror(msg, nocat)
end
if args.u and args.ul then
return valerror('unit (<b>u</b>) and unit with link (<b>ul</b>) are both specified, only one is allowed.', nocat)
end
if args.up and args.upl then
return valerror('unit per (<b>up</b>) and unit per with link (<b>upl</b>) are both specified, only one is allowed.', nocat)
end
local values
if numbers.has_ranges then
-- Multiple values with range separators but no uncertainty.
numbers.nend = args['end']
values = {
numbers = numbers,
}
else
-- A single value with optional uncertainty.
local function setfield(i, dst, src)
local v = args[src]
if v then
if numbers[i] then
numbers[i][dst] = v
else
numbers[i] = { [dst] = v }
end
end
end
setfield(1, 'nend', 'end')
setfield(2, 'errend', '+errend')
setfield(3, 'errend', '-errend')
values = {
number = numbers[1],
uncertainty = {
upper = numbers[2],
lower = numbers[3],
errend = args.errend,
}
}
end
local unit_spec = {
u = args.ul or args.u,
want_link = args.ul ~= nil,
per = args.upl or args.up,
want_per_link = args.upl ~= nil,
want_longscale = (args.longscale or args.long_scale or args['long scale']) == 'on',
}
local options = {
action = args.action,
align = args.a,
e = numbers.e,
fmt = args.fmt,
nocat = nocat,
prefix = args.p,
sandbox = string.find(frame:getTitle(), 'sandbox', 1, true) ~= nil,
sortable = args.sortable or (args.debug == 'yes' and 'debug' or nil),
suffix = args.s,
warning = check_parameters(args, numbers.has_ranges, nocat),
}
return _main(values, unit_spec, options)
end
return { main = main, _main = _main }
ch4eltlgkm3e80eoawcb6c1jrd30iil
モジュール:Convert
828
35285
206196
2022-08-04T03:18:23Z
Ef3
694
import from: https://ja.wikipedia.org/w/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Convert&oldid=86009562
Scribunto
text/plain
-- Convert a value from one unit of measurement to another.
-- Example: {{convert|123|lb|kg}} --> 123 pounds (56 kg)
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
local MINUS = '−' -- Unicode U+2212 MINUS SIGN (UTF-8: e2 88 92)
local abs = math.abs
local floor = math.floor
local format = string.format
local log10 = math.log10
local ustring = mw.ustring
local ulen = ustring.len
local usub = ustring.sub
-- Configuration options to keep magic values in one location.
-- Conversion data and message text are defined in separate modules.
local config, maxsigfig
local numdot -- must be '.' or ',' or a character which works in a regex
local numsep, numsep_remove, numsep_remove2
local data_code, all_units
local text_code
local varname -- can be a code to use variable names that depend on value
local from_en_table -- to translate an output string of en digits to local language
local to_en_table -- to translate an input string of digits in local language to en
-- Use translation_table in convert/text to change the following.
local en_default -- true uses lang=en unless convert has lang=local or local digits
local group_method = 3 -- code for how many digits are in a group
local per_word = 'per' -- for units like "liters per kilometer"
local plural_suffix = '' -- only other useful value is probably '' to disable plural unit names
local plural_suffix_us = 's' -- for name2_us
local omitsep -- true to omit separator before local symbol/name
-- All units should be defined in the data module. However, to cater for quick changes
-- and experiments, any unknown unit is looked up in an extra data module, if it exists.
-- That module would be transcluded in only a small number of pages, so there should be
-- little server overhead from making changes, and changes should propagate quickly.
local extra_module -- name of module with extra units
local extra_units -- nil or table of extra units from extra_module
-- Some options in the invoking template can set variables used later in the module.
local currency_text -- for a user-defined currency symbol: {{convert|12|$/ha|$=€}} (euro replaces dollar)
local function from_en(text)
-- Input is a string representing a number in en digits with '.' decimal mark,
-- without digit grouping (which is done just after calling this).
-- Return the translation of the string with numdot and digits in local language.
if numdot ~= '.' then
text = text:gsub('%.', numdot)
end
if from_en_table then
text = text:gsub('%d', from_en_table)
end
return text
end
local function to_en(text)
-- Input is a string representing a number in the local language with
-- an optional numdot decimal mark and numsep digit grouping.
-- Return the translation of the string with '.' mark and en digits,
-- and no separators (they have to be removed here to handle cases like
-- numsep = '.' and numdot = ',' with input "1.234.567,8").
if to_en_table then
text = ustring.gsub(text, '%d', to_en_table)
end
if numsep_remove then
text = text:gsub(numsep_remove, '')
end
if numsep_remove2 then
text = text:gsub(numsep_remove2, '')
end
if numdot ~= '.' then
text = text:gsub(numdot, '.')
end
return text
end
local function decimal_mark(text)
-- Return ',' if text probably is using comma for decimal mark, or has no decimal mark.
-- Return '.' if text probably is using dot for decimal mark.
-- Otherwise return nothing (decimal mark not known).
if not text:find('[.,]') then return ',' end
text = text:gsub('^%-', ''):gsub('%+%d+/%d+$', ''):gsub('[Ee]%-?%d+$', '')
local decimal =
text:match('^0?([.,])%d+$') or
text:match('%d([.,])%d?%d?$') or
text:match('%d([.,])%d%d%d%d+$')
if decimal then return decimal end
if text:match('%.%d+%.') then return ',' end
if text:match('%,%d+,') then return '.' end
end
local add_warning, with_separator -- forward declarations
local function to_en_with_check(text, parms)
-- Version of to_en() for a wiki using numdot = ',' and numsep = '.' to check
-- text (an input number as a string) which might have been copied from enwiki.
-- For example, in '1.234' the '.' could be a decimal mark or a group separator.
-- From viwiki.
if to_en_table then
text = ustring.gsub(text, '%d', to_en_table)
end
if decimal_mark(text) == '.' then
local original = text
text = text:gsub(',', '') -- for example, interpret "1,234.5" as an enwiki value
if parms then
add_warning(parms, 0, 'cvt_enwiki_num', original, with_separator({}, text))
end
else
if numsep_remove then
text = text:gsub(numsep_remove, '')
end
if numsep_remove2 then
text = text:gsub(numsep_remove2, '')
end
if numdot ~= '.' then
text = text:gsub(numdot, '.')
end
end
return text
end
local function omit_separator(id)
-- Return true if there should be no separator before id (a unit symbol or name).
-- For zhwiki, there should be no separator if id uses local characters.
-- The following kludge should be a sufficient test.
if omitsep then
if id:sub(1, 2) == '-{' then -- for "-{...}-" content language variant
return true
end
if id:byte() > 127 then
local first = usub(id, 1, 1)
if first ~= 'Å' and first ~= '°' and first ~= 'µ' then
return true
end
end
end
return id:sub(1, 1) == '/' -- no separator before units like "/ha"
end
local spell_module -- name of module that can spell numbers
local speller -- function from that module to handle spelling (set if needed)
local wikidata_module, wikidata_data_module -- names of Wikidata modules
local wikidata_code, wikidata_data -- exported tables from those modules (set if needed)
local function set_config(args)
-- Set configuration options from template #invoke or defaults.
config = args
maxsigfig = config.maxsigfig or 14 -- maximum number of significant figures
local data_module, text_module
local sandbox = config.sandbox and ('/' .. config.sandbox) or ''
data_module = "Module:Convert/data" .. sandbox
text_module = "Module:Convert/text" .. sandbox
extra_module = "Module:Convert/extra" .. sandbox
wikidata_module = "Module:Convert/wikidata" .. sandbox
wikidata_data_module = "Module:Convert/wikidata/data" .. sandbox
spell_module = "Module:ConvertNumeric"
data_code = mw.loadData(data_module)
text_code = mw.loadData(text_module)
all_units = data_code.all_units
local translation = text_code.translation_table
if translation then
numdot = translation.numdot
numsep = translation.numsep
if numdot == ',' and numsep == '.' then
if text_code.all_messages.cvt_enwiki_num then
to_en = to_en_with_check
end
end
if translation.group then
group_method = translation.group
end
if translation.per_word then
per_word = translation.per_word
end
if translation.plural_suffix then
plural_suffix = translation.plural_suffix
end
if translation.plural_suffix_us then
plural_suffix_us = translation.plural_suffix_us
end
varname = translation.varname
from_en_table = translation.from_en
local use_workaround = true
if use_workaround then
-- 2013-07-05 workaround bug by making a copy of the required table.
-- mw.ustring.gsub fails with a table (to_en_table) as the replacement,
-- if the table is accessed via mw.loadData.
local source = translation.to_en
if source then
to_en_table = {}
for k, v in pairs(source) do
to_en_table[k] = v
end
end
else
to_en_table = translation.to_en
end
if translation.lang == 'en default' then
en_default = true -- for hiwiki
end
omitsep = translation.omitsep -- for zhwiki
end
numdot = config.numdot or numdot or '.' -- decimal mark before fractional digits
numsep = config.numsep or numsep or ',' -- group separator for numbers
-- numsep should be ',' or '.' or '' or ' ' or a Unicode character.
-- numsep_remove must work in a regex to identify separators to be removed.
if numsep ~= '' then
numsep_remove = (numsep == '.') and '%.' or numsep
end
if numsep ~= ',' and numdot ~= ',' then
numsep_remove2 = ',' -- so numbers copied from enwiki will work
end
end
local function collection()
-- Return a table to hold items.
return {
n = 0,
add = function (self, item)
self.n = self.n + 1
self[self.n] = item
end,
}
end
local function divide(numerator, denominator)
-- Return integers quotient, remainder resulting from dividing the two
-- given numbers, which should be unsigned integers.
local quotient, remainder = floor(numerator / denominator), numerator % denominator
if not (0 <= remainder and remainder < denominator) then
-- Floating point limits may need this, as in {{convert|160.02|Ym|ydftin}}.
remainder = 0
end
return quotient, remainder
end
local function split(text, delimiter)
-- Return a numbered table with fields from splitting text.
-- The delimiter is used in a regex without escaping (for example, '.' would fail).
-- Each field has any leading/trailing whitespace removed.
local t = {}
text = text .. delimiter -- to get last item
for item in text:gmatch('%s*(.-)%s*' .. delimiter) do
table.insert(t, item)
end
return t
end
local function strip(text)
-- If text is a string, return its content with no leading/trailing
-- whitespace. Otherwise return nil (a nil argument gives a nil result).
if type(text) == 'string' then
return text:match("^%s*(.-)%s*$")
end
end
local function table_len(t)
-- Return length (<100) of a numbered table to replace #t which is
-- documented to not work if t is accessed via mw.loadData().
for i = 1, 100 do
if t[i] == nil then
return i - 1
end
end
end
local function wanted_category(catkey, catsort, want_warning)
-- Return message category if it is wanted in current namespace,
-- otherwise return ''.
local cat
local title = mw.title.getCurrentTitle()
if title then
local nsdefault = '0' -- default namespace: '0' = article; '0,10' = article and template
local namespace = title.namespace
for _, v in ipairs(split(config.nscat or nsdefault, ',')) do
if namespace == tonumber(v) then
cat = text_code.all_categories[want_warning and 'warning' or catkey]
if catsort and catsort ~= '' and cat:sub(-2) == ']]' then
cat = cat:sub(1, -3) .. '|' .. mw.text.nowiki(usub(catsort, 1, 20)) .. ']]'
end
break
end
end
end
return cat or ''
end
local function message(parms, mcode, is_warning)
-- Return wikitext for an error message, including category if specified
-- for the message type.
-- mcode = numbered table specifying the message:
-- mcode[1] = 'cvt_xxx' (string used as a key to get message info)
-- mcode[2] = 'parm1' (string to replace '$1' if any in message)
-- mcode[3] = 'parm2' (string to replace '$2' if any in message)
-- mcode[4] = 'parm3' (string to replace '$3' if any in message)
local msg
if type(mcode) == 'table' then
if mcode[1] == 'cvt_no_output' then
-- Some errors should cause convert to output an empty string,
-- for example, for an optional field in an infobox.
return ''
end
msg = text_code.all_messages[mcode[1]]
end
parms.have_problem = true
local function subparm(fmt, ...)
local rep = {}
for i, v in ipairs({...}) do
rep['$' .. i] = v
end
return (fmt:gsub('$%d+', rep))
end
if msg then
local parts = {}
local regex, replace = msg.regex, msg.replace
for i = 1, 3 do
local limit = 40
local s = mcode[i + 1]
if s then
if regex and replace then
s = s:gsub(regex, replace)
limit = nil -- allow long "should be" messages
end
-- Escape user input so it does not break the message.
-- To avoid tags (like {{convert|1<math>23</math>|m}}) breaking
-- the mouseover title, any strip marker starting with char(127) is
-- replaced with '...' (text not needing i18n).
local append
local pos = s:find(string.char(127), 1, true)
if pos then
append = '...'
s = s:sub(1, pos - 1)
end
if limit and ulen(s) > limit then
s = usub(s, 1, limit)
append = '...'
end
s = mw.text.nowiki(s) .. (append or '')
else
s = '?'
end
parts['$' .. i] = s
end
local function ispreview()
-- Return true if a prominent message should be shown.
if parms.test == 'preview' or parms.test == 'nopreview' then
-- For testing, can preview a real message or simulate a preview
-- when running automated tests.
return parms.test == 'preview'
end
local success, revid = pcall(function ()
return (parms.frame):preprocess('{{REVISIONID}}') end)
return success and (revid == '')
end
local want_warning = is_warning and
not config.warnings and -- show unobtrusive warnings if config.warnings not configured
not msg.nowarn -- but use msg settings, not standard warning, if specified
local title = string.gsub(msg[1] or 'Missing message', '$%d+', parts)
local text = want_warning and '*' or msg[2] or 'Missing message'
local cat = wanted_category(msg[3], mcode[2], want_warning)
local anchor = msg[4] or ''
local fmtkey = ispreview() and 'cvt_format_preview' or
(want_warning and 'cvt_format2' or msg.format or 'cvt_format')
local fmt = text_code.all_messages[fmtkey] or 'convert: bug'
return subparm(fmt, title:gsub('"', '"'), text, cat, anchor)
end
return 'Convert internal error: unknown message'
end
function add_warning(parms, level, key, text1, text2) -- for forward declaration above
-- If enabled, add a warning that will be displayed after the convert result.
-- A higher level is more verbose: more kinds of warnings are displayed.
-- To reduce output noise, only the first warning is displayed.
if level <= (tonumber(config.warnings) or 1) then
if parms.warnings == nil then
parms.warnings = message(parms, { key, text1, text2 }, true)
end
end
end
local function spell_number(parms, inout, number, numerator, denominator)
-- Return result of spelling (number, numerator, denominator), or
-- return nil if spelling is not available or not supported for given text.
-- Examples (each value must be a string or nil):
-- number numerator denominator output
-- ------ --------- ----------- -------------------
-- "1.23" nil nil one point two three
-- "1" "2" "3" one and two thirds
-- nil "2" "3" two thirds
if not speller then
local function get_speller(module)
return require(module).spell_number
end
local success
success, speller = pcall(get_speller, spell_module)
if not success or type(speller) ~= 'function' then
add_warning(parms, 1, 'cvt_no_spell', 'spell')
return nil
end
end
local case
if parms.spell_upper == inout then
case = true
parms.spell_upper = nil -- only uppercase first word in a multiple unit
end
local sp = not parms.opt_sp_us
local adj = parms.opt_adjectival
return speller(number, numerator, denominator, case, sp, adj)
end
------------------------------------------------------------------------
-- BEGIN: Code required only for built-in units.
-- LATER: If need much more code, move to another module to simplify this module.
local function speed_of_sound(altitude)
-- This is for the Mach built-in unit of speed.
-- Return speed of sound in metres per second at given altitude in feet.
-- If no altitude given, use default (zero altitude = sea level).
-- Table gives speed of sound in miles per hour at various altitudes:
-- altitude = -17,499 to 302,499 feet
-- mach_table[a + 4] = s where
-- a = (altitude / 5000) rounded to nearest integer (-3 to 60)
-- s = speed of sound (mph) at that altitude
-- LATER: Should calculate result from an interpolation between the next
-- lower and higher altitudes in table, rather than rounding to nearest.
-- From: http://www.aerospaceweb.org/question/atmosphere/q0112.shtml
local mach_table = { -- a =
799.5, 787.0, 774.2, 761.207051, -- -3 to 0
748.0, 734.6, 721.0, 707.0, 692.8, 678.3, 663.5, 660.1, 660.1, 660.1, -- 1 to 10
660.1, 660.1, 660.1, 662.0, 664.3, 666.5, 668.9, 671.1, 673.4, 675.6, -- 11 to 20
677.9, 683.7, 689.9, 696.0, 702.1, 708.1, 714.0, 719.9, 725.8, 731.6, -- 21 to 30
737.3, 737.7, 737.7, 736.2, 730.5, 724.6, 718.8, 712.9, 707.0, 701.1, -- 31 to 40
695.0, 688.9, 682.8, 676.6, 670.4, 664.1, 657.8, 652.9, 648.3, 643.7, -- 41 to 50
639.1, 634.4, 629.6, 624.8, 620.0, 615.2, 613.2, 613.2, 613.2, 613.5, -- 51 to 60
}
altitude = altitude or 0
local a = (altitude < 0) and -altitude or altitude
a = floor(a / 5000 + 0.5)
if altitude < 0 then
a = -a
end
if a < -3 then
a = -3
elseif a > 60 then
a = 60
end
return mach_table[a + 4] * 0.44704 -- mph converted to m/s
end
-- END: Code required only for built-in units.
------------------------------------------------------------------------
local function add_style(parms, class)
-- Add selected template style to parms if not already present.
parms.templatestyles = parms.templatestyles or {}
if not parms.templatestyles[class] then
parms.templatestyles[class] = parms.frame:extensionTag({
name = 'templatestyles', args = { src = text_code.titles[class] }
})
end
end
local function get_styles(parms)
-- Return string of required template styles, empty if none.
if parms.templatestyles then
local t = {}
for _, v in pairs(parms.templatestyles) do
table.insert(t, v)
end
return table.concat(t)
end
return ''
end
local function get_range(word)
-- Return a range (string or table) corresponding to word (like "to"),
-- or return nil if not a range word.
local ranges = text_code.ranges
return ranges.types[word] or ranges.types[ranges.aliases[word]]
end
local function check_mismatch(unit1, unit2)
-- If unit1 cannot be converted to unit2, return an error message table.
-- This allows conversion between units of the same type, and between
-- Nm (normally torque) and ftlb (energy), as in gun-related articles.
-- This works because Nm is the base unit (scale = 1) for both the
-- primary type (torque), and the alternate type (energy, where Nm = J).
-- A match occurs if the primary types are the same, or if unit1 matches
-- the alternate type of unit2, and vice versa. That provides a whitelist
-- of which conversions are permitted between normally incompatible types.
if unit1.utype == unit2.utype or
(unit1.utype == unit2.alttype and unit1.alttype == unit2.utype) then
return nil
end
return { 'cvt_mismatch', unit1.utype, unit2.utype }
end
local function override_from(out_table, in_table, fields)
-- Copy the specified fields from in_table to out_table, but do not
-- copy nil fields (keep any corresponding field in out_table).
for _, field in ipairs(fields) do
if in_table[field] then
out_table[field] = in_table[field]
end
end
end
local function shallow_copy(t)
-- Return a shallow copy of table t.
-- Do not need the features and overhead of the Scribunto mw.clone().
local result = {}
for k, v in pairs(t) do
result[k] = v
end
return result
end
local unit_mt = {
-- Metatable to get missing values for a unit that does not accept SI prefixes.
-- Warning: The boolean value 'false' is returned for any missing field
-- so __index is not called twice for the same field in a given unit.
__index = function (self, key)
local value
if key == 'name1' or key == 'sym_us' then
value = self.symbol
elseif key == 'name2' then
value = self.name1 .. plural_suffix
elseif key == 'name1_us' then
value = self.name1
if not rawget(self, 'name2_us') then
-- If name1_us is 'foot', do not make name2_us by appending plural_suffix.
self.name2_us = self.name2
end
elseif key == 'name2_us' then
local raw1_us = rawget(self, 'name1_us')
if raw1_us then
value = raw1_us .. plural_suffix_us
else
value = self.name2
end
elseif key == 'link' then
value = self.name1
else
value = false
end
rawset(self, key, value)
return value
end
}
local function prefixed_name(unit, name, index)
-- Return unit name with SI prefix inserted at correct position.
-- index = 1 (name1), 2 (name2), 3 (name1_us), 4 (name2_us).
-- The position is a byte (not character) index, so use Lua's sub().
local pos = rawget(unit, 'prefix_position')
if type(pos) == 'string' then
pos = tonumber(split(pos, ',')[index])
end
if pos then
return name:sub(1, pos - 1) .. unit.si_name .. name:sub(pos)
end
return unit.si_name .. name
end
local unit_prefixed_mt = {
-- Metatable to get missing values for a unit that accepts SI prefixes.
-- Before use, fields si_name, si_prefix must be defined.
-- The unit must define _symbol, _name1 and
-- may define _sym_us, _name1_us, _name2_us
-- (_sym_us, _name2_us may be defined for a language using sp=us
-- to refer to a variant unrelated to U.S. units).
__index = function (self, key)
local value
if key == 'symbol' then
value = self.si_prefix .. self._symbol
elseif key == 'sym_us' then
value = rawget(self, '_sym_us')
if value then
value = self.si_prefix .. value
else
value = self.symbol
end
elseif key == 'name1' then
value = prefixed_name(self, self._name1, 1)
elseif key == 'name2' then
value = rawget(self, '_name2')
if value then
value = prefixed_name(self, value, 2)
else
value = self.name1 .. plural_suffix
end
elseif key == 'name1_us' then
value = rawget(self, '_name1_us')
if value then
value = prefixed_name(self, value, 3)
else
value = self.name1
end
elseif key == 'name2_us' then
value = rawget(self, '_name2_us')
if value then
value = prefixed_name(self, value, 4)
elseif rawget(self, '_name1_us') then
value = self.name1_us .. plural_suffix_us
else
value = self.name2
end
elseif key == 'link' then
value = self.name1
else
value = false
end
rawset(self, key, value)
return value
end
}
local unit_per_mt = {
-- Metatable to get values for a per unit of form "x/y".
-- This is never called to determine a unit name or link because per units
-- are handled as a special case.
-- Similarly, the default output is handled elsewhere, and for a symbol
-- this is only called from get_default() for default_exceptions.
__index = function (self, key)
local value
if key == 'symbol' then
local per = self.per
local unit1, unit2 = per[1], per[2]
if unit1 then
value = unit1[key] .. '/' .. unit2[key]
else
value = '/' .. unit2[key]
end
elseif key == 'sym_us' then
value = self.symbol
elseif key == 'scale' then
local per = self.per
local unit1, unit2 = per[1], per[2]
value = (unit1 and unit1.scale or 1) * self.scalemultiplier / unit2.scale
else
value = false
end
rawset(self, key, value)
return value
end
}
local function make_per(unitcode, unit_table, ulookup)
-- Return true, t where t is a per unit with unit codes expanded to unit tables,
-- or return false, t where t is an error message table.
local result = {
unitcode = unitcode,
utype = unit_table.utype,
per = {}
}
override_from(result, unit_table, { 'invert', 'iscomplex', 'default', 'link', 'symbol', 'symlink' })
result.symbol_raw = (result.symbol or false) -- to distinguish between a defined exception and a metatable calculation
local prefix
for i, v in ipairs(unit_table.per) do
if i == 1 and v == '' then
-- First unit symbol can be empty; that gives a nil first unit table.
elseif i == 1 and text_code.currency[v] then
prefix = currency_text or v
else
local success, t = ulookup(v)
if not success then return false, t end
result.per[i] = t
end
end
local multiplier = unit_table.multiplier
if not result.utype then
-- Creating an automatic per unit.
local unit1 = result.per[1]
local utype = (unit1 and unit1.utype or prefix or '') .. '/' .. result.per[2].utype
local t = data_code.per_unit_fixups[utype]
if t then
if type(t) == 'table' then
utype = t.utype or utype
result.link = result.link or t.link
multiplier = multiplier or t.multiplier
else
utype = t
end
end
result.utype = utype
end
result.scalemultiplier = multiplier or 1
result.vprefix = prefix or false -- set to non-nil to avoid calling __index
return true, setmetatable(result, unit_per_mt)
end
local function lookup(parms, unitcode, what, utable, fails, depth)
-- Return true, t where t is a copy of the unit's converter table,
-- or return false, t where t is an error message table.
-- Parameter 'what' determines whether combination units are accepted:
-- 'no_combination' : single unit only
-- 'any_combination' : single unit or combination or output multiple
-- 'only_multiple' : single unit or output multiple only
-- Parameter unitcode is a symbol (like 'g'), with an optional SI prefix (like 'kg').
-- If, for example, 'kg' is in this table, that entry is used;
-- otherwise the prefix ('k') is applied to the base unit ('g').
-- If unitcode is a known combination code (and if allowed by what),
-- a table of output multiple unit tables is included in the result.
-- For compatibility with the old template, an underscore in a unitcode is
-- replaced with a space so usage like {{convert|350|board_feet}} works.
-- Wikignomes may also put two spaces or " " in combinations, so
-- replace underscore, " ", and multiple spaces with a single space.
utable = utable or parms.unittable or all_units
fails = fails or {}
depth = depth and depth + 1 or 1
if depth > 9 then
-- There are ways to mistakenly define units which result in infinite
-- recursion when lookup() is called. That gives a long delay and very
-- confusing error messages, so the depth parameter is used as a guard.
return false, { 'cvt_lookup', unitcode }
end
if unitcode == nil or unitcode == '' then
return false, { 'cvt_no_unit' }
end
unitcode = unitcode:gsub('_', ' '):gsub(' ', ' '):gsub(' +', ' ')
local function call_make_per(t)
return make_per(unitcode, t,
function (ucode) return lookup(parms, ucode, 'no_combination', utable, fails, depth) end
)
end
local t = utable[unitcode]
if t then
if t.shouldbe then
return false, { 'cvt_should_be', t.shouldbe }
end
if t.sp_us then
parms.opt_sp_us = true
end
local target = t.target -- nil, or unitcode is an alias for this target
if target then
local success, result = lookup(parms, target, what, utable, fails, depth)
if not success then return false, result end
override_from(result, t, { 'customary', 'default', 'link', 'symbol', 'symlink' })
local multiplier = t.multiplier
if multiplier then
result.multiplier = tostring(multiplier)
result.scale = result.scale * multiplier
end
return true, result
end
if t.per then
return call_make_per(t)
end
local combo = t.combination -- nil or a table of unitcodes
if combo then
local multiple = t.multiple
if what == 'no_combination' or (what == 'only_multiple' and not multiple) then
return false, { 'cvt_bad_unit', unitcode }
end
-- Recursively create a combination table containing the
-- converter table of each unitcode.
local result = { utype = t.utype, multiple = multiple, combination = {} }
local cvt = result.combination
for i, v in ipairs(combo) do
local success, t = lookup(parms, v, multiple and 'no_combination' or 'only_multiple', utable, fails, depth)
if not success then return false, t end
cvt[i] = t
end
return true, result
end
local result = shallow_copy(t)
result.unitcode = unitcode
if result.prefixes then
result.si_name = ''
result.si_prefix = ''
return true, setmetatable(result, unit_prefixed_mt)
end
return true, setmetatable(result, unit_mt)
end
local SIprefixes = text_code.SIprefixes
for plen = SIprefixes[1] or 2, 1, -1 do
-- Look for an SI prefix; should never occur with an alias.
-- Check for longer prefix first ('dam' is decametre).
-- SIprefixes[1] = prefix maximum #characters (as seen by mw.ustring.sub).
local prefix = usub(unitcode, 1, plen)
local si = SIprefixes[prefix]
if si then
local t = utable[usub(unitcode, plen+1)]
if t and t.prefixes then
local result = shallow_copy(t)
result.unitcode = unitcode
result.si_name = parms.opt_sp_us and si.name_us or si.name
result.si_prefix = si.prefix or prefix
result.scale = t.scale * 10 ^ (si.exponent * t.prefixes)
return true, setmetatable(result, unit_prefixed_mt)
end
end
end
-- Accept user-defined combinations like "acre+m2+ha" or "acre m2 ha" for output.
-- If '+' is used, each unit code can include a space, and any error is fatal.
-- If ' ' is used and if each space-separated word is a unit code, it is a combo,
-- but errors are not fatal so the unit code can be looked up as an extra unit.
local err_is_fatal
local combo = collection()
if unitcode:find('+', 1, true) then
err_is_fatal = true
for item in (unitcode .. '+'):gmatch('%s*(.-)%s*%+') do
if item ~= '' then
combo:add(item)
end
end
elseif unitcode:find('%s') then
for item in unitcode:gmatch('%S+') do
combo:add(item)
end
end
if combo.n > 1 then
local function lookup_combo()
if what == 'no_combination' or what == 'only_multiple' then
return false, { 'cvt_bad_unit', unitcode }
end
local result = { combination = {} }
local cvt = result.combination
for i, v in ipairs(combo) do
local success, t = lookup(parms, v, 'only_multiple', utable, fails, depth)
if not success then return false, t end
if i == 1 then
result.utype = t.utype
else
local mismatch = check_mismatch(result, t)
if mismatch then
return false, mismatch
end
end
cvt[i] = t
end
return true, result
end
local success, result = lookup_combo()
if success or err_is_fatal then
return success, result
end
end
-- Accept any unit with an engineering notation prefix like "e6cuft"
-- (million cubic feet), but not chained prefixes like "e3e6cuft",
-- and not if the unit is a combination or multiple,
-- and not if the unit has an offset or is a built-in.
-- Only en digits are accepted.
local exponent, baseunit = unitcode:match('^e(%d+)(.*)')
if exponent then
local engscale = text_code.eng_scales[exponent]
if engscale then
local success, result = lookup(parms, baseunit, 'no_combination', utable, fails, depth)
if success and not (result.offset or result.builtin or result.engscale) then
result.unitcode = unitcode -- 'e6cuft' not 'cuft'
result.defkey = unitcode -- key to lookup default exception
result.engscale = engscale
result.scale = result.scale * 10 ^ tonumber(exponent)
return true, result
end
end
end
-- Look for x/y; split on right-most slash to get scale correct (x/y/z is x/y per z).
local top, bottom = unitcode:match('^(.-)/([^/]+)$')
if top and not unitcode:find('e%d') then
-- If valid, create an automatic per unit for an "x/y" unit code.
-- The unitcode must not include extraneous spaces.
-- Engineering notation (apart from at start and which has been stripped before here),
-- is not supported so do not make a per unit if find text like 'e3' in unitcode.
local success, result = call_make_per({ per = {top, bottom} })
if success then
return true, result
end
end
if not parms.opt_ignore_error and not get_range(unitcode) then
-- Want the "what links here" list for the extra_module to show only cases
-- where an extra unit is used, so do not require it if invoked from {{val}}
-- or if looking up a range word which cannot be a unit.
if not extra_units then
local success, extra = pcall(function () return require(extra_module).extra_units end)
if success and type(extra) == 'table' then
extra_units = extra
end
end
if extra_units then
-- A unit in one data table might refer to a unit in the other table, so
-- switch between them, relying on fails or depth to terminate loops.
if not fails[unitcode] then
fails[unitcode] = true
local other = (utable == all_units) and extra_units or all_units
local success, result = lookup(parms, unitcode, what, other, fails, depth)
if success then
return true, result
end
end
end
end
if to_en_table then
-- At fawiki it is common to translate all digits so a unit like "km2" becomes "km۲".
local en_code = ustring.gsub(unitcode, '%d', to_en_table)
if en_code ~= unitcode then
return lookup(parms, en_code, what, utable, fails, depth)
end
end
return false, { 'cvt_unknown', unitcode }
end
local function valid_number(num)
-- Return true if num is a valid number.
-- In Scribunto (different from some standard Lua), when expressed as a string,
-- overflow or other problems are indicated with text like "inf" or "nan"
-- which are regarded as invalid here (each contains "n").
if type(num) == 'number' and tostring(num):find('n', 1, true) == nil then
return true
end
end
local function hyphenated(name, parts)
-- Return a hyphenated form of given name (for adjectival usage).
-- The name may be linked and the target of the link must not be changed.
-- Hypothetical examples:
-- [[long ton|ton]] → [[long ton|ton]] (no change)
-- [[tonne|long ton]] → [[tonne|long-ton]]
-- [[metric ton|long ton]] → [[metric ton|long-ton]]
-- [[long ton]] → [[long ton|long-ton]]
-- Input can also have multiple links in a single name like:
-- [[United States customary units|U.S.]] [[US gallon|gallon]]
-- [[mile]]s per [[United States customary units|U.S.]] [[quart]]
-- [[long ton]]s per [[short ton]]
-- Assume that links cannot be nested (never like "[[abc[[def]]ghi]]").
-- This uses a simple and efficient procedure that works for most cases.
-- Some units (if used) would require more, and can later think about
-- adding a method to handle exceptions.
-- The procedure is to replace each space with a hyphen, but
-- not a space after ')' [for "(pre-1954 US) nautical mile"], and
-- not spaces immediately before '(' or in '(...)' [for cases like
-- "British thermal unit (ISO)" and "Calorie (International Steam Table)"].
if name:find(' ', 1, true) then
if parts then
local pos
if name:sub(1, 1) == '(' then
pos = name:find(')', 1, true)
if pos then
return name:sub(1, pos+1) .. name:sub(pos+2):gsub(' ', '-')
end
elseif name:sub(-1) == ')' then
pos = name:find('(', 1, true)
if pos then
return name:sub(1, pos-2):gsub(' ', '-') .. name:sub(pos-1)
end
end
return name:gsub(' ', '-')
end
parts = collection()
for before, item, after in name:gmatch('([^[]*)(%[%[[^[]*%]%])([^[]*)') do
if item:find(' ', 1, true) then
local prefix
local plen = item:find('|', 1, true)
if plen then
prefix = item:sub(1, plen)
item = item:sub(plen + 1, -3)
else
prefix = item:sub(1, -3) .. '|'
item = item:sub(3, -3)
end
item = prefix .. hyphenated(item, parts) .. ']]'
end
parts:add(before:gsub(' ', '-') .. item .. after:gsub(' ', '-'))
end
if parts.n == 0 then
-- No link like "[[...]]" was found in the original name.
parts:add(hyphenated(name, parts))
end
return table.concat(parts)
end
return name
end
local function hyphenated_maybe(parms, want_name, sep, id, inout)
-- Return s, f where
-- s = id, possibly modified
-- f = true if hyphenated
-- Possible modifications: hyphenate; prepend '-'; append mid text.
if id == nil or id == '' then
return ''
end
local mid = (inout == (parms.opt_flip and 'out' or 'in')) and parms.mid or ''
if want_name then
if parms.opt_adjectival then
return '-' .. hyphenated(id) .. mid, true
end
if parms.opt_add_s and id:sub(-1) ~= 's' then
id = id .. 's' -- for nowiki
end
end
return sep .. id .. mid
end
local function use_minus(text)
-- Return text with Unicode minus instead of '-', if present.
if text:sub(1, 1) == '-' then
return MINUS .. text:sub(2)
end
return text
end
local function digit_groups(parms, text, method)
-- Return a numbered table of groups of digits (left-to-right, in local language).
-- Parameter method is a number or nil:
-- 3 for 3-digit grouping (default), or
-- 2 for 3-then-2 grouping (only for digits before decimal mark).
local len_right
local len_left = text:find('.', 1, true)
if len_left then
len_right = #text - len_left
len_left = len_left - 1
else
len_left = #text
end
local twos = method == 2 and len_left > 5
local groups = collection()
local run = len_left
local n
if run < 4 or (run == 4 and parms.opt_comma5) then
if parms.opt_gaps then
n = run
else
n = #text
end
elseif twos then
n = run % 2 == 0 and 1 or 2
else
n = run % 3 == 0 and 3 or run % 3
end
while run > 0 do
groups:add(n)
run = run - n
n = (twos and run > 3) and 2 or 3
end
if len_right then
if groups.n == 0 then
groups:add(0)
end
if parms.opt_gaps and len_right > 3 then
local want4 = not parms.opt_gaps3 -- true gives no gap before trailing single digit
local isfirst = true
run = len_right
while run > 0 do
n = (want4 and run == 4) and 4 or (run > 3 and 3 or run)
if isfirst then
isfirst = false
groups[groups.n] = groups[groups.n] + 1 + n
else
groups:add(n)
end
run = run - n
end
else
groups[groups.n] = groups[groups.n] + 1 + len_right
end
end
local pos = 1
for i, length in ipairs(groups) do
groups[i] = from_en(text:sub(pos, pos + length - 1))
pos = pos + length
end
return groups
end
function with_separator(parms, text) -- for forward declaration above
-- Input text is a number in en digits with optional '.' decimal mark.
-- Return an equivalent, formatted for display:
-- with a custom decimal mark instead of '.', if wanted
-- with thousand separators inserted, if wanted
-- digits in local language
-- The given text is like '123' or '123.' or '12345.6789'.
-- The text has no sign (caller inserts that later, if necessary).
-- When using gaps, they are inserted before and after the decimal mark.
-- Separators are inserted only before the decimal mark.
-- A trailing dot (as in '123.') is removed because their use appears to
-- be accidental, and such a number should be shown as '123' or '123.0'.
-- It is useful for convert to suppress the dot so, for example, '4000.'
-- is a simple way of indicating that all the digits are significant.
if text:sub(-1) == '.' then
text = text:sub(1, -2)
end
if #text < 4 or parms.opt_nocomma or numsep == '' then
return from_en(text)
end
local groups = digit_groups(parms, text, group_method)
if parms.opt_gaps then
if groups.n <= 1 then
return groups[1] or ''
end
local nowrap = '<span style="white-space: nowrap">'
local gap = '<span style="margin-left: 0.25em">'
local close = '</span>'
return nowrap .. groups[1] .. gap .. table.concat(groups, close .. gap, 2, groups.n) .. close .. close
end
return table.concat(groups, numsep)
end
-- An input value like 1.23e12 is displayed using scientific notation (1.23×10¹²).
-- That also makes the output use scientific notation, except for small values.
-- In addition, very small or very large output values use scientific notation.
-- Use format(fmtpower, significand, '10', exponent) where each argument is a string.
local fmtpower = '%s<span style="margin:0 .15em 0 .25em">×</span>%s<sup>%s</sup>'
local function with_exponent(parms, show, exponent)
-- Return wikitext to display the implied value in scientific notation.
-- Input uses en digits; output uses digits in local language.
return format(fmtpower, with_separator(parms, show), from_en('10'), use_minus(from_en(tostring(exponent))))
end
local function make_sigfig(value, sigfig)
-- Return show, exponent that are equivalent to the result of
-- converting the number 'value' (where value >= 0) to a string,
-- rounded to 'sigfig' significant figures.
-- The returned items are:
-- show: a string of digits; no sign and no dot;
-- there is an implied dot before show.
-- exponent: a number (an integer) to shift the implied dot.
-- Resulting value = tonumber('.' .. show) * 10^exponent.
-- Examples:
-- make_sigfig(23.456, 3) returns '235', 2 (.235 * 10^2).
-- make_sigfig(0.0023456, 3) returns '235', -2 (.235 * 10^-2).
-- make_sigfig(0, 3) returns '000', 1 (.000 * 10^1).
if sigfig <= 0 then
sigfig = 1
elseif sigfig > maxsigfig then
sigfig = maxsigfig
end
if value == 0 then
return string.rep('0', sigfig), 1
end
local exp, fracpart = math.modf(log10(value))
if fracpart >= 0 then
fracpart = fracpart - 1
exp = exp + 1
end
local digits = format('%.0f', 10^(fracpart + sigfig))
if #digits > sigfig then
-- Overflow (for sigfig=3: like 0.9999 rounding to "1000"; need "100").
digits = digits:sub(1, sigfig)
exp = exp + 1
end
assert(#digits == sigfig, 'Bug: rounded number has wrong length')
return digits, exp
end
-- Fraction output format.
local fracfmt = {
{ -- Like {{frac}} (fraction slash).
'<span class="frac" role="math">{SIGN}<span class="num">{NUM}</span>⁄<span class="den">{DEN}</span></span>', -- 1/2
'<span class="frac" role="math">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="num">{NUM}</span>⁄<span class="den">{DEN}</span></span>', -- 1+2/3
style = 'frac',
},
{ -- Like {{sfrac}} (stacked fraction, that is, horizontal bar).
'<span class="sfrac tion" role="math">{SIGN}<span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span>', -- 1//2
'<span class="sfrac" role="math">{SIGN}{WHOLE}<span class="sr-only">+</span><span class="tion"><span class="num">{NUM}</span><span class="sr-only">/</span><span class="den">{DEN}</span></span></span>', -- 1+2//3
style = 'sfrac',
},
}
local function format_fraction(parms, inout, negative, wholestr, numstr, denstr, do_spell, style)
-- Return wikitext for a fraction, possibly spelled.
-- Inputs use en digits and have no sign; output uses digits in local language.
local wikitext
if not style then
style = parms.opt_fraction_horizontal and 2 or 1
end
if wholestr == '' then
wholestr = nil
end
local substitute = {
SIGN = negative and MINUS or '',
WHOLE = wholestr and with_separator(parms, wholestr),
NUM = from_en(numstr),
DEN = from_en(denstr),
}
wikitext = fracfmt[style][wholestr and 2 or 1]:gsub('{(%u+)}', substitute)
if do_spell then
if negative then
if wholestr then
wholestr = '-' .. wholestr
else
numstr = '-' .. numstr
end
end
local s = spell_number(parms, inout, wholestr, numstr, denstr)
if s then
return s
end
end
add_style(parms, fracfmt[style].style)
return wikitext
end
local function format_number(parms, show, exponent, isnegative)
-- Parameter show is a string or a table containing strings.
-- Each string is a formatted number in en digits and optional '.' decimal mark.
-- A table represents a fraction: integer, numerator, denominator;
-- if a table is given, exponent must be nil.
-- Return t where t is a table with fields:
-- show = wikitext formatted to display implied value
-- (digits in local language)
-- is_scientific = true if show uses scientific notation
-- clean = unformatted show (possibly adjusted and with inserted '.')
-- (en digits)
-- sign = '' or MINUS
-- exponent = exponent (possibly adjusted)
-- The clean and exponent fields can be used to calculate the
-- rounded absolute value, if needed.
--
-- The value implied by the arguments is found from:
-- exponent is nil; and
-- show is a string of digits (no sign), with an optional dot;
-- show = '123.4' is value 123.4, '1234' is value 1234.0;
-- or:
-- exponent is an integer indicating where dot should be;
-- show is a string of digits (no sign and no dot);
-- there is an implied dot before show;
-- show does not start with '0';
-- show = '1234', exponent = 3 is value 0.1234*10^3 = 123.4.
--
-- The formatted result:
-- * Is for an output value and is spelled if wanted and possible.
-- * Includes a Unicode minus if isnegative and not spelled.
-- * Uses a custom decimal mark, if wanted.
-- * Has digits grouped where necessary, if wanted.
-- * Uses scientific notation if requested, or for very small or large values
-- (which forces result to not be spelled).
-- * Has no more than maxsigfig significant digits
-- (same as old template and {{#expr}}).
local xhi, xlo -- these control when scientific notation (exponent) is used
if parms.opt_scientific then
xhi, xlo = 4, 2 -- default for output if input uses e-notation
elseif parms.opt_scientific_always then
xhi, xlo = 0, 0 -- always use scientific notation (experimental)
else
xhi, xlo = 10, 4 -- default
end
local sign = isnegative and MINUS or ''
local maxlen = maxsigfig
local tfrac
if type(show) == 'table' then
tfrac = show
show = tfrac.wholestr
assert(exponent == nil, 'Bug: exponent given with fraction')
end
if not tfrac and not exponent then
local integer, dot, decimals = show:match('^(%d*)(%.?)(.*)')
if integer == '0' or integer == '' then
local zeros, figs = decimals:match('^(0*)([^0]?.*)')
if #figs == 0 then
if #zeros > maxlen then
show = '0.' .. zeros:sub(1, maxlen)
end
elseif #zeros >= xlo then
show = figs
exponent = -#zeros
elseif #figs > maxlen then
show = '0.' .. zeros .. figs:sub(1, maxlen)
end
elseif #integer >= xhi then
show = integer .. decimals
exponent = #integer
else
maxlen = maxlen + #dot
if #show > maxlen then
show = show:sub(1, maxlen)
end
end
end
if exponent then
local function zeros(n)
return string.rep('0', n)
end
if #show > maxlen then
show = show:sub(1, maxlen)
end
if exponent > xhi or exponent <= -xlo or (exponent == xhi and show ~= '1' .. zeros(xhi - 1)) then
-- When xhi, xlo = 10, 4 (the default), scientific notation is used if the
-- rounded value satisfies: value >= 1e9 or value < 1e-4 (1e9 = 0.1e10),
-- except if show is '1000000000' (1e9), for example:
-- {{convert|1000000000|m|m|sigfig=10}} → 1,000,000,000 metres (1,000,000,000 m)
local significand
if #show > 1 then
significand = show:sub(1, 1) .. '.' .. show:sub(2)
else
significand = show
end
return {
clean = '.' .. show,
exponent = exponent,
sign = sign,
show = sign .. with_exponent(parms, significand, exponent-1),
is_scientific = true,
}
end
if exponent >= #show then
show = show .. zeros(exponent - #show) -- result has no dot
elseif exponent <= 0 then
show = '0.' .. zeros(-exponent) .. show
else
show = show:sub(1, exponent) .. '.' .. show:sub(exponent+1)
end
end
local formatted_show
if tfrac then
show = tostring(tfrac.value) -- to set clean in returned table
formatted_show = format_fraction(parms, 'out', isnegative, tfrac.wholestr, tfrac.numstr, tfrac.denstr, parms.opt_spell_out)
else
if isnegative and show:match('^0.?0*$') then
sign = '' -- don't show minus if result is negative but rounds to zero
end
formatted_show = sign .. with_separator(parms, show)
if parms.opt_spell_out then
formatted_show = spell_number(parms, 'out', sign .. show) or formatted_show
end
end
return {
clean = show,
sign = sign,
show = formatted_show,
is_scientific = false, -- to avoid calling __index
}
end
local function extract_fraction(parms, text, negative)
-- If text represents a fraction, return
-- value, altvalue, show, denominator
-- where
-- value is a number (value of the fraction in argument text)
-- altvalue is an alternate interpretation of any fraction for the hands
-- unit where "12.1+3/4" means 12 hands 1.75 inches
-- show is a string (formatted text for display of an input value,
-- and is spelled if wanted and possible)
-- denominator is value of the denominator in the fraction
-- Otherwise, return nil.
-- Input uses en digits and '.' decimal mark (input has been translated).
-- Output uses digits in local language and local decimal mark, if any.
------------------------------------------------------------------------
-- Originally this function accepted x+y/z where x, y, z were any valid
-- numbers, possibly with a sign. For example '1.23e+2+1.2/2.4' = 123.5,
-- and '2-3/8' = 1.625. However, such usages were found to be errors or
-- misunderstandings, so since August 2014 the following restrictions apply:
-- x (if present) is an integer or has a single digit after decimal mark
-- y and z are unsigned integers
-- e-notation is not accepted
-- The overall number can start with '+' or '-' (so '12+3/4' and '+12+3/4'
-- and '-12-3/4' are valid).
-- Any leading negative sign is removed by the caller, so only inputs
-- like the following are accepted here (may have whitespace):
-- negative = false false true (there was a leading '-')
-- text = '2/3' '+2/3' '2/3'
-- text = '1+2/3' '+1+2/3' '1-2/3'
-- text = '12.3+1/2' '+12.3+1/2' '12.3-1/2'
-- Values like '12.3+1/2' are accepted, but are intended only for use
-- with the hands unit (not worth adding code to enforce that).
------------------------------------------------------------------------
local leading_plus, prefix, numstr, slashes, denstr =
text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*(/+)%s*(%d+)%s*$')
if not leading_plus then
-- Accept a single U+2044 fraction slash because that may be pasted.
leading_plus, prefix, numstr, denstr =
text:match('^%s*(%+?)%s*(.-)%s*(%d+)%s*⁄%s*(%d+)%s*$')
slashes = '/'
end
local numerator = tonumber(numstr)
local denominator = tonumber(denstr)
if numerator == nil or denominator == nil or (negative and leading_plus ~= '') then
return nil
end
local whole, wholestr
if prefix == '' then
wholestr = ''
whole = 0
else
-- Any prefix must be like '12+' or '12-' (whole number and fraction sign);
-- '12.3+' and '12.3-' are also accepted (single digit after decimal point)
-- because '12.3+1/2 hands' is valid (12 hands 3½ inches).
local num1, num2, frac_sign = prefix:match('^(%d+)(%.?%d?)%s*([+%-])$')
if num1 == nil then return nil end
if num2 == '' then -- num2 must be '' or like '.1' but not '.' or '.12'
wholestr = num1
else
if #num2 ~= 2 then return nil end
wholestr = num1 .. num2
end
if frac_sign ~= (negative and '-' or '+') then return nil end
whole = tonumber(wholestr)
if whole == nil then return nil end
end
local value = whole + numerator / denominator
if not valid_number(value) then return nil end
local altvalue = whole + numerator / (denominator * 10)
local style = #slashes -- kludge: 1 or 2 slashes can be used to select style
if style > 2 then style = 2 end
local wikitext = format_fraction(parms, 'in', negative, leading_plus .. wholestr, numstr, denstr, parms.opt_spell_in, style)
return value, altvalue, wikitext, denominator
end
local function extract_number(parms, text, another, no_fraction)
-- Return true, info if can extract a number from text,
-- where info is a table with the result,
-- or return false, t where t is an error message table.
-- Input can use en digits or digits in local language and can
-- have references at the end. Accepting references is intended
-- for use in infoboxes with a field for a value passed to convert.
-- Parameter another = true if the expected value is not the first.
-- Before processing, the input text is cleaned:
-- * Any thousand separators (valid or not) are removed.
-- * Any sign is replaced with '-' (if negative) or '' (otherwise).
-- That replaces Unicode minus with '-'.
-- If successful, the returned info table contains named fields:
-- value = a valid number
-- altvalue = a valid number, usually same as value but different
-- if fraction used (for hands unit)
-- singular = true if value is 1 or -1 (to use singular form of units)
-- clean = cleaned text with any separators and sign removed
-- (en digits and '.' decimal mark)
-- show = text formatted for output, possibly with ref strip markers
-- (digits in local language and custom decimal mark)
-- The resulting show:
-- * Is for an input value and is spelled if wanted and possible.
-- * Has a rounded value, if wanted.
-- * Has digits grouped where necessary, if wanted.
-- * If negative, a Unicode minus is used; otherwise the sign is
-- '+' (if the input text used '+'), or is '' (if no sign in input).
text = strip(text or '')
local reference
local pos = text:find('\127', 1, true)
if pos then
local before = text:sub(1, pos - 1)
local remainder = text:sub(pos)
local refs = {}
while #remainder > 0 do
local ref, spaces
ref, spaces, remainder = remainder:match('^(\127[^\127]*UNIQ[^\127]*%-ref[^\127]*\127)(%s*)(.*)')
if ref then
table.insert(refs, ref)
else
refs = {}
break
end
end
if #refs > 0 then
text = strip(before)
reference = table.concat(refs)
end
end
local clean = to_en(text, parms)
if clean == '' then
return false, { another and 'cvt_no_num2' or 'cvt_no_num' }
end
local isnegative, propersign = false, '' -- most common case
local singular, show, denominator
local value = tonumber(clean)
local altvalue
if value then
local sign = clean:sub(1, 1)
if sign == '+' or sign == '-' then
propersign = (sign == '+') and '+' or MINUS
clean = clean:sub(2)
end
if value < 0 then
isnegative = true
value = -value
end
else
local valstr
for _, prefix in ipairs({ '-', MINUS, '−' }) do
-- Including '-' sets isnegative in case input is a fraction like '-2-3/4'.
local plen = #prefix
if clean:sub(1, plen) == prefix then
valstr = clean:sub(plen + 1)
if valstr:match('^%s') then -- "- 1" is invalid but "-1 - 1/2" is ok
return false, { 'cvt_bad_num', text }
end
break
end
end
if valstr then
isnegative = true
propersign = MINUS
clean = valstr
value = tonumber(clean)
end
if value == nil then
if not no_fraction then
value, altvalue, show, denominator = extract_fraction(parms, clean, isnegative)
end
if value == nil then
return false, { 'cvt_bad_num', text }
end
if value <= 1 then
singular = true -- for example, "½ mile" or "one half mile" (singular unit)
end
end
end
if not valid_number(value) then -- for example, "1e310" may overflow
return false, { 'cvt_invalid_num' }
end
if show == nil then
-- clean is a non-empty string with no spaces, and does not represent a fraction,
-- and value = tonumber(clean) is a number >= 0.
-- If the input uses e-notation, show will be displayed using a power of ten, but
-- we use the number as given so it might not be normalized scientific notation.
-- The input value is spelled if specified so any e-notation is ignored;
-- that allows input like 2e6 to be spelled as "two million" which works
-- because the spell module converts '2e6' to '2000000' before spelling.
local function rounded(value, default, exponent)
local precision = parms.opt_ri
if precision then
local fmt = '%.' .. format('%d', precision) .. 'f'
local result = fmt:format(tonumber(value) + 2e-14) -- fudge for some common cases of bad rounding
if not exponent then
singular = (tonumber(result) == 1)
end
return result
end
return default
end
singular = (value == 1)
local scientific
local significand, exponent = clean:match('^([%d.]+)[Ee]([+%-]?%d+)')
if significand then
show = with_exponent(parms, rounded(significand, significand, exponent), exponent)
scientific = true
else
show = with_separator(parms, rounded(value, clean))
end
show = propersign .. show
if parms.opt_spell_in then
show = spell_number(parms, 'in', propersign .. rounded(value, clean)) or show
scientific = false
end
if scientific then
parms.opt_scientific = true
end
end
if isnegative and (value ~= 0) then
value = -value
altvalue = -(altvalue or value)
end
return true, {
value = value,
altvalue = altvalue or value,
singular = singular,
clean = clean,
show = show .. (reference or ''),
denominator = denominator,
}
end
local function get_number(text)
-- Return v, f where:
-- v = nil (text is not a number)
-- or
-- v = value of text (text is a number)
-- f = true if value is an integer
-- Input can use en digits or digits in local language,
-- but no separators, no Unicode minus, and no fraction.
if text then
local number = tonumber(to_en(text))
if number then
local _, fracpart = math.modf(number)
return number, (fracpart == 0)
end
end
end
local function gcd(a, b)
-- Return the greatest common denominator for the given values,
-- which are known to be positive integers.
if a > b then
a, b = b, a
end
if a <= 0 then
return b
end
local r = b % a
if r <= 0 then
return a
end
if r == 1 then
return 1
end
return gcd(r, a)
end
local function fraction_table(value, denominator)
-- Return value as a string or a table:
-- * If result is a string, there is no fraction, and the result
-- is value formatted as a string of en digits.
-- * If result is a table, it represents a fraction with named fields:
-- wholestr, numstr, denstr (strings of en digits for integer, numerator, denominator).
-- The result is rounded to the nearest multiple of (1/denominator).
-- If the multiple is zero, no fraction is included.
-- No fraction is included if value is very large as the fraction would
-- be unhelpful, particularly if scientific notation is required.
-- Input value is a non-negative number.
-- Input denominator is a positive integer for the desired fraction.
if value <= 0 then
return '0'
end
if denominator <= 0 or value > 1e8 then
return format('%.2f', value)
end
local integer, decimals = math.modf(value)
local numerator = floor((decimals * denominator) +
0.5 + 2e-14) -- add fudge for some common cases of bad rounding
if numerator >= denominator then
integer = integer + 1
numerator = 0
end
local wholestr = tostring(integer)
if numerator > 0 then
local div = gcd(numerator, denominator)
if div > 1 then
numerator = numerator / div
denominator = denominator / div
end
return {
wholestr = (integer > 0) and wholestr or '',
numstr = tostring(numerator),
denstr = tostring(denominator),
value = value,
}
end
return wholestr
end
local function preunits(count, preunit1, preunit2)
-- If count is 1:
-- ignore preunit2
-- return p1
-- else:
-- preunit1 is used for preunit2 if the latter is empty
-- return p1, p2
-- where:
-- p1 is text to insert before the input unit
-- p2 is text to insert before the output unit
-- p1 or p2 may be nil to mean "no preunit"
-- Using '+' gives output like "5+ feet" (no space before, but space after).
local function withspace(text, wantboth)
-- Return text with space before and, if wantboth, after.
-- However, no space is added if there is a space or ' ' or '-'
-- at that position ('-' is for adjectival text).
-- There is also no space if text starts with '&'
-- (e.g. '°' would display a degree symbol with no preceding space).
local char = text:sub(1, 1)
if char == '&' then
return text -- an html entity can be used to specify the exact display
end
if not (char == ' ' or char == '-' or char == '+') then
text = ' ' .. text
end
if wantboth then
char = text:sub(-1, -1)
if not (char == ' ' or char == '-' or text:sub(-6, -1) == ' ') then
text = text .. ' '
end
end
return text
end
local PLUS = '+ '
preunit1 = preunit1 or ''
local trim1 = strip(preunit1)
if count == 1 then
if trim1 == '' then
return nil
end
if trim1 == '+' then
return PLUS
end
return withspace(preunit1, true)
end
preunit1 = withspace(preunit1)
preunit2 = preunit2 or ''
local trim2 = strip(preunit2)
if trim1 == '+' then
if trim2 == '' or trim2 == '+' then
return PLUS, PLUS
end
preunit1 = PLUS
end
if trim2 == '' then
if trim1 == '' then
return nil, nil
end
preunit2 = preunit1
elseif trim2 == '+' then
preunit2 = PLUS
elseif trim2 == ' ' then -- trick to make preunit2 empty
preunit2 = nil
else
preunit2 = withspace(preunit2)
end
return preunit1, preunit2
end
local function range_text(range, want_name, parms, before, after, inout)
-- Return before .. rtext .. after
-- where rtext is the text that separates two values in a range.
local rtext, adj_text, exception
if type(range) == 'table' then
-- Table must specify range text for ('off' and 'on') or ('input' and 'output'),
-- and may specify range text for 'adj=on',
-- and may specify exception = true.
rtext = range[want_name and 'off' or 'on'] or
range[((inout == 'in') == (parms.opt_flip == true)) and 'output' or 'input']
adj_text = range['adj']
exception = range['exception']
else
rtext = range
end
if parms.opt_adjectival then
if want_name or (exception and parms.abbr_org == 'on') then
rtext = adj_text or rtext:gsub(' ', '-'):gsub(' ', '-')
end
end
if rtext == '–' and after:sub(1, #MINUS) == MINUS then
rtext = ' – '
end
return before .. rtext .. after
end
local function get_composite(parms, iparm, in_unit_table)
-- Look for a composite input unit. For example, {{convert|1|yd|2|ft|3|in}}
-- would result in a call to this function with
-- iparm = 3 (parms[iparm] = "2", just after the first unit)
-- in_unit_table = (unit table for "yd"; contains value 1 for number of yards)
-- Return true, iparm, unit where
-- iparm = index just after the composite units (7 in above example)
-- unit = composite unit table holding all input units,
-- or return true if no composite unit is present in parms,
-- or return false, t where t is an error message table.
local default, subinfo
local composite_units, count = { in_unit_table }, 1
local fixups = {}
local total = in_unit_table.valinfo[1].value
local subunit = in_unit_table
while subunit.subdivs do -- subdivs is nil or a table of allowed subdivisions
local subcode = strip(parms[iparm+1])
local subdiv = subunit.subdivs[subcode] or subunit.subdivs[(all_units[subcode] or {}).target]
if not subdiv then
break
end
local success
success, subunit = lookup(parms, subcode, 'no_combination')
if not success then return false, subunit end -- should never occur
success, subinfo = extract_number(parms, parms[iparm])
if not success then return false, subinfo end
iparm = iparm + 2
subunit.inout = 'in'
subunit.valinfo = { subinfo }
-- Recalculate total as a number of subdivisions.
-- subdiv[1] = number of subdivisions per previous unit (integer > 1).
total = total * subdiv[1] + subinfo.value
if not default then -- set by the first subdiv with a default defined
default = subdiv.default
end
count = count + 1
composite_units[count] = subunit
if subdiv.unit or subdiv.name then
fixups[count] = { unit = subdiv.unit, name = subdiv.name, valinfo = subunit.valinfo }
end
end
if count == 1 then
return true -- no error and no composite unit
end
for i, fixup in pairs(fixups) do
local unit = fixup.unit
local name = fixup.name
if not unit or (count > 2 and name) then
composite_units[i].fixed_name = name
else
local success, alternate = lookup(parms, unit, 'no_combination')
if not success then return false, alternate end -- should never occur
alternate.inout = 'in'
alternate.valinfo = fixup.valinfo
composite_units[i] = alternate
end
end
return true, iparm, {
utype = in_unit_table.utype,
scale = subunit.scale, -- scale of last (least significant) unit
valinfo = { { value = total, clean = subinfo.clean, denominator = subinfo.denominator } },
composite = composite_units,
default = default or in_unit_table.default
}
end
local function translate_parms(parms, kv_pairs)
-- Update fields in parms by translating each key:value in kv_pairs to terms
-- used by this module (may involve translating from local language to English).
-- Also, checks are performed which may display warnings, if enabled.
-- Return true if successful or return false, t where t is an error message table.
currency_text = nil -- local testing can hold module in memory; must clear globals
local accept_any_text = {
input = true,
qid = true,
qual = true,
stylein = true,
styleout = true,
tracking = true,
}
if kv_pairs.adj and kv_pairs.sing then
-- For enwiki (before translation), warn if attempt to use adj and sing
-- as the latter is a deprecated alias for the former.
if kv_pairs.adj ~= kv_pairs.sing and kv_pairs.sing ~= '' then
add_warning(parms, 1, 'cvt_unknown_option', 'sing=' .. kv_pairs.sing)
end
kv_pairs.sing = nil
end
kv_pairs.comma = kv_pairs.comma or config.comma -- for plwiki who want default comma=5
for loc_name, loc_value in pairs(kv_pairs) do
local en_name = text_code.en_option_name[loc_name]
if en_name then
local en_value
if en_name == '$' or en_name == 'frac' or en_name == 'sigfig' then
if loc_value == '' then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
elseif en_name == '$' then
-- Value should be a single character like "€" for the euro currency symbol, but anything is accepted.
currency_text = (loc_value == 'euro') and '€' or loc_value
else
local minimum
local number, is_integer = get_number(loc_value)
if en_name == 'frac' then
minimum = 2
if number and number < 0 then
parms.opt_fraction_horizontal = true
number = -number
end
else
minimum = 1
end
if number and is_integer and number >= minimum then
en_value = number
else
add_warning(parms, 1, (en_name == 'frac' and 'cvt_bad_frac' or 'cvt_bad_sigfig'), loc_name .. '=' .. loc_value)
end
end
elseif accept_any_text[en_name] then
en_value = loc_value ~= '' and loc_value or nil -- accept non-empty user text with no validation
if en_name == 'input' then
-- May have something like {{convert|input=}} (empty input) if source is an infobox
-- with optional fields. In that case, want to output nothing rather than an error.
parms.input_text = loc_value -- keep input because parms.input is nil if loc_value == ''
end
else
en_value = text_code.en_option_value[en_name][loc_value]
if en_value and en_value:sub(-1) == '?' then
en_value = en_value:sub(1, -2)
add_warning(parms, -1, 'cvt_deprecated', loc_name .. '=' .. loc_value)
end
if en_value == nil then
if loc_value == '' then
add_warning(parms, 2, 'cvt_empty_option', loc_name)
else
add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value)
end
elseif en_value == '' then
en_value = nil -- an ignored option like adj=off
elseif type(en_value) == 'string' and en_value:sub(1, 4) == 'opt_' then
for _, v in ipairs(split(en_value, ',')) do
local lhs, rhs = v:match('^(.-)=(.+)$')
if rhs then
parms[lhs] = tonumber(rhs) or rhs
else
parms[v] = true
end
end
en_value = nil
end
end
parms[en_name] = en_value
else
add_warning(parms, 1, 'cvt_unknown_option', loc_name .. '=' .. loc_value)
end
end
local abbr_entered = parms.abbr
local cfg_abbr = config.abbr
if cfg_abbr then
-- Don't warn if invalid because every convert would show that warning.
if cfg_abbr == 'on always' then
parms.abbr = 'on'
elseif cfg_abbr == 'off always' then
parms.abbr = 'off'
elseif parms.abbr == nil then
if cfg_abbr == 'on default' then
parms.abbr = 'on'
elseif cfg_abbr == 'off default' then
parms.abbr = 'off'
end
end
end
if parms.abbr then
if parms.abbr == 'unit' then
parms.abbr = 'on'
parms.number_word = true
end
parms.abbr_org = parms.abbr -- original abbr, before any flip
elseif parms.opt_hand_hh then
parms.abbr_org = 'on'
parms.abbr = 'on'
else
parms.abbr = 'out' -- default is to abbreviate output only (use symbol, not name)
end
if parms.opt_order_out then
-- Disable options that do not work in a useful way with order=out.
parms.opt_flip = nil -- override adj=flip
parms.opt_spell_in = nil
parms.opt_spell_out = nil
parms.opt_spell_upper = nil
end
if parms.opt_spell_out and not abbr_entered then
parms.abbr = 'off' -- should show unit name when spelling the output value
end
if parms.opt_flip then
local function swap_in_out(option)
local value = parms[option]
if value == 'in' then
parms[option] = 'out'
elseif value == 'out' then
parms[option] = 'in'
end
end
swap_in_out('abbr')
swap_in_out('lk')
if parms.opt_spell_in and not parms.opt_spell_out then
-- For simplicity, and because it does not appear to be needed,
-- user cannot set an option to spell the output only.
parms.opt_spell_in = nil
parms.opt_spell_out = true
end
end
if parms.opt_spell_upper then
parms.spell_upper = parms.opt_flip and 'out' or 'in'
end
if parms.opt_table or parms.opt_tablecen then
if abbr_entered == nil and parms.lk == nil then
parms.opt_values = true
end
parms.table_align = parms.opt_table and 'right' or 'center'
end
if parms.table_align or parms.opt_sortable_on then
parms.need_table_or_sort = true
end
local disp_joins = text_code.disp_joins
local default_joins = disp_joins['b']
parms.join_between = default_joins[3] or '; '
local disp = parms.disp
if disp == nil then -- special case for the most common setting
parms.joins = default_joins
elseif disp == 'x' then
-- Later, parms.joins is set from the input parameters.
else
-- Old template does this.
local abbr = parms.abbr
if disp == 'slash' then
if abbr_entered == nil then
disp = 'slash-nbsp'
elseif abbr == 'in' or abbr == 'out' then
disp = 'slash-sp'
else
disp = 'slash-nosp'
end
elseif disp == 'sqbr' then
if abbr == 'on' then
disp = 'sqbr-nbsp'
else
disp = 'sqbr-sp'
end
end
parms.joins = disp_joins[disp] or default_joins
parms.join_between = parms.joins[3] or parms.join_between
parms.wantname = parms.joins.wantname
end
if (en_default and not parms.opt_lang_local and (parms[1] or ''):find('%d')) or parms.opt_lang_en then
from_en_table = nil
end
if en_default and from_en_table then
-- For hiwiki: localized symbol/name is defined with the US symbol/name field,
-- and is used if output uses localized numbers.
parms.opt_sp_us = true
end
return true
end
local function get_values(parms)
-- If successful, update parms and return true, v, i where
-- v = table of input values
-- i = index to next entry in parms after those processed here
-- or return false, t where t is an error message table.
local valinfo = collection() -- numbered table of input values
local range = collection() -- numbered table of range items (having, for example, 2 range items requires 3 input values)
local had_nocomma -- true if removed "nocomma" kludge from second parameter (like "tonocomma")
local parm2 = strip(parms[2])
if parm2 and parm2:sub(-7, -1) == 'nocomma' then
parms[2] = strip(parm2:sub(1, -8))
parms.opt_nocomma = true
had_nocomma = true
end
local function extractor(i)
-- If the parameter is not a value, try unpacking it as a range ("1-23" for "1 to 23").
-- However, "-1-2/3" is a negative fraction (-1⅔), so it must be extracted first.
-- Do not unpack a parameter if it is like "3-1/2" which is sometimes incorrectly
-- used instead of "3+1/2" (and which should not be interpreted as "3 to ½").
-- Unpacked items are inserted into the parms table.
-- The tail recursion allows combinations like "1x2 to 3x4".
local valstr = strip(parms[i]) -- trim so any '-' as a negative sign will be at start
local success, result = extract_number(parms, valstr, i > 1)
if not success and valstr and i < 20 then -- check i to limit abuse
local lhs, sep, rhs = valstr:match('^(%S+)%s+(%S+)%s+(%S.*)')
if lhs and not (sep == '-' and rhs:match('/')) then
if sep:find('%d') then
return success, result -- to reject {{convert|1 234 567|m}} with a decent message (en only)
end
parms[i] = rhs
table.insert(parms, i, sep)
table.insert(parms, i, lhs)
return extractor(i)
end
if not valstr:match('%-.*/') then
for _, sep in ipairs(text_code.ranges.words) do
local start, stop = valstr:find(sep, 2, true) -- start at 2 to skip any negative sign for range '-'
if start then
parms[i] = valstr:sub(stop + 1)
table.insert(parms, i, sep)
table.insert(parms, i, valstr:sub(1, start - 1))
return extractor(i)
end
end
end
end
return success, result
end
local i = 1
local is_change
while true do
local success, info = extractor(i) -- need to set parms.opt_nocomma before calling this
if not success then return false, info end
i = i + 1
if is_change then
info.is_change = true -- value is after "±" and so is a change (significant for range like {{convert|5|±|5|°C}})
is_change = nil
end
valinfo:add(info)
local range_item = get_range(strip(parms[i]))
if not range_item then
break
end
i = i + 1
range:add(range_item)
if type(range_item) == 'table' then
-- For range "x", if append unit to some values, append it to all.
parms.in_range_x = parms.in_range_x or range_item.in_range_x
parms.out_range_x = parms.out_range_x or range_item.out_range_x
parms.abbr_range_x = parms.abbr_range_x or range_item.abbr_range_x
is_change = range_item.is_range_change
end
end
if range.n > 0 then
if range.n > 30 then -- limit abuse, although 4 is a more likely upper limit
return false, { 'cvt_invalid_num' } -- misleading message but it will do
end
parms.range = range
elseif had_nocomma then
return false, { 'cvt_unknown', parm2 }
end
return true, valinfo, i
end
local function simple_get_values(parms)
-- If input is like "{{convert|valid_value|valid_unit|...}}",
-- return true, i, in_unit, in_unit_table
-- i = index in parms of what follows valid_unit, if anything.
-- The valid_value is not negative and does not use a fraction, and
-- no options requiring further processing of the input are used.
-- Otherwise, return nothing or return false, parm1 for caller to interpret.
-- Testing shows this function is successful for 96% of converts in articles,
-- and that on average it speeds up converts by 8%.
local clean = to_en(strip(parms[1] or ''), parms)
if parms.opt_ri or parms.opt_spell_in or #clean > 10 or not clean:match('^[0-9.]+$') then
return false, clean
end
local value = tonumber(clean)
if not value then return end
local info = {
value = value,
altvalue = value,
singular = (value == 1),
clean = clean,
show = with_separator(parms, clean),
}
local in_unit = strip(parms[2])
local success, in_unit_table = lookup(parms, in_unit, 'no_combination')
if not success then return end
in_unit_table.valinfo = { info }
return true, 3, in_unit, in_unit_table
end
local function wikidata_call(parms, operation, ...)
-- Return true, s where s is the result of a Wikidata operation,
-- or return false, t where t is an error message table.
local function worker(...)
wikidata_code = wikidata_code or require(wikidata_module)
wikidata_data = wikidata_data or mw.loadData(wikidata_data_module)
return wikidata_code[operation](wikidata_data, ...)
end
local success, status, result = pcall(worker, ...)
if success then
return status, result
end
if parms.opt_sortable_debug then
-- Use debug=yes to crash if an error while accessing Wikidata.
error('Error accessing Wikidata: ' .. status, 0)
end
return false, { 'cvt_wd_fail' }
end
local function get_parms(parms, args)
-- If successful, update parms and return true, unit where
-- parms is a table of all arguments passed to the template
-- converted to named arguments, and
-- unit is the input unit table;
-- or return false, t where t is an error message table.
-- For special processing (not a convert), can also return
-- true, wikitext where wikitext is the final result.
-- The returned input unit table may be for a fake unit using the specified
-- unit code as the symbol and name, and with bad_mcode = message code table.
-- MediaWiki removes leading and trailing whitespace from the values of
-- named arguments. However, the values of numbered arguments include any
-- whitespace entered in the template, and whitespace is used by some
-- parameters (example: the numbered parameters associated with "disp=x").
local kv_pairs = {} -- table of input key:value pairs where key is a name; needed because cannot iterate parms and add new fields to it
for k, v in pairs(args) do
if type(k) == 'number' or k == 'test' then -- parameter "test" is reserved for testing and is not translated
parms[k] = v
else
kv_pairs[k] = v
end
end
if parms.test == 'wikidata' then
local ulookup = function (ucode)
-- Use empty table for parms so it does not accumulate results when used repeatedly.
return lookup({}, ucode, 'no_combination')
end
return wikidata_call(parms, '_listunits', ulookup)
end
local success, msg = translate_parms(parms, kv_pairs)
if not success then return false, msg end
if parms.input then
success, msg = wikidata_call(parms, '_adjustparameters', parms, 1)
if not success then return false, msg end
end
local success, i, in_unit, in_unit_table = simple_get_values(parms)
if not success then
if type(i) == 'string' and i:match('^NNN+$') then
-- Some infoboxes have examples like {{convert|NNN|m}} (3 or more "N").
-- Output an empty string for these.
return false, { 'cvt_no_output' }
end
local valinfo
success, valinfo, i = get_values(parms)
if not success then return false, valinfo end
in_unit = strip(parms[i])
i = i + 1
success, in_unit_table = lookup(parms, in_unit, 'no_combination')
if not success then
in_unit = in_unit or ''
if parms.opt_ignore_error then -- display given unit code with no error (for use with {{val}})
in_unit_table = '' -- suppress error message and prevent processing of output unit
end
in_unit_table = setmetatable({
symbol = in_unit, name2 = in_unit, utype = in_unit,
scale = 1, default = '', defkey = '', linkey = '',
bad_mcode = in_unit_table }, unit_mt)
end
in_unit_table.valinfo = valinfo
end
if parms.test == 'msg' then
-- Am testing the messages produced when no output unit is specified, and
-- the input unit has a missing or invalid default.
-- Set two units for testing that.
-- LATER: Remove this code.
if in_unit == 'chain' then
in_unit_table.default = nil -- no default
elseif in_unit == 'rd' then
in_unit_table.default = "ft!X!m" -- an invalid expression
end
end
in_unit_table.inout = 'in' -- this is an input unit
if not parms.range then
local success, inext, composite_unit = get_composite(parms, i, in_unit_table)
if not success then return false, inext end
if composite_unit then
in_unit_table = composite_unit
i = inext
end
end
if in_unit_table.builtin == 'mach' then
-- As with old template, a number following Mach as the input unit is the altitude,
-- and there is no way to specify an altitude for the output unit.
-- Could put more code in this function to get any output unit and check for
-- an altitude following that unit.
local success, info = extract_number(parms, parms[i], false, true)
if success then
i = i + 1
in_unit_table.altitude = info.value
end
end
local word = strip(parms[i])
i = i + 1
local precision, is_bad_precision
local function set_precision(text)
local number, is_integer = get_number(text)
if number then
if is_integer then
precision = number
else
precision = text
is_bad_precision = true
end
return true -- text was used for precision, good or bad
end
end
if word and not set_precision(word) then
parms.out_unit = parms.out_unit or word
if set_precision(strip(parms[i])) then
i = i + 1
end
end
if parms.opt_adj_mid then
word = parms[i]
i = i + 1
if word then -- mid-text words
if word:sub(1, 1) == '-' then
parms.mid = word
else
parms.mid = ' ' .. word
end
end
end
if parms.opt_one_preunit then
parms[parms.opt_flip and 'preunit2' or 'preunit1'] = preunits(1, parms[i])
i = i + 1
end
if parms.disp == 'x' then
-- Following is reasonably compatible with the old template.
local first = parms[i] or ''
local second = parms[i+1] or ''
i = i + 2
if strip(first) == '' then -- user can enter ' ' rather than ' ' to avoid the default
first = ' [ ' .. first
second = ' ]' .. second
end
parms.joins = { first, second }
elseif parms.opt_two_preunits then
local p1, p2 = preunits(2, parms[i], parms[i+1])
i = i + 2
if parms.preunit1 then
-- To simplify documentation, allow unlikely use of adj=pre with disp=preunit
-- (however, an output unit must be specified with adj=pre and with disp=preunit).
parms.preunit1 = parms.preunit1 .. p1
parms.preunit2 = p2
else
parms.preunit1, parms.preunit2 = p1, p2
end
end
if precision == nil then
if set_precision(strip(parms[i])) then
i = i + 1
end
end
if is_bad_precision then
add_warning(parms, 1, 'cvt_bad_prec', precision)
else
parms.precision = precision
end
for j = i, i + 3 do
local parm = parms[j] -- warn if find a non-empty extraneous parameter
if parm and parm:match('%S') then
add_warning(parms, 1, 'cvt_unknown_option', parm)
break
end
end
return true, in_unit_table
end
local function record_default_precision(parms, out_current, precision)
-- If necessary, adjust parameters and return a possibly adjusted precision.
-- When converting a range of values where a default precision is required,
-- that default is calculated for each value because the result sometimes
-- depends on the precise input and output values. This function may cause
-- the entire convert process to be repeated in order to ensure that the
-- same default precision is used for each individual convert.
-- If that were not done, a range like 1000 to 1000.4 may give poor results
-- because the first output could be heavily rounded, while the second is not.
-- For range 1000.4 to 1000, this function can give the second convert the
-- same default precision that was used for the first.
if not parms.opt_round_each then
local maxdef = out_current.max_default_precision
if maxdef then
if maxdef < precision then
parms.do_convert_again = true
out_current.max_default_precision = precision
else
precision = out_current.max_default_precision
end
else
out_current.max_default_precision = precision
end
end
return precision
end
local function default_precision(parms, invalue, inclean, denominator, outvalue, in_current, out_current, extra)
-- Return a default value for precision (an integer like 2, 0, -2).
-- If denominator is not nil, it is the value of the denominator in inclean.
-- Code follows procedures used in old template.
local fudge = 1e-14 -- {{Order of magnitude}} adds this, so we do too
local prec, minprec, adjust
local subunit_ignore_trailing_zero
local subunit_more_precision -- kludge for "in" used in input like "|2|ft|6|in"
local composite = in_current.composite
if composite then
subunit_ignore_trailing_zero = true -- input "|2|st|10|lb" has precision 0, not -1
if composite[#composite].exception == 'subunit_more_precision' then
subunit_more_precision = true -- do not use standard precision with input like "|2|ft|6|in"
end
end
if denominator and denominator > 0 then
prec = math.max(log10(denominator), 1)
else
-- Count digits after decimal mark, handling cases like '12.345e6'.
local exponent
local integer, dot, decimals, expstr = inclean:match('^(%d*)(%.?)(%d*)(.*)')
local e = expstr:sub(1, 1)
if e == 'e' or e == 'E' then
exponent = tonumber(expstr:sub(2))
end
if dot == '' then
prec = subunit_ignore_trailing_zero and 0 or -integer:match('0*$'):len()
else
prec = #decimals
end
if exponent then
-- So '1230' and '1.23e3' both give prec = -1, and '0.00123' and '1.23e-3' give 5.
prec = prec - exponent
end
end
if in_current.istemperature and out_current.istemperature then
-- Converting between common temperatures (°C, °F, °R, K); not keVT.
-- Kelvin value can be almost zero, or small but negative due to precision problems.
-- Also, an input value like -300 C (below absolute zero) gives negative kelvins.
-- Calculate minimum precision from absolute value.
adjust = 0
local kelvin = abs((invalue - in_current.offset) * in_current.scale)
if kelvin < 1e-8 then -- assume nonzero due to input or calculation precision problem
minprec = 2
else
minprec = 2 - floor(log10(kelvin) + fudge) -- 3 sigfigs in kelvin
end
else
if invalue == 0 or outvalue <= 0 then
-- We are never called with a negative outvalue, but it might be zero.
-- This is special-cased to avoid calculation exceptions.
return record_default_precision(parms, out_current, 0)
end
if out_current.exception == 'integer_more_precision' and floor(invalue) == invalue then
-- With certain output units that sometimes give poor results
-- with default rounding, use more precision when the input
-- value is equal to an integer. An example of a poor result
-- is when input 50 gives a smaller output than input 49.5.
-- Experiment shows this helps, but it does not eliminate all
-- surprises because it is not clear whether "50" should be
-- interpreted as "from 45 to 55" or "from 49.5 to 50.5".
adjust = -log10(in_current.scale)
elseif subunit_more_precision then
-- Conversion like "{{convert|6|ft|1|in|cm}}" (where subunit is "in")
-- has a non-standard adjust value, to give more output precision.
adjust = log10(out_current.scale) + 2
else
adjust = log10(abs(invalue / outvalue))
end
adjust = adjust + log10(2)
-- Ensure that the output has at least two significant figures.
minprec = 1 - floor(log10(outvalue) + fudge)
end
if extra then
adjust = extra.adjust or adjust
minprec = extra.minprec or minprec
end
return record_default_precision(parms, out_current, math.max(floor(prec + adjust), minprec))
end
local function convert(parms, invalue, info, in_current, out_current)
-- Convert given input value from one unit to another.
-- Return output_value (a number) if a simple convert, or
-- return f, t where
-- f = true, t = table of information with results, or
-- f = false, t = error message table.
local inscale = in_current.scale
local outscale = out_current.scale
if not in_current.iscomplex and not out_current.iscomplex then
return invalue * (inscale / outscale) -- minimize overhead for most common case
end
if in_current.invert or out_current.invert then
-- Inverted units, such as inverse length, inverse time, or
-- fuel efficiency. Built-in units do not have invert set.
if (in_current.invert or 1) * (out_current.invert or 1) < 0 then
return 1 / (invalue * inscale * outscale)
end
return invalue * (inscale / outscale)
elseif in_current.offset then
-- Temperature (there are no built-ins for this type of unit).
if info.is_change then
return invalue * (inscale / outscale)
end
return (invalue - in_current.offset) * (inscale / outscale) + out_current.offset
else
-- Built-in unit.
local in_builtin = in_current.builtin
local out_builtin = out_current.builtin
if in_builtin and out_builtin then
if in_builtin == out_builtin then
return invalue
end
-- There are no cases (yet) where need to convert from one
-- built-in unit to another, so this should never occur.
return false, { 'cvt_bug_convert' }
end
if in_builtin == 'mach' or out_builtin == 'mach' then
local adjust
if in_builtin == 'mach' then
inscale = speed_of_sound(in_current.altitude)
adjust = outscale / 0.1
else
outscale = speed_of_sound(out_current.altitude)
adjust = 0.1 / inscale
end
return true, {
outvalue = invalue * (inscale / outscale),
adjust = log10(adjust) + log10(2),
}
elseif in_builtin == 'hand' then
-- 1 hand = 4 inches; 1.2 hands = 6 inches.
-- Decimals of a hand are only defined for the first digit, and
-- the first fractional digit should be a number of inches (1, 2 or 3).
-- However, this code interprets the entire fractional part as the number
-- of inches / 10 (so 1.75 inches would be 0.175 hands).
-- A value like 12.3 hands is exactly 12*4 + 3 inches; base default precision on that.
local integer, fracpart = math.modf(invalue)
local inch_value = 4 * integer + 10 * fracpart -- equivalent number of inches
local factor = inscale / outscale
if factor == 4 then
-- Am converting to inches: show exact result, and use "inches" not "in" by default.
if parms.abbr_org == nil then
out_current.usename = true
end
local show = format('%g', abs(inch_value)) -- show and clean are unsigned
if not show:find('e', 1, true) then
return true, {
invalue = inch_value,
outvalue = inch_value,
clean = show,
show = show,
}
end
end
local outvalue = (integer + 2.5 * fracpart) * factor
local fracstr = info.clean:match('%.(.*)') or ''
local fmt
if fracstr == '' then
fmt = '%.0f'
else
fmt = '%.' .. format('%d', #fracstr - 1) .. 'f'
end
return true, {
invalue = inch_value,
clean = format(fmt, inch_value),
outvalue = outvalue,
minprec = 0,
}
end
end
return false, { 'cvt_bug_convert' } -- should never occur
end
local function user_style(parms, i)
-- Return text for a user-specified style for a table cell, or '' if none,
-- given i = 1 (input style) or 2 (output style).
local style = parms[(i == 1) and 'stylein' or 'styleout']
if style then
style = style:gsub('"', '')
if style ~= '' then
if style:sub(-1) ~= ';' then
style = style .. ';'
end
return style
end
end
return ''
end
local function make_table_or_sort(parms, invalue, info, in_current, scaled_top)
-- Set options to handle output for a table or a sort key, or both.
-- The text sort key is based on the value resulting from converting
-- the input to a fake base unit with scale = 1, and other properties
-- required for a conversion derived from the input unit.
-- For other modules, return the sort key in a hidden span element, and
-- the scaled value used to generate the sort key.
-- If scaled_top is set, it is the scaled value of the numerator of a per unit
-- to be combined with this unit (the denominator) to make the sort key.
-- Scaling only works with units that convert with a factor (not temperature).
local sortkey, scaled_value
if parms.opt_sortable_on then
local base = { -- a fake unit with enough fields for a valid convert
scale = 1,
invert = in_current.invert and 1,
iscomplex = in_current.iscomplex,
offset = in_current.offset and 0,
}
local outvalue, extra = convert(parms, invalue, info, in_current, base)
if extra then
outvalue = extra.outvalue
end
if in_current.istemperature then
-- Have converted to kelvin; assume numbers close to zero have a
-- rounding error and should be zero.
if abs(outvalue) < 1e-12 then
outvalue = 0
end
end
if scaled_top and outvalue ~= 0 then
outvalue = scaled_top / outvalue
end
scaled_value = outvalue
if not valid_number(outvalue) then
if outvalue < 0 then
sortkey = '1000000000000000000'
else
sortkey = '9000000000000000000'
end
elseif outvalue == 0 then
sortkey = '5000000000000000000'
else
local mag = floor(log10(abs(outvalue)) + 1e-14)
local prefix
if outvalue > 0 then
prefix = 7000 + mag
else
prefix = 2999 - mag
outvalue = outvalue + 10^(mag+1)
end
sortkey = format('%d', prefix) .. format('%015.0f', floor(outvalue * 10^(14-mag)))
end
end
local sortspan
if sortkey and not parms.table_align then
sortspan = parms.opt_sortable_debug and
'<span data-sort-value="' .. sortkey .. '♠"><span style="border:1px solid">' .. sortkey .. '♠</span></span>' or
'<span data-sort-value="' .. sortkey .. '♠"></span>'
parms.join_before = sortspan
end
if parms.table_align then
local sort
if sortkey then
sort = ' data-sort-value="' .. sortkey .. '"'
if parms.opt_sortable_debug then
parms.join_before = '<span style="border:1px solid">' .. sortkey .. '</span>'
end
else
sort = ''
end
local style = 'style="text-align:' .. parms.table_align .. ';'
local joins = {}
for i = 1, 2 do
joins[i] = (i == 1 and '' or '\n|') .. style .. user_style(parms, i) .. '"' .. sort .. '|'
end
parms.table_joins = joins
end
return sortspan, scaled_value
end
local cvt_to_hand
local function cvtround(parms, info, in_current, out_current)
-- Return true, t where t is a table with the conversion results; fields:
-- show = rounded, formatted string with the result of converting value in info,
-- using the rounding specified in parms.
-- singular = true if result (after rounding and ignoring any negative sign)
-- is "1", or like "1.00", or is a fraction with value < 1;
-- (and more fields shown below, and a calculated 'absvalue' field).
-- or return false, t where t is an error message table.
-- Input info.clean uses en digits (it has been translated, if necessary).
-- Output show uses en or non-en digits as appropriate, or can be spelled.
if out_current.builtin == 'hand' then
return cvt_to_hand(parms, info, in_current, out_current)
end
local invalue = in_current.builtin == 'hand' and info.altvalue or info.value
local outvalue, extra = convert(parms, invalue, info, in_current, out_current)
if parms.need_table_or_sort then
parms.need_table_or_sort = nil -- process using first input value only
make_table_or_sort(parms, invalue, info, in_current)
end
if extra then
if not outvalue then return false, extra end
invalue = extra.invalue or invalue
outvalue = extra.outvalue
end
if not valid_number(outvalue) then
return false, { 'cvt_invalid_num' }
end
local isnegative
if outvalue < 0 then
isnegative = true
outvalue = -outvalue
end
local precision, show, exponent
local denominator = out_current.frac
if denominator then
show = fraction_table(outvalue, denominator)
else
precision = parms.precision
if not precision then
if parms.sigfig then
show, exponent = make_sigfig(outvalue, parms.sigfig)
elseif parms.opt_round then
local n = parms.opt_round
if n == 0.5 then
local integer, fracpart = math.modf(floor(2 * outvalue + 0.5) / 2)
if fracpart == 0 then
show = format('%.0f', integer)
else
show = format('%.1f', integer + fracpart)
end
else
show = format('%.0f', floor((outvalue / n) + 0.5) * n)
end
else
local inclean = info.clean
if extra then
inclean = extra.clean or inclean
show = extra.show
end
if not show then
precision = default_precision(parms, invalue, inclean, info.denominator, outvalue, in_current, out_current, extra)
end
end
end
end
if precision then
if precision >= 0 then
local fudge
if precision <= 8 then
-- Add a fudge to handle common cases of bad rounding due to inability
-- to precisely represent some values. This makes the following work:
-- {{convert|-100.1|C|K}} and {{convert|5555000|um|m|2}}.
-- Old template uses #expr round, which invokes PHP round().
-- LATER: Investigate how PHP round() works.
fudge = 2e-14
else
fudge = 0
end
local fmt = '%.' .. format('%d', precision) .. 'f'
local success
success, show = pcall(format, fmt, outvalue + fudge)
if not success then
return false, { 'cvt_big_prec', tostring(precision) }
end
else
precision = -precision -- #digits to zero (in addition to any digits after dot)
local shift = 10 ^ precision
show = format('%.0f', outvalue/shift)
if show ~= '0' then
exponent = #show + precision
end
end
end
local t = format_number(parms, show, exponent, isnegative)
if type(show) == 'string' then
-- Set singular using match because on some systems 0.99999999999999999 is 1.0.
if exponent then
t.singular = (exponent == 1 and show:match('^10*$'))
else
t.singular = (show == '1' or show:match('^1%.0*$'))
end
else
t.fraction_table = show
t.singular = (outvalue <= 1) -- cannot have 'fraction == 1', but if it were possible it would be singular
end
t.raw_absvalue = outvalue -- absolute value before rounding
return true, setmetatable(t, {
__index = function (self, key)
if key == 'absvalue' then
-- Calculate absolute value after rounding, if needed.
local clean, exponent = rawget(self, 'clean'), rawget(self, 'exponent')
local value = tonumber(clean) -- absolute value (any negative sign has been ignored)
if exponent then
value = value * 10^exponent
end
rawset(self, key, value)
return value
end
end })
end
function cvt_to_hand(parms, info, in_current, out_current)
-- Convert input to hands, inches.
-- Return true, t where t is a table with the conversion results;
-- or return false, t where t is an error message table.
if parms.abbr_org == nil then
out_current.usename = true -- default is to show name not symbol
end
local precision = parms.precision
local frac = out_current.frac
if not frac and precision and precision > 1 then
frac = (precision == 2) and 2 or 4
end
local out_next = out_current.out_next
if out_next then
-- Use magic knowledge to determine whether the next unit is inches without requiring i18n.
-- The following ensures that when the output combination "hand in" is used, the inches
-- value is rounded to match the hands value. Also, displaying say "61½" instead of 61.5
-- is better as 61.5 implies the value is not 61.4.
if out_next.exception == 'subunit_more_precision' then
out_next.frac = frac
end
end
-- Convert to inches; calculate hands from that.
local dummy_unit_table = { scale = out_current.scale / 4, frac = frac }
local success, outinfo = cvtround(parms, info, in_current, dummy_unit_table)
if not success then return false, outinfo end
local tfrac = outinfo.fraction_table
local inches = outinfo.raw_absvalue
if tfrac then
inches = floor(inches) -- integer part only; fraction added later
else
inches = floor(inches + 0.5) -- a hands measurement never shows decimals of an inch
end
local hands, inches = divide(inches, 4)
outinfo.absvalue = hands + inches/4 -- supposed to be the absolute rounded value, but this is close enough
local inchstr = tostring(inches) -- '0', '1', '2' or '3'
if precision and precision <= 0 then -- using negative or 0 for precision rounds to nearest hand
hands = floor(outinfo.raw_absvalue/4 + 0.5)
inchstr = ''
elseif tfrac then
-- Always show an integer before fraction (like "15.0½") because "15½" means 15-and-a-half hands.
inchstr = numdot .. format_fraction(parms, 'out', false, inchstr, tfrac.numstr, tfrac.denstr)
else
inchstr = numdot .. from_en(inchstr)
end
outinfo.show = outinfo.sign .. with_separator(parms, format('%.0f', hands)) .. inchstr
return true, outinfo
end
local function evaluate_condition(value, condition)
-- Return true or false from applying a conditional expression to value,
-- or throw an error if invalid.
-- A very limited set of expressions is supported:
-- v < 9
-- v * 9 < 9
-- where
-- 'v' is replaced with value
-- 9 is any number (as defined by Lua tonumber)
-- only en digits are accepted
-- '<' can also be '<=' or '>' or '>='
-- In addition, the following form is supported:
-- LHS and RHS
-- where
-- LHS, RHS = any of above expressions.
local function compare(value, text)
local arithop, factor, compop, limit = text:match('^%s*v%s*([*]?)(.-)([<>]=?)(.*)$')
if arithop == nil then
error('Invalid default expression', 0)
elseif arithop == '*' then
factor = tonumber(factor)
if factor == nil then
error('Invalid default expression', 0)
end
value = value * factor
end
limit = tonumber(limit)
if limit == nil then
error('Invalid default expression', 0)
end
if compop == '<' then
return value < limit
elseif compop == '<=' then
return value <= limit
elseif compop == '>' then
return value > limit
elseif compop == '>=' then
return value >= limit
end
error('Invalid default expression', 0) -- should not occur
end
local lhs, rhs = condition:match('^(.-%W)and(%W.*)')
if lhs == nil then
return compare(value, condition)
end
return compare(value, lhs) and compare(value, rhs)
end
local function get_default(value, unit_table)
-- Return true, s where s = name of unit's default output unit,
-- or return false, t where t is an error message table.
-- Some units have a default that depends on the input value
-- (the first value if a range of values is used).
-- If '!' is in the default, the first bang-delimited field is an
-- expression that uses 'v' to represent the input value.
-- Example: 'v < 120 ! small ! big ! suffix' (suffix is optional)
-- evaluates 'v < 120' as a boolean with result
-- 'smallsuffix' if (value < 120), or 'bigsuffix' otherwise.
-- Input must use en digits and '.' decimal mark.
local default = data_code.default_exceptions[unit_table.defkey or unit_table.symbol] or unit_table.default
if not default then
local per = unit_table.per
if per then
local function a_default(v, u)
local success, ucode = get_default(v, u)
if not success then
return '?' -- an unlikely error has occurred; will cause lookup of default to fail
end
-- Attempt to use only the first unit if a combination or output multiple.
-- This is not bulletproof but should work for most cases.
-- Where it does not work, the convert will need to specify the wanted output unit.
local t = all_units[ucode]
if t then
local combo = t.combination
if combo then
-- For a multiple like ftin, the "first" unit (ft) is last in the combination.
local i = t.multiple and table_len(combo) or 1
ucode = combo[i]
end
else
-- Try for an automatically generated combination.
local item = ucode:match('^(.-)%+') or ucode:match('^(%S+)%s')
if all_units[item] then
return item
end
end
return ucode
end
local unit1, unit2 = per[1], per[2]
local def1 = (unit1 and a_default(value, unit1) or unit_table.vprefix or '')
local def2 = a_default(1, unit2) -- 1 because per unit of denominator
return true, def1 .. '/' .. def2
end
return false, { 'cvt_no_default', unit_table.symbol }
end
if default:find('!', 1, true) == nil then
return true, default
end
local t = split(default, '!')
if #t == 3 or #t == 4 then
local success, result = pcall(evaluate_condition, value, t[1])
if success then
default = result and t[2] or t[3]
if #t == 4 then
default = default .. t[4]
end
return true, default
end
end
return false, { 'cvt_bad_default', unit_table.symbol }
end
local linked_pages -- to record linked pages so will not link to the same page more than once
local function unlink(unit_table)
-- Forget that the given unit has previously been linked (if it has).
-- That is needed when processing a range of inputs or outputs when an id
-- for the first range value may have been evaluated, but only an id for
-- the last value is displayed, and that id may need to be linked.
linked_pages[unit_table.unitcode or unit_table] = nil
end
local function make_link(link, id, unit_table)
-- Return wikilink "[[link|id]]", possibly abbreviated as in examples:
-- [[Mile|mile]] --> [[mile]]
-- [[Mile|miles]] --> [[mile]]s
-- However, just id is returned if:
-- * no link given (so caller does not need to check if a link was defined); or
-- * link has previously been used during the current convert (to avoid overlinking).
local link_key
if unit_table then
link_key = unit_table.unitcode or unit_table
else
link_key = link
end
if not link or link == '' or linked_pages[link_key] then
return id
end
linked_pages[link_key] = true
-- Following only works for language en, but it should be safe on other wikis,
-- and overhead of doing it generally does not seem worthwhile.
local l = link:sub(1, 1):lower() .. link:sub(2)
if link == id or l == id then
return '[[' .. id .. ']]'
elseif link .. 's' == id or l .. 's' == id then
return '[[' .. id:sub(1, -2) .. ']]s'
else
return '[[' .. link .. '|' .. id .. ']]'
end
end
local function variable_name(clean, unit_table)
-- For slwiki, a unit name depends on the value.
-- Parameter clean is the unsigned rounded value in en digits, as a string.
-- Value Source Example for "m"
-- integer 1: name1 meter (also is the name of the unit)
-- integer 2: var{1} metra
-- integer 3 and 4: var{2} metri
-- integer else: var{3} metrov (0 and 5 or more)
-- real/fraction: var{4} metra
-- var{i} means the i'th field in unit_table.varname if it exists and has
-- an i'th field, otherwise name2.
-- Fields are separated with "!" and are not empty.
-- A field for a unit using an SI prefix has the prefix name inserted,
-- replacing '#' if found, or before the field otherwise.
local vname
if clean == '1' then
vname = unit_table.name1
elseif unit_table.varname then
local i
if clean == '2' then
i = 1
elseif clean == '3' or clean == '4' then
i = 2
elseif clean:find('.', 1, true) then
i = 4
else
i = 3
end
if i > 1 and varname == 'pl' then
i = i - 1
end
vname = split(unit_table.varname, '!')[i]
end
if vname then
local si_name = rawget(unit_table, 'si_name') or ''
local pos = vname:find('#', 1, true)
if pos then
vname = vname:sub(1, pos - 1) .. si_name .. vname:sub(pos + 1)
else
vname = si_name .. vname
end
return vname
end
return unit_table.name2
end
local function linked_id(parms, unit_table, key_id, want_link, clean)
-- Return final unit id (symbol or name), optionally with a wikilink,
-- and update unit_table.sep if required.
-- key_id is one of: 'symbol', 'sym_us', 'name1', 'name1_us', 'name2', 'name2_us'.
local abbr_on = (key_id == 'symbol' or key_id == 'sym_us')
if abbr_on and want_link then
local symlink = rawget(unit_table, 'symlink')
if symlink then
return symlink -- for exceptions that have the linked symbol built-in
end
end
local multiplier = rawget(unit_table, 'multiplier')
local per = unit_table.per
if per then
local paren1, paren2 = '', '' -- possible parentheses around bottom unit
local unit1 = per[1] -- top unit_table, or nil
local unit2 = per[2] -- bottom unit_table
if abbr_on then
if not unit1 then
unit_table.sep = '' -- no separator in "$2/acre"
end
if not want_link then
local symbol = unit_table.symbol_raw
if symbol then
return symbol -- for exceptions that have the symbol built-in
end
end
if (unit2.symbol):find('⋅', 1, true) then
paren1, paren2 = '(', ')'
end
end
local key_id2 -- unit2 is always singular
if key_id == 'name2' then
key_id2 = 'name1'
elseif key_id == 'name2_us' then
key_id2 = 'name1_us'
else
key_id2 = key_id
end
local result
if abbr_on then
result = '/'
elseif omitsep then
result = per_word
elseif unit1 then
result = ' ' .. per_word .. ' '
else
result = per_word .. ' '
end
if want_link and unit_table.link then
if abbr_on or not varname then
result = (unit1 and linked_id(parms, unit1, key_id, false, clean) or '') .. result .. linked_id(parms, unit2, key_id2, false, '1')
else
result = (unit1 and variable_name(clean, unit1) or '') .. result .. variable_name('1', unit2)
end
if omit_separator(result) then
unit_table.sep = ''
end
return make_link(unit_table.link, result, unit_table)
end
if unit1 then
result = linked_id(parms, unit1, key_id, want_link, clean) .. result
if unit1.sep then
unit_table.sep = unit1.sep
end
elseif omitsep then
unit_table.sep = ''
end
return result .. paren1 .. linked_id(parms, unit2, key_id2, want_link, '1') .. paren2
end
if multiplier then
-- A multiplier (like "100" in "100km") forces the unit to be plural.
multiplier = from_en(multiplier)
if not omitsep then
multiplier = multiplier .. (abbr_on and ' ' or ' ')
end
if not abbr_on then
if key_id == 'name1' then
key_id = 'name2'
elseif key_id == 'name1_us' then
key_id = 'name2_us'
end
end
else
multiplier = ''
end
local id = unit_table.fixed_name or ((varname and not abbr_on) and variable_name(clean, unit_table) or unit_table[key_id])
if omit_separator(id) then
unit_table.sep = ''
end
if want_link then
local link = data_code.link_exceptions[unit_table.linkey or unit_table.symbol] or unit_table.link
if link then
local before = ''
local i = unit_table.customary
if i == 1 and parms.opt_sp_us then
i = 2 -- show "U.S." not "US"
end
if i == 3 and abbr_on then
i = 4 -- abbreviate "imperial" to "imp"
end
local customary = text_code.customary_units[i]
if customary then
-- LATER: This works for language en only, but it's esoteric so ignore for now.
local pertext
if id:sub(1, 1) == '/' then
-- Want unit "/USgal" to display as "/U.S. gal", not "U.S. /gal".
pertext = '/'
id = id:sub(2)
elseif id:sub(1, 4) == 'per ' then
-- Similarly want "per U.S. gallon", not "U.S. per gallon" (but in practice this is unlikely to be used).
pertext = 'per '
id = id:sub(5)
else
pertext = ''
end
-- Omit any "US"/"U.S."/"imp"/"imperial" from start of id since that will be inserted.
local removes = (i < 3) and { 'US ', 'US ', 'U.S. ', 'U.S. ' } or { 'imp ', 'imp ', 'imperial ' }
for _, prefix in ipairs(removes) do
local plen = #prefix
if id:sub(1, plen) == prefix then
id = id:sub(plen + 1)
break
end
end
before = pertext .. make_link(customary.link, customary[1]) .. ' '
end
id = before .. make_link(link, id, unit_table)
end
end
return multiplier .. id
end
local function make_id(parms, which, unit_table)
-- Return id, f where
-- id = unit name or symbol, possibly modified
-- f = true if id is a name, or false if id is a symbol
-- using the value for index 'which', and for 'in' or 'out' (unit_table.inout).
-- Result is '' if no symbol/name is to be used.
-- In addition, set unit_table.sep = ' ' or ' ' or ''
-- (the separator that caller will normally insert before the id).
if parms.opt_values then
unit_table.sep = ''
return ''
end
local inout = unit_table.inout
local info = unit_table.valinfo[which]
local abbr_org = parms.abbr_org
local adjectival = parms.opt_adjectival
local lk = parms.lk
local want_link = (lk == 'on' or lk == inout)
local usename = unit_table.usename
local singular = info.singular
local want_name
if usename then
want_name = true
else
if abbr_org == nil then
if parms.wantname then
want_name = true
end
if unit_table.usesymbol then
want_name = false
end
end
if want_name == nil then
local abbr = parms.abbr
if abbr == 'on' or abbr == inout or (abbr == 'mos' and inout == 'out') then
want_name = false
else
want_name = true
end
end
end
local key
if want_name then
if lk == nil and unit_table.builtin == 'hand' then
want_link = true
end
if parms.opt_use_nbsp then
unit_table.sep = ' '
else
unit_table.sep = ' '
end
if parms.opt_singular then
local value
if inout == 'in' then
value = info.value
else
value = info.absvalue
end
if value then -- some unusual units do not always set value field
value = abs(value)
singular = (0 < value and value < 1.0001)
end
end
if unit_table.engscale then
-- engscale: so "|1|e3kg" gives "1 thousand kilograms" (plural)
singular = false
end
key = (adjectival or singular) and 'name1' or 'name2'
if parms.opt_sp_us then
key = key .. '_us'
end
else
if unit_table.builtin == 'hand' then
if parms.opt_hand_hh then
unit_table.symbol = 'hh' -- LATER: might want i18n applied to this
end
end
unit_table.sep = ' '
key = parms.opt_sp_us and 'sym_us' or 'symbol'
end
return linked_id(parms, unit_table, key, want_link, info.clean), want_name
end
local function decorate_value(parms, unit_table, which, number_word)
-- If needed, update unit_table so values will be shown with extra information.
-- For consistency with the old template (but different from fmtpower),
-- the style to display powers of 10 includes "display:none" to allow some
-- browsers to copy, for example, "10³" as "10^3", rather than as "103".
local info
local engscale = unit_table.engscale
local prefix = unit_table.vprefix
if engscale or prefix then
info = unit_table.valinfo[which]
if info.decorated then
return -- do not redecorate if repeating convert
end
info.decorated = true
if engscale then
local inout = unit_table.inout
local abbr = parms.abbr
if (abbr == 'on' or abbr == inout) and not parms.number_word then
info.show = info.show ..
'<span style="margin-left:0.2em">×<span style="margin-left:0.1em">' ..
from_en('10') ..
'</span></span><s style="display:none">^</s><sup>' ..
from_en(tostring(engscale.exponent)) .. '</sup>'
elseif number_word then
local number_id
local lk = parms.lk
if lk == 'on' or lk == inout then
number_id = make_link(engscale.link, engscale[1])
else
number_id = engscale[1]
end
-- WP:NUMERAL recommends " " in values like "12 million".
info.show = info.show .. (parms.opt_adjectival and '-' or ' ') .. number_id
end
end
if prefix then
info.show = prefix .. info.show
end
end
end
local function process_input(parms, in_current)
-- Processing required once per conversion.
-- Return block of text to represent input (value/unit).
if parms.opt_output_only or parms.opt_output_number_only or parms.opt_output_unit_only then
parms.joins = { '', '' }
return ''
end
local first_unit
local composite = in_current.composite -- nil or table of units
if composite then
first_unit = composite[1]
else
first_unit = in_current
end
local id1, want_name = make_id(parms, 1, first_unit)
local sep = first_unit.sep -- separator between value and unit, set by make_id
local preunit = parms.preunit1
if preunit then
sep = '' -- any separator is included in preunit
else
preunit = ''
end
if parms.opt_input_unit_only then
parms.joins = { '', '' }
if composite then
local parts = { id1 }
for i, unit in ipairs(composite) do
if i > 1 then
table.insert(parts, (make_id(parms, 1, unit)))
end
end
id1 = table.concat(parts, ' ')
end
if want_name and parms.opt_adjectival then
return preunit .. hyphenated(id1)
end
return preunit .. id1
end
if parms.opt_also_symbol and not composite and not parms.opt_flip then
local join1 = parms.joins[1]
if join1 == ' (' or join1 == ' [' then
parms.joins = { ' [' .. first_unit[parms.opt_sp_us and 'sym_us' or 'symbol'] .. ']' .. join1 , parms.joins[2] }
end
end
if in_current.builtin == 'mach' and first_unit.sep ~= '' then -- '' means omitsep with non-enwiki name
local prefix = id1 .. ' '
local range = parms.range
local valinfo = first_unit.valinfo
local result = prefix .. valinfo[1].show
if range then
-- For simplicity and because more not needed, handle one range item only.
local prefix2 = make_id(parms, 2, first_unit) .. ' '
result = range_text(range[1], want_name, parms, result, prefix2 .. valinfo[2].show, 'in')
end
return preunit .. result
end
if composite then
-- Simplify: assume there is no range, and no decoration.
local mid = (not parms.opt_flip) and parms.mid or ''
local sep1 = ' '
local sep2 = ' '
if parms.opt_adjectival and want_name then
sep1 = '-'
sep2 = '-'
end
if omitsep and sep == '' then
-- Testing the id of the most significant unit should be sufficient.
sep1 = ''
sep2 = ''
end
local parts = { first_unit.valinfo[1].show .. sep1 .. id1 }
for i, unit in ipairs(composite) do
if i > 1 then
table.insert(parts, unit.valinfo[1].show .. sep1 .. (make_id(parms, 1, unit)))
end
end
return table.concat(parts, sep2) .. mid
end
local add_unit = (parms.abbr == 'mos') or
parms[parms.opt_flip and 'out_range_x' or 'in_range_x'] or
(not want_name and parms.abbr_range_x)
local range = parms.range
if range and not add_unit then
unlink(first_unit)
end
local id = range and make_id(parms, range.n + 1, first_unit) or id1
local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, 'in')
if was_hyphenated then
add_unit = false
end
local result
local valinfo = first_unit.valinfo
if range then
for i = 0, range.n do
local number_word
if i == range.n then
add_unit = false
number_word = true
end
decorate_value(parms, first_unit, i+1, number_word)
local show = valinfo[i+1].show
if add_unit then
show = show .. first_unit.sep .. (i == 0 and id1 or make_id(parms, i+1, first_unit))
end
if i == 0 then
result = show
else
result = range_text(range[i], want_name, parms, result, show, 'in')
end
end
else
decorate_value(parms, first_unit, 1, true)
result = valinfo[1].show
end
return result .. preunit .. extra
end
local function process_one_output(parms, out_current)
-- Processing required for each output unit.
-- Return block of text to represent output (value/unit).
local inout = out_current.inout -- normally 'out' but can be 'in' for order=out
local id1, want_name = make_id(parms, 1, out_current)
local sep = out_current.sep -- set by make_id
local preunit = parms.preunit2
if preunit then
sep = '' -- any separator is included in preunit
else
preunit = ''
end
if parms.opt_output_unit_only then
if want_name and parms.opt_adjectival then
return preunit .. hyphenated(id1)
end
return preunit .. id1
end
if out_current.builtin == 'mach' and out_current.sep ~= '' then -- '' means omitsep with non-enwiki name
local prefix = id1 .. ' '
local range = parms.range
local valinfo = out_current.valinfo
local result = prefix .. valinfo[1].show
if range then
-- For simplicity and because more not needed, handle one range item only.
result = range_text(range[1], want_name, parms, result, prefix .. valinfo[2].show, inout)
end
return preunit .. result
end
local add_unit = (parms[parms.opt_flip and 'in_range_x' or 'out_range_x'] or
(not want_name and parms.abbr_range_x)) and
not parms.opt_output_number_only
local range = parms.range
if range and not add_unit then
unlink(out_current)
end
local id = range and make_id(parms, range.n + 1, out_current) or id1
local extra, was_hyphenated = hyphenated_maybe(parms, want_name, sep, id, inout)
if was_hyphenated then
add_unit = false
end
local result
local valinfo = out_current.valinfo
if range then
for i = 0, range.n do
local number_word
if i == range.n then
add_unit = false
number_word = true
end
decorate_value(parms, out_current, i+1, number_word)
local show = valinfo[i+1].show
if add_unit then
show = show .. out_current.sep .. (i == 0 and id1 or make_id(parms, i+1, out_current))
end
if i == 0 then
result = show
else
result = range_text(range[i], want_name, parms, result, show, inout)
end
end
else
decorate_value(parms, out_current, 1, true)
result = valinfo[1].show
end
if parms.opt_output_number_only then
return result
end
return result .. preunit .. extra
end
local function make_output_single(parms, in_unit_table, out_unit_table)
-- Return true, item where item = wikitext of the conversion result
-- for a single output (which is not a combination or a multiple);
-- or return false, t where t is an error message table.
if parms.opt_order_out and in_unit_table.unitcode == out_unit_table.unitcode then
out_unit_table.valinfo = in_unit_table.valinfo
else
out_unit_table.valinfo = collection()
for _, v in ipairs(in_unit_table.valinfo) do
local success, info = cvtround(parms, v, in_unit_table, out_unit_table)
if not success then return false, info end
out_unit_table.valinfo:add(info)
end
end
return true, process_one_output(parms, out_unit_table)
end
local function make_output_multiple(parms, in_unit_table, out_unit_table)
-- Return true, item where item = wikitext of the conversion result
-- for an output which is a multiple (like 'ftin');
-- or return false, t where t is an error message table.
local inout = out_unit_table.inout -- normally 'out' but can be 'in' for order=out
local multiple = out_unit_table.multiple -- table of scaling factors (will not be nil)
local combos = out_unit_table.combination -- table of unit tables (will not be nil)
local abbr = parms.abbr
local abbr_org = parms.abbr_org
local disp = parms.disp
local want_name = (abbr_org == nil and (disp == 'or' or disp == 'slash')) or
not (abbr == 'on' or abbr == inout or abbr == 'mos')
local want_link = (parms.lk == 'on' or parms.lk == inout)
local mid = parms.opt_flip and parms.mid or ''
local sep1 = ' '
local sep2 = ' '
if parms.opt_adjectival and want_name then
sep1 = '-'
sep2 = '-'
end
local do_spell = parms.opt_spell_out
parms.opt_spell_out = nil -- so the call to cvtround does not spell the value
local function make_result(info, isfirst)
local fmt, outvalue, sign
local results = {}
for i = 1, #combos do
local tfrac, thisvalue, strforce
local out_current = combos[i]
out_current.inout = inout
local scale = multiple[i]
if i == 1 then -- least significant unit ('in' from 'ftin')
local decimals
out_current.frac = out_unit_table.frac
local success, outinfo = cvtround(parms, info, in_unit_table, out_current)
if not success then return false, outinfo end
if isfirst then
out_unit_table.valinfo = { outinfo } -- in case output value of first least significant unit is needed
end
sign = outinfo.sign
tfrac = outinfo.fraction_table
if outinfo.is_scientific then
strforce = outinfo.show
decimals = ''
elseif tfrac then
decimals = ''
else
local show = outinfo.show -- number as a string in local language
local p1, p2 = show:find(numdot, 1, true)
decimals = p1 and show:sub(p2 + 1) or '' -- text after numdot, if any
end
fmt = '%.' .. ulen(decimals) .. 'f' -- to reproduce precision
if decimals == '' then
if tfrac then
outvalue = floor(outinfo.raw_absvalue) -- integer part only; fraction added later
else
outvalue = floor(outinfo.raw_absvalue + 0.5) -- keep all integer digits of least significant unit
end
else
outvalue = outinfo.absvalue
end
end
if scale then
outvalue, thisvalue = divide(outvalue, scale)
else
thisvalue = outvalue
end
local id
if want_name then
if varname then
local clean
if strforce or tfrac then
clean = '.1' -- dummy value to force name for floating point
else
clean = format(fmt, thisvalue)
end
id = variable_name(clean, out_current)
else
local key = 'name2'
if parms.opt_adjectival then
key = 'name1'
elseif tfrac then
if thisvalue == 0 then
key = 'name1'
end
elseif parms.opt_singular then
if 0 < thisvalue and thisvalue < 1.0001 then
key = 'name1'
end
else
if thisvalue == 1 then
key = 'name1'
end
end
id = out_current[key]
end
else
id = out_current['symbol']
end
if i == 1 and omit_separator(id) then
-- Testing the id of the least significant unit should be sufficient.
sep1 = ''
sep2 = ''
end
if want_link then
local link = out_current.link
if link then
id = make_link(link, id, out_current)
end
end
local strval
local spell_inout = (i == #combos or outvalue == 0) and inout or '' -- trick so the last value processed (first displayed) has uppercase, if requested
if strforce and outvalue == 0 then
sign = '' -- any sign is in strforce
strval = strforce -- show small values in scientific notation; will only use least significant unit
elseif tfrac then
local wholestr = (thisvalue > 0) and tostring(thisvalue) or nil
strval = format_fraction(parms, spell_inout, false, wholestr, tfrac.numstr, tfrac.denstr, do_spell)
else
strval = (thisvalue == 0) and from_en('0') or with_separator(parms, format(fmt, thisvalue))
if do_spell then
strval = spell_number(parms, spell_inout, strval) or strval
end
end
table.insert(results, strval .. sep1 .. id)
if outvalue == 0 then
break
end
fmt = '%.0f' -- only least significant unit can have a non-integral value
end
local reversed, count = {}, #results
for i = 1, count do
reversed[i] = results[count + 1 - i]
end
return true, sign .. table.concat(reversed, sep2)
end
local valinfo = in_unit_table.valinfo
local success, result = make_result(valinfo[1], true)
if not success then return false, result end
local range = parms.range
if range then
for i = 1, range.n do
local success, result2 = make_result(valinfo[i+1])
if not success then return false, result2 end
result = range_text(range[i], want_name, parms, result, result2, inout)
end
end
return true, result .. mid
end
local function process(parms, in_unit_table, out_unit_table)
-- Return true, s, outunit where s = final wikitext result,
-- or return false, t where t is an error message table.
linked_pages = {}
local success, bad_output
local bad_input_mcode = in_unit_table.bad_mcode -- nil if input unit is a valid convert unit
local out_unit = parms.out_unit
if out_unit == nil or out_unit == '' or type(out_unit) == 'function' then
if bad_input_mcode or parms.opt_input_unit_only then
bad_output = ''
else
local getdef = type(out_unit) == 'function' and out_unit or get_default
success, out_unit = getdef(in_unit_table.valinfo[1].value, in_unit_table)
parms.out_unit = out_unit
if not success then
bad_output = out_unit
end
end
end
if not bad_output and not out_unit_table then
success, out_unit_table = lookup(parms, out_unit, 'any_combination')
if success then
local mismatch = check_mismatch(in_unit_table, out_unit_table)
if mismatch then
bad_output = mismatch
end
else
bad_output = out_unit_table
end
end
local lhs, rhs
local flipped = parms.opt_flip and not bad_input_mcode
if bad_output then
rhs = (bad_output == '') and '' or message(parms, bad_output)
elseif parms.opt_input_unit_only then
rhs = ''
else
local combos -- nil (for 'ft' or 'ftin'), or table of unit tables (for 'm ft')
if not out_unit_table.multiple then -- nil/false ('ft' or 'm ft'), or table of factors ('ftin')
combos = out_unit_table.combination
end
local frac = parms.frac -- nil or denominator of fraction for output values
if frac then
-- Apply fraction to the unit (if only one), or to non-SI units (if a combination),
-- except that if a precision is also specified, the fraction only applies to
-- the hand unit; that allows the following result:
-- {{convert|156|cm|in hand|1|frac=2}} → 156 centimetres (61.4 in; 15.1½ hands)
-- However, the following is handled elsewhere as a special case:
-- {{convert|156|cm|hand in|1|frac=2}} → 156 centimetres (15.1½ hands; 61½ in)
if combos then
local precision = parms.precision
for _, unit in ipairs(combos) do
if unit.builtin == 'hand' or (not precision and not unit.prefixes) then
unit.frac = frac
end
end
else
out_unit_table.frac = frac
end
end
local outputs = {}
local imax = combos and #combos or 1 -- 1 (single unit) or number of unit tables
if imax == 1 then
parms.opt_order_out = nil -- only useful with an output combination
end
if not flipped and not parms.opt_order_out then
-- Process left side first so any duplicate links (from lk=on) are suppressed
-- on right. Example: {{convert|28|e9pc|e9ly|abbr=off|lk=on}}
lhs = process_input(parms, in_unit_table)
end
for i = 1, imax do
local success, item
local out_current = combos and combos[i] or out_unit_table
out_current.inout = 'out'
if i == 1 then
if imax > 1 and out_current.builtin == 'hand' then
out_current.out_next = combos[2] -- built-in hand can influence next unit in a combination
end
if parms.opt_order_out then
out_current.inout = 'in'
end
end
if out_current.multiple then
success, item = make_output_multiple(parms, in_unit_table, out_current)
else
success, item = make_output_single(parms, in_unit_table, out_current)
end
if not success then return false, item end
outputs[i] = item
end
if parms.opt_order_out then
lhs = outputs[1]
table.remove(outputs, 1)
end
local sep = parms.table_joins and parms.table_joins[2] or parms.join_between
rhs = table.concat(outputs, sep)
end
if flipped or not lhs then
local input = process_input(parms, in_unit_table)
if flipped then
lhs = rhs
rhs = input
else
lhs = input
end
end
if parms.join_before then
lhs = parms.join_before .. lhs
end
local wikitext
if bad_input_mcode then
if bad_input_mcode == '' then
wikitext = lhs
else
wikitext = lhs .. message(parms, bad_input_mcode)
end
elseif parms.table_joins then
wikitext = parms.table_joins[1] .. lhs .. parms.table_joins[2] .. rhs
else
wikitext = lhs .. parms.joins[1] .. rhs .. parms.joins[2]
end
if parms.warnings and not bad_input_mcode then
wikitext = wikitext .. parms.warnings
end
return true, get_styles(parms) .. wikitext, out_unit_table
end
local function main_convert(frame)
-- Do convert, and if needed, do it again with higher default precision.
local parms = { frame = frame } -- will hold template arguments, after translation
set_config(frame.args)
local success, result = get_parms(parms, frame:getParent().args)
if success then
if type(result) ~= 'table' then
return tostring(result)
end
local in_unit_table = result
local out_unit_table
for _ = 1, 2 do -- use counter so cannot get stuck repeating convert
success, result, out_unit_table = process(parms, in_unit_table, out_unit_table)
if success and parms.do_convert_again then
parms.do_convert_again = false
else
break
end
end
end
-- If input=x gives a problem, the result should be just the user input
-- (if x is a property like P123 it has been replaced with '').
-- An unknown input unit would display the input and an error message
-- with success == true at this point.
-- Also, can have success == false with a message that outputs an empty string.
if parms.input_text then
if success and not parms.have_problem then
return result
end
local cat
if parms.tracking then
-- Add a tracking category using the given text as the category sort key.
-- There is currently only one type of tracking, but in principle multiple
-- items could be tracked, using different sort keys for convenience.
cat = wanted_category('tracking', parms.tracking)
end
return parms.input_text .. (cat or '')
end
return success and result or message(parms, result)
end
local function _unit(unitcode, options)
-- Helper function for Module:Val to look up a unit.
-- Parameter unitcode must be a string to identify the wanted unit.
-- Parameter options must be nil or a table with optional fields:
-- value = number (for sort key; default value is 1)
-- scaled_top = nil for a normal unit, or a number for a unit which is
-- the denominator of a per unit (for sort key)
-- si = { 'symbol', 'link' }
-- (a table with two strings) to make an SI unit
-- that will be used for the look up
-- link = true if result should be [[linked]]
-- sort = 'on' or 'debug' if result should include a sort key in a
-- span element ('debug' makes the key visible)
-- name = true for the name of the unit instead of the symbol
-- us = true for the US spelling of the unit, if any
-- Return nil if unitcode is not a non-empty string.
-- Otherwise return a table with fields:
-- text = requested symbol or name of unit, optionally linked
-- scaled_value = input value adjusted by unit scale; used for sort key
-- sortspan = span element with sort key like that provided by {{ntsh}},
-- calculated from the result of converting value
-- to a base unit with scale 1.
-- unknown = true if the unitcode was not known
unitcode = strip(unitcode)
if unitcode == nil or unitcode == '' then
return nil
end
set_config({})
linked_pages = {}
options = options or {}
local parms = {
abbr = options.name and 'off' or 'on',
lk = options.link and 'on' or nil,
opt_sp_us = options.us and true or nil,
opt_ignore_error = true, -- do not add pages using this function to 'what links here' for Module:Convert/extra
opt_sortable_on = options.sort == 'on' or options.sort == 'debug',
opt_sortable_debug = options.sort == 'debug',
}
if options.si then
-- Make a dummy table of units (just one unit) for lookup to use.
-- This makes lookup recognize any SI prefix in the unitcode.
local symbol = options.si[1] or '?'
parms.unittable = { [symbol] = {
_name1 = symbol,
_name2 = symbol,
_symbol = symbol,
utype = symbol,
scale = symbol == 'g' and 0.001 or 1,
prefixes = 1,
default = symbol,
link = options.si[2],
}}
end
local success, unit_table = lookup(parms, unitcode, 'no_combination')
if not success then
unit_table = setmetatable({
symbol = unitcode, name2 = unitcode, utype = unitcode,
scale = 1, default = '', defkey = '', linkey = '' }, unit_mt)
end
local value = tonumber(options.value) or 1
local clean = tostring(abs(value))
local info = {
value = value,
altvalue = value,
singular = (clean == '1'),
clean = clean,
show = clean,
}
unit_table.inout = 'in'
unit_table.valinfo = { info }
local sortspan, scaled_value
if options.sort then
sortspan, scaled_value = make_table_or_sort(parms, value, info, unit_table, options.scaled_top)
end
return {
text = make_id(parms, 1, unit_table),
sortspan = sortspan,
scaled_value = scaled_value,
unknown = not success and true or nil,
}
end
return { convert = main_convert, _unit = _unit }
nnv14s0tu6eb1d4au18mahj660mm4ym
モジュール:Convert/data
828
35286
206197
2022-08-04T03:20:48Z
Ef3
694
import from: https://ja.wikipedia.org/w/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Convert/data&oldid=86009561
Scribunto
text/plain
-- Conversion data used by [[Module:Convert]] which uses mw.loadData() for
-- read-only access to this module so that it is loaded only once per page.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
--
-- These data tables follow:
-- all_units all properties for a unit, including default output
-- default_exceptions exceptions for default output ('kg' and 'g' have different defaults)
-- link_exceptions exceptions for links ('kg' and 'g' have different links)
--
-- These tables are generated by a script which reads the wikitext of a page that
-- documents the required properties of each unit; see [[:en:Module:Convert/doc]].
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local all_units = {
["Gy"] = {
_name1 = "グレイ",
_name1_us= "gray",
_symbol = "Gy",
utype = "吸収線量",
scale = 1,
prefixes = 1,
default = "rad",
link = "グレイ (単位)",
},
["rad"] = {
_name1 = "ラド",
_name1_us= "rad",
_symbol = "rad",
utype = "吸収線量",
scale = 0.01,
prefixes = 1,
default = "Gy",
link = "ラド",
},
["cm/s2"] = {
name1 = "センチメートル毎秒毎秒",
name1_us = "centimeter per second squared",
name2_us = "centimeters per second squared",
symbol = "cm/s<sup>2</sup>",
utype = "加速度",
scale = 0.01,
default = "ft/s2",
link = "ガル",
},
["ft/s2"] = {
name1 = "フート毎秒毎秒",
name1_us = "foot per second squared",
name2 = "フィート毎秒毎秒",
name2_us = "feet per second squared",
symbol = "ft/s<sup>2</sup>",
utype = "加速度",
scale = 0.3048,
default = "m/s2",
},
["g0"] = {
name1 = "標準重力加速度",
name1_us = "standard gravity",
name2_us = "standard gravities",
symbol = "''g''<sub>0</sub>",
utype = "加速度",
scale = 9.80665,
default = "m/s2",
link = "標準重力",
},
["g-force"] = {
symbol = "''g''",
utype = "加速度",
scale = 9.80665,
default = "m/s2",
link = "G力",
},
["km/hs"] = {
name1 = "キロメートル毎時毎秒",
name1_us = "kilometer per hour per second",
name2_us = "kilometers per hour per second",
symbol = "km/(h⋅s)",
utype = "加速度",
scale = 0.27777777777777779,
default = "mph/s",
link = "加速度",
},
["km/s2"] = {
name1 = "キロメートル毎秒毎秒",
name1_us = "kilometer per second squared",
name2_us = "kilometers per second squared",
symbol = "km/s<sup>2</sup>",
utype = "加速度",
scale = 1000,
default = "mph/s",
link = "加速度",
},
["m/s2"] = {
name1 = "メートル毎秒毎秒",
name1_us = "meter per second squared",
name2_us = "meters per second squared",
symbol = "m/s<sup>2</sup>",
utype = "加速度",
scale = 1,
default = "ft/s2",
},
["mph/s"] = {
name1 = "マイル毎時毎秒",
name1_us = "mile per hour per second",
name2_us = "miles per hour per second",
symbol = "mph/s",
utype = "加速度",
scale = 0.44704,
default = "km/hs",
link = "加速度",
},
["km/h/s"] = {
target = "km/hs",
},
["standard gravity"] = {
target = "g0",
},
["1000sqft"] = {
name1 = "千平方フィート",
name1_us = "thousand square feet",
symbol = "1000 sq ft",
utype = "面積",
scale = 92.90304,
default = "m2",
link = "平方フィート",
},
["a"] = {
_name1 = "アール",
_name1_us= "are",
_symbol = "a",
utype = "面積",
scale = 100,
prefixes = 1,
default = "sqft",
link = "アール (単位)",
},
["acre"] = {
name1 = "エーカー",
name1_us = "acre",
symbol = "acre",
usename = 1,
utype = "面積",
scale = 4046.8564224,
default = "ha",
subdivs = { ["rood"] = { 4, default = "ha" }, ["sqperch"] = { 160, default = "ha" } },
},
["acre-sing"] = {
target = "acre",
},
["arpent"] = {
name1 = "アルパン",
name1_us = "arpent",
symbol = "arpent",
usename = 1,
utype = "面積",
scale = 3418.89,
default = "ha",
},
["cda"] = {
name1 = "クエルダ",
name1_us = "cuerda",
symbol = "cda",
utype = "面積",
scale = 3930.395625,
default = "ha acre",
},
["daa"] = {
name1 = "デカール",
name1_us = "decare",
symbol = "daa",
utype = "面積",
scale = 1000,
default = "km2 sqmi",
},
["dunam"] = {
name1 = "ドゥナム",
name1_us = "dunam",
symbol = "dunam",
usename = 1,
utype = "面積",
scale = 1000,
default = "km2 sqmi",
},
["dunum"] = {
name1 = "ドゥナム",
name1_us = "dunum",
symbol = "dunum",
usename = 1,
utype = "面積",
scale = 1000,
default = "km2 sqmi",
},
["ha"] = {
name1 = "ヘクタール",
name1_us = "hectare",
symbol = "ha",
utype = "面積",
scale = 10000,
default = "acre",
},
["hectare"] = {
name1 = "ヘクタール",
name1_us = "hectare",
symbol = "ha",
usename = 1,
utype = "面積",
scale = 10000,
default = "acre",
},
["Irish acre"] = {
name1 = "アイリッシュ・エーカー",
name1_us = "Irish acre",
symbol = "Irish acres",
utype = "面積",
scale = 6555.2385024,
default = "ha",
link = "エーカー (アイルランド)",
},
["m2"] = {
_name1 = "平方メートル",
_name1_us= "square meter",
_symbol = "m<sup>2</sup>",
prefix_position= "7,7,8,8",
utype = "面積",
scale = 1,
prefixes = 2,
default = "sqft",
link = "平方メートル",
},
["pondemaat"] = {
name1_us = "pondemaat",
symbol = "pond",
utype = "面積",
scale = 3674.363358816,
default = "m2",
link = ":nl:pondemaat",
},
["pyeong"] = {
name1 = "坪",
name1_us = "pyeong",
symbol = "pyeong",
usename = 1,
utype = "面積",
scale = 3.3057851239669422,
default = "m2",
},
["rai"] = {
name1 = "ライ",
name1_us = "rai",
symbol = "rai",
utype = "面積",
scale = 1600,
default = "m2",
link = "ライ (単位)",
},
["rood"] = {
name1 = "ルード",
name1_us = "rood",
symbol = "rood",
usename = 1,
utype = "面積",
scale = 1011.7141056,
default = "sqft m2",
subdivs = { ["sqperch"] = { 40, default = "m2" } },
link = "ルード (面積の単位)",
},
["sqfoot"] = {
name1 = "平方フート",
name1_us = "square foot",
symbol = "sq ft",
utype = "面積",
scale = 0.09290304,
default = "m2",
link = "平方フィート",
},
["sqft"] = {
name1 = "平方フート",
name1_us = "square foot",
name2 = "平方フィート",
name2_us = "square feet",
symbol = "sq ft",
utype = "面積",
scale = 0.09290304,
default = "m2",
link = "平方フィート",
},
["sqin"] = {
name1 = "平方インチ",
name1_us = "square inch",
name2_us = "square inches",
symbol = "sq in",
utype = "面積",
scale = 0.00064516,
default = "cm2",
},
["sqmi"] = {
name1 = "平方マイル",
name1_us = "square mile",
symbol = "sq mi",
utype = "面積",
scale = 2589988.110336,
default = "km2",
},
["sqnmi"] = {
name1 = "平方海里",
name1_us = "square nautical mile",
symbol = "sq nmi",
utype = "面積",
scale = 3429904,
default = "km2 sqmi",
link = "海里",
},
["sqperch"] = {
name1 = "パーチ",
name1_us = "perch",
name2_us = "perches",
symbol = "perch",
usename = 1,
utype = "面積",
scale = 25.29285264,
default = "m2",
link = "ロッド (単位)",
},
["sqverst"] = {
name1 = "平方ベルスタ",
name1_us = "square verst",
symbol = "square verst",
usename = 1,
utype = "面積",
scale = 1138062.24,
default = "km2 sqmi",
link = "ベルスタ",
},
["sqyd"] = {
name1 = "平方ヤード",
name1_us = "square yard",
symbol = "sq yd",
utype = "面積",
scale = 0.83612736,
default = "m2",
},
["tsubo"] = {
name1 = "坪",
name1_us = "tsubo",
symbol = "tsubo",
usename = 1,
utype = "面積",
scale = 3.3057851239669422,
default = "m2",
},
["acres"] = {
target = "acre",
},
["are"] = {
target = "a",
},
["decare"] = {
target = "daa",
},
["foot2"] = {
target = "sqfoot",
},
["ft2"] = {
target = "sqft",
},
["in2"] = {
target = "sqin",
symbol = "in<sup>2</sup>",
},
["km²"] = {
target = "km2",
},
["mi2"] = {
target = "sqmi",
},
["million acre"] = {
target = "e6acre",
},
["million acres"] = {
target = "e6acre",
},
["million hectares"] = {
target = "e6ha",
},
["m²"] = {
target = "m2",
},
["nmi2"] = {
target = "sqnmi",
},
["pond"] = {
target = "pondemaat",
},
["sq arp"] = {
target = "arpent",
},
["sqkm"] = {
target = "km2",
},
["sqm"] = {
target = "m2",
},
["square verst"] = {
target = "sqverst",
},
["verst2"] = {
target = "sqverst",
},
["yd2"] = {
target = "sqyd",
},
["m2/ha"] = {
name1 = "平方メートル毎ヘクタール",
name1_us = "square meter per hectare",
name2_us = "square meters per hectare",
symbol = "m<sup>2</sup>/ha",
utype = "単位面積当たりの面積",
scale = 0.0001,
default = "sqft/acre",
link = "胸高断面積",
},
["sqft/acre"] = {
name1 = "平方フート毎エーカー",
name1_us = "square foot per acre",
name2 = "平方フィート毎エーカー",
name2_us = "square feet per acre",
symbol = "sq ft/acre",
utype = "単位面積当たりの面積",
scale = 2.295684113865932e-5,
default = "m2/ha",
link = "胸高断面積",
},
["cent"] = {
name1 = "セント",
name1_us = "cent",
symbol = "¢",
utype = "セント",
scale = 1,
default = "cent",
link = "セント (通貨)",
},
["¢"] = {
target = "cent",
},
["A.h"] = {
name1 = "アンペア時",
name1_us = "ampere hour",
symbol = "A⋅h",
utype = "電荷",
scale = 3600,
default = "coulomb",
},
["coulomb"] = {
_name1 = "クーロン",
_name1_us= "coulomb",
_symbol = "C",
utype = "電荷",
scale = 1,
prefixes = 1,
default = "e",
link = "クーロン",
},
["e"] = {
name1 = "電気素量",
name1_us = "elementary charge",
symbol = "''e''",
utype = "電荷",
scale = 1.602176487e-19,
default = "coulomb",
},
["g-mol"] = {
name1 = "グラムモル",
name1_us = "gram-mole",
symbol = "g‑mol",
utype = "物質量",
scale = 1,
default = "lbmol",
link = "モル",
},
["gmol"] = {
name1 = "グラムモル",
name1_us = "gram-mole",
symbol = "gmol",
utype = "物質量",
scale = 1,
default = "lbmol",
link = "モル",
},
["kmol"] = {
name1 = "キロモル",
name1_us = "kilomole",
symbol = "kmol",
utype = "物質量",
scale = 1000,
default = "lbmol",
link = "モル",
},
["lb-mol"] = {
name1 = "ポンドモル",
name1_us = "pound-mole",
symbol = "lb‑mol",
utype = "物質量",
scale = 453.59237,
default = "mol",
link = "モル",
},
["lbmol"] = {
name1 = "ポンドモル",
name1_us = "pound-mole",
symbol = "lbmol",
utype = "物質量",
scale = 453.59237,
default = "mol",
link = "モル",
},
["mol"] = {
name1 = "モル",
name1_us = "mole",
symbol = "mol",
utype = "物質量",
scale = 1,
default = "lbmol",
},
["kgCO2/L"] = {
name1 = "キログラム毎リットル",
name1_us = "kilogram per liter",
name2_us = "kilograms per liter",
symbol = "kg(CO<sub>2</sub>)/L",
utype = "単位体積当たりの二酸化炭素",
scale = 1000,
default = "lbCO2/USgal",
link = "排気ガス",
},
["lbCO2/USgal"] = {
name1 = "ポンド毎米ガロン",
name1_us = "pound per US gallon",
name2_us = "pounds per US gallon",
symbol = "lbCO2/US gal",
utype = "単位体積当たりの二酸化炭素",
scale = 119.82642731689663,
default = "kgCO2/L",
link = "排気ガス",
},
["oz/lb"] = {
per = { "oz", "lb" },
utype = "濃度",
default = "mg/kg",
},
["mg/kg"] = {
per = { "mg", "kg" },
utype = "濃度",
default = "oz/lb",
},
["g/dm3"] = {
name1 = "グラム毎立方デシメートル",
name1_us = "gram per cubic decimeter",
name2_us = "grams per cubic decimeter",
symbol = "g/dm<sup>3</sup>",
utype = "密度",
scale = 1,
default = "kg/m3",
link = "密度",
},
["g/L"] = {
name1 = "グラム毎リットル",
name1_us = "gram per liter",
name2_us = "grams per liter",
symbol = "g/L",
utype = "密度",
scale = 1,
default = "lb/cuin",
link = "密度",
},
["g/mL"] = {
name1 = "グラム毎ミリリットル",
name1_us = "gram per milliliter",
name2_us = "grams per milliliter",
symbol = "g/mL",
utype = "密度",
scale = 1000,
default = "lb/cuin",
link = "密度",
},
["g/ml"] = {
name1 = "グラム毎ミリリットル",
name1_us = "gram per milliliter",
name2_us = "grams per milliliter",
symbol = "g/ml",
utype = "密度",
scale = 1000,
default = "lb/cuin",
link = "密度",
},
["kg/dm3"] = {
name1 = "キログラム毎立方デシメートル",
name1_us = "kilogram per cubic decimeter",
name2_us = "kilograms per cubic decimeter",
symbol = "kg/dm<sup>3</sup>",
utype = "密度",
scale = 1000,
default = "lb/cuft",
link = "密度",
},
["kg/L"] = {
name1 = "キログラム毎リットル",
name1_us = "kilogram per liter",
name2_us = "kilograms per liter",
symbol = "kg/L",
utype = "密度",
scale = 1000,
default = "lb/USgal",
link = "密度",
},
["kg/l"] = {
name1 = "キログラム毎リットル",
name1_us = "kilogram per liter",
name2_us = "kilograms per liter",
symbol = "kg/l",
utype = "密度",
scale = 1000,
default = "lb/USgal",
link = "密度",
},
["kg/m3"] = {
name1 = "キログラム毎立方メートル",
name1_us = "kilogram per cubic meter",
name2_us = "kilograms per cubic meter",
symbol = "kg/m<sup>3</sup>",
utype = "密度",
scale = 1,
default = "lb/cuyd",
link = "密度",
},
["lb/cuft"] = {
name1 = "ポンド毎立方フート",
name1_us = "pound per cubic foot",
name2_us = "pounds per cubic foot",
symbol = "lb/cu ft",
utype = "密度",
scale = 16.018463373960142,
default = "g/cm3",
link = "密度",
},
["lb/cuin"] = {
name1 = "ポンド毎立方インチ",
name1_us = "pound per cubic inch",
name2_us = "pounds per cubic inch",
symbol = "lb/cu in",
utype = "密度",
scale = 27679.904710203122,
default = "g/cm3",
link = "密度",
},
["lb/cuyd"] = {
name1 = "ポンド毎立方ヤード",
name1_us = "pound per cubic yard",
name2_us = "pounds per cubic yard",
symbol = "lb/cu yd",
utype = "密度",
scale = 0.5932764212577829,
default = "kg/m3",
link = "密度",
},
["lb/impgal"] = {
name1 = "ポンド毎英ガロン",
name1_us = "pound per imperial gallon",
name2_us = "pounds per imperial gallon",
symbol = "lb/imp gal",
utype = "密度",
scale = 99.776372663101697,
default = "kg/L",
link = "密度",
},
["lb/in3"] = {
name1 = "ポンド毎立方インチ",
name1_us = "pound per cubic inch",
name2_us = "pounds per cubic inch",
symbol = "lb/cu in",
utype = "密度",
scale = 27679.904710203122,
default = "g/cm3",
link = "密度",
},
["lb/U.S.gal"] = {
name1 = "ポンド毎米ガロン",
name1_us = "pound per U.S. gallon",
name2_us = "pounds per U.S. gallon",
symbol = "lb/U.S. gal",
utype = "密度",
scale = 119.82642731689663,
default = "kg/L",
link = "密度",
},
["lb/USbu"] = {
name1 = "ポンド毎米ブッシェル",
name1_us = "pound per US bushel",
name2_us = "pounds per US bushel",
symbol = "lb/US bu",
utype = "密度",
scale = 12.871859780974471,
default = "kg/m3",
link = "ブッシェル",
},
["lb/USgal"] = {
name1 = "ポンド毎米ガロン",
name1_us = "pound per US gallon",
name2_us = "pounds per US gallon",
symbol = "lb/US gal",
utype = "密度",
scale = 119.82642731689663,
default = "kg/L",
link = "密度",
},
["lbm/cuin"] = {
name1 = "ポンド質量毎立方インチ",
name1_us = "pound mass per cubic inch",
name2_us = "pounds mass per cubic inch",
symbol = "lbm/cu in",
utype = "密度",
scale = 27679.904710203122,
default = "g/cm3",
link = "密度",
},
["mg/L"] = {
name1 = "ミリグラム毎リットル",
name1_us = "milligram per liter",
name2_us = "milligrams per liter",
symbol = "mg/L",
utype = "密度",
scale = 0.001,
default = "lb/cuin",
link = "密度",
},
["oz/cuin"] = {
name1 = "オンス毎立方インチ",
name1_us = "ounce per cubic inch",
name2_us = "ounces per cubic inch",
symbol = "oz/cu in",
utype = "密度",
scale = 1729.9940443876951,
default = "g/cm3",
link = "密度",
},
["g/cm3"] = {
per = { "g", "cm3" },
utype = "密度",
default = "lb/cuin",
},
["g/m3"] = {
per = { "g", "m3" },
utype = "密度",
default = "lb/cuyd",
link = "密度",
},
["Mg/m3"] = {
per = { "Mg", "m3" },
utype = "密度",
default = "lb/cuft",
},
["mg/l"] = {
per = { "mg", "l" },
utype = "密度",
default = "oz/cuin",
},
["μg/dL"] = {
per = { "μg", "dL" },
utype = "密度",
default = "lb/cuin",
},
["μg/l"] = {
per = { "μg", "l" },
utype = "密度",
default = "oz/cuin",
},
["lb/ft3"] = {
target = "lb/cuft",
},
["lb/yd3"] = {
target = "lb/cuyd",
},
["lbm/in3"] = {
target = "lbm/cuin",
},
["mcg/dL"] = {
target = "μg/dL",
},
["oz/in3"] = {
target = "oz/cuin",
},
["ug/dL"] = {
target = "μg/dL",
},
["ug/l"] = {
target = "μg/l",
},
["B.O.T.U."] = {
name1_us = "Board of Trade Unit",
symbol = "B.O.T.U.",
utype = "エネルギー",
scale = 3600000,
default = "MJ",
link = "キロワット時",
},
["bboe"] = {
name1 = "石油換算バレル",
name1_us = "barrel of oil equivalent",
name2_us = "barrels of oil equivalent",
symbol = "bboe",
utype = "エネルギー",
scale = 6117863200,
default = "GJ",
},
["BOE"] = {
name1 = "石油換算バレル",
name1_us = "barrel of oil equivalent",
name2_us = "barrels of oil equivalent",
symbol = "BOE",
utype = "エネルギー",
scale = 6117863200,
default = "GJ",
},
["BTU"] = {
name1 = "英熱量",
name1_us = "British thermal unit",
symbol = "BTU",
utype = "エネルギー",
scale = 1055.05585262,
default = "kJ",
},
["Btu"] = {
name1 = "英熱量",
name1_us = "British thermal unit",
symbol = "Btu",
utype = "エネルギー",
scale = 1055.05585262,
default = "kJ",
},
["BTU-39F"] = {
name1 = "英熱量(39°F)",
name1_us = "British thermal unit (39°F)",
name2_us = "British thermal units (39°F)",
symbol = "BTU<sub>39°F</sub>",
utype = "エネルギー",
scale = 1059.67,
default = "kJ",
link = "英熱量",
},
["Btu-39F"] = {
name1 = "英熱量(39°F)",
name1_us = "British thermal unit (39°F)",
name2_us = "British thermal units (39°F)",
symbol = "Btu<sub>39°F</sub>",
utype = "エネルギー",
scale = 1059.67,
default = "kJ",
link = "英熱量",
},
["BTU-59F"] = {
name1 = "英熱量(59°F)",
name1_us = "British thermal unit (59°F)",
name2_us = "British thermal units (59°F)",
symbol = "BTU<sub>59°F</sub>",
utype = "エネルギー",
scale = 1054.804,
default = "kJ",
link = "英熱量",
},
["Btu-59F"] = {
name1 = "英熱量(59°F)",
name1_us = "British thermal unit (59°F)",
name2_us = "British thermal units (59°F)",
symbol = "Btu<sub>59°F</sub>",
utype = "エネルギー",
scale = 1054.804,
default = "kJ",
link = "英熱量",
},
["BTU-60F"] = {
name1 = "英熱量(60°F)",
name1_us = "British thermal unit (60°F)",
name2_us = "British thermal units (60°F)",
symbol = "BTU<sub>60°F</sub>",
utype = "エネルギー",
scale = 1054.68,
default = "kJ",
link = "英熱量",
},
["Btu-60F"] = {
name1 = "英熱量(60°F)",
name1_us = "British thermal unit (60°F)",
name2_us = "British thermal units (60°F)",
symbol = "Btu<sub>60°F</sub>",
utype = "エネルギー",
scale = 1054.68,
default = "kJ",
link = "英熱量",
},
["BTU-63F"] = {
name1 = "英熱量(63°F)",
name1_us = "British thermal unit (63°F)",
name2_us = "British thermal units (63°F)",
symbol = "BTU<sub>63°F</sub>",
utype = "エネルギー",
scale = 1054.6,
default = "kJ",
link = "英熱量",
},
["Btu-63F"] = {
name1 = "英熱量(63°F)",
name1_us = "British thermal unit (63°F)",
name2_us = "British thermal units (63°F)",
symbol = "Btu<sub>63°F</sub>",
utype = "エネルギー",
scale = 1054.6,
default = "kJ",
link = "英熱量",
},
["BTU-ISO"] = {
name1 = "英熱量(ISO)",
name1_us = "British thermal unit (ISO)",
name2_us = "British thermal units (ISO)",
symbol = "BTU<sub>ISO</sub>",
utype = "エネルギー",
scale = 1055.056,
default = "kJ",
link = "英熱量",
},
["Btu-ISO"] = {
target = "BTU-ISO",
},
["BTU-IT"] = {
name1 = "英熱量(IT)",
name1_us = "British thermal unit (IT)",
name2_us = "British thermal units (IT)",
symbol = "BTU<sub>IT</sub>",
utype = "エネルギー",
scale = 1055.05585262,
default = "kJ",
link = "英熱量",
},
["Btu-IT"] = {
name1 = "英熱量(IT)",
name1_us = "British thermal unit (IT)",
name2_us = "British thermal units (IT)",
symbol = "Btu<sub>IT</sub>",
utype = "エネルギー",
scale = 1055.05585262,
default = "kJ",
link = "英熱量",
},
["BTU-mean"] = {
name1 = "英熱量(平均)",
name1_us = "British thermal unit (mean)",
name2_us = "British thermal units (mean)",
symbol = "BTU<sub>mean</sub>",
utype = "エネルギー",
scale = 1055.87,
default = "kJ",
link = "英熱量",
},
["Btu-mean"] = {
name1 = "英熱量(平均)",
name1_us = "British thermal unit (mean)",
name2_us = "British thermal units (mean)",
symbol = "Btu<sub>mean</sub>",
utype = "エネルギー",
scale = 1055.87,
default = "kJ",
link = "英熱量",
},
["BTU-th"] = {
name1 = "英熱量(熱化学)",
name1_us = "British thermal unit (thermochemical)",
name2_us = "British thermal units (thermochemical)",
symbol = "BTU<sub>th</sub>",
utype = "エネルギー",
scale = 1054.35026444,
default = "kJ",
link = "英熱量",
},
["Btu-th"] = {
name1 = "英熱量(熱化学)",
name1_us = "British thermal unit (thermochemical)",
name2_us = "British thermal units (thermochemical)",
symbol = "Btu<sub>th</sub>",
utype = "エネルギー",
scale = 1054.35026444,
default = "kJ",
link = "英熱量",
},
["Cal"] = {
name1 = "カロリー",
name1_us = "calorie",
symbol = "Cal",
utype = "エネルギー",
scale = 4184,
default = "kJ",
},
["cal"] = {
name1 = "カロリー",
name1_us = "calorie",
symbol = "cal",
utype = "エネルギー",
scale = 4.184,
default = "J",
},
["Cal-15"] = {
name1 = "カロリー(15°C)",
name1_us = "Calorie (15°C)",
name2_us = "Calories (15°C)",
symbol = "Cal<sub>15</sub>",
utype = "エネルギー",
scale = 4185.8,
default = "kJ",
link = "カロリー",
},
["cal-15"] = {
name1 = "カロリー(15°C)",
name1_us = "calorie (15°C)",
name2_us = "calories (15°C)",
symbol = "cal<sub>15</sub>",
utype = "エネルギー",
scale = 4.1858,
default = "J",
link = "カロリー",
},
["Cal-IT"] = {
name1 = "カロリー(国際蒸気表)",
name1_us = "Calorie (International Steam Table)",
name2_us = "Calories (International Steam Table)",
symbol = "Cal<sub>IT</sub>",
utype = "エネルギー",
scale = 4186.8,
default = "kJ",
link = "カロリー",
},
["cal-IT"] = {
name1 = "カロリー(国際蒸気表)",
name1_us = "calorie (International Steam Table)",
name2_us = "calories (International Steam Table)",
symbol = "cal<sub>IT</sub>",
utype = "エネルギー",
scale = 4.1868,
default = "J",
link = "カロリー",
},
["Cal-th"] = {
name1 = "カロリー(熱化学)",
name1_us = "Calorie (thermochemical)",
name2_us = "Calories (thermochemical)",
symbol = "Cal<sub>th</sub>",
utype = "エネルギー",
scale = 4184,
default = "kJ",
link = "カロリー",
},
["cal-th"] = {
name1 = "カロリー(熱化学)",
name1_us = "calorie (thermochemical)",
name2_us = "calories (thermochemical)",
symbol = "cal<sub>th</sub>",
utype = "エネルギー",
scale = 4.184,
default = "J",
link = "カロリー",
},
["CHU-IT"] = {
name1 = "摂氏熱単位(IT)",
name1_us = "Celsius heat unit (International Table)",
name2_us = "Celsius heat units (International Table)",
symbol = "CHU<sub>IT</sub>",
utype = "エネルギー",
scale = 1899.100534716,
default = "kJ",
link = "単位の換算一覧#エネルギー・仕事・熱量",
},
["cufootnaturalgas"] = {
name1 = "立方フート天然ガス",
name1_us = "cubic foot of natural gas",
name2 = "立方フィート天然ガス",
symbol = "cuftnaturalgas",
usename = 1,
utype = "エネルギー",
scale = 1055055.85262,
default = "MJ",
link = "単位の換算一覧#エネルギー・仕事・熱量",
},
["cuftnaturalgas"] = {
name1 = "立方フート天然ガス",
name1_us = "cubic foot of natural gas",
name2 = "立方フィート天然ガス",
name2_us = "cubic feet of natural gas",
symbol = "cuftnaturalgas",
usename = 1,
utype = "エネルギー",
scale = 1055055.85262,
default = "MJ",
link = "単位の換算一覧#エネルギー・仕事・熱量",
},
["Eh"] = {
name1 = "ハートリー",
name1_us = "Hartree",
symbol = "''E''<sub>h</sub>",
utype = "エネルギー",
scale = 4.35974417e-18,
default = "eV",
},
["erg"] = {
name1 = "エルグ",
name1_us = "erg",
symbol = "erg",
utype = "エネルギー",
scale = 0.0000001,
default = "μJ",
},
["eV"] = {
name1 = "電子ボルト",
name1_us = "electronvolt",
symbol = "eV",
utype = "エネルギー",
scale = 1.602176487e-19,
default = "aJ",
},
["feV"] = {
name1 = "フェムト電子ボルト",
name1_us = "femtoelectronvolt",
symbol = "feV",
utype = "エネルギー",
scale = 1.602176487e-34,
default = "yJ",
link = "電子ボルト",
},
["foe"] = {
name1 = "フォエ",
name1_us = "foe",
symbol = "foe",
utype = "エネルギー",
scale = 1e44,
default = "YJ",
link = "フォエ (単位)",
},
["ftlb"] = {
name1 = "フィート・ポンド",
name1_us = "foot-pound",
symbol = "ft⋅lb",
utype = "エネルギー",
alttype = "トルク",
scale = 1.3558179483314004,
default = "J",
link = "フィート重量ポンド",
},
["ftlb-f"] = {
name1 = "フィート重量ポンド",
name1_us = "foot-pound force",
name2_us = "foot-pounds force",
symbol = "ft⋅lb<sub>f</sub>",
utype = "エネルギー",
alttype = "トルク",
scale = 1.3558179483314004,
default = "J",
},
["ftlbf"] = {
name1 = "フィート重量ポンド",
name1_us = "foot-pound force",
name2_us = "foot-pounds force",
symbol = "ft⋅lbf",
utype = "エネルギー",
alttype = "トルク",
scale = 1.3558179483314004,
default = "J",
},
["ftpdl"] = {
name1 = "フィート・パウンダル",
name1_us = "foot-poundal",
symbol = "ft⋅pdl",
utype = "エネルギー",
scale = 0.0421401100938048,
default = "J",
},
["GeV"] = {
name1 = "ギガ電子ボルト",
name1_us = "gigaelectronvolt",
symbol = "GeV",
utype = "エネルギー",
scale = 1.602176487e-10,
default = "nJ",
link = "電子ボルト",
},
["gTNT"] = {
name1 = "TNT換算グラム",
name1_us = "gram of TNT",
name2_us = "grams of TNT",
symbol = "gram of TNT",
usename = 1,
utype = "エネルギー",
scale = 4184,
default = "kJ",
link = "TNT換算",
},
["Gtoe"] = {
name1 = "石油換算ギガトン",
name1_us = "gigatonne of oil equivalent",
name2_us = "gigatonnes of oil equivalent",
symbol = "Gtoe",
utype = "エネルギー",
scale = 4.1868e19,
default = "EJ",
link = "石油換算トン",
},
["GtonTNT"] = {
name1 = "TNT換算ギガトン",
name1_us = "gigaton of TNT",
name2_us = "gigatons of TNT",
symbol = "gigaton of TNT",
usename = 1,
utype = "エネルギー",
scale = 4.184e18,
default = "EJ",
link = "TNT換算",
},
["GtTNT"] = {
name1 = "TNT換算ギガトン",
name1_us = "gigatonne of TNT",
name2_us = "gigatonnes of TNT",
symbol = "gigatonne of TNT",
usename = 1,
utype = "エネルギー",
scale = 4.184e18,
default = "EJ",
link = "TNT換算",
},
["GW.h"] = {
name1 = "ギガワット時",
name1_us = "gigawatt-hour",
symbol = "GW⋅h",
utype = "エネルギー",
scale = 3.6e12,
default = "TJ",
link = "キロワット時",
},
["GWh"] = {
name1 = "ギガワット時",
name1_us = "gigawatt-hour",
symbol = "GWh",
utype = "エネルギー",
scale = 3.6e12,
default = "TJ",
link = "キロワット時",
},
["hph"] = {
name1 = "馬力時",
name1_us = "horsepower-hour",
symbol = "hp⋅h",
utype = "エネルギー",
scale = 2684519.537696172792,
default = "kWh",
},
["inlb"] = {
name1 = "インチ・ポンド",
name1_us = "inch-pound",
symbol = "in⋅lb",
utype = "エネルギー",
alttype = "トルク",
scale = 0.1129848290276167,
default = "mJ",
link = "フィート重量ポンド",
},
["inlb-f"] = {
name1 = "インチ重量ポンド",
name1_us = "inch-pound force",
name2_us = "inch-pounds force",
symbol = "in⋅lb<sub>f</sub>",
utype = "エネルギー",
alttype = "トルク",
scale = 0.1129848290276167,
default = "mJ",
link = "フィート重量ポンド",
},
["inlbf"] = {
name1 = "インチ重量ポンド",
name1_us = "inch-pound force",
name2_us = "inch-pounds force",
symbol = "in⋅lbf",
utype = "エネルギー",
alttype = "トルク",
scale = 0.1129848290276167,
default = "mJ",
link = "フィート重量ポンド",
},
["inoz-f"] = {
name1 = "インチ重量オンス",
name1_us = "inch-ounce force",
name2_us = "inch-ounces force",
symbol = "in⋅oz<sub>f</sub>",
utype = "エネルギー",
alttype = "トルク",
scale = 0.00706155181422604375,
default = "mJ",
link = "フィート重量ポンド",
},
["inozf"] = {
name1 = "インチ重量オンス",
name1_us = "inch-ounce force",
name2_us = "inch-ounces force",
symbol = "in⋅ozf",
utype = "エネルギー",
alttype = "トルク",
scale = 0.00706155181422604375,
default = "mJ",
link = "フィート重量ポンド",
},
["J"] = {
_name1 = "ジュール",
_name1_us= "joule",
_symbol = "J",
utype = "エネルギー",
scale = 1,
prefixes = 1,
default = "cal",
link = "ジュール",
},
["kBOE"] = {
name1 = "石油換算キロバレル",
name1_us = "kilo barrel of oil equivalent",
name2_us = "kilo barrels of oil equivalent",
symbol = "kBOE",
utype = "エネルギー",
scale = 6.1178632e12,
default = "TJ",
link = "石油換算バレル",
},
["kcal"] = {
name1 = "キロカロリー",
name1_us = "kilocalorie",
symbol = "kcal",
utype = "エネルギー",
scale = 4184,
default = "kJ",
link = "カロリー",
},
["kcal-15"] = {
name1 = "キロカロリー(15°C)",
name1_us = "kilocalorie (15°C)",
name2_us = "kilocalories (15°C)",
symbol = "kcal<sub>15</sub>",
utype = "エネルギー",
scale = 4185.8,
default = "kJ",
link = "カロリー",
},
["kcal-IT"] = {
name1 = "キロカロリー(国際蒸気表)",
name1_us = "kilocalorie (International Steam Table)",
name2_us = "kilocalories (International Steam Table)",
symbol = "kcal<sub>IT</sub>",
utype = "エネルギー",
scale = 4186.8,
default = "kJ",
link = "カロリー",
},
["kcal-th"] = {
name1 = "キロカロリー(熱化学)",
name1_us = "kilocalorie (thermochemical)",
name2_us = "kilocalories (thermochemical)",
symbol = "kcal<sub>th</sub>",
utype = "エネルギー",
scale = 4184,
default = "kJ",
link = "カロリー",
},
["kerg"] = {
name1 = "キロエルグ",
name1_us = "kiloerg",
symbol = "kerg",
utype = "エネルギー",
scale = 0.0001,
default = "mJ",
link = "エルグ",
},
["keV"] = {
name1 = "キロ電子ボルト",
name1_us = "kiloelectronvolt",
symbol = "keV",
utype = "エネルギー",
scale = 1.602176487e-16,
default = "fJ",
link = "電子ボルト",
},
["kgTNT"] = {
name1 = "TNT換算キログラム",
name1_us = "kilogram of TNT",
name2_us = "kilograms of TNT",
symbol = "kilogram of TNT",
usename = 1,
utype = "エネルギー",
scale = 4184000,
default = "MJ",
link = "TNT換算",
},
["kt(TNT)"] = {
name1 = "キロトン",
name1_us = "kiloton",
symbol = "kt",
utype = "エネルギー",
scale = 4.184e12,
default = "TJ",
link = "TNT換算",
},
["ktoe"] = {
name1 = "石油換算キロトン",
name1_us = "kilotonne of oil equivalent",
name2_us = "kilotonnes of oil equivalent",
symbol = "ktoe",
utype = "エネルギー",
scale = 4.1868e13,
default = "TJ",
link = "石油換算トン",
},
["ktonTNT"] = {
name1 = "TNT換算キロトン",
name1_us = "kiloton of TNT",
name2_us = "kilotons of TNT",
symbol = "kt",
utype = "エネルギー",
scale = 4.184e12,
default = "TJ",
link = "TNT換算",
},
["ktTNT"] = {
name1 = "TNT換算キロトン",
name1_us = "kilotonne of TNT",
name2_us = "kilotonnes of TNT",
symbol = "kilotonne of TNT",
usename = 1,
utype = "エネルギー",
scale = 4.184e12,
default = "TJ",
link = "TNT換算",
},
["kW.h"] = {
name1 = "キロワット時",
name1_us = "kilowatt-hour",
symbol = "kW⋅h",
utype = "エネルギー",
scale = 3600000,
default = "MJ",
},
["kWh"] = {
name1 = "キロワット時",
name1_us = "kilowatt-hour",
symbol = "kWh",
utype = "エネルギー",
scale = 3600000,
default = "MJ",
},
["Mcal"] = {
name1 = "メガカロリー",
name1_us = "megacalorie",
symbol = "Mcal",
utype = "エネルギー",
scale = 4184000,
default = "MJ",
link = "カロリー",
},
["mcal"] = {
name1 = "ミリカロリー",
name1_us = "millicalorie",
symbol = "mcal",
utype = "エネルギー",
scale = 0.004184,
default = "mJ",
link = "カロリー",
},
["Mcal-15"] = {
name1 = "メガカロリー(15°C)",
name1_us = "megacalorie (15°C)",
name2_us = "megacalories (15°C)",
symbol = "Mcal<sub>15</sub>",
utype = "エネルギー",
scale = 4185800,
default = "MJ",
link = "カロリー",
},
["mcal-15"] = {
name1 = "ミリカロリー(15°C)",
name1_us = "millicalorie (15°C)",
name2_us = "millicalories (15°C)",
symbol = "mcal<sub>15</sub>",
utype = "エネルギー",
scale = 0.0041858,
default = "mJ",
link = "カロリー",
},
["Mcal-IT"] = {
name1 = "メガカロリー(国際蒸気表)",
name1_us = "megacalorie (International Steam Table)",
name2_us = "megacalories (International Steam Table)",
symbol = "Mcal<sub>IT</sub>",
utype = "エネルギー",
scale = 4186800,
default = "MJ",
link = "カロリー",
},
["mcal-IT"] = {
name1 = "ミリカロリー(国際蒸気表)",
name1_us = "millicalorie (International Steam Table)",
name2_us = "millicalories (International Steam Table)",
symbol = "mcal<sub>IT</sub>",
utype = "エネルギー",
scale = 0.0041868,
default = "mJ",
link = "カロリー",
},
["Mcal-th"] = {
name1 = "メガカロリー(熱化学)",
name1_us = "megacalorie (thermochemical)",
name2_us = "megacalories (thermochemical)",
symbol = "Mcal<sub>th</sub>",
utype = "エネルギー",
scale = 4184000,
default = "MJ",
link = "カロリー",
},
["mcal-th"] = {
name1 = "ミリカロリー(熱化学)",
name1_us = "millicalorie (thermochemical)",
name2_us = "millicalories (thermochemical)",
symbol = "mcal<sub>th</sub>",
utype = "エネルギー",
scale = 0.004184,
default = "mJ",
link = "カロリー",
},
["Merg"] = {
name1 = "メガエルグ",
name1_us = "megaerg",
symbol = "Merg",
utype = "エネルギー",
scale = 0.1,
default = "J",
link = "エルグ",
},
["merg"] = {
name1 = "ミリエルグ",
name1_us = "millierg",
symbol = "merg",
utype = "エネルギー",
scale = 0.0000000001,
default = "μJ",
link = "エルグ",
},
["MeV"] = {
name1 = "メガ電子ボルト",
name1_us = "megaelectronvolt",
symbol = "MeV",
utype = "エネルギー",
scale = 1.602176487e-13,
default = "pJ",
link = "電子ボルト",
},
["meV"] = {
name1 = "ミリ電子ボルト",
name1_us = "millielectronvolt",
symbol = "meV",
utype = "エネルギー",
scale = 1.602176487e-22,
default = "zJ",
link = "電子ボルト",
},
["MMBtu"] = {
name1 = "百万英熱量",
name1_us = "million British thermal units",
symbol = "MMBtu",
utype = "エネルギー",
scale = 1055055852.62,
default = "GJ",
link = "英熱量",
},
["Mt(TNT)"] = {
name1 = "メガトン",
name1_us = "megaton",
symbol = "Mt",
utype = "エネルギー",
scale = 4.184e15,
default = "PJ",
link = "TNT換算",
},
["Mtoe"] = {
name1 = "石油換算メガトン",
name1_us = "megatonne of oil equivalent",
name2_us = "megatonnes of oil equivalent",
symbol = "Mtoe",
utype = "エネルギー",
scale = 4.1868e16,
default = "PJ",
link = "石油換算トン",
},
["MtonTNT"] = {
name1 = "TNT換算メガトン",
name1_us = "megaton of TNT",
name2_us = "megatons of TNT",
symbol = "Mt",
utype = "エネルギー",
scale = 4.184e15,
default = "PJ",
link = "TNT換算",
},
["mtonTNT"] = {
name1 = "TNT換算ミリトン",
name1_us = "milliton of TNT",
name2_us = "millitons of TNT",
symbol = "milliton of TNT",
usename = 1,
utype = "エネルギー",
scale = 4184000,
default = "MJ",
link = "TNT換算",
},
["MtTNT"] = {
name1 = "TNT換算メガトン",
name1_us = "megatonne of TNT",
name2_us = "megatonnes of TNT",
symbol = "megatonne of TNT",
usename = 1,
utype = "エネルギー",
scale = 4.184e15,
default = "PJ",
link = "TNT換算",
},
["mtTNT"] = {
name1 = "TNT換算ミリトン",
name1_us = "millitonne of TNT",
name2_us = "millitonnes of TNT",
symbol = "millitonne of TNT",
usename = 1,
utype = "エネルギー",
scale = 4184000,
default = "MJ",
link = "TNT換算",
},
["MW.h"] = {
name1 = "メガワット時",
name1_us = "megawatt-hour",
symbol = "MW⋅h",
utype = "エネルギー",
scale = 3600000000,
default = "GJ",
link = "キロワット時",
},
["mW.h"] = {
name1 = "ミリワット時",
name1_us = "milliwatt-hour",
symbol = "mW⋅h",
utype = "エネルギー",
scale = 3.6,
default = "J",
link = "キロワット時",
},
["MWh"] = {
name1 = "メガワット時",
name1_us = "megawatt-hour",
symbol = "MWh",
utype = "エネルギー",
scale = 3600000000,
default = "GJ",
link = "キロワット時",
},
["mWh"] = {
name1 = "ミリワット時",
name1_us = "milliwatt-hour",
symbol = "mWh",
utype = "エネルギー",
scale = 3.6,
default = "J",
link = "キロワット時",
},
["neV"] = {
name1 = "ナノ電子ボルト",
name1_us = "nanoelectronvolt",
symbol = "neV",
utype = "エネルギー",
scale = 1.602176487e-28,
default = "yJ",
link = "電子ボルト",
},
["PeV"] = {
name1 = "ペタ電子ボルト",
name1_us = "petaelectronvolt",
symbol = "PeV",
utype = "エネルギー",
scale = 0.0001602176487,
default = "mJ",
link = "電子ボルト",
},
["peV"] = {
name1 = "ピコ電子ボルト",
name1_us = "picoelectronvolt",
symbol = "peV",
utype = "エネルギー",
scale = 1.602176487e-31,
default = "yJ",
link = "電子ボルト",
},
["PSh"] = {
name1_us = "Pferdestärkenstunde",
symbol = "PSh",
utype = "エネルギー",
scale = 2647795.5,
default = "kWh",
link = "馬力時",
},
["quad"] = {
name1 = "クァドリリオン英熱量",
name1_us = "quadrillion British thermal units",
symbol = "quad",
utype = "エネルギー",
scale = 1.054804e18,
default = "EJ",
link = "クアッド (単位)",
},
["Ry"] = {
name1 = "リュードベリ",
name1_us = "rydberg",
symbol = "Ry",
utype = "エネルギー",
scale = 2.1798741e-18,
default = "eV",
link = "リュードベリ定数",
},
["scf"] = {
name1 = "標準立方フート",
name1_us = "standard cubic foot",
name2 = "標準立方フィート",
name2_us = "standard cubic feet",
symbol = "scf",
utype = "エネルギー",
scale = 2869.2044809344,
default = "kJ",
link = "標準立方フィート",
},
["scfoot"] = {
name1 = "標準立方フート",
name1_us = "standard cubic foot",
symbol = "scf",
utype = "エネルギー",
scale = 2869.2044809344,
default = "kJ",
link = "標準立方フィート",
},
["t(TNT)"] = {
name1 = "トン",
name1_us = "ton",
symbol = "t",
utype = "エネルギー",
scale = 4184000000,
default = "GJ",
link = "TNT換算",
},
["TeV"] = {
name1 = "テラ電子ボルト",
name1_us = "teraelectronvolt",
symbol = "TeV",
utype = "エネルギー",
scale = 1.602176487e-7,
default = "μJ",
link = "電子ボルト",
},
["th"] = {
name1 = "サーミー",
name1_us = "thermie",
symbol = "th",
utype = "エネルギー",
scale = 4186800,
default = "MJ",
link = "単位の換算一覧#エネルギー・仕事・熱量",
},
["thm-EC"] = {
name1 = "サーム(EC)",
name1_us = "therm (EC)",
name2_us = "therms (EC)",
symbol = "thm (EC)",
utype = "エネルギー",
scale = 105506000,
default = "MJ",
link = "サーム (単位)",
},
["thm-UK"] = {
name1 = "サーム(英)",
name1_us = "therm (UK)",
name2_us = "therms (UK)",
symbol = "thm (UK)",
utype = "エネルギー",
scale = 105505585.257348,
default = "MJ",
link = "サーム (単位)",
},
["thm-US"] = {
name1 = "サーム(米)",
name1_us = "therm (U.S.)",
name2 = "サーム(ベイ)",
name2_us = "therms (U.S.)",
symbol = "thm (US)",
sym_us = "thm (U.S.)",
utype = "エネルギー",
scale = 105480400,
default = "MJ",
link = "サーム (単位)",
},
["toe"] = {
name1 = "石油換算トン",
name1_us = "tonne of oil equivalent",
name2_us = "tonnes of oil equivalent",
symbol = "toe",
utype = "エネルギー",
scale = 41868000000,
default = "GJ",
},
["tonTNT"] = {
name1 = "TNT換算トン",
name1_us = "ton of TNT",
name2_us = "tons of TNT",
symbol = "ton of TNT",
usename = 1,
utype = "エネルギー",
scale = 4184000000,
default = "GJ",
link = "TNT換算",
},
["tTNT"] = {
name1 = "TNT換算トン",
name1_us = "tonne of TNT",
name2_us = "tonnes of TNT",
symbol = "tonne of TNT",
usename = 1,
utype = "エネルギー",
scale = 4184000000,
default = "GJ",
link = "TNT換算",
},
["TtonTNT"] = {
name1 = "TNT換算テラトン",
name1_us = "teraton of TNT",
name2_us = "teratons of TNT",
symbol = "teraton of TNT",
usename = 1,
utype = "エネルギー",
scale = 4.184e21,
default = "ZJ",
link = "TNT換算",
},
["TtTNT"] = {
name1 = "TNT換算テラトン",
name1_us = "teratonne of TNT",
name2_us = "teratonnes of TNT",
symbol = "teratonne of TNT",
usename = 1,
utype = "エネルギー",
scale = 4.184e21,
default = "ZJ",
link = "TNT換算",
},
["TW.h"] = {
name1 = "テラワット時",
name1_us = "terawatt-hour",
symbol = "TW⋅h",
utype = "エネルギー",
scale = 3.6e15,
default = "PJ",
link = "キロワット時",
},
["TWh"] = {
name1 = "テラワット時",
name1_us = "terawatt-hour",
symbol = "TWh",
utype = "エネルギー",
scale = 3.6e15,
default = "PJ",
link = "キロワット時",
},
["W.h"] = {
name1 = "ワット時",
name1_us = "watt-hour",
symbol = "W⋅h",
utype = "エネルギー",
scale = 3600,
default = "kJ",
link = "キロワット時",
},
["Wh"] = {
name1 = "ワット時",
name1_us = "watt-hour",
symbol = "Wh",
utype = "エネルギー",
scale = 3600,
default = "kJ",
link = "キロワット時",
},
["μerg"] = {
name1 = "マイクロエルグ",
name1_us = "microerg",
symbol = "μerg",
utype = "エネルギー",
scale = 1e-13,
default = "nJ",
link = "エルグ",
},
["μeV"] = {
name1 = "マイクロ電子ボルト",
name1_us = "microelectronvolt",
symbol = "μeV",
utype = "エネルギー",
scale = 1.602176487e-25,
default = "yJ",
link = "電子ボルト",
},
["μW.h"] = {
name1 = "マイクロワット時",
name1_us = "microwatt-hour",
symbol = "μW⋅h",
utype = "エネルギー",
scale = 0.0036,
default = "mJ",
link = "キロワット時",
},
["μWh"] = {
name1 = "マイクロワット時",
name1_us = "microwatt-hour",
symbol = "μWh",
utype = "エネルギー",
scale = 0.0036,
default = "mJ",
link = "キロワット時",
},
["-kW.h"] = {
target = "kW.h",
},
["btu"] = {
target = "BTU",
},
["Calorie"] = {
target = "Cal",
},
["ft.lbf"] = {
target = "ftlbf",
},
["ft·lbf"] = {
target = "ftlbf",
},
["g-cal-15"] = {
target = "cal-15",
},
["g-cal-IT"] = {
target = "cal-IT",
},
["g-cal-th"] = {
target = "cal-th",
},
["g-kcal-15"] = {
target = "kcal-15",
},
["g-kcal-IT"] = {
target = "kcal-IT",
},
["g-kcal-th"] = {
target = "kcal-th",
},
["g-Mcal-15"] = {
target = "Mcal-15",
},
["g-mcal-15"] = {
target = "mcal-15",
},
["g-Mcal-IT"] = {
target = "Mcal-IT",
},
["g-mcal-IT"] = {
target = "mcal-IT",
},
["g-Mcal-th"] = {
target = "Mcal-th",
},
["g-mcal-th"] = {
target = "mcal-th",
},
["GW-h"] = {
target = "GW.h",
},
["GW·h"] = {
target = "GW.h",
},
["Hartree"] = {
target = "Eh",
},
["hp.h"] = {
target = "hph",
},
["in.lb-f"] = {
target = "inlb-f",
},
["in.lbf"] = {
target = "inlbf",
},
["in.oz-f"] = {
target = "inoz-f",
},
["in.ozf"] = {
target = "inozf",
},
["kbboe"] = {
target = "kBOE",
symbol = "kbboe",
},
["kg-cal-15"] = {
target = "Cal-15",
},
["kg-cal-IT"] = {
target = "Cal-IT",
},
["kg-cal-th"] = {
target = "Cal-th",
},
["kW-h"] = {
target = "kW.h",
},
["kW·h"] = {
target = "kW.h",
},
["MW-h"] = {
target = "MW.h",
},
["mW-h"] = {
target = "mW.h",
},
["MW·h"] = {
target = "MW.h",
},
["TW-h"] = {
target = "TW.h",
},
["uerg"] = {
target = "μerg",
},
["ueV"] = {
target = "μeV",
},
["uW-h"] = {
target = "μW.h",
},
["uW.h"] = {
target = "μW.h",
},
["uWh"] = {
target = "μWh",
},
["W-h"] = {
target = "W.h",
},
["eVpar"] = {
_name1 = "電子ボルト",
_name1_us= "electronvolt",
_symbol = "eV",
utype = "物質量当たりのエネルギー",
scale = 96485.329522144166,
prefixes = 1,
default = "kcal/mol",
link = "電子ボルト",
},
["kcal/mol"] = {
per = { "kcal", "mol" },
utype = "物質量当たりのエネルギー",
default = "kJ/mol",
link = "キロカロリー毎モル",
},
["kJ/mol"] = {
per = { "kJ", "mol" },
utype = "物質量当たりのエネルギー",
default = "kcal/mol",
link = "ジュール毎モル",
},
["kWh/100 km"] = {
name1 = "キロワット時毎100キロメートル",
name1_us = "kilowatt-hour per 100 kilometers",
name2_us = "kilowatt-hours per 100 kilometers",
symbol = "kW⋅h/100 km",
utype = "単位長さ当たりのエネルギー",
scale = 36,
default = "MJ/km kWh/mi",
link = "キロワット時",
},
["kWh/100 mi"] = {
name1 = "キロワット時毎100マイル",
name1_us = "kilowatt-hour per 100 miles",
name2_us = "kilowatt-hours per 100 miles",
symbol = "kW⋅h/100 mi",
utype = "単位長さ当たりのエネルギー",
scale = 22.3694,
default = "mpge",
link = "マイル毎ガロン相当",
},
["MJ/100 km"] = {
name1 = "メガジュール毎100キロメートル",
name1_us = "megajoule per 100 kilometers",
name2_us = "megajoules per 100 kilometers",
symbol = "MJ/100 km",
utype = "単位長さ当たりのエネルギー",
scale = 10,
default = "BTU/mi",
link = "英熱量",
},
["mpge"] = {
name1 = "マイル毎ガロン相当",
name1_us = "mile per gallon gasoline equivalent",
name2_us = "miles per gallon gasoline equivalent",
symbol = "mpg‑e",
utype = "単位長さ当たりのエネルギー",
scale = 13e-6,
invert = -1,
iscomplex= true,
default = "kWh/100 mi",
},
["BTU/mi"] = {
per = { "BTU", "mi" },
utype = "単位長さ当たりのエネルギー",
default = "v > 1525 ! M ! k ! J/km",
},
["kJ/km"] = {
per = { "kJ", "km" },
utype = "単位長さ当たりのエネルギー",
default = "BTU/mi",
},
["kWh/km"] = {
per = { "-kW.h", "km" },
utype = "単位長さ当たりのエネルギー",
default = "MJ/km kWh/mi",
},
["kWh/mi"] = {
per = { "-kW.h", "mi" },
utype = "単位長さ当たりのエネルギー",
default = "kWh/km MJ/km",
},
["MJ/km"] = {
per = { "MJ", "km" },
utype = "単位長さ当たりのエネルギー",
default = "BTU/mi",
},
["mpg-e"] = {
target = "mpge",
},
["BTU/lb"] = {
name1 = "英熱量毎ポンド",
name1_us = "British thermal unit per pound",
name2_us = "British thermal units per pound",
symbol = "BTU/lb",
utype = "単位質量当たりのエネルギー",
scale = 429.92261414790346,
default = "kJ/kg",
link = "英熱量",
},
["cal/g"] = {
name1 = "カロリー毎グラム",
name1_us = "calorie per gram",
name2_us = "calories per gram",
symbol = "cal/g",
utype = "単位質量当たりのエネルギー",
scale = 4184,
default = "J/g",
},
["GJ/kg"] = {
name1 = "ギガジュール毎キログラム",
name1_us = "gigajoule per kilogram",
name2_us = "gigajoules per kilogram",
symbol = "GJ/kg",
utype = "単位質量当たりのエネルギー",
scale = 1e9,
default = "ktTNT/t",
link = "比エネルギー",
},
["J/g"] = {
name1 = "ジュール毎グラム",
name1_us = "joule per gram",
name2_us = "joules per gram",
symbol = "J/g",
utype = "単位質量当たりのエネルギー",
scale = 1000,
default = "kcal/g",
link = "比エネルギー",
},
["kcal/g"] = {
name1 = "キロカロリー毎グラム",
name1_us = "kilocalorie per gram",
name2_us = "kilocalories per gram",
symbol = "kcal/g",
utype = "単位質量当たりのエネルギー",
scale = 4184000,
default = "kJ/g",
},
["kJ/g"] = {
name1 = "キロジュール毎グラム",
name1_us = "kilojoule per gram",
name2_us = "kilojoules per gram",
symbol = "kJ/g",
utype = "単位質量当たりのエネルギー",
scale = 1000000,
default = "kcal/g",
link = "比エネルギー",
},
["kJ/kg"] = {
name1 = "キロジュール毎キログラム",
name1_us = "kilojoule per kilogram",
name2_us = "kilojoules per kilogram",
symbol = "kJ/kg",
utype = "単位質量当たりのエネルギー",
scale = 1000,
default = "BTU/lb",
link = "比エネルギー",
},
["ktonTNT/MT"] = {
name1 = "TNT換算キロトン毎メトリックトン",
name1_us = "kiloton of TNT per metric ton",
name2_us = "kilotons of TNT per metric ton",
symbol = "kiloton of TNT per metric ton",
usename = 1,
utype = "単位質量当たりのエネルギー",
scale = 4184000000,
default = "GJ/kg",
link = "TNT換算",
},
["ktTNT/t"] = {
name1 = "TNT換算キロトン毎トン",
name1_us = "kilotonne of TNT per tonne",
name2_us = "kilotonnes of TNT per tonne",
symbol = "kilotonne of TNT per tonne",
usename = 1,
utype = "単位質量当たりのエネルギー",
scale = 4184000000,
default = "GJ/kg",
link = "TNT換算",
},
["MtonTNT/MT"] = {
name1 = "TNT換算メガトン毎メトリックトン",
name1_us = "megaton of TNT per metric ton",
name2_us = "megatons of TNT per metric ton",
symbol = "megaton of TNT per metric ton",
usename = 1,
utype = "単位質量当たりのエネルギー",
scale = 4.184e12,
default = "TJ/kg",
link = "TNT換算",
},
["MtTNT/MT"] = {
name1 = "TNT換算メガトン毎トン",
name1_us = "megatonne of TNT per tonne",
name2_us = "megatonnes of TNT per tonne",
symbol = "megatonne of TNT per tonne",
usename = 1,
utype = "単位質量当たりのエネルギー",
scale = 4.184e12,
default = "TJ/kg",
link = "TNT換算",
},
["TJ/kg"] = {
name1 = "テラジュール毎キログラム",
name1_us = "terajoule per kilogram",
name2_us = "terajoules per kilogram",
symbol = "TJ/kg",
utype = "単位質量当たりのエネルギー",
scale = 1e12,
default = "MtTNT/MT",
link = "比エネルギー",
},
["Cal/g"] = {
per = { "Cal", "g" },
utype = "単位質量当たりのエネルギー",
default = "kJ/g",
},
["BTU/cuft"] = {
per = { "BTU", "cuft" },
utype = "単位体積当たりのエネルギー",
default = "kJ/L",
},
["Cal/12USoz(mL)serve"] = {
per = { "Cal", "-12USoz(mL)serve" },
utype = "単位体積当たりのエネルギー",
default = "kJ/L",
},
["Cal/12USoz(ml)serve"] = {
per = { "Cal", "-12USoz(ml)serve" },
utype = "単位体積当たりのエネルギー",
default = "kJ/l",
},
["Cal/12USozserve"] = {
per = { "Cal", "-12USozserve" },
utype = "単位体積当たりのエネルギー",
default = "kJ/L",
},
["Cal/USoz"] = {
per = { "Cal", "USoz" },
utype = "単位体積当たりのエネルギー",
default = "kJ/ml",
},
["kJ/L"] = {
per = { "kJ", "L" },
utype = "単位体積当たりのエネルギー",
default = "BTU/cuft",
},
["kJ/l"] = {
per = { "kJ", "l" },
utype = "単位体積当たりのエネルギー",
default = "BTU/cuft",
},
["kJ/ml"] = {
per = { "kJ", "ml" },
utype = "単位体積当たりのエネルギー",
default = "Cal/USoz",
},
["MJ/m3"] = {
per = { "MJ", "m3" },
utype = "単位体積当たりのエネルギー",
default = "BTU/cuft",
},
["Sv"] = {
_name1 = "シーベルト",
_name1_us= "sievert",
_symbol = "Sv",
utype = "線量当量",
scale = 1,
prefixes = 1,
default = "rem",
link = "シーベルト",
},
["rem"] = {
_name1 = "レム",
_name1_us= "rem",
_symbol = "rem",
utype = "線量当量",
scale = 0.01,
prefixes = 1,
default = "Sv",
link = "レム",
},
["g/km"] = {
name1 = "グラム毎キロメートル",
name1_us = "gram per kilometer",
name2_us = "grams per kilometer",
symbol = "g/km",
utype = "排気",
scale = 1e-6,
default = "oz/mi",
link = "排気ガス",
},
["g/mi"] = {
name1 = "グラム毎マイル",
name1_us = "gram per mile",
name2_us = "grams per mile",
symbol = "g/mi",
utype = "排気",
scale = 6.2137119223733397e-7,
default = "g/km",
link = "排気ガス",
},
["gCO2/km"] = {
name1 = "グラム二酸化炭素毎キロメートル",
name1_us = "gram of CO<sub>2</sub> per kilometer",
name2_us = "grams of CO<sub>2</sub> per kilometer",
symbol = "g(CO<sub>2</sub>)/km",
utype = "排気",
scale = 1e-6,
default = "ozCO2/mi",
link = "排気ガス",
},
["gCO2/mi"] = {
name1 = "グラム二酸化炭素毎マイル",
name1_us = "gram of CO<sub>2</sub> per mile",
name2_us = "grams of CO<sub>2</sub> per mile",
symbol = "g(CO<sub>2</sub>)/mi",
utype = "排気",
scale = 6.2137119223733397e-7,
default = "gCO2/km",
link = "排気ガス",
},
["kg/km"] = {
name1 = "キログラム毎キロメートル",
name1_us = "kilogram per kilometer",
name2_us = "kilograms per kilometer",
symbol = "kg/km",
utype = "排気",
scale = 0.001,
default = "lb/mi",
link = "排気ガス",
},
["kgCO2/km"] = {
name1 = "キログラム二酸化炭素毎キロメートル",
name1_us = "kilogram of CO<sub>2</sub> per kilometer",
name2_us = "kilograms of CO<sub>2</sub> per kilometer",
symbol = "kg(CO<sub>2</sub>)/km",
utype = "排気",
scale = 0.001,
default = "lbCO2/mi",
link = "排気ガス",
},
["lb/mi"] = {
name1 = "ポンド毎マイル",
name1_us = "pound per mile",
name2_us = "pounds per mile",
symbol = "lb/mi",
utype = "排気",
scale = 0.00028184923173665794,
default = "kg/km",
link = "排気ガス",
},
["lbCO2/mi"] = {
name1 = "ポンド二酸化炭素毎マイル",
name1_us = "pound of CO<sub>2</sub> per mile",
name2_us = "pounds of CO<sub>2</sub> per mile",
symbol = "lb(CO<sub>2</sub>)/mi",
utype = "排気",
scale = 0.00028184923173665794,
default = "kgCO2/km",
link = "排気ガス",
},
["oz/mi"] = {
name1 = "オンス毎マイル",
name1_us = "ounce per mile",
name2_us = "ounces per mile",
symbol = "oz/mi",
utype = "排気",
scale = 1.7615576983541121e-5,
default = "g/km",
link = "排気ガス",
},
["ozCO2/mi"] = {
name1 = "オンス二酸化炭素毎マイル",
name1_us = "ounce of CO<sub>2</sub> per mile",
name2_us = "ounces of CO<sub>2</sub> per mile",
symbol = "oz(CO<sub>2</sub>)/mi",
utype = "排気",
scale = 1.7615576983541121e-5,
default = "gCO2/km",
link = "排気ガス",
},
["cuft/a"] = {
name1 = "立方フィート毎年",
name1_us = "cubic foot per annum",
name2_us = "cubic feet per annum",
symbol = "cu ft/a",
utype = "流量",
scale = 8.9730672142368242e-10,
default = "m3/a",
link = "フィート毎秒",
},
["cuft/d"] = {
name1 = "立方フィート毎日",
name1_us = "cubic foot per day",
name2_us = "cubic feet per day",
symbol = "cu ft/d",
utype = "流量",
scale = 3.2774128000000003e-7,
default = "m3/d",
link = "フィート毎秒",
},
["cuft/h"] = {
name1 = "立方フィート毎時",
name1_us = "cubic foot per hour",
name2_us = "cubic feet per hour",
symbol = "cu ft/h",
utype = "流量",
scale = 7.8657907200000004e-6,
default = "m3/h",
link = "フィート毎秒",
},
["cuft/min"] = {
name1 = "立方フィート毎分",
name1_us = "cubic foot per minute",
name2_us = "cubic feet per minute",
symbol = "cu ft/min",
utype = "流量",
scale = 0.00047194744319999999,
default = "m3/min",
link = "フィート毎秒",
},
["cuft/s"] = {
name1 = "立方フィート毎秒",
name1_us = "cubic foot per second",
name2_us = "cubic feet per second",
symbol = "cu ft/s",
utype = "流量",
scale = 28316846592e-12,
default = "m3/s",
link = "フィート毎秒",
},
["cumi/a"] = {
name1 = "立方マイル毎年",
name1_us = "cubic mile per annum",
name2_us = "cubic miles per annum",
symbol = "cu mi/a",
utype = "流量",
scale = 132.08171170940057,
default = "km3/a",
link = "フィート毎秒",
},
["cuyd/h"] = {
name1 = "立方ヤード毎時",
name1_us = "cubic yard per hour",
name2_us = "cubic yards per hour",
symbol = "cuyd/h",
utype = "流量",
scale = 0.00021237634944000001,
default = "m3/h",
link = "フィート毎秒",
},
["cuyd/s"] = {
name1 = "立方ヤード毎秒",
name1_us = "cubic yard per second",
name2_us = "cubic yards per second",
symbol = "cu yd/s",
utype = "流量",
scale = 0.76455485798400002,
default = "m3/s",
link = "ヤード毎秒",
},
["Goilbbl/a"] = {
name1 = "十億バレル毎年",
name1_us = "billion barrels per year",
symbol = "Gbbl/a",
utype = "流量",
scale = 5.0380033629933836,
default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3/a",
link = "バレル毎日",
},
["impgal/h"] = {
name1 = "英ガロン毎時",
name1_us = "imperial gallon per hour",
name2_us = "imperial gallons per hour",
symbol = "imp gal/h",
utype = "流量",
scale = 1.2628027777777779e-6,
default = "m3/h",
link = "ガロン",
},
["impgal/min"] = {
name1 = "英ガロン毎分",
name1_us = "imperial gallon per minute",
name2_us = "imperial gallons per minute",
symbol = "imp gal/min",
utype = "流量",
scale = 7.5768166666666671e-5,
default = "m3/s",
link = "ガロン",
},
["impgal/s"] = {
name1 = "英ガロン毎秒",
name1_us = "imperial gallon per second",
name2_us = "imperial gallons per second",
symbol = "impgal/s",
utype = "流量",
scale = 0.00454609,
default = "m3/s",
},
["km3/a"] = {
name1 = "立方キロメートル毎年",
name1_us = "cubic kilometer per annum",
name2_us = "cubic kilometers per annum",
symbol = "km<sup>3</sup>/a",
utype = "流量",
scale = 31.68808781402895,
default = "cumi/a",
link = "立方メートル毎秒",
},
["km3/d"] = {
name1 = "立方キロメートル毎日",
name1_us = "cubic kilometer per day",
name2_us = "cubic kilometers per day",
symbol = "km<sup>3</sup>/d",
utype = "流量",
scale = 11574.074074074075,
default = "cuft/d",
link = "立方メートル毎秒",
},
["koilbbl/a"] = {
name1 = "千バレル毎年",
name1_us = "thousand barrels per year",
symbol = "kbbl/a",
utype = "流量",
scale = 5.0380033629933841e-6,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3/a",
link = "バレル",
},
["koilbbl/d"] = {
name1 = "千バレル毎日",
name1_us = "thousand barrels per day",
symbol = "kbbl/d",
utype = "流量",
scale = 0.0018401307283333335,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3/d",
link = "バレル",
},
["L/h"] = {
name1 = "リットル毎時",
name1_us = "liter per hour",
name2_us = "liters per hour",
symbol = "L/h",
utype = "流量",
scale = 2.7777777777777776e-7,
default = "impgal/h USgal/h",
link = "立方メートル毎秒",
},
["L/min"] = {
name1 = "リットル毎分",
name1_us = "liter per minute",
name2_us = "liters per minute",
symbol = "L/min",
utype = "流量",
scale = 1.6666666666666667e-5,
default = "impgal/min USgal/min",
link = "立方メートル毎秒",
},
["L/s"] = {
name1 = "リットル毎秒",
name1_us = "liter per second",
name2_us = "liters per second",
symbol = "L/s",
utype = "流量",
scale = 0.001,
default = "cuft/s",
link = "立方メートル毎秒",
},
["m3/a"] = {
name1 = "立方メートル毎年",
name1_us = "cubic meter per annum",
name2_us = "cubic meters per annum",
symbol = "m<sup>3</sup>/a",
utype = "流量",
scale = 3.1688087814028947e-8,
default = "cuft/a",
link = "立方メートル毎秒",
},
["m3/d"] = {
name1 = "立方メートル毎日",
name1_us = "cubic meter per day",
name2_us = "cubic meters per day",
symbol = "m<sup>3</sup>/d",
utype = "流量",
scale = 1.1574074074074073e-5,
default = "cuft/d",
link = "立方メートル毎秒",
},
["m3/h"] = {
name1 = "立方メートル毎時",
name1_us = "cubic meter per hour",
name2_us = "cubic meters per hour",
symbol = "m<sup>3</sup>/h",
utype = "流量",
scale = 0.00027777777777777778,
default = "cuft/h",
link = "立方メートル毎秒",
},
["m3/min"] = {
name1 = "立方メートル毎分",
name1_us = "cubic meter per minute",
name2_us = "cubic meters per minute",
symbol = "m<sup>3</sup>/min",
utype = "流量",
scale = 0.016666666666666666,
default = "cuft/min",
link = "立方メートル毎秒",
},
["m3/s"] = {
name1 = "立方メートル毎秒",
name1_us = "cubic meter per second",
name2_us = "cubic meters per second",
symbol = "m<sup>3</sup>/s",
utype = "流量",
scale = 1,
default = "cuft/s",
},
["Moilbbl/a"] = {
name1 = "百万バレル毎年",
name1_us = "million barrels per year",
symbol = "Mbbl/a",
utype = "流量",
scale = 0.0050380033629933837,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/a",
link = "バレル",
},
["Moilbbl/d"] = {
name1 = "百万バレル毎日",
name1_us = "million barrels per day",
symbol = "Mbbl/d",
utype = "流量",
scale = 1.8401307283333335,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3/d",
link = "バレル",
},
["oilbbl/a"] = {
name1 = "バレル毎年",
name1_us = "barrel per year",
name2_us = "barrels per year",
symbol = "bbl/a",
utype = "流量",
scale = 5.0380033629933841e-9,
default = "m3/a",
link = "バレル",
},
["oilbbl/d"] = {
name1 = "バレル毎日",
name1_us = "barrel per day",
name2_us = "barrels per day",
symbol = "bbl/d",
utype = "流量",
scale = 1.8401307283333336e-6,
default = "m3/d",
link = "バレル",
},
["Toilbbl/a"] = {
name1 = "兆バレル毎年",
name1_us = "trillion barrels per year",
symbol = "Tbbl/a",
utype = "流量",
scale = 5038.0033629933832,
default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3/a",
link = "バレル",
},
["U.S.gal/d"] = {
name1 = "米ガロン毎日",
name1_us = "U.S. gallon per day",
name2_us = "U.S. gallons per day",
symbol = "U.S. gal/d",
utype = "流量",
scale = 4.3812636388888893e-8,
default = "m3/s",
customary= 1,
},
["U.S.gal/h"] = {
name1 = "ガロン毎時",
name1_us = "gallon per hour",
name2_us = "gallons per hour",
symbol = "gal/h",
utype = "流量",
scale = 1.0515032733333334e-6,
default = "m3/h",
link = "ガロン",
customary= 2,
},
["U.S.gal/min"] = {
name1 = "米ガロン毎分",
name1_us = "U.S. gallon per minute",
name2_us = "U.S. gallons per minute",
symbol = "U.S. gal/min",
utype = "流量",
scale = 6.3090196400000003e-5,
default = "m3/s",
link = "ガロン",
},
["USgal/a"] = {
name1 = "米ガロン毎年",
name1_us = "US gallon per year",
name2_us = "US gallons per year",
symbol = "US gal/a",
utype = "流量",
scale = 1.1995246102365199e-10,
default = "m3/s",
},
["USgal/d"] = {
name1 = "米ガロン毎日",
name1_us = "US gallon per day",
name2_us = "US gallons per day",
symbol = "US gal/d",
utype = "流量",
scale = 4.3812636388888893e-8,
default = "m3/s",
},
["USgal/h"] = {
name1 = "ガロン毎時",
name1_us = "gallon per hour",
name2_us = "gallons per hour",
symbol = "gal/h",
utype = "流量",
scale = 1.0515032733333334e-6,
default = "m3/h",
link = "ガロン",
customary= 1,
},
["USgal/min"] = {
name1 = "米ガロン毎分",
name1_us = "US gallon per minute",
name2_us = "US gallons per minute",
symbol = "US gal/min",
utype = "流量",
scale = 6.3090196400000003e-5,
default = "m3/s",
link = "ガロン",
},
["USgal/s"] = {
name1 = "米ガロン毎秒",
name1_us = "U.S. gallon per second",
name2_us = "U.S. gallons per second",
symbol = "USgal/s",
utype = "流量",
scale = 0.003785411784,
default = "m3/s",
},
["ft3/a"] = {
target = "cuft/a",
},
["ft3/d"] = {
target = "cuft/d",
},
["ft3/h"] = {
target = "cuft/h",
},
["ft3/s"] = {
target = "cuft/s",
},
["Gcuft/a"] = {
target = "e9cuft/a",
},
["Gcuft/d"] = {
target = "e9cuft/d",
},
["kcuft/a"] = {
target = "e3cuft/a",
},
["kcuft/d"] = {
target = "e3cuft/d",
},
["kcuft/s"] = {
target = "e3cuft/s",
},
["Mcuft/a"] = {
target = "e6cuft/a",
},
["Mcuft/d"] = {
target = "e6cuft/d",
},
["Mcuft/s"] = {
target = "e6cuft/s",
},
["m³/s"] = {
target = "m3/s",
},
["Tcuft/a"] = {
target = "e12cuft/a",
},
["Tcuft/d"] = {
target = "e12cuft/d",
},
["u.s.gal/min"] = {
target = "U.S.gal/min",
},
["usgal/min"] = {
target = "USgal/min",
},
["-LTf"] = {
name1 = "重量ロングトン",
name1_us = "long ton-force",
name2_us = "long tons-force",
symbol = "LTf",
utype = "力",
scale = 9964.01641818352,
default = "kN",
},
["-STf"] = {
name1 = "重量ショートトン",
name1_us = "short ton-force",
name2_us = "short tons-force",
symbol = "STf",
utype = "力",
scale = 8896.443230521,
default = "kN",
},
["dyn"] = {
name1 = "ダイン",
name1_us = "dyne",
symbol = "dyn",
utype = "力",
scale = 0.00001,
default = "gr-f",
},
["g-f"] = {
name1 = "重量グラム",
name1_us = "gram-force",
name2_us = "grams-force",
symbol = "g<sub>f</sub>",
utype = "力",
scale = 0.00980665,
default = "mN oz-f",
link = "重量キログラム",
},
["gf"] = {
name1 = "重量グラム",
name1_us = "gram-force",
name2_us = "grams-force",
symbol = "gf",
utype = "力",
scale = 0.00980665,
default = "mN ozf",
link = "重量キログラム",
},
["gr-f"] = {
name1 = "重量グレーン",
name1_us = "grain-force",
name2_us = "grains-force",
symbol = "gr<sub>f</sub>",
utype = "力",
scale = 0.0006354602307515,
default = "μN",
link = "重量ポンド",
},
["grf"] = {
name1 = "重量グレーン",
name1_us = "grain-force",
name2_us = "grains-force",
symbol = "grf",
utype = "力",
scale = 0.0006354602307515,
default = "μN",
link = "重量ポンド",
},
["kdyn"] = {
name1 = "キロダイン",
name1_us = "kilodyne",
symbol = "kdyn",
utype = "力",
scale = 0.01,
default = "oz-f",
link = "ダイン",
},
["kg-f"] = {
name1 = "重量キログラム",
name1_us = "kilogram-force",
name2_us = "kilograms-force",
symbol = "kg<sub>f</sub>",
utype = "力",
scale = 9.80665,
default = "N lb-f",
},
["kgf"] = {
name1 = "重量キログラム",
name1_us = "kilogram-force",
name2_us = "kilograms-force",
symbol = "kgf",
utype = "力",
scale = 9.80665,
default = "N lbf",
},
["kp"] = {
name1 = "キロポンド",
name1_us = "kilopond",
symbol = "kp",
utype = "力",
scale = 9.80665,
default = "N lb-f",
link = "重量キログラム",
},
["L/T-f"] = {
name1 = "重量ロングトン",
name1_us = "long ton-force",
name2_us = "long tons-force",
symbol = "L/T<sub>f</sub>",
utype = "力",
scale = 9964.01641818352,
default = "kN",
},
["L/Tf"] = {
name1 = "重量ロングトン",
name1_us = "long ton-force",
name2_us = "long tons-force",
symbol = "L/Tf",
utype = "力",
scale = 9964.01641818352,
default = "kN",
},
["lb-f"] = {
name1 = "重量ポンド",
name1_us = "pound-force",
name2_us = "pounds-force",
symbol = "lb<sub>f</sub>",
utype = "力",
scale = 4.4482216152605,
default = "N",
},
["lbf"] = {
name1 = "重量ポンド",
name1_us = "pound-force",
name2_us = "pounds-force",
symbol = "lbf",
utype = "力",
scale = 4.4482216152605,
default = "N",
},
["lb(f)"] = {
name1 = "ポンド",
name1_us = "pound",
symbol = "lb",
utype = "力",
scale = 4.4482216152605,
default = "N",
link = "重量ポンド",
},
["LT-f"] = {
name1 = "重量ロングトン",
name1_us = "long ton-force",
name2_us = "long tons-force",
symbol = "LT<sub>f</sub>",
utype = "力",
scale = 9964.01641818352,
default = "kN",
},
["LTf"] = {
name1 = "重量ロングトン",
name1_us = "long ton-force",
name2_us = "long tons-force",
symbol = "LTf",
usename = 1,
utype = "力",
scale = 9964.01641818352,
default = "kN",
},
["Mdyn"] = {
name1 = "メガダイン",
name1_us = "megadyne",
symbol = "Mdyn",
utype = "力",
scale = 10,
default = "lb-f",
link = "ダイン",
},
["mdyn"] = {
name1 = "ミリダイン",
name1_us = "millidyne",
symbol = "mdyn",
utype = "力",
scale = 0.00000001,
default = "gr-f",
link = "ダイン",
},
["mg-f"] = {
name1 = "重量ミリグラム",
name1_us = "milligram-force",
name2_us = "milligrams-force",
symbol = "mg<sub>f</sub>",
utype = "力",
scale = 0.00000980665,
default = "μN gr-f",
link = "重量キログラム",
},
["mgf"] = {
name1 = "重量ミリグラム",
name1_us = "milligram-force",
name2_us = "milligrams-force",
symbol = "mgf",
utype = "力",
scale = 0.00000980665,
default = "μN grf",
link = "重量キログラム",
},
["Mp"] = {
name1 = "メガポンド",
name1_us = "megapond",
symbol = "Mp",
utype = "力",
scale = 9806.65,
default = "kN LT-f ST-f",
link = "重量キログラム",
},
["mp"] = {
name1 = "ミリポンド",
name1_us = "millipond",
symbol = "mp",
utype = "力",
scale = 0.00000980665,
default = "μN gr-f",
link = "重量キログラム",
},
["N"] = {
_name1 = "ニュートン",
_name1_us= "newton",
_symbol = "N",
utype = "力",
scale = 1,
prefixes = 1,
default = "lb-f",
link = "ニュートン (単位)",
},
["oz-f"] = {
name1 = "重量オンス",
name1_us = "ounce-force",
name2_us = "ounces-force",
symbol = "oz<sub>f</sub>",
utype = "力",
scale = 0.2780138203095378125,
default = "mN",
link = "重量ポンド",
},
["ozf"] = {
name1 = "重量オンス",
name1_us = "ounce-force",
name2_us = "ounces-force",
symbol = "ozf",
utype = "力",
scale = 0.2780138203095378125,
default = "mN",
link = "重量ポンド",
},
["p"] = {
name1 = "ポンド",
name1_us = "pond",
symbol = "p",
utype = "力",
scale = 0.00980665,
default = "mN oz-f",
link = "重量キログラム",
},
["pdl"] = {
name1 = "パウンダル",
name1_us = "poundal",
symbol = "pdl",
utype = "力",
scale = 0.138254954376,
default = "N",
},
["S/T-f"] = {
name1 = "重量ショートトン",
name1_us = "short ton-force",
name2_us = "short tons-force",
symbol = "S/T<sub>f</sub>",
utype = "力",
scale = 8896.443230521,
default = "kN",
},
["S/Tf"] = {
name1 = "重量ショートトン",
name1_us = "short ton-force",
name2_us = "short tons-force",
symbol = "S/Tf",
utype = "力",
scale = 8896.443230521,
default = "kN",
},
["ST-f"] = {
name1 = "重量ショートトン",
name1_us = "short ton-force",
name2_us = "short tons-force",
symbol = "ST<sub>f</sub>",
utype = "力",
scale = 8896.443230521,
default = "kN",
},
["STf"] = {
name1 = "重量ショートトン",
name1_us = "short ton-force",
name2_us = "short tons-force",
symbol = "STf",
usename = 1,
utype = "力",
scale = 8896.443230521,
default = "kN",
},
["t-f"] = {
name1 = "重量トン",
name1_us = "tonne-force",
name2_us = "tonnes-force",
symbol = "t<sub>f</sub>",
utype = "力",
scale = 9806.65,
default = "kN LT-f ST-f",
},
["tf"] = {
name1 = "重量トン",
name1_us = "tonne-force",
name2_us = "tonnes-force",
symbol = "tf",
utype = "力",
scale = 9806.65,
default = "kN LTf STf",
},
["dyne"] = {
target = "dyn",
},
["newtons"] = {
target = "N",
},
["poundal"] = {
target = "pdl",
},
["tonne-force"] = {
target = "tf",
},
["impgal/mi"] = {
per = { "@impgal", "mi" },
utype = "燃費",
invert = 1,
iscomplex= true,
default = "l/km USgal/mi",
},
["km/L"] = {
per = { "km", "L" },
utype = "燃費",
invert = -1,
iscomplex= true,
default = "mpgimp mpgus",
},
["km/l"] = {
per = { "km", "l" },
utype = "燃費",
invert = -1,
iscomplex= true,
default = "mpgimp mpgus",
},
["L/100 km"] = {
per = { "L", "100km" },
utype = "燃費",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
symlink = "[[燃費#単位|L/100 km]]",
},
["l/100 km"] = {
per = { "l", "100km" },
utype = "燃費",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
symlink = "[[燃費#単位|l/100 km]]",
},
["L/km"] = {
per = { "L", "km" },
utype = "燃費",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
},
["l/km"] = {
per = { "l", "km" },
utype = "燃費",
invert = 1,
iscomplex= true,
default = "mpgimp mpgus",
},
["mi/impqt"] = {
per = { "mi", "impqt" },
utype = "燃費",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/U.S.qt"] = {
per = { "mi", "U.S.qt" },
utype = "燃費",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/USqt"] = {
per = { "mi", "USqt" },
utype = "燃費",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mi/usqt"] = {
per = { "mi", "usqt" },
utype = "燃費",
invert = -1,
iscomplex= true,
default = "km/L",
},
["mpgimp"] = {
per = { "mi", "@impgal" },
symbol = "mpg<sub>‑imp</sub>",
utype = "燃費",
invert = -1,
iscomplex= true,
default = "L/100 km+mpgus",
symlink = "[[燃費#単位|mpg]]<sub>‑[[帝国単位|imp]]</sub>",
},
["mpgus"] = {
per = { "mi", "+USgal" },
symbol = "mpg<sub>‑US</sub>",
utype = "燃費",
invert = -1,
iscomplex= true,
default = "L/100 km+mpgimp",
symlink = "[[燃費#単位|mpg]]<sub>‑[[米国慣用単位|US]]</sub>",
},
["U.S.gal/mi"] = {
per = { "*U.S.gal", "mi" },
sp_us = true,
utype = "燃費",
invert = 1,
iscomplex= true,
default = "l/km impgal/mi",
},
["usgal/mi"] = {
per = { "+USgal", "mi" },
utype = "燃費",
invert = 1,
iscomplex= true,
default = "l/km impgal/mi",
},
["L/100km"] = {
target = "L/100 km",
},
["l/100km"] = {
target = "l/100 km",
},
["mpg"] = {
shouldbe = "マイル毎米ガロンは%{mpgus%}を、マイル毎英ガロンは%{mpgimp%}を指定してください(%{mpg%}は曖昧であり、使用できません)",
},
["mpgU.S."] = {
target = "mpgus",
symbol = "mpg<sub>‑U.S.</sub>",
sp_us = true,
symlink = "[[燃費#単位|mpg]]<sub>‑[[米国慣用単位|U.S.]]</sub>",
},
["mpgu.s."] = {
target = "mpgus",
symbol = "mpg<sub>‑U.S.</sub>",
sp_us = true,
symlink = "[[燃費#単位|mpg]]<sub>‑[[米国慣用単位|U.S.]]</sub>",
},
["mpgUS"] = {
target = "mpgus",
},
["USgal/mi"] = {
target = "usgal/mi",
},
["kPa/m"] = {
per = { "kPa", "-m-frac" },
utype = "破砕圧力勾配",
default = "psi/ft",
},
["psi/ft"] = {
per = { "psi", "-ft-frac" },
utype = "破砕圧力勾配",
default = "kPa/m",
},
["cm/km"] = {
name1 = "センチメートル毎キロメートル",
name1_us = "centimeter per kilometer",
name2_us = "centimeters per kilometer",
symbol = "cm/km",
utype = "勾配",
scale = 0.00001,
default = "ft/mi",
link = "縦断勾配",
},
["ft/mi"] = {
name1 = "フート毎マイル",
name1_us = "foot per mile",
name2 = "フィート毎マイル",
name2_us = "feet per mile",
symbol = "ft/mi",
utype = "勾配",
scale = 0.00018939393939393939,
default = "v < 5.28 ! c ! ! m/km",
link = "縦断勾配",
},
["ft/nmi"] = {
name1 = "フート毎海里",
name1_us = "foot per nautical mile",
name2 = "フィート毎海里",
name2_us = "feet per nautical mile",
symbol = "ft/nmi",
utype = "勾配",
scale = 0.00016457883369330455,
default = "v < 6.076 ! c ! ! m/km",
link = "縦断勾配",
},
["in/ft"] = {
name1 = "インチ毎フート",
name1_us = "inch per foot",
name2_us = "inches per foot",
symbol = "in/ft",
utype = "勾配",
scale = 0.083333333333333329,
default = "mm/m",
link = "縦断勾配",
},
["in/mi"] = {
name1 = "インチ毎マイル",
name1_us = "inch per mile",
name2_us = "inches per mile",
symbol = "in/mi",
utype = "勾配",
scale = 1.5782828282828283e-5,
default = "v < 0.6336 ! m ! c ! m/km",
link = "縦断勾配",
},
["m/km"] = {
name1 = "メートル毎キロメートル",
name1_us = "meter per kilometer",
name2_us = "meters per kilometer",
symbol = "m/km",
utype = "勾配",
scale = 0.001,
default = "ft/mi",
link = "縦断勾配",
},
["mm/km"] = {
name1 = "ミリメートル毎キロメートル",
name1_us = "millimeter per kilometer",
name2_us = "millimeters per kilometer",
symbol = "mm/km",
utype = "勾配",
scale = 0.000001,
default = "in/mi",
link = "縦断勾配",
},
["mm/m"] = {
name1 = "ミリメートル毎メートル",
name1_us = "millimeter per meter",
name2_us = "millimeters per meter",
symbol = "mm/m",
utype = "勾配",
scale = 0.001,
default = "in/ft",
link = "縦断勾配",
},
["admi"] = {
name1 = "英海里",
name1_us = "admiralty mile",
symbol = "nmi (admiralty)",
utype = "長さ",
scale = 1853.184,
default = "km mi",
link = "海里",
},
["AU"] = {
name1 = "天文単位",
name1_us = "astronomical unit",
symbol = "AU",
utype = "長さ",
scale = 149597870700,
default = "km mi",
},
["Brnmi"] = {
name1 = "英海里",
name1_us = "British nautical mile",
symbol = "(Brit) nmi",
utype = "長さ",
scale = 1853.184,
default = "km mi",
link = "海里",
},
["bu"] = {
name1 = "分",
name1_us = "bu",
symbol = "bu",
usename = 1,
utype = "長さ",
scale = 0.0030303030303030303,
default = "mm",
link = "分 (数)#分(長さの単位)",
},
["ch"] = {
name1 = "チェーン",
name1_us = "chain",
symbol = "ch",
utype = "長さ",
scale = 20.1168,
default = "ft m",
subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } },
link = "チェーン (単位)",
},
["chlk"] = {
name1 = "[[チェーン (単位)|チェーン]]",
name1_us = "[[チェーン (単位)|chain]]",
symbol = "[[チェーン (単位)|ch]]",
utype = "長さ",
scale = 20.1168,
default = "ft m",
link = "",
},
["chain"] = {
name1 = "チェーン",
name1_us = "chain",
symbol = "chain",
usename = 1,
utype = "長さ",
scale = 20.1168,
default = "ft m",
subdivs = { ["ft"] = { 66, default = "m" }, ["yd"] = { 22, default = "m" } },
link = "チェーン (単位)",
},
["chainlk"] = {
name1 = "[[チェーン (単位)|チェーン]]",
name1_us = "[[チェーン (単位)|chain]]",
symbol = "[[Chain (unit)|chain]]",
usename = 1,
utype = "長さ",
scale = 20.1168,
default = "ft m",
link = "",
},
["dpcm"] = {
name1 = "ドット毎センチメートル",
name1_us = "dot/cm",
symbol = "dot/cm",
utype = "長さ",
scale = 100,
invert = -1,
iscomplex= true,
default = "dpi",
link = "Dpi",
},
["dpi"] = {
symbol = "DPI",
utype = "長さ",
scale = 39.370078740157481,
invert = -1,
iscomplex= true,
default = "pitch",
link = "Dpi",
},
["fathom"] = {
name1 = "ファゾム",
name1_us = "fathom",
symbol = "fathom",
usename = 1,
utype = "長さ",
scale = 1.8288,
default = "ft m",
},
["foot"] = {
name1 = "フート",
name1_us = "foot",
symbol = "ft",
utype = "長さ",
scale = 0.3048,
default = "m",
subdivs = { ["in"] = { 12, default = "m" } },
link = "フィート",
},
["ft"] = {
name1 = "フート",
name1_us = "foot",
name2 = "フィート",
name2_us = "feet",
symbol = "ft",
utype = "長さ",
scale = 0.3048,
exception= "integer_more_precision",
default = "m",
subdivs = { ["in"] = { 12, default = "m" } },
link = "フィート",
},
["furlong"] = {
name1 = "ハロン",
name1_us = "furlong",
symbol = "furlong",
usename = 1,
utype = "長さ",
scale = 201.168,
default = "ft m",
link = "ハロン (単位)",
},
["Gly"] = {
name1 = "ギガ光年",
name1_us = "gigalight-year",
symbol = "Gly",
utype = "長さ",
scale = 9.4607304725808e24,
default = "Mpc",
link = "光年",
},
["Gpc"] = {
name1 = "ギガパーセク",
name1_us = "gigaparsec",
symbol = "Gpc",
utype = "長さ",
scale = 3.0856775814671916e25,
default = "Gly",
link = "パーセク",
},
["hand"] = {
name1 = "ハンド",
name1_us = "hand",
symbol = "h",
utype = "長さ",
builtin = "hand",
scale = 0.1016,
iscomplex= true,
default = "in cm",
link = "ハンド (単位)",
},
["in"] = {
name1 = "インチ",
name1_us = "inch",
name2_us = "inches",
symbol = "in",
utype = "長さ",
scale = 0.0254,
exception= "subunit_more_precision",
default = "mm",
},
["inabbreviated"] = {
symbol = "in",
utype = "長さ",
scale = 0.0254,
default = "mm",
link = "インチ",
},
["kly"] = {
name1 = "キロ光年",
name1_us = "kilolight-year",
symbol = "kly",
utype = "長さ",
scale = 9.4607304725808e18,
default = "pc",
link = "光年",
},
["kpc"] = {
name1 = "キロパーセク",
name1_us = "kiloparsec",
symbol = "kpc",
utype = "長さ",
scale = 3.0856775814671916e19,
default = "kly",
link = "パーセク",
},
["LD"] = {
name1 = "月の距離",
name1_us = "lunar distance",
symbol = "LD",
utype = "長さ",
scale = 384403000,
default = "km mi",
link = "地球と月の距離",
},
["league"] = {
name1 = "リーグ",
name1_us = "league",
symbol = "league",
usename = 1,
utype = "長さ",
scale = 4828.032,
default = "km",
link = "リーグ (単位)",
},
["ly"] = {
name1 = "光年",
name1_us = "light-year",
symbol = "ly",
utype = "長さ",
scale = 9.4607304725808e15,
default = "AU",
},
["m"] = {
_name1 = "メートル",
_name1_us= "meter",
_symbol = "m",
utype = "長さ",
scale = 1,
prefixes = 1,
default = "v > 0 and v < 3 ! ftin ! ft",
link = "メートル",
},
["mi"] = {
name1 = "マイル",
name1_us = "mile",
symbol = "mi",
utype = "長さ",
scale = 1609.344,
default = "km",
subdivs = { ["ch"] = { 80, default = "km" }, ["chlk"] = { 80, default = "km" }, ["chain"] = { 80, default = "km" }, ["chainlk"] = { 80, default = "km" }, ["ft"] = { 5280, default = "km" }, ["furlong"] = { 8, default = "km" }, ["yd"] = { 1760, default = "km" } },
},
["mil"] = {
name1 = "ミル",
name1_us = "mil",
symbol = "mil",
usename = 1,
utype = "長さ",
scale = 0.0000254,
default = "mm",
link = "サウ",
},
["Mly"] = {
name1 = "メガ光年",
name1_us = "megalight-year",
symbol = "Mly",
utype = "長さ",
scale = 9.4607304725808e21,
default = "kpc",
link = "光年",
},
["Mpc"] = {
name1 = "メガパーセク",
name1_us = "megaparsec",
symbol = "Mpc",
utype = "長さ",
scale = 3.0856775814671916e22,
default = "Mly",
link = "パーセク",
},
["NM"] = {
name1 = "海里",
name1_us = "nautical mile",
symbol = "NM",
utype = "長さ",
scale = 1852,
default = "km mi",
},
["nmi"] = {
name1 = "海里",
name1_us = "nautical mile",
symbol = "nmi",
utype = "長さ",
scale = 1852,
default = "km mi",
},
["oldUKnmi"] = {
name1 = "海里",
name1_us = "nautical mile",
symbol = "nmi",
utype = "長さ",
scale = 1853.184,
default = "km mi",
},
["oldUSnmi"] = {
name1 = "海里",
name1_us = "nautical mile",
symbol = "nmi",
utype = "長さ",
scale = 1853.24496,
default = "km mi",
},
["pc"] = {
name1 = "パーセク",
name1_us = "parsec",
symbol = "pc",
utype = "長さ",
scale = 3.0856775814671916e16,
default = "ly",
},
["perch"] = {
name1 = "パーチ",
name1_us = "perch",
name2_us = "perches",
symbol = "perch",
usename = 1,
utype = "長さ",
scale = 5.0292,
default = "ft m",
link = "ロッド (単位)",
},
["pitch"] = {
name1 = "マイクロメートル",
name1_us = "μm",
symbol = "μm",
utype = "長さ",
scale = 1e-6,
default = "dpi",
defkey = "pitch",
linkey = "pitch",
link = "Dpi",
},
["pole"] = {
name1 = "ポール",
name1_us = "pole",
symbol = "pole",
usename = 1,
utype = "長さ",
scale = 5.0292,
default = "ft m",
link = "ロッド (単位)",
},
["pre1954U.S.nmi"] = {
name1 = "旧米海里",
name1_us = "(pre-1954 U.S.) nautical mile",
symbol = "(pre‑1954 U.S.) nmi",
utype = "長さ",
scale = 1853.24496,
default = "km mi",
link = "海里",
},
["pre1954USnmi"] = {
name1 = "旧米海里",
name1_us = "(pre-1954 U.S.) nautical mile",
symbol = "(pre‑1954 US) nmi",
sym_us = "(pre‑1954 U.S.) nmi",
utype = "長さ",
scale = 1853.24496,
default = "km mi",
link = "海里",
},
["rd"] = {
name1 = "ロッド",
name1_us = "rod",
symbol = "rd",
utype = "長さ",
scale = 5.0292,
default = "ft m",
link = "ロッド (単位)",
},
["royal cubit"] = {
name1 = "エジプト・キュビット",
name1_us = "royal cubit",
symbol = "cu",
utype = "長さ",
scale = 0.524,
default = "mm",
link = "キュビット",
},
["rtkm"] = {
name1 = "キロメートル",
name1_us = "route kilometer",
symbol = "km",
utype = "長さ",
scale = 1000,
default = "mi",
},
["rtmi"] = {
name1 = "マイル",
name1_us = "route mile",
symbol = "mi",
utype = "長さ",
scale = 1609.344,
default = "km",
},
["shaku"] = {
name1 = "尺",
name1_us = "shaku",
symbol = "shaku",
usename = 1,
utype = "長さ",
scale = 0.30303030303030304,
default = "m",
},
["sm"] = {
name1 = "スムート",
name1_us = "smoot",
symbol = "sm",
utype = "長さ",
scale = 1.70180,
default = "m",
},
["smi"] = {
name1 = "法定マイル",
name1_us = "statute mile",
symbol = "mi",
utype = "長さ",
scale = 1609.344,
default = "km",
subdivs = { ["chain"] = { 80, default = "km" } },
},
["solar radius"] = {
name1 = "太陽半径",
name1_us = "solar radius",
name2_us = "solar radii",
symbol = "''R''<sub>☉</sub>",
utype = "長さ",
scale = 695700e3,
default = "km",
},
["sun"] = {
name1 = "寸",
name1_us = "sun",
symbol = "sun",
usename = 1,
utype = "長さ",
scale = 0.030303030303030304,
default = "mm",
},
["thou"] = {
name1 = "サウ",
name1_us = "thou",
symbol = "thou",
usename = 1,
utype = "長さ",
scale = 0.0000254,
default = "mm",
},
["verst"] = {
name1 = "ベルスタ",
name1_us = "verst",
symbol = "verst",
usename = 1,
utype = "長さ",
scale = 1066.8,
default = "km mi",
},
["yd"] = {
name1 = "ヤード",
name1_us = "yard",
symbol = "yd",
utype = "長さ",
scale = 0.9144,
default = "m",
subdivs = { ["ft"] = { 3, default = "m" } },
},
["μin"] = {
name1 = "マイクロインチ",
name1_us = "microinch",
name2_us = "microinches",
symbol = "μin",
utype = "長さ",
scale = 0.0000000254,
default = "nm",
link = "SI接頭辞#SI以外での使用",
},
["Å"] = {
name1 = "オングストローム",
name1_us = "ångström",
symbol = "Å",
utype = "長さ",
scale = 0.0000000001,
default = "in",
},
["Hz"] = {
_name1 = "ヘルツ",
_name1_us= "hertz",
_symbol = "Hz",
utype = "長さ",
scale = 3.3356409519815204e-9,
invert = -1,
iscomplex= true,
prefixes = 1,
default = "m",
link = "ヘルツ",
},
["rpm"] = {
name1 = "回転毎分",
name1_us = "revolution per minute",
name2_us = "revolutions per minute",
symbol = "rpm",
utype = "長さ",
scale = 5.5594015866358675e-11,
invert = -1,
iscomplex= true,
default = "Hz",
link = "Rpm (単位)",
},
["-ft-frac"] = {
target = "ft",
link = "破砕圧力勾配",
},
["-in-stiff"] = {
target = "in",
link = "剛性",
},
["-m-frac"] = {
target = "m",
link = "破砕圧力勾配",
},
["-m-stiff"] = {
target = "m",
link = "剛性",
},
["100km"] = {
target = "km",
multiplier= 100,
},
["100mi"] = {
target = "mi",
multiplier= 100,
},
["100miles"] = {
target = "mi",
symbol = "miles",
multiplier= 100,
},
["admiralty nmi"] = {
target = "oldUKnmi",
},
["angstrom"] = {
target = "Å",
},
["au"] = {
target = "AU",
symbol = "au",
},
["feet"] = {
target = "ft",
},
["hands"] = {
target = "hand",
},
["inch"] = {
target = "in",
},
["light-year"] = {
target = "ly",
},
["meter"] = {
target = "m",
sp_us = true,
},
["meters"] = {
target = "m",
sp_us = true,
},
["metre"] = {
target = "m",
},
["metres"] = {
target = "m",
},
["micrometre"] = {
target = "μm",
},
["micron"] = {
target = "μm",
default = "μin",
},
["mile"] = {
target = "mi",
},
["miles"] = {
target = "mi",
},
["parsec"] = {
target = "pc",
},
["rod"] = {
target = "rd",
},
["smoot"] = {
target = "sm",
},
["uin"] = {
target = "μin",
},
["yard"] = {
target = "yd",
},
["yards"] = {
target = "yd",
},
["yds"] = {
target = "yd",
},
["dtex"] = {
name1 = "デシテックス",
name1_us = "decitex",
symbol = "dtex",
utype = "線密度",
scale = 1e-7,
default = "lb/yd",
link = "織物の単位",
},
["kg/cm"] = {
name1 = "キログラム毎センチメートル",
name1_us = "kilogram per centimeter",
name2_us = "kilograms per centimeter",
symbol = "kg/cm",
utype = "線密度",
scale = 100,
default = "lb/yd",
link = "線密度",
},
["kg/m"] = {
name1 = "キログラム毎メートル",
name1_us = "kilogram per meter",
name2_us = "kilograms per meter",
symbol = "kg/m",
utype = "線密度",
scale = 1,
default = "lb/yd",
link = "線密度",
},
["lb/ft"] = {
name1 = "ポンド毎フート",
name1_us = "pound per foot",
name2_us = "pounds per foot",
symbol = "lb/ft",
utype = "線密度",
scale = 1.4881639435695539,
default = "kg/m",
link = "線密度",
},
["lb/yd"] = {
name1 = "ポンド毎ヤード",
name1_us = "pound per yard",
name2_us = "pounds per yard",
symbol = "lb/yd",
utype = "線密度",
scale = 0.49605464785651798,
default = "kg/m",
link = "線密度",
},
["G"] = {
_name1 = "ガウス",
_name1_us= "gauss",
_symbol = "G",
utype = "磁束密度",
scale = 0.0001,
prefixes = 1,
default = "T",
link = "ガウス (単位)",
},
["T"] = {
_name1 = "テスラ",
_name1_us= "tesla",
_symbol = "T",
utype = "磁束密度",
scale = 1,
prefixes = 1,
default = "G",
link = "テスラ (単位)",
},
["A/m"] = {
name1 = "アンペア毎メートル",
name1_us = "ampere per meter",
name2_us = "amperes per meter",
symbol = "A/m",
utype = "磁界強度",
scale = 1,
default = "Oe",
},
["kA/m"] = {
name1 = "キロアンペア毎メートル",
name1_us = "kiloampere per meter",
name2_us = "kiloamperes per meter",
symbol = "kA/m",
utype = "磁界強度",
scale = 1000,
default = "kOe",
link = "アンペア毎メートル",
},
["MA/m"] = {
name1 = "メガアンペア毎メートル",
name1_us = "megaampere per meter",
name2_us = "megaamperes per meter",
symbol = "MA/m",
utype = "磁界強度",
scale = 1e6,
default = "kOe",
link = "アンペア毎メートル",
},
["Oe"] = {
_name1 = "エルステッド",
_name1_us= "oersted",
_symbol = "Oe",
utype = "磁界強度",
scale = 79.5774715,
prefixes = 1,
default = "kA/m",
link = "エルステッド",
},
["-Lcwt"] = {
name1 = "ハンドレッドウェイト",
name1_us = "hundredweight",
symbol = "cwt",
utype = "質量",
scale = 50.80234544,
default = "lb",
},
["-Scwt"] = {
name1 = "ハンドレッドウェイト",
name1_us = "hundredweight",
symbol = "cwt",
utype = "質量",
scale = 45.359237,
default = "lb",
},
["-ST"] = {
name1 = "ショートトン",
name1_us = "short ton",
symbol = "ST",
utype = "質量",
scale = 907.18474,
default = "t",
},
["carat"] = {
name1 = "カラット",
name1_us = "carat",
symbol = "carat",
usename = 1,
utype = "質量",
scale = 0.0002,
default = "g",
},
["drachm"] = {
name1 = "ドラム",
name1_us = "dram",
symbol = "drachm",
usename = 1,
utype = "質量",
scale = 0.001771845195,
default = "g",
link = "ドラム (単位)",
},
["dram"] = {
target = "drachm",
},
["dwt"] = {
name1 = "ペニーウェイト",
name1_us = "pennyweight",
symbol = "dwt",
utype = "質量",
scale = 0.00155517384,
default = "oz g",
},
["DWton"] = {
name1 = "載貨重量トン",
name1_us = "deadweight ton",
symbol = "deadweight ton",
usename = 1,
utype = "質量",
scale = 1016.0469088,
default = "DWtonne",
link = "載貨重量トン数",
},
["DWtonne"] = {
name1 = "載貨重量トン",
name1_us = "deadweight tonne",
symbol = "deadweight tonne",
usename = 1,
utype = "質量",
scale = 1000,
default = "DWton",
link = "載貨重量トン数",
},
["g"] = {
_name1 = "グラム",
_name1_us= "gram",
_symbol = "g",
utype = "質量",
scale = 0.001,
prefixes = 1,
default = "oz",
link = "グラム",
},
["gr"] = {
name1 = "グレーン",
name1_us = "grain",
symbol = "gr",
utype = "質量",
scale = 0.00006479891,
default = "g",
},
["Gt"] = {
name1 = "ギガトン",
name1_us = "gigatonne",
symbol = "Gt",
utype = "質量",
scale = 1000000000000,
default = "LT ST",
link = "トン",
},
["impgalh2o"] = {
name1 = "英ガロンの水",
name1_us = "imperial gallon of water",
name2_us = "imperial gallons of water",
symbol = "imp gal H<sub>2</sub>O",
utype = "質量",
scale = 4.5359236999999499,
default = "lb kg",
link = "英ガロン",
},
["kt"] = {
name1 = "キロトン",
name1_us = "kilotonne",
symbol = "kt",
utype = "質量",
scale = 1000000,
default = "LT ST",
link = "トン",
},
["lb"] = {
name1 = "ポンド",
name1_us = "pound",
symbol = "lb",
utype = "質量",
scale = 0.45359237,
exception= "integer_more_precision",
default = "kg",
subdivs = { ["oz"] = { 16, default = "kg" } },
link = "ポンド (質量)",
},
["Lcwt"] = {
name1 = "ロングハンドレッドウェイト",
name1_us = "long hundredweight",
symbol = "Lcwt",
usename = 1,
utype = "質量",
scale = 50.80234544,
default = "lb",
subdivs = { ["qtr"] = { 4, default = "kg" }, ["st"] = { 8, default = "kg" } },
link = "ハンドレッドウェイト",
},
["long cwt"] = {
name1 = "ロングハンドレッドウェイト",
name1_us = "long hundredweight",
symbol = "long cwt",
utype = "質量",
scale = 50.80234544,
default = "lb kg",
subdivs = { ["qtr"] = { 4, default = "kg" } },
link = "ハンドレッドウェイト",
},
["long qtr"] = {
name1 = "ロングクォーター",
name1_us = "long quarter",
symbol = "long qtr",
utype = "質量",
scale = 12.70058636,
default = "lb kg",
},
["LT"] = {
name1 = "ロングトン",
name1_us = "long ton",
symbol = "long ton",
usename = 1,
utype = "質量",
scale = 1016.0469088,
default = "t",
subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } },
},
["lt"] = {
name1 = "ロングトン",
name1_us = "long ton",
symbol = "LT",
utype = "質量",
scale = 1016.0469088,
default = "t",
subdivs = { ["Lcwt"] = { 20, default = "t", unit = "-Lcwt" } },
},
["metric ton"] = {
name1 = "メトリックトン",
name1_us = "metric ton",
symbol = "metric ton",
usename = 1,
utype = "質量",
scale = 1000,
default = "long ton",
link = "トン",
},
["MT"] = {
name1 = "メトリックトン",
name1_us = "metric ton",
symbol = "t",
utype = "質量",
scale = 1000,
default = "LT ST",
link = "トン",
},
["Mt"] = {
name1 = "メガトン",
name1_us = "megatonne",
symbol = "Mt",
utype = "質量",
scale = 1000000000,
default = "LT ST",
link = "トン",
},
["oz"] = {
name1 = "オンス",
name1_us = "ounce",
symbol = "oz",
utype = "質量",
scale = 0.028349523125,
default = "g",
},
["ozt"] = {
name1 = "トロイオンス",
name1_us = "troy ounce",
symbol = "ozt",
utype = "質量",
scale = 0.0311034768,
default = "oz g",
},
["pdr"] = {
name1 = "パウンダー",
name1_us = "pounder",
symbol = "pdr",
utype = "質量",
scale = 0.45359237,
default = "kg",
link = "ポンド (質量)",
},
["qtr"] = {
name1 = "クォーター",
name1_us = "quarter",
symbol = "qtr",
utype = "質量",
scale = 12.70058636,
default = "lb kg",
subdivs = { ["lb"] = { 28, default = "kg" } },
link = "ロングクォーター",
},
["Scwt"] = {
name1 = "ショートハンドレッドウェイト",
name1_us = "short hundredweight",
symbol = "Scwt",
usename = 1,
utype = "質量",
scale = 45.359237,
default = "lb",
link = "ハンドレッドウェイト",
},
["short cwt"] = {
name1 = "ショートハンドレッドウェイト",
name1_us = "short hundredweight",
symbol = "short cwt",
utype = "質量",
scale = 45.359237,
default = "lb kg",
link = "ハンドレッドウェイト",
},
["short qtr"] = {
name1 = "ショートクォーター",
name1_us = "short quarter",
symbol = "short qtr",
utype = "質量",
scale = 11.33980925,
default = "lb kg",
},
["ST"] = {
name1 = "ショートトン",
name1_us = "short ton",
symbol = "short ton",
usename = 1,
utype = "質量",
scale = 907.18474,
default = "t",
subdivs = { ["Scwt"] = { 20, default = "t", unit = "-Scwt" } },
},
["shtn"] = {
name1 = "ショートトン",
name1_us = "short ton",
symbol = "sh tn",
utype = "質量",
scale = 907.18474,
default = "t",
},
["shton"] = {
name1 = "トン",
name1_us = "ton",
symbol = "ton",
usename = 1,
utype = "質量",
scale = 907.18474,
default = "t",
},
["solar mass"] = {
name1 = "太陽質量",
name1_us = "solar mass",
name2_us = "solar masses",
symbol = "''M''<sub>☉</sub>",
utype = "質量",
scale = 1.98855e30,
default = "kg",
},
["st"] = {
name1 = "ストーン",
name1_us = "stone",
symbol = "st",
utype = "質量",
scale = 6.35029318,
default = "lb kg",
subdivs = { ["lb"] = { 14, default = "kg lb" } },
link = "ストーン (単位)",
},
["t"] = {
name1 = "メトリックトン",
name1_us = "metric ton",
symbol = "t",
utype = "質量",
scale = 1000,
default = "LT ST",
link = "トン",
},
["tonne"] = {
name1 = "メトリックトン",
name1_us = "metric ton",
symbol = "t",
utype = "質量",
scale = 1000,
default = "shton",
link = "トン",
},
["troy pound"] = {
name1 = "トロイポンド",
name1_us = "troy pound",
symbol = "troy pound",
usename = 1,
utype = "質量",
scale = 0.3732417216,
default = "lb kg",
link = "トロイ衡",
},
["usgalh2o"] = {
name1 = "米ガロンの水",
name1_us = "U.S. gallon of water",
name2_us = "U.S. gallons of water",
symbol = "US gal H<sub>2</sub>O",
utype = "質量",
scale = 3.7776215836051126,
default = "lb kg",
link = "米国慣用単位#液量",
},
["viss"] = {
symbol = "viss",
utype = "質量",
scale = 1.632932532,
default = "kg",
link = "ミャンマーの度量衡#質量",
},
["billion tonne"] = {
target = "e9t",
},
["kilogram"] = {
target = "kg",
},
["kilotonne"] = {
target = "kt",
},
["lbs"] = {
target = "lb",
},
["lbt"] = {
target = "troy pound",
},
["lcwt"] = {
target = "Lcwt",
},
["long ton"] = {
target = "LT",
},
["mcg"] = {
target = "μg",
},
["million tonne"] = {
target = "e6t",
},
["scwt"] = {
target = "Scwt",
},
["short ton"] = {
target = "ST",
},
["stone"] = {
target = "st",
},
["thousand tonne"] = {
target = "e3t",
},
["tonnes"] = {
target = "t",
},
["kg/kW"] = {
name1 = "キログラム毎キロワット",
name1_us = "kilogram per kilowatt",
name2_us = "kilograms per kilowatt",
symbol = "kg/kW",
utype = "単位仕事率当たりの質量",
scale = 0.001,
default = "lb/hp",
link = "キロワット",
},
["lb/hp"] = {
name1 = "ポンド毎馬力",
name1_us = "pound per horsepower",
name2_us = "pounds per horsepower",
symbol = "lb/hp",
utype = "単位仕事率当たりの質量",
scale = 0.00060827738784176115,
default = "kg/kW",
link = "馬力",
},
["kg/h"] = {
per = { "kg", "h" },
utype = "単位時間当たりの質量",
default = "lb/h",
},
["lb/h"] = {
per = { "lb", "h" },
utype = "単位時間当たりの質量",
default = "kg/h",
},
["g-mol/d"] = {
name1 = "グラムモル毎日",
name1_us = "gram-mole per day",
name2_us = "gram-moles per day",
symbol = "g‑mol/d",
utype = "モル率",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "モル",
},
["g-mol/h"] = {
name1 = "グラムモル毎時",
name1_us = "gram-mole per hour",
name2_us = "gram-moles per hour",
symbol = "g‑mol/h",
utype = "モル率",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "モル",
},
["g-mol/min"] = {
name1 = "グラムモル毎分",
name1_us = "gram-mole per minute",
name2_us = "gram-moles per minute",
symbol = "g‑mol/min",
utype = "モル率",
scale = 0.016666666666666666,
default = "g-mol/s",
link = "モル",
},
["g-mol/s"] = {
name1 = "グラムモル毎秒",
name1_us = "gram-mole per second",
name2_us = "gram-moles per second",
symbol = "g‑mol/s",
utype = "モル率",
scale = 1,
default = "lb-mol/min",
link = "モル",
},
["gmol/d"] = {
name1 = "グラムモル毎日",
name1_us = "gram-mole per day",
name2_us = "gram-moles per day",
symbol = "gmol/d",
utype = "モル率",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "モル",
},
["gmol/h"] = {
name1 = "グラムモル毎時",
name1_us = "gram-mole per hour",
name2_us = "gram-moles per hour",
symbol = "gmol/h",
utype = "モル率",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "モル",
},
["gmol/min"] = {
name1 = "グラムモル毎分",
name1_us = "gram-mole per minute",
name2_us = "gram-moles per minute",
symbol = "gmol/min",
utype = "モル率",
scale = 0.016666666666666666,
default = "gmol/s",
link = "モル",
},
["gmol/s"] = {
name1 = "グラムモル毎秒",
name1_us = "gram-mole per second",
name2_us = "gram-moles per second",
symbol = "gmol/s",
utype = "モル率",
scale = 1,
default = "lbmol/min",
link = "モル",
},
["kmol/d"] = {
name1 = "キロモル毎日",
name1_us = "kilomole per day",
name2_us = "kilomoles per day",
symbol = "kmol/d",
utype = "モル率",
scale = 0.011574074074074073,
default = "mmol/s",
link = "モル",
},
["kmol/h"] = {
name1 = "キロモル毎時",
name1_us = "kilomole per hour",
name2_us = "kilomoles per hour",
symbol = "kmol/h",
utype = "モル率",
scale = 0.27777777777777779,
default = "mol/s",
link = "モル",
},
["kmol/min"] = {
name1 = "キロモル毎分",
name1_us = "kilomole per minute",
name2_us = "kilomoles per minute",
symbol = "kmol/min",
utype = "モル率",
scale = 16.666666666666668,
default = "mol/s",
link = "キロモル",
},
["kmol/s"] = {
name1 = "キロモル毎秒",
name1_us = "kilomole per second",
name2_us = "kilomoles per second",
symbol = "kmol/s",
utype = "モル率",
scale = 1000,
default = "lb-mol/s",
link = "モル",
},
["lb-mol/d"] = {
name1 = "ポンドモル毎日",
name1_us = "pound-mole per day",
name2_us = "pound-moles per day",
symbol = "lb‑mol/d",
utype = "モル率",
scale = 0.0052499116898148141,
default = "mmol/s",
link = "ポンドモル",
},
["lb-mol/h"] = {
name1 = "ポンドモル毎時",
name1_us = "pound-mole per hour",
name2_us = "pound-moles per hour",
symbol = "lb‑mol/h",
utype = "モル率",
scale = 0.12599788055555555,
default = "mol/s",
link = "ポンドモル",
},
["lb-mol/min"] = {
name1 = "ポンドモル毎分",
name1_us = "pound-mole per minute",
name2_us = "pound-moles per minute",
symbol = "lb‑mol/min",
utype = "モル率",
scale = 7.5598728333333334,
default = "mol/s",
link = "ポンドモル",
},
["lb-mol/s"] = {
name1 = "ポンドモル毎秒",
name1_us = "pound-mole per second",
name2_us = "pound-moles per second",
symbol = "lb‑mol/s",
utype = "モル率",
scale = 453.59237,
default = "kmol/s",
link = "ポンドモル",
},
["lbmol/d"] = {
name1 = "ポンドモル毎日",
name1_us = "pound-mole per day",
name2_us = "pound-moles per day",
symbol = "lbmol/d",
utype = "モル率",
scale = 0.0052499116898148141,
default = "mmol/s",
link = "ポンドモル",
},
["lbmol/h"] = {
name1 = "ポンドモル毎時",
name1_us = "pound-mole per hour",
name2_us = "pound-moles per hour",
symbol = "lbmol/h",
utype = "モル率",
scale = 0.12599788055555555,
default = "mol/s",
link = "ポンドモル",
},
["lbmol/min"] = {
name1 = "ポンドモル毎分",
name1_us = "pound-mole per minute",
name2_us = "pound-moles per minute",
symbol = "lbmol/min",
utype = "モル率",
scale = 7.5598728333333334,
default = "mol/s",
link = "ポンドモル",
},
["lbmol/s"] = {
name1 = "ポンドモル毎秒",
name1_us = "pound-mole per second",
name2_us = "pound-moles per second",
symbol = "lbmol/s",
utype = "モル率",
scale = 453.59237,
default = "kmol/s",
link = "ポンドモル",
},
["mmol/s"] = {
name1 = "ミリモル毎秒",
name1_us = "millimole per second",
name2_us = "millimoles per second",
symbol = "mmol/s",
utype = "モル率",
scale = 0.001,
default = "lb-mol/d",
link = "モル",
},
["mol/d"] = {
name1 = "モル毎日",
name1_us = "mole per day",
name2_us = "moles per day",
symbol = "mol/d",
utype = "モル率",
scale = 1.1574074074074073e-5,
default = "μmol/s",
link = "モル",
},
["mol/h"] = {
name1 = "モル毎時",
name1_us = "mole per hour",
name2_us = "moles per hour",
symbol = "mol/h",
utype = "モル率",
scale = 0.00027777777777777778,
default = "mmol/s",
link = "モル",
},
["mol/min"] = {
name1 = "モル毎分",
name1_us = "mole per minute",
name2_us = "moles per minute",
symbol = "mol/min",
utype = "モル率",
scale = 0.016666666666666666,
default = "mol/s",
link = "モル",
},
["mol/s"] = {
name1 = "モル毎秒",
name1_us = "mole per second",
name2_us = "moles per second",
symbol = "mol/s",
utype = "モル率",
scale = 1,
default = "lb-mol/min",
link = "モル",
},
["μmol/s"] = {
name1 = "マイクロモル毎秒",
name1_us = "micromole per second",
name2_us = "micromoles per second",
symbol = "μmol/s",
utype = "モル率",
scale = 0.000001,
default = "lb-mol/d",
link = "モル",
},
["umol/s"] = {
target = "μmol/s",
},
["/acre"] = {
name1 = "毎エーカー",
name1_us = "per acre",
symbol = "/acre",
utype = "単位面積当たり",
scale = 0.00024710538146716532,
default = "/ha",
link = "エーカー",
},
["/ha"] = {
name1 = "毎ヘクタール",
name1_us = "per hectare",
symbol = "/ha",
utype = "単位面積当たり",
scale = 100e-6,
default = "/acre",
link = "ヘクタール",
},
["/sqcm"] = {
name1 = "毎平方センチメートル",
name1_us = "per square centimeter",
symbol = "/cm<sup>2</sup>",
utype = "単位面積当たり",
scale = 1e4,
default = "/sqin",
link = "平方センチメートル",
},
["/sqin"] = {
name1 = "毎平方インチ",
name1_us = "per square inch",
symbol = "/in<sup>2</sup>",
utype = "単位面積当たり",
scale = 1550.0031000062002,
default = "/sqcm",
link = "平方インチ",
},
["/sqkm"] = {
name1 = "毎平方キロメートル",
name1_us = "per square kilometer",
symbol = "/km<sup>2</sup>",
utype = "単位面積当たり",
scale = 1e-6,
default = "/sqmi",
link = "平方キロメートル",
},
["/sqmi"] = {
name1 = "毎平方マイル",
name1_us = "per square mile",
symbol = "/sq mi",
utype = "単位面積当たり",
scale = 3.8610215854244582e-7,
default = "/sqkm",
link = "平方マイル",
},
["PD/acre"] = {
name1 = "人毎エーカー",
name1_us = "inhabitant per acre",
name2_us = "inhabitants per acre",
symbol = "/acre",
utype = "単位面積当たり",
scale = 0.00024710538146716532,
default = "PD/ha",
link = "エーカー",
},
["PD/ha"] = {
name1 = "人毎ヘクタール",
name1_us = "inhabitant per hectare",
name2_us = "inhabitants per hectare",
symbol = "/ha",
utype = "単位面積当たり",
scale = 100e-6,
default = "PD/acre",
link = "ヘクタール",
},
["PD/sqkm"] = {
name1 = "人毎平方キロメートル",
name1_us = "inhabitant per square kilometer",
name2_us = "inhabitants per square kilometer",
symbol = "/km<sup>2</sup>",
utype = "単位面積当たり",
scale = 1e-6,
default = "PD/sqmi",
link = "平方キロメートル",
},
["PD/sqmi"] = {
name1 = "人毎平方マイル",
name1_us = "inhabitant per square mile",
name2_us = "inhabitants per square mile",
symbol = "/sq mi",
utype = "単位面積当たり",
scale = 3.8610215854244582e-7,
default = "PD/sqkm",
link = "平方マイル",
},
["/cm2"] = {
target = "/sqcm",
},
["/in2"] = {
target = "/sqin",
},
["/km2"] = {
target = "/sqkm",
},
["pd/acre"] = {
target = "PD/acre",
},
["pd/ha"] = {
target = "PD/ha",
},
["PD/km2"] = {
target = "PD/sqkm",
},
["pd/km2"] = {
target = "PD/sqkm",
},
["PD/km²"] = {
target = "PD/sqkm",
},
["pd/sqkm"] = {
target = "PD/sqkm",
},
["pd/sqmi"] = {
target = "PD/sqmi",
},
["/l"] = {
name1 = "毎リットル",
name1_us = "per liter",
symbol = "/l",
utype = "単位体積当たり",
scale = 1000,
default = "/usgal",
link = "リットル",
},
["/USgal"] = {
name1 = "毎ガロン",
name1_us = "per gallon",
symbol = "/gal",
utype = "単位体積当たり",
scale = 264.172052,
default = "/l",
link = "米ガロン",
customary= 2,
},
["/usgal"] = {
target = "/USgal",
},
["bhp"] = {
name1 = "制動馬力",
name1_us = "brake horsepower",
symbol = "bhp",
utype = "仕事率",
scale = 745.69987158227022,
default = "kW",
link = "馬力#英馬力",
},
["Cal/d"] = {
name1 = "大カロリー毎日",
name1_us = "large calorie per day",
name2_us = "large calories per day",
symbol = "Cal/d",
utype = "仕事率",
scale = 0.048425925925925928,
default = "kJ/d",
link = "カロリー",
},
["Cal/h"] = {
name1 = "大カロリー毎時",
name1_us = "large calorie per hour",
name2_us = "large calories per hour",
symbol = "Cal/h",
utype = "仕事率",
scale = 1.1622222222222223,
default = "kJ/h",
link = "カロリー",
},
["cal/h"] = {
name1 = "カロリー毎時",
name1_us = "calorie per hour",
name2_us = "calories per hour",
symbol = "cal/h",
utype = "仕事率",
scale = 0.0011622222222222223,
default = "W",
link = "カロリー",
},
["CV"] = {
name1 = "仏馬力",
name1_us = "metric horsepower",
symbol = "CV",
utype = "仕事率",
scale = 735.49875,
default = "kW",
link = "馬力#仏馬力",
},
["hk"] = {
name1 = "仏馬力",
name1_us = "metric horsepower",
symbol = "hk",
utype = "仕事率",
scale = 735.49875,
default = "kW",
link = "馬力#仏馬力",
},
["hp"] = {
name1 = "馬力",
name1_us = "horsepower",
symbol = "hp",
utype = "仕事率",
scale = 745.69987158227022,
default = "kW",
},
["hp-electric"] = {
name1 = "電気馬力",
name1_us = "electric horsepower",
symbol = "hp",
utype = "仕事率",
scale = 746,
default = "kW",
},
["hp-electrical"] = {
name1 = "電気馬力",
name1_us = "electrical horsepower",
symbol = "hp",
utype = "仕事率",
scale = 746,
default = "kW",
},
["hp-metric"] = {
name1 = "仏馬力",
name1_us = "metric horsepower",
symbol = "hp",
utype = "仕事率",
scale = 735.49875,
default = "kW",
link = "馬力#仏馬力",
},
["ihp"] = {
name1 = "指示馬力",
name1_us = "indicated horsepower",
symbol = "ihp",
utype = "仕事率",
scale = 745.69987158227022,
default = "kW",
},
["kcal/h"] = {
name1 = "キロカロリー毎時",
name1_us = "kilocalorie per hour",
name2_us = "kilocalories per hour",
symbol = "kcal/h",
utype = "仕事率",
scale = 1.1622222222222223,
default = "kW",
link = "カロリー",
},
["kJ/d"] = {
name1 = "キロジュール毎日",
name1_us = "kilojoule per day",
name2_us = "kilojoules per day",
symbol = "kJ/d",
utype = "仕事率",
scale = 0.011574074074074073,
default = "Cal/d",
link = "キロジュール",
},
["kJ/h"] = {
name1 = "キロジュール毎時",
name1_us = "kilojoule per hour",
name2_us = "kilojoules per hour",
symbol = "kJ/h",
utype = "仕事率",
scale = 0.27777777777777779,
default = "W",
link = "キロジュール",
},
["PS"] = {
name1 = "仏馬力",
name1_us = "metric horsepower",
symbol = "PS",
utype = "仕事率",
scale = 735.49875,
default = "kW",
link = "馬力#仏馬力",
},
["shp"] = {
name1 = "軸馬力",
name1_us = "shaft horsepower",
symbol = "shp",
utype = "仕事率",
scale = 745.69987158227022,
default = "kW",
link = "馬力#英馬力",
},
["W"] = {
_name1 = "ワット",
_name1_us= "watt",
_symbol = "W",
utype = "仕事率",
scale = 1,
prefixes = 1,
default = "hp",
link = "ワット",
},
["BTU/h"] = {
per = { "BTU", "h" },
utype = "仕事率",
default = "W",
},
["Btu/h"] = {
per = { "Btu", "h" },
utype = "仕事率",
default = "W",
},
["BHP"] = {
target = "bhp",
},
["btu/h"] = {
target = "BTU/h",
},
["HP"] = {
target = "hp",
},
["Hp"] = {
target = "hp",
},
["hp-mechanical"] = {
target = "hp",
},
["IHP"] = {
target = "ihp",
},
["SHP"] = {
target = "shp",
},
["whp"] = {
target = "hp",
},
["hp/lb"] = {
name1 = "馬力毎ポンド",
name1_us = "horsepower per pound",
symbol = "hp/lb",
utype = "単位質量当たりの仕事率",
scale = 1643.986806,
default = "kW/kg",
link = "パワーウェイトレシオ",
},
["hp/LT"] = {
name1 = "馬力毎ロングトン",
name1_us = "horsepower per long ton",
symbol = "hp/LT",
utype = "単位質量当たりの仕事率",
scale = 0.73392268125000004,
default = "kW/t",
link = "パワーウェイトレシオ",
},
["hp/ST"] = {
name1 = "馬力毎ショートトン",
name1_us = "horsepower per short ton",
symbol = "hp/ST",
utype = "単位質量当たりの仕事率",
scale = 0.821993403,
default = "kW/t",
link = "パワーウェイトレシオ",
},
["hp/t"] = {
name1 = "馬力毎トン",
name1_us = "horsepower per tonne",
symbol = "hp/t",
utype = "単位質量当たりの仕事率",
scale = 0.74569987158227022,
default = "kW/t",
link = "パワーウェイトレシオ",
},
["kW/kg"] = {
name1 = "キロワット毎キログラム",
name1_us = "kilowatt per kilogram",
name2_us = "kilowatts per kilogram",
symbol = "kW/kg",
utype = "単位質量当たりの仕事率",
scale = 1000,
default = "hp/lb",
link = "パワーウェイトレシオ",
},
["kW/t"] = {
name1 = "キロワット毎トン",
name1_us = "kilowatt per tonne",
name2_us = "kilowatts per tonne",
symbol = "kW/t",
utype = "単位質量当たりの仕事率",
scale = 1,
default = "PS/t",
link = "パワーウェイトレシオ",
},
["PS/t"] = {
name1 = "仏馬力毎トン",
name1_us = "metric horsepower per tonne",
symbol = "PS/t",
utype = "単位質量当たりの仕事率",
scale = 0.73549875,
default = "kW/t",
link = "パワーウェイトレシオ",
},
["shp/lb"] = {
name1 = "軸馬力毎ポンド",
name1_us = "shaft horsepower per pound",
symbol = "shp/lb",
utype = "単位質量当たりの仕事率",
scale = 1643.986806,
default = "kW/kg",
link = "パワーウェイトレシオ",
},
["hp/tonne"] = {
target = "hp/t",
symbol = "hp/tonne",
default = "kW/tonne",
},
["kW/tonne"] = {
target = "kW/t",
symbol = "kW/tonne",
},
["-lb/in2"] = {
name1 = "ポンド毎平方インチ",
name1_us = "pound per square inch",
name2_us = "pounds per square inch",
symbol = "lb/in<sup>2</sup>",
utype = "圧力",
scale = 6894.7572931683608,
default = "kPa kgf/cm2",
link = "重量ポンド毎平方インチ",
},
["atm"] = {
name1 = "標準気圧",
name1_us = "standard atmosphere",
symbol = "atm",
utype = "圧力",
scale = 101325,
default = "kPa",
},
["Ba"] = {
name1 = "バリ",
name1_us = "barye",
symbol = "Ba",
utype = "圧力",
scale = 0.1,
default = "Pa",
link = "バリ (単位)",
},
["bar"] = {
name1 = "バール",
name1_us = "bar",
symbol = "bar",
utype = "圧力",
scale = 100000,
default = "kPa",
link = "バール (単位)",
},
["dbar"] = {
name1 = "デシバール",
name1_us = "decibar",
symbol = "dbar",
utype = "圧力",
scale = 10000,
default = "kPa",
link = "バール (単位)",
},
["inHg"] = {
name1 = "水銀柱インチ",
name1_us = "inch of mercury",
name2_us = "inches of mercury",
symbol = "inHg",
utype = "圧力",
scale = 3386.388640341,
default = "kPa",
},
["kBa"] = {
name1 = "キロバリ",
name1_us = "kilobarye",
symbol = "kBa",
utype = "圧力",
scale = 100,
default = "hPa",
link = "バリ (単位)",
},
["kg-f/cm2"] = {
name1 = "重量キログラム毎平方センチメートル",
name1_us = "kilogram-force per square centimeter",
name2_us = "kilograms-force per square centimeter",
symbol = "kg<sub>f</sub>/cm<sup>2</sup>",
utype = "圧力",
scale = 98066.5,
default = "psi",
link = "重量キログラム",
},
["kg/cm2"] = {
name1 = "キログラム毎平方センチメートル",
name1_us = "kilogram per square centimeter",
name2_us = "kilograms per square centimeter",
symbol = "kg/cm<sup>2</sup>",
utype = "圧力",
scale = 98066.5,
default = "psi",
link = "重量キログラム",
},
["kgf/cm2"] = {
name1 = "重量キログラム毎平方センチメートル",
name1_us = "kilogram-force per square centimeter",
name2_us = "kilograms-force per square centimeter",
symbol = "kgf/cm<sup>2</sup>",
utype = "圧力",
scale = 98066.5,
default = "psi",
link = "重量キログラム",
},
["ksi"] = {
name1 = "キロポンド毎平方インチ",
name1_us = "kilopound per square inch",
name2_us = "kilopounds per square inch",
symbol = "ksi",
utype = "圧力",
scale = 6894757.2931683613,
default = "MPa",
link = "Pound per square inch",
},
["lbf/in2"] = {
name1 = "重量キロポンド毎平方インチ",
name1_us = "pound-force per square inch",
name2_us = "pounds-force per square inch",
symbol = "lbf/in<sup>2</sup>",
utype = "圧力",
scale = 6894.7572931683608,
default = "kPa kgf/cm2",
link = "重量ポンド毎平方インチ",
},
["mb"] = {
name1 = "ミリバール",
name1_us = "millibar",
symbol = "mb",
utype = "圧力",
scale = 100,
default = "hPa",
link = "バール (単位)",
},
["mbar"] = {
name1 = "ミリバール",
name1_us = "millibar",
symbol = "mbar",
utype = "圧力",
scale = 100,
default = "hPa",
link = "バール (単位)",
},
["mmHg"] = {
name1 = "水銀柱ミリメートル",
name1_us = "millimeter of mercury",
name2_us = "millimeters of mercury",
symbol = "mmHg",
utype = "圧力",
scale = 133.322387415,
default = "kPa",
},
["Pa"] = {
_name1 = "パスカル",
_name1_us= "pascal",
_symbol = "Pa",
utype = "圧力",
scale = 1,
prefixes = 1,
default = "psi",
link = "パスカル (単位)",
},
["psf"] = {
name1 = "ポンド毎平方フート",
name1_us = "pound per square foot",
name2_us = "pounds per square foot",
symbol = "psf",
utype = "圧力",
scale = 47.880258980335839,
default = "kPa",
link = "重量ポンド毎平方インチ",
},
["psi"] = {
name1 = "ポンド毎平方インチ",
name1_us = "pound per square inch",
name2_us = "pounds per square inch",
symbol = "psi",
utype = "圧力",
scale = 6894.7572931683608,
default = "kPa",
link = "重量ポンド毎平方インチ",
},
["Torr"] = {
name1 = "トル",
name1_us = "torr",
symbol = "Torr",
utype = "圧力",
scale = 133.32236842105263,
default = "kPa",
},
["N/cm2"] = {
per = { "N", "cm2" },
utype = "圧力",
default = "psi",
},
["N/m2"] = {
per = { "N", "m2" },
utype = "圧力",
default = "psi",
},
["g/cm2"] = {
per = { "g", "cm2" },
utype = "圧力",
default = "lb/sqft",
multiplier= 9.80665,
},
["g/m2"] = {
per = { "g", "m2" },
utype = "圧力",
default = "lb/sqft",
multiplier= 9.80665,
},
["kg/ha"] = {
per = { "kg", "ha" },
utype = "圧力",
default = "lb/acre",
multiplier= 9.80665,
},
["kg/m2"] = {
per = { "kg", "m2" },
utype = "圧力",
default = "lb/sqft",
multiplier= 9.80665,
},
["lb/1000sqft"] = {
per = { "lb", "1000sqft" },
utype = "圧力",
default = "g/m2",
multiplier= 9.80665,
},
["lb/acre"] = {
per = { "lb", "acre" },
utype = "圧力",
default = "kg/ha",
multiplier= 9.80665,
},
["lb/sqft"] = {
per = { "lb", "sqft" },
utype = "圧力",
default = "kg/m2",
multiplier= 9.80665,
},
["lb/sqyd"] = {
per = { "lb", "sqyd" },
utype = "圧力",
default = "kg/m2",
multiplier= 9.80665,
},
["LT/acre"] = {
per = { "LT", "acre" },
utype = "圧力",
default = "t/ha",
multiplier= 9.80665,
},
["MT/ha"] = {
per = { "MT", "ha" },
utype = "圧力",
default = "LT/acre ST/acre",
multiplier= 9.80665,
},
["oz/sqft"] = {
per = { "oz", "sqft" },
utype = "圧力",
default = "g/m2",
multiplier= 9.80665,
},
["oz/sqyd"] = {
per = { "oz", "sqyd" },
utype = "圧力",
default = "g/m2",
multiplier= 9.80665,
},
["ST/acre"] = {
per = { "ST", "acre" },
utype = "圧力",
default = "t/ha",
multiplier= 9.80665,
},
["t/ha"] = {
per = { "t", "ha" },
utype = "圧力",
default = "LT/acre ST/acre",
multiplier= 9.80665,
},
["tonne/acre"] = {
per = { "tonne", "acre" },
utype = "圧力",
default = "tonne/ha",
multiplier= 9.80665,
},
["tonne/ha"] = {
per = { "tonne", "ha" },
utype = "圧力",
default = "tonne/acre",
multiplier= 9.80665,
},
["kgfpsqcm"] = {
target = "kgf/cm2",
},
["kgpsqcm"] = {
target = "kg/cm2",
},
["kN/m2"] = {
target = "kPa",
},
["lb/in2"] = {
target = "lbf/in2",
},
["torr"] = {
target = "Torr",
},
["Bq"] = {
_name1 = "ベクレル",
_name1_us= "becquerel",
_symbol = "Bq",
utype = "放射能",
scale = 1,
prefixes = 1,
default = "pCi",
link = "ベクレル",
},
["Ci"] = {
_name1 = "キュリー",
_name1_us= "curie",
_symbol = "Ci",
utype = "放射能",
scale = 3.7e10,
prefixes = 1,
default = "GBq",
link = "キュリー",
},
["Rd"] = {
_name1 = "ラザフォード",
_name1_us= "rutherford",
_symbol = "Rd",
utype = "放射能",
scale = 1e6,
prefixes = 1,
default = "MBq",
link = "ラザフォード (単位)",
},
["cm/h"] = {
name1 = "センチメートル毎時",
name1_us = "centimeter per hour",
name2_us = "centimeters per hour",
symbol = "cm/h",
utype = "速さ",
scale = 2.7777777777777775e-6,
default = "in/h",
link = "メートル毎秒",
},
["cm/s"] = {
name1 = "センチメートル毎秒",
name1_us = "centimeter per second",
name2_us = "centimeters per second",
symbol = "cm/s",
utype = "速さ",
scale = 0.01,
default = "in/s",
link = "メートル毎秒",
},
["cm/year"] = {
name1 = "センチメートル毎年",
name1_us = "centimeter per year",
name2_us = "centimeters per year",
symbol = "cm/year",
utype = "速さ",
scale = 3.168873850681143e-10,
default = "in/year",
link = "速さの比較",
},
["foot/s"] = {
name1 = "フート毎秒",
name1_us = "foot per second",
symbol = "ft/s",
utype = "速さ",
scale = 0.3048,
default = "m/s",
link = "フィート毎秒",
},
["ft/min"] = {
name1 = "フート毎分",
name1_us = "foot per minute",
name2 = "フィート毎分",
name2_us = "feet per minute",
symbol = "ft/min",
utype = "速さ",
scale = 0.00508,
default = "m/min",
link = "フィート毎秒",
},
["ft/s"] = {
name1 = "フート毎秒",
name1_us = "foot per second",
name2 = "フィート毎秒",
name2_us = "feet per second",
symbol = "ft/s",
utype = "速さ",
scale = 0.3048,
default = "m/s",
link = "フィート毎秒",
},
["furlong per fortnight"] = {
name1 = "ハロン毎フォートナイト",
name1_us = "furlong per fortnight",
name2_us = "furlongs per fortnight",
symbol = "furlong per fortnight",
usename = 1,
utype = "速さ",
scale = 0.00016630952380952381,
default = "km/h mph",
link = "FFFシステム",
},
["in/h"] = {
name1 = "インチ毎時",
name1_us = "inch per hour",
name2_us = "inches per hour",
symbol = "in/h",
utype = "速さ",
scale = 7.0555555555555559e-6,
default = "cm/h",
link = "インチ",
},
["in/s"] = {
name1 = "インチ毎秒",
name1_us = "inch per second",
name2_us = "inches per second",
symbol = "in/s",
utype = "速さ",
scale = 0.0254,
default = "cm/s",
link = "インチ",
},
["in/year"] = {
name1 = "インチ毎年",
name1_us = "inch per year",
name2_us = "inches per year",
symbol = "in/year",
utype = "速さ",
scale = 8.0489395807301024e-10,
default = "cm/year",
link = "速さの比較",
},
["isp"] = {
name1 = "秒",
name1_us = "second",
symbol = "s",
utype = "速さ",
scale = 9.80665,
default = "km/s",
link = "比推力",
},
["km/d"] = {
name1 = "キロメートル毎日",
name1_us = "kilometer per day",
name2_us = "kilometers per day",
symbol = "km/d",
utype = "速さ",
scale = 1.1574074074074074e-2,
default = "mi/d",
link = "速さの比較",
},
["km/h"] = {
name1 = "キロメートル毎時",
name1_us = "kilometer per hour",
name2_us = "kilometers per hour",
symbol = "km/h",
utype = "速さ",
scale = 0.27777777777777779,
default = "mph",
},
["km/s"] = {
name1 = "キロメートル毎秒",
name1_us = "kilometer per second",
name2_us = "kilometers per second",
symbol = "km/s",
utype = "速さ",
scale = 1000,
default = "mi/s",
link = "メートル毎秒",
},
["kn"] = {
name1 = "ノット",
name1_us = "knot",
symbol = "kn",
utype = "速さ",
scale = 0.51444444444444448,
default = "km/h mph",
},
["kNs/kg"] = {
symbol = "kN‑s/kg",
utype = "速さ",
scale = 1000,
default = "isp",
link = "比推力",
},
["m/min"] = {
name1 = "メートル毎分",
name1_us = "meter per minute",
name2_us = "meters per minute",
symbol = "m/min",
utype = "速さ",
scale = 0.016666666666666666,
default = "ft/min",
link = "メートル毎秒",
},
["m/s"] = {
name1 = "メートル毎秒",
name1_us = "meter per second",
name2_us = "meters per second",
symbol = "m/s",
utype = "速さ",
scale = 1,
default = "ft/s",
},
["Mach"] = {
name1 = "マッハ",
name1_us = "Mach",
symbol = "Mach",
utype = "速さ",
builtin = "mach",
scale = 0,
iscomplex= true,
default = "km/h mph",
link = "マッハ数",
},
["mi/d"] = {
name1 = "マイル毎日",
name1_us = "mile per day",
name2_us = "miles per day",
symbol = "mi/d",
utype = "速さ",
scale = 1.8626666666666667e-2,
default = "km/d",
link = "速さの比較",
},
["mi/s"] = {
name1 = "マイル毎秒",
name1_us = "mile per second",
name2_us = "miles per second",
symbol = "mi/s",
utype = "速さ",
scale = 1609.344,
default = "km/s",
link = "マイル",
},
["mm/h"] = {
name1 = "ミリメートル毎時",
name1_us = "millimeter per hour",
name2_us = "millimeters per hour",
symbol = "mm/h",
utype = "速さ",
scale = 2.7777777777777781e-7,
default = "in/h",
link = "メートル毎秒",
},
["mph"] = {
name1 = "マイル毎時",
name1_us = "mile per hour",
name2_us = "miles per hour",
symbol = "mph",
utype = "速さ",
scale = 0.44704,
default = "km/h",
},
["Ns/kg"] = {
symbol = "N‑s/kg",
utype = "速さ",
scale = 1,
default = "isp",
link = "比推力",
},
["si tsfc"] = {
symbol = "g/(kN⋅s)",
utype = "速さ",
scale = 9.9999628621379242e-7,
invert = -1,
iscomplex= true,
default = "tsfc",
link = "燃料消費率",
},
["tsfc"] = {
symbol = "lb/(lbf⋅h)",
utype = "速さ",
scale = 2.832545036049801e-5,
invert = -1,
iscomplex= true,
default = "si tsfc",
link = "燃料消費率",
},
["cm/y"] = {
target = "cm/year",
},
["cm/yr"] = {
target = "cm/year",
},
["in/y"] = {
target = "in/year",
},
["in/yr"] = {
target = "in/year",
},
["knot"] = {
target = "kn",
},
["knots"] = {
target = "kn",
},
["kph"] = {
target = "km/h",
},
["mi/h"] = {
target = "mph",
},
["mm/s"] = {
per = { "mm", "s" },
utype = "速さ",
default = "in/s",
link = "メートル毎秒",
},
["C"] = {
name1 = "摂氏度",
name1_us = "degree Celsius",
name2_us = "degrees Celsius",
symbol = "°C",
usesymbol= 1,
utype = "温度",
scale = 1,
offset = -273.15,
iscomplex= true,
istemperature= true,
default = "F",
link = "セルシウス度",
},
["F"] = {
name1 = "華氏度",
name1_us = "degree Fahrenheit",
name2_us = "degrees Fahrenheit",
symbol = "°F",
usesymbol= 1,
utype = "温度",
scale = 0.55555555555555558,
offset = 32-273.15*(9/5),
iscomplex= true,
istemperature= true,
default = "C",
link = "華氏",
},
["K"] = {
_name1 = "ケルビン",
_name1_us= "kelvin",
_symbol = "K",
usesymbol= 1,
utype = "温度",
scale = 1,
offset = 0,
iscomplex= true,
istemperature= true,
prefixes = 1,
default = "C F",
link = "ケルビン",
},
["keVT"] = {
name1 = "キロ電子ボルト",
name1_us = "kiloelectronvolt",
symbol = "keV",
utype = "温度",
scale = 11.604505e6,
offset = 0,
iscomplex= true,
default = "MK",
link = "電子ボルト",
},
["R"] = {
name1 = "蘭氏度",
name1_us = "degree Rankine",
name2_us = "degrees Rankine",
symbol = "°R",
usesymbol= 1,
utype = "温度",
scale = 0.55555555555555558,
offset = 0,
iscomplex= true,
istemperature= true,
default = "K F C",
link = "ランキン度",
},
["Celsius"] = {
target = "C",
},
["°C"] = {
target = "C",
},
["°F"] = {
target = "F",
},
["°R"] = {
target = "R",
},
["C-change"] = {
name1 = "摂氏度の変動",
name1_us = "degree Celsius change",
name2_us = "degrees Celsius change",
symbol = "°C",
usesymbol= 1,
utype = "温度の変化",
scale = 1,
default = "F-change",
link = "セルシウス度",
},
["F-change"] = {
name1 = "華氏度の変動",
name1_us = "degree Fahrenheit change",
name2_us = "degrees Fahrenheit change",
symbol = "°F",
usesymbol= 1,
utype = "温度の変化",
scale = 0.55555555555555558,
default = "C-change",
link = "華氏",
},
["K-change"] = {
name1 = "ケルビンの変動",
name1_us = "kelvin change",
name2_us = "kelvins change",
symbol = "K",
usesymbol= 1,
utype = "温度の変化",
scale = 1,
default = "F-change",
link = "ケルビン",
},
["°C-change"] = {
target = "C-change",
},
["°F-change"] = {
target = "F-change",
},
["century"] = {
name1 = "世紀",
name1_us = "century",
name2_us = "centuries",
symbol = "ha",
utype = "時間",
scale = 3155760000,
default = "Gs",
},
["d"] = {
name1 = "日",
name1_us = "day",
symbol = "d",
utype = "時間",
scale = 86400,
default = "ks",
link = "日#時間の単位としての日",
},
["decade"] = {
name1 = "十年紀",
name1_us = "decade",
symbol = "daa",
utype = "時間",
scale = 315576000,
default = "Ms",
},
["dog year"] = {
name1 = "ドッグイヤー",
name1_us = "dog year",
symbol = "dog yr",
utype = "時間",
scale = 220903200,
default = "years",
},
["fortnight"] = {
name1 = "フォートナイト",
name1_us = "fortnight",
symbol = "fortnight",
usename = 1,
utype = "時間",
scale = 1209600,
default = "week",
link = "半月 (期間)#2週間(14日)",
},
["h"] = {
name1 = "時間",
name1_us = "hour",
symbol = "h",
utype = "時間",
scale = 3600,
default = "ks",
link = "時間 (単位)",
},
["long billion year"] = {
name1 = "兆年",
name1_us = "billion years",
symbol = "Ta",
utype = "時間",
scale = 31557600000000000000,
default = "Es",
link = "年",
},
["millennium"] = {
name1 = "千年",
name1_us = "millennium",
name2_us = "millennia",
symbol = "ka",
utype = "時間",
scale = 31557600000,
default = "Gs",
link = "ミレニアム",
},
["milliard year"] = {
name1 = "十億年",
name1_us = "milliard years",
symbol = "Ga",
utype = "時間",
scale = 31557600000000000,
default = "Ps",
link = "年",
},
["million year"] = {
name1 = "百万年",
name1_us = "million years",
symbol = "Ma",
utype = "時間",
scale = 31557600000000,
default = "Ts",
link = "年",
},
["min"] = {
name1 = "分",
name1_us = "minute",
symbol = "min",
utype = "時間",
scale = 60,
default = "s",
},
["month"] = {
name1 = "か月",
name1_us = "month",
symbol = "month",
usename = 1,
utype = "時間",
scale = 2629800,
default = "Ms",
link = "月 (暦)",
},
["months"] = {
name1 = "か月",
name1_us = "month",
symbol = "mo",
utype = "時間",
scale = 2629800,
default = "year",
link = "月 (暦)",
},
["s"] = {
_name1 = "秒",
_name1_us= "second",
_symbol = "s",
utype = "時間",
scale = 1,
prefixes = 1,
default = "min",
link = "秒",
},
["short billion year"] = {
name1 = "十億年",
name1_us = "billion years",
symbol = "Ga",
utype = "時間",
scale = 31557600000000000,
default = "Ps",
link = "年",
},
["short trillion year"] = {
name1 = "兆年",
name1_us = "trillion years",
symbol = "Ta",
utype = "時間",
scale = 31557600000000000000,
default = "Es",
link = "年",
},
["thousand million year"] = {
name1 = "十億年",
name1_us = "thousand million years",
symbol = "Ga",
utype = "時間",
scale = 31557600000000000,
default = "Ps",
link = "年",
},
["wk"] = {
name1 = "週",
name1_us = "week",
symbol = "week",
usename = 1,
utype = "時間",
scale = 604800,
default = "Ms",
},
["year"] = {
name1 = "年",
name1_us = "year",
symbol = "a",
utype = "時間",
scale = 31557600,
default = "Ms",
},
["years"] = {
name1 = "年",
name1_us = "year",
symbol = "yr",
utype = "時間",
scale = 31557600,
default = "Ms",
},
["byr"] = {
target = "short billion year",
},
["day"] = {
target = "d",
},
["days"] = {
target = "d",
},
["dog yr"] = {
target = "dog year",
},
["Gyr"] = {
target = "thousand million year",
},
["hour"] = {
target = "h",
},
["hours"] = {
target = "h",
},
["kMyr"] = {
target = "thousand million year",
},
["kmyr"] = {
target = "thousand million year",
},
["kyr"] = {
target = "millennium",
},
["long byr"] = {
target = "long billion year",
},
["minute"] = {
target = "min",
},
["minutes"] = {
target = "min",
},
["mth"] = {
target = "month",
},
["Myr"] = {
target = "million year",
},
["myr"] = {
target = "million year",
},
["second"] = {
target = "s",
},
["seconds"] = {
target = "s",
},
["tmyr"] = {
target = "thousand million year",
},
["tryr"] = {
target = "short trillion year",
},
["tyr"] = {
target = "millennium",
},
["week"] = {
target = "wk",
},
["weeks"] = {
target = "wk",
},
["yr"] = {
target = "year",
},
["kg.m"] = {
name1 = "キログラム・メートル",
name1_us = "kilogram meter",
symbol = "kg⋅m",
utype = "トルク",
scale = 9.80665,
default = "Nm lbft",
link = "トルク",
},
["kgf.m"] = {
name1 = "キログラム・メートル",
name1_us = "kilogram force-meter",
symbol = "kgf⋅m",
utype = "トルク",
scale = 9.80665,
default = "Nm lbfft",
link = "トルク",
},
["kgm"] = {
name1 = "キログラム・メートル",
name1_us = "kilogram meter",
symbol = "kg⋅m",
utype = "トルク",
scale = 9.80665,
default = "Nm lbfft",
link = "トルク",
},
["kpm"] = {
name1 = "キロポンド・メートル",
name1_us = "kilopond meter",
symbol = "kp⋅m",
utype = "トルク",
scale = 9.80665,
default = "Nm lbft",
link = "トルク",
},
["lb-fft"] = {
name1 = "ポンド・フート",
name1_us = "pound force-foot",
name2 = "ポンド・フィート",
name2_us = "pound force-feet",
symbol = "ft⋅lb<sub>f</sub>",
utype = "トルク",
scale = 1.3558179483314004,
default = "Nm",
link = "ポンド・フィート",
},
["lb.ft"] = {
name1 = "ポンド・フート",
name1_us = "pound force-foot",
name2 = "ポンド・フィート",
name2_us = "pound force-feet",
symbol = "lb⋅ft",
utype = "トルク",
scale = 1.3558179483314004,
default = "Nm",
link = "ポンド・フィート",
},
["lb.in"] = {
name1 = "ポンド・インチ",
name1_us = "pound force-inch",
symbol = "lb⋅in",
utype = "トルク",
scale = 0.1129848290276167,
default = "mN.m",
link = "ポンド・フィート",
},
["lbfft"] = {
name1 = "ポンド・フート",
name1_us = "pound force-foot",
name2 = "ポンド・フィート",
name2_us = "pound force-feet",
symbol = "lbf⋅ft",
utype = "トルク",
scale = 1.3558179483314004,
default = "Nm",
link = "ポンド・フィート",
},
["lbft"] = {
name1 = "ポンド・フート",
name1_us = "pound-foot",
name2 = "ポンド・フィート",
name2_us = "pound-feet",
symbol = "lb⋅ft",
utype = "トルク",
scale = 1.3558179483314004,
default = "Nm",
link = "ポンド・フィート",
},
["m.kg-f"] = {
name1 = "メートル重量キログラム",
name1_us = "meter kilogram-force",
name2_us = "meter kilograms-force",
symbol = "m⋅kg<sub>f</sub>",
utype = "トルク",
scale = 9.80665,
default = "Nm lbfft",
link = "トルク",
},
["m.kgf"] = {
name1 = "メートル重量キログラム",
name1_us = "meter kilogram-force",
name2_us = "meter kilograms-force",
symbol = "m⋅kgf",
utype = "トルク",
scale = 9.80665,
default = "Nm lbfft",
link = "トルク",
},
["mN.m"] = {
name1 = "ミリニュートンメートル",
name1_us = "millinewton-meter",
symbol = "mN⋅m",
utype = "トルク",
scale = 0.001,
default = "lb.in",
link = "ニュートンメートル",
},
["Nm"] = {
_name1 = "ニュートンメートル",
_name1_us= "newton-meter",
_symbol = "N⋅m",
utype = "トルク",
alttype = "エネルギー",
scale = 1,
prefixes = 1,
default = "lbfft",
link = "ニュートンメートル",
},
["kN/m"] = {
per = { "kN", "-m-stiff" },
utype = "トルク",
default = "lbf/in",
},
["lbf/in"] = {
per = { "lbf", "-in-stiff" },
utype = "トルク",
default = "kN/m",
},
["lb-f.ft"] = {
target = "lb-fft",
},
["lbf.ft"] = {
target = "lbfft",
},
["lbf·ft"] = {
target = "lbfft",
},
["lb·ft"] = {
target = "lb.ft",
},
["mkg-f"] = {
target = "m.kg-f",
},
["mkgf"] = {
target = "m.kgf",
},
["N.m"] = {
target = "Nm",
},
["N·m"] = {
target = "Nm",
},
["ton-mile"] = {
name1 = "トンマイル",
name1_us = "ton-mile",
symbol = "ton-mile",
usename = 1,
utype = "貨物輸送",
scale = 1.4599723182105602,
default = "tkm",
link = "輸送量の単位",
},
["tkm"] = {
name1 = "トンキロ",
name1_us = "tonne-kilometer",
symbol = "tkm",
utype = "貨物輸送",
scale = 1,
default = "ton-mile",
link = "輸送量の単位",
},
["-12USoz(mL)serve"] = {
name1 = "缶分の12米液量オンス缶",
name1_us = "12 U.S. fl oz (355 mL) serving",
symbol = "12 US fl oz (355 mL) serving",
sym_us = "12 U.S. fl oz (355 mL) serving",
utype = "体積",
scale = 0.00035488235475000004,
default = "mL",
link = "飲料缶",
},
["-12USoz(ml)serve"] = {
name1 = "缶分の12米液量オンス缶",
name1_us = "12 U.S. fl oz (355 ml) serving",
symbol = "12 US fl oz (355 ml) serving",
sym_us = "12 U.S. fl oz (355 ml) serving",
utype = "体積",
scale = 0.00035488235475000004,
default = "ml",
link = "飲料缶",
},
["-12USozserve"] = {
name1 = "缶分の12米液量オンス缶",
name1_us = "12 U.S. fl oz serving",
symbol = "12 US fl oz serving",
sym_us = "12 U.S. fl oz serving",
utype = "体積",
scale = 0.00035488235475000004,
default = "mL",
link = "飲料缶",
},
["acre-foot"] = {
name1 = "エーカー・フート",
name1_us = "acre-foot",
symbol = "acre⋅ft",
utype = "体積",
scale = 1233.48183754752,
default = "m3",
link = "エーカー・フィート",
},
["acre-ft"] = {
name1 = "エーカー・フート",
name1_us = "acre-foot",
name2 = "エーカー・フィート",
name2_us = "acre-feet",
symbol = "acre⋅ft",
utype = "体積",
scale = 1233.48183754752,
default = "m3",
link = "エーカー・フィート",
},
["AUtbsp"] = {
name1 = "オーストラリア・テーブルスプーン",
name1_us = "Australian tablespoon",
symbol = "AU tbsp",
utype = "体積",
scale = 0.000020,
default = "ml",
link = "テーブルスプーン",
},
["Bcuft"] = {
name1 = "十億立方フィート",
name1_us = "billion cubic foot",
name2_us = "billion cubic feet",
symbol = "billion cu ft",
utype = "体積",
scale = 28316846.592,
default = "Gl",
link = "立方フィート",
},
["bdft"] = {
name1 = "ボードフート",
name1_us = "board foot",
name2 = "ボードフィート",
name2_us = "board feet",
symbol = "bd ft",
utype = "体積",
scale = 0.0023597372167,
default = "m3",
link = "ボードフィート",
},
["board feet"] = {
name1 = "ボードフート",
name1_us = "board foot",
name2 = "ボードフィート",
name2_us = "board feet",
symbol = "board foot",
usename = 1,
utype = "体積",
scale = 0.0023597372167,
default = "m3",
link = "ボードフィート",
},
["board foot"] = {
name1 = "ボードフート",
name1_us = "board foot",
symbol = "board foot",
usename = 1,
utype = "体積",
scale = 0.0023597372167,
default = "m3",
link = "ボードフィート",
},
["cc"] = {
name1 = "立方センチメートル",
name1_us = "cubic centimeter",
symbol = "cc",
utype = "体積",
scale = 0.000001,
default = "cuin",
},
["CID"] = {
name1 = "立方インチ",
name1_us = "cubic inch",
name2_us = "cubic inches",
symbol = "cu in",
utype = "体積",
scale = 0.000016387064,
default = "cc",
link = "排気量",
},
["cord"] = {
name1 = "コード",
name1_us = "cord",
symbol = "cord",
utype = "体積",
scale = 3.624556363776,
default = "m3",
link = "コード (単位)",
},
["cufoot"] = {
name1 = "立方フート",
name1_us = "cubic foot",
symbol = "cu ft",
utype = "体積",
scale = 0.028316846592,
default = "m3",
link = "立方フィート",
},
["cuft"] = {
name1 = "立方フート",
name1_us = "cubic foot",
name2 = "立方フィート",
name2_us = "cubic feet",
symbol = "cu ft",
utype = "体積",
scale = 0.028316846592,
default = "m3",
link = "立方フィート",
},
["cuin"] = {
name1 = "立方インチ",
name1_us = "cubic inch",
name2_us = "cubic inches",
symbol = "cu in",
utype = "体積",
scale = 0.000016387064,
default = "cm3",
},
["cumi"] = {
name1 = "立方マイル",
name1_us = "cubic mile",
symbol = "cu mi",
utype = "体積",
scale = 4168181825.440579584,
default = "km3",
},
["cuyd"] = {
name1 = "立方ヤード",
name1_us = "cubic yard",
symbol = "cu yd",
utype = "体積",
scale = 0.764554857984,
default = "m3",
},
["firkin"] = {
name1 = "ファーキン",
name1_us = "firkin",
symbol = "firkin",
usename = 1,
utype = "体積",
scale = 0.04091481,
default = "l impgal USgal",
link = "ファーキン (単位)",
},
["foot3"] = {
target = "cufoot",
},
["Goilbbl"] = {
name1 = "十億バレル",
name1_us = "billion barrels",
symbol = "Gbbl",
utype = "体積",
scale = 158987294.928,
default = "v * 1.58987294928 < 10 ! e6 ! e9 ! m3",
link = "バレル#石油",
},
["gr water"] = {
name1 = "グレーン分の水",
name1_us = "grains water",
symbol = "gr H<sub>2</sub>O",
utype = "体積",
scale = 0.00000006479891,
default = "cm3",
link = "グレーン",
},
["grt"] = {
name1 = "総登録トン数",
name1_us = "gross register ton",
symbol = "grt",
utype = "体積",
scale = 2.8316846592,
default = "m3",
},
["impbbl"] = {
name1 = "英バレル",
name1_us = "imperial barrel",
symbol = "imp bbl",
utype = "体積",
scale = 0.16365924,
default = "l impgal USgal",
link = "バレル",
},
["impbsh"] = {
name1 = "英ブッシェル",
name1_us = "imperial bushel",
symbol = "imp bsh",
utype = "体積",
scale = 0.03636872,
default = "l impgal USdrygal",
link = "ブッシェル",
},
["impbu"] = {
name1 = "英ブッシェル",
name1_us = "imperial bushel",
symbol = "imp bu",
utype = "体積",
scale = 0.03636872,
default = "m3",
link = "ブッシェル",
},
["impgal"] = {
name1 = "英ガロン",
name1_us = "imperial gallon",
symbol = "imp gal",
utype = "体積",
scale = 0.00454609,
default = "l USgal",
},
["impgi"] = {
name1 = "ジル",
name1_us = "gill",
symbol = "gi",
utype = "体積",
scale = 0.0001420653125,
default = "ml USoz",
link = "ジル (単位)",
},
["impkenning"] = {
name1 = "ケニング",
name1_us = "imperial kenning",
symbol = "kenning",
utype = "体積",
scale = 0.01818436,
default = "l USdrygal",
link = "帝国単位",
},
["impoz"] = {
name1 = "英液量オンス",
name1_us = "imperial fluid ounce",
symbol = "imp fl oz",
utype = "体積",
scale = 0.0000284130625,
default = "ml USoz",
link = "液量オンス",
},
["imppk"] = {
name1 = "英ペック",
name1_us = "imperial peck",
symbol = "pk",
utype = "体積",
scale = 0.00909218,
default = "l USdrygal",
link = "ペック",
},
["imppt"] = {
name1 = "英パイント",
name1_us = "imperial pint",
symbol = "imp pt",
utype = "体積",
scale = 0.00056826125,
default = "l",
},
["impqt"] = {
name1 = "英クォート",
name1_us = "imperial quart",
symbol = "imp qt",
utype = "体積",
scale = 0.0011365225,
default = "ml USoz",
customary= 3,
},
["kilderkin"] = {
name1 = "キルダーキン",
name1_us = "kilderkin",
symbol = "kilderkin",
usename = 1,
utype = "体積",
scale = 0.08182962,
default = "l impgal USgal",
},
["koilbbl"] = {
name1 = "千バレル",
name1_us = "thousand barrels",
symbol = "kbbl",
utype = "体積",
scale = 158.987294928,
default = "v * 1.58987294928 < 10 ! ! e3 ! m3",
link = "バレル#石油",
},
["L"] = {
_name1 = "リットル",
_name1_us= "liter",
_symbol = "L",
utype = "体積",
scale = 0.001,
prefixes = 1,
default = "impgal USgal",
link = "リットル",
},
["l"] = {
_name1 = "リットル",
_name1_us= "liter",
_symbol = "l",
utype = "体積",
scale = 0.001,
prefixes = 1,
default = "impgal USgal",
link = "リットル",
},
["m3"] = {
_name1 = "立方メートル",
_name1_us= "cubic meter",
_symbol = "m<sup>3</sup>",
prefix_position= 7,
utype = "体積",
scale = 1,
prefixes = 3,
default = "cuft",
link = "立方メートル",
},
["Mbbl"] = {
name1 = "千バレル",
name1_us = "thousand barrels",
symbol = "Mbbl",
utype = "体積",
scale = 158.987294928,
default = "v * 1.58987294928 < 10 ! e3 ! ! m3",
link = "バレル#石油",
},
["MMoilbbl"] = {
name1 = "百万バレル",
name1_us = "million barrels",
symbol = "MMbbl",
utype = "体積",
scale = 158987.294928,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3",
link = "バレル#石油",
},
["Moilbbl"] = {
name1 = "百万バレル",
name1_us = "million barrels",
symbol = "Mbbl",
utype = "体積",
scale = 158987.294928,
default = "v * 1.58987294928 < 10 ! e3 ! e6 ! m3",
link = "バレル#石油",
},
["MTON"] = {
name1 = "容積トン",
name1_us = "measurement ton",
symbol = "MTON",
utype = "体積",
scale = 1.13267386368,
default = "m3",
},
["MUSgal"] = {
name1 = "百万米ガロン",
name1_us = "million U.S. gallons",
symbol = "million US gal",
sym_us = "million U.S. gal",
utype = "体積",
scale = 3785.411784,
default = "Ml",
link = "米ガロン",
},
["oilbbl"] = {
name1 = "バレル",
name1_us = "barrel",
symbol = "bbl",
utype = "体積",
scale = 0.158987294928,
default = "m3",
link = "バレル#石油",
},
["stere"] = {
name1 = "ステール",
name1_us = "stere",
symbol = "stere",
usename = 1,
utype = "体積",
scale = 1,
default = "cuft",
},
["Toilbbl"] = {
name1 = "兆バレル",
name1_us = "trillion barrels",
symbol = "Tbbl",
utype = "体積",
scale = 158987294928,
default = "v * 1.58987294928 < 10 ! e9 ! e12 ! m3",
link = "バレル#石油",
},
["USbbl"] = {
name1 = "米バレル",
name1_us = "U.S. barrel",
symbol = "US bbl",
sym_us = "U.S. bbl",
utype = "体積",
scale = 0.119240471196,
default = "l USgal impgal",
link = "バレル",
},
["USbeerbbl"] = {
name1 = "米ビール・バレル",
name1_us = "U.S. beer barrel",
symbol = "US bbl",
sym_us = "U.S. bbl",
utype = "体積",
scale = 0.117347765304,
default = "l USgal impgal",
link = "バレル",
},
["USbsh"] = {
name1 = "米ブッシェル",
name1_us = "U.S. bushel",
symbol = "US bsh",
sym_us = "U.S. bsh",
utype = "体積",
scale = 0.03523907016688,
default = "l USdrygal impgal",
link = "ブッシェル",
},
["USbu"] = {
name1 = "米ブッシェル",
name1_us = "U.S. bushel",
symbol = "US bu",
sym_us = "U.S. bu",
utype = "体積",
scale = 0.03523907016688,
default = "l USdrygal impgal",
link = "ブッシェル",
},
["USdrybbl"] = {
name1 = "米乾量バレル",
name1_us = "U.S. dry barrel",
symbol = "US dry bbl",
sym_us = "U.S. dry bbl",
utype = "体積",
scale = 0.11562819898508,
default = "m3",
link = "バレル",
},
["USdrygal"] = {
name1 = "米乾量ガロン",
name1_us = "U.S. dry gallon",
symbol = "US dry gal",
sym_us = "U.S. dry gal",
utype = "体積",
scale = 0.00440488377086,
default = "l",
link = "ガロン",
},
["USdrypt"] = {
name1 = "米乾量パイント",
name1_us = "U.S. dry pint",
symbol = "US dry pt",
sym_us = "U.S. dry pt",
utype = "体積",
scale = 0.0005506104713575,
default = "ml",
link = "パイント",
},
["USdryqt"] = {
name1 = "米乾量クォート",
name1_us = "U.S. dry quart",
symbol = "US dry qt",
sym_us = "U.S. dry qt",
utype = "体積",
scale = 0.001101220942715,
default = "ml",
link = "クォート",
},
["USflgal"] = {
name1 = "米ガロン",
name1_us = "U.S. gallon",
symbol = "US fl gal",
sym_us = "U.S. fl gal",
utype = "体積",
scale = 0.003785411784,
default = "l impgal",
link = "ガロン",
},
["USgal"] = {
name1 = "米ガロン",
name1_us = "U.S. gallon",
symbol = "US gal",
sym_us = "U.S. gal",
utype = "体積",
scale = 0.003785411784,
default = "l impgal",
},
["USgi"] = {
name1 = "ジル",
name1_us = "gill",
symbol = "gi",
utype = "体積",
scale = 0.0001182941183,
default = "ml impoz",
link = "ジル (単位)",
},
["USkenning"] = {
name1 = "米ケニング",
name1_us = "U.S. kenning",
symbol = "US kenning",
sym_us = "U.S. kenning",
utype = "体積",
scale = 0.01761953508344,
default = "l impgal",
link = "ケニング",
},
["USmin"] = {
name1 = "米ミニム",
name1_us = "U.S. minim",
symbol = "US min",
sym_us = "U.S. min",
utype = "体積",
scale = 0.000000061611519921875,
default = "ml",
link = "ミニム (単位)",
},
["USoz"] = {
name1 = "米液量オンス",
name1_us = "U.S. fluid ounce",
symbol = "US fl oz",
sym_us = "U.S. fl oz",
utype = "体積",
scale = 0.0000295735295625,
default = "ml",
},
["USpk"] = {
name1 = "米ペック",
name1_us = "U.S. peck",
symbol = "US pk",
sym_us = "U.S. pk",
utype = "体積",
scale = 0.00880976754172,
default = "l impgal",
link = "ペック",
},
["USpt"] = {
name1 = "米パイント",
name1_us = "U.S. pint",
symbol = "US pt",
sym_us = "U.S. pt",
utype = "体積",
scale = 0.000473176473,
default = "l imppt",
link = "パイント",
},
["USqt"] = {
name1 = "米クォート",
name1_us = "U.S. quart",
symbol = "US qt",
sym_us = "U.S. qt",
utype = "体積",
scale = 0.000946352946,
default = "ml",
link = "クォート",
customary= 1,
},
["USquart"] = {
name1 = "米クォート",
name1_us = "U.S. quart",
symbol = "US qt",
sym_us = "U.S. qt",
utype = "体積",
scale = 0.000946352946,
default = "ml impoz",
link = "クォート",
},
["UStbsp"] = {
name1 = "米テーブルスプーン",
name1_us = "U.S. tablespoon",
symbol = "US tbsp",
sym_us = "U.S. tbsp",
utype = "体積",
scale = 1.4786764781250001e-5,
default = "ml",
},
["winecase"] = {
name1 = "ケース",
name1_us = "case",
symbol = "case",
usename = 1,
utype = "体積",
scale = 0.009,
default = "l",
link = "箱 (単位)",
},
["*U.S.drygal"] = {
target = "USdrygal",
sp_us = true,
customary= 2,
},
["*U.S.gal"] = {
target = "USgal",
sp_us = true,
default = "L impgal",
customary= 2,
},
["+USdrygal"] = {
target = "USdrygal",
customary= 1,
},
["+usfloz"] = {
target = "USoz",
link = "液量オンス",
customary= 1,
},
["+USgal"] = {
target = "USgal",
customary= 1,
},
["+USoz"] = {
target = "USoz",
customary= 1,
},
["@impgal"] = {
target = "impgal",
link = "ガロン",
customary= 3,
},
["acre feet"] = {
target = "acre-ft",
},
["acre foot"] = {
target = "acre-foot",
},
["acre ft"] = {
target = "acre-ft",
},
["acre-feet"] = {
target = "acre-ft",
},
["acre.foot"] = {
target = "acre-foot",
},
["acre.ft"] = {
target = "acre-ft",
},
["acre·ft"] = {
target = "acre-ft",
},
["bushels"] = {
target = "USbsh",
},
["cid"] = {
target = "CID",
},
["ft3"] = {
target = "cuft",
},
["gal"] = {
target = "USgal",
},
["gallon"] = {
shouldbe = "米ガロンは%{USgal%}を、英ガロンは%{impgal%}を指定してください(%{gallon%}は曖昧であり、使用できません)",
},
["gallons"] = {
shouldbe = "米ガロンは%{USgal%}を、英ガロンは%{impgal%}を指定してください(%{gallons%}は曖昧であり、使用できません)",
},
["Gcuft"] = {
target = "e9cuft",
},
["impfloz"] = {
target = "impoz",
},
["Impgal"] = {
target = "impgal",
},
["in3"] = {
target = "cuin",
symbol = "in<sup>3</sup>",
},
["kcuft"] = {
target = "e3cuft",
},
["kcum"] = {
target = "e3m3",
},
["km³"] = {
target = "km3",
},
["liter"] = {
target = "L",
sp_us = true,
},
["liters"] = {
target = "L",
sp_us = true,
},
["litre"] = {
target = "L",
},
["litres"] = {
target = "L",
},
["Mcuft"] = {
target = "e6cuft",
},
["Mcum"] = {
target = "e6m3",
},
["Mft3"] = {
target = "e6cuft",
},
["mi3"] = {
target = "cumi",
},
["m³"] = {
target = "m3",
},
["Pcuft"] = {
target = "e15cuft",
},
["pt"] = {
shouldbe = "米パイントは%{USpt%}を、英パイントは%{imppt%}を指定してください(%{pt%}は曖昧であり、使用できません)",
},
["qt"] = {
shouldbe = "米クォートは%{USqt%}を、英クォートは%{impqt%}を指定してください(%{qt%}は曖昧であり、使用できません)",
},
["Tcuft"] = {
target = "e12cuft",
},
["Tft3"] = {
target = "e12cuft",
},
["U.S.bbl"] = {
target = "USbbl",
sp_us = true,
default = "l U.S.gal impgal",
},
["U.S.beerbbl"] = {
target = "USbeerbbl",
sp_us = true,
default = "l U.S.gal impgal",
},
["U.S.bsh"] = {
target = "USbsh",
sp_us = true,
default = "l U.S.drygal impgal",
},
["U.S.bu"] = {
target = "USbu",
sp_us = true,
default = "l U.S.drygal impgal",
},
["U.S.drybbl"] = {
target = "USdrybbl",
sp_us = true,
},
["U.S.drygal"] = {
target = "USdrygal",
sp_us = true,
},
["U.S.drypt"] = {
target = "USdrypt",
sp_us = true,
},
["U.S.dryqt"] = {
target = "USdryqt",
sp_us = true,
},
["U.S.flgal"] = {
target = "USflgal",
sp_us = true,
},
["U.S.floz"] = {
target = "USoz",
sp_us = true,
},
["U.S.gal"] = {
target = "USgal",
sp_us = true,
default = "L impgal",
},
["u.s.gal"] = {
target = "USgal",
sp_us = true,
default = "L impgal",
},
["U.S.gi"] = {
target = "USgi",
sp_us = true,
},
["U.S.kenning"] = {
target = "USkenning",
sp_us = true,
},
["U.S.oz"] = {
target = "USoz",
sp_us = true,
},
["U.S.pk"] = {
target = "USpk",
sp_us = true,
},
["U.S.pt"] = {
target = "USpt",
sp_us = true,
},
["U.S.qt"] = {
target = "USqt",
sp_us = true,
default = "L impqt",
customary= 2,
},
["usbbl"] = {
target = "USbbl",
},
["usbeerbbl"] = {
target = "USbeerbbl",
},
["usbsh"] = {
target = "USbsh",
},
["usbu"] = {
target = "USbu",
},
["usdrybbl"] = {
target = "USdrybbl",
},
["usdrygal"] = {
target = "USdrygal",
},
["usdrypt"] = {
target = "USdrypt",
},
["usdryqt"] = {
target = "USdryqt",
},
["USfloz"] = {
target = "USoz",
},
["usfloz"] = {
target = "USoz",
},
["USGAL"] = {
target = "USgal",
},
["usgal"] = {
target = "USgal",
},
["usgi"] = {
target = "USgi",
},
["uskenning"] = {
target = "USkenning",
},
["usoz"] = {
target = "USoz",
},
["uspk"] = {
target = "USpk",
},
["uspt"] = {
target = "USpt",
},
["usqt"] = {
target = "USqt",
},
["yd3"] = {
target = "cuyd",
},
["cuft/sqmi"] = {
per = { "cuft", "sqmi" },
utype = "単位面積当たりの体積",
default = "m3/km2",
},
["m3/ha"] = {
name1 = "立方メートル毎ヘクタール",
name1_us = "cubic meter per hectare",
name2_us = "cubic meters per hectare",
symbol = "m<sup>3</sup>/ha",
utype = "単位面積当たりの体積",
scale = 0.0001,
default = "USbu/acre",
link = "ヘクタール",
},
["m3/km2"] = {
per = { "m3", "km2" },
utype = "単位面積当たりの体積",
default = "cuft/sqmi",
},
["U.S.gal/acre"] = {
per = { "U.S.gal", "acre" },
utype = "単位面積当たりの体積",
default = "m3/km2",
},
["USbu/acre"] = {
name1 = "米ブッシェル毎エーカー",
name1_us = "US bushel per acre",
name2_us = "US bushels per acre",
symbol = "US bushel per acre",
usename = 1,
utype = "単位面積当たりの体積",
scale = 8.7077638761350888e-6,
default = "m3/ha",
link = "ブッシェル",
},
["USgal/acre"] = {
per = { "USgal", "acre" },
utype = "単位面積当たりの体積",
default = "m3/km2",
},
["cuyd/mi"] = {
per = { "cuyd", "mi" },
utype = "単位長さ当たりの体積",
default = "m3/km",
},
["m3/km"] = {
per = { "m3", "km" },
utype = "単位長さ当たりの体積",
default = "cuyd/mi",
},
["mich"] = {
combination= { "ch", "mi" },
multiple = { 80 },
utype = "長さ",
},
["michlk"] = {
combination= { "chlk", "mi" },
multiple = { 80 },
utype = "長さ",
},
["michainlk"] = {
combination= { "chainlk", "mi" },
multiple = { 80 },
utype = "長さ",
},
["miyd"] = {
combination= { "yd", "mi" },
multiple = { 1760 },
utype = "長さ",
},
["miydftin"] = {
combination= { "in", "ft", "yd", "mi" },
multiple = { 12, 3, 1760 },
utype = "長さ",
},
["mift"] = {
combination= { "ft", "mi" },
multiple = { 5280 },
utype = "長さ",
},
["ydftin"] = {
combination= { "in", "ft", "yd" },
multiple = { 12, 3 },
utype = "長さ",
},
["ydft"] = {
combination= { "ft", "yd" },
multiple = { 3 },
utype = "長さ",
},
["ftin"] = {
combination= { "in", "ft" },
multiple = { 12 },
utype = "長さ",
},
["footin"] = {
combination= { "in", "foot" },
multiple = { 12 },
utype = "長さ",
},
["handin"] = {
combination= { "in", "hand" },
multiple = { 4 },
utype = "長さ",
},
["lboz"] = {
combination= { "oz", "lb" },
multiple = { 16 },
utype = "質量",
},
["stlb"] = {
combination= { "lb", "st" },
multiple = { 14 },
utype = "質量",
},
["stlboz"] = {
combination= { "oz", "lb", "st" },
multiple = { 16, 14 },
utype = "質量",
},
["st and lb"] = {
combination= { "lb", "st" },
multiple = { 14 },
utype = "質量",
},
["GN LTf"] = {
combination= { "GN", "-LTf" },
utype = "力",
},
["GN LTf STf"] = {
combination= { "GN", "-LTf", "-STf" },
utype = "力",
},
["GN STf"] = {
combination= { "GN", "-STf" },
utype = "力",
},
["GN STf LTf"] = {
combination= { "GN", "-STf", "-LTf" },
utype = "力",
},
["kN LTf"] = {
combination= { "kN", "-LTf" },
utype = "力",
},
["kN LTf STf"] = {
combination= { "kN", "-LTf", "-STf" },
utype = "力",
},
["kN STf"] = {
combination= { "kN", "-STf" },
utype = "力",
},
["kN STf LTf"] = {
combination= { "kN", "-STf", "-LTf" },
utype = "力",
},
["LTf STf"] = {
combination= { "-LTf", "-STf" },
utype = "力",
},
["MN LTf"] = {
combination= { "MN", "-LTf" },
utype = "力",
},
["MN LTf STf"] = {
combination= { "MN", "-LTf", "-STf" },
utype = "力",
},
["MN STf"] = {
combination= { "MN", "-STf" },
utype = "力",
},
["MN STf LTf"] = {
combination= { "MN", "-STf", "-LTf" },
utype = "力",
},
["STf LTf"] = {
combination= { "-STf", "-LTf" },
utype = "力",
},
["L/100 km mpgimp"] = {
combination= { "L/100 km", "mpgimp" },
utype = "燃費",
},
["l/100 km mpgimp"] = {
combination= { "l/100 km", "mpgimp" },
utype = "燃費",
},
["L/100 km mpgUS"] = {
combination= { "L/100 km", "mpgus" },
utype = "燃費",
},
["L/100 km mpgus"] = {
combination= { "L/100 km", "mpgus" },
utype = "燃費",
},
["l/100 km mpgus"] = {
combination= { "l/100 km", "mpgus" },
utype = "燃費",
},
["mpgimp L/100 km"] = {
combination= { "mpgimp", "L/100 km" },
utype = "燃費",
},
["LT ST t"] = {
combination= { "lt", "-ST", "t" },
utype = "質量",
},
["LT t ST"] = {
combination= { "lt", "t", "-ST" },
utype = "質量",
},
["ST LT t"] = {
combination= { "-ST", "lt", "t" },
utype = "質量",
},
["ST t LT"] = {
combination= { "-ST", "t", "lt" },
utype = "質量",
},
["t LT ST"] = {
combination= { "t", "lt", "-ST" },
utype = "質量",
},
["ton"] = {
combination= { "LT", "ST" },
utype = "質量",
},
["kPa kg/cm2"] = {
combination= { "kPa", "kgf/cm2" },
utype = "圧力",
},
["kPa lb/in2"] = {
combination= { "kPa", "-lb/in2" },
utype = "圧力",
},
["floz"] = {
combination= { "impoz", "USoz" },
utype = "体積",
},
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local default_exceptions = {
-- Prefixed units with a default different from that of the base unit.
-- Each key item is a prefixed symbol (unitcode for engineering notation).
["cm<sup>2</sup>"] = "sqin",
["dm<sup>2</sup>"] = "sqin",
["e3acre"] = "km2",
["e3m2"] = "e6sqft",
["e6acre"] = "km2",
["e6ha"] = "e6acre",
["e6km2"] = "e6sqmi",
["e6m2"] = "e6sqft",
["e6sqft"] = "v * 9.290304 < 100 ! e3 ! e6 ! m2",
["e6sqmi"] = "e6km2",
["hm<sup>2</sup>"] = "acre",
["km<sup>2</sup>"] = "sqmi",
["mm<sup>2</sup>"] = "sqin",
["aJ"] = "eV",
["e3BTU"] = "MJ",
["e6BTU"] = "GJ",
["EJ"] = "kWh",
["fJ"] = "keV",
["GJ"] = "kWh",
["MJ"] = "kWh",
["PJ"] = "kWh",
["pJ"] = "MeV",
["TJ"] = "kWh",
["YJ"] = "kWh",
["yJ"] = "μeV",
["ZJ"] = "kWh",
["zJ"] = "meV",
["e12cuft/a"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/a",
["e12cuft/d"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3/d",
["e12m3/a"] = "Tcuft/a",
["e12m3/d"] = "Tcuft/d",
["e3cuft/a"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/a",
["e3cuft/d"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/d",
["e3cuft/s"] = "v * 2.8316846592 < 100 ! ! e3 ! m3/s",
["e3m3/a"] = "v < 28.316846592 ! k ! M ! cuft/a",
["e3m3/d"] = "v < 28.316846592 ! k ! M ! cuft/d",
["e3m3/s"] = "v < 28.316846592 ! k ! M ! cuft/s",
["e3USgal/a"] = "v * 3.785411784 < 1000 ! ! e3 ! m3/a",
["e6cuft/a"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/a",
["e6cuft/d"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/d",
["e6cuft/s"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3/s",
["e6m3/a"] = "v < 28.316846592 ! M ! G ! cuft/a",
["e6m3/d"] = "v < 28.316846592 ! M ! G ! cuft/d",
["e6m3/s"] = "v < 28.316846592 ! e6 ! e9 ! cuft/s",
["e6USgal/a"] = "v * 3.785411784 < 1000 ! e3 ! e6 ! m3/a",
["e9cuft/a"] = "m3/a",
["e9cuft/d"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3/d",
["e9m3/a"] = "v < 28.316846592 ! G ! T ! cuft/a",
["e9m3/d"] = "v < 28.316846592 ! G ! T ! cuft/d",
["e9m3/s"] = "v < 28.316846592 ! e9 ! e12 ! cuft/s",
["e9USgal/a"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/a",
["e9USgal/s"] = "v * 3.785411784 < 1000 ! e6 ! e9 ! m3/s",
["nN"] = "gr-f",
["μN"] = "gr-f",
["mN"] = "oz-f",
["am"] = "in",
["cm"] = "in",
["dam"] = "ft",
["dm"] = "in",
["e12km"] = "e12mi",
["e12mi"] = "e12km",
["e3AU"] = "ly",
["e3km"] = "e3mi",
["e3mi"] = "e3km",
["e6km"] = "e6mi",
["e6mi"] = "e6km",
["e9km"] = "AU",
["e9mi"] = "e9km",
["Em"] = "mi",
["fm"] = "in",
["Gm"] = "mi",
["hm"] = "ft",
["km"] = "mi",
["mm"] = "in",
["Mm"] = "mi",
["nm"] = "in",
["Pm"] = "mi",
["pm"] = "in",
["Tm"] = "mi",
["Ym"] = "mi",
["ym"] = "in",
["Zm"] = "mi",
["zm"] = "in",
["μm"] = "in",
["e12lb"] = "v * 4.5359237 < 10 ! Mt ! Gt",
["e3lb"] = "v * 4.5359237 < 10 ! kg ! t",
["e3ozt"] = "v * 0.311034768 < 10 ! kg ! t",
["e3t"] = "LT ST",
["e6carat"] = "t",
["e6lb"] = "v * 4.5359237 < 10 ! t ! kilotonne",
["e6ozt"] = "lb kg",
["e6ST"] = "Mt",
["e6t"] = "LT ST",
["e9lb"] = "v * 4.5359237 < 10 ! kilotonne ! Mt",
["e9t"] = "LT ST",
["Gg"] = "lb",
["kg"] = "lb",
["mg"] = "gr",
["Mg"] = "LT ST",
["ng"] = "gr",
["μg"] = "gr",
["mBq"] = "fCi",
["kBq"] = "nCi",
["MBq"] = "μCi",
["GBq"] = "mCi",
["TBq"] = "Ci",
["PBq"] = "kCi",
["EBq"] = "kCi",
["fCi"] = "mBq",
["pCi"] = "Bq",
["nCi"] = "Bq",
["μCi"] = "kBq",
["mCi"] = "MBq",
["kCi"] = "TBq",
["MCi"] = "PBq",
["ns"] = "μs",
["μs"] = "ms",
["ms"] = "s",
["ks"] = "h",
["Ms"] = "week",
["Gs"] = "decade",
["Ts"] = "millennium",
["Ps"] = "million year",
["Es"] = "thousand million year",
["MK"] = "keVT",
["cL"] = "impoz usoz",
["cl"] = "impoz usoz",
["cm<sup>3</sup>"] = "cuin",
["dL"] = "impoz usoz",
["dl"] = "impoz usoz",
["mm<sup>3</sup>"] = "cuin",
["dm<sup>3</sup>"] = "cuin",
["e12cuft"] = "v * 2.8316846592 < 100 ! e9 ! e12 ! m3",
["e12impgal"] = "v * 4.54609 < 1000 ! T ! P ! l",
["e12m3"] = "v < 28.316846592 ! T ! P ! cuft",
["e12U.S.gal"] = "v * 3.785411784 < 1000 ! T ! P ! l",
["e12USgal"] = "v * 3.785411784 < 1000 ! T ! P ! l",
["e15cuft"] = "v * 2.8316846592 < 100 ! e12 ! e15 ! m3",
["e15m3"] = "Pcuft",
["e3bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3",
["e3cuft"] = "v * 2.8316846592 < 100 ! ! e3 ! m3",
["e3impgal"] = "v * 4.54609 < 1000 ! k ! M ! l",
["e3m3"] = "v < 28.316846592 ! k ! M ! cuft",
["e3U.S.gal"] = "v * 3.785411784 < 1000 ! k ! M ! l",
["e3USgal"] = "v * 3.785411784 < 1000 ! k ! M ! l",
["e6bdft"] = "v * 0.23597372167 < 100 ! e3 ! e6 ! m3",
["e6cuft"] = "v * 2.8316846592 < 100 ! e3 ! e6 ! m3",
["e6cuyd"] = "v * 7.64554857984 < 10 ! e3 ! e6 ! m3",
["e6impgal"] = "v * 4.54609 < 1000 ! M ! G ! l",
["e6L"] = "USgal",
["e6m3"] = "v < 28.316846592 ! M ! G ! cuft",
["e6U.S.gal"] = "v * 3.785411784 < 1000 ! M ! G ! l",
["e6USgal"] = "v * 3.785411784 < 1000 ! M ! G ! l",
["e9bdft"] = "v * 0.23597372167 < 100 ! e6 ! e9 ! m3",
["e9cuft"] = "v * 2.8316846592 < 100 ! e6 ! e9 ! m3",
["e9impgal"] = "v * 4.54609 < 1000 ! G ! T ! l",
["e9m3"] = "v < 28.316846592 ! G ! T ! cuft",
["e9U.S.gal"] = "v * 3.785411784 < 1000 ! G ! T ! l",
["e9USgal"] = "v * 3.785411784 < 1000 ! G ! T ! l",
["GL"] = "cuft",
["Gl"] = "cuft",
["kL"] = "cuft",
["kl"] = "cuft",
["km<sup>3</sup>"] = "cumi",
["mL"] = "impoz usoz",
["ml"] = "impoz usoz",
["Ml"] = "v < 28.316846592 ! e3 ! e6 ! cuft",
["ML"] = "v < 28.316846592 ! e3 ! e6 ! cuft",
["TL"] = "cumi",
["Tl"] = "cumi",
["μL"] = "cuin",
["μl"] = "cuin",
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local link_exceptions = {
-- Prefixed units with a linked article different from that of the base unit.
-- Each key item is a prefixed symbol (not unitcode).
["mm<sup>2</sup>"] = "平方ミリメートル",
["cm<sup>2</sup>"] = "平方センチメートル",
["dm<sup>2</sup>"] = "平方デシメートル",
["km<sup>2</sup>"] = "平方キロメートル",
["kJ"] = "キロジュール",
["MJ"] = "メガジュール",
["GJ"] = "ギガジュール",
["TJ"] = "テラジュール",
["fm"] = "フェムトメートル",
["pm"] = "ピコメートル",
["nm"] = "ナノメートル",
["μm"] = "マイクロメートル",
["mm"] = "ミリメートル",
["cm"] = "センチメートル",
["dm"] = "デシメートル",
["dam"] = "デカメートル",
["hm"] = "ヘクトメートル",
["km"] = "キロメートル",
["Mm"] = "メガメートル",
["Gm"] = "ギガメートル",
["Tm"] = "テラメートル",
["Pm"] = "ペタメートル",
["Em"] = "エクサメートル",
["Zm"] = "ゼタメートル",
["Ym"] = "ヨタメートル",
["μg"] = "マイクログラム",
["mg"] = "ミリグラム",
["kg"] = "キログラム",
["Mg"] = "トン",
["yW"] = "ヨクトワット",
["zW"] = "ゼプトワット",
["aW"] = "アトワット",
["fW"] = "フェムトワット",
["pW"] = "ピコワット",
["nW"] = "ナノワット",
["μW"] = "マイクロワット",
["mW"] = "ミリワット",
["kW"] = "キロワット",
["MW"] = "メガワット",
["GW"] = "ギガワット",
["TW"] = "テラワット",
["PW"] = "ペタワット",
["EW"] = "エクサワット",
["ZW"] = "ゼタワット",
["YW"] = "ヨタワット",
["as"] = "アト秒",
["fs"] = "フェムト秒",
["ps"] = "ピコ秒",
["ns"] = "ナノ秒",
["μs"] = "マイクロ秒",
["ms"] = "ミリ秒",
["ks"] = "キロ秒",
["Ms"] = "メガ秒",
["Gs"] = "ギガ秒",
["Ts"] = "テラ秒",
["Ps"] = "ペタ秒",
["Es"] = "エクサ秒",
["Zs"] = "ゼタ秒",
["Ys"] = "ヨタ秒",
["mm<sup>3</sup>"] = "立方ミリメートル",
["cm<sup>3</sup>"] = "立方センチメートル",
["dm<sup>3</sup>"] = "立方デシメートル",
["dam<sup>3</sup>"] = "立方デカメートル",
["km<sup>3</sup>"] = "立方キロメートル",
["μL"] = "マイクロリットル",
["μl"] = "マイクロリットル",
["mL"] = "ミリリットル",
["ml"] = "ミリリットル",
["cL"] = "センチリットル",
["cl"] = "センチリットル",
["dL"] = "デシリットル",
["dl"] = "デシリットル",
["daL"] = "デカリットル",
["dal"] = "デカリットル",
["hL"] = "ヘクトリットル",
["hl"] = "ヘクトリットル",
["kL"] = "キロリットル",
["kl"] = "キロリットル",
["ML"] = "メガリットル",
["Ml"] = "メガリットル",
["GL"] = "ギガリットル",
["Gl"] = "ギガリットル",
["TL"] = "テラリットル",
["Tl"] = "テラリットル",
["PL"] = "ペタリットル",
["Pl"] = "ペタリットル",
}
---------------------------------------------------------------------------
-- Do not change the data in this table because it is created by running --
-- a script that reads the wikitext from a wiki page (see note above). --
---------------------------------------------------------------------------
local per_unit_fixups = {
-- Automatically created per units of form "x/y" may have their unit type
-- changed, for example, "length/time" is changed to "speed".
-- Other adjustments can also be specified.
["/面積"] = "単位面積当たり",
["/体積"] = "単位体積当たり",
["面積/面積"] = "単位面積当たりの面積",
["エネルギー/長さ"] = "単位長さ当たりのエネルギー",
["エネルギー/質量"] = "単位質量当たりのエネルギー",
["エネルギー/時間"] = { utype = "仕事率", link = "仕事率" },
["エネルギー/体積"] = "単位体積当たりのエネルギー",
["力/面積"] = { utype = "圧力", link = "圧力" },
["長さ/長さ"] = { utype = "勾配", link = "縦断勾配" },
["長さ/時間"] = { utype = "速さ", link = "速さ" },
["長さ/時間/時間"] = { utype = "加速度", link = "加速度" },
["質量/面積"] = { utype = "圧力", multiplier = 9.80665 },
["質量/長さ"] = "線密度",
["質量/質量"] = "濃度",
["質量/仕事率"] = "単位仕事率当たりの質量",
["質量/時間"] = "単位時間当たりの質量",
["質量/体積"] = { utype = "密度", link = "密度" },
["仕事率/質量"] = "単位質量当たりの仕事率",
["仕事率/体積"] = { link = "出力密度" },
["圧力/長さ"] = "破砕圧力勾配",
["速さ/時間"] = { utype = "加速度", link = "加速度" },
["体積/面積"] = "単位面積当たりの体積",
["体積/長さ"] = "単位長さ当たりの体積",
["体積/時間"] = "流量",
}
return {
all_units = all_units,
default_exceptions = default_exceptions,
link_exceptions = link_exceptions,
per_unit_fixups = per_unit_fixups,
}
0b5njlmma64x7bcwt3lzg4qaxehfq48
モジュール:Convert/text
828
35287
206198
2022-08-04T03:22:48Z
Ef3
694
import from: https://ja.wikipedia.org/w/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Convert/text&oldid=86009559
Scribunto
text/plain
-- Text used by Module:Convert, for en.wikipedia.org (English).
-- This is a separate module to simplify translation for use on another wiki.
-- See [[:en:Template:Convert/Transwiki guide]] if copying to another wiki.
-- ローカライズ用設定 (中国語版を参照のこと)
local translation_table = {
omitsep = true, -- omit separator before local symbol/name
per_word = '毎', -- 「per」の日本語訳
plural_suffix = '', -- disable plural unit names
plural_suffix_us = 's', -- plural unit names for US spells.
}
-- Some units accept an SI prefix before the unit code, such as "kg" for kilogram.
local SIprefixes = {
-- The prefix field is what the prefix should be, if different from the prefix used.
['Y'] = { exponent = 24, name = 'ヨッタ', },
['Z'] = { exponent = 21, name = 'ゼッタ', },
['E'] = { exponent = 18, name = 'エクサ' , },
['P'] = { exponent = 15, name = 'ペタ' , name_us = 'peta' },
['T'] = { exponent = 12, name = 'テラ' , name_us = 'tera' },
['G'] = { exponent = 9, name = 'ギガ' , name_us = 'giga' },
['M'] = { exponent = 6, name = 'メガ' , name_us = 'mega' },
['k'] = { exponent = 3, name = 'キロ' , name_us = 'kilo' },
['h'] = { exponent = 2, name = 'ヘクト', },
['da']= { exponent = 1, name = 'デカ' , name_us = 'deka' },
['d'] = { exponent = -1, name = 'デシ' , },
['c'] = { exponent = -2, name = 'センチ', name_us = 'centi' },
['m'] = { exponent = -3, name = 'ミリ', name_us = 'milli' },
['μ'] = { exponent = -6, name = 'マイクロ', }, -- key = 'GREEK SMALL LETTER MU' (U+03BC) utf-8 CE BC
['µ'] = { exponent = -6, name = 'マイクロ', prefix = 'μ' }, -- key = 'MICRO SIGN' (U+00B5) utf-8 C2 B5
['u'] = { exponent = -6, name = 'マイクロ', prefix = 'μ', name_us = 'micro' }, -- not an SI prefix, but allow for people typing this
['n'] = { exponent = -9, name = 'ナノ' , name_us = 'nano' },
['p'] = { exponent =-12, name = 'ピコ' , name_us = 'pico' },
['f'] = { exponent =-15, name = 'フェムト', name_us = 'femto'},
['a'] = { exponent =-18, name = 'アット' , },
['z'] = { exponent =-21, name = 'ゼプト', },
['y'] = { exponent =-24, name = 'ヨクト', },
}
-- Some units can be qualified with one of the following prefixes, when linked.
local customary_units = {
{ "US", link = "米国慣用単位" },
{ "U.S.", link = "米国慣用単位" },
{ "imperial", link = "帝国単位" },
{ "imp", link = "帝国単位" },
}
-- Names when using engineering notation (a prefix of "eN" where N is a number; example "e6km").
-- key = { "name", link = "article title", exponent = numeric_key_value }
-- If lk=on and link is defined, the name of the number will appear as a link.
local eng_scales = {
["3"] = { "thousand", exponent = 3 },
["6"] = { "million", exponent = 6 },
["9"] = { "billion", link = "西洋の命数法", exponent = 9 },
["12"] = { "trillion", link = "兆", exponent = 12 },
["15"] = { "quadrillion", link = "1 E15", exponent = 15 },
}
local all_categories = {
unit = "[[Category:テンプレート呼び出しエラーのあるページ/Template:Convert/不明な単位]]",
option = "[[Category:テンプレート呼び出しエラーのあるページ/Template:Convert/正しくないオプション]]",
warning = '[[Category:テンプレート呼び出しエラーのあるページ/Template:Convert/正しくないオプション]]',
tracking = '', --[[Category:Convert tracking]]
}
-- For some error messages, the following puts the wanted style around
-- each unit code marked like '...%{ft%}...'.
local unitcode_regex = '%%([{}])'
local unitcode_replace = { ['{'] = '"', ['}'] = '"' } -- no longer need the more elaborate substitute used before 2013-09-28
-- All messages that may be displayed if a problem occurs.
local all_messages = {
-- Message format string: $1=title, $2=text, $3=category, $4=anchor.
-- Each displayed message starts with "Convert:" so can easily locate by searching article.
cvt_format = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[<i>[[:en:Help:Convert messages#$4|<span title="Convert: $1">convert: $2</span>]]</i>]</sup>$3<span class="error"></span>',
cvt_format2 = '<sup class="noprint Inline-Template" style="white-space:nowrap;">[[:en:Help:Convert messages#$4|<span title="Convert: $1">$2</span>]]</sup>$3<span class="error"></span>',
cvt_format_preview = '<strong class="error">[[Template:Convert]]のエラー: $1 [[:en:Help:Convert messages#$4|(ヘルプ)]]</strong>$3',
-- Each of following messages is a table:
-- { [1] = 'title', -- mouseover title text
-- [2] = 'text', -- link text displayed in article
-- [3] = 'category key', -- key to lookup category in all_categories
-- [4] = 'anchor', -- anchor for link to relevant section on help page
-- regex = gsub_regex,
-- replace = gsub_table,
-- } Mouseover title text Link text CatKey Anchor
cvt_bad_input = { '入力値"$1"は数字と単位でなければなりません' , '不正な入力' , 'option', 'invalid_input' },
cvt_bad_num = { '変換する値"$1"が数字ではありません' , '不正な数字' , 'option', 'invalid_number' },
cvt_big_prec = { 'Precision "$1" is too large' , 'precision too large' , 'option', 'precision_too_large' },
cvt_invalid_num = { '数字がオーバーフローしました' , '数字のオーバーフロー', 'option', 'number_overflow' },
cvt_no_num = { '変換する数値が未指定です' , '要数字' , 'option', 'needs_number' },
cvt_no_num2 = { '範囲指定には2つの数字が必要です' , 'needs another number', 'option', 'needs_another_number' },
cvt_bad_frac = { '"$1"には2以上の整数が必要です' , '不正な分数' , 'option', 'invalid_fraction' },
cvt_bad_prec = { 'Precision "$1" must be an integer' , 'invalid precision' , 'option', 'invalid_precision' },
cvt_bad_sigfig = { '"$1"には正の整数を入力してください' , '不正な有効数字' , 'option', 'invalid_sigfig' },
cvt_empty_option = { '空白のオプション"$1"は無視されます' , '空白のオプション' , 'option', 'empty_option' },
cvt_deprecated = { 'Option "$1" is deprecated' , '*' , 'option', 'deprecated_option', format = 'cvt_format2', nowarn = true },
cvt_no_spell = { 'Spelling is not available' , 'モジュールのバグ' , 'option', 'ask_for_help' },
cvt_unknown_option = { '不正なオプション"$1"は無視されます' , '不正なオプション' , 'option', 'invalid_option' },
cvt_wd_fail = { 'Unable to access Wikidata' , 'ウィキデータに問題あり' , 'option', 'wikidata_problem' },
cvt_bad_default = { 'Unit "$1" has an invalid default' , 'モジュールのバグ' , 'unit' , 'ask_for_help' },
cvt_bad_unit = { 'Unit "$1" is invalid here' , 'unit invalid here' , 'unit' , 'unit_invalid_here' },
cvt_no_default = { 'Unit "$1" has no default output unit' , 'モジュールのバグ' , 'unit' , 'ask_for_help' },
cvt_no_unit = { '単位名が必要です' , '要単位名' , 'unit' , 'needs_unit_name' },
cvt_unknown = { '不明な単位「$1」が指定されました' , '不明な単位' , 'unit' , 'unknown_unit' },
cvt_should_be = { '$1' , '曖昧な単位' , 'unit' , 'ambiguous_unit', regex = unitcode_regex, replace = unitcode_replace },
cvt_mismatch = { '"$1"は"$2"に変換できません' , '変換できない単位' , 'unit' , 'unit_mismatch' },
cvt_bug_convert = { 'バグ:単位変換に失敗しました' , 'モジュールのバグ' , 'unit' , 'ask_for_help' },
cvt_lookup = { '単位"$1"の定義に誤りがあります' , 'モジュールのバグ' , 'unit' , 'ask_for_help' },
}
-- Text to join input value/unit with output value/unit.
local disp_joins = {
-- [1]=before output, [2]=after output, [3]=between outputs in a combination; default "; "
-- [wantname] gives default abbr=off
["or"] = { " または " , "" , " または ", wantname = true },
["sqbr-sp"] = { " [" , "]" },
["sqbr-nbsp"] = { " [" , "]" },
["comma"] = { ", " , "" , ", " },
["slash-sp"] = { " / " , "" , wantname = true },
["slash-nbsp"] = { " / ", "" , wantname = true },
["slash-nosp"] = { "/" , "" , wantname = true },
["b"] = { " (" , ")" },
["(or)"] = { " (" , ")", " or " },
["br"] = { "<br />" , "" , wantname = true },
["br()"] = { "<br />(" , ")", wantname = true },
}
-- Text to separate values in a range.
local range_types = {
-- Specifying a table requires either:
-- * "off" and "on" values (for "abbr=off" and "abbr=on"), or
-- * "input" and "output" values (for LHS and RHS);
-- other fields are optional.
-- When "adj=on|abbr=off" applies, spaces in range text are replaced with hyphens.
-- With "exception = true", that also occurs with "adj=on|abbr=on".
-- If "adj" is defined here, that text (unchanged) is used with "adj=on".
["+"] = " + ",
[","] = ", ",
[", and"] = ", and ",
[", or"] = ", or ",
["by"] = " by ",
["-"] = "–",
["to about"] = " to about ",
["and"] = { off = " and ", on = " and ", exception = true },
["and(-)"] = { input = " and ", output = "–" },
["or"] = { off = " or " , on = " or " , exception = true },
["to"] = { off = " - " , on = " - " , exception = true },
["to(-)"] = { input = " to ", output = "–" },
["+/-"] = { off = " ± ", on = " ± ", adj = " ± ", is_range_change = true },
["by(x)"] = { input = " by ", output = " × ", out_range_x = true },
["x"] = { off = " by ", on = " × ", abbr_range_x = true },
["xx"] = " × ",
["*"] = "×",
["/"] = " / ", -- for a table of high/low temperatures with {{convert|83|/|63|F|disp=br()|abbr=values}}
}
local range_aliases = {
-- ["alternative name for a range"] = "standard range name"
["–"] = "-",
["–"] = "-",
["×"] = "x",
["×"] = "x",
["±"] = "+/-",
["±"] = "+/-",
}
-- Convert accepts range text delimited with whitespace, for example, {{convert|1 to 2|ft}}.
-- In addition, the following "words" are accepted without spaces, for example, {{convert|1-2|ft}}.
-- Words must be in correct order for searching, for example, 'x' after 'xx'.
local range_words = { '-', '–', 'xx', 'x', '*' }
local ranges = {
types = range_types,
aliases = range_aliases,
words = range_words,
}
-- Valid option names.
local en_option_name = {
-- ["local text for option name"] = "en name used in this module"
["$"] = "$",
["abbr"] = "abbr",
["adj"] = "adj",
["comma"] = "comma",
["debug"] = "debug",
["disp"] = "disp",
["frac"] = "frac",
["input"] = "input",
["lang"] = "lang",
["lk"] = "lk",
["order"] = "order",
["qid"] = "qid",
["qual"] = "qual",
["qualifier"] = "qual",
["round"] = "round",
["sigfig"] = "sigfig",
["sing"] = "adj", -- "sing" is an old alias for "adj"
["sortable"] = "sortable",
["sp"] = "sp",
["spell"] = "spell",
["stylein"] = "stylein",
["styleout"] = "styleout",
["tracking"] = "tracking",
}
-- Valid option values.
-- Convention: parms.opt_xxx refers to an option that is set here
-- (not intended to be set by the template which invokes this module).
-- Example: At enwiki, "abbr" includes:
-- ["comma"] = "opt_nocomma"
-- As a result, if the template uses abbr=comma, Module:Convert sets:
-- parms["opt_nocomma"] = true
-- parms["abbr"] = nil
-- Therefore parms.abbr will be nil, or will have one of the listed values
-- that do not start with "opt_".
-- An option value of form "xxx?" is the same as "xxx" but shows the input as deprecated.
local en_option_value = {
-- $=x is handled as a special case: x should be a currency symbol that will be used instead of "$"
["abbr"] = {
-- ["local text for option value"] = "en value used in this module"
["def"] = "", -- ignored (some wrapper templates call convert with "abbr=def" to mean "default abbreviation")
["h"] = "on", -- abbr=on + use "h" for hand unit (default)
["hh"] = "opt_hand_hh", -- abbr=on + use "hh" for hand unit
["in"] = "in", -- use symbol for LHS unit
["none"] = "off", -- old name for "off"
["off"] = "off", -- use name for all units
["on"] = "on", -- use symbol for all units
["out"] = "out", -- use symbol for RHS unit (default)
["unit"] = "unit", -- abbr=on but abbreviate units only: e6km → million km (not ×10⁶ km)
["values"] = "opt_values", -- show only input and output numbers, not units
["~"] = "opt_also_symbol", -- show input unit symbol as well as name
},
["adj"] = {
["mid"] = "opt_adjectival, opt_adj_mid", -- adj=on with user-specified text after input unit (between input and output)
["off"] = "", -- ignored (off is the default)
["on"] = "opt_adjectival", -- unit name is singular and hyphenated
["pre"] = "opt_one_preunit", -- user-specified text before input unit
["ri0"] = "opt_ri=0", -- round input with precision = 0
["ri1"] = "opt_ri=1", -- round input with precision = 1
["ri2"] = "opt_ri=2", -- round input with precision = 2
["ri3"] = "opt_ri=3", -- round input with precision = 3
},
["comma"] = {
["5"] = "opt_comma5", -- only use numsep grouping if 5 or more digits
["gaps"] = "opt_gaps", -- use gaps, not numsep, to separate groups of digits
["gaps3"] = "opt_gaps, opt_gaps3", -- group only in threes rather than default of no gap before a single digit after decimal mark
["off"] = "opt_nocomma", -- no numsep in input or output numbers
},
["debug"] = {
["yes"] = "opt_sortable_debug", -- make the normally hidden sort key visible
},
["disp"] = {
["5"] = "opt_round=5?", -- round output value to nearest 5
["b"] = "b", -- join: '(...)'
["(or)"] = "(or)", -- join: '(...)' with 'or' between outputs in a combination
["br"] = "br", -- join: '<br />'
["br()"] = "br()", -- join: '<br />(...)'
["comma"] = "comma", -- join: ','
["flip"] = "opt_flip", -- reverse order of input/output
["number"] = "opt_output_number_only", -- display output value (not input, and not output symbol/name)
["or"] = "or", -- join: 'or'
["out"] = "opt_output_only",
["output number only"] = "opt_output_number_only",
["output only"] = "opt_output_only",
["preunit"] = "opt_two_preunits", -- user-specified text before input and output units
["sqbr"] = "sqbr", -- join: '[...]'
["table"] = "opt_table", -- output is suitable for a table cell with align="right"
["tablecen"] = "opt_tablecen", -- output is suitable for a table cell with align="center"
["unit"] = "opt_input_unit_only", -- display input symbol/name (not output, and not input value)
["unit or text"] = "opt_input_unit_only, opt_ignore_error", -- display input symbol/name, or given unit code if not known
["unit2"] = "opt_output_unit_only",
["x"] = "x", -- join: <first>...<second> (user-specified text)
},
-- frac=x is handled as a special case: x must be an integer (possibly in local language) = 2 or more
-- input=x is handled as a special case: x should be <value><space><unitcode> or <wikidata-property-id>
["lang"] = { -- language for output digits (both en and local digits are always accepted for input)
["en"] = "opt_lang_en", -- use en digits for numbers, regardless of local language
["local"] = "opt_lang_local", -- use local digits for numbers (default, although config can change default to en)
},
["lk"] = {
["in"] = "in", -- link LHS unit name or symbol
["off"] = "off", -- do not link: same as default except for hand unit
["on"] = "on", -- link all unit names or symbols (but not twice for the same unit)
["out"] = "out", -- link RHS unit name or symbol
},
["order"] = {
["flip"] = "opt_flip", -- reverse order of input/output
["out"] = "opt_order_out", -- do not show input; instead, use order in output combination, with the first output shown as the input
},
-- qid=x is handled as a special case: x should be a Wikidata Q item identifier.
-- qual=x is handled as a special case: x should be a Wikidata Q item identifier.
["round"] = {
["0.5"] = "opt_round=0.5", -- round output value to nearest 0.5
["5"] = "opt_round=5", -- round output value to nearest 5
["10"] = "opt_round=10", -- round output value to nearest 10 (same as but clearer than "|-1")
["25"] = "opt_round=25", -- round output value to nearest 25
["50"] = "opt_round=50", -- round output value to nearest 50
["each"] = "opt_round_each", -- using default precision in a range, round each output separately (default uses highest precision of each item in range)
},
-- sigfig=x is handled as a special case: x must be an integer (possibly in local language) = 1 or more
["sortable"] = {
["off"] = "", -- ignored (off is the default)
["on"] = "opt_sortable_on", -- output sort key for use in a sortable table, based on value from converting to a standard base unit
["debug"] = "opt_sortable_on, opt_sortable_debug", -- |sortable=debug is the same as |sortable=on|debug=yes
},
["sp"] = {
["us"] = "opt_sp_us", -- use U.S. spelling (like "meter" instead of default "metre")
},
["spell"] = { -- only English spelling is supported; not scientific notation; only some fractions
["in"] = "opt_spell_in", -- spell input value in words
["In"] = "opt_spell_in, opt_spell_upper", -- spell input value in words with first letter uppercase
["on"] = "opt_spell_in, opt_spell_out", -- spell input and output values in words
["On"] = "opt_spell_in, opt_spell_out, opt_spell_upper", -- same, with first letter of first word in result uppercase
},
-- stylein=x is handled as a special case: x can be any text
-- styleout=x is handled as a special case: x can be any text
-- tracking=x is handled as a special case: x can be any text
}
local titles = {
["frac"] = "分数/styles.css",
["sfrac"] = "Sfrac/styles.css",
}
return {
SIprefixes = SIprefixes,
all_categories = all_categories,
all_messages = all_messages,
currency = { ['$'] = true, ['£'] = true, ['€'] = true, ['₱'] = true, ['₽'] = true, ['¥'] = true },
customary_units = customary_units,
disp_joins = disp_joins,
en_option_name = en_option_name,
en_option_value = en_option_value,
eng_scales = eng_scales,
ranges = ranges,
titles = titles,
translation_table = translation_table,
}
981zkcpj7wynf3lptfssbdgkmjztec8
モジュール:Val/units
828
35288
206199
2022-08-04T03:24:35Z
Ef3
694
import from: https://ja.wikipedia.org/w/index.php?title=%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB:Val/units&oldid=88532624
Scribunto
text/plain
-- Definitions for units known to val
-- File format is two strings and a return statement with them in it:
-- string in quotes [=[ ... builtin_units ... ]=].
-- string in quotes [=[ ... builtin_units_long_scale ... ]=].
-- First string, builtin_units, is short-scale, second string is long scale.
-- Entry format:
-- One record per line, starting in first column, having 2-4 fields.
-- Field separator: two or more spaces
-- Between first and second fields: two or more spaces
-- Between all other fields: two or more spaces, or one or more tabs
-- Entries without two spaces in them are ignored.
-- There must be a blank line before the first entry and after the last.
-- I.e. the first two and last two characters of the string must be newlines.
-- Format of entry. Two record types:
--
-- One record type is a wikilink:
-- Unit-code [[ pagename | Symbol-accepts-HTML-only ]]
-- Text-field separator is still two spaces. Two spaces not allowed in wikilink.
--
-- The other record type is all fields:
-- Unit-code symbol-accepts-HTML-only pagename#section-OK
--
-- Plus there is an optional field that goes at the end after two or more spaces.
-- Whether it is a number or an equation or the letters SI,
-- any of these three has the same function: a wikitable sorting "scale".
-- It is for sorting, and it works for either record type.
-- Difference is SI can't accept HTML. But SI correctly scales any SI prefix.
-- (Optional fields ALIAS and NOSPACE and ANGLE are for advanced users.)
-- "Invalid unit" error:
-- Using SI requires that the symbol equal unit-code, so never allows HTML.
-- Any difference between SI or symbol must be an SI prefix, such as k, M, or G.
-- A space at the end of an entry is an error. No space at each EOL.
local builtin_units = [=[
== Test ==
Foo [[Hz|<samp>Foo</samp>]]
Baz [[Hertz|baz<sub>0</sub>]]
Baz [[Kelvins|baz<sub>0</sub>]]
Bar [[Foobar|bar<abbr title="super duper">0</abbr>]]
quux [[Foobar|<span title="super duper 2">bar0</span>]]
== Unsorted units ==
c0 [[光速|''c''<sub>0</sub>]]
lbf [[重量ポンド|<span title="重量ポンド">lb<sub>F</sub></span> ]]
C/mol [[ファラデー定数|C/mol]]
C.mol-1 [[ファラデー定数|C⋅mol<sup>−1</sup>]]
C/kg [[レントゲン (単位)|C/kg]]
C.kg-1 [[レントゲン (単位)|C⋅kg<sup>−1</sup>]]
F.m-1 [[真空の誘電率|F⋅m<sup>−1</sup>]]
F/m [[真空の誘電率|F/m]]
e [[電気素量|''e'']]
phon [[ホン|ホン]]
W.m-1.K-1 [[熱伝導率|W⋅m<sup>−1</sup>⋅K<sup>−1</sup>]]
W/mK [[熱伝導率|W/(m K)]]
W/m.K [[熱伝導率|W/(m⋅K)]]
W.cm-1.K-1 [[熱伝導率|W⋅cm<sup>−1</sup>⋅K<sup>−1</sup>]] 1e2
W/cmK [[熱伝導率|W/(cm K)]] 1e2
W/cm.K [[熱伝導率|W/(cm⋅K)]] 1e2
== Time and frequency ==
byte [[バイト (情報)|byte]] 8
byte/s [[ビット毎秒|byte/s]] 8
kB/s [[ビット毎秒|<span title="キロバイト毎秒">kB/s</span>]] 8e3
MB/s [[ビット毎秒|<span title="メガバイト毎秒">MB/s</span>]] 8e6
GB/s [[ビット毎秒|<span title="ギガバイト毎秒">GB/s</span>]] 8e9
TB/s [[ビット毎秒|<span title="テラバイト毎秒">TB/s</span>]] 8e12
bit/s [[ビット毎秒|bit/s]] 1
bps [[ビット毎秒|bit/s]] 1
kbit/s [[ビット毎秒|kbit/s]] 1e3
Mbit/s [[ビット毎秒|Mbit/s]] 1e6
Gbit/s [[ビット毎秒|Gbit/s]] 1e9
Tbit/s [[ビット毎秒|Tbit/s]] 1e12
kT/s [[:en:Transfer (computing)|<span title="キロトランスファー毎秒">kT/s</span>]] 1e3
MT/s [[:en:Transfer (computing)|<span title="メガトランスファー毎秒">MT/s</span>]] 1e6
GT/s [[:en:Transfer (computing)|<span title="ギガトランスファー毎秒">GT/s</span>]] 1e9
year [[年]] 31557600
years [[年]] 31557600
yr [[年|yr]] 31557600
y [[年|y]] 31557600
a [[年|a]] 31557600
Ga [[年|Ga]] 31557600000000000
Ma [[年|Ma]] 31557600000000
ka [[年|ka]] 31557600000
kyr [[:en:kyr|kyr]] 31557600000
kya [[:en:kyr|kya]] 31557600000
myr [[:en:myr|myr]] 31557600000000
mya [[年|mya]] 31557600000000
byr [[:en:Byr|byr]] 31557600000000000
bya [[:en:Byr|bya]] 31557600000000000
Gyr [[年|Ga]] 31557600000000000
BP [[BP (年代測定)|BP]]
uBP [[放射性炭素年代測定|<sup>14</sup>C yr BP]]
BC [[西暦|BC]] -1
AD [[西暦|AD]] 1
BCE [[:en:Common Era|BCE]] -1
CE [[:en:Common Era|CE]] 1
s-1 [[毎秒|s<sup>−1</sup>]]
s-2 [[秒|s<sup>−2</sup>]]
s2 [[秒|s<sup>2</sup>]]
s [[秒|s]] SI
as [[:en:Attosecond|s]] SI
cs [[秒|s]] SI
das [[秒|s]] SI
ds [[秒|s]] SI
Es [[秒|s]] SI
fs [[:en:Femtosecond|s]] SI
Gs [[秒|s]] SI
hs [[秒|s]] SI
ks [[秒|s]] SI
ms [[1 E-3 s|s]] SI
µs [[:en:Microsecond|s]] SI
us [[:en:Microsecond|s]] SI
Ms [[秒|s]] SI
ns [[:en:Nanosecond|s]] SI
ps [[:en:Picosecond|s]] SI
Ps [[秒|s]] SI
Ts [[秒|s]] SI
Ys [[秒|s]] SI
ys [[時間の比較|s]] SI
Zs [[秒|s]] SI
zs [[時間の比較|s]] SI
Hz [[ヘルツ|Hz]] SI
aHz [[ヘルツ|Hz]] SI
cHz [[ヘルツ|Hz]] SI
daHz [[ヘルツ|Hz]] SI
dHz [[ヘルツ|Hz]] SI
EHz [[ヘルツ|Hz]] SI
fHz [[ヘルツ|Hz]] SI
hHz [[ヘルツ|Hz]] SI
GHz [[ヘルツ|Hz]] SI
kHz [[ヘルツ|Hz]] SI
MHz [[ヘルツ|Hz]] SI
mHz [[ヘルツ|Hz]] SI
uHz [[ヘルツ|Hz]] SI
µHz [[ヘルツ|Hz]] SI
nHz [[ヘルツ|Hz]] SI
pHz [[ヘルツ|Hz]] SI
PHz [[ヘルツ|Hz]] SI
THz [[ヘルツ|Hz]] SI
yHz [[ヘルツ|Hz]] SI
YHz [[ヘルツ|Hz]] SI
zHz [[ヘルツ|Hz]] SI
ZHz [[ヘルツ|Hz]] SI
== Length, area, volume ==
fb-1 [[バーン (単位)|fb<sup>−1</sup>]]
mas [[秒 (角度)|mas]] pi/648000000
m-1 [[メートル|m<sup>−1</sup>]]
m-2 [[平方メートル|m<sup>−2</sup>]]
m-3 [[立方メートル|m<sup>−3</sup>]]
m [[メートル|m]]
m2 [[平方メートル|m<sup>2</sup>]]
m3 [[立方メートル|m<sup>3</sup>]]
meter [[メートル|m]] ALIAS
metre [[メートル|m]] ALIAS
am [[メートル|am]] 1e-18
cm [[センチメートル|cm]] 1e-2
cm2 [[平方センチメートル|cm<sup>2</sup>]] 1e-4
cm3 [[立方センチメートル|cm<sup>3</sup>]] 1e-6
dam [[デカメートル|dam]] 1e1
dm [[デシメートル|dm]] 1e-1
Em [[メートル|m]] SI
fm [[メートル|m]] SI
Gm [[メートル|m]] SI
hm [[ヘクトメートル|hm]] 1e2
km [[キロメートル|km]] 1e3
km2 [[平方キロメートル|km<sup>2</sup>]] 1e6
km3 [[立方キロメートル|km<sup>3</sup>]] 1e9
Mm [[メガメートル|Mm]] 1e6
mm [[ミリメートル|mm]] 1e-3
um [[マイクロメートル|µm]] 1e-6
µm [[マイクロメートル|µm]] 1e-6
nm [[ナノメートル|nm]] 1e-9
Pm [[メートル|m]] SI
pm [[ピコメートル|pm]] 1e-12
Tm [[メートル|m]] SI
Ym [[メートル|m]] SI
ym [[メートル|m]] SI
Zm [[メートル|m]] SI
zm [[メートル|m]] SI
angstrom [[オングストローム|Å]] 1e-10
ang [[オングストローム|Å]] ALIAS 1e-10
µm2 [[平方メートル|µm<sup>2</sup>]] 1e-12
um2 [[平方メートル|µm<sup>2</sup>]] 1e-12
am2 [[平方メートル|am<sup>2</sup>]] 1e-36
cm2 [[平方センチメートル|cm<sup>2</sup>]] 1e-4
dam2 [[平方メートル|dam<sup>2</sup>]] 1e2
dm2 [[平方メートル|dm<sup>2</sup>]] 1e-2
Em2 [[平方メートル|Em<sup>2</sup>]]
fm2 [[平方メートル|fm<sup>2</sup>]]
Gm2 [[平方メートル|Gm<sup>2</sup>]]
hm2 [[平方メートル|hm<sup>2</sup>]]
mm2 [[平方メートル|mm<sup>2</sup>]]
Mm2 [[平方メートル|Mm<sup>2</sup>]]
nm2 [[平方メートル|nm<sup>2</sup>]]
pm2 [[平方メートル|pm<sup>2</sup>]]
Pm2 [[平方メートル|Pm<sup>2</sup>]]
Tm2 [[平方メートル|Tm<sup>2</sup>]]
ym2 [[平方メートル|ym<sup>2</sup>]]
Ym2 [[平方メートル|Ym<sup>2</sup>]]
zm2 [[平方メートル|zm<sup>2</sup>]]
Zm2 [[平方メートル|Zm<sup>2</sup>]]
gal [[ガロン|gal]]
dm3 [[リットル|dm<sup>3</sup>]]
l [[リットル|l]]
L [[リットル|L]]
l-1 [[リットル|l<sup>−1</sup>]]
L-1 [[リットル|L<sup>−1</sup>]]
== Velocity and acceleration ==
m/s2 [[メートル毎秒毎秒|m/s<sup>2</sup>]]
m.s-2 [[メートル毎秒毎秒|m⋅s<sup>−2</sup>]]
m/s [[メートル毎秒|m/s]]
km/s [[メートル毎秒|m/s]] SI
m.s-1 [[メートル毎秒|m⋅s<sup>−1</sup>]]
km.s-1 [[メートル毎秒|km⋅s<sup>−1</sup>]]
km/h/s [[キロメートル毎時毎秒|km/h/s]] 1000/3600
km/h [[キロメートル毎時|km/h]] 1000/3600
Gal [[ガル|Gal]]
uGal [[ガル|µGal]]
µGal [[ガル|µGal]]
mGal [[ガル|mGal]]
== Mass and energy ==
lbm [[ポンド (質量)|<span title="ポンド">lb<sub>m</sub></span>]]
uJ [[ジュール|µJ]]
J.s [[:en:Joule-second|J⋅s]]
kWh [[キロワット時|kWh]]
kW.h [[キロワット時|kW⋅h]]
kW·h [[キロワット時|kW⋅h]]
J/C [[ボルト (単位)|J/C]]
J/kg [[ジュール|J/kg]]
g [[グラム|g]] SI
ag [[キログラム|g]] SI
cg [[キログラム|g]] SI
dag [[グラム|g]] SI
dg [[キログラム|g]] SI
Eg [[キログラム|g]] SI
fg [[キログラム|g]] SI
Gg [[キログラム|g]] SI
hg [[キログラム|g]] SI
kg [[キログラム|kg]] 1000
mcg [[マイクログラム|g]] SI
Mg [[トン|g]] SI
mg [[ミリグラム|mg]] 0.001
ug [[キログラム|g]] SI
µg [[マイクログラム|g]] SI
ng [[ナノグラム|g]] SI
Pg [[キログラム|g]] SI
pg [[キログラム|g]] SI
Tg [[トン|g]] SI
yg [[キログラム|g]] SI
Yg [[質量の比較|g]] SI
zg [[キログラム|g]] SI
Zg [[質量の比較|g]] SI
t [[トン|t]]
== Force ==
N [[ニュートン (単位)|N]] SI
kN [[ニュートン (単位)|N]] SI
kgf [[重量キログラム|kgf]] 9.80665
kgw [[重量キログラム|kgw]] 9.80665
== Power ==
W [[ワット|W]] SI
aW [[ワット|W]] SI
cW [[ワット|W]] SI
daW [[ワット|W]] SI
dW [[ワット|W]] SI
EW [[ワット|W]] SI
fW [[ワット|W]] SI
GW [[ワット|W]] SI
hW [[ワット|W]] SI
kW [[ワット|W]] SI
mcW [[ワット|W]] SI
MW [[ワット|W]] SI
mW [[ワット|W]] SI
uW [[ワット|W]] SI
µW [[ワット|W]] SI
nW [[ワット|W]] SI
PW [[ワット|W]] SI
pW [[ワット|W]] SI
TW [[ワット|W]] SI
yW [[ワット|W]] SI
YW [[ワット|W]] SI
zW [[ワット|W]] SI
ZW [[ワット|W]] SI
== Pressure ==
psi [[重量ポンド毎平方インチ|psi]] 6894.7573
Pa [[パスカル (単位)|Pa]]
uPa [[パスカル (単位)|Pa]] SI
mPa [[パスカル (単位)|Pa]] SI
kPa [[パスカル (単位)|Pa]] SI
MPa [[パスカル (単位)|Pa]] SI
GPa [[パスカル (単位)|Pa]] SI
hPa [[ヘクトパスカル|hPa]] 100
mmHg [[水銀柱ミリメートル|mmHg]] 133.32239
kgf/cm2 [[重量キログラム毎平方センチメートル|kgf/cm<sup>2</sup>]] 98066.5
== Density ==
g/cm3 [[グラム毎立方センチメートル|g/cm<sup>3</sup>]] 1000
kg/m3 [[キログラム毎立方メートル|kg/m<sup>3</sup>]] 1
kg/cm3 [[密度|kg/cm<sup>3</sup>]] 1000000
g/L [[グラム毎リットル|g/L]] 1
g/l [[グラム毎リットル|g/L]] 1
mcg/dL [[グラム毎リットル|µg/dL]] 1e-05
mcg/dl [[グラム毎リットル|µg/dL]] 1e-05
mg/mL [[グラム毎リットル|mg/mL]] 1
mg/ml [[グラム毎リットル|mg/mL]] 1
ug/dL [[グラム毎リットル|µg/dL]] 1e-5
ug/dl [[グラム毎リットル|µg/dL]] 1e-5
μg/dL [[グラム毎リットル|μg/dL]] 1e-5
μg/dl [[グラム毎リットル|μg/dL]] 1e-5
mg/L [[グラム毎リットル|mg/dL]] 1e-3
mg/l [[グラム毎リットル|<abbr title="ミリグラム毎リットル">mg/L</abbr>]] 1e-3
mg/L [[グラム毎リットル|<abbr title="ミリグラム毎リットル">mg/L</abbr>]] 1e-3
mgl-1 [[グラム毎リットル|<abbr title="ミリグラム毎リットル">mg/L</abbr>]] 1e-3
mgL-1 [[グラム毎リットル|<abbr title="ミリグラム毎リットル">mg/L</abbr>]] 1e-3
== Temperature ==
degC [[セルシウス度|<span lang="en" xml:lang="en">°C</span>]]
degF [[華氏|<span lang="en" xml:lang="en">°F</span>]]
degR [[ランキン度|<span lang="en" xml:lang="en">°R</span>]]
Celsius [[セルシウス度|℃]]
Fahrenheit [[華氏|℉]]
K [[ケルビン|K]] SI
YK [[ケルビン|K]] SI
ZK [[ケルビン|K]] SI
EK [[ケルビン|K]] SI
PK [[ケルビン|K]] SI
TK [[ケルビン|K]] SI
GK [[ケルビン|K]] SI
MK [[ケルビン|K]] SI
kK [[ケルビン|K]] SI
hK [[ケルビン|K]] SI
daK [[ケルビン|K]] SI
dK [[ケルビン|K]] SI
cK [[ケルビン|K]] SI
mK [[ケルビン|K]] SI
µK [[ケルビン|K]] SI
uK [[ケルビン|K]] SI
nK [[ケルビン|K]] SI
pK [[ケルビン|K]] SI
fK [[ケルビン|K]] SI
aK [[ケルビン|K]] SI
zK [[ケルビン|K]] SI
yK [[ケルビン|K]] SI
== Electromagnetism ==
Wb [[ウェーバ|Wb]]
N.A-2 [[透磁率|N⋅A<sup>−2</sup>]]
H.m-1 [[透磁率|H·m<sup>−1</sup>]]
V/m [[電場|V/m]]
V.m-1 [[電場|V⋅m<sup>−1</sup>]]
C [[クーロン|C]] SI
YC [[クーロン|C]] SI
ZC [[クーロン|C]] SI
EC [[クーロン|C]] SI
PC [[クーロン|C]] SI
TC [[クーロン|C]] SI
GC [[クーロン|C]] SI
MC [[クーロン|C]] SI
kC [[クーロン|C]] SI
hC [[クーロン|C]] SI
daC [[クーロン|C]] SI
dC [[クーロン|C]] SI
cC [[クーロン|C]] SI
mC [[クーロン|C]] SI
µC [[クーロン|C]] SI
uC [[クーロン|C]] SI
nC [[クーロン|C]] SI
pC [[クーロン|C]] SI
fC [[クーロン|C]] SI
aC [[クーロン|C]] SI
zC [[クーロン|C]] SI
yC [[クーロン|C]] SI
F [[ファラド|F]] SI
YF [[ファラド|F]] SI
ZF [[ファラド|F]] SI
EF [[ファラド|F]] SI
PF [[ファラド|F]] SI
TF [[ファラド|F]] SI
GF [[ファラド|F]] SI
MF [[ファラド|F]] SI
kF [[ファラド|F]] SI
hF [[ファラド|F]] SI
daF [[ファラド|F]] SI
dF [[ファラド|F]] SI
cF [[ファラド|F]] SI
mF [[ファラド|F]] SI
µF [[ファラド|F]] SI
uF [[ファラド|F]] SI
nF [[ファラド|F]] SI
pF [[ファラド|F]] SI
fF [[ファラド|F]] SI
aF [[ファラド|F]] SI
zF [[ファラド|F]] SI
yF [[ファラド|F]] SI
H [[ヘンリー (単位)|H]] SI
YH [[ヘンリー (単位)|H]] SI
ZH [[ヘンリー (単位)|H]] SI
EH [[ヘンリー (単位)|H]] SI
PH [[ヘンリー (単位)|H]] SI
TH [[ヘンリー (単位)|H]] SI
GH [[ヘンリー (単位)|H]] SI
MH [[ヘンリー (単位)|H]] SI
kH [[ヘンリー (単位)|H]] SI
hH [[ヘンリー (単位)|H]] SI
daH [[ヘンリー (単位)|H]] SI
dH [[ヘンリー (単位)|H]] SI
cH [[ヘンリー (単位)|H]] SI
mH [[ヘンリー (単位)|H]] SI
µH [[ヘンリー (単位)|H]] SI
uH [[ヘンリー (単位)|H]] SI
nH [[ヘンリー (単位)|H]] SI
pH [[ヘンリー (単位)|H]] SI
fH [[ヘンリー (単位)|H]] SI
aH [[ヘンリー (単位)|H]] SI
zH [[ヘンリー (単位)|H]] SI
yH [[ヘンリー (単位)|H]] SI
A [[アンペア|A]] SI
YA [[アンペア|A]] SI
ZA [[アンペア|A]] SI
EA [[アンペア|A]] SI
PA [[アンペア|A]] SI
TA [[アンペア|A]] SI
GA [[アンペア|A]] SI
MA [[アンペア|A]] SI
kA [[アンペア|A]] SI
hA [[アンペア|A]] SI
daA [[アンペア|A]] SI
dA [[アンペア|A]] SI
cA [[アンペア|A]] SI
mA [[アンペア|A]] SI
µA [[アンペア|A]] SI
uA [[アンペア|A]] SI
nA [[アンペア|A]] SI
pA [[アンペア|A]] SI
fA [[アンペア|A]] SI
aA [[アンペア|A]] SI
zA [[アンペア|A]] SI
yA [[アンペア|A]] SI
V [[ボルト (単位)|V]] SI
YV [[ボルト (単位)|V]] SI
ZV [[ボルト (単位)|V]] SI
EV [[ボルト (単位)|V]] SI
PV [[ボルト (単位)|V]] SI
TV [[ボルト (単位)|V]] SI
GV [[ボルト (単位)|V]] SI
MV [[ボルト (単位)|V]] SI
kV [[ボルト (単位)|V]] SI
hV [[ボルト (単位)|V]] SI
daV [[ボルト (単位)|V]] SI
dV [[ボルト (単位)|V]] SI
cV [[ボルト (単位)|V]] SI
mV [[ボルト (単位)|V]] SI
µV [[ボルト (単位)|V]] SI
uV [[ボルト (単位)|V]] SI
nV [[ボルト (単位)|V]] SI
pV [[ボルト (単位)|V]] SI
fV [[ボルト (単位)|V]] SI
aV [[ボルト (単位)|V]] SI
zV [[ボルト (単位)|V]] SI
yV [[ボルト (単位)|V]] SI
VA [[ボルトアンペア|VA]] SI
YVA [[ボルトアンペア|VA]] SI
ZVA [[ボルトアンペア|VA]] SI
EVA [[ボルトアンペア|VA]] SI
PVA [[ボルトアンペア|VA]] SI
TVA [[ボルトアンペア|VA]] SI
GVA [[ボルトアンペア|VA]] SI
MVA [[ボルトアンペア|VA]] SI
kVA [[ボルトアンペア|VA]] SI
hVA [[ボルトアンペア|VA]] SI
daVA [[ボルトアンペア|VA]] SI
dVA [[ボルトアンペア|VA]] SI
cVA [[ボルトアンペア|VA]] SI
mVA [[ボルトアンペア|VA]] SI
µVA [[ボルトアンペア|VA]] SI
uVA [[ボルトアンペア|VA]] SI
nVA [[ボルトアンペア|VA]] SI
pVA [[ボルトアンペア|VA]] SI
fVA [[ボルトアンペア|VA]] SI
aVA [[ボルトアンペア|VA]] SI
zVA [[ボルトアンペア|VA]] SI
yVA [[ボルトアンペア|VA]] SI
S [[ジーメンス|S]]
mS [[ジーメンス|S]] SI
S/m [[ジーメンス毎メートル|S/m]]
mS/m [[ジーメンス毎メートル|S/m]] SI
S/cm [[ジーメンス毎メートル|S/cm]] 1e+2
mS/cm [[ジーメンス毎メートル|mS/cm]] 1e-1
R [[レイリー (単位)|R]] SI
G [[ガウス (単位)|G]] SI
aG [[ガウス (単位)|G]] SI
cG [[ガウス (単位)|G]] SI
daG [[ガウス (単位)|G]] SI
dG [[ガウス (単位)|G]] SI
EG [[ガウス (単位)|G]] SI
fG [[ガウス (単位)|G]] SI
GG [[ガウス (単位)|G]] SI
hG [[ガウス (単位)|G]] SI
kG [[ガウス (単位)|G]] SI
MG [[ガウス (単位)|G]] SI
mG [[ガウス (単位)|G]] SI
uG [[ガウス (単位)|G]] SI
µG [[ガウス (単位)|G]] SI
nG [[ガウス (単位)|G]] SI
PG [[ガウス (単位)|G]] SI
pG [[ガウス (単位)|G]] SI
TG [[ガウス (単位)|G]] SI
yG [[ガウス (単位)|G]] SI
YG [[ガウス (単位)|G]] SI
zG [[ガウス (単位)|G]] SI
ZG [[ガウス (単位)|G]] SI
T [[テスラ (単位)|T]] SI
aT [[テスラ (単位)|T]] SI
cT [[テスラ (単位)|T]] SI
daT [[テスラ (単位)|T]] SI
dT [[テスラ (単位)|T]] SI
ET [[テスラ (単位)|T]] SI
fT [[テスラ (単位)|T]] SI
GT [[テスラ (単位)|T]] SI
hT [[テスラ (単位)|T]] SI
kT [[テスラ (単位)|T]] SI
MT [[テスラ (単位)|T]] SI
mT [[テスラ (単位)|T]] SI
uT [[テスラ (単位)|T]] SI
µT [[テスラ (単位)|T]] SI
μT [[テスラ (単位)|T]] SI
nT [[テスラ (単位)|T]] SI
PT [[テスラ (単位)|T]] SI
pT [[テスラ (単位)|T]] SI
TT [[テスラ (単位)|T]] SI
yT [[テスラ (単位)|T]] SI
YT [[テスラ (単位)|T]] SI
zT [[テスラ (単位)|T]] SI
ZT [[テスラ (単位)|T]] SI
emu [[CGS-emu|emu]]
== Astrophysics ==
au [[天文単位|au]]
c [[光速|''c'']]
ly [[光年|ly]]
Earth mass [[地球質量|''M''<sub>⊕</sub>]]
Earth radius [[地球半径|''R''<sub>⊕</sub>]]
M_Earth [[地球質量|''M''<sub>⊕</sub>]]
R_Earth [[地球半径|''R''<sub>⊕</sub>]]
Jupiter mass [[木星質量|''M''<sub>J</sub>]]
Jupiter radius [[木星半径|''R''<sub>J</sub>]]
M_Jupiter [[木星質量|''M''<sub>J</sub>]]
R_Jupiter [[木星半径|''R''<sub>J</sub>]]
Solar mass [[太陽質量|''M''<sub>☉</sub>]]
solar mass [[太陽質量|''M''<sub>☉</sub>]]
M_Solar [[太陽質量|''M''<sub>☉</sub>]]
M_solar [[太陽質量|''M''<sub>☉</sub>]]
R_Solar [[太陽半径|''R''<sub>☉</sub>]]
R_solar [[太陽半径|''R''<sub>☉</sub>]]
Solar radius [[太陽半径|''R''<sub>☉</sub>]]
solar radius [[太陽半径|''R''<sub>☉</sub>]]
Solar luminosity [[太陽光度|''L''<sub>☉</sub>]]
solar luminosity [[太陽光度|''L''<sub>☉</sub>]]
L_solar [[太陽光度|''L''<sub>☉</sub>]]
L_Solar [[太陽光度|''L''<sub>☉</sub>]]
pc2 [[パーセク|pc<sup>2</sup>]]
pc3 [[パーセク|pc<sup>3</sup>]]
kpc2 [[パーセク|kpc<sup>2</sup>]]
kpc3 [[パーセク|kpc<sup>3</sup>]]
kpc [[パーセク|kpc]]
Mpc2 [[パーセク|Mpc<sup>2</sup>]]
Mpc3 [[パーセク|Mpc<sup>3</sup>]]
Mpc [[パーセク|Mpc]]
Gpc2 [[パーセク|Gpc<sup>2</sup>]]
Gpc3 [[パーセク|Gpc<sup>3</sup>]]
Gpc [[パーセク|Gpc]]
== Nuclear Physics and Chemistry ==
cm-1 [[波数|cm<sup>−1</sup>]]
u [[統一原子質量単位|u]]
mol [[モル|mol]]
osmol [[オスモル|osmol]]
Osm [[オスモル|Osm]]
M [[モル濃度|M]]
TM [[モル濃度|M]] SI
GM [[モル濃度|M]] SI
MM [[モル濃度|M]] SI
kM [[モル濃度|M]] SI
hM [[モル濃度|M]] SI
daM [[モル濃度|M]] SI
dM [[モル濃度|M]] SI
cM [[モル濃度|M]] SI
mM [[モル濃度|M]] SI
uM [[モル濃度|M]] 1e-6
nM [[モル濃度|M]] SI
pM [[モル濃度|M]] SI
kg/mol [[モル質量|kg/mol]]
kg.mol-1 [[モル質量|kg⋅mol<sup>−1</sup>]]
g/mol [[モル質量|g/mol]]
g.mol-1 [[モル質量|g⋅mol<sup>−1</sup>]]
eV/c2 [[電子ボルト|eV/''c''<sup>2</sup>]]
keV/c2 [[電子ボルト|keV/''c''<sup>2</sup>]]
MeV/c2 [[電子ボルト|MeV/''c''<sup>2</sup>]]
GeV/c2 [[電子ボルト|GeV/''c''<sup>2</sup>]]
TeV/c2 [[電子ボルト|TeV/''c''<sup>2</sup>]]
µN [[核磁子|µ<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:left"><br />N</span>]]
µB [[ボーア磁子|µ<span style="display:inline-block;margin-bottom:-0.3em;vertical-align:-0.4em;line-height:1.2em;font-size:85%;text-align:left"><br />B</span>]]
eV [[電子ボルト|eV]] 1.6021766e-19
mev [[電子ボルト|meV]] 1.6021766e-22
keV [[電子ボルト|keV]] 1.6021766e-16
MeV [[電子ボルト|MeV]] 1.6021766e-13
GeV [[電子ボルト|GeV]] 1.6021766e-10
TeV [[電子ボルト|TeV]] 1.6021766e-7
J/mol [[ジュール毎モル|J/mol]] 1.66054e-24
J.mol-1 [[ジュール毎モル|J⋅mol<sup>−1</sup>]] 1.66054e-24
kJ.mol-1 [[ジュール毎モル|kJ⋅mol<sup>−1</sup>]] 1.66054e-21
kJ/mol [[ジュール毎モル|kJ/mol]] 1.66054e-21
MJ.mol-1 [[ジュール毎モル|MJ⋅mol<sup>−1</sup>]] 1.66054e-18
MJ/mol [[ジュール毎モル|MJ/mol]] 1.66054e-18
GJ/mol [[ジュール毎モル|GJ/mol]] 1.66054e-15
GJ.mol-1 [[ジュール毎モル|GJ⋅mol<sup>−1</sup>]] 1.66054e-15
TJ.mol-1 [[ジュール毎モル|TJ⋅mol<sup>−1</sup>]] 1.66054e-12
TJ/mol [[ジュール毎モル|TJ/mol]] 1.66054e-12
cal/mol [[カロリー毎モル|cal/mol]] 6.9476953e-24
cal.mol-1 [[カロリー毎モル|cal⋅mol<sup>−1</sup>]] 6.9476953e-24
kcal.mol-1 [[カロリー毎モル|kcal⋅mol<sup>−1</sup>]] 6.9476953e-21
kcal/mol [[カロリー毎モル|kcal/mol]] 6.9476953e-21
Mcal.mol-1 [[カロリー毎モル|Mcal⋅mol<sup>−1</sup>]] 6.9476953e-18
Mcal/mol [[カロリー毎モル|Mcal/mol]] 6.9476953e-18
Gcal/mol [[カロリー毎モル|Gcal/mol]] 6.9476953e-15
Gcal.mol-1 [[カロリー毎モル|Gcal⋅mol<sup>−1</sup>]] 6.9476953e-15
Tcal.mol-1 [[カロリー毎モル|Tcal⋅mol<sup>−1</sup>]] 6.9476953e-12
Tcal/mol [[カロリー毎モル|Tcal/mol]] 6.9476953e-12
== Numbers and phrases ==
pp [[:en:Page (paper)|pp]]
ppb [[ppm|ppb]] 1e-9
ppm [[ppm|ppm]] 1e-6
billiard [[:en:Orders of magnitude (numbers)#1015|billiard]] 1e15
billion [[1 E9|billion]] 1e9
billionth [[1 E9|billionth]] 1e-9
billionths [[1 E9|billionths]] 1e-9
decilliard [[:en:Orders of magnitude (numbers)#1063|decilliard]] 1e63
decillion [[:en:Orders of magnitude (numbers)#1033|decillion]] 1e33
decillionth [[:en:Orders of magnitude (numbers)#1033|decillionth]] 1e-33
decillionths [[:en:Orders of magnitude (numbers)#1033|decillionths]] 1e-33
milliard [[1 E9|milliard]] 1e9
million [[1000000|million]] 1e6
millionth [[1000000|millionth]] 1e-6
millionths [[1000000|millionths]] 1e-6
nonilliard [[:en:Orders of magnitude (numbers)#1057|nonilliard]] 1e57
nonillion [[:en:Orders of magnitude (numbers)#1030|nonillion]] 1e30
nonillionth [[:en:Orders of magnitude (numbers)#1030|nonillionth]] 1e-30
nonillionths [[:en:Orders of magnitude (numbers)#1030|nonillionths]] 1e-30
octilliard [[:en:Orders of magnitude (numbers)#1051|octilliard]] 1e51
octillion [[:en:Orders of magnitude (numbers)#1027|octillion]] 1e27
octillionth [[:en:Orders of magnitude (numbers)#1027|octillionth]] 1e-27
octillionths [[:en:Orders of magnitude (numbers)#1027|octillionths]] 1e-27
quadrilliard [[:en:Orders of magnitude (numbers)#1027|quadrilliard]] 1e27
quadrillion [[:en:Orders of magnitude (numbers)#1015|quadrillion]] 1e15
quadrillionth [[:en:Orders of magnitude (numbers)#1015|quadrillionth]] 1e-15
quadrillionths [[:en:Orders of magnitude (numbers)#1015|quadrillionths]] 1e-15
quintilliard [[:en:Orders of magnitude (numbers)#1033|quintilliard]] 1e33
quintillion [[:en:Orders of magnitude (numbers)#1018|quintillion]] 1e18
quintillionth [[:en:Orders of magnitude (numbers)#1018|quintillionth]] 1e-18
quintillionths [[:en:Orders of magnitude (numbers)#1018|quintillionths]] 1e-18
septilliard [[:en:Orders of magnitude (numbers)#1045|septilliard]] 1e45
septillion [[:en:Orders of magnitude (numbers)#1024|septillion]] 1e24
septillionth [[:en:Orders of magnitude (numbers)#1024|septillionth]] 1e-24
septillionths [[:en:Orders of magnitude (numbers)#1024|septillionths]] 1e-24
sextilliard [[:en:Orders of magnitude (numbers)#1039|sextilliard]] 1e39
sextillion [[:en:Orders of magnitude (numbers)#1021|sextillion]] 1e21
sextillionth [[:en:Orders of magnitude (numbers)#1021|sextillionth]] 1e-21
sextillionths [[:en:Orders of magnitude (numbers)#1021|sextillionths]] 1e-21
trilliard [[:en:Orders of magnitude (numbers)#1021|trilliard]] 1e21
trillion [[:en:Orders of magnitude (numbers)#1012|trillion]] 1e12
trillionth [[:en:Orders of magnitude (numbers)#1012|trillionth]] 1e-12
trillionths [[:en:Orders of magnitude (numbers)#1012|trillionths]] 1e-12
== Angles ==
% % パーセント ANGLE 0.01
percent % パーセント ANGLE 0.01
per cent % パーセント ANGLE 0.01
‰ ‰ パーミル ANGLE 1e-3
per mil ‰ パーミル ANGLE 1e-3
per mill ‰ パーミル ANGLE 1e-3
per mille ‰ パーミル ANGLE 1e-3
permil ‰ パーミル ANGLE 1e-3
permill ‰ パーミル ANGLE 1e-3
permille ‰ パーミル ANGLE 1e-3
° ° 度 (角度) ANGLE pi/180
deg ° 度 (角度) ANGLE pi/180
' ′ 分 (角度) ANGLE pi/10800
′ ′ 分 (角度) ANGLE pi/10800
arcmin ′ 分 (角度) ANGLE pi/10800
arcminute ′ 分 (角度) ANGLE pi/10800
" ″ 秒 (角度) ANGLE pi/648000
″ ″ 秒 (角度) ANGLE pi/648000
arcsec ″ 秒 (角度) ANGLE pi/648000
arcsecond ″ 秒 (角度) ANGLE pi/648000
]=]
-- If val has "|long scale=on" the following definitions are used
-- (then, if not found here, the normal definitions are used).
-- Unit code [[Link|Symbol]] Flags/Scale
local builtin_units_long_scale = [=[
== Long scale numbers and phrases ==
billion [[:en:Orders of magnitude (numbers)#1012|billion]] 1e12
billionth [[:en:Orders of magnitude (numbers)#1012|billionth]] 1e-12
billionths [[:en:Orders of magnitude (numbers)#1012|billionths]] 1e-12
decillion [[:en:Orders of magnitude (numbers)#1060|decillion]] 1e60
decillionth [[:en:Orders of magnitude (numbers)#1060|decillionth]] 1e-60
decillionths [[:en:Orders of magnitude (numbers)#1060|decillionths]] 1e-60
nonillion [[:en:Orders of magnitude (numbers)#1054|nonillion]] 1e54
nonillionth [[:en:Orders of magnitude (numbers)#1054|nonillionth]] 1e-54
nonillionths [[:en:Orders of magnitude (numbers)#1054|nonillionths]] 1e-54
octillion [[:en:Orders of magnitude (numbers)#1048|octillion]] 1e48
octillionth [[:en:Orders of magnitude (numbers)#1048|octillionth]] 1e-48
octillionths [[:en:Orders of magnitude (numbers)#1048|octillionths]] 1e-48
quadrillion [[:en:Orders of magnitude (numbers)#1024|quadrillion]] 1e24
quadrillionth [[:en:Orders of magnitude (numbers)#1024|quadrillionth]] 1e-24
quadrillionths [[:en:Orders of magnitude (numbers)#1024|quadrillionths]] 1e-24
quintillion [[:en:Orders of magnitude (numbers)#1030|quintillion]] 1e30
quintillionth [[:en:Orders of magnitude (numbers)#1030|quintillionth]] 1e-30
quintillionths [[:en:Orders of magnitude (numbers)#1030|quintillionths]] 1e-30
septillion [[:en:Orders of magnitude (numbers)#1042|septillion]] 1e42
septillionth [[:en:Orders of magnitude (numbers)#1042|septillionth]] 1e-42
septillionths [[:en:Orders of magnitude (numbers)#1042|septillionths]] 1e-42
sextillion [[:en:Orders of magnitude (numbers)#1036|sextillion]] 1e36
sextillionth [[:en:Orders of magnitude (numbers)#1036|sextillionth]] 1e-36
sextillionths [[:en:Orders of magnitude (numbers)#1036|sextillionths]] 1e-36
trillion [[:en:Orders of magnitude (numbers)#1018|trillion]] 1e18
trillionth [[:en:Orders of magnitude (numbers)#1018|trillionth]] 1e-18
trillionths [[:en:Orders of magnitude (numbers)#1018|trillionths]] 1e-18
]=]
return { builtin_units = builtin_units, builtin_units_long_scale = builtin_units_long_scale }
fc76yhj0ybfy366lxhnkezxo3nmku1j