1 // BlinkenSisters - Hunt for the Lost Pixels
2 //     Bringing back the fun of the 80s
3 //
4 // (C) 2005-07 Rene Schickbauer, Wolfgang Dautermann
5 //
6 // See License.txt for licensing information
7 //
8 
9 #include "bl_lua_obj_anim.h"
10 
11 #define NEED_REGISTER_FUNCTION
12 #include "bl_lua.h"
13 #undef NEED_REGISTER_FUNCTION
14 
15 #include "fgobjects.h"
16 
17 // Makes a new GFX object
luaObjLoadAnim(lua_State * L)18 int luaObjLoadAnim(lua_State *L) {
19     // addFGObjAnim(const char *templfname, const Uint32 startnum, const Uint32 endnum, const Uint32 fps, const Uint32 looptype);
20 
21 	char templfname[1000];
22 	Uint32 startnum, endnum, looptype;
23 	startnum = endnum = looptype = 0;
24 	double fps = 0;
25 	Uint32 n = lua_gettop(L);
26 	if(n != 5) {
27 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjLoadAnim");
28 	}
29 	if(!lua_isstring(L, 1)) {
30 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjLoadAnim (1)");
31 	} else {
32 		sprintf(templfname, "%s", lua_tostring(L, 1));
33 	}
34 
35 	if(!lua_isnumber(L, 2)) {
36 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjLoadAnim (2)");
37 	} else {
38 		startnum = (Uint32)lua_tonumber(L, 2);
39 	}
40 
41 	if(!lua_isnumber(L, 3)) {
42 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjLoadAnim (3)");
43 	} else {
44 		endnum = (Uint32)lua_tonumber(L, 3);
45 	}
46 
47 	if(!lua_isnumber(L, 4)) {
48 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjLoadAnim (4)");
49 	} else {
50 		fps = (double)lua_tonumber(L, 4);
51 	}
52 
53 	if(!lua_isnumber(L, 5)) {
54 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjLoadAnim (5)");
55 	} else {
56 		looptype = (Uint32)lua_tonumber(L, 5);
57 	}
58 
59 
60 	Uint32 idx = addFGObjAnim(templfname, startnum, endnum, fps, looptype);
61 	luaObjPushAnim(L, idx);
62 	return 1;
63 }
64 
65 // Makes a new GFX object
luaObjDuplicateAnim(lua_State * L)66 int luaObjDuplicateAnim(lua_State *L) {
67 
68 	Uint32 sourceIDX = 0;
69 	Uint32 idx = 0;
70 
71 	Uint32 n = lua_gettop(L);
72 	if(n != 1) {
73 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjDuplicateAnim");
74 	}
75 
76 	if(!lua_istable(L, 1)) {
77 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjDuplicateAnim (arg1)");
78 	} else {
79 		sourceIDX = luaObj_getidfromtable (L, 1, "internal");
80 	}
81 
82 	idx = duplicateFGObjAnim(sourceIDX);
83 	luaObjPushAnim(L, idx);
84 	return 1;
85 }
86 
87 
88 // Push anim object on the stack
luaObjPushAnim(lua_State * L,Uint32 idx)89 void luaObjPushAnim(lua_State *L, Uint32 idx) {
90 	bsl_startobject();
91 	bsl_addobjectnumbervalue("internal", idx);
92 	bsl_addobjectstringvalue("type", "anim");
93     bsl_addobjectfunction("framerate", luaObjAnimFramerate, idx);
94     bsl_addobjectfunction("looptype", luaObjAnimLooptype, idx);
95     bsl_addobjectfunction("currentframe", luaObjAnimCurrentFrame, idx);
96     bsl_addobjectfunction("currentdirection", luaObjAnimCurrentDirection, idx);
97 
98 	//Filenames
99 	// FIXME: This accesses the tables directly instead of using proper functions
100 	bsl_starttable_local("gfx");
101 	Uint32 realidx = idx - MAX_FGOBJECTGFX;
102 	for(Uint32 i = 0; i < fgAnims[realidx]->frameCount; i++) {
103         char tmpName[10];
104         Uint32 gfxid = fgAnims[realidx]->frames[i].gfxobj;
105         sprintf(tmpName, "%d", i);
106         bsl_starttable_local(tmpName);
107         bsl_addobjectstringvalue("filename", fgGFX[gfxid]->filename);
108         bsl_addobjectnumbervalue("internal", gfxid);
109         bsl_endtable_local(tmpName);
110     }
111 	bsl_endtable_local("gfx");
112 
113 	bsl_endobject();
114 }
115 
116 // FPS
luaObjAnimFramerate(lua_State * L)117 int luaObjAnimFramerate(lua_State *L) {
118 	Uint32 objid = 0;
119 	Uint32 n = lua_gettop(L);
120 	if(n > 1) {
121 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjAnimFramerate");
122 	}
123 
124 	if(!lua_isnumber(L, lua_upvalueindex(1))) {
125 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimFramerate (id)");
126 	} else {
127 		objid = (Uint32)lua_tonumber(L, lua_upvalueindex(1));
128 	}
129 
130 	double fps = 0.0;
131 	if(n == 1) {
132 		if(!lua_isnumber(L, 1)) {
133 			LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimFramerate");
134 		} else {
135 			fps = (double)lua_tonumber(L, 1);
136 		}
137 		setFGObjAnimFrameRate(objid, fps);
138 	}
139 
140 	fps = getFGObjAnimFrameRate(objid);
141 	lua_pushnumber(L, fps);
142 
143 	return 1;
144 }
145 
146 // Looptype
luaObjAnimLooptype(lua_State * L)147 int luaObjAnimLooptype(lua_State *L) {
148 	Uint32 objid = 0;
149 	Uint32 n = lua_gettop(L);
150 	if(n > 1) {
151 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjAnimLooptype");
152 	}
153 
154 	if(!lua_isnumber(L, lua_upvalueindex(1))) {
155 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimLooptype (id)");
156 	} else {
157 		objid = (Uint32)lua_tonumber(L, lua_upvalueindex(1));
158 	}
159 
160 	Uint32 looptype = 0;
161 	if(n == 1) {
162 		if(!lua_isnumber(L, 1)) {
163 			LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimLooptype");
164 		} else {
165 			looptype = (Uint32)lua_tonumber(L, 1);
166 		}
167 		setFGObjAnimLoopType(objid, looptype);
168 	}
169 
170 	looptype = getFGObjAnimLoopType(objid);
171 	lua_pushnumber(L, looptype);
172 
173 	return 1;
174 }
175 
176 // CurrentFrame
luaObjAnimCurrentFrame(lua_State * L)177 int luaObjAnimCurrentFrame(lua_State *L) {
178 	Uint32 objid = 0;
179 	Uint32 n = lua_gettop(L);
180 	if(n > 1) {
181 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjAnimCurrentFrame");
182 	}
183 
184 	if(!lua_isnumber(L, lua_upvalueindex(1))) {
185 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimCurrentFrame (id)");
186 	} else {
187 		objid = (Uint32)lua_tonumber(L, lua_upvalueindex(1));
188 	}
189 
190 	Uint32 currentFrame = 0;
191 	if(n == 1) {
192 		if(!lua_isnumber(L, 1)) {
193 			LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimCurrentFrame");
194 		} else {
195 			currentFrame = (Uint32)lua_tonumber(L, 1);
196 		}
197 		setFGObjAnimCurrentFrame(objid, currentFrame);
198 	}
199 
200 	currentFrame = getFGObjAnimCurrentFrame(objid);
201 	lua_pushnumber(L, currentFrame);
202 
203 	return 1;
204 }
205 
206 // loop direction
luaObjAnimCurrentDirection(lua_State * L)207 int luaObjAnimCurrentDirection(lua_State *L) {
208 	Uint32 objid = 0;
209 	Uint32 n = lua_gettop(L);
210 	if(n > 1) {
211 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjAnimCurrentDirection");
212 	}
213 
214 	if(!lua_isnumber(L, lua_upvalueindex(1))) {
215 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimCurrentDirection (id)");
216 	} else {
217 		objid = (Uint32)lua_tonumber(L, lua_upvalueindex(1));
218 	}
219 
220 	Sint32 loopDirection = 0;
221 	if(n == 1) {
222 		if(!lua_isnumber(L, 1)) {
223 			LUADIE(L, ERROR_LUAL2BTYPE, "luaObjAnimCurrentDirection");
224 		} else {
225 			loopDirection = (Sint32)lua_tonumber(L, 1);
226 		}
227 		setFGObjAnimCurrentDirection(objid, loopDirection);
228 	}
229 
230 	loopDirection = getFGObjAnimCurrentDirection(objid);
231 	lua_pushnumber(L, loopDirection);
232 
233 	return 1;
234 }
235