For IaMP Advent Calender 2014:

So the Japanese IaMP community is holding an event for the month of the game’s ten year anniversary, asking community members to write articles for it. I was asked to do it, and it sounded like a good idea, so here I am. This article is going to be about my personal history with the game, the history of Mizuumi’s #iamp, and the reasons behind RollCaster.

日本の萃夢想コミュでは萃夢想10年記念に記事作りのイベントがあります。私が参加するか尋ねられて、良いと思ったので作りました。この記事の内容は私の萃夢想経験とMizuumiの萃夢想コミュの歴史とRollCasterを作った理由です。

While I’m not especially good at Japanese, I intend for this to be translated, so I’m keeping the language simple and stiff. Please be patient with me, thank you.

私は日本語を上手く使えませんが、日本語に翻訳するつもりなので、シンプルな文章を使います。よろしくお願いします。

Personal history with the series and game:
私個人の東方と萃夢想の歴史:

Way back in 2004 I was looking for interesting games to play, and I found out about the web trial for Imperishable Night so I thought I’d give it a try. Immediately became hooked on it and then looked at other Touhou-related games, including eventually IaMP in 2005. Played single player a lot, but didn’t do much more than mash royal flare with Patchouli. Watched some Japanese replays, but having had no one to play it with, I put it away.

2004年に面白いゲームを探す中で東方永夜抄の体験版見つけたからやりました。即夢中になったので他の東方関連のゲームに興味が湧いてきて、2005年に萃夢想を試した。一人でプレイすることが多く、パチュリーでローヤルフレアーぶっぱばかりしました。日本のリプレイを見ましたが、一緒にプレイする人がいないので放っておきました。

Three years later, in mid-2007, I was on a fighting game high and was looking for interesting games with online play. By chance I found the famous Ric vs Aruhori match video, which led me to the Mizuumi wiki and discovering th075Caster’s existence. Deciding it was worth giving a serious try this time, I practiced offline with Yuyuko for a week, then joined #iamp and been there ever since. Switched to Reimu the next month, who I still main. Really enjoyed watching and studying Sekibun’s Reimu play.

3年後、2007年の半ば、格闘ゲームに夢中になったのでネット対戦出来る格闘ゲームを探しました。偶偶youtubeでRic対有堀七須の有名な試合見ました。それからMizuumiのwikiを見てth075Casterの存在を知りました。本気で挑戦しようよ決めてから、一週間ほど幽々子を練習してから#iampに参加して、今でもそこにいます。次の月に霊夢に変更しました、まだ私のメインキャラです。積分の霊夢を楽しく見まして勉強になりました。

I wanted more features in th075Caster, so I took the freely available source code and created CowCaster. I added automatic delay calculation, custom color palettes, a pretty junky training mode, and other nice functions. The automatic replay saving and spellcard hiding had come from another developer. This eventually became the base for RollCaster.

th075Casterにもっと機能があったら良いと思い、ソースコードをドーンロードしてCowCaster作りました。自動ディレイ計算とネットで使えるカラーパレットとバグだらけなトレイニングモードやその他の機能を追加しました。自動リプレイセーブとカード隠す機能は他の作者から。後ほどCowCasterがRollCasterの基礎になりました。

And somehow I still play it occasionally. It’s a fun game, and the biggest draw for me is that it’s different enough from everything else that there is literally nothing else like it. I didn’t like the direction that was taken with later games, so I didn’t follow along to them, opting to stay back with IaMP.

まだたまに萃夢想をなんとかやっています。楽しいゲームで、他のゲームとは異なる、本当に独自なゲームなところが一番の魅力でした。後の東方格闘ゲームの方向性が好きじゃなかったのでそのままで萃夢想に残りました。

English-speaking community, history, now, etc:

In 2006, the host of Mizuumi, bellreisa(@waitingintheair), added an IRC channel, irc.mizuumi.net #iamp, and a wiki to help create an IaMP community. Most of the players who came were fans of Touhou or anime games originally, and not generally fighting games as a whole. Despite that, it’s a place for serious fighting game players, and most casual Touhou fans did not stay long.

2006年にはMizuumiの管理者(bellreisa, @waitingintheair)は萃夢想コミュを作るためにIRCのch(irc.mizuumi.net #iamp)とwikiを作りました。 大半の新しいプレイヤーは元々東方やアニメファンで普段は格闘ゲーム自体をやっていません。そのため、真面目な試合を求めるプレイヤーが集まった場所だからカジュアルファンはすぐ出て行きます。

We spent years obsessing over Japanese information sites and replays, learning from anything we could find, though at that time Japanese language knowledge is not common and we had to figure out much of it ourselves. I’ve only recently learned Japanese myself, and only a couple others knew it well. Most translations had been done with machine assistance.

数年間で日本からの情報とリプレイにとりつかれました。見る物すべてが勉強になりましたが、あの時は日本語の知識がある者が少なくて、多くのことを自力で見つけなければなりませんでした。私は日本語が解るようになったのは最近です。大半は機械翻訳で翻訳しました。

Because we had relatively few players, this enthusiasm for the game carried our playing and drive to improve, but not all characters had been well represented. For example, we had many strong Youmu players, but few to no Suikas. I still don’t know how to fight a good Suika player! More than technical expertise, this has been our biggest weakness, but becoming able to play outside communities with RollCaster helped us overcome a lot of it.

プレイヤーが少ないから、萃夢想に熱心でよく頑張ったけれど、すべてのキャラに使い手がいませんでした。例えば、強い妖夢使いがたくさんいましたが、萃香使いはあまりいませんでした。私はまだに強い萃香使い人と全然上手く戦えない! 技術よりそれが一番の弱点ですけど、RollCasterで他のコミュとプレイ出来るようになったおかげで、たくさんの問題を乗り越えました。

Our notable players: Reimu(mauve, Armando, Chiyou, Kura), Marisa(Comic-Z, hourai, Pdee, bellreisa, Kura), Sakuya(Malty, Zed, bellreisa, Armando), Alice(TMN, mauve, bellreisa), Patchouli(Zed, Shy, Armando), Youmu(ZomB, Baco, hourai, DeuS, satsu, Chiyou), Remilia(mauve, ZomB, Pdee), Yuyuko(mauve, bellreisa), Yukari(mauve, Pdee, sphyra), Suika(Pdee, bellreisa), Meiling(hourai). Apologies to anyone I forgot.

キャラごとの要注意プレイヤー: 霊夢(mauve, Armando, Chiyou, Kura), 魔理沙(Comic-Z, hourai, Pdee, bellreisa, Kura), 昨夜(Malty, Zed, bellreisa, Armando), アリス(TMN, mauve, bellreisa), パチュリー(Zed, Shy, Armando), 妖夢(ZomB, Baco, hourai, DeuS, satsu, Chiyou), レミリア(mauve, ZomB, Pdee), 幽々子(mauve, bellreisa), 紫(mauve, Pdee, sphyra), 萃香(Pdee, bellreisa), 美鈴(hourai)。書き忘れた人がいたらすみません。

Even at the community’s peak, offline play was not common. America is huge, players are far apart, and fighting game events often require major travel planning. And as most of the players were primarily netplayers, they weren’t used to traveling to events. There’s always a few people playing it at NEC or Evo, but never a serious offline tournament.

一番人がいた時でも、オフのプレイは少ないです。アメリカは広く、プレイヤーが離れすぎていて、格闘ゲームのイベントには結構大きな旅行が必要です。大半のプレイヤーはネット対戦がメインだから、イベントや旅行に慣れていません。NECやEvoに行く人は何人かいましたが、真面目なオフ大会はありませんでした。

Nowadays, there are far more fighting games with good netplay and easily available to everyone, and most players have moved on to other games. Even then, in #iamp, you can usually still get a match if you ask, so please come by sometime if you want to play. Japanese is fine!

現代は良いネット対戦機能がある格闘ゲームが誰でもできるようになって、大半のプレイヤーが他のゲームに行きました。 それでも#iampで質問と試合ができますので、萃夢想をやりたい時は是非来てください。日本語でも良い!

Rollcaster:

In late 2006, a new network model for fighting games was created, which to enabled lagless inputs by rewinding the game for the opponent’s actions. Compared to the input delay methods that had come before it was completely different, and immediately popular with fighting game players. I created RollCaster to support the same with IaMP. Since then, Fireseal has also added rollbacks to EFZ and Hisoutensoku.

2006年の後半には新しいな格闘ゲームのネットワークモデルが作られました。自分の入力を遅延させる代わりに相手の動きを巻き戻すやつです。入力を遅延させる方と比べると全然違って、格闘ゲームをやっている人たちの間で即大人気になりました。私は萃夢想にそのモデルに対応できるようにロールキャスターを作りました。それからはFiresealさんがEFZと非想天則にも巻き戻し機能を作りました。

By 2009, #iamp’s average skill level had risen enough that 4~5 input delay was no longer acceptable to many players, which split us into small islands which did not want to play each other anymore. I had given thought to adding rollbacks, even writing design plans, but was not yet sufficiently motivated. Then, one fateful day, in a 5-delay match against Baco’s Youmu, an impossible counterhit elbow broke my spirit. Ragecoding ensued. Two weeks later, we had a playable, but buggy version. Two months after that, it was stable enough to play, and everyone had switched over.

2009年頃から、#iampは平均的なレベルが上がりすぎて、プレイヤー達が4~5フレームの遅延に耐えられなくなりました。他の地域と対戦したくないプレイヤーにより、小さな複数の地域に分裂しました。ロールバック機能の追加をを考えた事もありましたし、デザインの計画も書きましたが、モチベがまだ足りてませんでした。ある日、私とBacoさんの妖夢が5ディレイで試合していた時に、妖夢の不可避な肘にカウンターヒットして心が折れました。怒りの力でコードを開始しまして、2週間後にバグだらけロールキャスターが公開されました。さらに2月間後、やっとプレイできるくらいに安定して、皆が使えるようになりました。

Everyone’s level of play immediately improved drastically, and delay from distance was less of a concern. I could even do my combos! Additionally we could play Japan more easily and frequently, giving us a pool of players that we previously couldn’t play with reliably. Without this upgrade, I don’t think #iamp would still exist.

皆が即上手くなっていきまして、遠く離れた地域との対戦でも遅延が気にならなくなりました。私はコンボができるようになった! さらに私達が日本と手軽に戦える、以前は試合出来ない人とも試合ができるようになりました。ロールをつくらなかったら今の#iampは存在しなかったと思います。

I’m really happy that Roll has also taken hold in Japan, and that Weltail added a version with support for the Japanese netplay lobby. Good netplay benefits everyone! There are parts of RollCaster I’m not thrilled with, but I think it’s plenty good enough.

ロールが日本に拡散したことと、ウェルテルさんがロビー対応版ロールを作られたのはとても嬉しいです。良いネット環境は皆に良い事です! ロールキャスターは細かい部分に不満が残りますが、結構充分だと思います。

If there is interest in a detailed technical article on how rollback netplay works, and people willing to help translate to Japanese, I can write one. However, it would be too long to include here.

興味と翻訳者がいれば、ロールのネット機能について技術的な記事を書けますが、あの記事は長すぎるのでここには書きません。

Closing:

I don’t play much lately, but I still enjoy IaMP, and if you’d like a match, you can ask me either on IRC or on Twitter at @mauvecow or @mauvejp. Thanks for the good times; I’ll definitely be back for the next fighting game I enjoy, count on it. (But I’m not playing anything without rollbacks again, even if I have to make them myself!)

最近萃夢想をあんまりやっていませんが、まだ楽しんでいきたいので、対戦したくなったらIRCやツイッター(@mauvecow@mauvejp)に是非連絡してください。楽しい時間をありがとうございました。次に楽める格闘ゲームがでたら戻ってきます。(巻き戻し機能が無いゲームはやらないけど、自分で作れるからね!)

Special thanks to Toho(@tohololovitch) for proofreading the Japanese text!

徒歩さん(@tohololovitch)が日本語のを校正しました事に感謝します!

Desyncs and FPU synchronization.

If you’ve ever written anything that tries to keep perfect synchronization across systems, odds are pretty good you’ve run into desyncs. Some of them sensible, some of them leading to weeks of hair pulling.

And of course, the most obtuse and unexpected one of all is dealing with floating point issues, where a single off-by-0.000000001 error will snowball up into something much larger in a quick hurry. Traditional wisdom has just been to not use floating point math for anything related to logic, but this is not practical in every situation.

It turns out that’s not entirely true and perfect synchronization is attainable, if you understand the pitfalls that are in place. Warning: This gets fairly technical.

Read more »

Understanding Fighting Game Networking

So earlier today I was talking with Zinac about timing and synchronization issues in fighting games. More specifically, the cases that need to be handled with respect to packet loss and frame loss. These are actually very different things!

Then it occurred to me that I haven’t actually written an article on how fighting game netplay really works at a nuts and bolts level, and so here we are.

Read more »

Retrospective: Hellsinker Translation Development

So I volunteered to work on a translation for Hellsinker, a game by Ruminant’s Whimper.

“It’s just a shmup, how difficult could hacking it be?”

Famous last words.

It finally got released, and you can get v1.1 over here. It fixes a few minor issues over the initial release. Check it out. Huge huge huge thanks to Nazerine and Halbarad for doing the translation and image editing respectively.

Warning: Spoilers and technical babble ahead! Do not read if you don’t want them.

Also, brace yourself. This is going to be a long one.

Read more »

How I didn’t clip the sound effects.

As a certain recently released fighting game added rollbacks and then completely screwed up the ability to handle sound effects, I think now’s a good time to go over how RollCaster‘s sound engine works.

Before I get in on it, I want to get something out of the way though. This process is not in any way CPU intensive and anyone claiming this sort of thing would be hugely draining on a computer’s resources just so happens to be full of crap.

The case of doing this in a modern game that is being run directly on the native system is often somewhat different from the case of an emulator running an old game, so GGPO itself is not perfectly applicable here. Namely, you have to deal with the sound APIs instead of just saving the state of everything, which is a somewhat more complicated affair.

Alright! So, with that done, let’s phrase the problem here.

Read more »

Investigating RollCaster’s Timing Issues

After finishing the desync fix I thought I had finally finished. Shortly after, a few Japanese guys tried it out and got back to me that the timing was unstable, causing the frame rate to jitter unnecessarily.

Sure, I thought, it can’t be that hard to fix.

This started a very long process which led me all over the codebase, analyzing every last part of the process involved in it, for over a month. I’m sure nearly everyone who put up with me begging for testing and putting out updates is sick of me by now!

Read more »

Investigating RollCaster’s Desyncs

So RollCaster has had a long-standing desync issue. This is a pretty minor thing as far as the Western player base is concerned, since the community don’t have a lot of players and it happens infrequently enough that it’s more a nuisance than anything else. They probably thought I was mad for attempting to fix it.

If I wasn’t before, I sure went mad trying!

I was moderately successful, and I’m not sure it’s even possible to be truly 100% on this one so I’m not going to worry about it too much. Instead I’ll discuss the origin, strategy used for finding it, the results, and a ridiculous case of coincidence that popped up.

Read more »