diff options
Diffstat (limited to '')
| -rw-r--r-- | src/koopatlas/starcoin.cpp | 424 | ||||
| -rw-r--r-- | src/koopatlas/starcoin.h | 40 | 
2 files changed, 464 insertions, 0 deletions
diff --git a/src/koopatlas/starcoin.cpp b/src/koopatlas/starcoin.cpp new file mode 100644 index 0000000..f47d342 --- /dev/null +++ b/src/koopatlas/starcoin.cpp @@ -0,0 +1,424 @@ +#include "koopatlas/starcoin.h" + + +int getStarCoinCountCoins() { +	SaveBlock *save = GetSaveFile()->GetBlock(-1); +	int coinsSpent = save->credits_hiscore; +	int coinsEarned = 0; + +	for (int w = 0; w < 10; w++) { +		for (int l = 0; l < 10; l++) { +			u32 conds = save->GetLevelCondition(w, l); + +			if (conds & COND_COIN1) { coinsEarned++; } +			if (conds & COND_COIN2) { coinsEarned++; } +			if (conds & COND_COIN3) { coinsEarned++; } +		} +	} + +	int coinsLeft = coinsEarned - coinsSpent; +	return coinsLeft; +} + + +/*****************************************************************************/ +// Starcoin Layout +// + + +dWMStarCoin *dWMStarCoin::instance = 0; + +dWMStarCoin *dWMStarCoin::build() { +	void *buffer = AllocFromGameHeap1(sizeof(dWMStarCoin)); +	dWMStarCoin *c = new(buffer) dWMStarCoin; + +	instance = c; +	return c; +} + +dWMStarCoin::dWMStarCoin() { +	layoutLoaded = false; +	isHidden = true; +} + +int dWMStarCoin::onCreate() { + +	if (!layoutLoaded) { +		bool gotFile = layout.loadArc("coin.arc", false); +		if (!gotFile) +			return false; + +		currentItem = 0; + +		static const char *brlanNames[2] = {"coin_inWindow.brlan", "coin_outWindow.brlan"}; +		static const char *groupNames[2] = {"A00_Window", "A00_Window"}; + +		bool output = layout.build("coin.brlyt"); + +		if (!IsWideScreen()) { +			layout.clippingEnabled = true; +			layout.clipX = 0; +			layout.clipY = 52; +			layout.clipWidth = 640; +			layout.clipHeight = 352; +			layout.layout.rootPane->scale.x = 0.7711f; +			layout.layout.rootPane->scale.y = 0.7711f; +		} + +		layout.loadAnimations(brlanNames, 2); +		layout.loadGroups(groupNames, (int[2]){0, 1}, 2); +		layout.disableAllAnimations(); + +		layout.drawOrder = 0x01; + +		layoutLoaded = true; +	} + +	return true; +} + + +int dWMStarCoin::onDelete() { +	return layout.free(); +} + + +int dWMStarCoin::onExecute() { +	layout.execAnimations(); +	layout.update(); + +	if (!isHidden) { +		int nowPressed = Remocon_GetPressed(GetActiveRemocon()); + +		if (!layout.isAnyAnimOn()) { +			if (nowPressed & WPAD_B) { +				MapSoundPlayer(SoundRelatedClass, SE_SYS_DIALOGUE_OUT_AUTO, 1); +				isHidden = true;  +				layout.enableNonLoopAnim(1);  +			}  +		} +	} + +	return true; +} + +int dWMStarCoin::onDraw() { +	if (isHidden) { +		if (layout.isAnimOn(1)) { layout.scheduleForDrawing(); } +	} + +	if (!isHidden) { +		layout.scheduleForDrawing(); +	} + +	return true; +} + +void dWMStarCoin::specialDraw1() { +	if (!isHidden) { +		Vec pos = {250.0f, 170.0f, 1000.0f}; +		S16Vec rot = {rotation,0,0}; +		Vec scale = {1.0f, 1.0f, 1.0f}; +		matrix.translation(pos.x, pos.y, pos.z); +		matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); + +		shopkeep.setDrawMatrix(matrix); +		shopkeep.setScale(&scale); +		shopkeep.calcWorld(false); +		shopkeep.scheduleForDrawing(); + +		rotation += 0x100; +	} +	return; +} + + +void dWMStarCoin::LoadCoinsForWorld(int world) { +	if (!isHidden) { +		return; } + +	u8 levelArray[] = { +		{ +			{1,2,3,4,15}, +			{5,6,7,8,25,38} +		}, + +		{ +			{1,2,3,4,15}, +			{5,6,7,8,9,10,25,38} +		}, + +		{ +			{1,2,3,4,15}, +			{5,6,7,25,38} +		}, + +		{ +			{1,2,3,4,15}, +			{5,6,7,8,25,38} +		}, + +		{ +			{1,2,3,4,5,15}, +			{6,7,8,9,10,25,38} +		}, + +		{ +			{1,2,3,4,15}, +			{5,6,7,8,9,25,38} +		}, + +		{ +			{1,2,3,4}, +			{5,15,6,7,8,9,25,38} +		}, + +		{ +			{1,2,3,15,4,25,5}, +			{6,7,16,8,9,10,26} +		}, + +		{ +			{1,2,3,4,5}, +			{6,7,8,9,10} +		}, + +		{ +			{1,2,3,4,5}, +			{} +		}, + +		{ +			{6,7,8,9,10}, +			{} +		}, + +		{ +			{11,12,13,14,15}, +			{} +		}, + +		{ +			{16,17,18}, +			{} +		}, + +		{ +			{19,22,23,24,25}, +			{} +		} +	} + +	// Handle showing it +	MapSoundPlayer(SoundRelatedClass, SE_SYS_DIALOGUE_IN, 1); +	isHidden = false; +	layout.enableNonLoopAnim(0); + +	// Model creation	 +	allocator.link(-1, GameHeaps[0], 0, 0x20); + +	res.data = getResource("star_coin", "g3d/star_coin.brres"); +	nw4r::g3d::ResMdl mdl = res.GetResMdl("star_coinA"); +	shopkeep.setup(mdl, &allocator, 0x224, 1, 0); +	SetupTextures_Item(&shopkeep, 1); + +	allocator.unlink(); + + +	// Display Total Star Coin Count +	int myCoins = getStarCoinCountCoins(); + +	char myCoinsStr [4]; +	sprintf(myCoinsStr, "%03d", myCoins); + +	setText(myCoinsStr, "T_overall_01"); + + +	// Display World Name +	setWorldName(int world); + + +	// Display Per level coins +	int totalCoins = 0; +	int currentCoins = 0; + +	int i = 0; +	int j = 1; + +	SaveBlock *save = GetSaveFile()->GetBlock(-1); +	for (int l = 0; l < 2; l++) { +		while (levelArray[world-1][l][i]) { + +			dLevelInfo_c *li = &dScKoopatlas_c::instance->levelInfo; +			dLevelInfo_c::entry_s *entry = li->search(world - 1, levelArray[world-1][l][i] - 1); + +			setText(li->getNameForLevel(entry);, "T_level_01"); + +			bool collect; +			collect = CheckIfCoinCollected(world - 1, l, 0); +			setCoin(collect, 1, i+j); +			if (collect) { currentCoins++; } + +			collect = CheckIfCoinCollected(world - 1, l, 1); +			setCoin(collect, 2, i+j); +			if (collect) { currentCoins++; } + +			collect = CheckIfCoinCollected(world - 1, l, 2); +			setCoin(collect, 3, i+j); +			if (collect) { currentCoins++; } + +			totalCoins += 3; +			i++; +		} +		j += 8; +		i = 0; +	} + +	// Display per-world Count +	char tcStr [3]; +	sprintf(tcStr, "%02d", totalCoins); + +	setText(tcStr, "T_total_01"); + +	char ccStr [3]; +	sprintf(ccStr, "%02d", currentCoins); + +	setText(ccStr, "T_collected_01"); +} + + +void dWMStarCoin::setCoin(bool on, int coin, int slot) { + +	if (coin == 1) { +		char coinOn [14]; +		sprintf(coinOn, "P_first_on_%02d", slot); + +		char coinOff [15]; +		sprintf(coinOff, "P_first_off_%02d", slot); +	} else if { +		char coinOn [15]; +		sprintf(coinOn, "P_second_on_%02d", slot); + +		char coinOff [16]; +		sprintf(coinOff, "P_second_off_%02d", slot); +	} else if { +		char coinOn [14]; +		sprintf(coinOn, "P_third_on_%02d", slot); + +		char coinOff [15]; +		sprintf(coinOff, "P_third_off_%02d", slot); +	} else { return; } + +	nw4r::lyt::Pane picOn = layout.findPictureByName(coinOn); +	nw4r::lyt::Pane picOff = layout.findPictureByName(coinOff); + +	if (on) { +		picOn->alpha = 0xFF; +		picOff->alpha = 0; +	} +	else { +		picOn->alpha = 0; +		picOff->alpha = 0xFF; +	} +} + +void dWMStarCoin::setText(const char *str, const char *name) { + +	int length = strlen(str); +	wchar_t newString[128]; + +	int i; +	for (i = 0; i < length && i < 128; i++) { +		newString[i] = str[i]; +	} +	newString[i] = 0; + +	int wlength = wcslen(newString); + +	nw4r::lyt::TextBox *box = layout.findTextBoxByName(name); + +	nw4r::ut::TextWriter tw; +	tw.font = box->font; +	tw.SetFontSize(box->fontSizeX, box->fontSizeY); +	tw.somethingRelatedToLineHeight = box->lineSpace; +	tw.charSpace = box->charSpace; +	if (box->tagProc != 0) +		tw.tagProcessorMaybe = box->tagProc; + +	float width = tw.CalcStringWidth(newString, wlength); +	SpammyReport("Text width: %f\n", width); + +	box->SetString(newString); +} + +void dWMStarCoin::setWorldName(int world) { + +	switch (world) { +		case 1:		 +			setText("Yoshi's Island", "T_lefttitle_01"); +			setText("Yoshi's Island", "T_righttitle_01")l +			break;	 + +		case 2: +			setText("Soggy Sewers", "T_lefttitle_01"); +			setText("Rubble Ruins", "T_righttitle_01")l +			break;	 + +		case 3:		 +			setText("Mushroom Peaks", "T_lefttitle_01"); +			setText("Mushroom Peaks", "T_righttitle_01")l +			break;	 + +		case 4:		 +			setText("Sakura Village", "T_lefttitle_01"); +			setText("Sakura Village", "T_righttitle_01")l +			break;	 + +		case 5:		 +			setText("FreezeFlame Valley", "T_lefttitle_01"); +			setText("FreezeFlame Volcano", "T_righttitle_01")l +			break;	 + +		case 6:		 +			setText("Pumpkin Boneyard", "T_lefttitle_01"); +			setText("Pumpkin Boneyard", "T_righttitle_01")l +			break;	 + +		case 7:		 +			setText("Sky Mountain", "T_lefttitle_01"); +			setText("Starry Skies", "T_righttitle_01")l +			break;	 + +		case 8:		 +			setText("Koopa Planet", "T_lefttitle_01"); +			setText("Koopa Core", "T_righttitle_01")l +			break;	 + +		case 9:		 +			setText("Bonus Land", "T_lefttitle_01"); +			setText("Bonus Land", "T_righttitle_01")l +			break;	 + +		case 10:		 +			setText("Goldwood Forest", "T_lefttitle_01"); +			setText(" ", "T_righttitle_01")l + +			// if      ((level < 6)  || (level == 33) || (level == 34)) +			// 	setWorldText("Goldwood\nForest"); +			// else if ((level < 11) || (level == 35) || (level == 36)) +			// 	setWorldText("Mini-Mega\nIsland"); +			// else if ((level < 16) || (level == 37) || (level == 38) || (level == 31) ) +			// 	setWorldText("Crystal\nCaves"); +			// else if ((level < 19) || (level == 39) || (level == 40)) +			// 	setWorldText("Bombard\nCliffs"); +			// else +			// 	setWorldText("Sky\nCity"); +			break;	 + +		default: +			setText("Unknown World", "T_lefttitle_01"); +			setText("Unknown World", "T_righttitle_01")l +			break; +	} + +} diff --git a/src/koopatlas/starcoin.h b/src/koopatlas/starcoin.h new file mode 100644 index 0000000..500ffa6 --- /dev/null +++ b/src/koopatlas/starcoin.h @@ -0,0 +1,40 @@ +#ifndef __KOOPATLAS_HUD_H +#define __KOOPATLAS_HUD_H + +#include "koopatlas/core.h" + +class dWMStarCoin : public dBase_c { +	public: +		dWMStarCoin(); + +		int onCreate(); +		int onDelete(); +		int onExecute(); +		int onDraw(); +		void specialDraw1(); + +		mHeapAllocator_c allocator; +		nw4r::g3d::ResFile res; +		m3d::mdl_c shopkeep; +		mMtx matrix; + +		bool layoutLoaded; +		m2d::EmbedLayout_c layout; + +		bool isHidden; +		s16 rotation; + +		void LoadCoinsForWorld(int world); +		void setCoin(bool On, int coin, int slot); +		void setText(const char *str, const char *name); +		void setWorldName(int world); + +		static dWMStarCoin *build(); +		static dWMStarCoin *instance; + +	private: +		bool isPointBarShown; +}; + +#endif +  | 
