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