/*** mark - <mark> editor function * * Purpose: * * <mark> - Goes to top of file * <arg><mark> - Toggle last/current window position * <arg> textarg <mark> - Goes to named mark * <arg><arg> textarg <mark> - Defines mark at cursor * <arg><arg> textarg <mark> - Removes named mark * * Input: * * Output: * * Returns FALSE if you try to go to a non-existent mark, TRUE * otherwise. * *************************************************************************/ flagType mark ( CMDDATA argData, ARG *pArg, flagType fMeta ) { buffer mbuf; switch (pArg->argType) { case NOARG: docursor (0, (LINE)0); return TRUE; case TEXTARG: strcpy ((char *) mbuf, pArg->arg.textarg.pText); if (fIsNum (mbuf)) { docursor (0, atol (mbuf)-1); return TRUE; } if (pArg->arg.textarg.cArg == 2) { if (fMeta) { DeleteMark (mbuf); } else { DefineMark (mbuf, pFileHead, pArg->arg.textarg.y+1, pArg->arg.textarg.x+1, FALSE); } return TRUE; } else { return GoToMark (mbuf); } case NULLARG: restflip(); return TRUE; /* LINEARG illegal */ /* STREAMARG illegal */ /* BOXARG illegal */ } argData; }
VOID ViewMarks_OnCommand( HWND hwnd, INT id, HWND hwndCtrl, UINT codeNotify ) { INT i, j; HWND hwndList; LRESULT lResult; switch(id) { case IDC_MARK_LIST: if ( codeNotify == LBN_SELCHANGE ) { lResult = ListBox_GetCurSel( hwndCtrl ); if ( lResult >= 0 && lResult < pLevel->nMarks ) { pLevel->nLastMark = (INT)lResult; } } break; case IDC_NEW_MARK: i = pLevel->nMarks; if (i == MAX_MARKS) { MsgBox( hwnd, MB_ICONEXCLAMATION, "The limit of %d marks has been reached.", MAX_MARKS ); break; } szMarkName[0] = '\0'; wsprintf(szMarkX, "%ld", pLevel->view_x); wsprintf(szMarkY, "%ld", pLevel->view_y); wsprintf(szMarkZ, "%ld", pLevel->view_z); DoubleToString(szMarkRotation, pLevel->view_rotation * 180.0 / PI, 2); DoubleToString(szMarkElevation, pLevel->view_elevation * 180.0 / PI, 2); if (EditMarkDialog(hwnd) == IDCANCEL) { break; } if (!szMarkName[0]) { break; } hwndList = GetDlgItem(hwnd, IDC_MARK_LIST); ListBox_AddString(hwndList, szMarkName); _fstrcpy(pLevel->pMarkData[i].mark_name, szMarkName); pLevel->pMarkData[i].x = atol(szMarkX); pLevel->pMarkData[i].y = atol(szMarkY); pLevel->pMarkData[i].z = atol(szMarkZ); pLevel->pMarkData[i].rotation = atof(szMarkRotation) * PI / 180.0; pLevel->pMarkData[i].elevation = atof(szMarkElevation) * PI / 180.0; ++pLevel->nMarks; ListBox_SetCurSel(hwndList, i); pLevel->nLastMark = i; bChange = TRUE; break; case IDC_DELETE_MARK: hwndList = GetDlgItem( hwnd, IDC_MARK_LIST ); lResult = ListBox_GetCurSel( hwndList ); if ( lResult >= 0 && lResult < pLevel->nMarks ) { i = (INT)lResult; DeleteMark( pLevel, i ); ListBox_DeleteString( hwndList, i ); if ( i == 0 ) ListBox_SetCurSel( hwndList, 0 ); else ListBox_SetCurSel( hwndList, i - 1 ); bChange = TRUE; } break; case IDC_EDIT_MARK: hwndList = GetDlgItem( hwnd, IDC_MARK_LIST ); lResult = ListBox_GetCurSel( hwndList ); if ( lResult >= 0 && lResult < pLevel->nMarks ) { i = (INT)lResult; _fstrcpy(szMarkName, pLevel->pMarkData[i].mark_name); wsprintf(szMarkX, "%ld", pLevel->pMarkData[i].x); wsprintf(szMarkY, "%ld", pLevel->pMarkData[i].y); wsprintf(szMarkZ, "%ld", pLevel->pMarkData[i].z); DoubleToString(szMarkRotation, pLevel->pMarkData[i].rotation * 180.0 / PI, 2); DoubleToString(szMarkElevation, pLevel->pMarkData[i].elevation * 180.0 / PI, 2); if ( EditMarkDialog( hwnd ) == IDCANCEL ) { break; } if ( !szMarkName[0] ) { break; } _fstrcpy( pLevel->pMarkData[i].mark_name, szMarkName ); pLevel->pMarkData[i].x = atol(szMarkX); pLevel->pMarkData[i].y = atol(szMarkY); pLevel->pMarkData[i].z = atol(szMarkZ); pLevel->pMarkData[i].rotation = atof(szMarkRotation) * PI / 180.0; pLevel->pMarkData[i].elevation = atof(szMarkElevation) * PI / 180.0; j = ListBox_GetTopIndex(hwndList); ListBox_ResetContent(hwndList); for( i = 0; i < pLevel->nMarks; ++i ) { ListBox_AddString( hwndList, pLevel->pMarkData[i].mark_name ); } ListBox_SetTopIndex( hwndList, j ); ListBox_SetCurSel( hwndList, (INT)lResult ); bChange = TRUE; } break; case IDC_GO_TO_MARK: hwndList = GetDlgItem( hwnd, IDC_MARK_LIST ); lResult = ListBox_GetCurSel( hwndList ); if ( lResult >= 0 && lResult < pLevel->nMarks ) { i = (INT)lResult; pLevel->view_x = pLevel->pMarkData[i].x; pLevel->view_y = pLevel->pMarkData[i].y; pLevel->view_z = pLevel->pMarkData[i].z; pLevel->view_rotation = pLevel->pMarkData[i].rotation; pLevel->view_elevation = pLevel->pMarkData[i].elevation; Object_ViewStatusUpdate(hParent, po); Object_ViewChanged(hParent, po); bChange = TRUE; } break; case IDOK: case IDCANCEL: if ( hPalCommon ) { DeleteObject( hPalCommon ); hPalCommon = NULL; } EndDialog( hwnd, id ); break; } } // ViewMarks_OnCommand
Error CTaskBuild::IsEnded() { CAuto* automat; float angle, dist, time; if ( m_engine->GetPause() ) return ERR_CONTINUE; if ( m_bError ) return ERR_STOP; if ( m_phase == TBP_TURN ) // preliminary rotation? { angle = m_object->GetAngleY(0); angle = Math::NormAngle(angle); // 0..2*Math::PI if ( Math::TestAngle(angle, m_angleY-Math::PI*0.01f, m_angleY+Math::PI*0.01f) ) { m_physics->SetMotorSpeedZ(0.0f); dist = Math::Distance(m_object->GetPosition(0), m_metal->GetPosition(0)); if ( dist > 30.0f ) { time = m_physics->GetLinTimeLength(dist-30.0f, 1.0f); m_speed = 1.0f/time; } else { time = m_physics->GetLinTimeLength(30.0f-dist, -1.0f); m_speed = 1.0f/time; } m_phase = TBP_MOVE; m_progress = 0.0f; } return ERR_CONTINUE; } if ( m_phase == TBP_MOVE ) // preliminary forward/backward? { dist = Math::Distance(m_object->GetPosition(0), m_metal->GetPosition(0)); if ( dist >= 25.0f && dist <= 35.0f ) { m_physics->SetMotorSpeedX(0.0f); m_motion->SetAction(MHS_GUN); // takes gun m_phase = TBP_TAKE; m_speed = 1.0f/1.0f; m_progress = 0.0f; } else { if ( m_progress > 1.0f ) // timeout? { m_metal->SetLock(false); // usable again if ( dist < 30.0f ) return ERR_BUILD_METALNEAR; else return ERR_BUILD_METALAWAY; } } return ERR_CONTINUE; } if ( m_phase == TBP_TAKE ) // takes gun { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_motion->SetAction(MHS_FIRE); // shooting position m_object->SetObjectParent(14, 4); m_object->SetPosition(14, Math::Vector(0.6f, 0.1f, 0.3f)); m_object->SetAngleZ(14, 0.0f); m_phase = TBP_PREP; m_speed = 1.0f/1.0f; m_progress = 0.0f; } if ( m_phase == TBP_PREP ) // prepares? { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_soundChannel = m_sound->Play(SOUND_TREMBLE, m_object->GetPosition(0), 0.0f, 1.0f, true); m_sound->AddEnvelope(m_soundChannel, 0.7f, 1.0f, 1.0f, SOPER_CONTINUE); m_sound->AddEnvelope(m_soundChannel, 0.7f, 1.5f, 7.0f, SOPER_CONTINUE); m_sound->AddEnvelope(m_soundChannel, 0.0f, 1.5f, 2.0f, SOPER_STOP); m_camera->StartEffect(Gfx::CAM_EFFECT_VIBRATION, m_metal->GetPosition(0), 1.0f); m_phase = TBP_BUILD; m_speed = 1.0f/10.f; // duration of 10s m_progress = 0.0f; } if ( m_phase == TBP_BUILD ) // construction? { if ( m_progress < 1.0f ) return ERR_CONTINUE; DeleteMark(m_metal->GetPosition(0), 20.0f); m_metal->DeleteObject(); // removes the metal delete m_metal; m_metal = 0; m_building->SetZoom(0, 1.0f); m_building->SetCirVibration(Math::Vector(0.0f, 0.0f, 0.0f)); m_building->SetLock(false); // building usable m_main->CreateShortcuts(); m_displayText->DisplayError(INFO_BUILD, m_buildingPos, 10.0f, 50.0f); automat = m_building->GetAuto(); if ( automat != 0 ) { automat->Init(); } m_motion->SetAction(MHS_GUN); // hands gun m_phase = TBP_TERM; m_speed = 1.0f/1.0f; m_progress = 0.0f; } if ( m_phase == TBP_TERM ) // rotation terminale ? { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_motion->SetAction(-1); m_object->SetObjectParent(14, 0); m_object->SetPosition(14, Math::Vector(-1.5f, 0.3f, -1.35f)); m_object->SetAngleZ(14, Math::PI); if ( m_type == OBJECT_FACTORY || m_type == OBJECT_RESEARCH || m_type == OBJECT_NUCLEAR ) { m_phase = TBP_RECEDE; m_speed = 1.0f/1.5f; m_progress = 0.0f; } } if ( m_phase == TBP_RECEDE ) // back? { if ( m_progress < 1.0f ) return ERR_CONTINUE; m_physics->SetMotorSpeedX(0.0f); } Abort(); return ERR_STOP; }