Item data loading completed.

master
sigonasr2 1 year ago
parent 1811120eed
commit 36756885e3
  1. 49
      FiestaOnlineEditor/FiestaOnlineEditor.cpp
  2. 1
      FiestaOnlineEditor/FiestaOnlineEditor.h
  3. 78
      FiestaOnlineEditor/ItemEditor.cpp
  4. 36
      FiestaOnlineEditor/ItemEditor.h
  5. 12
      FiestaOnlineEditor/OpenFileDialog.cpp
  6. 3
      FiestaOnlineEditor/OpenFileDialog.h
  7. 2
      FiestaOnlineEditor/State.h
  8. 4
      FiestaOnlineEditor/assets/program.txt

@ -76,7 +76,7 @@ bool FiestaOnlineEditor::OnUserUpdate(float fElapsedTime){
manager.OnRight();
}
if (GetKey(X).bPressed){
if(appState!=LOADFOLDER){
if(appState!=LOADFOLDER&&appState!=LOADFILE){
manager.OnBack();
}
}
@ -92,13 +92,23 @@ bool FiestaOnlineEditor::OnUserUpdate(float fElapsedTime){
}break;
case CHANGE_LOAD_PATH:{
selectedPath.push_back(selectedPath.back()+"/"+selected->GetName());
dialog.ChangePath(selectedPath.back());
manager.Open(&dialog.GetMenu());
if(appState==LOADFOLDER){
dialog.ChangePath(selectedPath.back());
manager.Open(&dialog.GetMenu());
} else {
filePickerDialog.ChangePath(selectedPath.back());
manager.Open(&filePickerDialog.GetMenu());
}
}break;
case GO_BACK:{
selectedPath.pop_back();
dialog.ChangePath(selectedPath.back());
manager.Open(&dialog.GetMenu());
if(appState==LOADFOLDER){
dialog.ChangePath(selectedPath.back());
manager.Open(&dialog.GetMenu());
} else {
filePickerDialog.ChangePath(selectedPath.back());
manager.Open(&filePickerDialog.GetMenu());
}
}break;
case SELECTED_FOLDER:{
std::cout<<selectedPath.back()<<std::endl;
@ -107,15 +117,22 @@ bool FiestaOnlineEditor::OnUserUpdate(float fElapsedTime){
} else
if(pickFileState==CLIENTDIR){
config["ClientPath"].SetString(selectedPath.back());
} else
if(pickFileState==IMAGEMAGICKEXE){
config["ImageMagickEXE"].SetString(selectedPath.back()+"/"+selected->GetName());
}
utils::datafile::Write(config,"assets/program.txt");
manager.Close();
InitializePathSelection();
}break;
case LOAD_ITEM_EDITOR:{
ItemEditor*itemEditor=new ItemEditor(this,"Item Editor: "+config["DefaultPath"].GetString(),{32,32},GetScreenSize()-vi2d{64,64});
bool reloadImages=true;
if(config["ItemEditorImagesCached"].GetInt()==1){
reloadImages=false;
}
ItemEditor*itemEditor=new ItemEditor(this,"Item Editor: "+config["DefaultPath"].GetString(),{32,32},GetScreenSize()-vi2d{64,64},reloadImages);
CreateWindow(itemEditor);
itemEditor->Load(config["DefaultPath"].GetString(),config["ClientPath"].GetString());
itemEditor->Load(config["DefaultPath"].GetString(),config["ClientPath"].GetString(),config["ImageMagickEXE"].GetString());
manager.Close();
menuOpened=false;
}break;
@ -140,7 +157,7 @@ bool FiestaOnlineEditor::OnUserUpdate(float fElapsedTime){
SetDrawTarget(1);
//BACKGROUND DRAWING
if(appState==LOADFOLDER){
if(appState==LOADFOLDER||appState==LOADFILE){
switch(pickFileState){
case SHINEDIR:{
DrawString({2,2},"Choose the Shine file directory:");
@ -148,6 +165,9 @@ bool FiestaOnlineEditor::OnUserUpdate(float fElapsedTime){
case CLIENTDIR:{
DrawString({2,2},"Choose the Client file directory:");
}break;
case IMAGEMAGICKEXE:{
DrawString({2,2},"Choose the Image Magick Executable:");
}break;
}
}
@ -231,10 +251,6 @@ void FiestaOnlineEditor::CreateWindow(Window*window){
}
void FiestaOnlineEditor::InitializePathSelection(){
if(config.HasProperty("DefaultPath")&&config.HasProperty("ClientPath")){
appState=MENUSELECT;
manager.Open(&menu);
} else
if(!config.HasProperty("DefaultPath")){
pickFileState=SHINEDIR;
manager.Open(&dialog.GetMenu());
@ -242,6 +258,15 @@ void FiestaOnlineEditor::InitializePathSelection(){
if(!config.HasProperty("ClientPath")){
pickFileState=CLIENTDIR;
manager.Open(&dialog.GetMenu());
} else
if(!config.HasProperty("ImageMagickEXE")){
pickFileState=IMAGEMAGICKEXE;
appState=LOADFILE;
manager.Open(&filePickerDialog.GetMenu());
} else {
//We have all properties we need. Start using program.
appState=MENUSELECT;
manager.Open(&menu);
}
}

@ -12,6 +12,7 @@ class FiestaOnlineEditor : public olc::PixelGameEngine
popup::Manager manager;
Sprite*sprMenu;
OpenFileDialog dialog;
OpenFileDialog filePickerDialog{false};
std::list<std::string>selectedPath;
float lastPressedTime=0;
State appState=LOADFOLDER;

@ -14,15 +14,16 @@ Money::Money(uint32_t money)
Item::Item(){}
ItemEditor::ItemEditor(FiestaOnlineEditor*pge,std::string windowTitle,vi2d pos,vi2d size)
:Window(pge,windowTitle,pos,size){}
ItemEditor::ItemEditor(FiestaOnlineEditor*pge,std::string windowTitle,vi2d pos,vi2d size,bool reloadImages)
:Window(pge,windowTitle,pos,size),reloadImages(reloadImages){}
ItemEditor::~ItemEditor(){};
void ItemEditor::Load(std::string basePath,std::string clientPath){
void ItemEditor::Load(std::string basePath,std::string clientPath,std::string imageMagickPath){
ItemInfo.Load(basePath+"/ItemInfo.shn");
ItemInfoServer.Load(basePath+"/ItemInfoServer.shn");
ItemViewInfo.Load(basePath+"/View/ItemViewInfo.shn");
GradeItemOption.Load(basePath+"/GradeItemOption.shn");
for(int i=0;i<ItemInfo.Rows();i++){
Item it;
it.id=ItemInfo.Get<uint16_t>(i,0);
@ -48,9 +49,76 @@ void ItemEditor::Load(std::string basePath,std::string clientPath){
it.useClass=Class(ItemInfo.Get<uint32_t>(i,31));
it.buyPrice=Money(ItemInfo.Get<uint32_t>(i,32));
it.sellPrice=Money(ItemInfo.Get<uint32_t>(i,33));
it.enhanceLimit=ItemInfo.Get<uint32_t>(i,40);
it.enhanceLimit=ItemInfo.Get<byte>(i,40);
it.blockRate=ItemInfo.Get<uint32_t>(i,46);
itemList[it.id]=it;
itemList[it.inxName]=it;
}
for(int i=0;i<ItemInfoServer.Rows();i++){
std::string index=ItemInfoServer.Get<std::string>(i,1);
Item&it=itemList[index];
it.DropGroupA=ItemInfoServer.Get<std::string>(i,4);
it.DropGroupB=ItemInfoServer.Get<std::string>(i,5);
it.RandomOptionDrop=ItemInfoServer.Get<std::string>(i,6);
it.vanishTime=ItemInfoServer.Get<uint32_t>(i,7);
it.lootingTime=ItemInfoServer.Get<uint32_t>(i,8);
it.slot=EquipSlot(ItemInfoServer.Get<uint32_t>(i,11));
}
for(int i=0;i<ItemViewInfo.Rows();i++){
std::string index=ItemViewInfo.Get<std::string>(i,1);
Item&it=itemList[index];
it.iconIndex=ItemViewInfo.Get<uint32_t>(i,2);
std::string iconFilename=ItemViewInfo.Get<std::string>(i,3);
auto GetImage=[&](std::string filename){
if (imgLookup.count(filename)==0){
std::string basePath = clientPath+"/resmenu/Icon/";
if(reloadImages){
std::string baseCmd = "\""+imageMagickPath+"\" "+basePath+filename+".dds "+basePath+filename+".png";
std::system(baseCmd.c_str());
}
imgLookup[filename]=std::make_unique<Renderable>();
imgLookup[filename]->Load(basePath+filename+".png");
}
return imgLookup[filename].get();
};
it.icon=GetImage(iconFilename);
it.subIconIndex=ItemViewInfo.Get<uint32_t>(i,4);
std::string subIconFilename=ItemViewInfo.Get<std::string>(i,5);
if(subIconFilename!="-"){
it.subIcon=GetImage(subIconFilename);
}
uint32_t r=ItemViewInfo.Get<uint32_t>(i,8);
uint32_t g=ItemViewInfo.Get<uint32_t>(i,9);
uint32_t b=ItemViewInfo.Get<uint32_t>(i,10);
it.borderCol={uint8_t(r),uint8_t(g),uint8_t(b)};
uint32_t blend_r=ItemViewInfo.Get<uint32_t>(i,11);
uint32_t blend_g=ItemViewInfo.Get<uint32_t>(i,12);
uint32_t blend_b=ItemViewInfo.Get<uint32_t>(i,13);
it.blendCol={uint8_t(blend_r),uint8_t(blend_g),uint8_t(blend_b)};
it.itemSize=ItemViewInfo.Get<float>(i,19);
it.description=ItemViewInfo.Get<std::string>(i,26);
}
for(int i=0;i<GradeItemOption.Rows();i++){
std::string index=GradeItemOption.Get<std::string>(i,0);
Item&it=itemList[index];
it.stat_str=GradeItemOption.Get<uint16_t>(i,1);
it.stat_end=GradeItemOption.Get<uint16_t>(i,2);
it.stat_dex=GradeItemOption.Get<uint16_t>(i,3);
it.stat_int=GradeItemOption.Get<uint16_t>(i,4);
it.stat_spr=GradeItemOption.Get<uint16_t>(i,5);
it.resistPoison=GradeItemOption.Get<uint16_t>(i,6);
it.resistDisease=GradeItemOption.Get<uint16_t>(i,7);
it.resistCurse=GradeItemOption.Get<uint16_t>(i,8);
it.hitRatePctModifier=GradeItemOption.Get<uint16_t>(i,10);
it.blockRatePctModifier=GradeItemOption.Get<uint16_t>(i,11);
it.stat_hp=GradeItemOption.Get<uint16_t>(i,12);
it.stat_sp=GradeItemOption.Get<uint16_t>(i,13);
it.stat_dmg=GradeItemOption.Get<uint16_t>(i,14);
it.stat_magDmg=GradeItemOption.Get<uint16_t>(i,15);
}
}

@ -100,10 +100,14 @@ enum ItemGrade{
class Item{
public:
uint16_t id;
Renderable*icon;
Renderable*icon=nullptr;
Renderable*subIcon=nullptr;
std::string inxName;
std::string name;
std::string description;
std::string DropGroupA;
std::string DropGroupB;
std::string RandomOptionDrop;
EquipSlot slot;
uint32_t lvReq;
uint32_t iconIndex;
@ -113,6 +117,8 @@ public:
Money buyPrice;
Money sellPrice;
ItemGrade grade;
uint32_t vanishTime;
uint32_t lootingTime;
Pixel borderCol;
Pixel blendCol;
uint32_t attackSpd;
@ -129,21 +135,37 @@ public:
uint32_t magAtkPctBonus;
uint32_t magDefPctBonus;
uint32_t critRate;
uint32_t enhanceLimit;
byte enhanceLimit;
uint32_t blockRate;
float itemSize;
uint16_t stat_str=0;
uint16_t stat_end=0;
uint16_t stat_dex=0;
uint16_t stat_int=0;
uint16_t stat_spr=0;
uint16_t resistPoison=0;
uint16_t resistDisease=0;
uint16_t resistCurse=0;
uint16_t hitRatePctModifier=1000;
uint16_t blockRatePctModifier=1000;
uint16_t stat_hp=0;
uint16_t stat_sp=0;
uint16_t stat_dmg=0;
uint16_t stat_magDmg=0;
public:
Item();
};
class ItemEditor:public Window{
SHNFile ItemInfo,ItemInfoServer,ItemViewInfo;
SHNFile ItemInfo,ItemInfoServer,ItemViewInfo,GradeItemOption;
vf2d pos={64,64};
std::map<std::string,Renderable>imgLookup;
std::map<int,Item>itemList;
std::map<std::string,std::unique_ptr<Renderable>>imgLookup;
std::map<std::string,Item>itemList;
bool reloadImages;
public:
ItemEditor(FiestaOnlineEditor*pge,std::string windowTitle,vi2d pos,vi2d size);
ItemEditor(FiestaOnlineEditor*pge,std::string windowTitle,vi2d pos,vi2d size,bool reloadImages=true);
~ItemEditor();
void Load(std::string basePath,std::string clientPath);
void Load(std::string basePath,std::string clientPath,std::string imageMagickPath);
void Refresh(FiestaOnlineEditor*pge)override;
void Update(FiestaOnlineEditor*pge,float fElapsedTime)override;
void MouseFocus(FiestaOnlineEditor*pge)override;

@ -1,7 +1,8 @@
#include "OpenFileDialog.h"
#include "ActionIDs.h"
OpenFileDialog::OpenFileDialog(){
OpenFileDialog::OpenFileDialog(bool foldersOnly)
:foldersOnly(foldersOnly){
BuildMenu();
}
popup::Menu&OpenFileDialog::GetMenu(){
@ -18,7 +19,10 @@ void OpenFileDialog::ChangePath(std::string newPath){
void OpenFileDialog::BuildMenu(){
menu.Clear();
menu["Select "+path].SetID(SELECTED_FOLDER);
menu["Select "+path];
if(foldersOnly){
menu["Select "+path].SetID(SELECTED_FOLDER);
}
menu[""].Enable(false);
if(path!="/"){
menu[".."].SetID(GO_BACK);
@ -27,6 +31,10 @@ void OpenFileDialog::BuildMenu(){
if(dir.is_directory()){
std::filesystem::path filename = dir.path().filename();
menu[filename.string()].SetID(CHANGE_LOAD_PATH);
} else
if(!foldersOnly&&dir.is_regular_file()){
std::filesystem::path filename = dir.path().filename();
menu[filename.string()].SetID(SELECTED_FOLDER);
}
}
menu.SetTable(1,std::min(20,menu.GetChildrenCount()));

@ -5,8 +5,9 @@
class OpenFileDialog{
popup::Menu menu;
std::string path="/";
bool foldersOnly=true;
public:
OpenFileDialog();
OpenFileDialog(bool foldersOnly=true);
popup::Menu&GetMenu();
void ChangePath(std::string newPath);
void BuildMenu();

@ -1,6 +1,7 @@
#pragma once
enum State{
LOADFOLDER,
LOADFILE,
MENUSELECT,
ITEMEDIT,
MOBEDIT,
@ -9,4 +10,5 @@ enum State{
enum PickState{
SHINEDIR,
CLIENTDIR,
IMAGEMAGICKEXE,
};

@ -1,2 +1,6 @@
DefaultPath = /Users/sigon/Documents/NA2016-main/Server/9Data/Shine
ClientPath = /Users/sigon/Documents/NA2016-main/Client
ImageMagickEXE = /Program Files/ImageMagick-7.1.1-Q16-HDRI/magick.exe
# You can set this to 0 to reload the images for the item editor. Once they are converted to png files, it doesn't have to be done again unless something changes.
ItemEditorImagesCached = 1
Loading…
Cancel
Save