10 #include "../api_class.h" 11 #include "../api_function.h" 12 #include "../../dataobj/schedule.h" 13 #include "../../simhalt.h" 14 #include "../../simintr.h" 15 #include "../../world/simworld.h" 17 using namespace script_api;
19 SQInteger schedule_entry_constructor(HSQUIRRELVM vm)
21 koord3d pos = param<koord3d>::get(vm, 2);
22 uint8 load = param<uint8>::get(vm, 3);
23 uint16 wait = param<uint16>::get(vm, 4);
26 koord k(pos.get_2d());
27 coordinate_transform_t::koord_w2sq(k);
30 SQInteger res = pos != koord3d::invalid ? SQ_OK : SQ_ERROR;
32 if (SQ_SUCCEEDED(res)) {
33 res = set_slot(vm,
"x", k.x, 1);
35 if (SQ_SUCCEEDED(res)) {
36 res = set_slot(vm,
"y", k.y, 1);
38 if (SQ_SUCCEEDED(res)) {
39 res = set_slot(vm,
"z", pos.z, 1);
41 if (SQ_SUCCEEDED(res)) {
42 res = set_slot(vm,
"wait", wait, 1);
44 if (SQ_SUCCEEDED(res)) {
45 res = set_slot(vm,
"load", load, 1);
50 halthandle_t get_halt_from_koord3d(koord3d pos,
const player_t *player )
52 if( player == NULL ) {
53 return halthandle_t();
55 return haltestelle_t::get_halt(pos, player);
58 SQInteger waiting_time_to_string(HSQUIRRELVM vm)
60 schedule_entry_t entry(koord3d::invalid, 0, 0);
61 get_slot(vm,
"wait", entry.waiting_time, -1);
63 return param<plainstring>::push(vm, str);
66 SQInteger schedule_constructor(HSQUIRRELVM vm)
68 waytype_t wt = param<waytype_t>::get(vm, 2);
69 SQInteger res = set_slot(vm,
"waytype", wt, 1);
71 if (SQ_SUCCEEDED(res)) {
72 sq_pushstring(vm,
"entries", -1);
74 if (sq_gettop(vm) >= 3) {
83 if (SQ_SUCCEEDED(res)) {
85 if (sq_gettop(vm) >= 4) {
86 current = param<uint8>::get(vm, 4);
88 res = set_slot(vm,
"current", current, 1);
90 if (SQ_SUCCEEDED(res)) {
93 schedule_t* sched = NULL;
95 case road_wt: sched =
new truck_schedule_t();
break;
96 case track_wt: sched =
new train_schedule_t();
break;
97 case water_wt: sched =
new ship_schedule_t();
break;
98 case air_wt: sched =
new airplane_schedule_t();
break;
99 case monorail_wt: sched =
new monorail_schedule_t();
break;
100 case tram_wt: sched =
new tram_schedule_t();
break;
101 case maglev_wt: sched =
new maglev_schedule_t();
break;
102 case narrowgauge_wt: sched =
new narrowgauge_schedule_t();
break;
104 sq_raise_error(vm,
"Invalid waytype %d", wt);
107 attach_instance(vm, 1, sched);
113 void append_entry(HSQUIRRELVM vm, SQInteger index, schedule_t* sched)
115 koord3d pos = param<koord3d>::get(vm, index);
117 uint8 minimum_loading = 0;
118 get_slot(vm,
"load", minimum_loading, index);
120 uint16 waiting_time_shift = 0;
121 get_slot(vm,
"wait", waiting_time_shift, index);
123 grund_t *gr = welt->lookup(pos);
125 sched->append(gr, minimum_loading, waiting_time_shift);
129 schedule_t* script_api::param<schedule_t*>::get(HSQUIRRELVM vm, SQInteger index)
132 waytype_t wt = invalid_wt;
133 get_slot(vm,
"waytype", wt, index);
136 schedule_t* sched = get_attached_instance<schedule_t>(vm, index, param<schedule_t*>::tag());
139 if (wt != sched->get_waytype()) {
140 sq_raise_error(vm,
"Waytype mismatch in schedule");
143 sched->entries.clear();
145 sq_pushstring(vm,
"entries", -1);
146 SQInteger new_index = index > 0 ? index : index-1;
147 if (SQ_SUCCEEDED(sq_get(vm, new_index))) {
151 while(SQ_SUCCEEDED(sq_next(vm, -2))) {
152 append_entry(vm, -1, sched);
159 get_slot(vm,
"current", current, index);
160 sched->set_current_stop(current);
165 void* script_api::param<schedule_t*>::tag()
167 return (
void*)&script_api::param<schedule_t*>::get;
170 void export_schedule(HSQUIRRELVM vm)
175 begin_class(vm,
"schedule_entry_x",
"coord3d");
177 #ifdef SQAPI_DOC // document members 194 register_function<void(*)(koord3d,uint8,uint16)>(vm, schedule_entry_constructor,
"constructor");
201 register_method(vm, &get_halt_from_koord3d,
"get_halt",
true);
206 register_function(vm, waiting_time_to_string,
"waiting_time_to_string", 1,
"x" );
213 create_class(vm,
"schedule_x");
224 register_function(vm, schedule_constructor,
"constructor", 3,
"xi.");
225 sq_settypetag(vm, -1, param<schedule_t*>::tag());
227 #ifdef SQAPI_DOC // document members 231 array< schedule_entry_x > entries;
248 create_slot(vm,
"entries", 0);
249 create_slot(vm,
"waytype", 0);
250 create_slot(vm,
"current", 0);
string difftick_to_string(integer difftick_to_string_intern)