読者です 読者をやめる 読者になる 読者になる

B-Teck!

お仕事からゲームまで幅広く

【VBA】与えられたパスのフォルダを新しく作成する

パスを指定してフォルダを作成する。

下記みたいな指定の場合でも存在しないパスごと作ってくれる。

    MakeNotExistsDir("存在するパスA\存在しないパスA")  
    MakeNotExistsDir("存在しないパスA\存在しないパスB\存在しないパスC")  

 

Option Explicit

'WindowsのAPIを使うので環境によって宣言を分ける
#If VBA7 And Win64 Then
    Declare PtrSafe Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" _
               (ByVal hwnd As LongPtr, ByVal pszPath As String, ByVal psa As LongPtr) As Long
#Else
    Declare Function SHCreateDirectoryEx Lib "shell32" Alias "SHCreateDirectoryExA" _
             (ByVal hwnd As Long, ByVal pszPath As String, ByVal psa As Long) As Long
#End If

'/**
' * MakeNotExistsDir
' * 与えられたパスのフォルダを新しく作る
' * @param DirPath              : 作成するフォルダのパス
' */
Sub MakeNotExistsDir(ByVal DirPath As String)
    Call SHCreateDirectoryEx(0&, DirPath, 0&)
End Sub

清く、正しく、残虐に!LET IT DIE

最近、PS4で配信された「LET IT DIE」をプレイしている。
海外では基本プレイ無料で配信されている本作だが、日本ではZ指定のため108円で配信されている。
結構好きなゲームなので紹介してみようと思う。

世界観

地殻変動によって東京に突如現れたバルブの塔を登り、頂上を目指すゲームだ。
塔の内部は、廃墟と化した地下鉄の駅やホーム等が広がっており、多数の敵が待ち構えている。
登場人物は少ないが、キャラは濃く、インパクトに残る事大。
良くも悪くもグラスホッパーのゲームらしいという感じ。

↓塔内には様々なロケーションが存在する f:id:beatdjam:20170224232236p:plain

システム

ゲームのプレイ感としては、動きの軽めなローグライクアクション。
公式ではハクスラという呼称も使っているが、
ジャンルとしてのハクスラを期待すると少し肩透かしかも。
道中で拾った設計図を拠点に持ち帰って、素材を集めて開発・強化して攻略に挑むのがメインとなる。

塔内の敵には普通の敵とは別に、他のプレイヤーが送り込んだ「ハンター」や、
プレイヤーの死体が襲い掛かってくる「ヘイター」のような種類がいる。
これはこのゲームの売りで、ダークソウルシリーズのような直接他プレイヤーと戦闘するわけではなく、
NPCとして現れるプレイヤーと戦う非同期型対戦だ。

また、協力プレイや直接対戦は存在しないが、敵の拠点に攻め入り、防衛を行っているNPCを倒したり、
破壊工作を行うことでポイントの争奪戦を行うチーム戦の要素もある。

塔内で死んだキャラクターは、先述の「ヘイター」となってしまい、自身は拠点に戻されてしまう。
その場合、ゲーム内通貨を支払うか、死亡した地点まで行って自分で倒なければ戻ってこない。
死亡にはある程度のリスクがあるといえる。

↓刃物や鈍器はもちろん、銃器もある。 f:id:beatdjam:20170224232019j:plain

難易度

序盤の階層は、アクションゲームがあまり得意ではなくてもなんとかなる難易度となっていると思う。
しかし、最初のボスを倒した後に地下鉄を抜け、地上に出られる11階からは少し様子が変わってくる。
隙の少ない武器や遠距離で大ダメージを叩き出すスナイパーライフルを装備した敵が現れるようになり、
不用意に飛び出すと囲まれるような地形が増え、雑魚の攻撃も威力が高くなっている。
ここからがLET IT DIEの本番といえるかもしれない。

↓11階の風景 長い地下鉄ステージを抜けた後なので空が見えるのは感慨深い f:id:beatdjam:20170224232238p:plain

課金要素

このゲームの課金要素は大きく分けて2つ。
デスメタルエクスプレスパスだ。
他にも、序盤のお助けアイテムなどのセットは販売されているが、ぶっちゃけいらない気がする。

  • デスメタル
    デスメタルとは、LET IT DIE内で用いられる課金通貨の名前だ。
    • 倉拡張庫
    • 死亡時にヘイター化しないでその場での復活
    • 武器開発や設備拡張にかかる時間の短縮

ができるが、まずは倉庫の拡張にデスメタルを使用するべき。
中盤以降はキャラクターの復活にも大きい代償がかかるようになってくるため、
コンティニューも場合によっては利用していいと思う。
よほど急いでいるのでなければ、時間短縮にはデスメタルを使うべきではない。
かなりもったいない。

  • エクスプレスパス
    エクスプレスパスとは、LET IT DIEを便利にすすめるための要素だ。
    一ヶ月単位で購入できる他、ログインボーナス等で1日有効チケットが配布されたりもする。
    効果としては、
    • 限定デカールの配布
    • 探索のお助け要素
    • 敵拠点の襲撃のお助け要素

ログインボーナスにデカール(このゲームのスキル)が配布されるようになったり、所持品の上限が増えたり、無料エレベーターが使えるようになったり。
襲撃時にも退却のタイミングが自由になったり、費用面で緩和が行われたりする。
でも無くても遊べちゃう。

↓奥がエクスプレス会員専用エレベーター。会員以外が近づくとドアが閉じられてしまう f:id:beatdjam:20170224232023j:plain

まとめ

とりあえず遊べるアクションゲームを探してる人、廃墟が好きな人、グラスホッパーが好きな人は、
PS4とクレカがあるならとりあえずやってみよう!
どうせ108円だ!
LET IT DIE!

BioShock Remasteredをクリアした

先月末からプレイしていたBioShockのリマスター版をクリアした。
実は、だいぶ昔に無印版を少しプレイしていたんだけど、なぜか続かずリマスター版が出るまで放置していた…

↓のんびりやったので18時間かかりました
f:id:beatdjam:20170212233653p:plain

↓所々にこういった海底の街が見える窓があり、風情がある f:id:beatdjam:20170212231626j:plain

↓そこそこ有名なビッグダディ。下のやつしかいないのかと思ったら上の種類もいたのでびっくりした。 f:id:beatdjam:20170212231942j:plain

以下感想

大西洋の海底に作られた謎の都市ラプチャーを舞台に、脱出を目指して右往左往する主人公のお話。
ゲームとしては、RPGライクなFPS
銃器と、道中で得られるポイントを利用した特殊能力による自己強化で戦っていくことになる。
とりあえず話を聞いて、クエストカーソルを辿っていけばクリアできる。
お使いゲーだと思う。

良かった点

  • 独特な世界観は、ステージ中で拾える音声日記やステージの作り込みもあってすごく楽しかった。
    個人的なお気に入りはたまに流れる、プロパガンダ的な小芝居。
    ラプチャーの一番偉い人に都合のいいことばっかり言ってるんだけど、アメリカの通販番組みたいな会話なのでおもしろい。

個人的には好きだった点

  • 良かった点にも書いた、音声日記。
    これは結構ステージをくまなく探さないといけなくて、収集物集めが嫌いな人は嫌なところかもしれない…。
    自分は全部探索するのが大好きなので攻略動画とか見ずに終わらせられた。
    (BF1のコーデックス集めとかいうクソに比べれば全然楽しくクリアできた)

微妙だった点

  • 多彩な能力があって、楽しいは楽しいんだけど、エレクトロボルト・インフェルノテレキネシスあたりがあれば全クリできる。
    せっかく色々あるならもっと活かせれば良かったなぁと言った気持ち。
  • あと、メモリ管理があれらしく、ちょいちょい不安定になってフリーズしたりクラッシュしたりした。
    オートセーブがエリア移動時のみであること、手動セーブ時にフリーズしたこともあったことで非常にスリリングなプレイだった。

まとめ

ソロゲーのストーリーを追いかけるのが好きな人にはおすすめできるタイトル。
トリガーハッピーになりたければちょっと違うかなぁ…と言った感じ。
自分は非常に楽しくプレイできたので、積んである2とインフィニットもそのうちプレイしたい感じ。

【PHP】 PHPで無名関数を使う

PHP5.3で導入された無名関数だけど、PHP7で記法がより簡潔になった。
その用法も含めてメモ書き。

  • 無名関数の即時実行
<?php
(function(){
    echo "PHP7で無名関数を実行する\n";
})();
call_user_func(function(){
    echo "PHP5.x系で無名関数を実行する\n";
});
  • スコープ外で定義されている変数を参照する
<?php
// 外で定義した変数を無名関数内で使う
$aaaaa = "test";
//PHP7
(function() use ($aaaaa){
    echo $aaaaa . "\n";
})();
// 5.x系
call_user_func(function() use ($aaaaa){
    echo $aaaaa . "\n";
});
  • 関数を変数として扱う
<?php
// 関数を変数に入れる
$value = function(){
    return "test2" . "\n";
};
echo $value();
  • 変数に入れた関数を、別の関数の引数にする
<?php
// 関数を引数にした関数
$value = function(){
    return "test2" . "\n";
};
function doFunc(Callable $function){
    return $function();
}
echo doFunc($value);

友人がフリーゲームを製作中のようだ

大学時代の友達がゲーム作り始めてた。 というか去年の暮れに公開してた。

戦車で戦う防衛モノ。
タワーと拠点を守って敵を倒すぞ!みたいな。

↓右のかっこいい球体が拠点、左のやつがタワー
f:id:beatdjam:20170209014914p:plain

ある程度戦ってるとウェーブごとにボスが出てきて倒す。
現状は何ウェーブ耐えられるか?みたいな感じっぽい。

↓ボスは王冠がついてる。かわいい。固くてむかつく。
f:id:beatdjam:20170209015225p:plain

公開されてから、そこからちゃんと面白くなるアプデがされてきてるのがすごい。
まだ開発版らしいので痒いところがあるのは致し方なし。
気になるところはフィードバックすると、後々反映されたりされなかったりする。

気になったらダウンロードしてプレイしてみて、意見とか出してあげてほしい

ホームページとか

ホームページ(ゲームダウンロード先)
http://gamint.webcrow.jp/lade/

更新情報とかをツイートしてる公式Twitter
意見とかあればここに送ってみれば良いかも
https://twitter.com/gamint87

【PHP】PHPの緩い比較とかの話

PHPの比較

PHPには、2つの変数が等しいことを比較する演算子=====で2つある。
==は、暗黙的に型を相互変換した後に行われる比較。 ===は、型も含めた比較となる。
PHP: 比較演算子 - Manual

2a問題

暗黙的な型変換による比較というのは、多言語経験者から見ると違和感の大きいものらしく、
2a問題」という名前で取り上げられることもある。
"2a"という文字列が、==で整数型の2と比較した際に等しくなってしまうというやつだ。

<?php
    $a = 2;
    $b = "2a";
    
    if ($a == $b) {
        echo "$a == $b is True";
    }
    
    if ($a === $b) {
        echo "$a === $b is True";
    }
    
    //$a == $b is Trueのみ出力される

==についての不思議な挙動は、下記でもっと深く見ることができる。

素晴らしき自動的な世界〜或いは「型のない」世界〜 - がるの健忘録
PHP 5.4.4から==の挙動が一段と難しくなりました - hnwの日記

その他の関数

じゃあ基本的に==は使わず、===を使おうという話なんだけど、
実はin_arrayとかsortとか、switchとかarray_searchとか…
PHP自体の組み込み関数には、デフォルトで==と同様の比較をしているものがある。
例に挙げた以外にも多分あるんだと思うんだけど、まとまって参照できるところがなくてわからない。
(誰か知ってたら教えてくれ)

in_arrayとかarray_search

こいつらには第三引数にstrictってのがあって、
これをtrueにすると型までみていい感じにしてくれる。
デフォルトだと緩い比較なのでガバガバ。

PHPのin_arrayは罠が多いので注意喚起が必要 - Qiita
PHP: in_array - Manual

sort

あとこいつも第二引数で比較方法を設定できていい感じ。
デフォルトだと(略)

設定値 説明
SORT_REGULAR 通常通りに項目を比較 (型は変更しません)
SORT_NUMERIC 数値的に項目を比較
SORT_STRING 文字列として項目を比較
SORT_LOCALE_STRING 現在のロケールに基づいて比較します。
比較に使うロケールは、setlocale() で変更できます。
SORT_NATURAL 要素の比較を文字列として行い、 natsort() と同様の「自然順」で比較します。
SORT_FLAG_CASE SORT_STRING や SORT_NATURAL と (ビット OR で) 組み合わせて使い、
文字列のソートで大文字小文字を区別しないようにします。

PHPのsort関数は相当おかしい - hnwの日記
PHP: sort - Manual

switch

構文的に厳密な比較に対応してない。
ハマりやすい。

<?php
$i = "0";
switch ($i) {
    case 0:
        echo "iは0に等しい";
        break;
    case 1:
        echo "iは1に等しい";
        break;
    case 2:
        echo "iは2に等しい";
        break;
    default:
       echo "iは0,1,2に等しくない";
}
// "iは0に等しい"が出力されちゃう

回避するにはこうする。

<?php
$i = "0";
switch (true) {
    case $i === 0:
        echo "iは0に等しい";
        break;
    case $i === 1:
        echo "iは1に等しい";
        break;
    case $i === 2:
        echo "iは2に等しい";
        break;
    default:
       echo "iは0,1,2に等しくない";
}
// "iは0,1,2に等しくない"が出力される

こうなるとif-elseでいいんじゃ?って気もしてくるけど、
switch使いたいときもあるから気をつけないといけない。

PHP: switch - Manual

2017年になってました

今更ですが新年のご挨拶です。

去年は母の急逝然り、人間関係然り、後悔を残すことの多い一年でした。
人間、いつ何があるのかわからないなぁという感じで、
やろうと思ってることができなくなってしまうなんて当たり前にあるんですよね。
自分と向き合う時間、他人と向き合う時間、それぞれを大事にして、
今年一年はなるべく後悔しない、前向きでやり残しのない一年にしたいです。

そういえば、去年末は月間アクセス数が1万の大台目前まできたみたいです。
ブログの性格上、固定の読者さんはあまりおらず、検索経由で来られる方がほとんどだと思いますが、
今年もまた一年のんびり書いていきますので、どうぞよろしくお願いしますね。