1 /*
2 * Copyright (C) 2004 Ivo Danihelka (ivo@danihelka.net)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 */
9 #include "level-script.h"
10
11 #include "Log.h"
12 #include "Path.h"
13 #include "V2.h"
14 #include "Level.h"
15 #include "LevelScript.h"
16 #include "Room.h"
17 #include "Picture.h"
18
19 #include "def-script.h"
20
21 //-----------------------------------------------------------------
22 inline LevelScript *
getLevelScript(lua_State * L)23 getLevelScript(lua_State *L)
24 {
25 return dynamic_cast<LevelScript*>(script_getLeader(L));
26 }
27 //-----------------------------------------------------------------
28 inline Level *
getLevel(lua_State * L)29 getLevel(lua_State *L)
30 {
31 return getLevelScript(L)->level();
32 }
33
34 //-----------------------------------------------------------------
35 /**
36 * void level_save(serialized)
37 */
38 int
script_level_save(lua_State * L)39 script_level_save(lua_State *L) throw()
40 {
41 BEGIN_NOEXCEPTION;
42 const char *serialized = luaL_checkstring(L, 1);
43 getLevel(L)->saveGame(serialized);
44 END_NOEXCEPTION;
45 return 0;
46 }
47 //-----------------------------------------------------------------
48 /**
49 * void level_load(moves)
50 */
51 int
script_level_load(lua_State * L)52 script_level_load(lua_State *L) throw()
53 {
54 BEGIN_NOEXCEPTION;
55 const char *moves = luaL_checkstring(L, 1);
56 getLevel(L)->loadGame(moves);
57 END_NOEXCEPTION;
58 return 0;
59 }
60
61 //-----------------------------------------------------------------
62 /**
63 * bool level_action_move(symbol)
64 */
65 int
script_level_action_move(lua_State * L)66 script_level_action_move(lua_State *L) throw()
67 {
68 BEGIN_NOEXCEPTION;
69 size_t size;
70 const char *symbol = luaL_checklstring(L, 1, &size);
71 if (size != 1) {
72 ExInfo error = ExInfo("bad symbol length")
73 .addInfo("length", size)
74 .addInfo("symbol", symbol);
75 LOG_WARNING(error);
76 luaL_error(L, error.what());
77 }
78
79 bool sucess = getLevel(L)->action_move(symbol[0]);
80 lua_pushboolean(L, sucess);
81 END_NOEXCEPTION;
82 //NOTE: return sucess
83 return 1;
84 }
85 //-----------------------------------------------------------------
86 /**
87 * bool level_action_save()
88 */
89 int
script_level_action_save(lua_State * L)90 script_level_action_save(lua_State *L) throw()
91 {
92 BEGIN_NOEXCEPTION;
93 bool sucess = getLevel(L)->action_save();
94 lua_pushboolean(L, sucess);
95 END_NOEXCEPTION;
96 //NOTE: return sucess
97 return 1;
98 }
99 //-----------------------------------------------------------------
100 /**
101 * bool level_action_load()
102 */
103 int
script_level_action_load(lua_State * L)104 script_level_action_load(lua_State *L) throw()
105 {
106 BEGIN_NOEXCEPTION;
107 bool sucess = getLevel(L)->action_load();
108 lua_pushboolean(L, sucess);
109 END_NOEXCEPTION;
110 //NOTE: return sucess
111 return 1;
112 }
113 //-----------------------------------------------------------------
114 /**
115 * bool level_action_restart()
116 */
117 int
script_level_action_restart(lua_State * L)118 script_level_action_restart(lua_State *L) throw()
119 {
120 BEGIN_NOEXCEPTION;
121 bool sucess = getLevel(L)->action_restart(1);
122 lua_pushboolean(L, sucess);
123 END_NOEXCEPTION;
124 //NOTE: return sucess
125 return 1;
126 }
127
128
129 //-----------------------------------------------------------------
130 /**
131 * void level_createRoom(width, height, picture)
132 * Example:
133 * createRoom(40, 50, "kitchen-bg.png")
134 */
135 int
script_level_createRoom(lua_State * L)136 script_level_createRoom(lua_State *L) throw()
137 {
138 BEGIN_NOEXCEPTION;
139 int w = luaL_checkint(L, 1);
140 int h = luaL_checkint(L, 2);
141 const char *picture = luaL_checkstring(L, 3);
142
143 getLevel(L)->createRoom(w, h, picture);
144 END_NOEXCEPTION;
145 return 0;
146 }
147 //-----------------------------------------------------------------
148 /**
149 * int level_getRestartCounter()
150 *
151 * Returns number of attemps, starts from 1.
152 */
153 int
script_level_getRestartCounter(lua_State * L)154 script_level_getRestartCounter(lua_State *L) throw()
155 {
156 BEGIN_NOEXCEPTION;
157 int counter = getLevel(L)->getRestartCounter();
158 lua_pushnumber(L, counter);
159 END_NOEXCEPTION;
160 //NOTE: return counter
161 return 1;
162 }
163 //-----------------------------------------------------------------
164 /**
165 * int level_getDepth()
166 *
167 */
168 int
script_level_getDepth(lua_State * L)169 script_level_getDepth(lua_State *L) throw()
170 {
171 BEGIN_NOEXCEPTION;
172 int depth = getLevel(L)->getDepth();
173 lua_pushnumber(L, depth);
174 END_NOEXCEPTION;
175 //NOTE: return depth
176 return 1;
177 }
178 //-----------------------------------------------------------------
179 /**
180 * bool level_isNewRound()
181 *
182 */
183 int
script_level_isNewRound(lua_State * L)184 script_level_isNewRound(lua_State *L) throw()
185 {
186 BEGIN_NOEXCEPTION;
187 bool newRound = getLevel(L)->isNewRound();
188 lua_pushboolean(L, newRound);
189 END_NOEXCEPTION;
190 //NOTE: return newRound
191 return 1;
192 }
193 //-----------------------------------------------------------------
194 /**
195 * bool level_isSolved()
196 *
197 */
198 int
script_level_isSolved(lua_State * L)199 script_level_isSolved(lua_State *L) throw()
200 {
201 BEGIN_NOEXCEPTION;
202 bool solved = getLevelScript(L)->room()->isSolved();
203 lua_pushboolean(L, solved);
204 END_NOEXCEPTION;
205 //NOTE: return solved
206 return 1;
207 }
208 //-----------------------------------------------------------------
209 /**
210 * void level_newDemo(demofile)
211 */
212 int
script_level_newDemo(lua_State * L)213 script_level_newDemo(lua_State *L) throw()
214 {
215 BEGIN_NOEXCEPTION;
216 const char *demofile = luaL_checkstring(L, 1);
217
218 getLevel(L)->newDemo(Path::dataReadPath(demofile));
219 END_NOEXCEPTION;
220 return 0;
221 }
222 //-----------------------------------------------------------------
223 /**
224 * void level_planShow(func)
225 */
226 int
script_level_planShow(lua_State * L)227 script_level_planShow(lua_State *L) throw()
228 {
229 BEGIN_NOEXCEPTION;
230 luaL_checktype(L, 1, LUA_TFUNCTION);
231 int funcRef = luaL_ref(L, LUA_REGISTRYINDEX);
232
233 Command *command = getLevelScript(L)->createCommand(funcRef);
234 getLevel(L)->planShow(command);
235 END_NOEXCEPTION;
236 return 0;
237 }
238 //-----------------------------------------------------------------
239 /**
240 * bool level_isShowing()
241 */
242 int
script_level_isShowing(lua_State * L)243 script_level_isShowing(lua_State *L) throw()
244 {
245 BEGIN_NOEXCEPTION;
246 bool showing = getLevel(L)->isShowing();
247 lua_pushboolean(L, showing);
248 END_NOEXCEPTION;
249 //NOTE: return showing
250 return 1;
251 }
252
253