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_timer.h"
10 
11 #define NEED_REGISTER_FUNCTION
12 #include "bl_lua.h"
13 #undef NEED_REGISTER_FUNCTION
14 
15 #include "triggers.h"
16 
17 // Generates a new FX Sound object
luaObjTimerNew(lua_State * L)18 int luaObjTimerNew(lua_State *L) {
19 	char funcname[1000];
20 	double interval = 0.0;
21 	Uint32 n = lua_gettop(L);
22 	if(n != 2) {
23 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjTimerNew");
24 	}
25 
26 	if(!lua_isstring(L, 1)) {
27 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjTimerNew (1)");
28 	} else {
29 		sprintf(funcname, "%s", lua_tostring(L, 1));
30 	}
31 
32 	if(!lua_isnumber(L, 2)) {
33 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjTimerNew (2)");
34 	} else {
35 		interval = (double)lua_tonumber(L, 2);
36 	}
37 
38 	Uint32 idx = registerTimerTrigger(funcname, interval);
39 	luaObjPushTimer(L, idx);
40 	return 1;
41 }
42 
luaObjPushTimer(lua_State * L,Uint32 idx)43 void luaObjPushTimer(lua_State *L, Uint32 idx) {
44 	bsl_startobject();
45 	bsl_addobjectfunction("active", luaObjTimerActive, idx);
46 	bsl_addobjectfunction("interval", luaObjTimerActive, idx);
47 	bsl_addobjectnumbervalue("internal", idx);
48 	bsl_endobject();
49 }
50 
51 // Sets the active property
luaObjTimerActive(lua_State * L)52 int luaObjTimerActive(lua_State *L) {
53 	Uint32 objid = 0;
54 	Uint32 n = lua_gettop(L);
55 	if(n > 1) {
56 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjTimerActive");
57 	}
58 
59 	if(!lua_isnumber(L, lua_upvalueindex(1))) {
60 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjTimerActive (id)");
61 	} else {
62 		objid = (Uint32)lua_tonumber(L, lua_upvalueindex(1));
63 	}
64 
65 	bool isActive = false;
66 	if(n == 1) {
67 		if(!lua_isnumber(L, 1)) {
68 			LUADIE(L, ERROR_LUAL2BTYPE, "luaObjTimerActive");
69 		} else {
70 			if(lua_tonumber(L, 1) == 0) {
71 				isActive = false;
72 			} else if(lua_tonumber(L, 1) == 1){
73 				isActive = true;
74 			} else {
75 				LUADIE(L, ERROR_LUAL2BRANGE, "luaObjTimerActive");
76 			}
77 		}
78 		setTimerTriggerActive(objid, isActive);
79 	}
80 
81 	if(getTimerTriggerActive(objid)) {
82 		lua_pushnumber(L, 1);
83 	} else {
84 		lua_pushnumber(L, 0);
85 	}
86 
87 	return 1;
88 }
89 
90 // sets the timer interval
luaObjTimerInterval(lua_State * L)91 int luaObjTimerInterval(lua_State *L) {
92 	Uint32 objid = 0;
93 	Uint32 n = lua_gettop(L);
94 	if(n > 1) {
95 		LUADIE(L, ERROR_LUAARGCOUNT, "luaObjTimerActive");
96 	}
97 
98 	if(!lua_isnumber(L, lua_upvalueindex(1))) {
99 		LUADIE(L, ERROR_LUAL2BTYPE, "luaObjTimerActive (id)");
100 	} else {
101 		objid = (Uint32)lua_tonumber(L, lua_upvalueindex(1));
102 	}
103 
104 	double interval = 0.0;
105 	if(n == 1) {
106 		if(!lua_isnumber(L, 1)) {
107 			LUADIE(L, ERROR_LUAL2BTYPE, "luaObjTimerActive");
108 		} else {
109 			interval = (double)lua_tonumber(L, 1);
110 		}
111 		setTimerTriggerInterval(objid, interval);
112 	}
113 
114 	interval = getTimerTriggerInterval(objid);
115 	lua_pushnumber(L, interval);
116 
117 	return 1;
118 }
119 
120