2011年2月 のアーカイブ

2011.2.28 新作とか風神録とか

新作情報来てますね、やったー

キャラセレクトのみょんがかわいすぎてしばらくは生きていけそうな感じですが、スーパーショートウェーブピーマンや、不安感を掻き立てる画面左下のドクロとか、UFO の再来は勘弁して欲しいところ……

博麗幻想書譜 : 東方Project第13弾 東方神霊廟 ~ Ten Desires.

風ルナ

さて、遂に手持ちのサターンパッド 2機の両方の Rボタン(=低速ボタン)が潰れまして。しばらくは低速の反応が異様に悪いというアクロバティック花映塚を堪能してましたが、流石に不便すぎるので修理してみました

ようは、パッド上部のスイッチのうち片方が死んでるので、ニコイチすれば直るワケです。基盤からサクっとスイッチを外して生きてるスイッチを片方のパッドに移植してみました、動いた!

一般的には第三科学研究所さんで基盤とゴムパッドを注文して交換する方法が推奨されてますが、ニコイチ出来るならジャンク品のサタパを安く入手してゴムパッドとスイッチを移植すればいいワケですから、安上がりでいいですね。ハンダの除去は若干面倒ですが、まぁ慣れですよね

そんな流れで風神録ルナ、久々ですが風神録についてはほぼ敵の出現パターンを把握しているので残1でクリア。なんて大きなこと行ってますが4面道中ぐだぐだで2〜3ミスしたのを5面1ミスで凌いだ感じでしたがー

2011.2.23 魅魔の宮殿、1/2 スペクトラルタワーを突破

1/2 スペクトラルタワーを突破しましたー、ってことで 5000階を突破です。

シイタケ・シールドの階層で「新作」と「モビルフォース」、それぞれおおよそ Atk 1.2倍、1.3倍 という接頭語効果のついたS級アイテムを入手しました、星ちゃんがメインアタッカーとして一点強化モヒカン装備の場合だと ATK 1000万相当を叩き出してます、やったー!

魅魔Q

そんな感じで時代は Def の確保から、如何に Atk を伸ばしていくのか、ってところにシフトしてますが、ちょっとだけ Def についておさらいしてみます。まぁ、wiki やらしたらばを見てる人には今更ですががが

さて、Def ってのは Vit と Agi についてごにょごにょ( max( vit, agi ) x 3/2 + min( vit, agi ) / 2 )して得られた防御力を示す数値のことですが、一般に「階層 x 階層 x 0.150 < Def」の状態を維持している限りは、敵キャラからの1回あたりの被弾は最低限で済むと言われています(ただし、Atk が低いと戦闘が長引き被弾回数が増えます、困った)

そこから逆算していくと、最終的に必要となる Def を確保するのに必要な Agi と Vit の基礎値は 37.5(ちなみにアイテム展示で表示される値に換算すると 740)に収束すると計算できます。(ちなみに、100F で17.35、300F で 26.4、1000F で 33.19、となってます)基礎値ってのは、wiki のこのページの値に対応しているものでして、例えば食品サンプルの場合だと Vit 10.13, Agi 10.73 となり、食サン x3 を装備した場合での Vit 30.39, Agi 32.19 となり、上述の基礎値を満たしていないことが分かると思います

そこでまぁ接頭語の出番でして、食品サンプルを例にとると必要となる基礎値の差分は Vit 7.11 と Agi 5.31 ですから、Vit が 170% 以上の接頭語と、Agi が 149% 以上の接頭語がついた食品サンプルを探せばいいワケです。さらに、Def に補正のかかる接頭語であれば 122% 以上が 1つあるだけで基準値を満たします、便利!

そんな感じで 37.5 の基礎値を接頭語アイテムで確保すれば、最下層で拾ったアイテムを継ぎ足していくだけで Def が基準値を割ることと無縁な快適生活を遅れるワケです。当然、なにも食品サンプルに良接頭語がのる必要はなく、案外いい加減なアイテムでも接頭語と組み合わせ次第で Def の確保は可能ですしそっちの方が現実的な話です

その場合(適当なアイテムで Def を確保した場合)は、高確率で Atk が残念なステータスになってしまいますが、そこを補うためにアタッカーについてだけは一点強化で Atk と Def の両立を図って、出来ることなら Atk 接頭語でさらなる火力を確保するわけですね

まぁ一例ですので参考までに、パーティーの強化プランは人それぞれですしそれを考えるのもまたゲームの醍醐味ですよね。ルールを守って楽しく魅魔Q!

2011.2.21 Canvas を使ってなんか作ってみた

ここんとこですが、なにか作りたいぞ欲求がわりかし高まっていまして。クソゲーを産出するのは Flash が常道なんでしょうけど、Flash の開発環境用意するって実際問題面倒ですし、お手軽に出来そうなモノとして Canvas をさわってみました

Canvas ってのは HTML5 で策定された html 上で図やらを表現する技術でして、Javascript なんかと連動することでうまい具合に頑張れば Flash を使わずにリッチコンテンツが提供出来るってことで、流行っているような技術みたいなものです。そーいえば FIrefox の 4 はいつになったらリリースされるのでしょうか?

さて、そんなワケで Canvas ってどんなもんかな、ってところも含めて軽くさわってなんか作ってみました、いわゆるサンプルプログラム、というのもおこがましい……

http://trr.sakura.ne.jp/php-test/110221.php

こういったアクションっぽいゲームっぽい、のコードを書くのって実は今迄経験がなくて、若干悪戦苦闘しつつジャンプの処理やらマップチップとの当たり判定の処理なんかをサクサクっと書いてこんな感じです。意外にまともに動いてくれます。

さて、どうしようかなー

2011.2.20 使い道のないアイコンもここまで来た

ポチポチとうっていた 16 x 16 のアイコンも、なんかキャラソート可視化の勢いでサクっとコンプしてしまいました。一種のシナジー効果と言いますが、やはり使い道が決まると早いなー、なんて思いつつ他の使い道ないかなー、と模索する今日この頃。いや、なんか作りたいんスよね、なにか

全 76キャラとか、当初は間違いなく全キャラを制覇するつもりなんかなかったんですが、なんとまぁ……。って、途中から塗りが全然違ったりするのはご愛嬌、色とかも露骨に整合性とってないんでやっぱり手抜きです

東方アイコン16x16

2011.2.18 先日のちょっとした補足、キャラの名前間違ってたらごめんなさい

先日のアレですが、こんな感じで html が生成されます

http://trr.sakura.ne.jp/php-test/110217.php

ウンコなぺちぱーはこの世にソースコードを公開するなんて許されざる風潮を感じないでもないですが、まぁ大したことはやってないんで以下のような感じです。入力をなんとかして、配列をデータベースに格納すればもうちょい実用的ななにかになる可能性を感じないでもないけど、まぁ個人の道楽の為にコードなんて書いてなんぼなので(^o^)

よく分からない人に軽く補足しておくと、まぁ下記のコードの 49行目の $rank と、69行目の $rankNotes を追加していくだけで、以降は勝手に表を生成してくれるという話です。多少手間はかかってますが便利でしょ

// 表のタイトル
echo "<h2>【東方キャラソート 〜結果推移を php で可視化してみる〜】</h2>";
// 作品とキャラの対応を定義
function getTitleName($id) {
	$title = array(
		array(1,2,3,4,5,6,7,8,9), array(10,11,12,13,14,15,16,17,18,19,20), array(21,22,23,24,25,26,27,28,29),
		array(30,31,32,33,34,35), array(36,37,38,39,40,41,42,43), array(44,45,46,47,48,49,50,51),
		array(52,53,54,55,56,57,58), array(59), array(60,61), array(62), array(63,64), array(65,66,67),
		array(68,69), array(70), array(71,72), array(73), array(74,75,76));
	for($n=0;$n<count($title);$n++) {
		if(in_array($id,$title[$n])) break;
	}
	switch ($n) {
		case 0 : $col = "#A44"; $str = "東方紅魔郷"; break;
		case 1 : $col = "#88C"; $str = "東方妖々夢"; break;
		case 2 : $col = "#A4A"; $str = "東方永夜抄"; break;
		case 3 : $col = "#E88"; $str = "東方花映塚"; break;
		case 4 : $col = "#4A4"; $str = "東方風神録"; break;
		case 5 : $col = "#C60"; $str = "東方地霊殿"; break;
		case 6 : $col = "#28F"; $str = "東方星蓮船"; break;
		case 7 : $col = "#86F"; $str = "東方萃夢想"; break;
		case 8 : $col = "#C44"; $str = "東方緋想天"; break;
		case 9 : $col = "#888"; $str = "ダブルスポイラー"; break;
		case 11 : $col = "#CA4"; $str = "東方三月精"; break;
		case 12 : $col = "#888"; $str = "秘封倶楽部"; break;
		case 13 : $col = "#888"; $str = "東方求聞史紀"; break;
		case 14 : $col = "#888"; $str = "東方香霖堂"; break;
		case 15 : $col = "#C22"; $str = "東方茨歌仙"; break;
		case 16 : $col = "#888"; $str = "東方儚月抄"; break;
		default : $col = "#888"; $str = ""; break;
	}
	return "<span class='title' style='color:" . $col . ";'>" . $str ."</span>";
}
// キャラの名前を定義
$name = array( "ダミー",
	"ルーミア", "大妖精", "チルノ", "紅 美鈴", "小悪魔", "パチュリー・K", "十六夜 咲夜", "レミリア・S", "フランドール・S", "レティ・W",
	"橙", "アリス・M", "リリーホワイト", "リリカ・P", "メルラン・P", "ルナサ・P", "魂魄 妖夢", "西行寺 幽々子", "八雲 藍", "八雲 紫",
	"リグル・N", "ミスティア・L", "上白沢 慧音", "因幡 てゐ", "鈴仙・U・イナバ", "八意永琳", "蓬莱山 輝夜", "上白沢 慧音", "藤原 妹紅", "リリーブラック",
	"メディスン・M", "射命丸 文", "風見 幽香", "小野塚 小町", "四季 映姫・Y", "秋 静葉", "秋 穣子", "鍵山 雛", "河城 にとり", "犬走 椛",
	"守谷 早苗", "八坂 神奈子", "洩矢 諏訪子", "キスメ", "黒谷 ヤマメ", "水橋 パルスィ", "星熊 勇儀", "古明地 さとり", "火焔猫 燐", "霊烏路 空",
	"古明地 こいし", "ナズーリン", "多々良 小傘", "雲居 一輪", "村紗 水蜜", "寅丸 星", "聖 白蓮", "封獣 ぬえ", "伊吹 萃香", "永江 衣玖",
	"比那名居 天子", "姫海棠 はたて", "博麗 霊夢", "霧雨 魔理沙", "サニーミルク", "ルナチャイルド", "スターサファイア", "宇佐美 蓮子", "マエリベリー・H", "稗田 阿求",
	"森近 霖之助", "名無しの本読み妖怪", "茨木 華扇", "綿月 豊姫", "綿月 依姫", "レイセン2号");
// 画像が存在するキャラ
$imageExist = array(
	1,2,3,4,5,6,7,8,9,10,11,12,14,17,18,19,20,22,23,24,25,26,28,29,31,32,33,34,35,37,38,39,40,
	41,42,43,45,46,47,48,49,50,51,52,54,55,56,57,58,59,61,63,64,66,68,70,71,72,73,74);
// ランキング結果は取り敢えずここに格納
$rank = array(
	// 結果 1つ目
	array( 23,  8, 22, 48, 52, 59, 39, 33, 35, 19, 56, 46, 43, 51, 70, 41, 61, 20,  6,  4,
		   29,  1, 24, 12,  3,  2, 34, 45, 47, 49, 50, 71, 17,  7, 11,  9, 25, 26, 64, 63,
		   38, 40, 32, 18, 37, 42, 36, 31, 27,  5, 10, 14, 57, 58, 66, 65, 55, 44, 53, 54,
		   16, 21, 15, 13, 75, 74, 76, 60, 67, 69, 68 ),
	// 結果 2つ目
	array( 23, 56,  8, 22, 39, 19, 52, 48, 33, 46, 51, 20, 59, 35, 29, 70, 45, 24, 71, 47,
		   68,12,43,10,1,4,6,37,40,41,11,17,26,34,50,61,9,64,66,18,
		   7,3,63,2,49,32,72,69,36,25,38,58,53,57,31,5,55,54,14,16,
		   27,42,21,65,13,60,44,75,74,76,15,67 ),
	array( 56, 23, 22, 66, 45, 73, 58, 39,  8, 19, 46, 52, 48, 51, 43, 49, 55, 68, 72, 70,
		   50,1,31,59,24,35,32,9,33,4,41,6,29,10,12,11,20,25,26,47,
		   61,54,57,62,69,26,65,71,34,7,63,64,40,3,2,14,17,38,21,42,
		   18,16,15,13,74,30,60,5,44,53,67,75,76,36,37 )
);
// ランキングの個数をここで定義
define("RANKDATASIZE", count($rank));
define("CHARADATASIZE", count($rank[RANKDATASIZE-1]));
// ランキングの集計日時はここ
$rankNotes = array( "2009年11月08日", "2010年02月01日", "2011年02月14日" );
// キャラのランク上下によって出力される前回の結果との差分、を関数で定義して出力
function rankChangeText($rank,$i,$j) {
	if ($j!=0) {
		// $iは現在のランク位置、取得した$nは過去のランク位置、$rank[$j][$i]はキャラのID
		for($n=0;$n<count($rank[$j-1]);$n++) {
			if ( $rank[$j-1][$n] == $rank[$j][$i] ) break;
		}
		if ( $n-$i > 0 ) return "<span class='rankChange' style='color:#F44;'>(+" . ($n-$i) . ")</span>";
		if ( $n-$i < 0 ) return "<span class='rankChange' style='color:#44F;'>(" . ($n-$i) . ")</span>";
	} return "<span class='rankChange' style='color:#888;'>(0)</span>";
}
/*ここからテーブル要素*/
echo "<table border='0' cellspacing='0' cellpadding='0'><tbody>\n";
echo "<tr class='tr_head'><td class='td_head'>No.</td>";
for ( $i=0;$i<RANKDATASIZE;$i++ ) {
	echo "<td class='rank_notes' colspan='3'>" . $rankNotes[$i] . "</td>";
}
/* ↑ ヘッダ ↓ 要素 */
for ( $i=0; $i<CHARADATASIZE; $i++ ) {
	echo "<tr><td class='td_head td_head_element'>" . ($i+1) . "</td>";
	for ( $j=0; $j<RANKDATASIZE; $j++ ) {
		if ( $i < count($rank[$j]) ) {
			// 画像を表示、三項演算子で画像がないキャラは 00.png を表示
			echo "<td class='td_image'><img src='img2/" . (in_array($rank[$j][$i],$imageExist)?sprintf("%02d", $rank[$j][$i]):sprintf("00")) . ".png' style='float:left;' width='32px' height='32px'></td>";
			// ランキング上下、キャラクター名、作品名 を表示
			echo "<td class='td_change'>" . rankChangeText($rank,$i,$j) . "</td><td class='td_name'>" . $name[$rank[$j][$i]] . "<br />" . getTitleName($rank[$j][$i]) ."</td>\n";
		} else {
			// キャラが存在しない場合は空要素を挿入
			echo "<td class='td_none'colspan='3'></td>";
		}
	}
	echo "</tr>";
}
echo "</tbody></table>";

ついでにスタイルシートが以下、すごいどうでもいいね!!

table, tr, td, tbody, p, img {
	margin : 0px;
	padding : 0px;
}
table {
	font-size : 0.8em;
	border: 1px solid #DDF;
	border-width: 0px 2px;
}
td {
	border: 1px solid #EEF;
	border-width: 0px 0px 1px 0px;
	padding: 2px;
	vertical-align: middle;
}
tr {
	background-color: #FCFCFF;
}
.td_head {
	width: 1em;
	paddin-right : 0.5em;
}
.td_head_element {
	text-align: right;
}
.td_image {}
.td_change {
	width: 2em;
	text-align: center;
}
.td_name {
	width: 9em;
}
.td_none {}
.rank_notes {
	text-indent: 1em;
}
.tr_head {
	background-color: #DDF;
}
span.rankChange {
	font-size	: 0.8em;
}
span.title {
	font-size: 0.8em;
	font-weight: bold;
	margin-left: 1em;
}