「script」タグアーカイブ

【ぷ】Pythonで為替を取得する@1Forge

image

追記:Quandlでもデータ提供してる

追記:ForexDataClient.py要直し

追記:ライブラリとして入れる必要ないと思う

1Forgeというサービスで、無料で為替情報が取得できます(1000Request/日まで、それ以上は有料)

ご丁寧に、PHP/Javascript/Ruby/Python2のライブラリやサンプルコードも公開されてます。

PHPとJavascriptはソケット通信が可能らしい。湯水の如く為替情報が扱える。Javascriptは、Node.js使えるのかな?

ここは時代の潮流に乗ってPythonに慣れておこうと、Pythonをチョイス。

だが・・、サンプルはPython2で書かれてる。

(;´Д`)今はPython3

ほとんど無知なやつが、Python3で動くまで頑張ったプチドキュメントだ。

まずは、これでライブラリーをPIPでインストールする(Gitはここ

pip install python_forex_quotes

追記:ライブラリとして入れる必要ないと思う

1個だけのファイルなので、ライブラリとして導入するよりも、外部pyファイルとして利用した方が良さそうです(結局ファイルをイジるので)同じホルダーに置いて、

import ForexDataClient as fdcとしてインポートして。

client = fdc.ForexDataClient(・・

と直すだけです。但し、コンパイル済みホルダーがPythonによって生成されます(__pycache__)

image

・・とはいえ、何てことはない、GitにもあるForexDataClient.pyが一個入ってるだけのライブラリーです。

image

コードもとてもシンプル。URLを生成してるだけ。このままではPython3で動かないので変更します(printんとこ、とurllib)

追記:ForexDataClient.py要直し

def fetch(self, uri):の中の以下の部分を変更しないと動かない時があるので、変更おすすめ。バイト列を文字列にデコードしてます(WindowsではOKだったが、Linuxでエラーだった)

return json.loads(response.read().decode(‘utf8’))

(追記終わり)

Gitにある、ForexDataClient.pyを、ライブラリー内のモノに上書きコピーします(Gitの方は3対応済み)

※urllibも、urllib.requestに変更になってる

私の環境では、以下のパスでした(Win10、64bit版Python3.7.0インスラー版)

C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37\Lib\site-packages\python_forex_quotes

image

そしたら、サンプルコードのexample.pyを編集します。

ここでの編集点は、まさに”print”です。

5箇所のprintに、()を追加します。printはオブジェクトです。オブジェクトになってしまったのです。

ついでに、もらったAPIキーも記述しておきましょう。

これで、Python3でも動くはずです。

marketIsOpen() は、市場が開いてるか?(どこの市場だろう)

true/false

追記:これがfalseになるタイミングに遭遇しました。機能してます(日曜深夜)

getSymbols()は、扱える通貨ペアのリスト

[‘EURHKD’, ‘EURCNH’, ‘EURDKK’, ‘EURMXN’, ‘EURPLN’, ‘EURXAG’,……..]

getQuotes()は、為替情報の取得(複数可)

[{‘symbol’: ‘EURUSD’, ‘bid’: 1.17943, ‘ask’: 1.17944, ‘price’: 1.17944, ‘timestamp’: 1537798274}, {‘symbol’: ‘GBPJPY’, ‘bid’: 147.934, ‘ask’: 147.938, ‘price’: 147.936, ‘timestamp’: 1537798274}]

timestampは以下のようにすると、日付を解析できます。

import datetime
a=client.getQuotes([‘EURUSD’, ‘GBPJPY’]))
datetime.date.fromtimestamp(a[0][“timestamp”])
出力:datetime.date(2018, 9, 25)

quota()は、API残り使用数

{‘quota_used’: 3, ‘quota_limit’: 1000, ‘quota_remaining’: 997, ‘hours_until_reset’: 14}

convert()は、通貨の交換値

{‘value’: 117.944, ‘text’: ‘100 EUR is worth 117.944 USD’, ‘timestamp’: 1537798275}

現在(2018/9/25)時点での使える全通貨ペアは以下のようです。

[‘EURHKD’, ‘EURCNH’, ‘EURDKK’, ‘EURMXN’, ‘EURPLN’, ‘EURXAG’, ‘EURXAU’, ‘EURBTC’, ‘EURETH’, ‘EURLTC’, ‘EURXRP’, ‘EURDSH’, ‘EURBCH’, ‘USDEUR’, ‘USDGBP’, ‘USDAUD’, ‘USDNZD’, ‘USDXAG’, ‘USDXAU’, ‘USDBTC’, ‘USDETH’, ‘USDLTC’, ‘USDXRP’, ‘USDDSH’, ‘USDBCH’, ‘JPYEUR’, ‘JPYUSD’, ‘JPYGBP’, ‘JPYCAD’, ‘JPYCHF’, ‘JPYAUD’, ‘JPYNZD’, ‘JPYSGD’, ‘JPYNOK’, ‘JPYRUB’, ‘JPYSEK’, ‘JPYTRY’, ‘JPYZAR’, ‘JPYHKD’, ‘JPYCNH’, ‘JPYDKK’, ‘JPYMXN’, ‘JPYPLN’, ‘JPYXAG’, ‘JPYXAU’, ‘JPYBTC’, ‘JPYETH’, ‘JPYLTC’, ‘JPYXRP’, ‘JPYDSH’, ‘JPYBCH’, ‘GBPEUR’, ‘GBPRUB’, ‘GBPTRY’, ‘GBPZAR’, ‘GBPCNH’, ‘GBPDKK’, ‘GBPMXN’, ‘GBPPLN’, ‘GBPXAG’, ‘GBPXAU’, ‘GBPBTC’, ‘GBPETH’, ‘GBPLTC’, ‘GBPXRP’, ‘GBPDSH’, ‘GBPBCH’, ‘CADEUR’, ‘CADUSD’, ‘CADGBP’, ‘CADAUD’, ‘CADNZD’, ‘CADSGD’, ‘CADNOK’, ‘CADRUB’, ‘CADSEK’, ‘CADTRY’, ‘CADZAR’, ‘CADHKD’, ‘CADCNH’, ‘CADDKK’, ‘CADMXN’, ‘CADPLN’, ‘CADXAG’, ‘CADXAU’, ‘CADBTC’, ‘CADETH’, ‘CADLTC’, ‘CADXRP’, ‘CADDSH’, ‘CADBCH’, ‘CHFEUR’, ‘CHFUSD’, ‘CHFGBP’, ‘CHFCAD’, ‘CHFAUD’, ‘CHFNZD’, ‘CHFNOK’, ‘CHFRUB’, ‘CHFSEK’, ‘CHFTRY’, ‘CHFZAR’, ‘CHFHKD’, ‘CHFCNH’, ‘CHFDKK’, ‘CHFMXN’, ‘CHFPLN’, ‘CHFXAG’, ‘CHFXAU’, ‘CHFBTC’, ‘CHFETH’, ‘CHFLTC’, ‘CHFXRP’, ‘CHFDSH’, ‘CHFBCH’, ‘AUDEUR’, ‘AUDGBP’, ‘AUDNOK’, ‘AUDRUB’, ‘AUDSEK’, ‘AUDTRY’, ‘AUDZAR’, ‘AUDHKD’, ‘AUDCNH’, ‘AUDDKK’, ‘AUDMXN’, ‘AUDPLN’, ‘AUDXAG’, ‘AUDXAU’, ‘AUDBTC’, ‘AUDETH’, ‘AUDLTC’, ‘AUDXRP’, ‘AUDDSH’, ‘AUDBCH’, ‘NZDEUR’, ‘NZDGBP’, ‘NZDAUD’, ‘NZDSGD’, ‘NZDNOK’, ‘NZDRUB’, ‘NZDSEK’, ‘NZDTRY’, ‘NZDZAR’, ‘NZDHKD’, ‘NZDCNH’, ‘NZDDKK’, ‘NZDMXN’, ‘NZDPLN’, ‘NZDXAG’, ‘NZDXAU’, ‘NZDBTC’, ‘NZDETH’, ‘NZDLTC’, ‘NZDXRP’, ‘NZDDSH’, ‘NZDBCH’, ‘SGDEUR’, ‘SGDUSD’, ‘SGDGBP’, ‘SGDCAD’, ‘SGDCHF’, ‘SGDAUD’, ‘SGDNZD’, ‘SGDNOK’, ‘SGDRUB’, ‘SGDSEK’, ‘SGDTRY’, ‘SGDZAR’, ‘SGDHKD’, ‘SGDCNH’, ‘SGDDKK’, ‘SGDMXN’, ‘SGDPLN’, ‘SGDXAG’, ‘SGDXAU’, ‘SGDBTC’, ‘SGDETH’, ‘SGDLTC’, ‘SGDXRP’, ‘SGDDSH’, ‘SGDBCH’, ‘NOKEUR’, ‘NOKUSD’, ‘NOKGBP’, ‘NOKCAD’, ‘NOKCHF’, ‘NOKAUD’, ‘NOKNZD’, ‘NOKSGD’, ‘NOKRUB’, ‘NOKSEK’, ‘NOKTRY’, ‘NOKZAR’, ‘NOKHKD’, ‘NOKCNH’, ‘NOKDKK’, ‘NOKMXN’, ‘NOKPLN’, ‘NOKXAG’, ‘NOKXAU’, ‘NOKBTC’, ‘NOKETH’, ‘NOKLTC’, ‘NOKXRP’, ‘NOKDSH’, ‘NOKBCH’, ‘RUBEUR’, ‘RUBUSD’, ‘RUBJPY’, ‘RUBGBP’, ‘RUBCAD’, ‘RUBCHF’, ‘RUBAUD’, ‘RUBNZD’, ‘RUBSGD’, ‘RUBNOK’, ‘RUBSEK’, ‘RUBTRY’, ‘RUBZAR’, ‘RUBHKD’, ‘RUBCNH’, ‘RUBDKK’, ‘RUBMXN’, ‘RUBPLN’, ‘RUBXAG’, ‘RUBXAU’, ‘RUBBTC’, ‘RUBETH’, ‘RUBLTC’, ‘RUBXRP’, ‘RUBDSH’, ‘RUBBCH’, ‘SEKEUR’, ‘SEKUSD’, ‘SEKJPY’, ‘SEKGBP’, ‘SEKCAD’, ‘SEKCHF’, ‘SEKAUD’, ‘SEKNZD’, ‘SEKSGD’, ‘SEKNOK’, ‘SEKRUB’, ‘SEKTRY’, ‘SEKZAR’, ‘SEKHKD’, ‘SEKCNH’, ‘SEKDKK’, ‘SEKMXN’, ‘SEKPLN’, ‘SEKXAG’, ‘SEKXAU’, ‘SEKBTC’, ‘SEKETH’, ‘SEKLTC’, ‘SEKXRP’, ‘SEKDSH’, ‘SEKBCH’, ‘TRYEUR’, ‘TRYUSD’, ‘TRYJPY’, ‘TRYGBP’, ‘TRYCAD’, ‘TRYCHF’, ‘TRYAUD’, ‘TRYNZD’, ‘TRYSGD’, ‘TRYNOK’, ‘TRYRUB’, ‘TRYSEK’, ‘TRYZAR’, ‘TRYHKD’, ‘TRYCNH’, ‘TRYDKK’, ‘TRYMXN’, ‘TRYPLN’, ‘TRYXAG’, ‘TRYXAU’, ‘TRYBTC’, ‘TRYETH’, ‘TRYLTC’, ‘TRYXRP’, ‘TRYDSH’, ‘TRYBCH’, ‘ZAREUR’, ‘ZARUSD’, ‘ZARJPY’, ‘ZARGBP’, ‘ZARCAD’, ‘ZARCHF’, ‘ZARAUD’, ‘ZARNZD’, ‘ZARSGD’, ‘ZARNOK’, ‘ZARRUB’, ‘ZARSEK’, ‘ZARTRY’, ‘ZARHKD’, ‘ZARCNH’, ‘ZARDKK’, ‘ZARMXN’, ‘ZARPLN’, ‘ZARXAG’, ‘ZARXAU’, ‘ZARBTC’, ‘ZARETH’, ‘ZARLTC’, ‘ZARXRP’, ‘ZARDSH’, ‘ZARBCH’, ‘HKDEUR’, ‘HKDUSD’, ‘HKDJPY’, ‘HKDGBP’, ‘HKDCAD’, ‘HKDCHF’, ‘HKDAUD’, ‘HKDNZD’, ‘HKDSGD’, ‘HKDNOK’, ‘HKDRUB’, ‘HKDSEK’, ‘HKDTRY’, ‘HKDZAR’, ‘HKDCNH’, ‘HKDDKK’, ‘HKDMXN’, ‘HKDPLN’, ‘HKDXAG’, ‘HKDXAU’, ‘HKDBTC’, ‘HKDETH’, ‘HKDLTC’, ‘HKDXRP’, ‘HKDDSH’, ‘HKDBCH’, ‘CNHEUR’, ‘CNHUSD’, ‘CNHJPY’, ‘CNHGBP’, ‘CNHCAD’, ‘CNHCHF’, ‘CNHAUD’, ‘CNHNZD’, ‘CNHSGD’, ‘CNHNOK’, ‘CNHRUB’, ‘CNHSEK’, ‘CNHTRY’, ‘CNHZAR’, ‘CNHHKD’, ‘CNHDKK’, ‘CNHMXN’, ‘CNHPLN’, ‘CNHXAG’, ‘CNHXAU’, ‘CNHBTC’, ‘CNHETH’, ‘CNHLTC’, ‘CNHXRP’, ‘CNHDSH’, ‘CNHBCH’, ‘DKKEUR’, ‘DKKUSD’, ‘DKKJPY’, ‘DKKGBP’, ‘DKKCAD’, ‘DKKCHF’, ‘DKKAUD’, ‘DKKNZD’, ‘DKKSGD’, ‘DKKNOK’, ‘DKKRUB’, ‘DKKSEK’, ‘DKKTRY’, ‘DKKZAR’, ‘DKKHKD’, ‘DKKCNH’, ‘DKKMXN’, ‘DKKPLN’, ‘DKKXAG’, ‘DKKXAU’, ‘DKKBTC’, ‘DKKETH’, ‘DKKLTC’, ‘DKKXRP’, ‘DKKDSH’, ‘DKKBCH’, ‘MXNEUR’, ‘MXNUSD’, ‘MXNJPY’, ‘MXNGBP’, ‘MXNCAD’, ‘MXNCHF’, ‘MXNAUD’, ‘MXNNZD’, ‘MXNSGD’, ‘MXNNOK’, ‘MXNRUB’, ‘MXNSEK’, ‘MXNTRY’, ‘MXNZAR’, ‘MXNHKD’, ‘MXNCNH’, ‘MXNDKK’, ‘MXNPLN’, ‘MXNXAG’, ‘MXNXAU’, ‘MXNBTC’, ‘MXNETH’, ‘MXNLTC’, ‘MXNXRP’, ‘MXNDSH’, ‘MXNBCH’, ‘PLNEUR’, ‘PLNUSD’, ‘PLNJPY’, ‘PLNGBP’, ‘PLNCAD’, ‘PLNCHF’, ‘PLNAUD’, ‘PLNNZD’, ‘PLNSGD’, ‘PLNNOK’, ‘PLNRUB’, ‘PLNSEK’, ‘PLNTRY’, ‘PLNZAR’, ‘PLNHKD’, ‘PLNCNH’, ‘PLNDKK’, ‘PLNMXN’, ‘PLNXAG’, ‘PLNXAU’, ‘PLNBTC’, ‘PLNETH’, ‘PLNLTC’, ‘PLNXRP’, ‘PLNDSH’, ‘PLNBCH’, ‘XAGJPY’, ‘XAGGBP’, ‘XAGCAD’, ‘XAGCHF’, ‘XAGAUD’, ‘XAGNZD’, ‘XAGSGD’, ‘XAGNOK’, ‘XAGRUB’, ‘XAGSEK’, ‘XAGTRY’, ‘XAGZAR’, ‘XAGHKD’, ‘XAGCNH’, ‘XAGDKK’, ‘XAGMXN’, ‘XAGPLN’, ‘XAGXAU’, ‘XAGBTC’, ‘XAGETH’, ‘XAGLTC’, ‘XAGXRP’, ‘XAGDSH’, ‘XAGBCH’, ‘XAUEUR’, ‘XAUJPY’, ‘XAUGBP’, ‘XAUCAD’, ‘XAUCHF’, ‘XAUAUD’, ‘XAUNZD’, ‘XAUSGD’, ‘XAUNOK’, ‘XAURUB’, ‘XAUSEK’, ‘XAUTRY’, ‘XAUZAR’, ‘XAUHKD’, ‘XAUCNH’, ‘XAUDKK’, ‘XAUMXN’, ‘XAUPLN’, ‘XAUXAG’, ‘XAUBTC’, ‘XAUETH’, ‘XAULTC’, ‘XAUXRP’, ‘XAUDSH’, ‘XAUBCH’, ‘BTCEUR’, ‘BTCJPY’, ‘BTCGBP’, ‘BTCCAD’, ‘BTCCHF’, ‘BTCAUD’, ‘BTCNZD’, ‘BTCSGD’, ‘BTCNOK’, ‘BTCRUB’, ‘BTCSEK’, ‘BTCTRY’, ‘BTCZAR’, ‘BTCHKD’, ‘BTCCNH’, ‘BTCDKK’, ‘BTCMXN’, ‘BTCPLN’, ‘BTCXAG’, ‘BTCXAU’, ‘BTCETH’, ‘BTCLTC’, ‘BTCXRP’, ‘BTCDSH’, ‘BTCBCH’, ‘ETHEUR’, ‘ETHJPY’, ‘ETHGBP’, ‘ETHCAD’, ‘ETHCHF’, ‘ETHAUD’, ‘ETHNZD’, ‘ETHSGD’, ‘ETHNOK’, ‘ETHRUB’, ‘ETHSEK’, ‘ETHTRY’, ‘ETHZAR’, ‘ETHHKD’, ‘ETHCNH’, ‘ETHDKK’, ‘ETHMXN’, ‘ETHPLN’, ‘ETHXAG’, ‘ETHXAU’, ‘ETHLTC’, ‘ETHXRP’, ‘ETHDSH’, ‘ETHBCH’, ‘LTCEUR’, ‘LTCJPY’, ‘LTCGBP’, ‘LTCCAD’, ‘LTCCHF’, ‘LTCAUD’, ‘LTCNZD’, ‘LTCSGD’, ‘LTCNOK’, ‘LTCRUB’, ‘LTCSEK’, ‘LTCTRY’, ‘LTCZAR’, ‘LTCHKD’, ‘LTCCNH’, ‘LTCDKK’, ‘LTCMXN’, ‘LTCPLN’, ‘LTCXAG’, ‘LTCXAU’, ‘LTCETH’, ‘LTCXRP’, ‘LTCDSH’, ‘LTCBCH’, ‘XRPEUR’, ‘XRPJPY’, ‘XRPGBP’, ‘XRPCAD’, ‘XRPCHF’, ‘XRPAUD’, ‘XRPNZD’, ‘XRPSGD’, ‘XRPNOK’, ‘XRPRUB’, ‘XRPSEK’, ‘XRPTRY’, ‘XRPZAR’, ‘XRPHKD’, ‘XRPCNH’, ‘XRPDKK’, ‘XRPMXN’, ‘XRPPLN’, ‘XRPXAG’, ‘XRPXAU’, ‘XRPETH’, ‘XRPLTC’, ‘XRPDSH’, ‘XRPBCH’, ‘DSHEUR’, ‘DSHJPY’, ‘DSHGBP’, ‘DSHCAD’, ‘DSHCHF’, ‘DSHAUD’, ‘DSHNZD’, ‘DSHSGD’, ‘DSHNOK’, ‘DSHRUB’, ‘DSHSEK’, ‘DSHTRY’, ‘DSHZAR’, ‘DSHHKD’, ‘DSHCNH’, ‘DSHDKK’, ‘DSHMXN’, ‘DSHPLN’, ‘DSHXAG’, ‘DSHXAU’, ‘DSHETH’, ‘DSHLTC’, ‘DSHXRP’, ‘DSHBCH’, ‘BCHEUR’, ‘BCHJPY’, ‘BCHGBP’, ‘BCHCAD’, ‘BCHCHF’, ‘BCHAUD’, ‘BCHNZD’, ‘BCHSGD’, ‘BCHNOK’, ‘BCHRUB’, ‘BCHSEK’, ‘BCHTRY’, ‘BCHZAR’, ‘BCHHKD’, ‘BCHCNH’, ‘BCHDKK’, ‘BCHMXN’, ‘BCHPLN’, ‘BCHXAG’, ‘BCHXAU’, ‘BCHETH’, ‘BCHLTC’, ‘BCHXRP’, ‘BCHDSH’, ‘EURUSD’, ‘USDJPY’, ‘GBPUSD’, ‘USDCAD’, ‘USDCHF’, ‘AUDUSD’, ‘NZDUSD’, ‘EURGBP’, ‘EURCHF’, ‘EURCAD’, ‘EURAUD’, ‘EURNZD’, ‘EURJPY’, ‘GBPJPY’, ‘CHFJPY’, ‘CADJPY’, ‘AUDJPY’, ‘NZDJPY’, ‘GBPCHF’, ‘GBPAUD’, ‘GBPCAD’, ‘GBPNZD’, ‘AUDCAD’, ‘AUDCHF’, ‘AUDNZD’, ‘CADCHF’, ‘AUDSGD’, ‘CHFSGD’, ‘EURNOK’, ‘EURRUB’, ‘EURSEK’, ‘EURSGD’, ‘EURTRY’, ‘EURZAR’, ‘GBPHKD’, ‘GBPNOK’, ‘GBPSEK’, ‘GBPSGD’, ‘NOKJPY’, ‘NZDCAD’, ‘NZDCHF’, ‘SGDJPY’, ‘USDCNH’, ‘USDDKK’, ‘USDHKD’, ‘USDMXN’, ‘USDNOK’, ‘USDPLN’, ‘USDRUB’, ‘USDSEK’, ‘USDSGD’, ‘USDTRY’, ‘USDZAR’, ‘XAGEUR’, ‘XAGUSD’, ‘XAUUSD’, ‘BTCUSD’, ‘ETHBTC’, ‘ETHUSD’, ‘LTCBTC’, ‘LTCUSD’, ‘XRPUSD’, ‘XRPBTC’, ‘DSHUSD’, ‘DSHBTC’, ‘BCHUSD’, ‘BCHBTC’]

しかし、このPython、”;”や”{}”に慣れてしまい過ぎた身体には、どうにもムズカユイ・・。

:(;゙゚’ω゚’):

タイピング速度やコード整頓に取られる時間が無くなるのは確かです。Perlの泥沼に浸っていた時代があるので、変態仕様には慣れてますが(自由過ぎる感)、ここからC#やJavaに流れるのは相当大変じゃなかろうかと心配です。

日本語キーボードだと、プログラミングでは記号を打つのにShiftキーを多用しないといけないので、これだけでもPythonは気持ちよくコーディングできるんじゃないかと思う。

あと、そう、ライブラリー名なんかも、小文字だけやし。徹底してる。

追記:Quandlでもデータ提供してる

image

偶然見つけたんですが、このQuandlでも無料でマーケットデータを取得できるようです(まだ試してない)

為替や株式にとどまらず、各国の統計データも扱える、かなり凄そうな感じ。

多過ぎて、目的のデータが探せない・・という。日経新聞が出してるデータは見つけた。

但し、無料枠だと、300コール/10分です。

【game】Arma3スクリプト未整理の書

sc20170724192804その都度調べるのに疲れてしまたので、乱暴にメモしていきます。検証してないので嘘も混じってます。まったくの未整理です。その都度、修正・追記していきます(多分、相当長くなる)

しょうが無いね。

EXILE MODサーバ用で調べてるだけですので、他用途では参考程度に。質問はコメントに(気分屋なので返信する保証は無いけどねッ)

ボヘミア公式:言語仕様 大分類

文法メモ(独特ですがJavaScript風?)

private _val; 変数定義は不要。局所用はスコープ忘れず

_val = [“000″,”111″,”222”]; よく利用する配列(文字・数値・オブジェクトなんでも入ります)何重入れ子もOK

if(true) then{}else{}; 例外無く最後は”;”で締める。if文は忘れっぽい

swicth(_ass)do{ case “hole”: { };} でもswitchの最後は要らない

{   }forEach(_objs); forEachは良く使う(中身は”_x”に入る)

_trg setTriggerStatements [“true”,””,””]; オブジェクト(_trg)への操作はこんな感じで書きます。先頭にオブジェクト

コメント

他の主要な言語系(CやJava等)と同じ。//、/* */

コマンドリファレンス(複雑怪奇)

https://community.bistudio.com/wiki/Category:Scripting_Commands_Arma_3

https://community.bistudio.com/wiki/Category:Arma_3:_Functions

古いモノも含まれてるので注意です(BIS_から始まるもの:関数)コマンド名は動詞が先にくるものが多い。isServerとかCreateVehiceとか。

ファイルパスのデミリタ

”/”でも”¥”でも良いようだが、公式では”¥”で書かれてるようなので、統一しておいた方が良いようです。つまりはWindows向けっぽく。これでもLinuxで動作します。

スクリプトの初期化実行順序(但し、処理待ちせず並列で動作するので注意)

https://community.bistudio.com/wiki/Initialization_Order

スクリプト並列処理の諸注意

多くのタスクが並列で動作するため、タイミングによっては動作しなくなる場面があります。切り分けが難しく、現在でもsleep()などでタイミングを取ってるスクリプトが多くあります。

デバッグログRPT出力公式

diag_log format [“%1, %2”, player, time];

_arr = [1, “foo”, player, “bar”]; diag_log _arr; 配列変数を渡しても展開して出力

時間を取得する

waitUntil {time > 0}; ミッションが始まるまで待機。timeはミッションスタートからの秒数

serverTime サーバとクライアントで同期されてるミッション開始からの秒数。但し、開始時5分間はその保証が無い。

diag_tickTime 1/1000秒

_now = date; 戻り値は[year, month, day, hour, minute]

フレームレートを取得する

diag_fps 平均フレームレート

diag_fpsMin 最小フレームレート

Description.extの書き方(各種定義・サウンド等)決まり事が沢山あるので要注意

https://resources.bisimulations.com/wiki/Description.ext

ファイルを探す場所(外部スクリプトやメディアファイルなど)

https://community.bistudio.com/wiki/Script_Path

サウンド

Description.extで定義して、その名前(クラス名)を指定して鳴らす。又は、Arma3本体内蔵サウンド。ファイル形式は、ogg(オープンソース)かwss(ボヘミア独自)ミッションファイルがデカくなるので多用は難しい。

通常再生の他、3D効果(SFX/SGX)、バックグラウンド(Music)などがある。

SFXサウンド(未検証)

トリガーを絡めないと再生できない。基本的にはリピート再生。止める場合はトリガー削除でOK。エラーが頻発バグがあるため、$NONE$で回避する必要アリ(サウンド設定の類はDescription.extで細かく指定)

private “_trigger”; _trigger = createTrigger [“EmptyDetector”, position player]; _trigger setTriggerStatements [“true”, “”, “”]; _trigger setSoundEffect [“$NONE$”, “”, “”, “サウンドを指定”];

Arma3本体内蔵の効果音(これだけじゃないはず)

https://community.bistudio.com/wiki/Arma_3:_SoundFiles

検索用:playsound3d、say3D

オブジェクトから音をループで再生(もっとスマートな方法がありそう)

https://steamcommunity.com/sharedfiles/filedetails/?id=772764361

文字列の結合

“ass”+”hole” まぁ・・今風スクリプト言語っぽい

ランダムでオブジェクトを選ぶ(戻り値は要素)

selectRandom [“あ”,”ほ”,”の坂田”] 便利です

BIS_fnc_selectRandomというモノもあるが、推奨されてない。こちらはArray(要素1)で戻る

オブジェクトの生成

createVehicleで生成する。車両やAIでも、あらゆる物体は何でもコレです。違和感感じますがしょうが無いね(静的オブジェクトだけは別)Arma3固有の機能が有る状態で生成されます(武器クレイトとか)

静的オブジェクトは別で生成

シンプルオブジェクトは、MAPと同じ様に振る舞うモノで、処理速度が速い。createSimpleObjectで生成。あの忌まわしい物理演算が働きません(重要)。hideSelectionで対象選択も出来なく出来る。

物理演算について

Arma3はNVidiaのPhysXのみ対応なので、IntelビデオやAMD Radeonでは恩恵を得られません。残念ッ!!ちなみに、GeForceとRadeon2枚刺しすると、PhysXが無効になるよ。NVidiaが意地悪をしてる性だよ。ヒドイね

座標系について(要は海面基準かどうか)

https://community.bistudio.com/wiki/Position

MAPの左下が、[0,0]になってる。ゲーム中のGPSで表示されるのは、10m単位(桁に注意)

MAPのサイズを知る

_size = worldSize; //8192 (単位はメートル)

MAPの名前を知る

_name = worldName;

ロケーション関連種類

nearestLocations [player, allLocationTypes, 500]; 近場のロケーションを得る(リスト)

createLocation [className, position, sizeX, sizeY] ロケーションの作成

MAP上のランドマークリストを得る(市町村の場所)

_locations = (nearestLocations [_spawnCenter, [“NameVillage”,”NameCity”, “NameCityCapital”], _maxDistance]); ロケーションタイプの指定で対象を変更

ある場所から平坦っぽい場所を得る公式

イベント発生地や安全に車両を沸かせたい場合に便利

findSafePosを利用する方法

_tempPosition = [_pos,0,_maxDist,15,_inWater,20,0] call BIS_fnc_findSafePos;

isFlatEmptyを利用する方法

position isFlatEmpty [minDistance, mode, maxGradient, maxGradientRadius, overLandOrWater, shoreLine, ignoreObject]

ある場所から最も近い建物を調べる(リスト)

_buildings = _selectedPlayer nearObjects [“building”, 20];

ある場所から最も近い道路を調べる(リスト)

_nearRoads = _position nearRoads 500;

ある場所から最も近いオブジェクトを調べる(リスト)

nearestObjects [_position,[“Land_UWreck_MV22_F”],750])

_list = player nearEntities [[“Car”, “Motorcycle”, “Tank”], 50];

オブジェクト間の距離を測る(distance/distance2D)

2次元平面での直線距離か、高度も入れた最短距離かで選びます。

_meters = position player distance nearestLocation [position player, “hill”];

ある場所が水・海の中かを調べる(bool)

_isOverWater = surfaceIsWater _position;

マップマーカー関連マーカー

_marker = createMarker [format [“%1”, _locationName],_spawnPosition];
_marker setMarkerShape “Icon”;
_marker setMarkerSize [3,3];
_marker setMarkerType “mil_dot”; マーカー種類
_marker setMarkerBrush “Solid”;
_marker setMarkerText _markerName;
_marker setMarkerColor _markerColour;
_marker setMarkerAlpha 0.5;

トリガーの動作

20170724221714_1イベント条件判断には、トリガーを利用する事になりますが、イマイチ良く分からない場合。

Arma3を英語モードにして、条件の可否を確認すると分かり易いです。

英語モードにすると、引数やらが公式リファレンスと同じ表記になるため。

トリガーの作成(詳しくはリファレンス)

デフォルト値を保有してるので全て指定する必要無し。

private _trg = createTrigger [“EmptyDetector”, _pos,true];
_trg setSoundEffect [“$NONE$”,””,””,””]; エフェクト類
_trg setTriggerActivation [“NONE”,”PRESENT”,true]; 対象
_trg setTriggerStatements [“true”,””,””]; 条件式や動作スクリプト

設定ファイル(config)から読み出す(Arma2時代とは違う所)

_header = getMissionConfig “Header”

_respawnDelay = getMissionConfigValue [“respawnDelay”,0]