Yes it is possible, I did it without porting the interface for my old server.You don't need to edit the binary to have 1 talent per level, you can override the interface display.
There are systems in TC which teach you spells if one is learned. It might be a little bit hacky, but one way are ranks. In world.spell_ranks you may add any spell X as rank 2 of spell Y. Which means that by learning spell X you will always get spell Y. Problem is with unlearning spell Y, that will remain after unlearning X.There is also another possibility. There are plenty of spells which have only one effect - they learn a spell to target. So you might have spell which learns you some more spells which might learn you even more spells which will be your spells for class specialization. But again, unlearning all those spells won't be probably so simple at all.This problem just yells for custom core script. DB and DBC systems probably can't make this work very well.
Well, that was obvious from start, wasn't it?
function PlayerTalentFrameTalent_OnClick(self, button) if ( IsModifiedClick("CHATLINK") ) then local link = GetTalentLink(PanelTemplates_GetSelectedTab(PlayerTalentFrame), self:GetID(), PlayerTalentFrame.inspect, PlayerTalentFrame.pet, PlayerTalentFrame.talentGroup, GetCVarBool("previewTalents")); if ( link ) then ChatEdit_InsertLink(link); end elseif ( selectedSpec and (activeSpec == selectedSpec or specs[selectedSpec].pet) ) then -- only allow functionality if an active spec is selected if ( button == "LeftButton" ) then if ( GetCVarBool("previewTalents") ) then AddPreviewTalentPoints(PanelTemplates_GetSelectedTab(PlayerTalentFrame), self:GetID(), 1, PlayerTalentFrame.pet, PlayerTalentFrame.talentGroup); else LearnTalent(PanelTemplates_GetSelectedTab(PlayerTalentFrame), self:GetID(), PlayerTalentFrame.pet, PlayerTalentFrame.talentGroup); end elseif ( button == "RightButton" ) then if ( GetCVarBool("previewTalents") ) then AddPreviewTalentPoints(PanelTemplates_GetSelectedTab(PlayerTalentFrame), self:GetID(), -1, PlayerTalentFrame.pet, PlayerTalentFrame.talentGroup); end end endend