+static void proc_screen_script(struct demoscreen *scr, struct ts_node *node)
+{
+ struct ts_node *sub;
+ struct ts_attr *attr;
+ long tm;
+
+ attr = node->attr_list;
+ while(attr) {
+ if(sscanf(attr->name, "key_%ld", &tm) == 1 && attr->val.type == TS_NUMBER) {
+ anm_set_value(&scr->track, tm, attr->val.fnum);
+ }
+ attr = attr->next;
+ }
+
+ sub = node->child_list;
+ while(sub) {
+ if(strcmp(sub->name, "track") == 0) {
+ proc_track(sub, scr->name);
+ }
+ sub = sub->next;
+ }
+}
+
+static void proc_track(struct ts_node *node, const char *pname)
+{
+ char *name, *buf;
+ struct ts_attr *attr;
+ long tm;
+ int tidx;
+ struct anm_track *trk;
+
+ if(!(name = (char*)ts_get_attr_str(node, "name", 0))) {
+ return;
+ }
+ if(pname) {
+ buf = alloca(strlen(name) + strlen(pname) + 2);
+ sprintf(buf, "%s.%s", pname, name);
+ name = buf;
+ }
+
+ if((tidx = dsys_add_track(name)) == -1) {
+ return;
+ }
+ trk = dsys.track + tidx;
+
+ attr = node->attr_list;
+ while(attr) {
+ if(sscanf(attr->name, "key_%ld", &tm) == 1 && attr->val.type == TS_NUMBER) {
+ anm_set_value(trk, tm, attr->val.fnum);
+ }
+ attr = attr->next;
+ }
+}
+
+static long io_read(void *buf, size_t bytes, void *uptr)
+{
+ return ass_fread(buf, 1, bytes, uptr);
+}
+
+