Mystery Skill Assignment

Can anyone out there give me an idea why when a feat is assigned to a character through the FeatAdd command, that all of a sudden that character now has Perform as a Class Skill? This is a Wizard getting assigned this feat by way of the FeatAdd command. Also, I have the same script assigning almost the same feat through the same script, just for different Classes, like the Sorcerer. I have debugged this problem to death and cannot lock down why suddenly, the Perform Skill is now a Class Skill for this Wizard once the Feat has been assigned. Any ideas out there?

Which feat?

What feat code are you using?

What’s in your override?

1 Like

The feat involved is Extra Slot Wizard Level 1 (may not be the exact label). Here’s the thing, however. I recently discovered that the Extra Slot feats did not actually work correctly. They were not providing the spellcaster with the intended spell slot. This might have been a result of the Level 40 cap remover from Clangeddin, which I only use to level 40, not beyond (got instructions on how to do that directly from the horse’s mouth, so to speak). As a resule, I got a lot of help from Kevl_S in creating a script that in fact adds the Extra Slot Feat by adding the ItemProperty to an item called “empty_skin” that gets equipped to the character’s CARMOUR slot. This method works for every spellcasting character class with no issues. However, when I try to use the Deep Imaskari Subrace from Kaedrin’s PrC Pack, AND I make a Wizard with that race, when the feat gets added, suddenly the Wizard has Perform as a class skill. However, and here’s the best part, using the same race but instead making a sorcerer, when the Extra Slot feat gets added, in exactly the same manner as with the Wizard, it works fine. No Perform Skill for the Sorcerer. Thanx to Kevl_S, I have been able to figure out quite a lot when it comes to scripting. But for the life of me, this makes no sense. The same exact scripting checks are being made, the same processes, etc. The only difference is the actual feat, Extra Slot Wizard vs Extra Slot Sorcerer.

Even further testing: I decided to use any other race, make a Wizard, then use the console to add xp and level up, then select the Extra Slot 1 Feat naturally. Same problem. So it’s somehow related to the application of that specific feat. I tried selecting level 0 and level 2 before selecting level 1 and they were fine. I seriously cannot figure out why it is doing this. It makes no sense.

2 Likes

You have A LOT being merged together.

:slight_smile:

Worrying about scripting is just one piece of the pie.

May need to check the basics.

You’ll need to go over every multiple instances of files (.2da, .tlk, etc.), within the mods you’re using, to make sure their respective ranges/codes/pointers are correct.

Don’t forget about errant punctuation, carriage returns, etc…

Been a while since I’ve looked deeply into these mods, but I know some have added columns to .2da files.

Not an easy task, but not insurmountable.

I wish I had the time to help you out.

The only advice I can give is to continue forward with a clean directory, with only the files you’re going to work with:

Installing modules separately “-home” shortcut

1 Like

I know. Took me a while to go through each of the common .2da files so that there would be one unified .2da file for each of those files, Feat, spells, classes, etc… So I know that’s not the problem. As for going through so many checks, etc, there is only one location where these feats are being referenced. A separate script was made that adds the Extra Slot Feats as the character selects them upon levelup. Only the levelup script refers to the Extra Slot script, so there is no interaction anywhere else. Besides, it is only happening with the single Extra Slot Feat for Wizard level 1. Any of the other Extra Slot Feats for the Wizard do not cause this issue, just that one. Makes absolutely no logical sense that adding this feat suddenly makes Perform a Class Skill only if the character is a Wizard AND either selects or is gifted Extra Slot Wizard Level1. There are no other lines of code that would point to this. I just don’t get it.

And also, I’ve already done this. In fact, more than once. There was a time when I somehow screwed up the Rest feature in MotB. Turned out it was one little line of code that I added that was so innocuous, yet apparently very damaging. So, sifting through all of those things while merging these modules has been done, almost to a fault. This is something new that I can’t seem to pin down.

I even went as far as gifting an uncorrupted Wiard the Ring of Wazardry 1, which adds a bonus spell slot to level 1. Also, the way that the game adds this property to an item is effectively the way that KEvl_S came up with to add it to a character, simply placing it on the item in the CARMOUR slot. If there is no item, then one is created. It works, believe me. Except for this one thing.
Anyway, I gifted the Ring of Wizardry, equipped it, then leveled up. Perform was not added as a Class Skill. Leveled up again, still nothing. Leveled up a third time, still okay, then selected Extra Slot Level 1 for the Wizard. Leveled up a 4th time, and boom, Perform comes up as a Class Skill. Gameplay-wise, I know it isn’t a major issue. I simply won’t use that skill, especially since it does no good to the Wizard. It’s just an annoyance that it happens in this very specific instance only, and no other way. There has to be some way to figure this out, I just don’t know how anymore. I may not be an expert with scripting, but I am certainly no slouch. I have created and playtested numerous Spells, Feats, etc. with no problems, after working out any bugs. This one just eludes me.

(bangs head on wall repeatedly. my contractor is going to make a mint off of me!)

A gui problem, maybe? (Just grasping at straws)

Can you zip up what you have and maybe someone can take a look?

The only thing I can think to send is part of the script that is causing the issue. This first section is how the Wizard gets their Extra Slot Feats.


	//**********Wizard Start
	if (GetLevelByClass(CLASS_TYPE_WIZARD, oCaster) > 0)
	{
//		SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot Check.");
		int bArmorCreated = FALSE;
		int bIpAdded = FALSE;

//		object oArmor = GetItemInSlot(INVENTORY_SLOT_CARMOUR);
//		if (!GetIsObjectValid(oArmor))
//		{
//			bArmorCreated = TRUE;
//			oArmor = CreateItemOnObject("x2_it_emptyskin", OBJECT_SELF, 1, "", FALSE);
//		}

		int bLevel0 = FALSE;
		int bLevel1 = FALSE;
		int bLevel2 = FALSE;
		int bLevel3 = FALSE;
		int bLevel4 = FALSE;
		int bLevel5 = FALSE;
		int bLevel6 = FALSE;
		int bLevel7 = FALSE;
		int bLevel8 = FALSE;

		object oArmor = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oCaster);
		itemproperty ip = GetFirstItemProperty(oArmor);
		while (GetIsItemPropertyValid(ip))
		{
			if (GetItemPropertyType(ip) == ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N
				&& GetItemPropertySubType(ip) == CLASS_TYPE_WIZARD
				&& GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
			{
				switch (GetItemPropertyCostTableValue(ip))
				{
					case IP_CONST_SPELLLEVEL_0: bLevel0 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_1: bLevel1 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_2: bLevel2 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_3: bLevel3 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_4: bLevel4 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_5: bLevel5 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_6: bLevel6 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_7: bLevel7 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_8: bLevel8 = TRUE;
						break;
				}
			}
			ip = GetNextItemProperty(oArmor);
		}

		itemproperty ipBonus;
		if ((!GetIsObjectValid(oArmor)) && ((GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL0, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL1, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL2, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL3, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL4, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL5, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL6, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL7, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL8, oCaster))))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "No Creature Armor and has at least 1 Extra Slot Feat.");
			bArmorCreated = TRUE;
			oArmor = CreateItemOnObject("x2_it_emptyskin", oCaster, 1, "", FALSE);
		}

		if (!bLevel0 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL0))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 0 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 0);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel1 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL1))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 1 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 1);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel2 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL2))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 2 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 2);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel3 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL3))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 3 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 3);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel4 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL4))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 4 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 4);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel5 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL5))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 5 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 5);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel6 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL6))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 6 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 6);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel7 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL7))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 7 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 7);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel8 && GetHasFeat(FEAT_EXTRA_SLOT_WIZARD_LEVEL8))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Wizard Extra Slot 8 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_WIZARD, 8);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (bArmorCreated)
		{
			if (bIpAdded)
			{
				ActionEquipItem(oArmor, INVENTORY_SLOT_CARMOUR);
			}
			else
			{
				DestroyObject(oArmor, 0.1f, FALSE);
			}
		}
	}
	//**********Wizard End

This next section is how the sorcerer gets their Extra Slot Feats. This is for comparison to the Wizard section. I have already confirmed that the Sorcerer section works fine. But somehow, when assigning Extra Slot 1 for the Wizard, it adds Perform as a Class Skill. I don’t even know how to trigger such an event without multiclassing,


	//**********Sorcerer Start
	if (GetLevelByClass(CLASS_TYPE_SORCERER, oCaster) > 0)
	{
//		SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot Check.");
		int bArmorCreated = FALSE;
		int bIpAdded = FALSE;

//		object oArmor = GetItemInSlot(INVENTORY_SLOT_CARMOUR);
//		if (!GetIsObjectValid(oArmor))
//		{
//			bArmorCreated = TRUE;
//			oArmor = CreateItemOnObject("x2_it_emptyskin", OBJECT_SELF, 1, "", FALSE);
//		}

		int bLevel0 = FALSE;
		int bLevel1 = FALSE;
		int bLevel2 = FALSE;
		int bLevel3 = FALSE;
		int bLevel4 = FALSE;
		int bLevel5 = FALSE;
		int bLevel6 = FALSE;
		int bLevel7 = FALSE;
		int bLevel8 = FALSE;

		object oArmor = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oCaster);
		itemproperty ip = GetFirstItemProperty(oArmor);
		while (GetIsItemPropertyValid(ip))
		{
			if (GetItemPropertyType(ip) == ITEM_PROPERTY_BONUS_SPELL_SLOT_OF_LEVEL_N
				&& GetItemPropertySubType(ip) == CLASS_TYPE_SORCERER
				&& GetItemPropertyDurationType(ip) == DURATION_TYPE_PERMANENT)
			{
				switch (GetItemPropertyCostTableValue(ip))
				{
					case IP_CONST_SPELLLEVEL_0: bLevel0 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_1: bLevel1 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_2: bLevel2 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_3: bLevel3 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_4: bLevel4 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_5: bLevel5 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_6: bLevel6 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_7: bLevel7 = TRUE;
						break;

					case IP_CONST_SPELLLEVEL_8: bLevel8 = TRUE;
						break;
				}
			}
			ip = GetNextItemProperty(oArmor);
		}


		itemproperty ipBonus;
		if ((!GetIsObjectValid(oArmor)) && ((GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL0, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL1, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL2, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL3, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL4, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL5, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL6, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL7, oCaster))
			|| (GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL8, oCaster))))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "No Creature Armor and has at least 1 Extra Slot Feat.");
			bArmorCreated = TRUE;
			oArmor = CreateItemOnObject("x2_it_emptyskin", oCaster, 1, "", FALSE);
		}

		if (!bLevel0 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL0))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 0 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 0);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel1 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL1))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 1 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 1);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel2 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL2))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 2 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 2);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel3 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL3))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 3 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 3);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel4 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL4))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 4 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 4);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel5 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL5))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 5 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 5);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel6 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL6))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 6 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 6);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel7 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL7))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 7 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 7);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (!bLevel8 && GetHasFeat(FEAT_EXTRA_SLOT_SORCERER_LEVEL8))
		{
//			SendMessageToPC(GetFirstPC(FALSE), "Sorcerer Extra Slot 8 Added.");
			bIpAdded = TRUE;
			ipBonus = ItemPropertyBonusLevelSpell(IP_CONST_CLASS_SORCERER, 8);
			DelayCommand(0.2f, AddItemProperty(DURATION_TYPE_PERMANENT, ipBonus, oArmor));
		}

		if (bArmorCreated)
		{
			if (bIpAdded)
			{
				ActionEquipItem(oArmor, INVENTORY_SLOT_CARMOUR);
			}
			else
			{
				DestroyObject(oArmor, 0.1f, FALSE);
			}
		}
	}
	//**********Sorcerer End
1 Like

Anyone else out there have any ideas as to why a Perform suddenly becomes a Class Skill for a Wizard if they take the Extra Slot 1 Feat, which is implemented in the script in the post above this one. Any of the other Extra Slot feats can be taken without issue. Any other Class can take their equivalent of the same feat without issue.

Any ideas, no matter how off the wall, would be appreciated. I know that, playing the game myself, all I have to do is simply not add to that Skill, but if I get to a point where I want to somehow put my content additions/modifications out there for all to putz around with, I would like there to be as few issues as possible. Thanx to all who tried, and to all who may yet respond.

Probably constants overlapping in the 2Da files, or some screw up in NWScript.nss.

Many thing have been inherrited and complted from NWN1 without proper check up and it would require a lot of work to get everything straight, so everyone is dealing with it.

You could try to define a new “Extra Slot 1” Feat andsdisable the old one.

2 Likes

This issue is something new and unique. The Extra Slot feats actually don’t work correctly. That is why, with a great deal of help, a script had to be designed that allowed for the Extra Slot feat to be added to the character correctly. Only the Extra Slot 1 feat for Wizard is causing Perform to suddenly become a Class Skill for the Wizard. I can’t seem to figure out how only that one is causing the problem. Any other Extra Slot feat, regardless of level or class, does not cause such a problem. Just doesn’t make any sense.

1 Like

How big would the file be if you zipped up your override directory?

Are you using any hak files?

To answer your question, I am not certain how large the file would be. I am using some mods that I have added to the game, but I have also added quite a bit of my own content, as well as modified a huge amount of what I downloaded. I have Kaedrin’s PrC Pack, which I have modified heavily, the SoZ Holiday expansion, NWN2Fixes, Level 40 Cap Remover of Clangeddin’s, TCC - most updated version, Mage Tome - all of it, Level Scaling Challenge, Rod of the Shopkeeper, Random Loot Generator. I painstakingly went through each and every one of these items very carefully so they could each be fully integrated without causing any issue with anything else I had. Took me quite a long time. So I know that there is nothing there that could be causing issues. Any overlapping files of any kind were looked at and combined so they woul work correctly. I just don’t know what is going on here.

And now, I have come across the problem with another Skill. When I give my Earth Genasi Cleric that has the Animal and War Domains the Skill Focus: Survival Feat, all of a sudden Tumble becomes a Class Skill. None of this makes any sense.

Maybe I should try figuring this out in a different way. Without multiclassing, how would a character be able to make a non-class Skill into a class Skill? For Instance: How would a Wizard be able to make Perform into a Class Skill? Is there some kind of scripting or scripting flag that could cause this to happen? Is it possible to reach into the Class Skill list in the 2da file and change it just for that character, but not change the 2da file itself?
I know I’m grasping at straws here - paper ones, in the water - But I just don’t know which way to go here. Any thoughts would be very groovy.

Note: I already tried looking at an older override directory that I had backed up, but no dice. the problem was there also. I would have to go back farther than April 30th to see where the problem could be, except that I probably putzed around with most everything since then, so ther wouldn’t be anything really for me to look at by date.
Also, I have heavily modified even the base characters, changing their Skill lists to be more appropriate, in my opinion. The only character that has Perform as a Class Skill, in my override, is the Bard. So I have no idea how the Wizard is getting it when the Extra Slot I feat is being added. (Remember, kevL_S created a script so the feats would be added and work correctly. I discovered that they actually don’t work correctly, and I went back to the base game, no override folder or level cal modifier, to check that out.)

(pounds head against wall)