return 0;
}
-static int cmd_movpos(ParseState *ps, const CmdInfo *ci) {
+static int cmd_route_movfeat(ParseState *ps, const CmdInfo *ci,
+ Segment *move, const SegmentInfo *movei,
+ int poscomb) {
+ long ms;
+
+ ms= -1;
+ if (ps->remain && CIXF_FORCE)
+ MUSTECR( ps_neednumber(ps,&ms,0,100000,"milliseconds") );
+
+ MUSTECR( ps_neednoargs(ps) );
+
+ if (ci->xarg & CIXF_FORCE) {
+ if (!(sta_state < Sta_Resolving || sta_state == Sta_Manual))
+ return badcmd(ps,"movpos queueing arrangements not ready");
+
+ MovPosChange *reservation= 0;
+ if (!move->moving && move->motion) {
+ reservation= move->motion;
+ move->motion= 0;
+ }
+ MUSTECR( movpos_change(move,poscomb,ms,reservation) );
+ } else {
+ MUSTECRPREDICT( safety_movposchange(move, poscomb, ci->xarg & CIXF_U,
+ CMDPPC) );
+ }
+
+ return 0;
+}
+
+static int cmd_movfeat(ParseState *ps, const CmdInfo *ci) {
+ Segment *move;
+ const SegmentInfo *movei;
+ const MovFeatInfo *mfi;
+ MovPosComb target;
+ long pos_l;
+
+ MUSTECR( ps_needsegment(ps,&move,&movei) );
+ mfi= some_needword_lookup_counted(ps, movei->movfeats, movei->n_movfeats,
+ "moveable feature name");
+ if (!mfi) return EC_BadCmd;
+
+ MUSTECR( ps_neednumber(ps,&pos_l,0,mfi->posns-1,"position number") );
+
+ if (move->motion)
+ target= movpos_change_intent(move->motion);
+ else
+ target= movpos_poscomb_actual(move);
+
+ if (target<0) {
+ if (movei->n_movfeats > 1)
+ ouprintf("info movfeat-collapsing-unknown %s :"
+ " will set previously-unknown, but not set,"
+ " feature(s) to position 0",
+ movei->pname);
+ target= 0;
+ }
+ target= movposcomb_update_feature(target,mfi,pos_l);
+
+ return cmd_route_movfeat(ps,ci, move,movei,target);
+}
+
+static int cmd_route(ParseState *ps, const CmdInfo *ci) {
Segment *move;
const SegmentInfo *movei;
- long ms;
MovPosComb poscomb;
long poscomb_l;
MUSTECR( ps_needsegmentperhaps(ps,&fwd,0) );
MUSTECR( movpos_findcomb_bysegs(back,move,fwd,move->movposcomb,&poscomb) );
}
-
- ms= -1;
- if (ps->remain && CIXF_FORCE)
- MUSTECR( ps_neednumber(ps,&ms,0,100000,"milliseconds") );
- MUSTECR( ps_neednoargs(ps) );
-
- if (ci->xarg & CIXF_FORCE) {
- if (!(sta_state < Sta_Resolving || sta_state == Sta_Manual))
- return badcmd(ps,"movpos queueing arrangements not ready");
- MUSTECR( movpos_change(move,poscomb,ms,0) );
- } else {
- MUSTECRPREDICT( safety_movposchange(move, poscomb, ci->xarg & CIXF_U,
- CMDPPC) );
- }
-
- return 0;
+ return cmd_route_movfeat(ps,ci, move,movei,poscomb);
}
static int cmd_speed(ParseState *ps, const CmdInfo *ci) {
{ "!pic", cmd_pic, CIXF_ANYSTA|CIXF_FORCE },
{ "!nmra", cmd_nmra, CIXF_ANYSTA },
{ "noop", cmd_noop, CIXF_ANYSTA },
- { "movpos", cmd_movpos },
- { "route", cmd_movpos, 1 },
- { "reroute", cmd_movpos, 2 },
+ { "route", cmd_route },
+ { "route+", cmd_route, 1 },
+ { "route++", cmd_route, 2 },
+ { "movfeat", cmd_movfeat },
+ { "movfeat+", cmd_movfeat, 1 },
+ { "movfeat++", cmd_movfeat, 2 },
+ { "!route", cmd_route, CIXF_ANYSTA|CIXF_FORCE },
+ { "!movfeat", cmd_movfeat, CIXF_ANYSTA|CIXF_FORCE },
//{ "autopoint", cmd_autopoint },
- { "!movpos", cmd_movpos, CIXF_ANYSTA|CIXF_FORCE },
{ "!invert", cmd_invert, CIXF_ANYSTA|CIXF_FORCE },
{ "speed", cmd_speed },
{ "!speed", cmd_speed, CIXF_ANYSTA|CIXF_FORCE },