diff options
Diffstat (limited to '')
| -rw-r--r-- | NewerProject.yaml | 2 | ||||
| -rw-r--r-- | NewerProjectKP.yaml | 2 | ||||
| -rw-r--r-- | bossTopman.yaml | 5 | ||||
| -rw-r--r-- | src/koopatlas/core.cpp | 1 | ||||
| -rw-r--r-- | src/koopatlas/map.cpp | 197 | ||||
| -rw-r--r-- | src/koopatlas/map.h | 1 | ||||
| -rw-r--r-- | src/koopatlas/mapdata.cpp | 20 | ||||
| -rw-r--r-- | src/koopatlas/mapdata.h | 10 | 
8 files changed, 166 insertions, 72 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml index d8a6374..6044c59 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -33,6 +33,7 @@ modules:  #  - processed/crowdclapper.yaml    - processed/blocksnake.yaml  #  - processed/classic_controller.yaml +  - processed/topman.yaml    - processed/bossMegaGoomba.yaml    - processed/bossFuzzyBear.yaml    - processed/bossThwompaDomp.yaml @@ -48,7 +49,6 @@ modules:    - processed/fakeStarCoin.yaml    - processed/shyguy.yaml    - processed/meteor.yaml -  - processed/topman.yaml    - processed/electricLine.yaml    - processed/makeYourOwn.yaml    - processed/challengeStar.yaml diff --git a/NewerProjectKP.yaml b/NewerProjectKP.yaml index 7509fe7..92264c1 100644 --- a/NewerProjectKP.yaml +++ b/NewerProjectKP.yaml @@ -32,6 +32,7 @@ modules:  #  - processed/crowdclapper.yaml    - processed/blocksnake.yaml  #  - processed/classic_controller.yaml +  - processed/topman.yaml    - processed/bossMegaGoomba.yaml    - processed/bossFuzzyBear.yaml    - processed/bossThwompaDomp.yaml @@ -47,7 +48,6 @@ modules:    - processed/fakeStarCoin.yaml    - processed/shyguy.yaml    - processed/meteor.yaml -  - processed/topman.yaml    - processed/electricLine.yaml    - processed/makeYourOwn.yaml    - processed/challengeStar.yaml diff --git a/bossTopman.yaml b/bossTopman.yaml index 31f7f6b..31a23b1 100644 --- a/bossTopman.yaml +++ b/bossTopman.yaml @@ -8,3 +8,8 @@ hooks:      src_addr_pal: 0x8097BCC0      target_func: 'daDreidel::build(void)' +  - name: BossTopmanSpriteFileInfo +    type: add_func_pointer +    src_addr_pal: 0x8031AF38 +    target_func: 'TMarcNameList' +    # 0x8031AB4C + sprite num * 0x4 == offset diff --git a/src/koopatlas/core.cpp b/src/koopatlas/core.cpp index eefde51..b8c9083 100644 --- a/src/koopatlas/core.cpp +++ b/src/koopatlas/core.cpp @@ -140,6 +140,7 @@ bool WMInit_LoadSIAnims(void *ptr) {  	DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_penguin", 0);  	DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_propeller", 0);  	DVD_LoadFile(GetDVDClass(), "WorldMap", "SI_star", 0); +	DVD_LoadFile(GetDVDClass(), "Object", "I_hammer", 0);  	return true;  } diff --git a/src/koopatlas/map.cpp b/src/koopatlas/map.cpp index f4b953c..38610e6 100644 --- a/src/koopatlas/map.cpp +++ b/src/koopatlas/map.cpp @@ -117,6 +117,8 @@ void dWMMap_c::renderer_c::drawLayers() {  			renderTileLayer(layer, data->sectors);  		else if (layer->type == dKPLayer_s::DOODADS)  			renderDoodadLayer(layer); +		else if (layer->type == dKPLayer_s::PATHS) +			renderPathLayer(layer);  	}  	endRendering(); @@ -298,82 +300,92 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {  			for (int j = 0; j < doodad->animationCount; j++) {  				dKPDoodad_s::animation_s *anim = &doodad->animations[j]; -				u32 baseTick = anim->baseTick; -				if (baseTick == 0) { -					anim->baseTick = baseTick = GlobalTickCount; -				} +				if (anim->delayOffset == 0) { +					u32 baseTick = anim->baseTick; +					if (baseTick == 0) { +						anim->baseTick = baseTick = GlobalTickCount; +					} -				u32 elapsed = GlobalTickCount - baseTick; -				if (anim->isReversed) -					elapsed = anim->frameCount - 1 - elapsed; +					u32 elapsed = GlobalTickCount - baseTick; +					u32 elapsedAdjusted = elapsed; +					if (anim->isReversed) +						elapsed = anim->frameCount - 1 - elapsed; + +					if (elapsed >= anim->frameCount) { +						if (elapsed >= (anim->frameCount + delay)) { + +							// we've reached the end +							switch (anim->loop) { +								case dKPDoodad_s::animation_s::CONTIGUOUS: +									// Stop here +									elapsed = anim->frameCount - 1; +									break; + +								case dKPDoodad_s::animation_s::LOOP: +									// Start over +									elapsed = 0; +									anim->baseTick = GlobalTickCount; +									break; + +								case dKPDoodad_s::animation_s::REVERSE_LOOP: +									// Change direction +									anim->isReversed = !anim->isReversed; +									elapsed = (anim->isReversed) ? (anim->frameCount - 1) : 0; +									anim->baseTick = GlobalTickCount; +									break; +							} +						} +						elapsedAdjusted = anim->frameCount; +					} -				if (elapsed >= anim->frameCount) { -					// we've reached the end -					switch (anim->loop) { -						case dKPDoodad_s::animation_s::CONTIGUOUS: -							// Stop here -							elapsed = anim->frameCount - 1; -							break; +					// now calculate the thing +					float progress = elapsedAdjusted / (float)anim->frameCount; +					float value; -						case dKPDoodad_s::animation_s::LOOP: -							// Start over -							elapsed = 0; -							anim->baseTick = GlobalTickCount; +					switch (anim->curve) { +						case dKPDoodad_s::animation_s::LINEAR: +							value = progress;  							break; - -						case dKPDoodad_s::animation_s::REVERSE_LOOP: -							// Change direction -							anim->isReversed = !anim->isReversed; -							elapsed = (anim->isReversed) ? (anim->frameCount - 1) : 0; -							anim->baseTick = GlobalTickCount; +						case dKPDoodad_s::animation_s::SIN: +							value = (sin(((progress * M_PI * 2)) - M_PI_2) + 1) / 2; +							break; +						case dKPDoodad_s::animation_s::COS: +							value = (cos(((progress * M_PI * 2)) - M_PI_2) + 1) / 2;  							break;  					} -				} -				// now calculate the thing -				float progress = elapsed / (float)anim->frameCount; -				float value; - -				switch (anim->curve) { -					case dKPDoodad_s::animation_s::LINEAR: -						value = progress; -						break; -					case dKPDoodad_s::animation_s::SIN: -						value = (sin(((progress * M_PI * 2)) - M_PI_2) + 1) / 2; -						break; -					case dKPDoodad_s::animation_s::COS: -						value = (cos(((progress * M_PI * 2)) - M_PI_2) + 1) / 2; -						break; -				} +					float delta = anim->end - anim->start; +					float frame; -				float delta = anim->end - anim->start; -				float frame; - -				if (anim->isReversed) -					frame = anim->start + ceil(delta * value); -				else -					frame = anim->start + (delta * value); - -				// and apply it! -				switch (anim->type) { -					case dKPDoodad_s::animation_s::X_POS: -						effectiveX += frame; -						break; -					case dKPDoodad_s::animation_s::Y_POS: -						effectiveY += frame; -						break; -					case dKPDoodad_s::animation_s::ANGLE: -						effectiveAngle += frame; -						break; -					case dKPDoodad_s::animation_s::X_SCALE: -						effectiveWidth = (effectiveWidth * frame / 100.0); -						break; -					case dKPDoodad_s::animation_s::Y_SCALE: -						effectiveHeight = (effectiveHeight * frame / 100.0); -						break; -					case dKPDoodad_s::animation_s::OPACITY: -						// TODO -						break; +					if (anim->isReversed) +						frame = anim->start + ceil(delta * value); +					else +						frame = anim->start + (delta * value); + +					// and apply it! +					switch (anim->type) { +						case dKPDoodad_s::animation_s::X_POS: +							effectiveX += frame; +							break; +						case dKPDoodad_s::animation_s::Y_POS: +							effectiveY += frame; +							break; +						case dKPDoodad_s::animation_s::ANGLE: +							effectiveAngle += frame; +							break; +						case dKPDoodad_s::animation_s::X_SCALE: +							effectiveWidth = (effectiveWidth * frame / 100.0); +							break; +						case dKPDoodad_s::animation_s::Y_SCALE: +							effectiveHeight = (effectiveHeight * frame / 100.0); +							break; +						case dKPDoodad_s::animation_s::OPACITY: +							// TODO +							break; +					} +				} +				else {  +					anim->delayOffset -= 1;  				}  			}  		} @@ -406,6 +418,55 @@ void dWMMap_c::renderer_c::renderDoodadLayer(dKPLayer_s *layer) {  	}  } +void dWMMap_c::renderer_c::renderPathLayer(dKPLayer_s *layer) { +	for (int i = 0; i < layer->nodeCount; i++) { +		dKPNode_s **node = layer->nodes[i]; + +		int world = node->levelNumber[0]; +		int level = node->levelNumber[1]; + +		SaveBlock *save = GetSaveFile()->GetBlock(-1); +		u32 conds = save->GetLevelCondition(world-1, level-1); + +		bool isUnlocked = true; +		bool exitComplete = false; +		bool secretComplete = false; + +		if (conds & 0x10) +			exitComplete = true; +		if (conds & 0x20) +			secretComplete = true; + +		// Is it unlocked? +		if (!isUnlocked) +			node->color.setCurrentFrame(0); // Black + +		// Is it complete? +		else if ((exitComplete) || (secretComplete)) +			// Does it have two exits? +			if ((node->hasSecret) && ((!exitComplete) || (!secretComplete))) +				node->color.setCurrentFrame(2); // Yellow + +			// All exits are complete +			else +				node->color.setCurrentFrame(1); // Blue + +		// Not complete after all +		else +			node->color.setCurrentFrame(3); // Red + +		matrix.translation(node->x, node->y, 500.0); } +		matrix.applyRotationYXZ(&rot.x, &rot.y, &rot.z); +		node->model.setDrawMatrix(matrix); +		node->model.setScale(1.0f, 1.0f, 1.0f); +		node->model.calcWorld(false); + +		node->model.scheduleForDrawing(); +	} +} + + +  void dWMMap_c::renderer_c::endRendering() {  } diff --git a/src/koopatlas/map.h b/src/koopatlas/map.h index 72dd2d5..e951a41 100644 --- a/src/koopatlas/map.h +++ b/src/koopatlas/map.h @@ -44,6 +44,7 @@ class dWMMap_c : public dBase_c {  				void renderTileLayer(dKPLayer_s *layer, dKPLayer_s::sector_s *sector);  				void renderDoodadLayer(dKPLayer_s *layer); +				void renderPathLayer(dKPLayer_s *layer);  				void loadTexture(GXTexObj *obj); diff --git a/src/koopatlas/mapdata.cpp b/src/koopatlas/mapdata.cpp index 6838741..4a51519 100644 --- a/src/koopatlas/mapdata.cpp +++ b/src/koopatlas/mapdata.cpp @@ -50,6 +50,7 @@ bool dKPMapData_c::load(const char *filename) {  	bool didLoadTilesets = loadTilesets();  	bool didLoadBG = (bgLoader.load("/Maps/Water.brres") != 0); +	bool nodeLoader.load("/Maps/visCobCourse.brres");  	return didLoadTilesets && didLoadBG;  } @@ -89,6 +90,7 @@ void dKPMapData_c::unloadTilesets() {  	}  	bgLoader.unload(); +	nodeLoader.unload()  }  void dKPMapData_c::fixup() { @@ -140,6 +142,24 @@ void dKPMapData_c::fixup() {  					if (node->type == dKPNode_s::CHANGE)  						fixRef(node->destMap); +					else if (node->type == dKPNode_s::LEVEL) { + +						node->allocator.link(-1, GameHeaps[0], 0, 0x20); + +						nw4r::g3d::ResFile rf(nodeLoader.buffer); +						rf.CheckRevision(); +						rf.Init(); +						rf.Bind(rf); + +						nw4r::g3d::ResMdl mdl = rf.GetResMdl("cobCourse"); +						nw4r::g3d::ResAnmVis anmRes = rf.GetResAnmVis("cobCourse"); + +						node->model.setup(mdl, &node->allocator, 0x224, 1, 0); +						node->color.setup(mdl, anmRes, &node->allocator, 0, 1); +						node->color.bind(&node->model, anmRes, 0); +						node->model.bindAnim(&node->color, 0.0f); +						SetupTextures_MapObj(&node->model, 0); +					}  				}  				break;  		} diff --git a/src/koopatlas/mapdata.h b/src/koopatlas/mapdata.h index ace1edd..c4d16b5 100644 --- a/src/koopatlas/mapdata.h +++ b/src/koopatlas/mapdata.h @@ -28,6 +28,7 @@ struct dKPDoodad_s {  		int frameCount;  		AnimTypes type;  		int start, end; +		int delay, delayOffset;  		u32 baseTick;  		bool isReversed; @@ -66,11 +67,10 @@ struct dKPNode_s {  	NodeTypes type;  	union { -		struct { u8 levelNumber[2]; }; +		struct { u8 levelNumber[2]; bool hasSecret; };  		struct { const char *destMap; u8 thisID, foreignID, transition, _; };  	}; -  	dKPPath_s *getAnyExit() {  		for (int i = 0; i < 4; i++)  			if (exits[i]) @@ -79,6 +79,11 @@ struct dKPNode_s {  	}  	dKPPath_s *getOppositeExitTo(dKPPath_s *path); + +	mHeapAllocator_c allocator; +	m3d::mdl_c model; +	m3d::anmVis_c color; +	mMtx matrix;  };  struct dKPPath_s { @@ -201,6 +206,7 @@ class dKPMapData_c {  		dKPLayer_s *pathLayer;  		dDvdLoader_c bgLoader; +		dDvdLoader_c nodeLoader;  		dKPMapData_c();  		bool load(const char *filename);  | 
