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