ChrisC26

Star Forge Robes/Darth Revan's Robes Alteration

Recommended Posts

Yeah, having the folded hood back after removing the cape looks good.

I wonder, could it be possible the female head issue is caused by having the female body use male animations or something? I remember seeing that similar result with some mods, as well where one time I accidentally swapped a female body with a male one.

  • Like 1

Share this post


Link to post
Share on other sites

 

I wonder, could it be possible the female head issue is caused by having the female body use male animations or something? I remember seeing that similar result with some mods, as well where one time I accidentally swapped a female body with a male one.

Called it.  Within the same damn minute even!

  • Like 1

Share this post


Link to post
Share on other sites

I wonder, could it be possible the female head issue is caused by having the female body use male animations or something? I remember seeing that similar result with some mods, as well where one time I accidentally swapped a female body with a male one.

Hrm, yeah it's a possibility I guess. I'll have a look.

 

Edit: That does indeed seem to be the issue. I tried changing the animation scale, but there was no difference. I'm not sure if there is any practical solution besides using the same model for both sexes.

Share this post


Link to post
Share on other sites

Hmm. You said earlier that for the animations the models were using Sith Specter's edited 'N_DarthRevan' model, which has the flowing cape and belt.

Maybe the reason why the female model's using male animations, is because the 'N_DarthRevan' model is a male model only?

I know that 'N_DarthRevanF' (the model used during the cut-scene for when Revan takes off their mask) uses female animations, but it has no cape and belt animation.

Share this post


Link to post
Share on other sites

N_DarthRevanF is just the male mesh but it references S_Female03 as the supermodel. N_DarthRevanM and N_DarthRevan (vanilla version) both reference S_Female02 as the super. The animation chain in order of priority is S_Female03->S_Female02->S_Female01->S_Male02->S_Male01. S_Female03 contains the female idles, walk cycles, etc. which override the male ones in S_Male02 (which you get by referencing S_Female02 as the super).

 

I gather my Frankensteined rig scaled to fit the PFBJ mesh is the source of the trouble. I'll play around with it a bit more, but as I said earlier I suspect that reverting to a shared model is only likely solution.

Share this post


Link to post
Share on other sites

Wow I am so happy than many of you took interest in the idea. That is some awesome work there DP!

That last shot without the cape looks really good.

These make the already bland vanilla robes look worse!  :P

 

Do you think once finished we will be able to simply use textures from say ZimmMaster's Jedi Revan Robes or say Svosh's Revan Redemption Robes?  

Or do you think there would be texture issues because those mods use the hooded + masked version?

 

If not, I suppose one of us will just have to make some cool texture skins to go with. I feel like a freeloader, I can provide .uti files I suppose if we don't want to use the vanilla ones..... I think I remember how to use KotORTool for that.

Share this post


Link to post
Share on other sites

There is no change from the vanilla UVs, so any Revan's Robes texture for that will work. The only issue is that the vanilla light side Starforge Robes texture has no provision for the belts or cape, as I mentioned in an earlier post.

 

As an aside, par for the course, the vanilla UVs are a complete mess. Backfaces spew off into the ether.

 

I had a look at ZimmMaster's and Svösh’s mods and couldn't see any UV changes, so those textures should work fine. EDIT: Yep, they look fine. In fact I would suggest ZM's texture as a replacement for the light side Star Forge robes (PMBJ02).

 

K1_Revan_Maskless_Robes_ZM_Svosh_TH.jpg

 

EDIT 2: Back on the subject of the female version, the issue is the clash between the male animations the body is using vs the female animations the head is using. The only way to resolve it would be to have some override animations in the female robe model for some of the most noticeable stuff like the idles, talking, walking, etc. These would need to be the base female animations with added cape and belt movement. Even then you'd still get the wacky head position in every other animation, like combat anims. In other words, a female version is not going to happen.

  • Like 3

Share this post


Link to post
Share on other sites

EDIT 2: Back on the subject of the female version, the issue is the clash between the male animations the body is using vs the female animations the head is using. The only way to resolve it would be to have some override animations in the female robe model for some of the most noticeable stuff like the idles, talking, walking, etc. These would need to be the base female animations with added cape and belt movement. Even then you'd still get the wacky head position in every other animation, like combat anims. In other words, a female version is not going to happen.

Well that's a shame. If it's not possible to have the cape and belt animations for a female version, maybe you could have an alternative version of the models that just uses the non-animated cape and belt from the hood-less Revan models?

Share this post


Link to post
Share on other sites

As I said earlier, my knowledge of how the models and animations for KotOR work is very limited but would it be possible to export the male model and adjust its size to match up to what the female model should be? The model would not have the womanly figure though that the vanilla one does if any. Then it would be matched to the correct male animations?

Share this post


Link to post
Share on other sites

As I said earlier, my knowledge of how the models and animations for KotOR work is very limited but would it be possible to export the male model and adjust its size to match up to what the female model should be? The model would not have the womanly figure though that the vanilla one does if any. Then it would be matched to the correct male animations?

It's nothing to do with the models. It's the animations. The female animations have the head lean forward and to the side because the way the body is angled back doing that weird sexy pose. When you combine that with the male animation that has the body more upright, the result is the female head is pointed down and to the side. The only way to fix it is to adjust the animations.

 

Well that's a shame. If it's not possible to have the cape and belt animations for a female version, maybe you could have an alternative version of the models that just uses the non-animated cape and belt from the hood-less Revan models?

That would be a clipping-fest. A better alternative would be to set the female version up as a disguise. Would just need to figure out the appropriate scripting to get the right UTC to spawn on the Star Forge for a given player head. I did have a look through the level files, but couldn't see any obvious script that determines whether you get g_a_mstrrobe06 or g_a_mstrrobe07.

 

EDIT: OK, after some digging I discovered the dialogue sta45_turretcomp.dlg for the computer where you create the robes points to two scripts. There's a DS check, which if true fires script k_psta_replicat4, or if false fires script k_psta_replicat5. The scripts are identical aside from which UTI they add, the first for the DS robes, the second for the LS robes. This is the original version of k_psta_replicat5:

 

 

 

// Globals
	int intGLOB_1 = 0;
	int intGLOB_2 = 1;
	int intGLOB_3 = 2;
	int intGLOB_4 = 3;
	int intGLOB_5 = 4;
	int intGLOB_6 = 5;
	int intGLOB_7 = 6;
	int intGLOB_8 = 7;
	int intGLOB_9 = 8;
	int intGLOB_10 = 9;
	int intGLOB_11 = 10;
	int intGLOB_12 = 11;
	int intGLOB_13 = 12;
	int intGLOB_14 = 13;
	int intGLOB_15 = 14;
	int intGLOB_16 = 15;
	int intGLOB_17 = 16;
	int intGLOB_18 = 17;
	int intGLOB_19 = 18;
	int intGLOB_20 = 19;
	int intGLOB_21 = 1100;
	int intGLOB_22 = (-6);
	int intGLOB_23 = (-5);
	int intGLOB_24 = (-4);
	int intGLOB_25 = (-2);
	int intGLOB_26 = (-1);
	int intGLOB_27 = 0;

// Prototypes
void sub1(float floatParam1);

void sub1(float floatParam1) {
	ActionPauseConversation();
	DelayCommand(floatParam1, ActionResumeConversation());
}

void main() {
	object oSta_force_cage = GetObjectByTag("sta_force_cage", 0);
	object oSta_armor_container = GetObjectByTag("sta_armor_container", 0);
	string string1 = "g_a_mstrrobe07";
	effect efVisual = EffectVisualEffect(1046, 0);
	effect effect3 = EffectVisualEffect(2041, 0);
	sub1(6.5);
	SetLocked(oSta_armor_container, 0);
	AssignCommand(oSta_armor_container, ClearAllEffects());
	CreateItemOnObject(string1, oSta_armor_container, 1);
	DelayCommand(1.4, PlaySound("v_pro_resfrc"));
	DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
	DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
	DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
}

 

And here is my attempt to adapt it to check for the player's appearance, and, if female, point to the appropriate UTI which would be a disguise appropriate for the given head (I'm using a single disguise for S/M/L because I'm way too lazy to make 45 different versions).

 

 

 

// Globals
	int intGLOB_1 = 0;
	int intGLOB_2 = 1;
	int intGLOB_3 = 2;
	int intGLOB_4 = 3;
	int intGLOB_5 = 4;
	int intGLOB_6 = 5;
	int intGLOB_7 = 6;
	int intGLOB_8 = 7;
	int intGLOB_9 = 8;
	int intGLOB_10 = 9;
	int intGLOB_11 = 10;
	int intGLOB_12 = 11;
	int intGLOB_13 = 12;
	int intGLOB_14 = 13;
	int intGLOB_15 = 14;
	int intGLOB_16 = 15;
	int intGLOB_17 = 16;
	int intGLOB_18 = 17;
	int intGLOB_19 = 18;
	int intGLOB_20 = 19;
	int intGLOB_21 = 1100;
	int intGLOB_22 = (-6);
	int intGLOB_23 = (-5);
	int intGLOB_24 = (-4);
	int intGLOB_25 = (-2);
	int intGLOB_26 = (-1);
	int intGLOB_27 = 0;

// Prototypes
void sub1(float floatParam1);

void sub1(float floatParam1) {
	ActionPauseConversation();
	DelayCommand(floatParam1, ActionResumeConversation());
}

void main() {
	object oSta_force_cage = GetObjectByTag("sta_force_cage", 0);
	object oSta_armor_container = GetObjectByTag("sta_armor_container", 0);
	string string1 = "DP_LS_SF_Robe_F01";
	string string2 = "DP_LS_SF_Robe_F02";
	string string3 = "DP_LS_SF_Robe_F03";
	string string4 = "DP_LS_SF_Robe_F04";
	string string5 = "DP_LS_SF_Robe_F05";
	string string6 = "DP_LS_SF_Robe_F06";
	string string7 = "DP_LS_SF_Robe_F07";
	string string8 = "DP_LS_SF_Robe_F08";
	string string9 = "DP_LS_SF_Robe_F09";
	string string10 = "DP_LS_SF_Robe_F10";
	string string11 = "DP_LS_SF_Robe_F11";
	string string12 = "DP_LS_SF_Robe_F12";
	string string13 = "DP_LS_SF_Robe_F13";
	string string14 = "DP_LS_SF_Robe_F14";
	string string15 = "DP_LS_SF_Robe_F15";
	string string16 = "g_a_mstrrobe07";
	effect efVisual = EffectVisualEffect(1046, 0);
	effect effect3 = EffectVisualEffect(2041, 0);
	sub1(6.5);
	int int1 = GetAppearanceType(OBJECT_SELF); // Get the PC's appearance
	if (int1 == 91 && int1 <= 93) {
		// If P_FEM_A_01, SML, MED, or LRG
		SetLocked(oSta_armor_container, 0);
		AssignCommand(oSta_armor_container, ClearAllEffects());
		CreateItemOnObject(string1, oSta_armor_container, 1);
		DelayCommand(1.4, PlaySound("v_pro_resfrc"));
		DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
		DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
		DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
	}
	else {
		if (int1 == 94 && int1 <= 96) {
			// If P_FEM_A_02, SML, MED, or LRG
			SetLocked(oSta_armor_container, 0);
			AssignCommand(oSta_armor_container, ClearAllEffects());
			CreateItemOnObject(string2, oSta_armor_container, 1);
			DelayCommand(1.4, PlaySound("v_pro_resfrc"));
			DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
			DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
			DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
		}
	else {
		if (int1 == 97 && int1 <= 99) {
			// If P_FEM_A_03, SML, MED, or LRG
			SetLocked(oSta_armor_container, 0);
			AssignCommand(oSta_armor_container, ClearAllEffects());
			CreateItemOnObject(string3, oSta_armor_container, 1);
			DelayCommand(1.4, PlaySound("v_pro_resfrc"));
			DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
			DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
			DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
		}
	else {
		if (int1 == 100 && int1 <= 102) {
			// If P_FEM_A_04, SML, MED, or LRG
			SetLocked(oSta_armor_container, 0);
			AssignCommand(oSta_armor_container, ClearAllEffects());
			CreateItemOnObject(string4, oSta_armor_container, 1);
			DelayCommand(1.4, PlaySound("v_pro_resfrc"));
			DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
			DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
			DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
		}
	else {
		if (int1 == 103 && int1 <= 105) {
			// If P_FEM_A_05, SML, MED, or LRG
			SetLocked(oSta_armor_container, 0);
			AssignCommand(oSta_armor_container, ClearAllEffects());
			CreateItemOnObject(string5, oSta_armor_container, 1);
			DelayCommand(1.4, PlaySound("v_pro_resfrc"));
			DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
			DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
			DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
		}
		//
		//
		//ETC, REPEATED FOR THE 5 BLACK AND 5 CAUCASIAN FEMALE HEADS
		//
		//
	else {
			// Player is male
			SetLocked(oSta_armor_container, 0);
			AssignCommand(oSta_armor_container, ClearAllEffects());
			CreateItemOnObject(string16, oSta_armor_container, 1);
			DelayCommand(1.4, PlaySound("v_pro_resfrc"));
			DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
			DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
			DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
		}
}}}}}

 

This would be replicated for the other script, just with the resrefs for the DS robes.

 

For those familiar with scripting, how does this look? It compiles, but that doesn't necessarily mean it is correct.

Share this post


Link to post
Share on other sites

The script should work, but it can be modified to be a bit cleaner/less redundant. the only bit of code that really needs to change is your uti resref:

 

 

 

// Globals
	int intGLOB_1 = 0;
	int intGLOB_2 = 1;
	int intGLOB_3 = 2;
	int intGLOB_4 = 3;
	int intGLOB_5 = 4;
	int intGLOB_6 = 5;
	int intGLOB_7 = 6;
	int intGLOB_8 = 7;
	int intGLOB_9 = 8;
	int intGLOB_10 = 9;
	int intGLOB_11 = 10;
	int intGLOB_12 = 11;
	int intGLOB_13 = 12;
	int intGLOB_14 = 13;
	int intGLOB_15 = 14;
	int intGLOB_16 = 15;
	int intGLOB_17 = 16;
	int intGLOB_18 = 17;
	int intGLOB_19 = 18;
	int intGLOB_20 = 19;
	int intGLOB_21 = 1100;
	int intGLOB_22 = (-6);
	int intGLOB_23 = (-5);
	int intGLOB_24 = (-4);
	int intGLOB_25 = (-2);
	int intGLOB_26 = (-1);
	int intGLOB_27 = 0;

// Prototypes
void sub1(float floatParam1);

void sub1(float floatParam1) {
	ActionPauseConversation();
	DelayCommand(floatParam1, ActionResumeConversation());
}

void main() {
	object oSta_force_cage = GetObjectByTag("sta_force_cage", 0);
	object oSta_armor_container = GetObjectByTag("sta_armor_container", 0);
	string string1;
	effect efVisual = EffectVisualEffect(1046, 0);
	effect effect3 = EffectVisualEffect(2041, 0);
	sub1(6.5);
	int int1 = GetAppearanceType(OBJECT_SELF); // Get the PC's appearance
	if (int1 == 91 && int1 <= 93) {
		// If P_FEM_A_01, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F01";
	}
	else if (int1 == 94 && int1 <= 96) {
		// If P_FEM_A_02, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F02";
	}
	else if (int1 == 97 && int1 <= 99) {
		// If P_FEM_A_03, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F03";
	}
	else if (int1 == 100 && int1 <= 102) {
		// If P_FEM_A_04, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F04";
	}
	else if (int1 == 103 && int1 <= 105) {
		// If P_FEM_A_05, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F05";
	}
		//
		//
		//ETC, REPEATED FOR THE 5 BLACK AND 5 CAUCASIAN FEMALE HEADS
		//
		//
	else {
		// Player is male
		string1 = "g_a_mstrrobe07";
	}

	SetLocked(oSta_armor_container, 0);
	AssignCommand(oSta_armor_container, ClearAllEffects());
	CreateItemOnObject(string1, oSta_armor_container, 1);
	DelayCommand(1.4, PlaySound("v_pro_resfrc"));
	DelayCommand(1.5, ApplyEffectAtLocation(0, efVisual, GetLocation(oSta_armor_container), 0.0));
	DelayCommand(3.5, ApplyEffectToObject(2, effect3, oSta_armor_container, 0.0));
	DelayCommand(2.5, AssignCommand(oSta_force_cage, PlayAnimation(202, 1.0, 0.0)));
}

 

 

  • Like 1

Share this post


Link to post
Share on other sites

Well, I still don't understand why does the female Star Forge robe model use the male animations.

Share this post


Link to post
Share on other sites

The script should work, but it can be modified to be a bit cleaner/less redundant. the only bit of code that really needs to change is your uti resref:

Thanks for the cleanup. Being clueless about scripting, I have to cobble together chunks lifted from whatever relevant examples I can find. Your version is much more elegant.

 

Well, I still don't understand why does the female Star Forge robe model use the male animations.

Because that's all that exists for the flowing robes. Sithspecter took the male animations and added keyframes for the belts and cape by hand for each individual one.

Share this post


Link to post
Share on other sites

Thanks for the cleanup. Being clueless about scripting, I have to cobble together chunks lifted from whatever relevant examples I can find. Your version is much more elegant.

 

 

Because that's all that exists for the flowing robes.

So perhaps N_DarthRevanF could be adjusted with a belt and cape from a male model, keeping the shape of the original body model.

 

But if this is much harder done than said, and cutting parts of the models isn't as easy as it sounds (I really have no idea how hard is this, I only know that rotating a model in GMax is very hard), disregard my suggestion.

Share this post


Link to post
Share on other sites

So perhaps N_DarthRevanF could be adjusted with a belt and cape from a male model, keeping the shape of the original body model.

 

But if this is much harder done than said, and cutting parts of the models isn't as easy as it sounds (I really have no idea how hard is this, I only know that rotating a model in GMax is very hard), disregard my suggestion.

The belt and cape already are from a male model. There is only one body model for caped Revan, the only difference is the reveal scene version has the mask mostly scooped out so a head can fit in. The only reason that N_DarthRevanF exists is precisely because of the head issue I explained earlier. It sets the super as S_Female03 to avoid this. But the belts and cloak have no animations besides the mask removal cutscene animation.

 

That's all irrelevant though. The point is the unique male and female animations like idles, walking, etc. are completely different. The bodies are in completely different poses. Even if you merged in SS's keyframes for the cape and belts to a body using the female animations, you are left with a mess because the animations are for completely different poses.

Share this post


Link to post
Share on other sites

I see you are having problems regarding the female version of it, but allow me to tell you this mod you are working on is absolutely wonderful. I can't wait to see it finished.

 

I got an idea: Since the male version is (If I understand it right) complete, why don't you release it now, and then when the female version is complete, you update the mod or release it as a different one?

 

Do that and, a lot of people will be very happy (Myself included XD).

Share this post


Link to post
Share on other sites

Darth Parametric has been so patient with all of the requests.  To those making the flurry of requests in this thread, might I ask you to be as patient as well?  I am sure if he has questions about something, he'll let you know.

  • Like 5

Share this post


Link to post
Share on other sites

^^ Yah just be patient. This mod is a request to begin with. It takes a back seat to the other projects of DP and/or anyone else who takes it upon themselves to give this a shot.

Share this post


Link to post
Share on other sites

So I'm in the process of testing and it seems like the game is reading my scripts and works as intended for a male player, but when I tried editing the save to change to a female, it seems like it didn't register the changed sex. I still got the vanilla item (I confirmed this by editing the script and changing the UTI, it's the last one in the script, intended for males). I'm not sure if this is a problem with the save, or a problem with the script. I can't find any Star Forge saves for a "real" female character to confirm, but surely if I edited the gender flag and appearance value, that should be enough?

Share this post


Link to post
Share on other sites

Yeah, that should be enough, but I realized I overlooked something when you had your script up here for examination. All of your UTI resrefs are 17 characters long, when the game only accepts 16.

Share this post


Link to post
Share on other sites

Okay, looking at my redo of the script, I made a rather severe typo that got carried over through all the iterations. I'll show it on the first example:

 

This:

	if (int1 == 91 && int1 <= 93) {
		// If P_FEM_A_01, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F01";
	}

Is read by the game as "If they have appearance.2da row 91 AND their appearance.2da row is less than or equal to 93, proceed."

 

What it should be:

	if (int1 >= 91 && int1 <= 93) {
		// If P_FEM_A_01, SML, MED, or LRG
		string1 = "DP_LS_SF_Robe_F01";
	}

This now translates to "if they have an appearance.2da row that is equal to or between 91 and 93, proceed."

Share this post


Link to post
Share on other sites

I ended up going with individual S/M/L models, so there is just a single appearance ID per iteration.

 

	int int1 = GetAppearanceType(OBJECT_SELF); // Get the PC's appearance
	if (int1 == 91) {
		// If P_FEM_A_SML_01
		string1 = "DP_RevRobe_FA1S";
	}
	else if (int1 == 92) {
		// If P_FEM_A_MED_01
		string1 = "DP_RevRobe_FA1M";
	}
	else if (int1 == 93) {
		// If P_FEM_A_LRG_01
		string1 = "DP_RevRobe_FA1L";
	}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.