1 /* NetHack may be freely redistributed. See license for details. */
2
3 #include "vulture_sdl.h" /* XXX this must be the first include,
4 no idea why but it won't compile otherwise */
5
6 extern "C" {
7 #include "hack.h"
8 boolean can_advance(int skill, int speedy);
9 }
10
11 #include "vulture_win.h"
12 #include "vulture_gra.h"
13 #include "vulture_gfl.h"
14 #include "vulture_mou.h"
15 #include "vulture_tile.h"
16
17 #include "enhancebutton.h"
18
19
20 #define META(c) (0x80 | (c))
21
22 enhancebutton *enhancebtn;
23
enhancebutton(window * p)24 enhancebutton::enhancebutton(window *p) : window(p)
25 {
26 image = vulture_load_graphic(V_FILENAME_ENHANCE);
27 w = image->w;
28 h = image->h;
29
30 enhancebtn = this;
31 autobg = true;
32 visible = false;
33 }
34
~enhancebutton()35 enhancebutton::~enhancebutton()
36 {
37 SDL_FreeSurface(image);
38 }
39
draw()40 bool enhancebutton::draw()
41 {
42 vulture_set_draw_region(abs_x, abs_y, abs_x + w - 1, abs_y + h - 1);
43 vulture_put_img(abs_x, abs_y, image);
44 vulture_set_draw_region(0, 0, vulture_screen->w-1, vulture_screen->h-1);
45
46 vulture_invalidate_region(abs_x, abs_y, w, h);
47
48 return true;
49 }
50
51
handle_timer_event(window * target,void * result,int time)52 eventresult enhancebutton::handle_timer_event(window* target, void* result, int time)
53 {
54 if (time > HOVERTIMEOUT)
55 vulture_mouse_set_tooltip((char *)"Enhance a skill");
56 return V_EVENT_HANDLED_NOREDRAW;
57 }
58
59
handle_mousemotion_event(window * target,void * result,int xrel,int yrel,int state)60 eventresult enhancebutton::handle_mousemotion_event(window* target, void* result, int xrel,
61 int yrel, int state)
62 {
63 vulture_set_mcursor(V_CURSOR_NORMAL);
64 return V_EVENT_HANDLED_NOREDRAW;
65 }
66
67
handle_mousebuttonup_event(window * target,void * result,int mouse_x,int mouse_y,int button,int state)68 eventresult enhancebutton::handle_mousebuttonup_event(window* target, void* result,
69 int mouse_x, int mouse_y, int button, int state)
70 {
71 if (button != SDL_BUTTON_LEFT)
72 return V_EVENT_HANDLED_NOREDRAW;
73
74 ((vulture_event*)result)->num = META('e');
75 return V_EVENT_HANDLED_FINAL;
76 }
77
78
handle_resize_event(window * target,void * result,int res_w,int res_h)79 eventresult enhancebutton::handle_resize_event(window* target, void* result, int res_w, int res_h)
80 {
81 /* this relies on the fact that the enhance window is created
82 * immediately after the status window */
83 y = sib_prev->y - h;
84 return V_EVENT_HANDLED_NOREDRAW;
85 }
86
87
88 /* enable and display the enhance icon if enhance is possible */
check_enhance(void)89 void enhancebutton::check_enhance(void)
90 {
91 int to_advance = 0, i;
92 bool prev_vis;
93
94 /* check every skill */
95 for (i = 0; i < P_NUM_SKILLS; i++)
96 {
97 if (P_RESTRICTED(i))
98 continue;
99 if (can_advance(i, FALSE))
100 to_advance++;
101 }
102
103 prev_vis = visible;
104
105 if (!to_advance && prev_vis)
106 hide();
107 else if (!visible && to_advance)
108 visible = true;
109 }
110
111