1 //=============================================================================
2 //
3 // Adventure Game Studio (AGS)
4 //
5 // Copyright (C) 1999-2011 Chris Jones and 2011-20xx others
6 // The full list of copyright holders can be found in the Copyright.txt
7 // file, which is part of this source code distribution.
8 //
9 // The AGS source code is provided under the Artistic License 2.0.
10 // A copy of this license can be found in the file License.txt and at
11 // http://www.opensource.org/licenses/artistic-license-2.0.php
12 //
13 //=============================================================================
14
15 #include "ac/common.h"
16 #include "ac/display.h"
17 #include "ac/draw.h"
18 #include "ac/gamesetupstruct.h"
19 #include "ac/global_game.h"
20 #include "ac/global_gui.h"
21 #include "ac/gui.h"
22 #include "ac/guicontrol.h"
23 #include "ac/mouse.h"
24 #include "ac/string.h"
25 #include "debug/debug_log.h"
26 #include "gui/guimain.h"
27 #include "script/runtimescriptvalue.h"
28
29 using namespace AGS::Common;
30
31 extern GameSetupStruct game;
32 extern ScriptGUI *scrGui;
33
IsGUIOn(int guinum)34 int IsGUIOn (int guinum) {
35 if ((guinum < 0) || (guinum >= game.numgui))
36 quit("!IsGUIOn: invalid GUI number specified");
37 return (guis[guinum].IsVisible()) ? 1 : 0;
38 }
39
40 // This is an internal script function, and is undocumented.
41 // It is used by the editor's automatic macro generation.
FindGUIID(const char * GUIName)42 int FindGUIID (const char* GUIName) {
43 for (int ii = 0; ii < game.numgui; ii++) {
44 if (guis[ii].Name.IsEmpty())
45 continue;
46 if (strcmp(guis[ii].Name, GUIName) == 0)
47 return ii;
48 if ((guis[ii].Name[0u] == 'g') && (stricmp(guis[ii].Name.GetCStr() + 1, GUIName) == 0))
49 return ii;
50 }
51 quit("FindGUIID: No matching GUI found: GUI may have been deleted");
52 return -1;
53 }
54
InterfaceOn(int ifn)55 void InterfaceOn(int ifn) {
56 if ((ifn<0) | (ifn>=game.numgui))
57 quit("!GUIOn: invalid GUI specified");
58
59 EndSkippingUntilCharStops();
60
61 if (guis[ifn].IsVisible()) {
62 debug_script_log("GUIOn(%d) ignored (already on)", ifn);
63 return;
64 }
65 guis_need_update = 1;
66 guis[ifn].SetVisibility(kGUIVisibility_On);
67 debug_script_log("GUI %d turned on", ifn);
68 // modal interface
69 if (guis[ifn].PopupStyle==kGUIPopupModal) PauseGame();
70 else if (guis[ifn].PopupStyle==kGUIPopupMouseY) guis[ifn].SetVisibility(kGUIVisibility_Off);
71 // clear the cached mouse position
72 guis[ifn].OnControlPositionChanged();
73 guis[ifn].Poll();
74 }
75
InterfaceOff(int ifn)76 void InterfaceOff(int ifn) {
77 if ((ifn<0) | (ifn>=game.numgui)) quit("!GUIOff: invalid GUI specified");
78 if ((guis[ifn].IsOff()) && (guis[ifn].PopupStyle!=kGUIPopupMouseY)) {
79 debug_script_log("GUIOff(%d) ignored (already off)", ifn);
80 return;
81 }
82 debug_script_log("GUI %d turned off", ifn);
83 guis[ifn].SetVisibility(kGUIVisibility_Off);
84 if (guis[ifn].MouseOverCtrl>=0) {
85 // Make sure that the overpic is turned off when the GUI goes off
86 guis[ifn].Controls[guis[ifn].MouseOverCtrl]->MouseLeave();
87 guis[ifn].MouseOverCtrl = -1;
88 }
89 guis[ifn].OnControlPositionChanged();
90 guis_need_update = 1;
91 // modal interface
92 if (guis[ifn].PopupStyle==kGUIPopupModal) UnPauseGame();
93 else if (guis[ifn].PopupStyle==kGUIPopupMouseY) guis[ifn].SetVisibility(kGUIVisibility_Concealed);
94 }
95
SetGUIObjectEnabled(int guin,int objn,int enabled)96 void SetGUIObjectEnabled(int guin, int objn, int enabled) {
97 if ((guin<0) || (guin>=game.numgui))
98 quit("!SetGUIObjectEnabled: invalid GUI number");
99 if ((objn<0) || (objn>=guis[guin].ControlCount))
100 quit("!SetGUIObjectEnabled: invalid object number");
101
102 GUIControl_SetEnabled(guis[guin].Controls[objn], enabled);
103 }
104
SetGUIObjectPosition(int guin,int objn,int xx,int yy)105 void SetGUIObjectPosition(int guin, int objn, int xx, int yy) {
106 if ((guin<0) || (guin>=game.numgui))
107 quit("!SetGUIObjectPosition: invalid GUI number");
108 if ((objn<0) || (objn>=guis[guin].ControlCount))
109 quit("!SetGUIObjectPosition: invalid object number");
110
111 GUIControl_SetPosition(guis[guin].Controls[objn], xx, yy);
112 }
113
SetGUIPosition(int ifn,int xx,int yy)114 void SetGUIPosition(int ifn,int xx,int yy) {
115 if ((ifn<0) || (ifn>=game.numgui))
116 quit("!SetGUIPosition: invalid GUI number");
117
118 GUI_SetPosition(&scrGui[ifn], xx, yy);
119 }
120
SetGUIObjectSize(int ifn,int objn,int newwid,int newhit)121 void SetGUIObjectSize(int ifn, int objn, int newwid, int newhit) {
122 if ((ifn<0) || (ifn>=game.numgui))
123 quit("!SetGUIObjectSize: invalid GUI number");
124
125 if ((objn<0) || (objn >= guis[ifn].ControlCount))
126 quit("!SetGUIObjectSize: invalid object number");
127
128 GUIControl_SetSize(guis[ifn].Controls[objn], newwid, newhit);
129 }
130
SetGUISize(int ifn,int widd,int hitt)131 void SetGUISize (int ifn, int widd, int hitt) {
132 if ((ifn<0) || (ifn>=game.numgui))
133 quit("!SetGUISize: invalid GUI number");
134
135 GUI_SetSize(&scrGui[ifn], widd, hitt);
136 }
137
SetGUIZOrder(int guin,int z)138 void SetGUIZOrder(int guin, int z) {
139 if ((guin<0) || (guin>=game.numgui))
140 quit("!SetGUIZOrder: invalid GUI number");
141
142 GUI_SetZOrder(&scrGui[guin], z);
143 }
144
SetGUIClickable(int guin,int clickable)145 void SetGUIClickable(int guin, int clickable) {
146 if ((guin<0) || (guin>=game.numgui))
147 quit("!SetGUIClickable: invalid GUI number");
148
149 GUI_SetClickable(&scrGui[guin], clickable);
150 }
151
152 // pass trans=0 for fully solid, trans=100 for fully transparent
SetGUITransparency(int ifn,int trans)153 void SetGUITransparency(int ifn, int trans) {
154 if ((ifn < 0) | (ifn >= game.numgui))
155 quit("!SetGUITransparency: invalid GUI number");
156
157 GUI_SetTransparency(&scrGui[ifn], trans);
158 }
159
CentreGUI(int ifn)160 void CentreGUI (int ifn) {
161 if ((ifn<0) | (ifn>=game.numgui))
162 quit("!CentreGUI: invalid GUI number");
163
164 GUI_Centre(&scrGui[ifn]);
165 }
166
GetTextWidth(const char * text,int fontnum)167 int GetTextWidth(const char *text, int fontnum) {
168 VALIDATE_STRING(text);
169 if ((fontnum < 0) || (fontnum >= game.numfonts))
170 quit("!GetTextWidth: invalid font number.");
171
172 return divide_down_coordinate(wgettextwidth_compensate(text, fontnum));
173 }
174
GetTextHeight(const char * text,int fontnum,int width)175 int GetTextHeight(const char *text, int fontnum, int width) {
176 VALIDATE_STRING(text);
177 if ((fontnum < 0) || (fontnum >= game.numfonts))
178 quit("!GetTextHeight: invalid font number.");
179
180 break_up_text_into_lines(multiply_up_coordinate(width), fontnum, text);
181
182 return divide_down_coordinate(getheightoflines(fontnum, numlines));
183 }
184
GetFontHeight(int fontnum)185 int GetFontHeight(int fontnum)
186 {
187 if ((fontnum < 0) || (fontnum >= game.numfonts))
188 quit("!GetFontHeight: invalid font number.");
189 return divide_down_coordinate(getfontheight_outlined(fontnum));
190 }
191
GetFontLineSpacing(int fontnum)192 int GetFontLineSpacing(int fontnum)
193 {
194 if ((fontnum < 0) || (fontnum >= game.numfonts))
195 quit("!GetFontLineSpacing: invalid font number.");
196 return divide_down_coordinate(getfontspacing_outlined(fontnum));
197 }
198
SetGUIBackgroundPic(int guin,int slotn)199 void SetGUIBackgroundPic (int guin, int slotn) {
200 if ((guin<0) | (guin>=game.numgui))
201 quit("!SetGUIBackgroundPic: invalid GUI number");
202
203 GUI_SetBackgroundGraphic(&scrGui[guin], slotn);
204 }
205
DisableInterface()206 void DisableInterface() {
207 play.disabled_user_interface++;
208 guis_need_update = 1;
209 set_mouse_cursor(CURS_WAIT);
210 }
211
EnableInterface()212 void EnableInterface() {
213 guis_need_update = 1;
214 play.disabled_user_interface--;
215 if (play.disabled_user_interface<1) {
216 play.disabled_user_interface=0;
217 set_default_cursor();
218 }
219 }
220 // Returns 1 if user interface is enabled, 0 if disabled
IsInterfaceEnabled()221 int IsInterfaceEnabled() {
222 return (play.disabled_user_interface > 0) ? 0 : 1;
223 }
224
GetGUIObjectAt(int xx,int yy)225 int GetGUIObjectAt (int xx, int yy) {
226 GUIObject *toret = GetGUIControlAtLocation(xx, yy);
227 if (toret == NULL)
228 return -1;
229
230 return toret->objn;
231 }
232
GetGUIAt(int xx,int yy)233 int GetGUIAt (int xx,int yy) {
234 multiply_up_coordinates(&xx, &yy);
235
236 int aa, ll;
237 for (ll = game.numgui - 1; ll >= 0; ll--) {
238 aa = play.gui_draw_order[ll];
239 if (guis[aa].IsInteractableAt(xx, yy))
240 return aa;
241 }
242 return -1;
243 }
244
SetTextWindowGUI(int guinum)245 void SetTextWindowGUI (int guinum) {
246 if ((guinum < -1) | (guinum >= game.numgui))
247 quit("!SetTextWindowGUI: invalid GUI number");
248
249 if (guinum < 0) ; // disable it
250 else if (!guis[guinum].IsTextWindow())
251 quit("!SetTextWindowGUI: specified GUI is not a text window");
252
253 if (play.speech_textwindow_gui == game.options[OPT_TWCUSTOM])
254 play.speech_textwindow_gui = guinum;
255 game.options[OPT_TWCUSTOM] = guinum;
256 }
257