diff options
-rw-r--r-- | src/game.cpp | 24 | ||||
-rw-r--r-- | src/graphic/graphic.cpp | 19 | ||||
-rw-r--r-- | src/graphic/graphic.h | 1 | ||||
-rw-r--r-- | src/gui/skill.cpp | 224 | ||||
-rw-r--r-- | src/gui/skill.h | 49 |
5 files changed, 171 insertions, 146 deletions
diff --git a/src/game.cpp b/src/game.cpp index 82973850..78cc7552 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -345,7 +345,8 @@ bool handle_key(int unicode, int scancode) } return true; case KEY_K: - show_skill_list_dialog = !show_skill_dialog; + //show_skill_list_dialog = !show_skill_dialog; + skillDialog->setVisible(!skillDialog->isVisible()); return true; } } @@ -656,7 +657,7 @@ void do_parse() { break; case 0x000c: char_info->skill_point = RFIFOW(4); - sprintf(skill_points, "Skill points: %i", char_info->skill_point); + skillDialog->setPoints(char_info->skill_point); break; case 0x0037: char_info->job_lv = RFIFOW(4); @@ -857,25 +858,22 @@ void do_parse() { sprintf(pkt_nfo, "%i %i %i %i", RFIFOL(2), RFIFOW(6), RFIFOW(8), RFIFOW(10)); //alert(pkt_nfo,"","","","",0,0); break; - // Skill list + // Skill list TAG case 0x010f: - //n_skills = 0; + { + int n_skills = (len - 4) / 37; //SKILL *temp_skill = NULL; - //n_skills = (len-4)/37; for(int k=0;k<(len-4)/37;k++) { if(RFIFOW(4+k*37+6)!=0 || RFIFOB(4+k*37+36)!=0) { - SKILL *temp_skill = is_skill(RFIFOW(4+k*37)); - if(temp_skill) { - temp_skill->lv = RFIFOW(4+k*37+6); - temp_skill->sp = RFIFOW(4+k*37+36); - if(temp_skill->sp<0)temp_skill->sp = 0; + int skillId = RFIFOW(4+k*37); + if(skillDialog->getModel()->hasSkill(skillId)) { + skillDialog->getModel()->setSkill(skillId, RFIFOW(4+k*37+6), RFIFOW(4+k*37+36)); } else { - n_skills++; - add_skill(RFIFOW(4+k*37), RFIFOW(4+k*37+6), RFIFOW(4+k*37+8)); + skillDialog->getModel()->addSkill(RFIFOW(4+k*37), RFIFOW(4+k*37+6), RFIFOW(4+k*37+8)); } } } - break; + } break; // MVP experience case 0x010b: break; diff --git a/src/graphic/graphic.cpp b/src/graphic/graphic.cpp index 3640bde0..f4affd67 100644 --- a/src/graphic/graphic.cpp +++ b/src/graphic/graphic.cpp @@ -48,6 +48,7 @@ BuySellDialog *buySellDialog; InventoryWindow *inventoryWindow; NpcListDialog *npcListDialog; NpcTextDialog *npcTextDialog; +SkillDialog *skillDialog; void ChatListener::action(const std::string& eventId) { @@ -82,8 +83,9 @@ void BuySellListener::action(const std::string& eventId) buySellDialog->setVisible(false); } +/* DIALOG skill_list_dialog[] = { - /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ + // (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) { tmw_dialog_proc, 300, 200, 260, 200, 0, 0, 0, 0, 0, 0, (char *)"Stats", NULL, NULL }, { tmw_button_proc, 450, 376, 50, 20, 255, 0, 'u', D_EXIT, 0, 0, (char *)"&Up", NULL, NULL }, { tmw_button_proc, 508, 376, 50, 20, 255, 0, 'c', D_EXIT, 0, 0, (char *)"&Close", NULL, NULL }, @@ -91,6 +93,7 @@ DIALOG skill_list_dialog[] = { { tmw_text_proc, 304, 326, 40, 20, 0, 0, 0, 0, 0, 0, (char *)skill_points, NULL, NULL }, { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL } }; +*/ char hairtable[14][4][2] = { // S(x,y) W(x,y) N(x,y) E(x,y) @@ -189,8 +192,11 @@ GraphicEngine::GraphicEngine() { npcListDialog = new NpcListDialog(guiTop); npcListDialog->setVisible(false); - skill_player = init_dialog(skill_dialog, -1); - skill_list_player = init_dialog(skill_list_dialog, -1); + skillDialog = new SkillDialog(guiTop); + skillDialog->setVisible(false); + + //skill_player = init_dialog(skill_dialog, -1); + //skill_list_player = init_dialog(skill_list_dialog, -1); // Give focus to the chat input chatInput->requestFocus(); @@ -220,10 +226,11 @@ GraphicEngine::~GraphicEngine() { delete buySellDialog; delete npcListDialog; delete npcTextDialog; + delete skillDialog; //delete tileset; - shutdown_dialog(skill_player); + //shutdown_dialog(skill_player); } void GraphicEngine::refresh() { @@ -458,13 +465,16 @@ void GraphicEngine::refresh() { chatlog.chat_draw(buffer, 8, font); + /* if (show_skill_dialog) { update_skill_dialog(); if (gui_update(skill_player) == 0) { show_skill_dialog = false; } } + */ + /* if (show_skill_list_dialog) { if (gui_update(skill_list_player) == 0) { int ret = shutdown_dialog(skill_list_player); @@ -481,6 +491,7 @@ void GraphicEngine::refresh() { skill_list_player = init_dialog(skill_list_dialog, -1); } } + */ // Update character status display statusWindow->update(); diff --git a/src/graphic/graphic.h b/src/graphic/graphic.h index 0f6710f8..ea9b71f0 100644 --- a/src/graphic/graphic.h +++ b/src/graphic/graphic.h @@ -63,6 +63,7 @@ extern BuySellDialog *buySellDialog; extern InventoryWindow *inventoryWindow; extern NpcListDialog *npcListDialog; extern NpcTextDialog *npcTextDialog; +extern SkillDialog *skillDialog; /** * The action listener for the chat field. diff --git a/src/gui/skill.cpp b/src/gui/skill.cpp index 455036ef..d3308aa5 100644 --- a/src/gui/skill.cpp +++ b/src/gui/skill.cpp @@ -25,16 +25,6 @@ extern PLAYER_INFO *char_info; -int n_skills = 0; -SKILL *skill_head = NULL; - -char str_string[8]; -char agi_string[8]; -char vit_string[8]; -char int_string[8]; -char dex_string[8]; -char luk_string[8]; - char *skill_db[] = { // 0-99 "", "Basic", "", "", "", "", "", "", "", "", @@ -60,119 +50,125 @@ char *skill_db[] = { "", "", "", "", "", "", "", "", "", "", }; -DIALOG skill_dialog[] = { - /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) (flags) (d1) (d2) (dp) (dp2) (dp3) */ - { tmw_dialog_proc, 300, 200, 150, 60, 0, 0, 0, 0, 0, 0, (char *)"Skills", NULL, NULL }, - { tmw_text_proc, 304, 224, 252, 100, 0, 0, 0, 0, 0, 0, str_string, NULL, NULL }, - { tmw_plus_proc, 354, 224, 16, 16, 0, 0, '0', 0, 0, 1, (void*)increaseStatus,NULL, NULL }, - { tmw_text_proc, 304, 234, 252, 100, 0, 0, 0, 0, 0, 0, agi_string, NULL, NULL }, - { tmw_plus_proc, 354, 234, 16, 16, 0, 0, '0', 0, 1, 1, (void*)increaseStatus,NULL, NULL }, - { tmw_text_proc, 304, 244, 252, 100, 0, 0, 0, 0, 0, 0, vit_string, NULL, NULL }, - { tmw_plus_proc, 354, 244, 16, 16, 0, 0, '0', 0, 2, 1, (void*)increaseStatus,NULL, NULL }, - { tmw_text_proc, 374, 224, 252, 100, 0, 0, 0, 0, 0, 0, int_string, NULL, NULL }, - { tmw_plus_proc, 424, 224, 16, 16, 0, 0, '0', 0, 3, 1, (void*)increaseStatus,NULL, NULL }, - { tmw_text_proc, 374, 234, 252, 100, 0, 0, 0, 0, 0, 0, dex_string, NULL, NULL }, - { tmw_plus_proc, 424, 234, 16, 16, 0, 0, '0', 0, 4, 1, (void*)increaseStatus,NULL, NULL }, - { tmw_text_proc, 374, 244, 252, 100, 0, 0, 0, 0, 0, 0, luk_string, NULL, NULL }, - { tmw_plus_proc, 424, 244, 16, 16, 0, 0, '0', 0, 5, 1, (void*)increaseStatus,NULL, NULL }, - { NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL } -}; -void update_skill_dialog() { - int skillTemp = 0; - for(int loop = 0; loop<=char_info->lv;loop++) - skillTemp += int( (float)loop / (float)5.0 ) + (int)2; - sprintf(str_string, "STR: %i", char_info->STR); - sprintf(agi_string, "AGI: %i", char_info->AGI); - sprintf(vit_string, "VIT: %i", char_info->VIT); - sprintf(int_string, "INT: %i", char_info->INT); - sprintf(dex_string, "DEX: %i", char_info->DEX); - sprintf(luk_string, "LUK: %i", char_info->LUK); - if(char_info->STR+char_info->AGI+char_info->VIT+char_info->INT+char_info->DEX+char_info->LUK == skillTemp) - { - skill_dialog[2].d2 = skill_dialog[4].d2 = skill_dialog[6].d2 =skill_dialog[8].d2 =skill_dialog[10].d2 = 0; - } else { - skill_dialog[2].d2 = skill_dialog[4].d2 = skill_dialog[6].d2 =skill_dialog[8].d2 =skill_dialog[10].d2 = 1; - } +SkillListModel::SkillListModel() +{ + // } -void add_skill(short id, short lv, short sp) { - SKILL *skill = skill_head; - SKILL *temp = (SKILL *)malloc(sizeof(SKILL)); - temp->id = id; - temp->lv = lv; - temp->sp = sp; - temp->next = NULL; - if(!skill_head) - skill_head = temp; - else { - while(skill->next) - skill = skill->next; - skill->next = temp; - } +SkillListModel::~SkillListModel() +{ + for (int i = skillList.size() - 1; i >= 0; i--) + { + delete skillList[i]; + skillList.pop_back(); + } } -char *skill_list(int index, int *list_size) { - if(index<0) { - *list_size = n_skills; - return NULL; - } else { - int iterator = 0; - SKILL *temp = skill_head; - while(iterator<index) { - temp = temp->next; - iterator++; - } - char *name = (char *)malloc(30); - sprintf(name, "%s lv:%i %i SP", skill_db[temp->id], temp->lv, temp->sp); - return name; - // need to clean allocated memory - } +int SkillListModel::getNumberOfElements() +{ + return skillList.size(); } -int get_skill_id(int index) { - int iterator = 0; - SKILL *temp = skill_head; - while(iterator<index) { - temp = temp->next; - iterator++; - } - return temp->id; +std::string SkillListModel::getElementAt(int i) +{ + // + if (i >= 0 && i < skillList.size()) + { + //return skill_db[skillList[i]->id]; + char tmp[128]; + sprintf(tmp, "%s Lv: %i Sp: %i", skill_db[skillList[i]->id], skillList[i]->lv, skillList[i]->sp); + return tmp; + } + return ""; } -SKILL *is_skill(int id) { - SKILL *temp = skill_head; - while(temp) { - if(temp->id==id)return temp; - temp = temp->next; - } - return NULL; +bool SkillListModel::hasSkill(int id) +{ + for (int i = 0; i < skillList.size(); i++) + if (skillList[i]->id == id) + return true; + return false; } -void increaseStatus(void *dp3, int d1) { - WFIFOW(0) = net_w_value(0x00bb); - switch(d1) { - case 0: - WFIFOW(2) = net_w_value(0x000d); - break; - case 1: - WFIFOW(2) = net_w_value(0x000e); - break; - case 2: - WFIFOW(2) = net_w_value(0x000f); - break; - case 3: - WFIFOW(2) = net_w_value(0x0010); - break; - case 4: - WFIFOW(2) = net_w_value(0x0011); - break; - case 5: - WFIFOW(2) = net_w_value(0x0012); - break; - } - WFIFOW(4) = net_b_value(1); - WFIFOSET(5); - while((out_size>0))flush(); - skill_dialog[2].d2 = skill_dialog[4].d2 = skill_dialog[6].d2 = skill_dialog[8].d2 = skill_dialog[10].d2 = 0; +void SkillListModel::addSkill(int id, int lv, int sp) +{ + SKILL *tmp = new SKILL; + tmp->id = id; + tmp->lv = lv; + tmp->sp = sp; + skillList.push_back(tmp); } + +void SkillListModel::setSkill(int id, int lv, int sp) +{ + if (!hasSkill(id)) + return; + skillList[id]->lv = lv; + skillList[id]->sp = sp; +} + +// + +SkillDialog::SkillDialog(gcn::Container *parent) + : Window(parent, "Skills") +{ + skills = new SkillListModel; + + skillListBox = new gcn::ListBox(skills); + pointsLabel = new gcn::Label("Skill Points:"); + incButton = new Button(" Up "); + closeButton = new Button("Close"); + + incButton->setEventId("inc"); + closeButton->setEventId("close"); + + skillListBox->setDimension(gcn::Rectangle(0, 0, 200, 180)); + pointsLabel->setDimension(gcn::Rectangle(0, 0, 200, 16)); + + skillListBox->setPosition(8, 4); + pointsLabel->setPosition(8, 190); + incButton->setPosition(64, 210); + closeButton->setPosition(160, 210); + + add(skillListBox); + add(pointsLabel); + add(incButton); + add(closeButton); + + incButton->addActionListener(this); + closeButton->addActionListener(this); + + setSize(240, 240); + setLocationRelativeTo(getParent()); +} + +SkillDialog::~SkillDialog() +{ + delete skillListBox; + delete pointsLabel; + delete incButton; + delete closeButton; + + delete skills; +} + +void SkillDialog::action(const std::string& eventId) +{ + if (eventId == "inc") + { + //increment skill + } else if (eventId == "close") + { + setVisible(false); + } +} + +void SkillDialog::setPoints(int i) +{ + char tmp[128]; + sprintf(tmp, "Skill points: %i", i); + if (pointsLabel != NULL) + pointsLabel->setCaption(tmp); +} + diff --git a/src/gui/skill.h b/src/gui/skill.h index 33e94a18..21f76212 100644 --- a/src/gui/skill.h +++ b/src/gui/skill.h @@ -21,30 +21,49 @@ * $Id$ */ -#ifdef WIN32 - #pragma warning (disable:4312) -#endif - #ifndef _SKILL_H #define _SKILL_H #include <allegro.h> +#include "button.h" #include "../main.h" -//DIALOG skill_dialog[]; +struct SKILL { + short id; //index into "skill_db" array + short lv, sp; +}; -extern int n_skills; +class SkillListModel : public gcn::ListModel +{ + std::vector<SKILL*> skillList; + public: + SkillListModel(); + ~SkillListModel(); -struct SKILL { - short id, lv, sp; - SKILL *next; + int getNumberOfElements(); + std::string getElementAt(int); + + bool hasSkill(int id); + void addSkill(int id, int lv, int sp); + void setSkill(int id, int lv, int sp); }; +class SkillDialog : public Window, public gcn::ActionListener +{ + gcn::ListBox *skillListBox; + SkillListModel *skills; + gcn::Label *pointsLabel; + + Button *incButton; + Button *closeButton; + public: + SkillDialog(gcn::Container *); + ~SkillDialog(); + + void action(const std::string&); + SkillListModel* getModel() { return skills; } + + void setPoints(int i); +}; -void update_skill_dialog(); -void add_skill(short id, short lv, short sp); -char *skill_list(int index, int *list_size); -int get_skill_id(int index); -SKILL *is_skill(int id); -void increaseStatus(void *dp3, int d1); #endif |