diff options
Diffstat (limited to '')
| -rwxr-xr-x | include/game.h | 13 | ||||
| -rw-r--r-- | singAlong.yaml | 10 | ||||
| -rw-r--r-- | src/bonusRoom.cpp | 288 | 
3 files changed, 118 insertions, 193 deletions
diff --git a/include/game.h b/include/game.h index abfb495..468f4e3 100755 --- a/include/game.h +++ b/include/game.h @@ -1594,15 +1594,16 @@ class StageActorLight {  public:
  	StageActorLight();
 -	void init(void *allocator,int);
 -	void update();
 -	void draw();
 -	~StageActorLight();
 +	
 +	virtual void init(void *allocator, int);
 +	virtual void update();
 +	virtual void draw();
 +	virtual ~StageActorLight();
  	Vec pos;
  	float size;
 -	long secondClass;
 -	long firstClass;
 +	u32 secondClass;
 +	u32 firstClass;
  };
 diff --git a/singAlong.yaml b/singAlong.yaml index 7c9ba66..0641aa4 100644 --- a/singAlong.yaml +++ b/singAlong.yaml @@ -1,6 +1,7 @@  ---  # SingAlong = WM_KILLERBULLET (0x276)  # SongBlock = WM_KILLER       (0x275) +# SongPrize = WM_SINKSHIP     (0x277)  source_files: [../src/bonusRoom.cpp] @@ -37,3 +38,12 @@ hooks:      type: add_func_pointer      src_addr_pal: 0x809834F0      target_func: 'dSongBlock::build(void)' + + +  ################################################ +  # HOOKS FOR Song Prize +  ################################################ +  - name: SongPrizeBuild +    type: add_func_pointer +    src_addr_pal: 0x80985434 +    target_func: 'dSongPrize::build(void)' diff --git a/src/bonusRoom.cpp b/src/bonusRoom.cpp index abb81cb..1188528 100644 --- a/src/bonusRoom.cpp +++ b/src/bonusRoom.cpp @@ -14,7 +14,7 @@ int Songs[2][4][15][2] = {  	{ // Song 1 -  		{{3,0},{3,15},{3,45},{1,75},{3,90},{5,120},{0,0}}, // First number is the note, Second is timing: 30 is one quarter note at 120 bpm, 0,0 ends the sequence -		{{8,0},{5,22},{3,45},{6,67},{7,82},{6,97},{6,105},{0,0}}, +		{{1,0},{5,22},{3,45},{6,67},{7,82},{6,97},{6,105},{0,0}},  		{{1,0},{1,7},{1,22},{1,37},{2,45},{3,60},{1,67},{7,82},{6,90},{0,0}},  		{{1,0},{1,7},{1,22},{1,37},{2,45},{3,52},{0,0}}  	}, @@ -28,7 +28,6 @@ int Songs[2][4][15][2] = {  }; -  const char* Prizes[10][4] = {   	{ "I_kinoko", 		"g3d/I_kinoko.brres", 			"I_kinoko", 			"wait2" },  	{ "I_fireflower", 	"g3d/I_fireflower.brres", 		"I_fireflower", 		"wait2" }, @@ -87,7 +86,8 @@ class dSongBlock;  /*****************************************************************************/  // The Prize Model -class dSongPrize: public dStageActor_c { +class dSongPrize: public dEn_c { +public:  	int onCreate();  	int onDelete();  	int onExecute(); @@ -100,6 +100,7 @@ class dSongPrize: public dStageActor_c {  	m3d::anmChr_c aw;  	int queue; +	int timer;  	HermiteKey keysX[0x10];  	unsigned int Xkey_count; @@ -110,11 +111,13 @@ class dSongPrize: public dStageActor_c {  	USING_STATES(dSongPrize);  	DECLARE_STATE(Wait); +	DECLARE_STATE(Shrink);  	static dSongPrize *build();  };  CREATE_STATE(dSongPrize, Wait); +CREATE_STATE(dSongPrize, Shrink);  dSongPrize *dSongPrize::build() {  	void *buffer = AllocFromGameHeap1(sizeof(dSongPrize)); @@ -124,12 +127,12 @@ dSongPrize *dSongPrize::build() {  int dSongPrize::onCreate() {  	// Settings -	int i = this->settings & 0xF; -	queue = this->settings >> 16; -	scale = (Vec){ 5.0, 5.0, 5.0 }; +	queue = this->settings & 0xF; +	int prize = this->settings >> 16; +	scale = (Vec){ 3.0, 3.0, 3.0 };  	int p; -	p = PrizePacks[prize][i]; +	p = PrizePacks[prize][queue];  	// Model creation	  	allocator.link(-1, GameHeaps[0], 0, 0x20); @@ -143,7 +146,7 @@ int dSongPrize::onCreate() {  	nw4r::g3d::ResAnmChr anmChr = resFile.GetResAnmChr("wait2");  	aw.setup(mdl, anmChr, &allocator, 0);  	aw.bind(&bodyModel, anmChr, 1); -	bodyModel.bindAnim(&glow, 0.0); +	bodyModel.bindAnim(&aw, 0.0);  	aw.setUpdateRate(1.0);  	allocator.unlink(); @@ -161,23 +164,55 @@ int dSongPrize::onExecute() {  	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.setScale(&scale);  	bodyModel.calcWorld(false);  	bodyModel.scheduleForDrawing(); +	bodyModel._vf1C(); + +	if(this->aw.isAnimationDone()) +		this->aw.setCurrentFrame(0.0); +  	return true;  }  void dSongPrize::beginState_Wait() {}  void dSongPrize::endState_Wait() {} -void dSongPrize::executeState_Wait() { +void dSongPrize::executeState_Wait() {} + +void dSongPrize::beginState_Shrink() { +	this->timer = 0; + +	Xkey_count = 2; +	Ykey_count = 2; +	Skey_count = 2; + +	// /* keysX[i] = { frame, value, slope }; */ +	keysX[0] = (HermiteKey){ 0.0, pos.x, 0.8 }; +	keysY[0] = (HermiteKey){ 0.0, pos.y, 0.8 }; +	keysS[0] = (HermiteKey){ 0.0, 3.0, 0.8 }; + +	keysX[1] = (HermiteKey){ 60.0, pos.x + (30.0 * queue) - 172.0, 1.0 }; +	keysY[1] = (HermiteKey){ 60.0, pos.y + 64.0, 1.0 }; +	keysS[1] = (HermiteKey){ 60.0, 1.0, 1.0 };	 +} +void dSongPrize::endState_Shrink() {} +void dSongPrize::executeState_Shrink() { +	float modX = GetHermiteCurveValue(timer, keysX, Xkey_count); +	float modY = GetHermiteCurveValue(timer, keysY, Ykey_count); +	float modS = GetHermiteCurveValue(timer, keysS, Skey_count); + +	pos = (Vec){ modX, modY, pos.z }; +	scale = (Vec){ modS, modS, modS }; + +	if (timer == 60) { doStateChange(&StateID_Wait); } + +	timer += 1;  } @@ -204,36 +239,21 @@ class dSingAlong : public dStageActor_c {  		dSingAlong() : state(this, &StateID_Intro) { }  		mHeapAllocator_c allocator; -		nw4r::g3d::ResFile resFile[4]; -		m3d::mdl_c pModel[4]; -		m3d::anmChr_c pAnim[4]; -		Vec prizePos[4]; -		Vec prizeScale[4]; - -		HermiteKey keysX[0x10]; -		unsigned int Xkey_count; -		HermiteKey keysY[0x10]; -		unsigned int Ykey_count; -		HermiteKey keysS[0x10]; -		unsigned int Skey_count; - - -		dSongBlock *Cblock; -		dSongBlock *Dblock; -		dSongBlock *Eblock; -		dSongBlock *Fblock; -		dSongBlock *Gblock; -		dSongBlock *Ablock; -		dSongBlock *Bblock; - - -		// you might get casting issues. due to C++. blah = (int (*)[15][2])BigArray; fixes it -		// int (*song)[4][15][2]; -		// int (*prizes)[4]; + +		dSongPrize *PrizeModel; +		// dSongBlock *SongBlocks[7]; + +		dSongBlock *SBa; +		dSongBlock *SBb; +		dSongBlock *SBc; +		dSongBlock *SBd; +		dSongBlock *SBe; +		dSongBlock *SBf; +		dSongBlock *SBg; +  		int song;  		int prize;   		int chorus; -		// int (*currentNote)[2];  		int currentNote;  		int endNote;  		int timer; @@ -270,12 +290,9 @@ int dSingAlong::onCreate() {  	OSReport("Creating the Sing Along gang.");  	// Load in the settings -	// this->song = Songs;  	this->song = this->settings & 0xF; -	// this->prizes = PrizePacks;  	this->prize = (this->settings >> 4) & 0xF;  	this->chorus = -1; -	// this->currentNote = song[chorus][0];  	this->currentNote = 0;  	this->Powerups[0] = 0; // Mushroom @@ -289,61 +306,27 @@ int dSingAlong::onCreate() {  	this->Powerups[8] = 0; // 1-ups  	this->Powerups[9] = 0; // Coins -	// Load in the prize models -	allocator.link(-1, GameHeaps[0], 0, 0x20); - -	int p; -	nw4r::g3d::ResMdl mdl; -	nw4r::g3d::ResAnmChr anmChr; - -	for (int i = 0; i < 4; i++) {  -		p = PrizePacks[prize][i]; - -		// nw4r::g3d::ResFile file; -		// resFile[i] = file; -		// m3d::mdl_c model; -		// pModel[i] = model; -		// m3d::anmChr_c anim; -		// pAnim[i] = anim; - -		OSReport("Model %d: %s, %s, %s", i, Prizes[p][0], Prizes[p][1], Prizes[p][2]); -		resFile[i].data = getResource(Prizes[p][0], Prizes[p][1]); -		mdl = resFile[i].GetResMdl(Prizes[p][2]); -		pModel[i].setup(mdl, &allocator, 0x224, 1, 0); -		SetupTextures_Item(&pModel[i], 0); // 800B43D0 - -		anmChr = resFile[i].GetResAnmChr("wait2"); -		pAnim[i].setup(mdl, anmChr, &allocator, 0); -		// pAnim[i].bind(&pModel[i], anmChr, 1); -		// pModel[i].bindAnim(&pAnim[i], 0.0); -		pAnim[i].setUpdateRate(1.0); - -		prizePos[i] = (Vec){ pos.x, pos.y, pos.z }; -		prizeScale[i] = (Vec){ 5.0, 5.0, 5.0 }; -	} - -	allocator.unlink(); -  	// Create and prepare the blocks +	S16Vec rot = (S16Vec){0,0,0};  	float x = pos.x;  	float y = pos.y - 40.0;  	float z = pos.z; -	S16Vec rot = (S16Vec){0,0,0}; -	Cblock = (dSongBlock*)create(WM_KILLER, 1, &(Vec){x-96.0, y, z}, &rot, 0); -	Dblock = (dSongBlock*)create(WM_KILLER, 2, &(Vec){x-64.0, y, z}, &rot, 0); -	Eblock = (dSongBlock*)create(WM_KILLER, 3, &(Vec){x-32.0, y, z}, &rot, 0); -	Fblock = (dSongBlock*)create(WM_KILLER, 4, &(Vec){x     , y, z}, &rot, 0); -	Gblock = (dSongBlock*)create(WM_KILLER, 5, &(Vec){x+32.0, y, z}, &rot, 0); -	Ablock = (dSongBlock*)create(WM_KILLER, 6, &(Vec){x+64.0, y, z}, &rot, 0); -	Bblock = (dSongBlock*)create(WM_KILLER, 7, &(Vec){x+96.0, y, z}, &rot, 0); +	// for (int i = 0; i < 7; i++) {  +	// 	SongBlocks[i] = (dSongBlock*)create(WM_KILLER, i+1, &(Vec){x-96.0+(32.0*i), y, z}, &rot, 0); +	// } + +	SBa = (dSongBlock*)create(WM_KILLER, 1, &(Vec){x-96.0+(32.0*0), y, z}, &rot, 0); +	SBb = (dSongBlock*)create(WM_KILLER, 2, &(Vec){x-96.0+(32.0*1), y, z}, &rot, 0); +	SBc = (dSongBlock*)create(WM_KILLER, 3, &(Vec){x-96.0+(32.0*2), y, z}, &rot, 0); +	SBd = (dSongBlock*)create(WM_KILLER, 4, &(Vec){x-96.0+(32.0*3), y, z}, &rot, 0); +	SBe = (dSongBlock*)create(WM_KILLER, 5, &(Vec){x-96.0+(32.0*4), y, z}, &rot, 0); +	SBf = (dSongBlock*)create(WM_KILLER, 6, &(Vec){x-96.0+(32.0*5), y, z}, &rot, 0); +	SBg = (dSongBlock*)create(WM_KILLER, 7, &(Vec){x-96.0+(32.0*6), y, z}, &rot, 0);  	// // Trigger the intro state  	// state.setState(&StateID_Intro); -  	isResponding = 0; -	OSReport("Is now responding: %d", isResponding); -	OSReport("Daddy is at: %x", this);  	return true;  } @@ -354,35 +337,10 @@ int dSingAlong::onExecute() {  	return true;  } -int dSingAlong::onDraw() { - -	if (chorus == -1) { return true; } - -	for (int i = 0; i < (chorus + 1); i++) {  -		matrix.translation(prizePos[i].x, prizePos[i].y, prizePos[i].z); -		matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); - -		pModel[i].setDrawMatrix(matrix); - -		pModel[i].setScale(&prizeScale[i]); - -		// OSReport("Calc World"); -		// pModel[i].calcWorld(false); - -		// OSReport("Schedule"); -		// pModel[i].scheduleForDrawing(); - -		// if (pAnim[i].isAnimationDone()) { -		// 	pAnim[i].setCurrentFrame(0.0); } -		 -		// OSReport("vf1C"); -		// pModel[i]._vf1C(); -	} -	 -	return true; -} +int dSingAlong::onDraw() { return true; } -int dSingAlong::onDelete() { +int dSingAlong::onDelete() {  +	instance = 0;  	return 1;  } @@ -396,19 +354,19 @@ void dSingAlong::RegisterNote(int note) {  		OSReport("State was checked");  		if (note == Songs[song][chorus][currentNote][0]) { +			PlaySoundAsync(this, Notes[Songs[song][chorus][currentNote][0]-1]);  			OSReport("Note was correct"); -  			currentNote += 1;  		}  		else {  			OSReport("Player failed"); +			PlaySound(this, SE_MG_CMN_WIN_CLOSE);  			isResponding = 0;  			state.setState(&StateID_Failure);  		}  	}  } -  /*****************************************************************************/  // Intro  CREATE_STATE(dSingAlong, Intro); @@ -422,28 +380,11 @@ void dSingAlong::executeState_Intro() {  CREATE_STATE(dSingAlong, Prize);  void dSingAlong::beginState_Prize() { -	this->timer = 0; - -	if (chorus != 0) { -		this->timer = 120; -	} - -	Xkey_count = 2; -	Ykey_count = 2; -	Skey_count = 2; - -	// /* keysX[i] = { frame, value, slope }; */ -	keysX[0] = (HermiteKey){ 0.0, pos.x, 0.8 }; -	keysY[0] = (HermiteKey){ 0.0, pos.y, 0.8 }; -	keysS[0] = (HermiteKey){ 0.0, 5.0, 0.8 }; - -	keysX[1] = (HermiteKey){ 60.0, pos.x + (30.0 * (chorus + 1)) - 320.0, 0.8 }; -	keysY[1] = (HermiteKey){ 60.0, pos.y - 80.0, 0.8 }; -	keysS[1] = (HermiteKey){ 60.0, 1.0, 0.8 }; +	this->timer = 120;  }  void dSingAlong::executeState_Prize() { -	if (timer == 120) { // Play a nice success sound, and wait a second +	if ((timer == 120) && (chorus >= 0)) { // Play a nice success sound, and wait a second  		PlaySound(this, SE_MG_IH_PAIR_OK); // SE_MG_IH_NICE or SE_MG_UH_NICE  		int p; @@ -451,21 +392,24 @@ void dSingAlong::executeState_Prize() {  		this->Powerups[p] += 1;  	} -	if (timer < 60 && timer >= 0) { // Move last time's model to the corner. -		float modX = GetHermiteCurveValue(60.0 - timer, keysX, Xkey_count); -		float modY = GetHermiteCurveValue(60.0 - timer, keysY, Ykey_count); -		float modS = GetHermiteCurveValue(60.0 - timer, keysS, Skey_count); - - -		prizePos[chorus] = (Vec){ modX, modY, prizePos[chorus].z }; -		prizeScale[chorus] = (Vec){ modS, modS, modS }; +	if ((timer == 60) && (chorus >= 0)) { +		OSReport("Switching PrizeModel States"); +		PrizeModel->doStateChange(&dSongPrize::StateID_Shrink);   	}  	if (timer == 0) {  		chorus += 1; -		SpawnEffect("Wm_en_blockcloud", 0, &(Vec){pos.x, pos.y, pos.z+500.0}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5}); +		if (chorus == 4) {  +			state.setState(&StateID_Win); +			return;  +		} + +		SpawnEffect("Wm_en_blockcloud", 0, &(Vec){pos.x, pos.y+32.0, pos.z+500.0}, &(S16Vec){0,0,0}, &(Vec){1.5, 1.5, 1.5});  		PlaySound(this, SE_OBJ_ITEM_APPEAR); // SE_OBJ_GOOD_ITEM_APPEAR + +		OSReport("Making the prize model"); +		PrizeModel = (dSongPrize*)create(WM_SINKSHIP, chorus + (prize << 16), &pos, &rot, 0);  	}  	if (timer == -90) { @@ -521,9 +465,6 @@ void dSingAlong::executeState_Response() {  		isResponding = 0;  		OSReport("Switching to some other mode: %d", isResponding);  		if (chorus == 3) { -			state.setState(&StateID_Win); -		} -		else {  			state.setState(&StateID_Prize);  		}  	} @@ -535,13 +476,15 @@ CREATE_STATE(dSingAlong, Failure);  void dSingAlong::beginState_Failure() {  	this->timer = 0; - -	PlaySound(this, SE_MG_CMN_WIN_CLOSE);  }  void dSingAlong::executeState_Failure() { +	if (timer == 60) { +		PlaySound(this, SE_MG_IH_NOPAIR_NG); +	} +  	if (timer == 240) {  		this->addPowerups(); -		ExitStage(3, 0, 0, 4); +		ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE);  	}  	timer += 1;  } @@ -558,7 +501,7 @@ void dSingAlong::beginState_Win() {  void dSingAlong::executeState_Win() {  	if (timer == 240) {  		this->addPowerups(); -		ExitStage(3, 0, 0, 4); +		ExitStage(WORLD_MAP, 0, BEAT_LEVEL, MARIO_WIPE);  	}  	timer += 1;	  } @@ -609,12 +552,10 @@ public:  	mHeapAllocator_c allocator;  	nw4r::g3d::ResFile resFile; -  	m3d::mdl_c bodyModel; -	m3d::anmChr_c glow;  	StageActorLight light; -	mHeapAllocator_c allocator2; +	mHeapAllocator_c allocatorB;  	int note; @@ -649,17 +590,10 @@ int dSongBlock::onCreate() {  	nw4r::g3d::ResMdl mdl = this->resFile.GetResMdl("light_block");  	bodyModel.setup(mdl, &allocator, 0x224, 1, 0);  	SetupTextures_MapObj(&bodyModel, 0); // 800B42B0 - -	// Animation Assignment -	nw4r::g3d::ResAnmChr anmChr = this->resFile.GetResAnmChr("light_block"); -	this->glow.setup(mdl, anmChr, &this->allocator, 0); -	glow.bind(&bodyModel, anmChr, 1); -	bodyModel.bindAnim(&glow, 0.0); -	glow.setUpdateRate(1.0);  	allocator.unlink(); -	// light.init(&allocator2, 2); +	// light.init(&allocatorB, 2);  	// Block Physics @@ -687,13 +621,11 @@ int dSongBlock::onCreate() {  	return true;  } -  int dSongBlock::onDelete() {  	physics.removeFromList();  	return true;  } -  int dSongBlock::onExecute() {  	acState.execute();  	physics.update(); @@ -714,17 +646,12 @@ int dSongBlock::onExecute() {  	return true;  } -  int dSongBlock::beforeDraw() {  	// light.draw();  	return dStageActor_c::beforeDraw();  }  int dSongBlock::onDraw() { - -	// tile.x = pos.x - 8; -	// tile.y = -(16 + pos.y); -  	matrix.translation(pos.x, pos.y+8.0, pos.z);  	matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); @@ -737,15 +664,13 @@ int dSongBlock::onDraw() {  	return true;  } -  void dSongBlock::blockWasHit(bool isDown) {  	pos.y = initialY; -	PlaySoundAsync(this, Notes[this->note-1]); -	// Play an effect? -	OSReport("Note is: %d", this->note); +	SpawnEffect("Wm_en_vshit_ring", 0, &(Vec){pos.x, pos.y+8.0, pos.z-100.0}, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}); +	SpawnEffect("Wm_ob_keyget02_lighit", 0, &(Vec){pos.x, pos.y+8.0, pos.z-100.0}, &(S16Vec){0,0,0}, &(Vec){0.5, 0.5, 0.5}); +  	dSingAlong::instance->RegisterNote(this->note); -	OSReport("Note successfully registered");  	physics.setup(this, &physicsInfo, 3, currentLayerID);  	physics.addToList(); @@ -753,23 +678,12 @@ void dSongBlock::blockWasHit(bool isDown) {  	doStateChange(&StateID_Wait);  } -  void dSongBlock::calledWhenUpMoveExecutes() { -	this->bodyModel._vf1C(); - -	if (this->glow.isAnimationDone()) { -		this->glow.setCurrentFrame(0.0); } -  	if (initialY >= pos.y)  		blockWasHit(false);  }  void dSongBlock::calledWhenDownMoveExecutes() { -	this->bodyModel._vf1C(); - -	if (this->glow.isAnimationDone()) { -		this->glow.setCurrentFrame(0.0); } -  	if (initialY <= pos.y)  		blockWasHit(true);  }  | 
