diff options
Diffstat (limited to '')
| -rwxr-xr-x | include/game.h | 17 | ||||
| -rw-r--r-- | kamek_jpn.x | 6 | ||||
| -rw-r--r-- | kamek_pal.x | 6 | ||||
| -rw-r--r-- | src/bonusRoom.cpp | 157 | 
4 files changed, 152 insertions, 34 deletions
diff --git a/include/game.h b/include/game.h index 61042bf..abfb495 100755 --- a/include/game.h +++ b/include/game.h @@ -1589,6 +1589,23 @@ public:  	void CheckCountdownTimer();
  };
 +
 +class StageActorLight {
 +public:
 +
 +	StageActorLight();
 +	void init(void *allocator,int);
 +	void update();
 +	void draw();
 +	~StageActorLight();
 +
 +	Vec pos;
 +	float size;
 +	long secondClass;
 +	long firstClass;
 +};
 +
 +
  class fBase_c {
  public:
  	u32 id;
 diff --git a/kamek_jpn.x b/kamek_jpn.x index 48deb24..955a496 100644 --- a/kamek_jpn.x +++ b/kamek_jpn.x @@ -307,6 +307,12 @@ SECTIONS {  	_Z15fBase_c__DeletePv = 0x80162320;  	fBase_c__Delete__FPv = 0x80162320; +	__vt__15StageActorLight = 0x80317680; +	init__15StageActorLight_FPvi = 0x800CCA00; +	update__15StageActorLight = 0x800CCAC0; +	draw__15StageActorLight = 0x800CCB70; +	__dt__15StageActorLight = 0x800414A0; +  	GetExplanationString__7dBase_cFv = 0x8006C660;  	__vt__15daEnBlockMain_c = 0x80301CC8; diff --git a/kamek_pal.x b/kamek_pal.x index d2fd02f..325c218 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -307,6 +307,12 @@ SECTIONS {  	_Z15fBase_c__DeletePv = 0x80162650;  	fBase_c__Delete__FPv = 0x80162650; +	__vt__15StageActorLight = 0x80317B78; +	init__15StageActorLight_FPvi = 0x800CCB70; +	update__15StageActorLight = 0x800CCC30; +	draw__15StageActorLight = 0x800CCCE0; +	__dt__15StageActorLight = 0x800414A0; +  	GetExplanationString__7dBase_cFv = 0x8006C660;  	__vt__15daEnBlockMain_c = 0x803021A8; diff --git a/src/bonusRoom.cpp b/src/bonusRoom.cpp index 6b61f27..abb81cb 100644 --- a/src/bonusRoom.cpp +++ b/src/bonusRoom.cpp @@ -84,6 +84,107 @@ const char* SAarcNameList [] = {  class dSongBlock; +/*****************************************************************************/ +// The Prize Model + +class dSongPrize: public dStageActor_c { +	int onCreate(); +	int onDelete(); +	int onExecute(); +	int beforeDraw(); +	int onDraw(); + +	mHeapAllocator_c allocator; +	nw4r::g3d::ResFile resFile; +	m3d::mdl_c bodyModel; +	m3d::anmChr_c aw; + +	int queue; + +	HermiteKey keysX[0x10]; +	unsigned int Xkey_count; +	HermiteKey keysY[0x10]; +	unsigned int Ykey_count; +	HermiteKey keysS[0x10]; +	unsigned int Skey_count; + +	USING_STATES(dSongPrize); +	DECLARE_STATE(Wait); + +	static dSongPrize *build(); +}; + +CREATE_STATE(dSongPrize, Wait); + +dSongPrize *dSongPrize::build() { +	void *buffer = AllocFromGameHeap1(sizeof(dSongPrize)); +	return new(buffer) dSongPrize; +} + +int dSongPrize::onCreate() { + +	// Settings +	int i = this->settings & 0xF; +	queue = this->settings >> 16; +	scale = (Vec){ 5.0, 5.0, 5.0 }; + +	int p; +	p = PrizePacks[prize][i]; + +	// Model creation	 +	allocator.link(-1, GameHeaps[0], 0, 0x20); + +	resFile.data = getResource(Prizes[p][0], Prizes[p][1]); +	nw4r::g3d::ResMdl mdl = resFile.GetResMdl(Prizes[p][2]); +	bodyModel.setup(mdl, &allocator, 0x224, 1, 0); +	SetupTextures_Item(&bodyModel, 0); // 800B42B0 + +	// Animation Assignment +	nw4r::g3d::ResAnmChr anmChr = resFile.GetResAnmChr("wait2"); +	aw.setup(mdl, anmChr, &allocator, 0); +	aw.bind(&bodyModel, anmChr, 1); +	bodyModel.bindAnim(&glow, 0.0); +	aw.setUpdateRate(1.0); +	allocator.unlink(); + + +	// Change State +	doStateChange(&dSongPrize::StateID_Wait); + +	return true; +} + +int dSongPrize::onDelete() { return true; } + +int dSongPrize::onExecute() { +	acState.execute(); +	return true; +} + + +int dSongPrize::onDraw() { +	matrix.translation(pos.x, pos.y, pos.z); +	matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); + +	bodyModel.setDrawMatrix(matrix); +	Vec myScale = (Vec){scale.x * 1.0, scale.y * 1.0, scale.z * 1.0}; +	bodyModel.setScale(&myScale); +	bodyModel.calcWorld(false); + +	bodyModel.scheduleForDrawing(); +	return true; +} + +void dSongPrize::beginState_Wait() {} +void dSongPrize::endState_Wait() {} +void dSongPrize::executeState_Wait() { +} + + + +/*****************************************************************************/ +// Sing Along +  class dSingAlong : public dStageActor_c {  	public:  		static dSingAlong *instance; @@ -308,17 +409,6 @@ void dSingAlong::RegisterNote(int note) {  } -// Game Flow -// -// 1) Intro, maybe a banner 'Match the music' -// 2) Present the prize -// 3) Play the music -// 4) Wait for responses -// 6) If failure, make prize disappear, award banked prizes, end stage, play failure music -// 7) If successful, place the prize in the bank, and proceed to step 3 on the next segment -// 8) If all things are successful, play the victory theme and award the banked prizes, end stage - -  /*****************************************************************************/  // Intro  CREATE_STATE(dSingAlong, Intro); @@ -402,30 +492,9 @@ void dSingAlong::executeState_Call() {  	if (timer == Songs[song][chorus][currentNote][1]) {  		OSReport("Playing Note %d", Songs[song][chorus][currentNote][0]); -		// int play = Notes[Songs[song][chorus][currentNote][0]-1]; - -		// if ((currentNote > 1) &&  -		// 	(Notes[Songs[song][chorus][currentNote][0]-1] == Notes[Songs[song][chorus][currentNote-1][0]-1]) && -		// 	(Notes[Songs[song][chorus][currentNote][0]-1] == Notes[Songs[song][chorus][currentNote-2][0]-1]))  -		// { -		// 	SoundPlayingClass::instance3->PlaySoundAtPosition(play, &(Vec2){pos.x,pos.y}, 0); -		// } - -		// else if ((currentNote > 0) && (Notes[Songs[song][chorus][currentNote][0]-1] == Notes[Songs[song][chorus][currentNote-1][0]-1])) { -		// 	SoundPlayingClass::instance2->PlaySoundAtPosition(play, &(Vec2){pos.x,pos.y}, 0); -		// } -		// else { -		// 	SoundPlayingClass::instance1->PlaySoundAtPosition(play, &(Vec2){pos.x,pos.y}, 0); -		// } - -		SoundPlayingClass::instance1->PlaySoundAtPosition(Notes[Songs[song][chorus][currentNote][0]-1], &(Vec2){pos.x,pos.y}, 0); - -		// PlaySoundAsync(this, Notes[Songs[song][chorus][currentNote][0]-1]); - - - +		PlaySoundAsync(this, Notes[Songs[song][chorus][currentNote][0]-1]);  		currentNote += 1; -		// currentNote = song[chorus][counter]; +  		OSReport("Next Note %d", Songs[song][chorus][currentNote][0]);  		if (Songs[song][chorus][currentNote][0] == 0) { @@ -535,6 +604,7 @@ public:  	int onCreate();  	int onDelete();  	int onExecute(); +	int beforeDraw();  	int onDraw();  	mHeapAllocator_c allocator; @@ -543,6 +613,9 @@ public:  	m3d::mdl_c bodyModel;  	m3d::anmChr_c glow; +	StageActorLight light; +	mHeapAllocator_c allocator2; +  	int note;  	void calledWhenUpMoveExecutes(); @@ -585,6 +658,10 @@ int dSongBlock::onCreate() {  	glow.setUpdateRate(1.0);  	allocator.unlink(); + +	// light.init(&allocator2, 2); + +  	// Block Physics  	blockInit(pos.y); @@ -622,6 +699,13 @@ int dSongBlock::onExecute() {  	physics.update();  	blockUpdate(); +	// light.pos.x = pos.x; +	// light.pos.y = pos.y+8.0; +	// light.pos.z = pos.z; + +	// light.size = 226.0; +	// light.update(); +  	// now check zone bounds based on state  	if (acState.getCurrentState()->isEqual(&StateID_Wait)) {  		checkZoneBoundaries(0); @@ -631,6 +715,11 @@ int dSongBlock::onExecute() {  } +int dSongBlock::beforeDraw() { +	// light.draw(); +	return dStageActor_c::beforeDraw(); +} +  int dSongBlock::onDraw() {  	// tile.x = pos.x - 8;  | 
