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