I would first suggest you limit it a bit more some how. other wise every char_update it will be doing one or the other. Id just have it transform at one specified time and untransform at one specified time.

No point in doing the rest if not transformed. And I figure this is so he doesn't have to manually add in on mob creation to transform if need be etc... so he wants it to auto update to how it needs to be.

Alright I have two skills for this race one is called
final flash and the other is called final shine.
For some reason the mud doesn't recognize final shine as a skill when typed. Even though its fully installed, it will think I am trying to use final flash. I have typed it everyway I know and I guess it doesn't recognize ' or " either.

So I have typed it
final shine <-thinks I mean final flash
'final shine' <- says huh?
"final shine" <- says huh?

I know this problem is in check_skill or in interp.c But I have no idea where the first place to look would be....

here is the part of check_skill for it. I know its because it thinks a space means its done searching, but I am unsure how to fix that and I am unsure if the whole argument (both words) is being sent to check skill to begin with....

open up the skills.dat and search for the skills and put a ' around the name for each and then it will know the difference. like in the skills.dat it should have them as 'final flash' and 'final shine'

the simplest way is to just add the 's around it. Haven't looked to see the best way around it, but after just a quick glance i didn't see anything that would make it so typing 'final shine' would keep it from working.

and yeah I know that would be the simplest way to do things, but if I could figure out whats causing it, because it didn't used too then my life would be alot easier and wouldn't have to deal with players complaining... Another way I guess would be by making do_alist remove the ' ' from the skill name display not sure how I would do that though...

If your skill system were old school (DikuMUD), you'd be typing "use final shine" or "use 'final shine'", and all would be fine. I suspect the newer parser is keying on the first word to determine if it's a command first, and then if that fails, it walks the sorted list of skills until if finds a match for that word.

If the list is sorted alphabetically (usualy the case, so you can do binary searches instead of a linear walk), of course "final" will match "final flash" before "final shine".

Your solution options are these:

1) Change the parser so it finds the first match and then checks subsequent whitespace dlimited words to see if it's also a match, continuing if not until it hits something that's no longer a match on the first word.

The simplest way would be to have the initial pass collect ALL possible matches and sort them by length, longest first. Then just match the whole skill name against the substring of the full command typed until it matches or falls through. You will have to normalize whitespace on the user input for this, otherwise players will whine when "final shine" doesn't work because they had multiple spaces or tabs or whatever.

2) Change the parser so it no longer uses a binary search (if it does), and hand-sort the skill list into whatever order makes logical sense to YOU and your players. In essence, put "final shine" before "final flash" so typing "final" will linear-search to the one you want it to hit. Prepare for players who expect things to be alphabetical to complain when it no longer makes sense to THEM.

3) Change your parser so it doesn't try to complete skills by themselves, and add a "use" command back in. You may want to add aliases (or commands) for some common skills like "kick" or "bash".

4) If your game has aliases built-in, just add system-wide aliases so "final" expands to "final shine"... same issue with player confusion as (2), but less coding.

I can't tell you for sure. In *MY* codebase, it's the function command_interpreter() in the file interpret.c. It uses search_block() to identify a valid command, and if that fails, it falls through to check_exit_alias(), and then i3_command_hook(), imc_command_hook(), and finally random_error_message() if nothing was matched.

However, since my MUD started as DikuMUD Alfa, and evolved over 15 years or so, I suspect you'll find a very different layout in your codebase.