1 /*-------------------------------------------------------------------------------
2
3 BARONY
4 File: bookgui.cpp
5 Desc: contains book (GUI) related functions
6
7 Copyright 2013-2016 (c) Turning Wheel LLC, all rights reserved.
8 See LICENSE for details.
9
10 -------------------------------------------------------------------------------*/
11
12 #include "../main.hpp"
13 #include "../draw.hpp"
14 #include "../game.hpp"
15 #include "../stat.hpp"
16 #include "../items.hpp"
17 #include "../book.hpp"
18 #include "../sound.hpp"
19 #include "../scores.hpp"
20 #include "../player.hpp"
21 #include "interface.hpp"
22
23 /*-------------------------------------------------------------------------------
24
25 updateBookGUI
26
27 Does all book gui processing
28
29 -------------------------------------------------------------------------------*/
30
updateBookGUI()31 void updateBookGUI()
32 {
33 if ( !book_open || !book_page || !open_book)
34 {
35 book_open = false;
36 book_page = nullptr;
37 open_book = nullptr;
38 dragging_book_GUI = false;
39 return;
40 }
41
42 SDL_Rect pos;
43
44 //Center the book GUI.
45 pos.x = BOOK_GUI_X;
46 pos.y = BOOK_GUI_Y;
47 if (mouseInBounds(BOOK_GUI_X + bookgui_img->w - FLIPMARGIN, BOOK_GUI_X + bookgui_img->w, BOOK_GUI_Y + DRAGHEIGHT_BOOK, BOOK_GUI_Y + bookgui_img->h) )
48 {
49 drawImage(book_highlighted_right_img, NULL, &pos);
50 }
51 else if (mouseInBounds(BOOK_GUI_X, BOOK_GUI_X + FLIPMARGIN, BOOK_GUI_Y + DRAGHEIGHT_BOOK, BOOK_GUI_Y + bookgui_img->h) )
52 {
53 drawImage(book_highlighted_left_img, NULL, &pos);
54 }
55 else
56 {
57 drawImage(bookgui_img, NULL, &pos);
58 }
59
60 if ( *inputPressed(joyimpulses[INJOY_MENU_BOOK_NEXT]) )
61 {
62 *inputPressed(joyimpulses[INJOY_MENU_BOOK_NEXT]) = 0;
63 if (book_page->next)
64 {
65 if (book_page->next->next)
66 {
67 book_page = book_page->next->next;
68 playSound(83 + rand() % 6, 128);
69 }
70 }
71 }
72
73 if ( *inputPressed(joyimpulses[INJOY_MENU_BOOK_PREV]) )
74 {
75 *inputPressed(joyimpulses[INJOY_MENU_BOOK_PREV]) = 0;
76 if (book_page->prev)
77 {
78 if (book_page->prev->prev)
79 {
80 book_page = book_page->prev->prev;
81 playSound(83 + rand() % 6, 128);
82 }
83 }
84 }
85
86 if ( *inputPressed(joyimpulses[INJOY_MENU_CANCEL]) )
87 {
88 *inputPressed(joyimpulses[INJOY_MENU_CANCEL]) = 0;
89 closeBookGUI();
90 }
91
92 // book gui
93 if ( mousestatus[SDL_BUTTON_LEFT] )
94 {
95 //book_t GUI next page button.
96 if ( mouseInBounds(BOOK_GUI_X + bookgui_img->w - FLIPMARGIN, BOOK_GUI_X + bookgui_img->w, BOOK_GUI_Y + DRAGHEIGHT_BOOK, BOOK_GUI_Y + bookgui_img->h) )
97 {
98 mousestatus[SDL_BUTTON_LEFT] = 0;
99 if (book_page->next)
100 {
101 if (book_page->next->next)
102 {
103 book_page = book_page->next->next;
104 playSound(83 + rand() % 6, 128);
105 }
106 }
107 }
108 else if ( mouseInBounds(BOOK_GUI_X, BOOK_GUI_X + FLIPMARGIN, BOOK_GUI_Y + DRAGHEIGHT_BOOK, BOOK_GUI_Y + bookgui_img->h) )
109 {
110 mousestatus[SDL_BUTTON_LEFT] = 0;
111 if (book_page->prev)
112 {
113 if (book_page->prev->prev)
114 {
115 book_page = book_page->prev->prev;
116 playSound(83 + rand() % 6, 128);
117 }
118 }
119 }
120 if ( !mouseInBounds(BOOK_GUI_X, BOOK_GUI_X + bookgui_img->w, BOOK_GUI_Y, BOOK_GUI_Y + bookgui_img->h) )
121 {
122 // closing book
123 closeBookGUI();
124 }
125 if ( mouseInBounds(BOOK_GUI_X + FLIPMARGIN, BOOK_GUI_X + bookgui_img->w - FLIPMARGIN, BOOK_GUI_Y, BOOK_GUI_Y + bookgui_img->h) || mouseInBounds(BOOK_GUI_X, BOOK_GUI_X + bookgui_img->w, BOOK_GUI_Y, BOOK_GUI_Y + DRAGHEIGHT_BOOK) )
126 {
127 // moving book
128 gui_clickdrag = true;
129 dragging_book_GUI = true;
130 dragoffset_x = omousex - BOOK_GUI_X;
131 dragoffset_y = omousey - BOOK_GUI_Y;
132 mousestatus[SDL_BUTTON_LEFT] = 0;
133 }
134 }
135
136 // render the book's text
137 Uint32 color = SDL_MapRGBA(mainsurface->format, 0, 0, 0, 255);
138 string_t* pagetext = (string_t*)book_page->element;
139 ttfPrintTextColor(BOOK_FONT, BOOK_GUI_X + 44, BOOK_GUI_Y + 20, color, false, pagetext->data );
140 if ( book_page->next != NULL )
141 {
142 string_t* pagetext = (string_t*)book_page->next->element;
143 ttfPrintTextColor(BOOK_FONT, BOOK_GUI_X + 316, BOOK_GUI_Y + 20, color, false, pagetext->data );
144 }
145
146 if (dragging_book_GUI)
147 {
148 if (gui_clickdrag)
149 {
150 bookgui_offset_x = (omousex - dragoffset_x) - (BOOK_GUI_X - bookgui_offset_x);
151 bookgui_offset_y = (omousey - dragoffset_y) - (BOOK_GUI_Y - bookgui_offset_y);
152 if (BOOK_GUI_X <= 0)
153 {
154 bookgui_offset_x = 0 - (BOOK_GUI_X - bookgui_offset_x);
155 }
156 if (BOOK_GUI_X > 0 + xres - bookgui_img->w)
157 {
158 bookgui_offset_x = (0 + xres - bookgui_img->w) - (BOOK_GUI_X - bookgui_offset_x);
159 }
160 if (BOOK_GUI_Y <= 0)
161 {
162 bookgui_offset_y = 0 - (BOOK_GUI_Y - bookgui_offset_y);
163 }
164 if (BOOK_GUI_Y > 0 + yres - bookgui_img->h)
165 {
166 bookgui_offset_y = (0 + yres - bookgui_img->h) - (BOOK_GUI_Y - bookgui_offset_y);
167 }
168 }
169 else
170 {
171 dragging_book_GUI = false;
172 }
173 }
174 }
175
176 /*-------------------------------------------------------------------------------
177
178 closeBookGUI
179
180 closes any open book
181
182 -------------------------------------------------------------------------------*/
183
closeBookGUI()184 void closeBookGUI()
185 {
186 book_open = false;
187 /*if (book_page)
188 free(book_page);*/
189 dragging_book_GUI = false;
190 open_book = NULL;
191 open_book_item = NULL;
192 }
193
194 /*-------------------------------------------------------------------------------
195
196 openBook
197
198 opens the given book
199
200 -------------------------------------------------------------------------------*/
201
openBook(book_t * book,Item * item)202 void openBook(book_t* book, Item* item)
203 {
204 if (!book || !book->pages.first)
205 {
206 return;
207 }
208
209 openStatusScreen(GUI_MODE_INVENTORY, INVENTORY_MODE_ITEM); // Reset the GUI to the inventory.
210 shootmode = false;
211 book_page = book->pages.first;
212 book_open = true;
213 open_book = book;
214
215 open_book_item = item;
216
217 // add the book to the list of read books
218 bool hasreadbook = false;
219 node_t* node;
220 for ( node = booksRead.first; node != NULL; node = node->next )
221 {
222 if ( !strcmp(book->name, (char*)node->element) )
223 {
224 hasreadbook = true;
225 break;
226 }
227 }
228 if ( !hasreadbook )
229 {
230 char* bookName = (char*) malloc(sizeof(char) * (strlen(book->name) + 1));
231 strcpy(bookName, book->name);
232
233 node = list_AddNodeFirst(&booksRead);
234 node->element = bookName;
235 node->size = sizeof(char) * (strlen(book->name) + 1);
236 node->deconstructor = &defaultDeconstructor;
237 }
238
239 // activate the steam achievement
240 if ( list_Size(&booksRead) >= numbooks )
241 {
242 steamAchievement("BARONY_ACH_WELL_READ");
243 }
244 }
245