Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. CHARACTER_FACING_INCREMENT = 2;
  2. MAX_RACES = 10;
  3. MAX_CLASSES_PER_RACE = 10;
  4. NUM_CHAR_CUSTOMIZATIONS = 5;
  5. MIN_CHAR_NAME_LENGTH = 2;
  6. CHARACTER_CREATE_ROTATION_START_X = nil;
  7. CHARACTER_CREATE_INITIAL_FACING = nil;
  8.  
  9. PAID_CHARACTER_CUSTOMIZATION = nil;
  10. PAID_FACTION_CHANGE = nil;
  11.  
  12. FACTION_BACKDROP_COLOR_TABLE = {
  13.     ["Alliance"] = {0.5, 0.5, 0.5, 0.09, 0.09, 0.19},
  14.     ["Horde"] = {0.5, 0.2, 0.2, 0.19, 0.05, 0.05},
  15. };
  16. FRAMES_TO_BACKDROP_COLOR = {
  17.     "CharacterCreateCharacterRace",
  18.     "CharacterCreateCharacterClass",
  19.     "CharacterCreateCharacterFaction",
  20. };
  21. RACE_ICON_TCOORDS = {
  22.     ["HUMAN_MALE"]      = {0, 0.125, 0, 0.25},
  23.     ["DWARF_MALE"]      = {0.125, 0.25, 0, 0.25},
  24.     ["GNOME_MALE"]      = {0.25, 0.375, 0, 0.25},
  25.     ["NIGHTELF_MALE"]   = {0.375, 0.5, 0, 0.25},
  26.    
  27.     ["TAUREN_MALE"]     = {0, 0.125, 0.25, 0.5},
  28.     ["SCOURGE_MALE"]    = {0.125, 0.25, 0.25, 0.5},
  29.     ["TROLL_MALE"]      = {0.25, 0.375, 0.25, 0.5},
  30.     ["ORC_MALE"]        = {0.375, 0.5, 0.25, 0.5},
  31.  
  32.     ["HUMAN_FEMALE"]    = {0, 0.125, 0.5, 0.75},  
  33.     ["DWARF_FEMALE"]    = {0.125, 0.25, 0.5, 0.75},
  34.     ["GNOME_FEMALE"]    = {0.25, 0.375, 0.5, 0.75},
  35.     ["NIGHTELF_FEMALE"] = {0.375, 0.5, 0.5, 0.75},
  36.    
  37.     ["TAUREN_FEMALE"]   = {0, 0.125, 0.75, 1.0},  
  38.     ["SCOURGE_FEMALE"]  = {0.125, 0.25, 0.75, 1.0},
  39.     ["TROLL_FEMALE"]    = {0.25, 0.375, 0.75, 1.0},
  40.     ["ORC_FEMALE"]      = {0.375, 0.5, 0.75, 1.0},
  41.  
  42.     ["BLOODELF_MALE"]   = {0.5, 0.625, 0.25, 0.5},
  43.     ["BLOODELF_FEMALE"] = {0.5, 0.625, 0.75, 1.0},
  44.  
  45.     ["DRAENEI_MALE"]    = {0.5, 0.625, 0, 0.25},
  46.     ["DRAENEI_FEMALE"]  = {0.5, 0.625, 0.5, 0.75},
  47. };
  48. CLASS_ICON_TCOORDS = {
  49.     ["WARRIOR"] = {0, 0.25, 0, 0.25},
  50.     ["MAGE"]    = {0.25, 0.49609375, 0, 0.25},
  51.     ["ROGUE"]   = {0.49609375, 0.7421875, 0, 0.25},
  52.     ["DRUID"]   = {0.7421875, 0.98828125, 0, 0.25},
  53.     ["HUNTER"]  = {0, 0.25, 0.25, 0.5},
  54.     ["SHAMAN"]  = {0.25, 0.49609375, 0.25, 0.5},
  55.     ["PRIEST"]  = {0.49609375, 0.7421875, 0.25, 0.5},
  56.     ["WARLOCK"] = {0.7421875, 0.98828125, 0.25, 0.5},
  57.     ["PALADIN"] = {0, 0.25, 0.5, 0.75},
  58.     ["DEATHKNIGHT"] = {0.25, 0.49609375, 0.5, 0.75},
  59.     ["BloodMage"]   = {0.25, 0.49609375, 0.5, 0.75},
  60. };
  61.  
  62. function CharacterCreate_OnLoad(self)
  63.     self:SetSequence(0);
  64.     self:SetCamera(0);
  65.  
  66.     CharacterCreate.numRaces = 0;
  67.     CharacterCreate.selectedRace = 0;
  68.     CharacterCreate.numClasses = 0;
  69.     CharacterCreate.selectedClass = 0;
  70.     CharacterCreate.selectedGender = 0;
  71.  
  72.     SetCharCustomizeFrame("CharacterCreate");
  73.     --CharCreateModel:SetLight(1, 0, 0, -0.707, -0.707, 0.7, 1.0, 1.0, 1.0, 0.8, 1.0, 1.0, 0.8);
  74.  
  75.     for i=1, NUM_CHAR_CUSTOMIZATIONS, 1 do
  76.         _G["CharacterCustomizationButtonFrame"..i.."Text"]:SetText(_G["CHAR_CUSTOMIZATION"..i.."_DESC"]);
  77.     end
  78.  
  79.     -- Color edit box backdrop
  80.     local backdropColor = FACTION_BACKDROP_COLOR_TABLE["Alliance"];
  81.     CharacterCreateNameEdit:SetBackdropBorderColor(backdropColor[1], backdropColor[2], backdropColor[3]);
  82.     CharacterCreateNameEdit:SetBackdropColor(backdropColor[4], backdropColor[5], backdropColor[6]);
  83. end
  84.  
  85. function CharacterCreate_OnShow()
  86.     for i=1, MAX_CLASSES_PER_RACE, 1 do
  87.         local button = _G["CharacterCreateClassButton"..i];
  88.         button:Enable();
  89.         SetButtonDesaturated(button, false)
  90.     end
  91.     for i=1, MAX_RACES, 1 do
  92.         local button = _G["CharacterCreateRaceButton"..i];
  93.         button:Enable();
  94.         SetButtonDesaturated(button, false)
  95.     end
  96.  
  97.     if ( PAID_FACTION_CHANGE ) then
  98.         CustomizeExistingCharacter( PAID_FACTION_CHANGE );
  99.         CharacterCreateNameEdit:SetText( PaidChange_GetName() );
  100.     elseif ( PAID_CHARACTER_CUSTOMIZATION ) then
  101.         CustomizeExistingCharacter( PAID_CHARACTER_CUSTOMIZATION );
  102.         CharacterCreateNameEdit:SetText( PaidChange_GetName() );
  103.     else
  104.         --randomly selects a combination
  105.         ResetCharCustomize();
  106.         CharacterCreateNameEdit:SetText("");
  107.         CharCreateRandomizeButton:Show();
  108.     end
  109.  
  110.     CharacterCreateEnumerateRaces(GetAvailableRaces());
  111.     SetCharacterRace(GetSelectedRace());
  112.    
  113.     CharacterCreateEnumerateClasses(GetClassesForRace());
  114.     if ( PAID_FACTION_CHANGE or PAID_CHARACTER_CUSTOMIZATION ) then
  115.         _,_,index = GetSelectedClass();
  116.         SetCharacterClass(index);
  117.     else
  118.         SetCharacterClass(1);
  119.     end
  120.  
  121.     SetCharacterGender(GetSelectedSex())
  122.    
  123.     -- Hair customization stuff
  124.     CharacterCreate_UpdateFacialHairCustomization();
  125.     CharacterCreate_UpdateHairCustomization();
  126.  
  127.     SetCharacterCreateFacing(-15);
  128.    
  129.     if ( ALLOW_RANDOM_NAME_BUTTON ) then
  130.         CharacterCreateRandomName:Show();
  131.     end
  132.    
  133.     -- setup customization
  134.     CharacterChangeFixup();
  135. end
  136.  
  137. function CharacterCreate_OnHide()
  138.     PAID_FACTION_CHANGE = nil;
  139.     PAID_CHARACTER_CUSTOMIZATION = nil;
  140. end
  141.  
  142. function CharacterCreateFrame_OnMouseDown(button)
  143.     if ( button == "LeftButton" ) then
  144.         CHARACTER_CREATE_ROTATION_START_X = GetCursorPosition();
  145.         CHARACTER_CREATE_INITIAL_FACING = GetCharacterCreateFacing();
  146.     end
  147. end
  148.  
  149. function CharacterCreateFrame_OnMouseUp(button)
  150.     if ( button == "LeftButton" ) then
  151.         CHARACTER_CREATE_ROTATION_START_X = nil
  152.     end
  153. end
  154.  
  155. function CharacterCreateFrame_OnUpdate()
  156.     if ( CHARACTER_CREATE_ROTATION_START_X ) then
  157.         local x = GetCursorPosition();
  158.         local diff = (x - CHARACTER_CREATE_ROTATION_START_X) * CHARACTER_ROTATION_CONSTANT;
  159.         CHARACTER_CREATE_ROTATION_START_X = GetCursorPosition();
  160.         SetCharacterCreateFacing(GetCharacterCreateFacing() + diff);
  161.     end
  162. end
  163.  
  164. function CharacterCreateEnumerateRaces(...)
  165.     CharacterCreate.numRaces = select("#", ...)/3;
  166.     if ( CharacterCreate.numRaces > MAX_RACES ) then
  167.         message("Too many races!  Update MAX_RACES");
  168.         return;
  169.     end
  170.     local coords;
  171.     local index = 1;
  172.     local button;
  173.     local gender;
  174.     local selectedSex = GetSelectedSex();
  175.     if ( selectedSex == SEX_MALE ) then
  176.         gender = "MALE";
  177.     elseif ( selectedSex == SEX_FEMALE ) then
  178.         gender = "FEMALE";
  179.     end
  180.     for i=1, select("#", ...), 3 do
  181.         coords = RACE_ICON_TCOORDS[strupper(select(i+1, ...).."_"..gender)];
  182.         _G["CharacterCreateRaceButton"..index.."NormalTexture"]:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
  183.         button = _G["CharacterCreateRaceButton"..index];
  184.         button:Show();
  185.         if ( select(i+2, ...) == 1 ) then
  186.             button.enable = true;
  187.             SetButtonDesaturated(button);
  188.             button.tooltip = select(i, ...);
  189.         else
  190.             button.enable = false;
  191.             SetButtonDesaturated(button, 1);
  192.             button.tooltip = _G[strupper(select(i+1, ...).."_".."DISABLED")];
  193.         end
  194.         index = index + 1;
  195.     end
  196.     for i=CharacterCreate.numRaces + 1, MAX_RACES, 1 do
  197.         _G["CharacterCreateRaceButton"..i]:Hide();
  198.     end
  199. end
  200.  
  201. function CharacterCreateEnumerateClasses(...)
  202.     CharacterCreate.numClasses = select("#", ...)/3;
  203.     if ( CharacterCreate.numClasses > MAX_CLASSES_PER_RACE ) then
  204.         message("Too many classes!  Update MAX_CLASSES_PER_RACE");
  205.         return;
  206.     end
  207.     local coords;
  208.     local index = 1;
  209.     local button;
  210.     for i=1, select("#", ...), 3 do
  211.         coords = CLASS_ICON_TCOORDS[strupper(select(i+1, ...))];
  212.         _G["CharacterCreateClassButton"..index.."NormalTexture"]:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
  213.         button = _G["CharacterCreateClassButton"..index];
  214.         button:Show();
  215.         if ( select(i+2, ...) == 1 ) then
  216.             button.enable = true;
  217.             SetButtonDesaturated(button);
  218.             button.tooltip = select(i, ...);
  219.         else
  220.             button.enable = false;
  221.             SetButtonDesaturated(button, 1);
  222.             button.tooltip = _G[strupper(select(i+1, ...).."_".."DISABLED")];
  223.         end
  224.         index = index + 1;
  225.     end
  226.     for i=CharacterCreate.numClasses + 1, MAX_CLASSES_PER_RACE, 1 do
  227.         _G["CharacterCreateClassButton"..i]:Hide();
  228.     end
  229. end
  230.  
  231. function SetCharacterRace(id)
  232.     CharacterCreate.selectedRace = id;
  233.     for i=1, CharacterCreate.numRaces, 1 do
  234.         local button = _G["CharacterCreateRaceButton"..i];
  235.         if ( i == id ) then
  236.             _G["CharacterCreateRaceButton"..i.."HighlightText"]:SetText(button.tooltip);
  237.             button:SetChecked(1);
  238.             button:LockHighlight();
  239.         else
  240.             _G["CharacterCreateRaceButton"..i.."HighlightText"]:SetText("");
  241.             button:SetChecked(0);
  242.             button:UnlockHighlight();
  243.         end
  244.     end
  245.  
  246.     -- Set Faction
  247.     local name, faction = GetFactionForRace(CharacterCreate.selectedRace);
  248.     if ( faction == "Alliance" ) then
  249.         CharacterCreateFactionIcon:SetTexCoord(0, 0.5, 0, 1.0);
  250.     else
  251.         CharacterCreateFactionIcon:SetTexCoord(0.5, 1.0, 0, 1.0);
  252.     end
  253.     CharacterCreateFactionScrollFrameScrollBar:SetValue(0);
  254.     CharacterCreateFactionLabel:SetText(name);
  255.     CharacterCreateFactionText:SetText(_G["FACTION_INFO_"..strupper(faction)]);
  256.  
  257.     -- Set Race
  258.     local race, fileString = GetNameForRace();
  259.     CharacterCreateRaceLabel:SetText(race);
  260.     fileString = strupper(fileString);
  261.     if ( GetSelectedSex() == 1 ) then
  262.         gender = "MALE";
  263.     else
  264.         gender = "FEMALE";
  265.     end
  266.     local coords = RACE_ICON_TCOORDS[fileString.."_"..gender];
  267.     CharacterCreateRaceIcon:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
  268.     local raceText = _G["RACE_INFO_"..fileString];
  269.     local abilityIndex = 1;
  270.     local tempText = _G["ABILITY_INFO_"..fileString..abilityIndex];
  271.     abilityText = "";
  272.     while ( tempText ) do
  273.         abilityText = abilityText..tempText..
  274.         "\n\n";
  275.         abilityIndex = abilityIndex + 1;
  276.         tempText = _G["ABILITY_INFO_"..fileString..abilityIndex];
  277.     end
  278.  
  279.     CharacterCreateRaceScrollFrameScrollBar:SetValue(0);
  280.     CharacterCreateRaceText:SetText(GetFlavorText("RACE_INFO_"..strupper(fileString), GetSelectedSex()));
  281.     if ( abilityText and abilityText ~= "" ) then
  282.         CharacterCreateRaceAbilityText:SetText(abilityText);
  283.     else
  284.         CharacterCreateRaceAbilityText:SetText("");
  285.     end
  286.  
  287.     -- Set backdrop colors based on faction
  288.     local backdropColor = FACTION_BACKDROP_COLOR_TABLE[faction];
  289.     local frame;
  290.     for index, value in pairs(FRAMES_TO_BACKDROP_COLOR) do
  291.         frame = _G[value];
  292.         frame:SetBackdropColor(backdropColor[4], backdropColor[5], backdropColor[6]);
  293.     end
  294.  
  295.     local _, classFilename = GetSelectedClass();
  296.     if (classFilename == "DEATHKNIGHT" ) then
  297.         fileString = classFilename;
  298.     end
  299.     SetBackgroundModel(CharacterCreate, fileString);
  300. end
  301.  
  302. function SetCharacterClass(id)
  303.     CharacterCreate.selectedClass = id;
  304.     for i=1, CharacterCreate.numClasses, 1 do
  305.         local button = _G["CharacterCreateClassButton"..i];
  306.         if ( i == id ) then
  307. --          _G["CharacterCreateClassButton"..i.."HighlightText"]:SetText(button.tooltip);
  308.             CharacterCreateClassName:SetText(button.tooltip);
  309.             button:SetChecked(1);
  310.             button:LockHighlight();
  311.         else
  312. --          _G["CharacterCreateClassButton"..i.."HighlightText"]:SetText("");
  313.             button:UnlockHighlight();
  314.             button:SetChecked(0);
  315.         end
  316.     end
  317.    
  318.     local className, classFileName = GetSelectedClass();
  319.     local coords = CLASS_ICON_TCOORDS[classFileName];
  320.     CharacterCreateClassIcon:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
  321.     CharacterCreateClassLabel:SetText(className);
  322.     CharacterCreateClassScrollFrameScrollBar:SetValue(0);
  323.     CharacterCreateClassText:SetText(GetFlavorText("CLASS_"..strupper(classFileName), GetSelectedSex()));
  324. end
  325.  
  326. function CharacterCreate_OnChar()
  327. end
  328.  
  329. function CharacterCreate_OnKeyDown(key)
  330.     if ( key == "ESCAPE" ) then
  331.         CharacterCreate_Back();
  332.     elseif ( key == "ENTER" ) then
  333.         CharacterCreate_Okay();
  334.     elseif ( key == "PRINTSCREEN" ) then
  335.         Screenshot();
  336.     end
  337. end
  338.  
  339. function CharacterCreate_UpdateModel(self)
  340.     UpdateCustomizationScene();
  341.     self:AdvanceTime();
  342. end
  343.  
  344. function CharacterCreate_Okay()
  345.     if ( PAID_FACTION_CHANGE ) then
  346.         GlueDialog_Show("CONFIRM_PFC");
  347.     elseif ( PAID_CHARACTER_CUSTOMIZATION ) then
  348.         GlueDialog_Show("CONFIRM_PCC");
  349.     else
  350.         CreateCharacter(CharacterCreateNameEdit:GetText());
  351.     end
  352.     PlaySound("gsCharacterCreationCreateChar");
  353. end
  354.  
  355. function CharacterCreate_Back()
  356.     PlaySound("gsCharacterCreationCancel");
  357.     SetGlueScreen("charselect");
  358. end
  359.  
  360. function CharacterClass_OnClick(id)
  361.     PlaySound("gsCharacterCreationClass");
  362.     local _,_,currClass = GetSelectedClass();
  363.     if ( currClass ~= id ) then
  364.         SetSelectedClass(id);
  365.         SetCharacterClass(id);
  366.         SetCharacterRace(GetSelectedRace());
  367.         CharacterChangeFixup();
  368.     end
  369. end
  370.  
  371. function CharacterRace_OnClick(self, id)
  372.     PlaySound("gsCharacterCreationClass");
  373.     if ( not self:GetChecked() ) then
  374.         self:SetChecked(1);
  375.         return;
  376.     end
  377.     if ( GetSelectedRace() ~= id ) then
  378.         SetSelectedRace(id);
  379.         SetCharacterRace(id);
  380.         SetSelectedSex(GetSelectedSex());
  381.         SetCharacterCreateFacing(-15);
  382.         CharacterCreateEnumerateClasses(GetClassesForRace());
  383.         if ( PAID_FACTION_CHANGE or PAID_CHARACTER_CUSTOMIZATION ) then
  384.             local classIndex = PFC_GetCurrentClassIndex();
  385.             SetSelectedClass(classIndex);
  386.             SetCharacterClass(classIndex);
  387.             SetCharacterGender( GetSelectedSex() );
  388.         else
  389.             SetCharacterClass(1);
  390.         end
  391.         -- Hair customization stuff
  392.         CharacterCreate_UpdateFacialHairCustomization();
  393.         CharacterCreate_UpdateHairCustomization();
  394.            
  395.         CharacterChangeFixup();
  396.     end
  397. end
  398.  
  399. function SetCharacterGender(sex)
  400.     local gender;
  401.     SetSelectedSex(sex);
  402.     if ( sex == SEX_MALE ) then
  403.         gender = "MALE";
  404.         CharacterCreateGenderButtonMaleHighlightText:SetText(MALE);
  405.         CharacterCreateGenderButtonMale:SetChecked(1);
  406.         CharacterCreateGenderButtonMale:LockHighlight();
  407.         CharacterCreateGenderButtonFemaleHighlightText:SetText("");
  408.         CharacterCreateGenderButtonFemale:SetChecked(nil);
  409.         CharacterCreateGenderButtonFemale:UnlockHighlight();
  410.     elseif ( sex == SEX_FEMALE ) then
  411.         gender = "FEMALE";
  412.         CharacterCreateGenderButtonMaleHighlightText:SetText("");
  413.         CharacterCreateGenderButtonMale:SetChecked(nil);
  414.         CharacterCreateGenderButtonMale:UnlockHighlight();
  415.         CharacterCreateGenderButtonFemaleHighlightText:SetText(FEMALE);
  416.         CharacterCreateGenderButtonFemale:SetChecked(1);
  417.         CharacterCreateGenderButtonFemale:LockHighlight();
  418.     end
  419.  
  420.     -- Update race images to reflect gender
  421.     CharacterCreateEnumerateRaces(GetAvailableRaces());
  422.     CharacterCreateEnumerateClasses(GetClassesForRace());
  423.     SetCharacterRace(GetSelectedRace());
  424.     if ( PAID_FACTION_CHANGE or PAID_CHARACTER_CUSTOMIZATION ) then
  425.         local classIndex = PFC_GetCurrentClassIndex();
  426.         SetSelectedClass(classIndex);
  427.         SetCharacterClass(classIndex);
  428.     else
  429.         SetCharacterClass(CharacterCreate.selectedClass);
  430.     end
  431.  
  432.     -- Update facial hair customization since gender can affect this
  433.     CharacterCreate_UpdateFacialHairCustomization();
  434.     CharacterCreate_UpdateHairCustomization();
  435.  
  436.     -- Update right hand race portrait to reflect gender change
  437.     -- Set Race
  438.     local race, fileString = GetNameForRace();
  439.     CharacterCreateRaceLabel:SetText(race);
  440.     fileString = strupper(fileString);
  441.     local coords = RACE_ICON_TCOORDS[fileString.."_"..gender];
  442.     CharacterCreateRaceIcon:SetTexCoord(coords[1], coords[2], coords[3], coords[4]);
  443.    
  444.     CharacterChangeFixup();
  445. end
  446.  
  447. function CharacterCustomization_Left(id)
  448.     PlaySound("gsCharacterCreationLook");
  449.     CycleCharCustomization(id, -1);
  450. end
  451.  
  452. function CharacterCustomization_Right(id)
  453.     PlaySound("gsCharacterCreationLook");
  454.     CycleCharCustomization(id, 1);
  455. end
  456.  
  457. function CharacterCreate_Randomize()
  458.     PlaySound("gsCharacterCreationLook");
  459.     RandomizeCharCustomization();
  460. end
  461.  
  462. function CharacterCreateRotateRight_OnUpdate(self)
  463.     if ( self:GetButtonState() == "PUSHED" ) then
  464.         SetCharacterCreateFacing(GetCharacterCreateFacing() + CHARACTER_FACING_INCREMENT);
  465.     end
  466. end
  467.  
  468. function CharacterCreateRotateLeft_OnUpdate(self)
  469.     if ( self:GetButtonState() == "PUSHED" ) then
  470.         SetCharacterCreateFacing(GetCharacterCreateFacing() - CHARACTER_FACING_INCREMENT);
  471.     end
  472. end
  473.  
  474. function CharacterCreate_UpdateFacialHairCustomization()
  475.     if ( GetFacialHairCustomization() == "NONE" ) then
  476.         CharacterCustomizationButtonFrame5:Hide();
  477.         CharCreateRandomizeButton:SetPoint("TOP", "CharacterCustomizationButtonFrame5", "BOTTOM", 0, -5);
  478.     else
  479.         CharacterCustomizationButtonFrame5Text:SetText(_G["FACIAL_HAIR_"..GetFacialHairCustomization()]);      
  480.         CharacterCustomizationButtonFrame5:Show();
  481.         CharCreateRandomizeButton:SetPoint("TOP", "CharacterCustomizationButtonFrame5", "BOTTOM", 0, -5);
  482.     end
  483. end
  484.  
  485. function CharacterCreate_UpdateHairCustomization()
  486.     CharacterCustomizationButtonFrame3Text:SetText(_G["HAIR_"..GetHairCustomization().."_STYLE"]);
  487.     CharacterCustomizationButtonFrame4Text:SetText(_G["HAIR_"..GetHairCustomization().."_COLOR"]);
  488. end
  489.  
  490. function SetButtonDesaturated(button, desaturated, r, g, b)
  491.     if ( not button ) then
  492.         return;
  493.     end
  494.     local icon = button:GetNormalTexture();
  495.     if ( not icon ) then
  496.         return;
  497.     end
  498.     local shaderSupported = icon:SetDesaturated(desaturated);
  499.  
  500.     if ( not desaturated ) then
  501.         r = 1.0;
  502.         g = 1.0;
  503.         b = 1.0;
  504.     elseif ( not r or not shaderSupported ) then
  505.         r = 0.5;
  506.         g = 0.5;
  507.         b = 0.5;
  508.     end
  509.    
  510.     icon:SetVertexColor(r, g, b);
  511. end
  512.  
  513. function GetFlavorText(tagname, sex)
  514.     local primary, secondary;
  515.     if ( sex == 1 ) then
  516.         primary = "";
  517.         secondary = "_FEMALE";
  518.     else
  519.         primary = "_FEMALE";
  520.         secondary = "";
  521.     end
  522.     local text = _G[tagname..primary];
  523.     if ( (text == nil) or (text == "") ) then
  524.         text = _G[tagname..secondary];
  525.     end
  526.     return text;
  527. end
  528.  
  529. function CharacterCreate_DeathKnightSwap(self)
  530.     local _, classFilename = GetSelectedClass();
  531.     if ( classFilename == "DEATHKNIGHT" ) then
  532.         if (self.currentModel ~= "DEATHKNIGHT") then
  533.             self.currentModel = "DEATHKNIGHT";
  534.             self:SetNormalTexture("Interface\\Glues\\Common\\Glue-Panel-Button-Up-Blue");
  535.             self:SetPushedTexture("Interface\\Glues\\Common\\Glue-Panel-Button-Down-Blue");
  536.             self:SetHighlightTexture("Interface\\Glues\\Common\\Glue-Panel-Button-Highlight-Blue");
  537.         end
  538.     else
  539.         if (self.currentModel == "DEATHKNIGHT") then
  540.             self.currentModel = nil;
  541.             self:SetNormalTexture("Interface\\Glues\\Common\\Glue-Panel-Button-Up");
  542.             self:SetPushedTexture("Interface\\Glues\\Common\\Glue-Panel-Button-Down");
  543.             self:SetHighlightTexture("Interface\\Glues\\Common\\Glue-Panel-Button-Highlight");
  544.         end
  545.     end
  546. end
  547.  
  548. function CharacterChangeFixup()
  549.     if ( PAID_FACTION_CHANGE or PAID_CHARACTER_CUSTOMIZATION ) then
  550.         for i=1, MAX_CLASSES_PER_RACE, 1 do
  551.             if (CharacterCreate.selectedClass ~= i) then
  552.                 local button = _G["CharacterCreateClassButton"..i];
  553.                 button:Disable();
  554.                 SetButtonDesaturated(button, true)
  555.             end
  556.         end
  557.  
  558.         for i=1, MAX_RACES, 1 do
  559.             local allow = false;
  560.             if ( PAID_FACTION_CHANGE ) then
  561.                 local faction = GetFactionForRace(PFC_GetCurrentRaceIndex());
  562.                 if ( (i == PFC_GetCurrentRaceIndex()) or (i == PFC_GetPreviousRaceIndex()) or ((PFC_GetPreviousRaceIndex() == 0 and GetFactionForRace(i) ~= faction) and (IsRaceClassValid(i,CharacterCreate.selectedClass))) ) then
  563.                     allow = true;
  564.                 end
  565.             elseif ( PAID_CHARACTER_CUSTOMIZATION ) then
  566.                 if ( i == CharacterCreate.selectedRace ) then
  567.                     allow = true
  568.                 end
  569.             end
  570.             if (not allow) then
  571.                 local button = _G["CharacterCreateRaceButton"..i];
  572.                 button:Disable();
  573.                 SetButtonDesaturated(button, true)
  574.             end
  575.         end
  576.     end
  577. end