第3次スーパーロボット大戦のネオ・グランゾン倒した

SFCを引っ張りだしてきて久しぶりに第3次スーパーロボット大戦をやってみた。グラフィックもストーリーも演出も現代のテレビゲームのクオリティに比べるとレトロと評せざるをえないが、やり始めるとなぜかハマる。駆け足で2~3日でクリアしてみた。

ネオ・グランゾンの倒し方

条件は忘れたが、ラストバトルを何ターンかでクリアするとシュウが裏切ってネオグランゾンと戦うステージへと進。敵は3体。ネオグランゾン1体、ヴァルシオン2体。

  • キーとなるユニットは、ゲッタードラゴン、グルーガー、メタス、ラーカイラム、GP-03デンドロビウム、サイバスター、ライディーン、グレートマジンガー、ZZガンダム、など。他のユニットはヴァルシオンを倒すのには使えるが、ネオグランゾンには手出し無用。
  • 命令は回避か防御の1択。
  • 攻略のポイントはネオグランゾンの気力をできるかぎり無駄に上げないようにすること。被弾と与ダメージで気力がそれぞれ1上がり、撃墜だと5上がる。目安としてはネオグランゾンの気力135辺りでHP10000を切っていれば勝機はある。気力150を超えてまだHP????の場合はあきらめたほうがいい。気力150を超えたネオグランゾンの縮退砲2発に耐えられるユニットはたぶんない。
  • 作戦は、ゲッタードラゴンのシャインスパークを熱血必中で5発食らわせればかなり楽になる。(私はヴァルシオンにそれぞれ熱血必中シャインスパークを1発ずつ当てて1ターンで倒すという楽をしてしまったため肝心のネオグランゾンを倒すのに苦労してしまった)毎ターンシャインスパークを2発当ててグルーガーで補給してを繰り返してだいたい8発も当てることができれば勝てるだろう。(なんちゅうゴリ押し戦法だ)
  • ひらめきはできる限り使わないでおいて必中のためにとっておきたい。メタスとグルーガーと友情・愛などで1発当てる毎に回復させるなどでやりすごす。敵ターンのネオグランゾンの攻撃はGP-03に防御で受けてもらう。HPを7000以上に上げていれば、気力が低い内なら縮退砲を2回食らっても防御で耐えられる。最終ステージに行く頃には資金は余るぐらいになっていると思うので、その資金をGP-03のHPと装甲にまわしてあげられるだけ上げておくこと。ノイエジールはなぜか回避しようとして撃墜される危険があるので前線には出さない方がいい。
  • ゲッタードラゴンとグルーガーのどちらかを撃墜されたら詰む。他の味方ユニット2体以上撃墜されても詰む。ネオグランゾンの気力150以上かつHP10000以上でも多分詰む。
  • 当然、このステージに来るまでにメタスとグルーガーは2回行動できるキャラを載せておくこと
  • サイバスターのコスモノヴァ、ライディーンのゴッドボイス、グレートマジンガーの熱血必中ブレストバーン、ZZガンダム(ジュドー)の熱血ハイメガキャノンは大体3000~5000ほどダメージを与えることができる。余裕がなければ使ってもいいが、ヴァルシオンを倒すときかネオグランゾンのHP10000を切ったときのフィニッシュに取っておいた方が良い。ニュータイプキャラの熱血ファンネルはほとんど効かないのでネオグランゾンの気力を無駄に上げるくらいなら攻撃しない方がまだマシ。あとは好みでダイターン3のサンアタックやコンバトラーVの超電磁スピンなども。
  • 友情や愛の精神コマンドのないニュータイプキャラは出撃させない方がいい。今から思えば。熱血必中のあるスーパーロボット系と百式とかマップ兵器があるユニットを出撃枠に入れた方がいいかも
  • 1ターンでネオグランゾンは最低でも6の気力が上がる。ネオグランゾンの攻撃2回で味方が防御したときに気力2上昇、ゲッタードラゴンのシャインスパーク2回と被ダメージ2回で気力4上昇。ひらめきを使えば被ダメージ時の気力上昇は抑えられるが、ひらめきが使えてかつその気力消費に見合うだけのダメージを与えられるキャラはそれほどないと思う。ネオグランゾンの気力上昇を抑えて尚且つ効率的にダメージを与えなければならない。1ターンでの攻略はさすがに難しいが、あまりターン数がかかると気力が150超える可能性がある。5ターンでシャインスパーク6発と他のスーパーロボット系ユニットの攻撃しつつ、尚且つ味方が1機も撃墜されないでHP10000切るところまでいけるかどうかが攻略のポイントとなる。
  • 補給の精神コマンドのあるキャラがいればかなり楽になるかもしれない。私の編成ではいなかったが・・・。
  • ヴァルシオンのHPはたぶん15000~25000ぐらい。30000はない。気力が低い内に熱血+マップ兵器で先制しておくのが常套手段の模様。
  • マップ兵器を2回使ってくる。が、それほど脅威ではない。グルーガーとメタスがそれに巻き込まれないように気をつければいいだけ。

このギリギリのゲームバランスはSFCならではというか中毒性がある。

Delphi OnGetTextイベント

OnGetTextイベントという名前だけは知っていたが、それがどのコンポーネント(?)のイベントなのかわからなかったので使い方がどうのまで進めなかった。OnGetTextイベントはTFieldが持っている。そのTFieldはどれが持っているかというと、DataSetが持っている。そのDataSetは何かというと、様々な種類のDataSetがある。TSQLDataSetやTIBDataSetやIBQueryやIBTableなんかもデータセットとして機能する。

使い方は、

IBQuery1.Fields[4].OnGetText := OnGetText;

でイベントを設定して、

procedure TForm1.OnGetText(Sender: TField; var Text: String; DisplayText: Boolean);
  begin

  end;

でイベント発生時の処理を記述する。

それにしても、何故これでエラーが出ずに動くのかが不明。代入にパラメータを設定していないのに。同様のことをADOQueryでやってみたらエラーが出て実パラメータが足りませんと怒られたのに。

DelphiのDBgridのmultiselect

DBGrigのmultiselectプロパティをtrueに設定してみてもマウスドラッグでマルチセレクトされないから何か他の設定方法があるのかとおもいきや、操作方法が難しいだけだった。

– Ctrl + Mouse clicks
– Shift + Arrow Keys
http://delphi.about.com/od/usedbvcl/l/aa032503a.htm

確かにこの操作方法でマルチセレクトができることは確認したけれども、覚えなきゃならないようなマルチセレクトはやってられん。パソコン初心者にこれをやってもらうことができるのか。

Delphi : StringGrid使用時にセルの右寄せをすると2重表示などがされる問題

ウィンドウスタイルをカスタムスタイルに変更した場合に2重表示される。標準のWindowsスタイルなら2重表示はされない。

調べたこと

  • 2重表示を回避するには、StringGridのプロパティのDefaultDrawingをfalseに設定して、onDrawCellイベントで自分で描画スタイルを設定する
  • 自分で描画を設定する場合は背景色やフォント色、セレクト色、固定セル色など全て設定する

TStringGridにalignmentプロパティさえあればこんなに悩まなくて済むのに・・・。

これはやはりDBGridを使うことを再検討しなければならないのか。Stringgridはデータベースのデータを表示することを前提にしてはつくられていないのだろう。だから、数値型のフィールドのデータがあれば右寄せに表示するのが当然に思われるようなことができない。振り出しに戻ってしまった。

delphiで組み込みデータベースを使うときの候補

調べた範囲では3つ

  • sqlite
  • firebird
  • Microsoft Access

それぞれのコネクションに使うコンポーネント

sqlite
delphi用のフリーのsqlite wrapper http://www.itwriting.com/blog/articles/a-simple-delphi-wrapper-for-sqlite-3
firebird
InterBaseのコンポーネント。IB~という名前が付いているコンポーネント。
Microsoft Access
ADOコンポーネントを使うことでmdbファイルに接続できる。

組み込みデータベースではあともう一つ、Microsoftのsqlserverもコンパクトタイプとかいう名前で組み込みデータベースとして使うことができる。使ったことはないがだいたいAccessのmdbファイルと同じような使い方だと思われる。visual studio から編集することでデータベースファイルを作成できたと思うが(他にもあるかもしれないが)、メリットはあまりよくわからない。

sqlite3とfirebirdどちらをdelphiで使うか

また迷ってきた。TStringGridを使うならsqliteでも別に構わないということに気づいた。そもそもfirebirdを使うことにしたのはDBGridにselect文の結果データセットを上手くバインドできなかったからで、DBGridを使わないということならsqliteを使うことを検討してもいいことになる。

sqliteのメリット

  • auto incrementが使える
  • データベースファイルをコードから作成できる
  • firebirdよりも高速(らしい)
  • データベースを管理するソフトウェアが豊富
  • 技術情報が多い

firebirdのメリット

  • varchar型が使える(DBGridを使うならそのまま表示することができる)
  • ユーザーとパスワードが設定できる
  • sqliteよりもデータ型が多い
  • delphiのinterbase系のコンポーネントとの親和性が高い

sqliteのデメリット

  • 文字列型がtext型(DBGridを使う場合は一工夫必要になる)
  • ユーザとパスワードの設定が無い
  • TStringGridにデータをバインディングする場合は、カラムの文字列の位置(左寄せ、右寄せ、中央)などの設定がないので自らコーディングしなければならない。(これ、TSTringGridを使う人には結構致命的)

firebirdのデメリット

  • データベースファイルを作成するのが面倒
  • SQLの文法がとっつきにくい
  • auto increment が無いのでトリガーとジェネレータを作成しなければならない

感想

高度なデータベース操作ができない私にとっては、auto incrementの有無は結構大きなポイントだったりする。ソフトウェアのDBをバージョンアップしたりするときにテーブルを追加する度にジェネレータとトリガーを追加しなければならないというのは、結構なストレスになる。気分的にはfirebirdよりsqliteを使いたいという方へ傾いている。sqliteのwrapperを使ったコーディングだと、ものすごく簡単にできてしまう。

TDBGridとTStringGrid

IBQueryやIBDatasetで開いたテーブルをそのまま表示するなら、DBGridでやれば簡単だが、select文を実行した結果のテーブルセットにちょっと手を加えようと思ったらStringGridを使うようになる。面倒だけれども

サンプルコード

var
i,r : Integer;
sql : String;

begin
  sql := 'select count(*) as rcount from item'
  IBQuery1.SQL.SetText(Pwidechar(sql));
  IBQuery1.Open;
  r := IBQuery1.FieldByName('rcount').AsInteger;

  StringGrid1.ColCount := 3;
  StringGrid1.RowCount := r + 1;
  i := 1;

  sql := 'select id,name,item_num from item';
  IBQuery1.SQL.SetText(Pwidechar(sql));
  IBQuery1.Open;
  while not IBQuery1.Eof do
  begin
    StringGrid1.Cells[0,i] := IBquery1.FieldByName('inputDate').AsString;
    StringGrid1.Cells[1,i] := IBquery1.FieldByName('acId').AsString;
    StringGrid1.Cells[2,i] := IBquery1.FieldByName('catId').AsString;
    Inc(i);
    IBQuery1.Next;
  end;

end;

感想

心配なのは速度。行数が少ないなら無視できるが、千行とか何万行とかなるとどうなるのか未知数。DBGridで表示するのも内部的には同じ処理ならいいんだけれども、わからないので不安。

ところで、TStringGridとTDBGridの違いはデータソースコンポーネントかどうかという点に気づいた。TStringGridにはDataSourceやDetaSetなどを設定するプロパティは無いので、自分で好きなように加工した文字列などを表形式に表示する場合に使うのではないだろうか。TDBGridの場合はその逆で、あまり融通がきかないような印象。SQL文を工夫するか、プロシージャなどで結果セットを作成したりして、その結果を表示するだけというような気がする。(でもないか。OnGetTextイベントやOnDrawCellイベントを使ったりすると割りと自由に加工することができるかもしれない)

Happy Hacking Keyboard Pro2 を購入した

一年前に購入したキーボードが調子悪くなってきたので新しいものを、と思ってHappy Hacking KeyboardのProfessional 2を購入した。約2万円也。久しぶりの英語配列のキーボードだけれども、これぞプログラミングをするためのキーボード!というわけのわからないテンションで注文してみたものの、使いこなせるだろうか。1年以上はもってもらわんと困る。以下所感。

  • Windowsの場合コマンドキーの意味がわからない
  • 右サイドにControlキーが無いのに気づいた(前のキーボードでは多用していたんでちょっととまどう)
  • Happy Hacking Keyboard のスイッチテーブルスイッチの入れ替えでDeleteキーをBackSpaceキーに、左サイドのコマンドキーをFunctionキーにそれぞれ入れ替えるようにスイッチをオン。
  • 背面のゴムが思ったより小さいので机に直に置いたら滑る。デスクマットが要る。
  • 見た目がプロっぽくていい。道具なんかなんでもいい、大事なのは腕だ。と思っていた時期(以下略

使い始めたばかりなのでやはり違和感がある。今こそ人間の環境適応能力の見せ所。・・・しかし、この英語配列のキーボードに習熟するということは、日本語配列のキーボードをこれからは使わないということを意味するのに気づいた(両方の配列を自在に使いこなすほど器用ではないので)。現在所持しているノートPCのキーボードは日本語配列のキーボードだし、持ってはいなけれどポメラというガジェットも日本語キーボード前提で作られているし、場合によっては職場などでは日本語キーボードしか使用したらダメなこともあるだろうし。日本人が日本で英語キーボードを使っていくにはハードルがいくつか存在するということに今になって気づいた。今更引き返すことはできないのでこのHHKBを使いまくるしかない。購入検討中の人はJPモデルの日本語配列版か、同じキータッチとされるrealforceを選択するのが無難かもしれない。このただのProfessional 2はすっきりしていてプロっぽいが、キー配列は独特でかなり人を選ぶ。

InterBaseコンポーネントでSQLを実行する方法

IBQuery

sql:= ‘select id,itemName from item’;
IBQuery1.SQL.SetText(Pwidechar(sql));
IBQuery1.Open;

IBSQL

sql:= ‘insert into item(id,itemName) values(100,”’test”’)’;
IBSQL1.SQL.SetText(PWideChar(sql));
IBSQL1.ExecQuery;

IBDataSet

sql:= ‘select id,itemName from item’;
IBDataSet1.SelectSQL.Text := sql;
IBDataSet1.Open;

どれを使えばいいのかわからない件

IBQueryとIBDataSetはIBDataSourceのdatasetプロパティに設定をすることができる。Openプロシージャでselect文の結果セットがDBGridにバインドされる。IBSQLというのはinsertやdeleteなどのSQLを実行するコンポーネント・・・という理解でいいのだろうか。delphi XE2ではdbExpressのコンポーネントを使うことが推奨されているらしいが、それにしても似たようなコンポーネントでしかも同じような使い道ができるものが多いため戸惑う。

どうでもいいけれどfirebirdはSQL文中の文字の値はシングルクォートで囲まないといけないのか。知らなかった。

下記のページがよくまとまってある。
Databases – Delphi/Firebird – SQL