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