いろきゅう.jp // Programmable maiden traumend 〜夢見るPG〜 このページをアンテナに追加 RSSフィード

  • Office アシスタント 薔薇乙女日々繰り返される Office での作業中、薔薇乙女がマスター(あなた)を様々な面で支えてくれます。多分。
  • ぷよぷよクエスト - 目的のレベルまで経験値いくつ必要なんよcalculator「Lv70まで素材あと何枚必要なんじゃいボケぇ!」 と、夜な夜な素材狩り貴方にオススメ! 自分にもオススメ! 月ドロップはよ

2009-06-12

YJローゼン第14話を見てソフト屋のおいらが思ったこと

BIG-JUMくんが DoS を食らった。 案の定落ちた*1




だから貧弱なサーバーに突然大量のリクエストを送るなとあれほど(ry

薔薇乙女達は田代砲化する。ちぃおぼえた。



  • BIG-JUMは死んで良いよ(嫉妬しながら
  • きら子さんやっぱいいなぁ……

今回もソース書いてみたんだけれども

規模がでかすぎで超面白く無ぇ orz

興味本位でコード化してみたんですけれども、今回関係してくるドールが多かったのでコード量が増えてしまうわ、プロセス間通信が発生してしまって流れが複雑になるわ……と散々でした。 打ってて辛かったです。(ならやるなよ

でも、折角なので載せておきます。更新量が稼げるしね!

↓↓↓↓↓↓以下ネタバレ↓↓↓↓↓↓



















CM:ロロナのアトリエ はいい…心が洗われる…



































勢いだけで書いた。コンパイルは通らない。今は(いろんな意味で)反省している。

// big-jum.exe
const UINT RM_REQUEST_RECV_CONTRACT = 0x00169023;
const UINT RM_REQUEST_CONTRACT      = 0x02020202;

struct RMRING
{
	......
};


// 第14話 entry point
void tail14()
{
	RMSOCKET hShink = GetRMSocket(_T("doll://rozen-maiden/shinku"));
	RMRING   sRing  = {0};

	// ↓実は API HOOK されていた!
	::send(hShink, &RM_REQUEST_RECV_CONTRACT, sizeof(RM_REQUEST_RECV_CONTRACT), 0);
	// コード的にはひどすぎるけどめんどいからコレでいいや…
	if(::recv(hShink, &sRing, sizeof(RMRING), 0) == sizezof(RMRING))
	{
		if(ImplementMaterial(my, &sRing) != 0)
			throw new StoryException(_T("お話が進みませんでした"));	
	}
}


// メッセージポンプとか関係なしに、バンバン呼ばれちゃう仕様
// そしてマルチスレッド未考慮
RMAPI LRESULT JumProc(RMHUMAN hBigJum, UINT msg, WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_CONTRACT:
		{
			RMING* psRing = (RMRING*)wp;
			GlobalFuncfion(psRing);
		}
		break;
	case RM_REQUEST_ENERGIE:
		{
			// ignore...
		}
		break;
	}
}

// 排他ロックしていなくて死亡...
void GlobalFunction(RMRING* psRing)
{
	g_hogehoge = psRing->hogehoeg;
	g_...
	g_...
}

// BigJumHook.dll

// Hook send() function ...
//  ま た お ま え か !
int sendKirakisyoHooker(RMSOCKET socket, const BYTE* buff, int len, int flg)
{
	if((static_cast<int*>buff) == RM_REQUEST_RECV_CONTRACT)
	{
		// 全体に告知
		::PostMessage(RMM_BROADCAST, RM_CONTRACT, HUMAN_BIG_JUM, 0);
	}

	return (*fnOrgSend)(sockete, buff, len, flg);
}

// suiseiseki.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_CONTRACT. &myRing, 0);
		}
	}

	return 0;
}


// kirakisyo.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_CONTRACT. &myRing, 0);
		}
	}

	return 0;
}

// shink_replica.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_CONTRACT. &myRing, 0);
		}
	}

	return 0;
}

// 別スレッド
int Communicator(RMSOCKET hSocketBigJum)
{
	const size_t SIZE = 1024;
	BYTE  buff[SIZE]  = {0};
	int   read;
	while(true)
	{
		read = recv(hSocketBigJum, buff, SIZE, 0);
		if(read < 0)
			break;

		switch(MsgAnalyzer(buff))
		{
		case RM_REQUEST_RECV_CONTRACT:
			{
				if(IsValidMyStatus())
					send(hSocketBigJum, &myRing, sizeof(myRing), 0);
				else
					send(hSocketBigJum, REJECT, 1, 0);
			}
		}
	}
}
// suigintou.exe

RMAPI LRESULT RMProc(HDOLL hDoll, UINT msg WPARAM wp, LPARAM lp)
{
	switch(msg)
	{
	case RM_REQUEST_RECV_CONTRACT:
		{
			::PostMessage(hBigJum, RM_REQUEST_ENERGIE. &myRing, 0);
		}
	}

	return 0;
}

きら子さんのHOOKっぷり(発音:乗っ取りっぷり)は異常。

*1:正確にはパフォーマンスの大幅低下

2009-02-26

YJローゼンメイデン Tale10 を語る - ネタバレ注意!超危険!

// 10話の概要
CKirakisyo kirako = new CKirakisyo();





……








……いやほら、


紅「え、何で実体化してるん?今まで概念だけしか無かったじゃん?」

俺解釈

今まではデータ型の定義だけだったけど、今まさにインスタンスが生成されたってことだよね!

// データ型の定義
public class CKirakisyo
{
  public CKirakisyo() {

  }

  /**
   *  Rozen Maiden シリーズに DeapAttach インターフェースが実装されていることは
   *  きらきーぐらいしか知らない(今のところ)
   */
  pubilc void attachTo(IRozenMaidenBody body) {
    if(body instanceof IRozenMaidenDeapAttach)
    {
      IRozenMaidenDeapAttach attach = (IRozenMaidenDeapAttach)body;
      attach->deapAttach(this); // 根本まで乗っ取る
    }
  }
};


/**
 *
 */
void YJ_Rozen::Tale10()
{
  IRozenMaidenBody bodySomeone; // どうにかする

  CKirakisyo kirako = new CKirakisyo();
  kirako->attachTo(bodySomeone);
}

俺 に よ し !




とりあえず、悪役が出てくるとやっぱ面白いわ。うん。一気にお話が濃くなった気がする。続きが非常に気になって仕方ないです。1ヶ月後はまだかしらー

…ってのは良いんですが、色々困った面も出てきたってのも事実だったりしまして…うーん。なんでこう要素をかぶらせてくるかなぁ(苦笑




あぁあと、Java なのか C++ なのかはっきりしろ俺。