If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!
This article has a talk page!

Gurumin: A Monstrous Adventure (PlayStation Portable)

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

Gurumin: A Monstrous Adventure

Also known as: Gurumin (JP)
Developer: Nihon Falcom
Publishers: Sega (JP), Mastiff (US), 505 GameStreet (EU)
Platform: PlayStation Portable
Released in JP: June 29, 2006
Released in US: February 12, 2007
Released in EU: March 23, 2007


GraphicsIcon.png This game has unused graphics.
DebugIcon.png This game has debugging material.
RegionIcon.png This game has regional differences.


So very stubbly.
This page is rather stubbly and could use some expansion.
Are you a bad enough dude to rescue this article?
Hmmm...
To do:
A LOT of stuff needs to be covered.
  • Make a pre-release page. Ohirome videos from 2003 and 2004 shows that the game was originally a rhythm-based 3D platformer with different designs for most of the bosses. Parin also had a different voice actor, presumably for placeholder purposes.
  • Investigate the original Japanese version from 2004 for anything unused. Mastiff confirmed that they scrubbed out most of unused content in the Steam release so it can have a smaller data size.
  • Check for unused textures or models. Here's a folder that has tools to allow you to extract basically everything from the files. A steam page by Habanero has a great guide in which file contains what.
  • There's leftovers of what seems to be a MP system.
  • This page should really lose the "(PlayStation Portable)" as it covers all versions, not just one..

Gurumin: A Monstrous Adventure is what happens when you take Drill Dozer, make it an action RPG, and add monster friends, a bopping soundtrack, and an all star voice cast.

This page covers the American PSP version, which would be used as the base for the 3DS port and the localization of the 2004 PC version.

Developers Text

map.txt contains comments from developers with some debug text.

#VERSION 2201
/////////////////////////////////////////////////////////////////////////////////////////////////////
//
//    各種スクリプト、テーブル定義ファイル
//
//   1.記述
//
//    #???????     #End??????ではさまれている間が実データとしてパックされます。
//    パックデータはトークンごとにスペースで区切られていて、項目数が決まっています。
//    そのため、項目数がずれると以後のデータが正しく読み取れないので注意してください。
//
//
//   2.フラグについて
//
//    ゲーム中のフラグは0-3999までです。セットできる値は符号付32bitです。
//  0は使用禁止フラグで、セットして無効になります。参照した場合常にTRUEとなります。 
//    4000以降はつかえないので参照した場合FALSE扱いとなります。
//    0001-0449はマップテンポラリフラグで、マップの切り替え時に0リセットされます。
//    0450-0499はシステムフラグで、ゲームインストール時よりアンインストールするまで保持されます。
//    0500-3999はグローバルフラグでゲーム中は恒久保持されます。シナリオ、宝箱等はここを利用します。
//    各定義のFL1 FL2 .... 等は各フラグが0以外だとTRUEとなります。----はゲーム中でフラグ0と判定され、TRUEになります。
//    宝箱のフラグは同じフラグ使用しますが、中身、個数などがPackedされているため、アクセスは専用関数を利用してください。
//    スクリプトではフラグはint ch[4000]と定義されているので、フラグ値は直接参照が可能です。
//
//    452 ゲームオーバー後ロード時にフラグが立つ(亀救済用)
// ピノ会話
#Script:00061
int main()
{
	ch[400] = 18;
	int i;
	
	// デバッグ
	KaguTest(20010,0);
	
	if (ch[420] == 207)
	{
		// デバッグピノ
		Message(18,"Debug Mode.","Boss Rush is Under Construction.","","");
// DEBUG
#Script:00052
int main()
{
	if (ch[49]) return 0;
	ch[49] = 1;

	SelStart(50);
	SelText("Skill",12);
	SelText("Return to Title Screen",13);
//	SelText("シナリオフラグオン",1);
//	SelText("フラグオフ",2);
	SelText("Movies",5);
//	SelText("全ステージクリア",14);
//	SelText("ワープ",3);
//	SelText("レベル",6);
	SelText("Reset Mystery Bags",15);
	SelText("Difficulty",7);
	SelText("House test",8);
	SelText("Other",4);
//	SelText("ボステスト",14);
//	SelText("ドリルパワーマックス",9);
//	SelText("ドリルオンオフ",10);
//	SelText("どこでもセーブ",11);
	SelText("Exit",0);
	SelEnd();

	if (ch[50] == 15)
	{
		ch[2367] = 0;
		KaguTest(20010,0);
		LoadMap(ch[420]);
		return 0;
	}
	if (ch[50] == 14)
	{
		int i;
		for(i = 2260;i < 2286;i++)
		{
			ch[i] = 1;
		}
		ch[2111] = 1;
		ch[2113] = 1;
		ch[2128] = 1;
//		ch[2149] = 1;
		ch[2189] = 1;
		ch[49] = 0;
		return 0;
	}

	if (ch[50] == 13)
	{
		KaguTest(60000,0);
		return 0;
	}

	if (ch[50] == 14)
	{
		// ボステスト
		KaguTest(20010,0);
		if (ch[420] == 999)
		{
			Mes("You can't go to the boss test from the mini-map.");
			retunr 0;
		}
		
		SelStart(50);
//		SelText("ボスラッシュ",6);
//		SelText("ボスラッシュ終わり",7);
		SelText("Boss Sap",1);
		SelText("Mosby",2);
		SelText("Roger",3);
		SelText("Fake Parin",4);
		SelText("Tokaron",5);
		SelEnd();
		
		if (ch[50] == 1)
		{
			LoadMap(105);

			SetSavePos2(109,0,0,0);
			ch[1095] = 109;

			KaguTest(20020,0);
			CharPos(28,-200000,0,0);
			CharPos(ch[425],0,0,0);
			CharPos(ch[425] + 1,0,0,0);
			CharPos(0,0,-500,0);
			
			Black(0,0,30);
			Wait(30);
		}
		if (ch[50] == 2)
		{
			ch[1542] = 1;
			LoadMap(506);

//			SetSavePos2(109,0,0,0);
//			ch[1095] = 109;

//			KaguTest(20020,0);
//			CharPos(40,-200000,0,0);
//			CharPos(ch[425],0,0,300);
//			CharPos(0,0,-1600,0);
			CharPos(0,4525,6025,0);
			
			Black(0,0,30);
			Wait(30);
		}
		if (ch[50] == 3)
		{
//			ch[1505] = 1;
			LoadMap(210);
		
			KaguTest(20020,0);
			CharPos(0,0,0,0);
//			CharPos(ch[425],-1000,277,-782);
//			CharPos(ch[425]+1,-1000,277,-782);
			KaguTest(30028,ch[425]);
//			KaguTest(30028,ch[425]+1);

			Black(0,0,30);
			Wait(30);
		}
		if (ch[50] == 4)
		{
			ch[1505] = 1;
			LoadMap(606);
		
			KaguTest(20020,0);
			CharPos(0,0,2000,1050);
			CharPos(ch[425],0,2300,1050);
			KaguTest(30028,ch[425]);

			Black(0,0,30);
			Wait(30);
		}
		if (ch[50] == 5)
		{
			LoadMap(306);
		
			CharPos(0,2000,450,1500);

			Black(0,0,30);
			Wait(30);
		}
		if (ch[50] == 6)
		{
			// ボスラッシュモード
			ch[2300] = 1;
//			ch[1791] = 100;
			KaguTest(20051,0);

			ch[1780] = 1;
			ch[1781] = 1;
			ch[1784] = 1;
			
//			GetItem(1);
//			GetItem(2);
//			GetItem(9);
			
			GetItem(3);
//			Soubi(3);
			Kaifuku();

			KaguTest(70000,0);
			LoadMap(109);
			CharPos(0,0,900,0);
			ch[3982] = 1;
			KaguTest(70000,0);
			MapEvent(1);
		}
		ch[49]=0;
		return 0;
	}

	if (ch[50] == 12)
	{
		SelStart(50);
		SelText("All On",10);
		SelText("Standing Combo F",1);
		SelText("Walking Combo F",2);
		SelText("Sieze Combo F",3);
		SelText("JL Combo F",4);
		SelText("Revolving Moon",5);
		SelText("Earth Revolver",6);
		SelText("Earth Revolver Combo",7);
		SelText("Earth Revolver Combo F",8);
		SelText("Dash Rotate",9);
		SelText("Limit Bust",11);
		SelEnd();

		if (ch[50] == 1)ch[1780]=!ch[1780];
		if (ch[50] == 2)ch[1781]=!ch[1781];
		if (ch[50] == 3)ch[1782]=!ch[1782];
		if (ch[50] == 4)ch[1783]=!ch[1783];
		if (ch[50] == 5)ch[1784]=!ch[1784];
		if (ch[50] == 6)ch[1785]=!ch[1785];
		if (ch[50] == 7)ch[1786]=!ch[1786];
		if (ch[50] == 8)ch[1787]=!ch[1787];
		if (ch[50] == 9)ch[1788]=!ch[1788];
		if (ch[50] == 11)ch[1789]=!ch[1789];
		
		if (ch[50] == 10)
		{
			ch[1780]=1;
			ch[1781]=1;
			ch[1782]=1;
			ch[1783]=1;
			ch[1784]=1;
			ch[1785]=1;
			ch[1786]=1;
			ch[1787]=1;
			ch[1788]=1;
			ch[1789]=1;
		}

		// 本チェック
		int i;
		for (i = 0;i < 10;i++)
		{
			ch[2130 + i] = 0;
		
			if (ch[1780 + i])
			{
				ch[2130 + i] = 0;
			}
		}
	
		ch[49]=0;
		return 0;
	}
	if (ch[50] == 1)
	{
		SelStart(50);
		SelText("OP",4);
		SelText("Guide Map",1);
		SelText("Motoro's Lead",8);
		SelText("Warp 1 ON",2);
		SelText("Boss Fight DONE 1",6);
		SelText("Boss Attack 1",3);
		SelText("Broken Event",5);
		SelText("Palette 1 Felt",14);
		SelText("Doug Discovered",17);
		SelText("Doug Destruction",12);
		SelText("Everyone's Cheer 1",18);
		SelText("Warp 2 ON",11);
		SelText("Boss Fight DONE 2",19);
		SelText("Boss Attack 2",20);
		SelText("Fake Parin's Birth",21);
		SelText("Village Revival",7);
		SelText("The Monster's Talk",28);
		SelText("Palette 2 Felt",15);
		SelText("Doug Failure",16);
		SelText("Digby Discovery",22);
		SelText("Mole Brothers Destruction",13);
		SelText("Everyone's Cheer 2",23);
		SelText("Fake Parin Fight Done",24);
		SelText("Fake Parin Attack",25);
		SelText("Tokaron Fight Done",26);
		SelEnd();

		if(ch[50]==1)ch[510]=1;
		if(ch[50]==2)ch[511]=1;
		if(ch[50]==3)ch[507]=1;
		if(ch[50]==4)ch[508]=1;
		if(ch[50]==5)ch[512]=1;
		if(ch[50]==6)ch[509]=1;
		if(ch[50]==7)ch[528]=1;
		if(ch[50]==8)ch[600]=1;
		if(ch[50]==12)ch[1502]=1;
		if(ch[50]==13)ch[1510]=1;
		if(ch[50]==14)ch[1500]=1;
		if(ch[50]==15)ch[1507]=1;
		if(ch[50]==16)ch[1508]=1;
		if(ch[50]==17)ch[1501]=1;
		if(ch[50]==18)ch[1503]=1;
		if(ch[50]==19)ch[1504]=1;
		if(ch[50]==20)
		{
			ch[1505]=1;
			if(!ch[1506])ch[1515]=1;
			ch[528]=1;
		}
		if(ch[50]==21)
		{
			ch[1506]=1;
			ch[1515]=0;
		}
		if(ch[50]==22)ch[1509]=1;
		if(ch[50]==23)ch[1511]=1;
		if(ch[50]==24)ch[1512]=1;
		if(ch[50]==25)ch[1513]=1;
		if(ch[50]==26)ch[1514]=1;
		if(ch[50]==28)ch[1516]=1;

		ch[49]=0;
		PostScr(52);
		return 0;
	}
	if (ch[50]==2)
	{
		SelStart(50);
		SelText("OP",4);
		SelText("Guide Map",1);
		SelText("Motoro's Lead",8);
		SelText("Warp 1 ON",2);
		SelText("Boss Fight DONE 1",6);
		SelText("Boss Attack 1",3);
		SelText("Broken Event",31);
		SelText("Palette 1 Felt",14);
		SelText("Doug Discovered",17);
		SelText("Doug Destruction",12);
		SelText("Everyone's Cheer 1",18);
		SelText("Warp 2 ON",11);
		SelText("Boss Fight DONE 2",19);
		SelText("Boss Attack 2",20);
		SelText("Fake Parin's Birth",21);
		SelText("Village Revival",29);
		SelText("The Monster's Talk",28);
		SelText("Palette 2 Felt",15);
		SelText("Doug Failure",16);
		SelText("Digby Discovery",22);
		SelText("Mole Brothers Destruction",13);
		SelText("Everyone's Cheer 2",23);
		SelText("Fake Parin Fight Done",24);
		SelText("Fake Parin Attack",25);
		SelText("Tokaron Fight Done",26);
		SelText("Brother taught |Promine|",30);
		SelText("Brother awarded |Headdress|",29);
		SelText("Brother taught |Meteo|",37);
		SelText("Poco taught |Heal|",31);
		SelText("Poco taught |Reviver|",32);
		SelText("Poco taught |Thunder|",33);
		SelText("Poco taught |Barrier|",34);
		SelText("Chucky taught |Ice|",35);
		SelText("All Motoro Skills Reset",36);
		SelText("All Flag Reset",27);
		SelEnd();
	
		if(ch[50]==1)ch[510]=0;
		if(ch[50]==2)ch[511]=0;
		if(ch[50]==3)ch[507]=0;
		if(ch[50]==4)ch[508]=0;
		if(ch[50]==31)ch[512]=0;
		if(ch[50]==6)ch[509]=0;
		if(ch[50]==29)ch[528]=0;
		if(ch[50]==8)ch[600]=0;
		if(ch[50]==12)ch[1502]=0;
		if(ch[50]==13)ch[1510]=0;
		if(ch[50]==14)ch[1500]=0;
		if(ch[50]==15)ch[1507]=0;
		if(ch[50]==16)ch[1508]=0;
		if(ch[50]==17)ch[1501]=0;
		if(ch[50]==18)ch[1503]=0;
		if(ch[50]==19)ch[1504]=0;
		if(ch[50]==20)
		{
			ch[1505]=0;
			if(!ch[1506])ch[1515]=0;
			ch[528]=0;
		}
		if(ch[50]==21)
		{
			ch[1506]=0;
			ch[1515]=1;
		}
		if(ch[50]==22)ch[1509]=0;
		if(ch[50]==23)ch[1511]=0;
		if(ch[50]==24)ch[1512]=0;
		if(ch[50]==25)ch[1513]=0;
		if(ch[50]==26)ch[1514]=0;
		if(ch[50]==28)ch[1516]=0;
		if(ch[50]==27)
		{
			ch[1509]=0;
			ch[1511]=0;
			ch[1512]=0;
			ch[1513]=0;
			ch[1514]=0;
			ch[1516]=0;
			ch[528]=0;
			ch[1515]=0;
			ch[1505]=0;
			ch[1502]=0;
			ch[1510]=0;
			ch[1500]=0;
			ch[1507]=0;
			ch[1508]=0;
			ch[1501]=0;
			ch[1503]=0;
			ch[1504]=0;
			ch[600]=0;
			ch[528]=0;
			ch[510]=0;
			ch[511]=0;
			ch[507]=0;
			ch[508]=0;
			ch[512]=0;
			ch[509]=0;
			ch[1519]=0;
			ch[1520]=0;
			ch[1521]=0;
			ch[3999]=0;
			ch[1522]=0;
			ch[1523]=0;
			ch[1524]=0;
			ch[1525]=0;
			ch[1526]=0;
			ch[1527]=0;
			ch[1528]=0;
			ch[1529]=0;
			ch[1530]=0;
			ch[1531]=0;
			ch[1532]=0;
			ch[1533]=0;
			ch[1534]=0;
		}
		if(ch[50]==30)ch[1522]=0;
		if(ch[50]==29)ch[1523]=0;
		if(ch[50]==31)ch[1524]=0;
		if(ch[50]==32)ch[1525]=0;
		if(ch[50]==33)ch[1526]=0;
		if(ch[50]==34)ch[1527]=0;
		if(ch[50]==35)ch[1528]=0;
		if(ch[50]==36)
		{
			ch[1529]=0;
			ch[1530]=0;
			ch[1531]=0;
			ch[1532]=0;
			ch[1533]=0;
			ch[1534]=0;
		}
		if(ch[50]==37)ch[1535]=0;

		ch[49]=0;
		PostScr(52);
		return 0;
	}
	if (ch[50]==3)
	{
		// ワープメニュー
		SelStart(50);
		SelText("1-1",1);
		SelText("1-2",2);
		SelText("1-3",3);
		SelText("1-4",4);
		SelText("1-5",5);
		SelText("2-1",6);
		SelText("2-2",7);
		SelText("2-3",8);
		SelText("2-4",9);
		SelText("2-5",10);
		SelText("2-6",11);
		SelText("3-1",12);
		SelText("3-2",13);
		SelText("3-3",14);
		SelText("3-4",15);
		SelText("3-5",16);
		SelText("3-6",17);
		SelText("3-7",19);
		SelText("3-8",20);
		SelText("4-1",18);
		SelText("012",21);
		
		SelEnd();
		
		if(ch[50]==1) LoadMap(101);
		if(ch[50]==2) LoadMap(102);
		if(ch[50]==3) LoadMap(103);
		if(ch[50]==4) LoadMap(104);
		if(ch[50]==5) LoadMap(105);
		if(ch[50]==6) LoadMap(201);
		if(ch[50]==7) LoadMap(202);
		if(ch[50]==8) LoadMap(203);
		if(ch[50]==9) LoadMap(204);
		if(ch[50]==10) LoadMap(205);
		if(ch[50]==11) LoadMap(206);
		if(ch[50]==12) LoadMap(301);
		if(ch[50]==13) LoadMap(302);
		if(ch[50]==14) LoadMap(303);
		if(ch[50]==15) LoadMap(304);
		if(ch[50]==16) LoadMap(305);
		if(ch[50]==17) LoadMap(306);
		if(ch[50]==18) LoadMap(401);
		if(ch[50]==19) LoadMap(307);
		if(ch[50]==20) LoadMap(308);
		if(ch[50]==21) LoadMap(012);

		if(ch[50]==30)
		{
			ch[3999] = 1;
			LoadMap(111);
		}
		if(ch[50]==31)
		{
			ch[3999] = 0;
			LoadMap(111);
		}

		ch[49]=0;
		return 0;
	}
	if (ch[50]==4)
	{
		// その他メニュー
		SelStart(50);
//		SelText("ワープ",7);
//		SelText("フラグオフ",6);
		SelText("Gathering of Friends F Set",37);
		SelText("Debug Flag On",8);
		SelText("Debug Flag Off",4);
//		SelText("土全消去",5);

Unused Music

There are three unused background music tracks.
"BGM16"

"BGM19"

"BGM37"

Regional Differences

Hmmm...
To do:
Get screenshots. Texture is present in the Windows port at a higher resolution of 256x256, could probably restore it in that version by overwriting the censored texture.

In the Japanese version, Parin's panties can be seen in some shots and also when using a Healing Station. This was cut in the American version to keep the game at an E10+ rating. The uncensored texture is still present in the North American version as char02bz.itp.

Parin's Texture
Censored Original
Char02b2.png Char02bz.png

Version Differences

The Windows version of the game features a bar at the top of the HUD with a musical note bouncing to the beat of the background music. When enemies are hit to the beat, you'll deal a critical hit. The PSP and 3DS versions of the game do not visually have this bar due to the lower screen resolution, but crits can still be dealt to enemies if hit to the beat.

20231206162625 1.jpg

Oddity

Elementary, my dear Cactus.
This needs some investigation.
Discuss ideas and findings on the talk page.

The background of the logo animation at the beginning of the game is rendered offscreen at all times, along with what appears to be a heavily garbled Falcom logo. It's unclear as to why this is stored in memory during gameplay.

Falcom-Logo-Render.png