再開発メモ003

引っ越し

唐突だが、ここを捨ててはてなブログに移行することにした。
記事の引き継ぎはせず完全に仕切りなおすので、MOE3 の再開発メモは3桁どころか3回で終了。我ながらぐうの音も出ない三日坊主ぶり。


まあどうせ向こうでもやること自体は何も変わらないけど、ひとまず書いた分だけ投下したらこっちは放置しま。

Province モデル

スキーマ

  create_table "provinces", force: true do |t|
    t.string   "code"
    t.string   "fullname"
    t.boolean  "supplycenter", default: false
    t.integer  "homepower_id"
    t.string   "port"
    t.string   "type"
    t.datetime "created_at"
    t.datetime "updated_at"
  end


モデル。Province#shortname もさっくり実装。

class Province < ActiveRecord::Base
  belongs_to :homepower, class_name:'Power'

  def shortname
    code.capitalize
  end
end


そして Province の派生クラス群。
Land と Sea は今のところ空っぽ。Coast は港の扱いがあるので #shortname をオーバーライド。

class Land < Province
end
class Sea < Province
end
class Coast < Province
  def shortname
    result = super
    result += "(%s)"%[port.upcase] if port
    result
  end
end


以上を踏まえて seeds.rb も書き直し。
spec_helper.rb をいじってテストの時も読み込ませるので、テストを実行する度にマスタデータが増えないように最初に delete_all している。
ただし id はリセットされないのでテスト環境専用の扱い。開発環境ではおとなしく rake db:reset しとけ。
DB に依存しない id のリセット方法があったら知りたいけどあまり役には立たないか。

## Power
Power.delete_all
a = Power.create symbol:'A', name:'Austria', genitive:'Austrian'
e = Power.create symbol:'E', name:'England', genitive:'English'
f = Power.create symbol:'F', name:'France',  genitive:'French'
g = Power.create symbol:'G', name:'Germany', genitive:'German'
i = Power.create symbol:'I', name:'Italy',   genitive:'Italian'
r = Power.create symbol:'R', name:'Russia',  genitive:'Russian'
t = Power.create symbol:'T', name:'Turky',   genitive:'Turkish'
Power.create symbol:'X', name:'Master'


## Province
Province.delete_all

# Province: Sea
Sea.create code:"adr", fullname:"Adriatic Sea"
Sea.create code:"aeg", fullname:"Aegean Sea"
Sea.create code:"bal", fullname:"Baltic Sea"
Sea.create code:"bar", fullname:"Barents Sea"
Sea.create code:"bla", fullname:"Black Sea"
Sea.create code:"eas", fullname:"Eastern Mediterranean"
Sea.create code:"eng", fullname:"English Channel"
Sea.create code:"bot", fullname:"Gulf of Bothnia"
Sea.create code:"lyo", fullname:"Gulf of Lyon"
Sea.create code:"hel", fullname:"Helgoland Bight"
Sea.create code:"ion", fullname:"Ionian Sea"
Sea.create code:"iri", fullname:"Irish Sea"
Sea.create code:"mao", fullname:"Mid-Atlantic Ocean"
Sea.create code:"nao", fullname:"North Atlantic Ocean"
Sea.create code:"nth", fullname:"North Sea"
Sea.create code:"nwg", fullname:"Norwegian Sea"
Sea.create code:"ska", fullname:"Skagerrak"
Sea.create code:"tys", fullname:"Tyrrhenian Sea"
Sea.create code:"wes", fullname:"Western Mediterranean"

# Province: Land
Land.create code:"boh",                    homepower:a, fullname:"Bohemia"
Land.create code:"bud", supplycenter:true, homepower:a, fullname:"Budapest"
Land.create code:"bur",                    homepower:f, fullname:"Burgundy"
Land.create code:"gal",                    homepower:a, fullname:"Galicia"
Land.create code:"mos", supplycenter:true, homepower:r, fullname:"Moscow"
Land.create code:"mun", supplycenter:true, homepower:g, fullname:"Munich"
Land.create code:"par", supplycenter:true, homepower:f, fullname:"Paris"
Land.create code:"ruh",                    homepower:g, fullname:"Ruhr"
Land.create code:"ser", supplycenter:true,              fullname:"Serbia"
Land.create code:"sil",                    homepower:g, fullname:"Silesia"
Land.create code:"tyr",                    homepower:a, fullname:"Tyrolia"
Land.create code:"ukr",                    homepower:r, fullname:"Ukraine"
Land.create code:"vie", supplycenter:true, homepower:a, fullname:"Vienna"
Land.create code:"war", supplycenter:true, homepower:r, fullname:"Warsaw"

# Province: Coast
Coast.create code:"alb",                                 fullname:"Albania"
Coast.create code:"ank", supplycenter:true, homepower:t, fullname:"Ankara"
Coast.create code:"apu",                    homepower:i, fullname:"Apulia"
Coast.create code:"arm",                    homepower:t, fullname:"Armenia"
Coast.create code:"bel", supplycenter:true,              fullname:"Belgium"
Coast.create code:"ber", supplycenter:true, homepower:g, fullname:"Berlin"
Coast.create code:"bre", supplycenter:true, homepower:f, fullname:"Brest"
Coast.create code:"bul", supplycenter:true,              fullname:"Bulgaria"
bul = Coast.last
bulec = bul.dup; bulec.port = 'ec'; bulec.save!
bulsc = bul.dup; bulsc.port = 'sc'; bulsc.save!
Coast.create code:"cly",                    homepower:e, fullname:"Clyde"
Coast.create code:"con", supplycenter:true, homepower:t, fullname:"Constantinople"
Coast.create code:"den", supplycenter:true,              fullname:"Denmark"
Coast.create code:"edi", supplycenter:true, homepower:e, fullname:"Edinburgh"
Coast.create code:"fin",                    homepower:r, fullname:"Finland"
Coast.create code:"gas",                    homepower:f, fullname:"Gascony"
Coast.create code:"gre", supplycenter:true,              fullname:"Greece"
Coast.create code:"hol", supplycenter:true,              fullname:"Holland"
Coast.create code:"kie", supplycenter:true, homepower:g, fullname:"Kiel"
Coast.create code:"lon", supplycenter:true, homepower:e, fullname:"London"
Coast.create code:"lvn",                    homepower:r, fullname:"Livonia"
Coast.create code:"lvp", supplycenter:true, homepower:e, fullname:"Liverpool"
Coast.create code:"mar", supplycenter:true, homepower:f, fullname:"Marseilles"
Coast.create code:"naf",                                 fullname:"North Africa"
Coast.create code:"nap", supplycenter:true, homepower:i, fullname:"Naples"
Coast.create code:"nwy", supplycenter:true,              fullname:"Norway"
Coast.create code:"pic",                    homepower:f, fullname:"Picardy"
Coast.create code:"pie",                    homepower:i, fullname:"Piedmont"
Coast.create code:"por", supplycenter:true,              fullname:"Portugal"
Coast.create code:"pru",                    homepower:g, fullname:"Prussia"
Coast.create code:"rom", supplycenter:true, homepower:i, fullname:"Rome"
Coast.create code:"rum", supplycenter:true,              fullname:"Rumania"
Coast.create code:"sev", supplycenter:true, homepower:r, fullname:"Sevastopol"
Coast.create code:"smy", supplycenter:true, homepower:t, fullname:"Smyrna"
Coast.create code:"spa", supplycenter:true,              fullname:"Spain"
spa = Coast.last
spanc = spa.dup; spanc.port = 'nc'; spanc.save!
spasc = spa.dup; spasc.port = 'sc'; spasc.save!
Coast.create code:"stp", supplycenter:true, homepower:r, fullname:"St. Petersburg"
stp = Coast.last
stpnc = stp.dup; stpnc.port = 'nc'; stpnc.save!
stpsc = stp.dup; stpsc.port = 'sc'; stpsc.save!
Coast.create code:"swe", supplycenter:true,              fullname:"Sweden"
Coast.create code:"syr",                                 fullname:"Syria"
Coast.create code:"tri", supplycenter:true, homepower:a, fullname:"Trieste"
Coast.create code:"tun", supplycenter:true,              fullname:"Tunis"
Coast.create code:"tus",                    homepower:i, fullname:"Tuscany"
Coast.create code:"ven", supplycenter:true, homepower:i, fullname:"Venice"
Coast.create code:"wal",                    homepower:e, fullname:"Wales"
Coast.create code:"yor",                    homepower:e, fullname:"Yorkshire"


うむ。相変わらずシングルクォートとダブルクォートの混在が見苦しい。後でダブルに統一しておこう。


次は何をするか。
Province を作った流れで「Adjacency(隣接情報)」に手を出すのもいいけど、これが必要になるのはずっと後のはず。なのでやっぱり「Order」かな。

再開発メモ002

Power モデル

スキーマはこんな感じ。genitive は Order#to_s で使うことになる。

  create_table "powers", force: true do |t|
    t.string   "name"
    t.string   "symbol"
    t.string   "genitive"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

seeds.rb はこう。

Power.create symbol:'A', name:'Austria', genitive:'Austrian'
Power.create symbol:'E', name:'England', genitive:'English'
Power.create symbol:'F', name:'France',  genitive:'French'
Power.create symbol:'G', name:'Germany', genitive:'German'
Power.create symbol:'I', name:'Italy',   genitive:'Italian'
Power.create symbol:'R', name:'Russia',  genitive:'Russian'
Power.create symbol:'T', name:'Turky',   genitive:'Turkish'
Power.create symbol:'X', name:'Master'

Province モデル

最低限必要なフィールドはこれくらいだろうか。

第1案
  • shortname: 略称。
  • fullname: フルネーム。
  • supplycenter: 補給都市の有無。
  • homepower: 初期支配国。Power への参照。


今回の地名は jDip 準拠にする予定だが、その場合、shortname が全部小文字になってしまうのが悩みどころ。
なので、小文字略称のフィールド名を code*1 に変更して、code の一文字目を大文字に変換するメソッド Province#shortname を後で用意する。

第2案
  • code : 識別子としての略称。全て小文字。
  • fullname: フルネーム。
  • supplycenter: 補給都市の有無。
  • homepower: 初期支配国。Power への参照。


面倒なのが「bul」「spa」「stp」の港の問題。例えば「bul」「bul(ec)」「bul(sc)」は全て別物でありながら、場合によっては同じ地域として扱わなければならない。


ここはシンプルに port フィールドを追加して区別しよう。「bul」の場合、マスタデータは {code:'bul', port:nil}、{code:'bul', port:'ec'}、{code:'bul', port:'sc'} の3レコードになる。これらは Province#code が一致するので同じ地域として扱える。
港のカッコ表記は Province#shortname に任せる。

第3案
  • code: 識別子としての略称。全て小文字。
  • fullname: フルネーム。
  • supplycenter: 補給都市の有無。
  • homepower: 初期支配国。Power への参照。
  • port: 港。「bul」「spa」「stp」以外は nil


後はちょっと考えがあるので単一テーブル継承用のフィールド type を追加しておく。

最終案
  • code: 識別子としての略称。全て小文字。
  • fullname: フルネーム。
  • supplycenter: 補給都市の有無。
  • homepower: 初期支配国。Power への参照。
  • port: 港。「bul」「spa」「stp」以外は nil
  • type: 単一テーブル継承用。

今日はここまで。

*1:適切な名前が思い浮かばず。id は Rails の、key は MySQL の都合で使えない。codename はちょっとくどい。

再開発メモ001

ナンバリング3桁も要らんよなーと思いつつ再開。

Ruby2.0 と Rails4 を使うことは決定。モデルのテストは RSpec、テンプレートエンジンは hamlJavaScriptCoffeeScriptスタイルシートは sass を使ってみる。テンプレートは slim も考えたけどちょっと情報が少なすぎた。


まずは行軍解決エンジンの完成を目指すので、しばらくはモデル設計にかかりきりになる見込み。

ざっくり「Room(部屋=卓)」←「Turn(ターン)」←「Phase(フェイズ)」←「Order(命令)」の関連が見える。「HoldOrder」「MoveOrder」とかは「Order」の単一テーブル継承が良さげ。他には「Province(地域)」←「Unit(軍)」←「Order」、「User(登録ユーザ)」←「Player(プレイヤー)」←「Power(国)」←「Order」、とか「Room」←「Player」とか。この辺を無駄なく無理なく簡潔に整理できるとぐっと楽になるしなにより気持ち良い。


合間を見てマスタデータを作ろう。まずは「Power」「Province」「Route(隣接地域情報)」から。「Home(母国地域)」「InitialDeployment(初期軍配置)」はアソシエーションの都合で後回し。仮に付けたモデル名もなんかピンとこないし保留保留。

小説を書こう

やるやらシリーズ読んでると割と高確率でラブコメまたは純愛モノに当たる。
恋愛モノは専門的な知識はあまり必要ないので、書くだけなら結構簡単に書ける。


そんなわけで、久しぶりに何か書いてみようかと思って色々漁ってたら過去作の執筆メモが見つかった。
数少ない公開作のひとつだ。

■無題
http://d.hatena.ne.jp/asagix/20080311/1205259063


朝に思い付いて仕事中はずっと展開を考えてて帰宅してから一気に書き上げたわけだがやはり実力が圧倒的に不足していた。お陰で睡眠まで不足する羽目になった。眠い。


題材が陳腐なのは折り込み済みなのでいいとしてもせめて半分くらいの長さにまとめないとオチへの繋ぎが弱すぎる。


伏線の回収がしんどくなると偉ぶった観念論風に逃げる手癖も見苦しい。とほほ。

ああ、あったね。構想半日執筆2時間。
ていうかオチ書けよ。


そして、「簡単に書けそうだ」と思って始めては頓挫するのを何度か繰り返して結局挫折したのを思い出した。
苦い。

やる夫シリーズ

ここ最近読んで面白かったものを作者別に。
個別の感想は気が向いたら追記しておくか。

作者:◆UkaYc1itRw

やらない夫は家賃収入を得るようです
http://yaranaioblog.blog14.fc2.com/blog-entry-443.html
ジャンル:日常ほのぼの


やらない夫は相談を聞くようです
http://yaranaioblog.blog14.fc2.com/blog-entry-1034.html
ジャンル:学園シュール


■箱女
http://yaranaioblog.blog14.fc2.com/blog-entry-1252.html
ジャンル:学園ラブコメ

作者:◆/H7wY7ybL2

翠星石と白饅頭な彼氏
http://aamatome.blog31.fc2.com/blog-entry-616.html
ジャンル:学園恋愛

作者:◆08T8EOtaSs

■キッチンやらない-O
http://snudge.blog38.fc2.com/blog-entry-191.html
ジャンル:料理店ギャグ


■全裸の王様
http://snudge.blog38.fc2.com/blog-entry-705.html
ジャンル:バカ童話


■やる夫がドラゴンクエスト5の勇者?になるようです
http://blog.livedoor.jp/myselfishdqn-yaruodq5/
ジャンル:DQ5二次創作

作者:◆LOVE/GbXFM

■月曜日の人殺したち
http://mukankei961.blog105.fc2.com/blog-entry-3993.html
ジャンル:日常系ファンタジー

作者:◆7BKLXvaa5E

■【恋と】ローゼン達は電車に揺られ【人生の機微】
http://aamatome.blog31.fc2.com/blog-entry-1654.html
原作:有川浩阪急電車


■ゴゴサンジは秘密の言葉
http://aamatome.blog31.fc2.com/blog-entry-40.html
原作:有川浩「植物図鑑」


■【猫と】 やる夫、家を買う。 【ガチな言葉】
http://aamatome.blog31.fc2.com/blog-entry-1857.html
原作:有川浩「フリーター、家を買う」

2012 年の OGame 入門

はじめに

OGame とは放置系惑星開拓ブラウザゲームである。

ゲームの基本は次の通り。

  • 三種類ある資源の採掘設備を設置・拡張する
  • 採掘施設はエネルギーを必要とするので供給源を確保する
  • 放っておくと資源が貯まるので採掘設備や各種施設を拡張したり技術開発をする
  • 技術開発が進むと防衛兵器を植えたり資源輸送船を飛ばせるようになる
  • あるいは宇宙艦隊を拵えて他のプレイヤーから資源を強奪できるようになる
  • そのうち開拓できる惑星の上限が増えるので空いてる惑星に移民団を派遣する
  • 保有惑星間で資源を融通したりすると効率が良かったりするとかしないとか

ゲーム開始直後はわりと忙しないが、一週間もすると数時間に一回確認すれば済むようになる。

というか、十分な資源があってもひとつの惑星で一度に2〜3のタスクしか実行できず、しかもそれぞれが完了まで数時間とか半日とか下手すると数日かかるため、どうせ頻繁に確認しても前に実行した作業が終わってないのですることがない。
せいぜいため込んだ資源を狙って海賊が攻めてきたりしてないか確認するくらいだが、ゲーム開始からしばらくの間は上位プレイヤーからは攻められないように保護されているから最初のうちはあまり心配ない。

最終目的

とりあえずどんどん防衛植えて海賊が攻めにくい星に育てるのは地味に楽しい。これは農民プレイと呼ばれ、OGame が盆栽ゲーに喩えられる所以である。

本来は海賊用の艦隊を育てて他のプレイヤーと同盟を組んで宇宙を荒らしまわったり他の海賊から身を守ったり他の同盟と戦争したりするらしいが、おれの場合は同盟を組んでくれるような友達がいないので、前にプレイしたときは反撃が怖くてせいぜい空き巣(プレイヤーに長期間放置された惑星を攻撃する)くらいしかやったことがない。
今回も多分そうなる。


まあ技術開発を進めてコロニー増やして自分の帝国を発展させていけばいいんじゃない?
あとは各種ランキングで上位を目指すとか最強戦艦デススターをいっぱい作るとか最強防衛プラズマ塔をいっぱい植えるとか惑星間ミサイルを大量生産して近隣の惑星の防衛を根こそぎ削ったらその人の友達が大挙して攻めてきて逆に焼け野原にされて必死に謝っても許してもらえなくておまけに 2ch あたりでアカウント晒されて涙目でアカウント削除するとか楽しみ方は人それぞれ。

初めてのひととものすごく久しぶりのひと

まずは左側メニューの一番上の「?」からチュートリアルを開いて書いてある通りにやれば良い。
チュートリアルを進めていけばゲームの概要も把握できるし、課題をクリアするたびにご褒美がもらえるのでとても捗る。

ちなみにおれは今「三人以上の同盟に参加する」がクリアできないでいる。

すごく久しぶりのひとへの注意

  • 「天体物理学」というリサーチを進めないとコロニーが増やせなくなっている。
  • コロニーの大きさもスロット8が最大(163〜247f)で、スロット8から離れるほど小さくなっていくらしい。
  • 収容量はたいして多くないけど絶対奪われない貯蔵庫なんてのが追加されてた。トラビアンにもそんなのあったな。
  • スキンが使えなくなってるぽい。

ともだち募集中

下記バナーをクリックして飛んだ画面でユーザ登録してゲームを開始すると、最初の惑星がおれのご近所さんになる上に「バディー」というお友達システムが適用されるのでおれがとても喜びます。

ActiveAdmin 入れたら I18n でハマった

結論から言うと、config/application.rb で config.i18n.default_locale ではなく config.i18n.locale に :ja を設定したらうまくいった。

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    config.i18n.default_locale = :ja
    config.i18n.locale = :ja

config.i18n.load_path のコメントアウトは外してないけど config/locales にロケールファイルを置いておく限りでは大丈夫ぽい。