From 0c2495c92278989d1bd90913441648a015f67948 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Wed, 17 Apr 2024 17:32:44 +0100 Subject: [PATCH 01/19] Fix linux hints --- sys/unix/hints/linux | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/unix/hints/linux b/sys/unix/hints/linux index 44c2b91..1adb70c 100755 --- a/sys/unix/hints/linux +++ b/sys/unix/hints/linux @@ -10,7 +10,8 @@ #PREFIX=/usr -PREFIX=$(wildcard ~)/nh/install +PREFIX=$(wildcard ~)/nh +GAMEDIR=$(wildcard ~)/nh HACKDIR=$(PREFIX)/$(GAME)-data SHELLDIR = $(PREFIX)/games INSTDIR=$(HACKDIR) From d6c1d1de1b1f6dc74c0361fb121c6fde883bd392 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Wed, 17 Apr 2024 17:33:35 +0100 Subject: [PATCH 02/19] display statusbar --- win/vulture/winclass/statusbars.cpp | 93 +++++++++++++++++++++++++++++ win/vulture/winclass/statusbars.h | 27 +++++++++ win/vulture/winclass/statuswin.cpp | 8 ++- 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100755 win/vulture/winclass/statusbars.cpp create mode 100755 win/vulture/winclass/statusbars.h diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp new file mode 100755 index 0000000..9effc42 --- /dev/null +++ b/win/vulture/winclass/statusbars.cpp @@ -0,0 +1,93 @@ +/* NetHack may be freely redistributed. See license for details. */ + +#include "vulture_sdl.h" /* XXX this must be the first include, + no idea why but it won't compile otherwise */ + +#include "config.h" +#include "global.h" + +extern "C" { +#ifndef VULTURE_NETHACK_3_6_7 +boolean can_advance(int skill, int speedy); +#endif +} + +#include "vulture_win.h" +#include "vulture_gra.h" +#include "vulture_gfl.h" +#include "vulture_mou.h" +#include "vulture_tile.h" +#include "vulture_txt.h" + +#include "statusbars.h" + + +#define META(c) (0x80 | (c)) + +statusbars *stbars; +int barh; + +statusbars::statusbars(window *p) : window(p) +{ + barh=vulture_get_lineheight(V_FONT_STATUS)+2; + + w = 100; + h = barh*5; + + stbars = this; + autobg = true; + visible = true; +} + +statusbars::~statusbars() +{ +} + +bool statusbars::draw() +{ + vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); + this->draw_bar(0, "HP", u.uhp/(float)u.uhpmax, 0, CLR32_RED); + this->draw_bar(1, "Magic", u.uen/(float)u.uenmax, 0, CLR32_BLESS_BLUE); + this->draw_bar(2, "Food", u.uhunger/(float)1000, 150/float(1000), CLR32_ORANGE); + this->draw_bar(3, "Weight", (inv_weight()+weight_cap())/(float)weight_cap(), 0, CLR32_BROWN); + this->draw_bar(4, "XP", u.uexp/(float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK); + vulture_set_draw_region(0, 0, vulture_screen->w-1, vulture_screen->h-1); + + vulture_invalidate_region(abs_x, abs_y, w, h); + + return true; +} + +void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color) +{ + int by=y+barh*i; + vulture_fill_rect(x, by, x+w*lvlMain, by+barh, color); + vulture_put_text(V_FONT_TOOLTIP, label, vulture_screen, x+1, by+1, CLR32_WHITE); + if (lvlSecondary>0) { + vulture_fill_rect(x+w*lvlSecondary, by, x+w*lvlSecondary, by+barh, CLR32_YELLOW); + } + vulture_rect(x, y+barh*i, x+w, y+barh*i+barh, CLR32_GRAY70); +} + +eventresult statusbars::handle_timer_event(window* target, void* result, int time) +{ + return V_EVENT_HANDLED_NOREDRAW; +} + + +eventresult statusbars::handle_mousemotion_event(window* target, void* result, int xrel, + int yrel, int state) +{ + vulture_set_mcursor(V_CURSOR_NORMAL); + return V_EVENT_HANDLED_NOREDRAW; +} + + +eventresult statusbars::handle_resize_event(window* target, void* result, int res_w, int res_h) +{ + /* this relies on the fact that the enhance window is created + * immediately after the status window */ + y = sib_prev->y - h; + return V_EVENT_HANDLED_NOREDRAW; +} + diff --git a/win/vulture/winclass/statusbars.h b/win/vulture/winclass/statusbars.h new file mode 100755 index 0000000..626747f --- /dev/null +++ b/win/vulture/winclass/statusbars.h @@ -0,0 +1,27 @@ +/* NetHack may be freely redistributed. See license for details. */ + +#ifndef _statusbars_h_ +#define _statusbars_h_ + +#include +#include "window.h" + + +class statusbars : public window +{ +public: + statusbars(window *p); + virtual ~statusbars(); + virtual bool draw(); + virtual eventresult handle_timer_event(window* target, void* result, int time); + virtual eventresult handle_mousemotion_event(window* target, void* result, + int xrel, int yrel, int state); + virtual eventresult handle_resize_event(window* target, void* result, int res_w, int res_h); + +private: + void draw_bar(int index, std::string label, float lvlMain, float lvlSecondary, Uint32 color); +}; + +extern statusbars *stbars; + +#endif diff --git a/win/vulture/winclass/statuswin.cpp b/win/vulture/winclass/statuswin.cpp index f9293c0..8070dad 100755 --- a/win/vulture/winclass/statuswin.cpp +++ b/win/vulture/winclass/statuswin.cpp @@ -17,6 +17,7 @@ extern const char *const enc_stat[]; /* defined in botl.c */ #include "statuswin.h" #include "enhancebutton.h" +#include "statusbars.h" #include "textwin.h" #include @@ -28,6 +29,7 @@ static Uint32 warn_colors[V_MAX_WARN]; statuswin::statuswin(window *p) : window(p) { window *subwin; + window *bars; statusbg = vulture_load_graphic(V_FILENAME_STATUS_BAR); this->w = statusbg->w; @@ -41,6 +43,11 @@ statuswin::statuswin(window *p) : window(p) subwin->x = this->x + this->w; subwin->y = this->y - subwin->h; subwin->menu_id = V_WIN_ENHANCE; + + bars = new statusbars(this->parent); + bars->w = this->w; + bars->x = this->x; + bars->y = this->y - bars->h-vulture_get_lineheight(V_FONT_STATUS); for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) @@ -79,7 +86,6 @@ bool statuswin::draw() vulture_set_draw_region(0, 0, vulture_screen->w-1, vulture_screen->h-1); vulture_invalidate_region(abs_x, abs_y, w, h); - return true; } From ae1e4d0bc7271c9674ef1f3fb46fbd67830a61fc Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Wed, 17 Apr 2024 23:02:57 +0100 Subject: [PATCH 03/19] Inventory display --- win/vulture/winclass/statusinv.cpp | 159 +++++++++++++++++++++++++++++ win/vulture/winclass/statusinv.h | 26 +++++ win/vulture/winclass/statuswin.cpp | 8 ++ 3 files changed, 193 insertions(+) create mode 100755 win/vulture/winclass/statusinv.cpp create mode 100755 win/vulture/winclass/statusinv.h diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp new file mode 100755 index 0000000..343c1c4 --- /dev/null +++ b/win/vulture/winclass/statusinv.cpp @@ -0,0 +1,159 @@ +/* NetHack may be freely redistributed. See license for details. */ + +#include "vulture_sdl.h" /* XXX this must be the first include, + no idea why but it won't compile otherwise */ + +#include "config.h" +#include "global.h" + +extern "C" +{ +#ifndef VULTURE_NETHACK_3_6_7 + boolean can_advance(int skill, int speedy); +#endif +} + +#include "vulture_win.h" +#include "vulture_gra.h" +#include "vulture_gfl.h" +#include "vulture_mou.h" +#include "vulture_tile.h" +#include "vulture_txt.h" + +#include "statusinv.h" + +#define META(c) (0x80 | (c)) + +statusinv *stinv; + +statusinv::statusinv(window *p) : window(p) +{ + w = 100; + h = 100; + + stinv = this; + autobg = true; + visible = true; +} + +statusinv::~statusinv() +{ +} + +bool statusinv::draw() +{ + tileSize = w / 4 - 2; + vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); + + this->draw_obj(uamul, 0, 0); // Amulet + this->draw_obj(uarmh, 1, 0); // Helmet + this->draw_obj(ublindf, 2, 0); // Blindfold + this->draw_obj(uwep, 3, 0); // Weapon + + this->draw_obj(uarmc, 0, 1); // Cloak + this->draw_obj(uarm, 1, 1); // Armour + this->draw_obj(uarmg, 2, 1); // Gloves + this->draw_obj(uarms, 3, 1); // Shield + + + this->draw_obj(uleft, 0, 2); // RingL + this->draw_obj(uarmu, 1, 2); // Undershirt + this->draw_obj(uright, 2, 2); // RingR + this->draw_obj(uquiver, 3, 2); // Quiver + + this->draw_obj(uchain, 0, 3); // chain + this->draw_obj(uarmf, 1, 3); // Shoes (feet) + this->draw_obj(uball, 2, 3); // ball + this->draw_obj(uswapwep, 3, 3); // Secondary weapon + + // the only thing we skip is *uskin // dragon armor, if a dragon + + vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); + + vulture_invalidate_region(abs_x, abs_y, w, h); + + return true; +} + +void statusinv::draw_obj(obj *obj, int col, int row) +{ + // most code is copied from objitemwin.cpp + int cx, cy, cw, ch; + cx = x + col * (tileSize + 1); + cy = y + row * (tileSize + 1); + cw = tileSize; + ch = tileSize; + + char tmpstr[32]; + + /* draw the tile itself */ + /* constrain the drawing region to the box for the object tile, so that large + * tiles don't overlap */ + vulture_set_draw_region(cx, cy, cx + ch, cy + ch); + + /* darken the background */ + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_BLACK_A30); + + if (obj) + { + /* indicate blessed/cursed visually */ + if (obj->bknown && obj->blessed) + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_BLESS_BLUE); + + if (obj->bknown && obj->cursed) + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_CURSE_RED); + + /* draw the object tile */ + int tile_x, tile_y; + int tile = 0; + + tile = vulture_object_to_tile(obj->otyp, -1, -1, obj); + + tile_x = cx + ch / 2; + tile_y = cy + ch * 3 / 4; + + if (TILE_IS_OBJECT(tile)) + { + tile = tile - OBJTILEOFFSET + ICOTILEOFFSET; + tile_x = cx + 2; + tile_y = cy + 2; + } + + vulture_put_tile(tile_x, tile_y, tile); + + /* draw the quantity on the tile */ + if (obj->quan > 1) + { + snprintf(tmpstr, 11, "%ld", obj->quan); + int txt_height = vulture_text_height(V_FONT_MENU, tmpstr); + int text_start_x = cx + ch - vulture_text_length(V_FONT_MENU, tmpstr) - 2; + vulture_put_text_shadow(V_FONT_MENU, tmpstr, vulture_screen, text_start_x, cy + ch - txt_height, CLR32_WHITE, CLR32_BLACK); + } + } + + // outline + vulture_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_GRAY70); + + /* restore the drawing region */ + vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); +} + +eventresult statusinv::handle_timer_event(window *target, void *result, int time) +{ + return V_EVENT_HANDLED_NOREDRAW; +} + +eventresult statusinv::handle_mousemotion_event(window *target, void *result, int xrel, + int yrel, int state) +{ + vulture_set_mcursor(V_CURSOR_NORMAL); + return V_EVENT_HANDLED_NOREDRAW; +} + +eventresult statusinv::handle_resize_event(window *target, void *result, int res_w, int res_h) +{ + /* this relies on the fact that the enhance window is created + * immediately after the status window */ + y = sib_prev->y - h; + return V_EVENT_HANDLED_NOREDRAW; +} diff --git a/win/vulture/winclass/statusinv.h b/win/vulture/winclass/statusinv.h new file mode 100755 index 0000000..8d234c1 --- /dev/null +++ b/win/vulture/winclass/statusinv.h @@ -0,0 +1,26 @@ +/* NetHack may be freely redistributed. See license for details. */ + +#ifndef _statusinv_h_ +#define _statusinv_h_ + +#include +#include "window.h" + +class statusinv : public window +{ +public: + statusinv(window *p); + virtual ~statusinv(); + virtual bool draw(); + virtual eventresult handle_timer_event(window *target, void *result, int time); + virtual eventresult handle_mousemotion_event(window *target, void *result, int xrel, int yrel, int state); + virtual eventresult handle_resize_event(window *target, void *result, int res_w, int res_h); + +private: + void draw_obj(obj *obj, int col, int row); + int tileSize; +}; + +extern statusinv *stinv; + +#endif diff --git a/win/vulture/winclass/statuswin.cpp b/win/vulture/winclass/statuswin.cpp index 8070dad..5702bd4 100755 --- a/win/vulture/winclass/statuswin.cpp +++ b/win/vulture/winclass/statuswin.cpp @@ -18,6 +18,7 @@ extern const char *const enc_stat[]; /* defined in botl.c */ #include "statuswin.h" #include "enhancebutton.h" #include "statusbars.h" +#include "statusinv.h" #include "textwin.h" #include @@ -30,6 +31,7 @@ statuswin::statuswin(window *p) : window(p) { window *subwin; window *bars; + window *inv; statusbg = vulture_load_graphic(V_FILENAME_STATUS_BAR); this->w = statusbg->w; @@ -49,6 +51,12 @@ statuswin::statuswin(window *p) : window(p) bars->x = this->x; bars->y = this->y - bars->h-vulture_get_lineheight(V_FONT_STATUS); + inv = new statusinv(this->parent); + inv->w = this->w; + inv->h = this->w; + inv->x = this->x; + inv->y = bars->y - inv->h - vulture_get_lineheight(V_FONT_STATUS); + for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { From 66c8348368a7d5fd64f700bc8c71caa49545902c Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Thu, 18 Apr 2024 09:27:27 +0100 Subject: [PATCH 04/19] Fix screen size --- .../gamedata/map/ascii/nethack_3_6_7.png | Bin 0 -> 21157 bytes win/vulture/winclass/statusinv.cpp | 6 +++--- win/vulture/winclass/statuswin.cpp | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) create mode 100755 win/vulture/gamedata/map/ascii/nethack_3_6_7.png diff --git a/win/vulture/gamedata/map/ascii/nethack_3_6_7.png b/win/vulture/gamedata/map/ascii/nethack_3_6_7.png new file mode 100755 index 0000000000000000000000000000000000000000..cc2508891c094c03180c682c2954a2e2035ab89b GIT binary patch literal 21157 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

+!tCMf)Y&Bwc>qmVH0DzPchM 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 literal 0 HcmV?d00001 diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index 343c1c4..1c96c73 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -28,8 +28,9 @@ statusinv *stinv; statusinv::statusinv(window *p) : window(p) { - w = 100; - h = 100; + tileSize = V_LISTITEM_HEIGHT + 2; + h = tileSize * 4; + w = tileSize * 4; stinv = this; autobg = true; @@ -42,7 +43,6 @@ statusinv::~statusinv() bool statusinv::draw() { - tileSize = w / 4 - 2; vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); this->draw_obj(uamul, 0, 0); // Amulet diff --git a/win/vulture/winclass/statuswin.cpp b/win/vulture/winclass/statuswin.cpp index 5702bd4..26869ec 100755 --- a/win/vulture/winclass/statuswin.cpp +++ b/win/vulture/winclass/statuswin.cpp @@ -52,8 +52,6 @@ statuswin::statuswin(window *p) : window(p) bars->y = this->y - bars->h-vulture_get_lineheight(V_FONT_STATUS); inv = new statusinv(this->parent); - inv->w = this->w; - inv->h = this->w; inv->x = this->x; inv->y = bars->y - inv->h - vulture_get_lineheight(V_FONT_STATUS); From 3c5584323591f9b39ffab099def0e157e17e7db3 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Thu, 18 Apr 2024 17:21:19 +0100 Subject: [PATCH 05/19] Improve statusbar display --- win/vulture/winclass/statusbars.cpp | 56 ++++++++++++++++------------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp index 9effc42..5d78dd5 100755 --- a/win/vulture/winclass/statusbars.cpp +++ b/win/vulture/winclass/statusbars.cpp @@ -6,9 +6,10 @@ #include "config.h" #include "global.h" -extern "C" { +extern "C" +{ #ifndef VULTURE_NETHACK_3_6_7 -boolean can_advance(int skill, int speedy); + boolean can_advance(int skill, int speedy); #endif } @@ -21,7 +22,6 @@ boolean can_advance(int skill, int speedy); #include "statusbars.h" - #define META(c) (0x80 | (c)) statusbars *stbars; @@ -29,11 +29,11 @@ int barh; statusbars::statusbars(window *p) : window(p) { - barh=vulture_get_lineheight(V_FONT_STATUS)+2; + barh = vulture_get_lineheight(V_FONT_STATUS) + 2; w = 100; - h = barh*5; - + h = (barh + 5) * 5; + stbars = this; autobg = true; visible = true; @@ -45,13 +45,21 @@ statusbars::~statusbars() bool statusbars::draw() { + float wMain = (inv_weight() + weight_cap()) / (float)weight_cap(); + float wSec = 0; + if (wMain > 1) + { + wMain = 1; + wSec = weight_cap() / (float)(inv_weight() + weight_cap()); + } + vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); - this->draw_bar(0, "HP", u.uhp/(float)u.uhpmax, 0, CLR32_RED); - this->draw_bar(1, "Magic", u.uen/(float)u.uenmax, 0, CLR32_BLESS_BLUE); - this->draw_bar(2, "Food", u.uhunger/(float)1000, 150/float(1000), CLR32_ORANGE); - this->draw_bar(3, "Weight", (inv_weight()+weight_cap())/(float)weight_cap(), 0, CLR32_BROWN); - this->draw_bar(4, "XP", u.uexp/(float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK); - vulture_set_draw_region(0, 0, vulture_screen->w-1, vulture_screen->h-1); + this->draw_bar(0, "HP", u.uhp / (float)u.uhpmax, 0, CLR32_RED); + this->draw_bar(1, "Magic", u.uen / (float)u.uenmax, 0, CLR32_BLESS_BLUE); + this->draw_bar(2, "Food", u.uhunger / (float)1000, 150 / float(1000), CLR32_GOLD_SHADE); + this->draw_bar(3, "Weight", wMain, wSec, CLR32_BROWN); + this->draw_bar(4, "XP", u.uexp / (float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK); + vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); vulture_invalidate_region(abs_x, abs_y, w, h); @@ -60,34 +68,32 @@ bool statusbars::draw() void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color) { - int by=y+barh*i; - vulture_fill_rect(x, by, x+w*lvlMain, by+barh, color); - vulture_put_text(V_FONT_TOOLTIP, label, vulture_screen, x+1, by+1, CLR32_WHITE); - if (lvlSecondary>0) { - vulture_fill_rect(x+w*lvlSecondary, by, x+w*lvlSecondary, by+barh, CLR32_YELLOW); + int by = y + (barh + 5) * i; + vulture_fill_rect(x, by, x + w * lvlMain, by + barh, color); + vulture_put_text(V_FONT_TOOLTIP, label, vulture_screen, x + 1, by + 1, CLR32_WHITE); + if (lvlSecondary > 0) + { + vulture_fill_rect(x + w * lvlSecondary, by, x + w * lvlSecondary, by + barh, CLR32_YELLOW); } - vulture_rect(x, y+barh*i, x+w, y+barh*i+barh, CLR32_GRAY70); + vulture_rect(x, by, x + w, by + barh, CLR32_GRAY70); } -eventresult statusbars::handle_timer_event(window* target, void* result, int time) +eventresult statusbars::handle_timer_event(window *target, void *result, int time) { return V_EVENT_HANDLED_NOREDRAW; } - -eventresult statusbars::handle_mousemotion_event(window* target, void* result, int xrel, - int yrel, int state) +eventresult statusbars::handle_mousemotion_event(window *target, void *result, int xrel, + int yrel, int state) { vulture_set_mcursor(V_CURSOR_NORMAL); return V_EVENT_HANDLED_NOREDRAW; } - -eventresult statusbars::handle_resize_event(window* target, void* result, int res_w, int res_h) +eventresult statusbars::handle_resize_event(window *target, void *result, int res_w, int res_h) { /* this relies on the fact that the enhance window is created * immediately after the status window */ y = sib_prev->y - h; return V_EVENT_HANDLED_NOREDRAW; } - From 3434437f08cf7792a649af462d49f736e46b461b Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Thu, 18 Apr 2024 17:21:41 +0100 Subject: [PATCH 06/19] Display loadout as figure --- win/vulture/gamedata/graphics/loadout.png | Bin 0 -> 70271 bytes win/vulture/winclass/statusinv.cpp | 53 ++++++++++++---------- win/vulture/winclass/statusinv.h | 4 +- 3 files changed, 32 insertions(+), 25 deletions(-) create mode 100755 win/vulture/gamedata/graphics/loadout.png diff --git a/win/vulture/gamedata/graphics/loadout.png b/win/vulture/gamedata/graphics/loadout.png new file mode 100755 index 0000000000000000000000000000000000000000..b5649f944399d48cae900b734f0b8e5de90fd2da GIT binary patch literal 70271 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

-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 literal 0 HcmV?d00001 diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index 1c96c73..a8db5ed 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -28,9 +28,11 @@ statusinv *stinv; statusinv::statusinv(window *p) : window(p) { + statusbg = vulture_load_graphic(V_FILENAME_LOADOUT); + this->w = statusbg->w; + this->h = statusbg->h; + tileSize = V_LISTITEM_HEIGHT + 2; - h = tileSize * 4; - w = tileSize * 4; stinv = this; autobg = true; @@ -39,34 +41,37 @@ statusinv::statusinv(window *p) : window(p) statusinv::~statusinv() { + SDL_FreeSurface(statusbg); } bool statusinv::draw() { vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); + vulture_put_img(abs_x, abs_y, statusbg); + + this->draw_obj(uarmh, 0, 0); // Helmet + this->draw_obj(ublindf, 1, 0); // Blindfold + this->draw_obj(uamul, 0, 1); // Amulet + this->draw_obj(uarm, 0, 2); // Armour - this->draw_obj(uamul, 0, 0); // Amulet - this->draw_obj(uarmh, 1, 0); // Helmet - this->draw_obj(ublindf, 2, 0); // Blindfold - this->draw_obj(uwep, 3, 0); // Weapon + this->draw_obj(uarmc, -1.5, 1.5); // Cloak + this->draw_obj(uarms, 1.5, 1.5); // Shield - this->draw_obj(uarmc, 0, 1); // Cloak - this->draw_obj(uarm, 1, 1); // Armour - this->draw_obj(uarmg, 2, 1); // Gloves - this->draw_obj(uarms, 3, 1); // Shield + this->draw_obj(uarmu, 0, 3); // Undershirt + this->draw_obj(uskin, -1, 3); // Dragon skin armor + this->draw_obj(uleft, -2, 3.5); // RingL + this->draw_obj(uright, 2, 3.5); // RingR - this->draw_obj(uleft, 0, 2); // RingL - this->draw_obj(uarmu, 1, 2); // Undershirt - this->draw_obj(uright, 2, 2); // RingR - this->draw_obj(uquiver, 3, 2); // Quiver + this->draw_obj(uwep, 2.5, 4.5); // Weapon + this->draw_obj(uswapwep, -2.5, 4.5); // Secondary weapon - this->draw_obj(uchain, 0, 3); // chain - this->draw_obj(uarmf, 1, 3); // Shoes (feet) - this->draw_obj(uball, 2, 3); // ball - this->draw_obj(uswapwep, 3, 3); // Secondary weapon + this->draw_obj(uarmg, -1, 5); // Gloves + this->draw_obj(uquiver, 1, 5); // Quiver - // the only thing we skip is *uskin // dragon armor, if a dragon + this->draw_obj(uarmf, 0, 7); // Shoes (feet) + this->draw_obj(uchain, 1, 7); // chain + this->draw_obj(uball, 2, 7); // ball vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); @@ -75,14 +80,14 @@ bool statusinv::draw() return true; } -void statusinv::draw_obj(obj *obj, int col, int row) +void statusinv::draw_obj(obj *obj, float rx, float ry) { // most code is copied from objitemwin.cpp int cx, cy, cw, ch; - cx = x + col * (tileSize + 1); - cy = y + row * (tileSize + 1); cw = tileSize; ch = tileSize; + cx = x + w / 2 - tileSize / 2 + rx * (tileSize + 2) + 5; + cy = y + ry * (tileSize + 2) + 30; char tmpstr[32]; @@ -92,7 +97,7 @@ void statusinv::draw_obj(obj *obj, int col, int row) vulture_set_draw_region(cx, cy, cx + ch, cy + ch); /* darken the background */ - vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_BLACK_A30); + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_BLACK_A50); if (obj) { @@ -132,7 +137,7 @@ void statusinv::draw_obj(obj *obj, int col, int row) } // outline - vulture_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_GRAY70); + vulture_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_GRAY77); /* restore the drawing region */ vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); diff --git a/win/vulture/winclass/statusinv.h b/win/vulture/winclass/statusinv.h index 8d234c1..0b09e84 100755 --- a/win/vulture/winclass/statusinv.h +++ b/win/vulture/winclass/statusinv.h @@ -5,6 +5,7 @@ #include #include "window.h" +#define V_FILENAME_LOADOUT "loadout" class statusinv : public window { @@ -17,7 +18,8 @@ class statusinv : public window virtual eventresult handle_resize_event(window *target, void *result, int res_w, int res_h); private: - void draw_obj(obj *obj, int col, int row); + void draw_obj(obj *obj, float x, float y); + SDL_Surface *statusbg; int tileSize; }; From b2bdf94552c7b8489a06cc84578fcd6e609971b9 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Thu, 18 Apr 2024 17:49:43 +0100 Subject: [PATCH 07/19] Conditional display of rare items --- win/vulture/winclass/statusinv.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index a8db5ed..29be53a 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -50,7 +50,7 @@ bool statusinv::draw() vulture_put_img(abs_x, abs_y, statusbg); this->draw_obj(uarmh, 0, 0); // Helmet - this->draw_obj(ublindf, 1, 0); // Blindfold + if (ublindf) this->draw_obj(ublindf, 1, 0); // Blindfold this->draw_obj(uamul, 0, 1); // Amulet this->draw_obj(uarm, 0, 2); // Armour @@ -58,7 +58,7 @@ bool statusinv::draw() this->draw_obj(uarms, 1.5, 1.5); // Shield this->draw_obj(uarmu, 0, 3); // Undershirt - this->draw_obj(uskin, -1, 3); // Dragon skin armor + if (uskin) this->draw_obj(uskin, -1, 3); // Dragon skin armor this->draw_obj(uleft, -2, 3.5); // RingL this->draw_obj(uright, 2, 3.5); // RingR @@ -70,8 +70,8 @@ bool statusinv::draw() this->draw_obj(uquiver, 1, 5); // Quiver this->draw_obj(uarmf, 0, 7); // Shoes (feet) - this->draw_obj(uchain, 1, 7); // chain - this->draw_obj(uball, 2, 7); // ball + if (uchain) this->draw_obj(uchain, 1, 7); // chain + if (uball) this->draw_obj(uball, 2, 7); // ball vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); From a2fb101991d05fe4dbebbaa92be7dac76b80115d Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Thu, 18 Apr 2024 20:07:17 +0100 Subject: [PATCH 08/19] Better hunger display --- win/vulture/winclass/statusbars.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp index 5d78dd5..1eb3ecd 100755 --- a/win/vulture/winclass/statusbars.cpp +++ b/win/vulture/winclass/statusbars.cpp @@ -53,10 +53,30 @@ bool statusbars::draw() wSec = weight_cap() / (float)(inv_weight() + weight_cap()); } + float hMain, hSec; + hMain = 1; + if (u.uhunger > 1000) + { + hSec = 1000 / (float)u.uhunger; + } + else if (u.uhunger > 150) + { + hSec = 150 / (float)u.uhunger; + } + else if (u.uhunger > 50) + { + hSec = 50 / (float)u.uhunger; + } + else + { + hMain = u.uhunger / 50.0; + hSec = 0; + } + vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); this->draw_bar(0, "HP", u.uhp / (float)u.uhpmax, 0, CLR32_RED); this->draw_bar(1, "Magic", u.uen / (float)u.uenmax, 0, CLR32_BLESS_BLUE); - this->draw_bar(2, "Food", u.uhunger / (float)1000, 150 / float(1000), CLR32_GOLD_SHADE); + this->draw_bar(2, "Food", hMain, hSec, CLR32_GOLD_SHADE); this->draw_bar(3, "Weight", wMain, wSec, CLR32_BROWN); this->draw_bar(4, "XP", u.uexp / (float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK); vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); @@ -68,12 +88,17 @@ bool statusbars::draw() void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color) { + if (lvlMain < 0) + { + lvlMain = 0; + } + int by = y + (barh + 5) * i; vulture_fill_rect(x, by, x + w * lvlMain, by + barh, color); vulture_put_text(V_FONT_TOOLTIP, label, vulture_screen, x + 1, by + 1, CLR32_WHITE); if (lvlSecondary > 0) { - vulture_fill_rect(x + w * lvlSecondary, by, x + w * lvlSecondary, by + barh, CLR32_YELLOW); + vulture_fill_rect(x + w * lvlSecondary, by, x + w * lvlSecondary, by + barh, CLR32_WHITE); } vulture_rect(x, by, x + w, by + barh, CLR32_GRAY70); } From 28609d8c08751e2076994900fc85751c2062b769 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Fri, 19 Apr 2024 17:35:57 +0100 Subject: [PATCH 09/19] Fix crash --- win/vulture/winclass/statusbars.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp index 1eb3ecd..425df65 100755 --- a/win/vulture/winclass/statusbars.cpp +++ b/win/vulture/winclass/statusbars.cpp @@ -5,7 +5,7 @@ #include "config.h" #include "global.h" - +#include extern "C" { #ifndef VULTURE_NETHACK_3_6_7 @@ -88,7 +88,7 @@ bool statusbars::draw() void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color) { - if (lvlMain < 0) + if (lvlMain < 0 || isinf(lvlMain)) { lvlMain = 0; } From 32759efe75ac6d9a08573ce894934a5b0517183d Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Fri, 19 Apr 2024 18:44:10 +0100 Subject: [PATCH 10/19] Display quality of item --- win/vulture/winclass/statusinv.cpp | 37 +++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index 29be53a..2c701ec 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -49,29 +49,33 @@ bool statusinv::draw() vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); vulture_put_img(abs_x, abs_y, statusbg); - this->draw_obj(uarmh, 0, 0); // Helmet - if (ublindf) this->draw_obj(ublindf, 1, 0); // Blindfold - this->draw_obj(uamul, 0, 1); // Amulet - this->draw_obj(uarm, 0, 2); // Armour + this->draw_obj(uarmh, 0, 0); // Helmet + if (ublindf) + this->draw_obj(ublindf, 1, 0); // Blindfold + this->draw_obj(uamul, 0, 1); // Amulet + this->draw_obj(uarm, 0, 2); // Armour this->draw_obj(uarmc, -1.5, 1.5); // Cloak this->draw_obj(uarms, 1.5, 1.5); // Shield this->draw_obj(uarmu, 0, 3); // Undershirt - if (uskin) this->draw_obj(uskin, -1, 3); // Dragon skin armor + if (uskin) + this->draw_obj(uskin, -1, 3); // Dragon skin armor - this->draw_obj(uleft, -2, 3.5); // RingL + this->draw_obj(uleft, -2, 3.5); // RingL this->draw_obj(uright, 2, 3.5); // RingR - this->draw_obj(uwep, 2.5, 4.5); // Weapon + this->draw_obj(uwep, 2.5, 4.5); // Weapon this->draw_obj(uswapwep, -2.5, 4.5); // Secondary weapon this->draw_obj(uarmg, -1, 5); // Gloves - this->draw_obj(uquiver, 1, 5); // Quiver + this->draw_obj(uquiver, 1, 5); // Quiver - this->draw_obj(uarmf, 0, 7); // Shoes (feet) - if (uchain) this->draw_obj(uchain, 1, 7); // chain - if (uball) this->draw_obj(uball, 2, 7); // ball + this->draw_obj(uarmf, 0, 7); // Shoes (feet) + if (uchain) + this->draw_obj(uchain, 1, 7); // chain + if (uball) + this->draw_obj(uball, 2, 7); // ball vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); @@ -134,6 +138,17 @@ void statusinv::draw_obj(obj *obj, float rx, float ry) int text_start_x = cx + ch - vulture_text_length(V_FONT_MENU, tmpstr) - 2; vulture_put_text_shadow(V_FONT_MENU, tmpstr, vulture_screen, text_start_x, cy + ch - txt_height, CLR32_WHITE, CLR32_BLACK); } + + // draw +- quality + if (is_weptool(obj) || obj->oclass == ARMOR_CLASS) + { + if (obj->known) + { + snprintf(tmpstr, 11, (obj->spe < 0) ? "%d" : "+%d", obj->spe); + int text_start_x = cx + 2; + vulture_put_text_shadow(V_FONT_MENU, tmpstr, vulture_screen, text_start_x, cy + 2, CLR32_WHITE, CLR32_BLACK); + } + } } // outline From 1543d0877e5e88ad842d3f329e28565cd56b62a3 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Fri, 19 Apr 2024 19:19:56 +0100 Subject: [PATCH 11/19] Minors --- win/vulture/winclass/statusinv.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index 2c701ec..e67e534 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -101,7 +101,7 @@ void statusinv::draw_obj(obj *obj, float rx, float ry) vulture_set_draw_region(cx, cy, cx + ch, cy + ch); /* darken the background */ - vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, CLR32_BLACK_A50); + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, obj == ublindf ? CLR32_GRAY20 : CLR32_BLACK_A50); if (obj) { @@ -140,10 +140,10 @@ void statusinv::draw_obj(obj *obj, float rx, float ry) } // draw +- quality - if (is_weptool(obj) || obj->oclass == ARMOR_CLASS) + if (is_weptool(obj) || obj->oclass == ARMOR_CLASS || obj->oclass == WEAPON_CLASS) { if (obj->known) - { + { snprintf(tmpstr, 11, (obj->spe < 0) ? "%d" : "+%d", obj->spe); int text_start_x = cx + 2; vulture_put_text_shadow(V_FONT_MENU, tmpstr, vulture_screen, text_start_x, cy + 2, CLR32_WHITE, CLR32_BLACK); From 63538e89533e5bb4bfc7fe2930c579ab6148ed4b Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Sat, 20 Apr 2024 10:45:56 +0100 Subject: [PATCH 12/19] Fix bg color --- win/vulture/winclass/statusinv.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index e67e534..7c1621b 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -101,7 +101,7 @@ void statusinv::draw_obj(obj *obj, float rx, float ry) vulture_set_draw_region(cx, cy, cx + ch, cy + ch); /* darken the background */ - vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, obj == ublindf ? CLR32_GRAY20 : CLR32_BLACK_A50); + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, obj && obj == ublindf ? CLR32_GRAY20 : CLR32_BLACK_A50); if (obj) { From 609dd1a7da9088f3826ca30834aaa61bbd0b1f58 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Fri, 3 May 2024 16:32:48 +0100 Subject: [PATCH 13/19] Avoid crashes in status bars --- win/vulture/winclass/statusbars.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp index 425df65..26e02aa 100755 --- a/win/vulture/winclass/statusbars.cpp +++ b/win/vulture/winclass/statusbars.cpp @@ -74,8 +74,12 @@ bool statusbars::draw() } vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); - this->draw_bar(0, "HP", u.uhp / (float)u.uhpmax, 0, CLR32_RED); - this->draw_bar(1, "Magic", u.uen / (float)u.uenmax, 0, CLR32_BLESS_BLUE); + if (u.uhpmax>0) { + this->draw_bar(0, "HP", u.uhp / (float)u.uhpmax, 0, CLR32_RED); + } + if (u.uenmax>0) { + this->draw_bar(1, "Magic", u.uen / (float)u.uenmax, 0, CLR32_BLESS_BLUE); + } this->draw_bar(2, "Food", hMain, hSec, CLR32_GOLD_SHADE); this->draw_bar(3, "Weight", wMain, wSec, CLR32_BROWN); this->draw_bar(4, "XP", u.uexp / (float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK); @@ -88,7 +92,7 @@ bool statusbars::draw() void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color) { - if (lvlMain < 0 || isinf(lvlMain)) + if (lvlMain < 0 || isinf(lvlMain) || std::isnan(lvlMain)) { lvlMain = 0; } From b30b6aee525d14e24f6af991a7bf54a91fcd1329 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Fri, 3 May 2024 23:02:28 +0100 Subject: [PATCH 14/19] Draw spiderweb of attributes --- win/vulture/winclass/statusattr.cpp | 249 ++++++++++++++++++++++++++++ win/vulture/winclass/statusattr.h | 33 ++++ win/vulture/winclass/statuswin.cpp | 14 +- 3 files changed, 294 insertions(+), 2 deletions(-) create mode 100644 win/vulture/winclass/statusattr.cpp create mode 100644 win/vulture/winclass/statusattr.h diff --git a/win/vulture/winclass/statusattr.cpp b/win/vulture/winclass/statusattr.cpp new file mode 100644 index 0000000..a42c63f --- /dev/null +++ b/win/vulture/winclass/statusattr.cpp @@ -0,0 +1,249 @@ +/* NetHack may be freely redistributed. See license for details. */ + +#include "vulture_sdl.h" /* XXX this must be the first include, + no idea why but it won't compile otherwise */ + +#include "config.h" +#include "global.h" +#include +#include + +#include "vulture_win.h" +#include "vulture_gra.h" +#include "vulture_gfl.h" +#include "vulture_mou.h" +#include "vulture_tile.h" +#include "vulture_txt.h" + +#include "statusattr.h" + +#define META(c) (0x80 | (c)) + +statusattr *stattr; + +statusattr::statusattr(window *p) : window(p) +{ + stattr = this; + autobg = true; + visible = true; +} + +statusattr::~statusattr() +{ +} + +bool statusattr::draw() +{ + vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); + + // actual draw START + float strength = acurr(A_STR) / 25.0; + float dexterity = acurr(A_DEX) / 25.0; + float consitution = acurr(A_CON) / 25.0; + + float intelligence = acurr(A_INT) / 25.0; + float wisdom = acurr(A_WIS) / 25.0; + float charisma = acurr(A_CHA) / 25.0; + + int MAX_AXES = 6; + float dataValues[MAX_AXES] = { + dexterity, + strength, + consitution, + charisma, + wisdom, + intelligence, + }; + + char *dataLabels[MAX_AXES] = { + "Dx", + "St", + "Co", + "Ch", + "Wi", + "In", + }; + + int centerX = this->x + this->w / 2; + int centerY = this->y + this->w / 2; + int radius = this->w / 2 - (vulture_get_lineheight(V_FONT_SMALL) + 2); + + int edgePoints[MAX_AXES][2]; + int dataPoints[MAX_AXES][2]; + int labelPoints[MAX_AXES][2]; + + // do math + float angleIncrement = 2 * M_PI / MAX_AXES; + + for (int i = 0; i < MAX_AXES; ++i) + { + float angle = angleIncrement * i; + float dataRadius = radius * dataValues[i]; + edgePoints[i][0] = centerX + radius * cos(angle); + edgePoints[i][1] = centerY + radius * sin(angle); + dataPoints[i][0] = centerX + dataRadius * cos(angle); + dataPoints[i][1] = centerY + dataRadius * sin(angle); + labelPoints[i][0] = centerX + (radius + vulture_get_lineheight(V_FONT_SMALL)) * cos(angle); + labelPoints[i][1] = centerY + (radius + vulture_get_lineheight(V_FONT_SMALL) / 2) * sin(angle); + } + + // Drawing data + for (int i = 0; i < MAX_AXES; ++i) + { + int nx = dataPoints[0][0]; + int ny = dataPoints[0][1]; + if (i < MAX_AXES - 1) + { + nx = dataPoints[i + 1][0]; + ny = dataPoints[i + 1][1]; + } + + vulture_triangle(centerX, centerY, dataPoints[i][0], dataPoints[i][1], nx, ny, CLR32_BROWN, true); + } + + // Drawing perimeter (spiderweb) + for (int i = 0; i < MAX_AXES; ++i) + { + vulture_free_line(centerX, centerY, edgePoints[i][0], edgePoints[i][1], CLR32_GRAY70); + vulture_put_text(V_FONT_TOOLTIP, dataLabels[i], vulture_screen, labelPoints[i][0] - vulture_get_lineheight(V_FONT_SMALL), labelPoints[i][1] - vulture_get_lineheight(V_FONT_SMALL) / 2, CLR32_WHITE); + } + + // actual draw END + + vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); + + vulture_invalidate_region(abs_x, abs_y, w, h); + + return true; +} + +eventresult statusattr::handle_timer_event(window *target, void *result, int time) +{ + return V_EVENT_HANDLED_NOREDRAW; +} + +eventresult statusattr::handle_mousemotion_event(window *target, void *result, int xrel, + int yrel, int state) +{ + vulture_set_mcursor(V_CURSOR_NORMAL); + return V_EVENT_HANDLED_NOREDRAW; +} + +eventresult statusattr::handle_resize_event(window *target, void *result, int res_w, int res_h) +{ + /* this relies on the fact that the enhance window is created + * immediately after the status window */ + y = sib_prev->y - h; + return V_EVENT_HANDLED_NOREDRAW; +} + +void vulture_free_line_surface( + SDL_Surface *surface, + int x1, int y1, + int x2, int y2, + Uint32 color) +{ + Uint32 *screen; + + if (SDL_MUSTLOCK(surface)) + SDL_LockSurface(surface); + screen = (Uint32 *)surface->pixels; + + int dx = abs(x2 - x1), sx = x1 < x2 ? 1 : -1; + int dy = -abs(y2 - y1), sy = y1 < y2 ? 1 : -1; + int err = dx + dy, e2; /* error value e_xy */ + + while (true) + { /* loop */ + screen[y1 * surface->w + x1] = color; + if (x1 == x2 && y1 == y2) + break; + e2 = 2 * err; + if (e2 >= dy) + { + err += dy; + x1 += sx; + } /* e_xy+e_x > 0 */ + if (e2 <= dx) + { + err += dx; + y1 += sy; + } /* e_xy+e_y < 0 */ + } + + if (SDL_MUSTLOCK(surface)) + SDL_UnlockSurface(surface); +} + +void vulture_triangle_surface( + SDL_Surface *surface, + int x1, int y1, + int x2, int y2, + int x3, int y3, + Uint32 color, bool fill) +{ + if (fill) + { + vulture_fill_triangle_surface(surface, x1, y1, x2, y2, x3, y3, color); + } + else + { + vulture_free_line_surface(surface, x1, y1, x2, y2, color); + vulture_free_line_surface(surface, x2, y2, x3, y3, color); + vulture_free_line_surface(surface, x3, y3, x1, y1, color); + } +} + +struct Point +{ + int x, y; +}; + +// Helper function to sort points vertically +bool comparePoints(const Point &a, const Point &b) +{ + return a.y < b.y; +} + +void vulture_fill_triangle_surface( + SDL_Surface *surface, + int x1, int y1, + int x2, int y2, + int x3, int y3, + Uint32 color) +{ + Point p1 = Point{x : x1, y : y1}; + Point p2 = Point{x : x2, y : y2}; + Point p3 = Point{x : x3, y : y3}; + // GPT start + // Sort the vertices by y-coordinate (top to bottom) + Point vertices[] = {p1, p2, p3}; + std::sort(vertices, vertices + 3, comparePoints); + + float dx1 = vertices[1].y != vertices[0].y ? float(vertices[1].x - vertices[0].x) / (vertices[1].y - vertices[0].y) : 0; + float dx2 = vertices[2].y != vertices[0].y ? float(vertices[2].x - vertices[0].x) / (vertices[2].y - vertices[0].y) : 0; + float dx3 = vertices[2].y != vertices[1].y ? float(vertices[2].x - vertices[1].x) / (vertices[2].y - vertices[1].y) : 0; + + float startX = vertices[0].x; + float endX = vertices[0].x; + + for (int y = vertices[0].y; y <= vertices[2].y; y++) + { + vulture_free_line_surface(surface, startX, y, endX, y, color); + if (y < vertices[1].y) + { + if (vertices[1].y != vertices[0].y) + startX += dx1; + if (vertices[2].y != vertices[0].y) + endX += dx2; + } + else + { + if (vertices[2].y != vertices[1].y) + startX = vertices[1].x + (y - vertices[1].y) * dx3; + if (vertices[2].y != vertices[0].y) + endX += dx2; + } + } + // GPT end +} diff --git a/win/vulture/winclass/statusattr.h b/win/vulture/winclass/statusattr.h new file mode 100644 index 0000000..e2c5e59 --- /dev/null +++ b/win/vulture/winclass/statusattr.h @@ -0,0 +1,33 @@ +/* NetHack may be freely redistributed. See license for details. */ + +#ifndef _statusattr_h_ +#define _statusattr_h_ + +#include +#include "window.h" + + +#define vulture_free_line(x1,y1,x2,y2,cindex) vulture_free_line_surface(vulture_screen,x1,y1,x2,y2,cindex) +#define vulture_triangle(x1,y1,x2,y2,x3,y3,cindex,fill) vulture_triangle_surface(vulture_screen,x1,y1,x2,y2,x3,y3,cindex,fill) + +extern void vulture_free_line_surface(SDL_Surface *,int, int, int, int, Uint32); +extern void vulture_triangle_surface(SDL_Surface *,int, int, int, int, int, int, Uint32, bool); +extern void vulture_fill_triangle_surface(SDL_Surface *,int, int, int, int, int, int, Uint32); + +class statusattr : public window +{ +public: + statusattr(window *p); + virtual ~statusattr(); + virtual bool draw(); + virtual eventresult handle_timer_event(window *target, void *result, int time); + virtual eventresult handle_mousemotion_event(window *target, void *result, int xrel, int yrel, int state); + virtual eventresult handle_resize_event(window *target, void *result, int res_w, int res_h); + +private: + //virtual void calculatePoints(float points[][2], float centerX, float centerY, float radius, float *values, int numValues); +}; + +extern statusattr *stattr; + +#endif diff --git a/win/vulture/winclass/statuswin.cpp b/win/vulture/winclass/statuswin.cpp index 26869ec..90bccc5 100755 --- a/win/vulture/winclass/statuswin.cpp +++ b/win/vulture/winclass/statuswin.cpp @@ -19,6 +19,7 @@ extern const char *const enc_stat[]; /* defined in botl.c */ #include "enhancebutton.h" #include "statusbars.h" #include "statusinv.h" +#include "statusattr.h" #include "textwin.h" #include @@ -32,6 +33,7 @@ statuswin::statuswin(window *p) : window(p) window *subwin; window *bars; window *inv; + window *sattr; statusbg = vulture_load_graphic(V_FILENAME_STATUS_BAR); this->w = statusbg->w; @@ -49,12 +51,20 @@ statuswin::statuswin(window *p) : window(p) bars = new statusbars(this->parent); bars->w = this->w; bars->x = this->x; - bars->y = this->y - bars->h-vulture_get_lineheight(V_FONT_STATUS); + bars->y = this->y - bars->h - vulture_get_lineheight(V_FONT_STATUS); inv = new statusinv(this->parent); inv->x = this->x; inv->y = bars->y - inv->h - vulture_get_lineheight(V_FONT_STATUS); - + + int gap = vulture_get_lineheight(V_FONT_STATUS); + sattr = new statusattr(this->parent); + sattr->x = this->x + this->w + gap; + sattr->y = bars->y; + int sattr_w = this->h + bars->h + gap; + sattr->h = sattr_w; + sattr->w = sattr_w; + for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { From 1bc00540c8786fe10d4b598a10e48a501f0af1ca Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Sat, 4 May 2024 09:53:51 +0100 Subject: [PATCH 15/19] Attribute diagram looks good --- win/vulture/winclass/statusattr.cpp | 31 ++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/win/vulture/winclass/statusattr.cpp b/win/vulture/winclass/statusattr.cpp index a42c63f..dc9be9b 100644 --- a/win/vulture/winclass/statusattr.cpp +++ b/win/vulture/winclass/statusattr.cpp @@ -51,8 +51,8 @@ bool statusattr::draw() strength, consitution, charisma, - wisdom, intelligence, + wisdom, }; char *dataLabels[MAX_AXES] = { @@ -60,8 +60,8 @@ bool statusattr::draw() "St", "Co", "Ch", - "Wi", "In", + "Wi", }; int centerX = this->x + this->w / 2; @@ -83,8 +83,29 @@ bool statusattr::draw() edgePoints[i][1] = centerY + radius * sin(angle); dataPoints[i][0] = centerX + dataRadius * cos(angle); dataPoints[i][1] = centerY + dataRadius * sin(angle); - labelPoints[i][0] = centerX + (radius + vulture_get_lineheight(V_FONT_SMALL)) * cos(angle); - labelPoints[i][1] = centerY + (radius + vulture_get_lineheight(V_FONT_SMALL) / 2) * sin(angle); + + labelPoints[i][0] = (radius + vulture_get_lineheight(V_FONT_SMALL) / 2) * cos(angle); + char *lbl = dataLabels[i]; + if (labelPoints[i][0] > centerX) + { + labelPoints[i][0] += vulture_text_length(V_FONT_SMALL, lbl) / 2; + } + else if (labelPoints[i][0] < centerX) + { + labelPoints[i][0] -= vulture_text_length(V_FONT_SMALL, lbl) / 2; + } + labelPoints[i][0] += centerX; + + labelPoints[i][1] = (radius + vulture_get_lineheight(V_FONT_SMALL) / 2) * sin(angle); + if (labelPoints[i][1] > centerY) + { + labelPoints[i][1] += vulture_get_lineheight(V_FONT_SMALL) / 2; + } + else if (labelPoints[i][1] < centerY) + { + labelPoints[i][1] -= vulture_get_lineheight(V_FONT_SMALL) / 2; + } + labelPoints[i][1] += centerY; } // Drawing data @@ -105,7 +126,7 @@ bool statusattr::draw() for (int i = 0; i < MAX_AXES; ++i) { vulture_free_line(centerX, centerY, edgePoints[i][0], edgePoints[i][1], CLR32_GRAY70); - vulture_put_text(V_FONT_TOOLTIP, dataLabels[i], vulture_screen, labelPoints[i][0] - vulture_get_lineheight(V_FONT_SMALL), labelPoints[i][1] - vulture_get_lineheight(V_FONT_SMALL) / 2, CLR32_WHITE); + vulture_put_text(V_FONT_TOOLTIP, dataLabels[i], vulture_screen, labelPoints[i][0], labelPoints[i][1], CLR32_GRAY20); } // actual draw END From 9b8910bc714bdfe6bf6b319b87cfc8a351ae929a Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Sat, 4 May 2024 09:54:29 +0100 Subject: [PATCH 16/19] Make it compile on Linux --- sys/unix/Makefile.src | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/unix/Makefile.src b/sys/unix/Makefile.src index 571af8c..9386bc6 100755 --- a/sys/unix/Makefile.src +++ b/sys/unix/Makefile.src @@ -307,7 +307,7 @@ WINOBJ = $(WINVULTUREOBJ) #WINTTYLIB = -ltermlib # SDL libraries for Vulture's Eye -WINVULTURELIB = `$(SDL_CONFIG) --libs` $(SDLMAIN) -lSDL_mixer -lSDL_ttf -lpng -lz -logg -lvorbis -ltheoradec -lpthread +WINVULTURELIB = `$(SDL_CONFIG) --libs` $(SDLMAIN) -lSDL_mixer -lm -lSDL_ttf -lpng -lz -logg -lvorbis -ltheoradec -lpthread ifeq ($(OS),Darwin) WINVULTURELIB += -lstdc++ endif From 9c5c1d6360d6954d49e7b8ad6a74af490a64eb8d Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Sat, 4 May 2024 11:05:21 +0100 Subject: [PATCH 17/19] Dockerize --- .dockerignore | 7 +++++++ .gitignore | 5 +++++ Dockerfile | 17 +++++++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..806fbf1 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +Dockerfile +.git +.idea +.vscode +*.o +.d +*.d.* \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5e4f69f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.idea + +*.o +*.d +*.d.* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..71fb319 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# the goal here is to document the build process on Linux +# so people can setup their dev envs + +FROM ubuntu:24.04 + +RUN apt-get -y update +RUN apt-get install -y build-essential bison flex libcurses-ocaml-dev libpng-dev libtheora-dev +RUN apt-get install -y libsdl1.2-dev libsdl-mixer1.2-dev libsdl1.2-compat-dev libsdl-ttf2.0-dev +RUN apt-get install -y gdb + +ADD . /src + +WORKDIR /src +RUN ./sys/unix/setup.sh sys/unix/hints/linux +RUN make +RUN make install +RUN /root/nh/games/vulture-nethack-3.6.7 \ No newline at end of file From d2148311423e0acc9f1f480ef4dbb835a98a5c22 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Sun, 5 May 2024 16:51:07 +0100 Subject: [PATCH 18/19] display hint text inside statusbar --- win/vulture/winclass/statusbars.cpp | 34 ++++++++++++++++------------- win/vulture/winclass/statusbars.h | 2 +- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp index 26e02aa..eac2235 100755 --- a/win/vulture/winclass/statusbars.cpp +++ b/win/vulture/winclass/statusbars.cpp @@ -3,16 +3,16 @@ #include "vulture_sdl.h" /* XXX this must be the first include, no idea why but it won't compile otherwise */ -#include "config.h" -#include "global.h" -#include extern "C" { -#ifndef VULTURE_NETHACK_3_6_7 - boolean can_advance(int skill, int speedy); -#endif + extern const char *hu_stat[]; /* defined in eat.c */ + extern const char *const enc_stat[]; /* defined in botl.c */ } +#include "config.h" +#include "global.h" +#include + #include "vulture_win.h" #include "vulture_gra.h" #include "vulture_gfl.h" @@ -74,15 +74,18 @@ bool statusbars::draw() } vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1); - if (u.uhpmax>0) { - this->draw_bar(0, "HP", u.uhp / (float)u.uhpmax, 0, CLR32_RED); + if (u.uhpmax > 0) + { + this->draw_bar(0, "HP", u.uhp / (float)u.uhpmax, 0, CLR32_RED, ""); } - if (u.uenmax>0) { - this->draw_bar(1, "Magic", u.uen / (float)u.uenmax, 0, CLR32_BLESS_BLUE); + if (u.uenmax > 0) + { + this->draw_bar(1, "Magic", u.uen / (float)u.uenmax, 0, CLR32_BLESS_BLUE, ""); } - this->draw_bar(2, "Food", hMain, hSec, CLR32_GOLD_SHADE); - this->draw_bar(3, "Weight", wMain, wSec, CLR32_BROWN); - this->draw_bar(4, "XP", u.uexp / (float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK); + this->draw_bar(2, "Food", hMain, hSec, CLR32_GOLD_SHADE, hu_stat[u.uhs]); + int cap = near_capacity(); + this->draw_bar(3, "Weight", wMain, wSec, CLR32_BROWN, enc_stat[cap]); + this->draw_bar(4, "XP", u.uexp / (float)newuexp(u.ulevel), 0, CLR32_LIGHTPINK, ""); vulture_set_draw_region(0, 0, vulture_screen->w - 1, vulture_screen->h - 1); vulture_invalidate_region(abs_x, abs_y, w, h); @@ -90,7 +93,7 @@ bool statusbars::draw() return true; } -void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color) +void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSecondary, Uint32 color, std::string hint) { if (lvlMain < 0 || isinf(lvlMain) || std::isnan(lvlMain)) { @@ -99,11 +102,12 @@ void statusbars::draw_bar(int i, std::string label, float lvlMain, float lvlSeco int by = y + (barh + 5) * i; vulture_fill_rect(x, by, x + w * lvlMain, by + barh, color); - vulture_put_text(V_FONT_TOOLTIP, label, vulture_screen, x + 1, by + 1, CLR32_WHITE); if (lvlSecondary > 0) { vulture_fill_rect(x + w * lvlSecondary, by, x + w * lvlSecondary, by + barh, CLR32_WHITE); } + vulture_put_text(V_FONT_TOOLTIP, label, vulture_screen, x + 1, by + 1, CLR32_WHITE); + vulture_put_text(V_FONT_TOOLTIP, hint, vulture_screen, x + w - vulture_text_length(V_FONT_TOOLTIP, label) - 1, by + 1, CLR32_YELLOW); vulture_rect(x, by, x + w, by + barh, CLR32_GRAY70); } diff --git a/win/vulture/winclass/statusbars.h b/win/vulture/winclass/statusbars.h index 626747f..4b6fb28 100755 --- a/win/vulture/winclass/statusbars.h +++ b/win/vulture/winclass/statusbars.h @@ -19,7 +19,7 @@ class statusbars : public window virtual eventresult handle_resize_event(window* target, void* result, int res_w, int res_h); private: - void draw_bar(int index, std::string label, float lvlMain, float lvlSecondary, Uint32 color); + void draw_bar(int index, std::string label, float lvlMain, float lvlSecondary, Uint32 color, std::string hint); }; extern statusbars *stbars; From 8e1133adc7db2f281a163c34fc57833c921eec51 Mon Sep 17 00:00:00 2001 From: Andrei Pohilko Date: Tue, 7 May 2024 13:01:26 +0100 Subject: [PATCH 19/19] Fix resizeing issues --- win/vulture/winclass/statusattr.cpp | 1 - win/vulture/winclass/statusbars.cpp | 1 - win/vulture/winclass/statusinv.cpp | 3 +-- win/vulture/winclass/statuswin.cpp | 27 +++++++++++++++------------ win/vulture/winclass/statuswin.h | 4 ++++ 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/win/vulture/winclass/statusattr.cpp b/win/vulture/winclass/statusattr.cpp index dc9be9b..2f39745 100644 --- a/win/vulture/winclass/statusattr.cpp +++ b/win/vulture/winclass/statusattr.cpp @@ -154,7 +154,6 @@ eventresult statusattr::handle_resize_event(window *target, void *result, int re { /* this relies on the fact that the enhance window is created * immediately after the status window */ - y = sib_prev->y - h; return V_EVENT_HANDLED_NOREDRAW; } diff --git a/win/vulture/winclass/statusbars.cpp b/win/vulture/winclass/statusbars.cpp index eac2235..d54a14a 100755 --- a/win/vulture/winclass/statusbars.cpp +++ b/win/vulture/winclass/statusbars.cpp @@ -127,6 +127,5 @@ eventresult statusbars::handle_resize_event(window *target, void *result, int re { /* this relies on the fact that the enhance window is created * immediately after the status window */ - y = sib_prev->y - h; return V_EVENT_HANDLED_NOREDRAW; } diff --git a/win/vulture/winclass/statusinv.cpp b/win/vulture/winclass/statusinv.cpp index 7c1621b..1e8c9a8 100755 --- a/win/vulture/winclass/statusinv.cpp +++ b/win/vulture/winclass/statusinv.cpp @@ -101,7 +101,7 @@ void statusinv::draw_obj(obj *obj, float rx, float ry) vulture_set_draw_region(cx, cy, cx + ch, cy + ch); /* darken the background */ - vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, obj && obj == ublindf ? CLR32_GRAY20 : CLR32_BLACK_A50); + vulture_fill_rect(cx + 2, cy + 2, cx + ch - 3, cy + ch - 3, obj && obj == ublindf ? CLR32_GRAY70 : CLR32_BLACK_A50); if (obj) { @@ -174,6 +174,5 @@ eventresult statusinv::handle_resize_event(window *target, void *result, int res { /* this relies on the fact that the enhance window is created * immediately after the status window */ - y = sib_prev->y - h; return V_EVENT_HANDLED_NOREDRAW; } diff --git a/win/vulture/winclass/statuswin.cpp b/win/vulture/winclass/statuswin.cpp index 90bccc5..58379a5 100755 --- a/win/vulture/winclass/statuswin.cpp +++ b/win/vulture/winclass/statuswin.cpp @@ -31,9 +31,6 @@ static Uint32 warn_colors[V_MAX_WARN]; statuswin::statuswin(window *p) : window(p) { window *subwin; - window *bars; - window *inv; - window *sattr; statusbg = vulture_load_graphic(V_FILENAME_STATUS_BAR); this->w = statusbg->w; @@ -50,21 +47,16 @@ statuswin::statuswin(window *p) : window(p) bars = new statusbars(this->parent); bars->w = this->w; - bars->x = this->x; - bars->y = this->y - bars->h - vulture_get_lineheight(V_FONT_STATUS); - + inv = new statusinv(this->parent); - inv->x = this->x; - inv->y = bars->y - inv->h - vulture_get_lineheight(V_FONT_STATUS); - int gap = vulture_get_lineheight(V_FONT_STATUS); sattr = new statusattr(this->parent); - sattr->x = this->x + this->w + gap; - sattr->y = bars->y; - int sattr_w = this->h + bars->h + gap; + int sattr_w = this->h * 2; sattr->h = sattr_w; sattr->w = sattr_w; + this->position(); + for (int i = 0; i < 5; i++) for (int j = 0; j < 5; j++) { @@ -88,6 +80,16 @@ statuswin::statuswin(window *p) : window(p) warn_colors[V_WARN_CRITICAL] = CLR32_RED; } +void statuswin::position() { + bars->x = vulture_screen->w / 2 - this->w / 2; + bars->y = vulture_screen->h - bars->h - vulture_get_lineheight(V_FONT_STATUS); + + inv->x = this->x; + inv->y = this->y - inv->h - 1; + + sattr->x = this->x + this->w + vulture_get_lineheight(V_FONT_STATUS); + sattr->y = vulture_screen->h - (sattr->h + 1); +} statuswin::~statuswin() { @@ -125,6 +127,7 @@ eventresult statuswin::handle_resize_event(window* target, void* result, int res { /* x coordinate does not change */ y = parent->h - (h + 6); + position(); return V_EVENT_HANDLED_NOREDRAW; } diff --git a/win/vulture/winclass/statuswin.h b/win/vulture/winclass/statuswin.h index f1744bb..ed5f069 100755 --- a/win/vulture/winclass/statuswin.h +++ b/win/vulture/winclass/statuswin.h @@ -35,8 +35,12 @@ class statuswin : public window private: void add_cond(std::string str, int warnno, int color); + void position(); SDL_Surface *statusbg; textwin *tokenarray[5][5]; + window *bars; + window *inv; + window *sattr; }; extern statuswin *stwin;