新しいblogに移行しました

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

2021-12-28

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

さて、前回の投稿からすでに1年以上経過してしまいました。すみません、すみません。

ここから先は若干時系列があいまいです(だいぶ忘れかけている)が、覚えている限り一気に書いていきます。

ポケベル(通知)

最初のころは「相手から果たし状や手紙が来たことがわからない」という状況でした。
初期はまだ通知という概念がなく、割とリアルタイムなやりとりが求められることがわかったので、画面上部にマーキー(こういうやつ)でポケベルという体で通知を出したものです。

体力ゲージ

これも最初期は表示されていませんでした。結局どのくらい体力が残っているかわからないので、突然KOされたみたいな雰囲気が出ており、ゲームとしてのハラハラ感が薄かったです。
社内でも「これはゲージが欲しい」という話になり、HTMLのテーブル機能を悪用して体力ゲージを実装しました。本当は表を作るための機能なんですが、この頃ではwebサイトのレイアウトに使われるという事態が横行しており、この体力ゲージもそのような悪用例のひとつでした。
しかし、いちいち画像生成するのも面倒だし、パケットをできるだけ少なく済ませるにはこれが適格でした。もちろん、ゲーム性が一気に高まったのは間違いありません。

クラブ活動・チーム(コミュニティ機能)

チームは割と早い段階で実装されており、いろいろなチームが作られていく様子を見て「すげえ、本当にこんなに人集まってるのか?!」と驚いたものでした。
しかし、チームという繋がりだけではテーマ性に乏しいところがあったので、クラブ活動という機能を設け、趣味等によるつながりを作れるようにしました。
これはこれでかなり盛り上がりを見せ、バトルをせずにコミュニケーションツールとして猿渡学園を愛用してくれる人たちが結構な割合で出てくるようになりました。

個人的には、猿渡学園で交際を始めたり、結婚したりする生徒が出てきた時には「このサービスはまだまだ伸びる」と確信しておりました。

検閲機能

コミュニティ系の機能を強化した代償として、いくつか犯罪に直結しそうなやり取りが散見されるようになりました(違法薬物の受け渡しを仄めかすようなものや、児童買春につながりそうなものなど)。
管理画面では生徒すべてのやり取りを閲覧できる機能があり、犯罪を抑止するために定期的に新着投稿をチェックしておりました。その上で、一部のメッセージは運営権限で削除することもあり、日々かなりの労力を割いておりました。

さすがにこのままでは身が持たないと思い、機械的な検閲機能を実装しました。
が、この検閲機能がなかなか独特で、通常であれば元の投稿を自動的に見えなくするなどの措置をとるのですが、そこは猿渡学園、なんと元の投稿のヤバイ単語を面白おかしく書き換えることにしたのです。

例えば「クスリほしい」みたいな投稿は「洗剤ほしい」などと書き換えられてしまい、「お○○こ見せて」のようなおハレンチな投稿も「生牡蠣見せて」のようになってしまうのでした。

この検閲作戦は大成功で、そういう投稿をする生徒たちが「アホらしい、退学するわ」と捨て台詞を吐いて退学していったのです。

入学時にゆうきちとのバトルが発生(チュートリアル)

そもそも当初はバトルそのものがおまけという位置づけでした。
ところが、思いのほかのめり込む生徒が多かったため、バトルについてのチュートリアルが必要だろう、ということで、高校デビューくんであるところの「ゆうきち」君に入学式直後の下校のタイミングでプレイヤーに絡んでもらうことにしたのです。
まぁパラメータ的にはオール1なので激弱なんですけどねw

ともあれ、これで「このゲームではバトル要素があって、しかも事前に作戦を選んで自動戦闘が行われるタイプのゲームなんだな?」というのが新入生にも伝わるようになりました。

ちなみにゆうきち君は、その後の同社ゲーム作品にもいじられ役として登場するキャラクターであり、電車通学の最中、腹痛に耐えながら尊厳を守ろうとフン戦するアプリ「う○こもれそう」にも登場しております(当然ゆうきち君は尊厳を失ってしまうのですが・・・)

抗争(20vs20の多人数戦)

1vs1のタイマンバトルもある程度なじんだところで、様々な生徒から「多人数戦ってできないんですか?」という問い合わせが寄せられるようになりました。
そこで開発スタッフの間では「1vs1では完全な自動戦闘だったけど、多人数戦の仕様をどうするか」という話になりました。当初は以下のような案が出たと記憶しています。
  1. リアルタイムにパンチ・キックなどの技を繰り出せるアクションゲーム
  2. ターン制カードゲーム
  3. リアルタイム進行の多人数参加型タイマンバトル(もはやタイマンとは言わないw)
結局、一番手間がかからず、かつ一番激アツだろうという理由で3が採用されました。
なお1については別途iアプリ等でリリースされたアクションゲーム(タイトル忘れた)の原型仕様となりました。

結果的には3を採用したのは大正解だったと思っています。というのも、抗争の予約スケジュールが連日いっぱいとなっており、多人数戦ならではのステ振りというものも生まれるほど、攻略が熱を帯びたのです(殴られ役のタフ型、ダメージ特化の連続クリティカルラッシュ型、防御無視のプロレス技型などなど)。

協力技

抗争も実装され、ある程度なじんだところで、運営スタッフは隠し要素としてこの「協力技」をひっそりと実装しました。
協力技も7種類ほどあり、パラメータ的に合致した2名以上のキャラクターが仲間同士として抗争に参加した時に、特定の技をトリガーとして発生する、というものでした。

全部は覚えていませんが、確か以下のようなパターンがあったはずです。
  1. Aがラリアットでなぎ倒す→Bがフライングドロップ(単体防御無視の大ダメージ)
  2. Aが相手の攻撃をカウンター→Bが相手をバックドロップ(同上)
  3. Aがラッシュで相手を失神させる→Bがすかさず相手をジャイアントスイングしながら敵の群れに突っ込む(相手ダウン+相手チームの数名に中ダメージ)
発生条件がとても厳しく、お目にかかれること自体が非常に珍しい隠し要素でしたが、サービス運営中に数回ほど発生しており、その際は非常に盛り上がったものでした。

NPC参戦

猿渡学園には数名のNPCヤンキーが存在しており、基本的には強キャラ揃いでした。ざっくり以下のような感じです。
  • 白鳥(カイチョー):生徒会長。番長。きれいなモヒカンデブ。打たれ強いレスラー型
  • 鈴木(サブロー):両腕に入れ墨のあるスキンヘッド。ダメージ重視のラッシュ型
  • 手塚(テッショー):髭面坊主。相手の攻撃を利用するカウンター型
  • 滝沢(スミス):金髪オールバックの外人。一撃一撃が重い打撃型
  • 安田(ドンキー):お調子者のスケベモヒカン。器用なオールラウンド型
  • 本城(ナオキ):博多出身のイケメン狂犬。防御無視のクリティカル型
これらのキャラにもメッセージを送ることが可能であり、それぞれ役割分担がされていました。カイチョーは主に運営への意見箱として、サブローはタイマンバトルの相手として、ドンキーはコミュニティの盛り上げ役、スミス・テッショー・ナオキは抗争へのゲスト参戦、という感じです。

ちなみに抗争にも呼ばれて参加することがあり、ナオキやドンキーは割とすぐにやられる一方、スミスやカイチョーが粘り強く、テッショーやサブローは攻撃をうまくかわす活躍が見受けられました。
これらのNPCが抗争にゲスト参戦した際は大変な盛り上がりでした。私自身もこの作品を手掛けられてよかったと感じたものです。

アバター機能

もともと各生徒のオリジナリティを出すために、イメージ画像のアップロードをできるようにしてありました。
しかし、エロ画像やグロ画像をアップする生徒が一定数いたことと、当時アメーバピグが流行り始めていたことから、アバターを実装することとなりました。

ちなみに猿渡学園の収益はこれまで、タイマンバトル時にクリックする広告によるものがすべてでしたが、アバターに着用させる服などのパーツ類を販売することでもう少し利益率を改善したい、という狙いもありました。

アバター機能自体は一部の生徒に熱烈に受け入れられ、パーツの売れ行きもまずまずでした。

強化系アバターパーツ

アバターパーツで見た目をかっこよく・かわいくする、という方向性がある程度出てきたところで、若干の禁じ手感がある施策「お金で強さを買える」やつである、この強化系アバターパーツをリリースしたのでした。

開発チームの中では「パラメータを+10くらいして一気に強くなれるアイテムを高額で売ろう」という話も出ていたのですが、ゲームバランス・レベルデザインを担当していた私としては断固拒否を続けていました。
タイマンバトルを100万回、あるいは抗争を5万回自動で行う開発者用チューニングツールを開発してバランス調整を行っていたので、パラメータが10上がることによるインパクトを熟知しており、それによってゲームがつまらなくなることを恐れていたのです(+10すると、それだけで一部の技が出せるようになる)。

とはいえ、売り上げが上がらないのも問題なので、+3くらいまでならいいですよ、という条件付きでゴーサインを出したのです。結局これらのアイテムはよく売れました。バランスが崩れないギリギリのところで調整できたのもあって、多少効果はあるかも?という感想が多かった気がします。

特訓(であってたっけ?)(パラメーター再調整)

たしか特訓という名前であってたかと思うんですけど、要するに「余りまくっており使いどころのないヤンキーポイントというものの使いどころ」を作ろうか、という話が発端となって作られた機能です。

そもそもやり込み勢の間で「パラメータ再調整するためにキャラ作り直しする。だから一度退学して再入学する」という動きが結構あったのですが、購入したアバターパーツもろとも破棄されることになっちゃうので、それはよくないよねという話となり、じゃあ特訓って機能を作りましょう、ということで実装されたものです。

ちなみに特訓のためには前述のヤンキーポイントを1万点消費するのですが、Lv.99になったような生徒はヤンキーポイントが大体5万点ほどに達していたので、みんなどんどん特訓するようになりました。

戦闘エンジン再実装&新パラメータ追加

ある日、「抗争が止まった」という不具合報告が上がってきました。調査の結果、戦闘エンジンが異常終了しており、かつ原因はよくわからず、という状況でした。

当初の戦闘エンジンは「おまけ」として作られたものを継ぎ接ぎして拡張したものだったので、正直どんな不具合が起こっても不思議ではない状態でした(相手にマウントポジション取られているのにジャーマンスープレックスを発動したり、失神した奴が戦闘に復帰したり・・・)。

流石に戦闘エンジンの問題が山積している状態だったので、一度完全に作り直すこととしました。パラメータや技を新しく追加しやすいようモジュラー化したり、バランス調整テストを行いやすくするためにキャラクターのロード方式を変更する等、設計から抜本的に見直しました。

ただ、これだけだと何も新しい体験を生み出さないので、2つの新パラメータ「魅力」と「卑怯」を追加し、ちょっぴりHな攻撃や姑息な攻撃などができるようにしました。
また、パラメータによって若干キャラクターの口調が変化するようにもしました。
さらに、パラメータごとの強さというか得手不得手をやや大きめにバランス調整しました。

これについての生徒からの反応は様々で、「つまらなくなった」「前のやつに戻してほしい」という意見がある一方で「魅力つえええええ」「魅力上げたら『見えた・・・!?』ってww」「卑怯おもろ!」のような新パラメータの登場を喜ぶ意見、「抗争のパワーバランスが変わった」「抗争がまた面白くなった」という変化そのものを楽しむ意見など、開発者としてはなかなかヒリヒリしながら感想を見ておりました。

いじられ系NPC追加(ガリ、タイソン)

新パラメータが追加された後、すぐにいじられキャラを用意しました(どちらもキャラクター原案は私)。ざっくり以下のような感じです。
  1. ガリ:いわゆるガリ勉君。三国志ファン。低Lvながら素早さと卑怯が異様に高い。
  2. タイソン:見た目がマイクタイソンの陰キャ。低Lvで、戦闘時にはなぜか攻撃してこない。
ちなみにこれらのキャラクターが登場した際、サブローやスミスがしきりに「裏番長の噂を聞いた」と発言する伏線が張られていましたが、実は裏番長はタイソンでした。

裏番長タイソン

タイソンにタイマンバトルを仕掛けた生徒なら知っていたかもしれませんが、彼にLv.99で挑んでもなかなか倒せません。というのも、タイソンは熱血が異様に高く、通常キャラクターでは到達できない300という、超高防御型だったのです。しかもそれなりに素早いので結構攻撃を回避するのです。
また、行動パターンもタイソン用に特別仕様で作られており、残り体力ゲージが15%を切らないと一切攻撃をしてきません。
体力ゲージが15%を下回ると攻撃モードに入り、通常のパンチ(実は特別技)を放ってきます。このパンチは命中率が30%ほど高められており、かつ、これまで受けたダメージと同じ分のダメージ(防御無視)を与える仕様となっていました。大抵は一発KOとなります。

たまにタイソンにやられる高レベルヤンキーがいて、周りのメンバー一同不思議がっている様子を観測できた時には、狙い通りの展開になったことでほくそ笑んでいたものです。

軍師ガリ

ガリについてはもっと隠し要素過ぎて、ついに誰にも知られることがなかった要素があります。それは「ガリを抗争に連れて行くと、30%程の確率でチームメンバーの動きが良くなる」というものでした。

ガリが抗争開始直後にビビらなかった場合、「皆の者、我の命に従うのだ!」という発言をし、軍師のようにふるまうのです。具体的な影響としては、以下のようなものがありました。
  1. 敵側メンバーがことごとく落とし穴や罠に引っかかる
  2. ガリが直接攻撃をしなくなる
  3. 仲間の回避率が50%ほど上昇(回避時にガリが「そこ、来るぞ!」と教えてくれる)
  4. 本来発動しないメンバーによる協力技が発動する(発動時にガリが「いまです!」と言う)
・・・結構凝って作ったんだけど、これは結局だれも見つけることができませんでしたねw

限界突破クエスト(Lv100~120)

クエストの内容は確かマッス(数学教師広岡)との対決に勝つというものだったとおもいますが、無事マッスに勝利するとLvが100になり、その後最大Lvが120まで引きあげられます。

マッスも相当強いんだけど、サブローを倒せるくらいになれば、マッスも倒せる、というバランス調整だった気がします。この辺はあまり覚えてないです。

企画はあったけど未実装・ボツのもの

さて、ここまで書いてきた施策以外にもいくつか構想がありました。しかし、以下に書く施策は、サービス終了までの間に日の目を見ることはありませんでした。

他校とのバトル

実は他校生徒とのバトルイベントを作る予定がありました。他校の名前も猿渡学園に負けず劣らずのふざけた名前です。
  • 犬丸工業高校
  • 雉島水産高校
などなど。底辺高校臭がすさまじいですが、そうじゃないとバトルなんかしないでしょうw

マッス以外の教師陣との対決

猿渡学園の教師陣は相当に濃ゆい面々ばかりですが、ミスター(英語教師江口)や美術教師中村、源さんこと用務員大河内などと対決できるようにする構想はありました。
ミスターは合気道、中村はよくわからないヒステリーと、それなりにありがちな設定で戦う感じとなっていました。

しかし源さんだけは様子が異なり、源さんのうっかりバイオテロが原因で学内がゾンビまみれになるという設定が考えられており、これは同社からリリースされた別のソシャゲー「モバゾンビ」にそのまま転用されています。

モバゾンビについては需要があれば別途エントリを起こします。

バイクを使った暴走行為

警察に捕まらないよう暴走行為をすることでヤンキーポイントを稼ごう、みたいなコンセプトでiアプリをリリースしようか、みたいな話だったと記憶しています。

が、そんな開発リソースはなかった。

多キャラ操作

複数キャラを操作するためにガラケーを複数台契約するツワモノが数名観測できていましたので、できればそのお金を浮かせて、その分もっと我々に課金してほしい、という思いから、多キャラ操作機能を実装する計画もありました。

が、そんな開発リソースはなかった。

各種クエスト

実は限界突破クエストを実装したときに、非エンジニアでもクエストの実装ができるように、いわゆる「クエストツクール」ともいえる仕組みを作っておいたのですが、ほかにはタイソンとの対戦くらいでしか使われていなかった気がします。残念。

さいごに

前回のエントリでちょっとだけ書いた通り、大震災によるデータセンターの停止と、それに伴う私の意識の変化に伴い、猿渡学園というサービスは非業の終焉を迎えてしまいました。

クソ運営と罵られることも多々あり、私個人としても至らぬ点があったと思います。当時もっと立場が強ければ、と思うことが今でもあります。
ただ、何だかんだ言っても、作り手として非常に楽しくやらせていただき、かつ技術屋としても大きく成長するきっかけとなったことは間違いありません。

当時からもう10年以上経過しており、当時若者だった私も今ではいい年こいたオッサンです。しかし、原体験としての猿渡学園は、エンジニアとしての私の礎となっております。

そして、当時猿渡学園を遊んでくれた皆さん、読んでくれたあなた、本当にありがとうございました。

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関連のモジュールを紹介してくれています。