void save_squirrel_table(HSQUIRRELVM vm, int table_idx, lisp::Writer& writer) { // offset because of sq_pushnull if(table_idx < 0) table_idx -= 1; //iterator table sq_pushnull(vm); while(SQ_SUCCEEDED(sq_next(vm, table_idx))) { if(sq_gettype(vm, -2) != OT_STRING) { std::cerr << "Table contains non-string key\n"; continue; } const char* key; sq_getstring(vm, -2, &key); switch(sq_gettype(vm, -1)) { case OT_INTEGER: { int val; sq_getinteger(vm, -1, &val); writer.write_int(key, val); break; } case OT_FLOAT: { float val; sq_getfloat(vm, -1, &val); writer.write_float(key, val); break; } case OT_BOOL: { SQBool val; sq_getbool(vm, -1, &val); writer.write_bool(key, val); break; } case OT_STRING: { const char* str; sq_getstring(vm, -1, &str); writer.write_string(key, str); break; } case OT_TABLE: { writer.start_list(key, true); save_squirrel_table(vm, -1, writer); writer.end_list(key); break; } case OT_CLOSURE: break; // ignore case OT_NATIVECLOSURE: break; default: std::cerr << "Can't serialize key '" << key << "' in table.\n"; break; } sq_pop(vm, 2); } sq_pop(vm, 1); }
void SnowBall::write(lisp::Writer& writer) { writer.start_list("snowball"); writer.write_float("x", start_position.x); writer.write_float("y", start_position.y); if (fluffy) { // don't give us away at every snowball writer.write_bool("fluffy", true); } writer.end_list("snowball"); }
void Camera::write(lisp::Writer& writer) { writer.start_list("camera"); if(mode == NORMAL) { writer.write_string("mode", "normal"); writer.write_bool("backscrolling", do_backscrolling); } else if(mode == AUTOSCROLL) { writer.write_string("mode", "autoscroll"); autoscroll_path->write(writer); } else if(mode == MANUAL) { writer.write_string("mode", "manual"); } writer.end_list("camera"); }