新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2019-10-11

猿渡学園というソシャゲサービスを作っていたころの話をしよう①

※もはやこちらのブログを更新することはないと思っていましたけど、さまざまな理由でこちらで書くことにしました。
※このエントリはおじさんのおじさんによる懐古話となります。

ひょんなことからこちらのブログエントリを目にしたのですが、そろそろほとぼりも冷めた頃だと思いますので、元「中の人」として、記憶している限りのことを書いていこうかと思います。もし当該エントリを書いた方がこの文章を読む機会があれば、大変幸甚です。

如何せん私自身の思い入れがかなり強い作品であり、非常に長くなりそうなので、一応タイトルに番号をつけておきました。

第1回目は、猿渡学園の特徴と、開発の経緯を振り返ってみたいと思います。

猿渡学園とは

知らない方のために簡単に解説。

ここで語る「猿渡学園」とは、2007年12月~2011年3月までの間、フィーチャーフォン向けに提供(PCでの利用も黙認)されていた同名のwebサイトを指します。不良だらけの高校を舞台とした作品で、「ヤンキー」同士の喧嘩「タイマン」と不良グループ同士の抗争をコミカルに描いた作風が特徴でした。治安がなさそうな感じがプンプンしますね。

webサイトではありますが、テキストベースで自動進行する対人戦/クラン対抗戦(団体戦)を軸としたソシャゲであり、キャラクターの性別や育成方針によって、戦闘での立ち振る舞いや得意技などが変わるという特徴がありました。また、サイト内で他のプレイヤーと限定的ながら交流することが可能でした。

なお、2013年ころに同名のスマフォアプリがリリースされており、そちらは機能の不足などが理由で、大変不名誉な評価を得てしまったようです。
念のため、なけなしの沽券のために書きますが、私自身はこのスマフォアプリの開発には携わっていません。

猿渡学園リリース当時

今から12年程前のことだったと思います。当時私は相模原市の零細ソフトハウスにエンジニア(主にシステムインフラ担当)として勤務しておりました。※念のため明記しますが、この会社は現在既に存在しておらず、私自身も現時点で利害関係が全くないことを明らかにしておきます。

郊外の零細ソフトハウスはいくつもありますが、今考えるとかなり労働環境が厳しかったことを記憶しております。朝は10時までには出勤、夜はてっぺんを超えることが常態化しており、ひどいときには家に帰ることもままならない日もありました。

一方で仕事そのものは大変楽しく、まだ若かった私としては、思ったほど苦と感じていませんでした(もちろんいつも早く帰りたかったですけど)。

そんな日々を過ごしつつ、2007年12月下旬のとある日(既に社員7年目)、深夜にひっそりと猿渡学園を公開しました。DNSをあらかじめ設定しておいたせいか既にGooglebotが巡回に来ていたんだと思いますが、公開して1時間もしないうちに、社内のテストアカウントではない、正真正銘のお客さんが「入試に合格」(=会員登録を完了)してくれていたのを今でも覚えています。私自身が文字通りメインエンジニアとして作った初めてのサービスでしたので、うれしさもひとしおでした。
その日はもう皆疲れ切っていたこともあり、そのまま業務を終了しました。

「怒りの闘魂」が荒らされる

数日後、思った以上のハイペースで入学者が増え、あちこちでタイマンが行われていることに気をよくした我々は、新機能「怒りの闘魂」をリリースしました。
これはいわばTwitterのつぶやきのような機能でして、雑に今の気持ちを1行の文章として投稿&全公開できるシロモノでした。

ところがこの「怒りの闘魂」、投稿文にhtmlタグを仕込むことができてしまうという、web系のエンジニアとしては大変恥ずかしい不具合を積んだままリリースされてしまったのでさあ大変。一部の生徒(=プレイヤーさん)が投稿内容をmarqueeタグで囲んで左右に動かしてみたり、blinkタグで点滅させたり、fontタグでバカでかい文字にしてみたりと、結構自由奔放に装飾された投稿をし始めました。なお当時のボスは「おもしろいし、このままにしておいて!」と言ってましたが、私としてはとにかく早く何とかしたい気持ちでいっぱいでした。

そのくらいならそこまで実害は大きくないのですが(十分ひどい)、学園にエロ本(=imgタグによるエロ画像の設置)を持ち込むような生徒やゴキ○リ(=ブラクラ)を呼び込む餌(=リンク)を置く生徒などがちらほら出始めたので、一旦新規投稿機能を止め、一部の投稿をDBから削除し、タグエスケープなどの措置を施して再度公開しました。UGC(ユーザ作成コンテンツ)の難しさを学んだ出来事でした。

レベルとクリティカルが実装される

さて、ここからはいよいよ戦闘周りの変更が入りますよ・・・!

数日後、生徒から問い合わせがありました。たしか「タイマンが単調でつまらない」という内容だった気がします。
それもそのはず。最初のころはレベルの概念もなければ技もない。ましてはクリティカルもない。これではつまらない。

ということで、ひとまずレベルとクリティカルを実装しました。その結果、大多数のプレイヤーが運にステータスを極振りするという事態に。

ちなみに猿渡学園におけるパラメータはこのころ

*力 (一撃で与えるダメージの大きさに寄与)
*熱血(受けるダメージを軽減する効果に寄与)
*根性(攻撃の命中率に寄与)
*速さ(攻撃の回避率と先制攻撃のチャンスに寄与)
*体力(ライフの上限値に寄与)
*運 (クリティカルの発動率に寄与)

の6種類あって、レベルが1上がるごとに4ポイント割り振りができることとなっていました。そしてクリティカルが発動すると、熱血によるダメージ軽減を無視することができました。

前述のとおり、このアップデートによって大多数の生徒は「力=運>速さ」のタイプを選択することとなり、熱血や根性、体力を重視したタイプが不遇の扱いを受けることとなりました。

②へ続く。

2013-08-20

[Perl]Archive::Zip使う前に読んでほしいエントリ

Archive::Extractってのを使うとハッピーになれます。

Archive::Zipと比較した利点

  1. インターフェースが実直
  2. 依存モジュールもさほど多くない
  3. ZIPアーカイブ以外にも.tar.gzあたりにも対応してくれる
  4. 安定と実績の作者

2013-07-31

[Perl] 某WAFを書いていたらTravis神が激おこプンプン丸だったので原因と解決案を(若者が)探った

https://travis-ci.org/ytnobody/Voson/jobs/9679903

このTravis-jobsをみてやって欲しい。common::senseがインストールできてないらしく、全然テストどころでは無くなってしまった。

で、某仮想八王子でそんなことをのたまっていたら、若人2名が原因をさぐってくれたりした。

http://blog.papix.net/entry/2013/07/31/153544

http://moznion.hatenadiary.com/entry/2013/07/31/172410

結局のところ、Devel::Cover::Plugin::CoverallsがJSON::XSに依存しており、JSON::XSがcommon::senseに依存していたため、common::senseがぶっ壊れたタイミングでJSON::XSもD::C::P::Coverallsもぶっ壊れてしまった、という状況。

これについては先ほどD::C::P::Coverallsにpullreqを投げてみたので、きっとそのうち何かしらのアクションがあるのではないかと思っております。

[追記]

じきにcommon::senseのfix入る模様なので、すぐに元の平和が訪れるでしょう。

[翌日、追記]

早速common::sense 3.72がリリースされ、元の平和が訪れました。
これをうけ、D::C::P::Coverallsのpullreqはクローズしました。

[さらに追記]

今回の一連の流れをtokuhiromさんがまとめてくれています。

また、今回の件をきっかけに、JSON.pmのメンテナであるmakamakaさんが、JSON関連のモジュールを紹介してくれています。

2013-05-28

[ツール]plenvやrbenvを一発でインストールするスクリプト

タイトルどおりの物をつくったので、晒しておきます。

使い方


plenvの場合

$ curl -L http://is.gd/plenvsetup | bash


rbenvの場合

$ curl -L http://is.gd/rbenvsetup | bash


手元でしか動作確認してないですので、おかしなところあったらツッコミください。


2014/04/28 追記

plenvsetupを更新しました。以下の修正が行われています。

  • zshに対応しました
  • ~/.plenv が存在する時にgit cloneしないようにしました
  • 手動によるprofileの再読み込みを促すようにしました

2014/05/31 追記

実行方法を sh から bash に修正しました。

2014/06/03 追記

後日談をこちらにかきました。ぜひ参考にしていただきたいと思います。