|
|
|
#pragma once
|
|
|
|
#include "Crawler.h"
|
|
|
|
#include "DEFINES.h"
|
|
|
|
#include "Menu.h"
|
|
|
|
#include "MenuLabel.h"
|
|
|
|
#include "MenuAnimatedIconToggleButton.h"
|
|
|
|
#include "GameState.h"
|
|
|
|
|
|
|
|
INCLUDE_game
|
|
|
|
typedef Attribute A;
|
|
|
|
|
|
|
|
void Menu::InitializeClassSelectionWindow(){
|
|
|
|
Menu*classSelectionWindow=CreateMenu(CLASS_SELECTION,CENTERED,game->GetScreenSize()-vi2d{24,24});
|
|
|
|
|
|
|
|
classSelectionWindow->S(A::CLASS_SELECTION)="Warrior"; //Default selected class.
|
|
|
|
|
|
|
|
vf2d outlineSize=classSelectionWindow->size-vf2d{13,13};
|
|
|
|
|
|
|
|
MenuLabel*classSelectionLabel=new MenuLabel(CLASS_SELECTION,{{4,20},{outlineSize.x,32}},"Choose a Character Class",2,true,true,true,true);
|
|
|
|
classSelectionWindow->AddComponent("Class Selection Title Label",classSelectionLabel);
|
|
|
|
|
|
|
|
MenuLabel*outline=new MenuLabel(CLASS_SELECTION,{{4,4},outlineSize},"",1,true,false,true,false);
|
|
|
|
|
|
|
|
classSelectionWindow->AddComponent("Outline Border",outline);
|
|
|
|
|
|
|
|
vf2d navigationButtonSize={24*2.5f,16};
|
|
|
|
|
|
|
|
MenuComponent*backButton=new MenuComponent(CLASS_SELECTION,{{4+2,outlineSize.y+4-navigationButtonSize.y-2},navigationButtonSize},"Back",[](MenuFuncData data){Menu::CloseMenu();});
|
|
|
|
classSelectionWindow->AddComponent("Back Button",backButton);
|
|
|
|
MenuComponent*confirmButton=new MenuComponent(CLASS_SELECTION,{{outlineSize.x+4-navigationButtonSize.x-2,outlineSize.y+4-navigationButtonSize.y-2},navigationButtonSize},"Confirm",[](MenuFuncData data){
|
|
|
|
std::string selectedClass=data.component->S(A::CLASS_SELECTION);
|
|
|
|
INCLUDE_DATA
|
|
|
|
std::vector<std::string>classList=DATA["class_list"].GetValues();
|
|
|
|
auto it=std::find(classList.begin(),classList.end(),selectedClass);
|
|
|
|
int element=std::distance(classList.begin(),it);
|
|
|
|
Class cl=Class(1<<element);
|
|
|
|
data.game->ChangePlayerClass(cl);
|
|
|
|
GameState::ChangeState(States::GAME_RUN);
|
|
|
|
});
|
|
|
|
confirmButton->disabled=true;
|
|
|
|
classSelectionWindow->AddComponent("Confirm",confirmButton);
|
|
|
|
|
|
|
|
vf2d buttonPadding={2,2};
|
|
|
|
vf2d buttonSize={floor(outlineSize.y/3-buttonPadding.y*3),outlineSize.y/9-buttonPadding.y*3}; //The floor is for fixing a small pixel rounding bug.
|
|
|
|
|
|
|
|
float buttonTotalWidth=(buttonSize.x+buttonPadding.x)*3;
|
|
|
|
|
|
|
|
vf2d buttonStartPos=outline->GetPos()+vf2d{outlineSize.x/2,outlineSize.y/3}-vf2d{buttonTotalWidth/2,0};
|
|
|
|
|
|
|
|
std::array<std::string,6>classNames={
|
|
|
|
Warrior::name,
|
|
|
|
Ranger::name,
|
|
|
|
Wizard::name,
|
|
|
|
Thief::name,
|
|
|
|
Trapper::name,
|
|
|
|
Witch::name,
|
|
|
|
};
|
|
|
|
std::array<std::string,6>classAnimationNames={
|
|
|
|
Warrior::walk_s,
|
|
|
|
Ranger::walk_s,
|
|
|
|
Wizard::walk_s,
|
|
|
|
Thief::walk_s,
|
|
|
|
Trapper::walk_s,
|
|
|
|
Witch::walk_s,
|
|
|
|
};
|
|
|
|
|
|
|
|
std::vector<IToggleable*>toggleGroup;
|
|
|
|
|
|
|
|
for(int i=0;i<6;i++){
|
|
|
|
std::string className=classNames[i];
|
|
|
|
std::string classAnimationName=classAnimationNames[i];
|
|
|
|
vf2d offsetPos={
|
|
|
|
buttonStartPos.x+(buttonSize.x+buttonPadding.x)*float(i%3),
|
|
|
|
buttonStartPos.y+(buttonSize.y+buttonPadding.y+2*outlineSize.y/9)*float(i/3)+2*outlineSize.y/9,
|
|
|
|
};
|
|
|
|
vf2d backgroundOffsetPos={
|
|
|
|
buttonStartPos.x+(buttonSize.x+buttonPadding.x)*float(i%3),
|
|
|
|
buttonStartPos.y+(buttonSize.y+buttonPadding.y+2*outlineSize.y/9)*float(i/3),
|
|
|
|
};
|
|
|
|
vf2d backgroundSize={floor(outlineSize.y/3-buttonPadding.y*3),outlineSize.y/3-buttonPadding.y*3}; //The floor is for fixing a small pixel rounding bug.
|
|
|
|
MenuLabel*backgroundOutline=new MenuLabel(CLASS_SELECTION,{backgroundOffsetPos,backgroundSize},"",1,true,false,true,true);
|
|
|
|
MenuLabel*classLabel=new MenuLabel(CLASS_SELECTION,{backgroundOffsetPos,buttonSize},className,1,true,true);
|
|
|
|
MenuAnimatedIconToggleButton*classSprite=new MenuAnimatedIconToggleButton(CLASS_SELECTION,{backgroundOffsetPos+vf2d{0,12},backgroundSize+vf2d{0,-buttonSize.y-12}},classAnimationName,[](MenuFuncData data){
|
|
|
|
data.menu.components["Confirm"]->Enable(true);
|
|
|
|
data.menu.components["Confirm"]->S(A::CLASS_SELECTION)=data.component->S(A::CLASS_SELECTION);
|
|
|
|
});
|
|
|
|
toggleGroup.push_back(classSprite);
|
|
|
|
MenuComponent*classButton=new MenuComponent(CLASS_SELECTION,{offsetPos,buttonSize},"Info",CLASS_INFO,
|
|
|
|
[](MenuFuncData data){
|
|
|
|
data.menu.S(A::CLASS_SELECTION)=data.component->S(A::CLASS_SELECTION);
|
|
|
|
delete Menu::menus[CLASS_INFO];
|
|
|
|
Menu::InitializeClassInfoWindow();
|
|
|
|
});
|
|
|
|
classSprite->S(A::CLASS_SELECTION)=classButton->S(A::CLASS_SELECTION)=className;
|
|
|
|
classSelectionWindow->AddComponent(className+" Button",classButton);
|
|
|
|
classSelectionWindow->AddComponent(className+" Background",backgroundOutline);
|
|
|
|
classSelectionWindow->AddComponent(className+" Label",classLabel);
|
|
|
|
classSelectionWindow->AddComponent(className+" Icon",classSprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
for(IToggleable*item:toggleGroup){
|
|
|
|
item->SetToggleGroup(toggleGroup);
|
|
|
|
}
|
|
|
|
}
|