summaryrefslogtreecommitdiff
path: root/app/bin/ctrain.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/bin/ctrain.c')
-rw-r--r--app/bin/ctrain.c139
1 files changed, 101 insertions, 38 deletions
diff --git a/app/bin/ctrain.c b/app/bin/ctrain.c
index fe41a39..b15cb91 100644
--- a/app/bin/ctrain.c
+++ b/app/bin/ctrain.c
@@ -58,6 +58,7 @@ struct extraData {
long state;
carItem_p item;
double speed;
+ BOOL_T pencils;
BOOL_T direction;
BOOL_T autoReverse;
trainStatus_e status;
@@ -92,7 +93,7 @@ static wButton_p newcarB;
static void ControllerDialogSyncAll(void);
static STATUS_T CmdTrain(wAction_t, coOrd);
static wMenu_p trainPopupM;
-static wMenuPush_p trainPopupMI[8];
+static wMenuPush_p trainPopupMI[10];
static track_p followTrain;
static coOrd followCenter;
static BOOL_T trainsTimeoutPending;
@@ -311,6 +312,24 @@ BOOL_T TraverseTrack2(
return TRUE;
}
+/***************
+ * When a track is deleted, cross check that the Traverse Track reference is removed.
+ */
+EXPORT void CheckCarTraverse(track_p track) {
+
+ track_p car;
+ for (car=NULL; TrackIterate(&car);) {
+ if (GetTrkType(car) == T_CAR) {
+ struct extraData * xx = GetTrkExtraData(car);
+ if (xx->trvTrk.trk == track) {
+ xx->trvTrk.trk=NULL;
+ xx->status = ST_NotOnTrack;
+ }
+ }
+ }
+
+}
+
static BOOL_T drawCarEnable = TRUE;
@@ -358,7 +377,9 @@ static void DrawCar(
}
}
- CarItemDraw(d, xx->item, color, xx->direction, IsLocoMaster(xx), coupler);
+
+
+ CarItemDraw(d, xx->item, color, xx->direction, IsLocoMaster(xx), coupler, xx->pencils, xx->trvTrk.trk);
}
@@ -467,10 +488,10 @@ static void DeleteCar(
}
-static void ReadCar(
+static BOOL_T ReadCar(
char * line)
{
- CarItemRead(line);
+ return CarItemRead(line);
}
@@ -521,6 +542,29 @@ static BOOL_T QueryCar(track_p trk, int query)
}
}
+static BOOL_T StoreCar(
+ track_p car,
+ void **data,
+ long * len) {
+
+ struct extraData *xx = GetTrkExtraData(car);
+ return StoreCarItem(xx->item,data,len);
+
+}
+
+static BOOL_T ReplayCar (track_p car, void *data,long len) {
+
+ struct extraData *xx = GetTrkExtraData(car);
+ return ReplayCarItem(xx->item,data,len);
+
+}
+
+
+static wBool_t CompareCar( track_cp trk1, track_cp trk2 )
+{
+ return TRUE;
+}
+
static trackCmd_t carCmds = {
"CAR ",
@@ -548,6 +592,16 @@ static trackCmd_t carCmds = {
QueryCar, /* query */
NULL, /* ungroup */
NULL, /* flip */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ ReplayCar,
+ StoreCar,
+ NULL, /*activate*/
+ CompareCar
};
/*
@@ -699,13 +753,13 @@ static void SpeedRedraw(
pts[2][1] = pts[3][1] = y+SLIDER_THICKNESS/2;
pts[0][0] = pts[3][0] = 0;
pts[1][0] = pts[2][0] = SLIDER_WIDTH;
- wDrawFilledPolygon(d, pts, 4, drawColor, 0);
+ wDrawPolygon(d, pts, NULL, 4, drawColor, 0, 0, 0, 1, 0);
drawColor = wDrawFindColor(wRGB(220, 220, 220));
pts[0][1] = pts[1][1] = y+SLIDER_THICKNESS/2;
pts[2][1] = pts[3][1] = y;
pts[0][0] = pts[3][0] = 0;
pts[1][0] = pts[2][0] = SLIDER_WIDTH;
- wDrawFilledPolygon(d, pts, 4, drawColor, 0);
+ wDrawPolygon(d, pts, NULL, 4, drawColor, 0, 0, 0, 1, 0);
wDrawLine(d, 0, y, SLIDER_WIDTH, y, 1, wDrawLineSolid, drawColorRed, 0);
wDrawLine(d, 0, y+SLIDER_THICKNESS/2, SLIDER_WIDTH, y+SLIDER_THICKNESS/2, 1,
wDrawLineSolid, drawColorBlack, 0);
@@ -1068,13 +1122,11 @@ static void MoveMainWindow(
dist *= factor;
Translate(&pos, pos, angle, dist);
- //DrawMapBoundingBox(FALSE);
- mainCenter = pos;
mainD.orig.x = pos.x-mainD.size.x/2;;
mainD.orig.y = pos.y-mainD.size.y/2;;
- MainRedraw();
- MapRedraw();
- //DrawMapBoundingBox(TRUE);
+ panCenter = pos;
+ LOG( log_pan, 2, ( "PanCenter:%d %0.3f %0.3f\n", __LINE__, panCenter.x, panCenter.y ) );
+ MainLayout( TRUE, TRUE ); // MoveTrainWindow
}
@@ -1197,7 +1249,7 @@ static void ControllerDialogUpdate(
wButtonSetLabel((wButton_p)pg->paramPtr[I_DIR].control,
(dlg->direction?_("Reverse"):_("Forward")));
SetTrainDirection(dlg->train);
- DrawAllCars();
+ TempRedraw(); // ctrain: change direction
break;
case I_STOP:
@@ -1277,7 +1329,6 @@ static void DrawAllCars(void)
drawCarEnable = TRUE;
wDrawDelayUpdate(mainD.d, TRUE);
wDrawRestoreImage(mainD.d);
- DrawMarkers();
DrawPositionIndicators();
for (car=NULL; TrackIterate(&car);) {
@@ -1291,7 +1342,7 @@ static void DrawAllCars(void)
hi.y = lo.y + size.x;
if (!OFF_MAIND(lo, hi)) {
- DrawCar(car, &mainD, wDrawColorBlack);
+ DrawCar(car, &tempD, wDrawColorBlack);
}
}
}
@@ -1334,12 +1385,9 @@ static void PlaceCar(
{
struct extraData *xx = GetTrkExtraData(car);
DIST_T dists[2];
- int dir;
CarItemPlace(xx->item, &xx->trvTrk, dists);
- for (dir=0; dir<2; dir++) {
- xx->couplerPos[dir] = CarItemFindCouplerMountPoint(xx->item, xx->trvTrk, dir);
- }
+ CarItemFindCouplerMountPoint(xx->item, xx->trvTrk, xx->couplerPos);
car->endPt[0].angle = xx->trvTrk.angle;
Translate(&car->endPt[0].pos, xx->trvTrk.pos, car->endPt[0].angle, dists[0]);
@@ -1787,6 +1835,9 @@ static BOOL_T CheckCoupling(
/* Move second train back along track half a car length */
TraverseTrack2(&trvTrk1, distc/2.0-dist);
+ if ( trvTrk0.trk == NULL || trvTrk1.trk == NULL )
+ // fell off the end of track
+ return FALSE;
/* If tracks are not the same - dont couple */
if (trvTrk1.trk != trvTrk0.trk) {
@@ -2076,7 +2127,7 @@ static BOOL_T MoveTrains(long timeD)
}
ControllerDialogSyncAll();
- DrawAllCars();
+ TempRedraw(); // MoveTrains
return trains_moved;
}
@@ -2427,6 +2478,8 @@ static BOOL_T TrainOnMovableTrack(
#define DO_MUMASTER (5)
#define DO_CHANGEDIR (6)
#define DO_STOP (7)
+#define DO_PENCILS_ON (8)
+#define DO_PENCILS_OFF (9)
static track_p trainFuncCar;
static coOrd trainFuncPos;
static wButton_p trainPauseB;
@@ -2470,12 +2523,11 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
Dtrain.state = 0;
trk0 = NULL;
tempSegs_da.cnt = 0;
- DYNARR_SET(trkSeg_t, tempSegs_da, 8);
+ DYNARR_SET(trkSeg_t, tempSegs_da, 8);
RestartTrains();
wButtonSetLabel(trainPauseB, (char*)goI);
trainTime0 = 0;
AttachTrains();
- DrawAllCars();
curTrainDlg->train = NULL;
curTrainDlg->speed = -1;
wDrawClear((wDraw_p)curTrainDlg->trainPGp->paramPtr[I_SLIDER].control);
@@ -2484,6 +2536,7 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
wShow(curTrainDlg->win);
wControlShow((wControl_p)newcarB, (toolbarSet&(1<<BG_HOTBAR)) == 0);
currCarItemPtr = NULL;
+ TempRedraw(); // CmdTrain C_START
return C_CONTINUE;
case C_TEXT:
@@ -2516,6 +2569,7 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
}
xx = GetTrkExtraData(currCar);
+ xx->pencils = FALSE;
dist = CarItemCoupledLength(xx->item)/2.0;
Translate(&pos, xx->trvTrk.pos, xx->trvTrk.angle, dist);
SetTrkEndPoint(currCar, 0, pos, xx->trvTrk.angle);
@@ -2578,7 +2632,6 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
SetCurTrain(trk0);
}
- DrawAllCars();
return C_CONTINUE;
case C_MOVE:
@@ -2589,7 +2642,6 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
pos.x += delta.x;
pos.y += delta.y;
pos0 = pos;
- /*DrawCars( &tempD, currCar, FALSE );*/
xx = GetTrkExtraData(currCar);
trk0 = OnTrack(&pos0, FALSE, TRUE);
@@ -2613,7 +2665,6 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
PlaceTrainInit(currCar, trk0, pos0, xx->trvTrk.angle,
(MyGetKeyState()&WKEY_SHIFT) == 0);
ControllerDialogSync(curTrainDlg);
- DrawAllCars();
return C_CONTINUE;
case C_UP:
@@ -2629,11 +2680,9 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
}
Dtrain.state = 1;
- /*MainRedraw();*/
ControllerDialogSync(curTrainDlg);
}
- DrawAllCars();
InfoSubstituteControls(NULL, NULL);
currCar = trk0 = NULL;
currCarItemPtr = NULL;
@@ -2668,14 +2717,12 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
xx->trvTrk.pos = pos1;
xx->trvTrk.angle = angle1;
PlaceTrain(trk1, FALSE, TRUE);
- DrawAllCars();
}
}
programMode = MODE_TRAIN;
trk0 = NULL;
- MainRedraw(); //Make sure track is redrawn after switch thrown
- MapRedraw();
+ MainRedraw(); //CmdTrain: Make sure track is redrawn after switch thrown
} else {
trk0 = FindCar(&pos);
@@ -2704,6 +2751,14 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
}
xx = GetTrkExtraData(trainFuncCar);
+ if (xx->pencils) {
+ wMenuPushEnable(trainPopupMI[DO_PENCILS_OFF], TRUE);
+ wMenuPushEnable(trainPopupMI[DO_PENCILS_ON], FALSE);
+ } else {
+ wMenuPushEnable(trainPopupMI[DO_PENCILS_OFF], FALSE);
+ wMenuPushEnable(trainPopupMI[DO_PENCILS_ON], TRUE);
+ }
+
trk0 = FindMasterLoco(trainFuncCar,NULL);
dir = IsAligned(xx->trvTrk.angle, FindAngle(xx->trvTrk.pos,
trainFuncPos)) ? 0 : 1;
@@ -2761,8 +2816,7 @@ static STATUS_T CmdTrain(wAction_t action, coOrd pos)
wHide(curTrainDlg->win);
}
- MainRedraw();
- MapRedraw();
+ MainRedraw(); // CmdTrain: Exit
curTrainDlg->train = NULL;
return C_CONTINUE;
@@ -2844,8 +2898,6 @@ static void CmdTrainExit(void * junk)
{
Reset();
InfoSubstituteControls(NULL, NULL);
- MainRedraw();
- MapRedraw();
}
@@ -2879,6 +2931,14 @@ static void TrainFunc(
break;
+ case DO_PENCILS_ON:
+ xx->pencils = TRUE;
+ break;
+
+ case DO_PENCILS_OFF:
+ xx->pencils = FALSE;
+ break;
+
case DO_FLIPCAR:
temp0 = GetTrkEndTrk(trainFuncCar,0);
pos0 = GetTrkEndPos(trainFuncCar,0);
@@ -3019,16 +3079,15 @@ static void TrainFunc(
break;
}
- MainRedraw(); //Redraw if Train altered
- MapRedraw();
+ MainRedraw(); //TrainFunc: Redraw if Train altered
if (trainsState == TRAINS_PAUSE) {
RestartTrains();
} else {
- DrawAllCars();
}
}
+EXPORT wIndex_t trainCmdInx;
void InitCmdTrain(wMenu_p menu)
{
@@ -3036,8 +3095,8 @@ void InitCmdTrain(wMenu_p menu)
log_trainPlayback = LogFindIndex("trainPlayback");
trainPLs[I_ZERO].winLabel = (char*)wIconCreatePixMap(zero_xpm);
ParamRegister(&trainPG);
- AddMenuButton(menu, CmdTrain, "cmdTrain", _("Train"),
- wIconCreatePixMap(train_xpm), LEVEL0_50, IC_POPUP2|IC_LCLICK|IC_RCLICK, 0,
+ trainCmdInx = AddMenuButton(menu, CmdTrain, "cmdTrain", _("Train"),
+ wIconCreatePixMap(train_xpm), LEVEL0_50, IC_POPUP3|IC_LCLICK|IC_RCLICK, 0,
NULL);
stopI = wIconCreatePixMap(ballred);
goI = wIconCreatePixMap(ballgreen);
@@ -3053,6 +3112,10 @@ void InitCmdTrain(wMenu_p menu)
TrainFunc, (void*)DO_UNCOUPLE);
trainPopupMI[DO_FLIPCAR] = wMenuPushCreate(trainPopupM, "", _("Flip Car"), 0,
TrainFunc, (void*)DO_FLIPCAR);
+ trainPopupMI[DO_PENCILS_ON] = wMenuPushCreate(trainPopupM, "", _("Clearance Lines On"), 0,
+ TrainFunc, (void*)DO_PENCILS_ON);
+ trainPopupMI[DO_PENCILS_OFF] = wMenuPushCreate(trainPopupM, "", _("Clearance Lines Off"), 0,
+ TrainFunc, (void*)DO_PENCILS_OFF);
trainPopupMI[DO_FLIPTRAIN] = wMenuPushCreate(trainPopupM, "", _("Flip Train"),
0, TrainFunc, (void*)DO_FLIPTRAIN);
trainPopupMI[DO_MUMASTER] = wMenuPushCreate(trainPopupM, "", _("MU Master"),