void AIUnit::Update() { MAI_ASSERT(unitDef != 0); UpdateState(); UpdateCommand(); UpdateWait(); lifeTime += 1; }
void SCMImportWindow::MessageReceived(BMessage *msg) { switch (msg->what) { case M_USE_PROVIDER: { SCMProjectImporter *importer = fProviderMgr.ImporterAt( fProviderField->Menu()->IndexOf( fProviderField->Menu()->FindMarked())); if (importer) SetProvider(importer); break; } case M_USE_CUSTOM_PROVIDER: { SetProvider(NULL); break; } case M_TOGGLE_ANONYMOUS: { fUserNameBox->SetEnabled(fAnonymousBox->Value() != B_CONTROL_ON); UpdateCommand(); break; } case M_UPDATE_COMMAND: { UpdateCommand(); break; } case M_SCM_IMPORT: { DoImport(); break; } default: { DWindow::MessageReceived(msg); break; } } }
void Scene_Menu::Update() { command_window->Update(); gold_window->Update(); menustatus_window->Update(); if (command_window->GetActive()) { UpdateCommand(); } else if (menustatus_window->GetActive()) { UpdateActorSelection(); } }
void CMonsterSquad::assign_monsters_target_dirs (ENTITY_VEC &members, const CEntity *enemy) { for ( ENTITY_VEC_IT i=members.begin(), e=members.end(); i!=e; ++i ) { CBaseMonster* monster = smart_cast<CBaseMonster*>(*i); SSquadCommand command; command.type = SC_ATTACK; command.entity = enemy; command.direction = calc_monster_target_dir(monster, enemy); UpdateCommand(monster, command); } }
void FringeTileEditor::Update() { if (isOn) { UpdateCamera(); if (state == FTES_NONE) { UpdateSelect(); } if (selectedEntity) { switch (state) { case FTES_NONE: UpdateOpportunity(); break; case FTES_COMMAND: UpdateCommand(); break; case FTES_MOVE: UpdateMove(); break; case FTES_ROTATE: UpdateRotate(); break; case FTES_SCALE: UpdateScale(); break; } } } }
SCMImportWindow::SCMImportWindow(void) : DWindow(BRect(0,0,350,300), "Import from Repository") { MakeCenteredOnShow(true); BView *top = GetBackgroundView(); BMenu *menu = new BMenu("Providers"); for (int32 i = 0; i < fProviderMgr.CountImporters(); i++) { SCMProjectImporter *importer = fProviderMgr.ImporterAt(i); if (!importer) continue; BMessage *msg = new BMessage(M_USE_PROVIDER); menu->AddItem(new BMenuItem(importer->GetName(), msg)); } // Disable custom commands for now // menu->AddSeparatorItem(); // menu->AddItem(new BMenuItem("Custom", new BMessage(M_USE_CUSTOM_PROVIDER))); menu->SetLabelFromMarked(true); menu->ItemAt(0L)->SetMarked(true); BRect r(Bounds()); r.InsetBy(10.0, 10.0); r.bottom = 40.0; fProviderField = new BMenuField(r, "repofield", "Provider: ", menu, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); float pw, ph; fProviderField->GetPreferredSize(&pw, &ph); fProviderField->ResizeTo(r.Width(), ph); top->AddChild(fProviderField); r = fProviderField->Frame(); menu = new BMenu("Methods"); if (gHgAvailable) menu->AddItem(new BMenuItem("Mercurial", new BMessage(M_UPDATE_COMMAND))); if (gGitAvailable) menu->AddItem(new BMenuItem("Git", new BMessage(M_UPDATE_COMMAND))); if (gSvnAvailable) menu->AddItem(new BMenuItem("Subversion", new BMessage(M_UPDATE_COMMAND))); menu->SetLabelFromMarked(true); menu->ItemAt(0L)->SetMarked(true); fProvider = fProviderMgr.ImporterAt(0); r.OffsetBy(0.0, r.Height() + 10.0); fSCMField = new BMenuField(r, "scmfield", "Method: ", menu, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); top->AddChild(fSCMField); r.OffsetBy(0.0, r.Height() + 10.0); fProjectBox = new AutoTextControl(r, "project", "Project: ", "", new BMessage(M_UPDATE_COMMAND), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fProjectBox->GetPreferredSize(&pw, &ph); fProjectBox->ResizeTo(r.Width(), ph); r = fProjectBox->Frame(); top->AddChild(fProjectBox); r.OffsetBy(0.0, r.Height() + 10.0); fAnonymousBox = new BCheckBox(r, "anonymous", "Anonymous check-out", new BMessage(M_TOGGLE_ANONYMOUS)); top->AddChild(fAnonymousBox); fAnonymousBox->ResizeToPreferred(); fAnonymousBox->SetValue(B_CONTROL_ON); r.OffsetBy(0.0, fAnonymousBox->Bounds().Height() + 10.0); fUserNameBox = new AutoTextControl(r, "username", "Username: "******"", new BMessage(M_UPDATE_COMMAND), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); top->AddChild(fUserNameBox); fUserNameBox->SetEnabled(false); r.OffsetBy(0.0, r.Height() + 10.0); fRepository = new AutoTextControl(r, "repository", "Repository (opt.): ", "", new BMessage(M_UPDATE_COMMAND), B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fRepository->GetPreferredSize(&pw, &ph); fRepository->ResizeTo(r.Width(), ph); r = fRepository->Frame(); top->AddChild(fRepository); r.OffsetBy(0.0, r.Height() + 10.0); fCommandLabel = new BStringView(r, "commandlabel", "Command: ", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP); fCommandLabel->ResizeToPreferred(); top->AddChild(fCommandLabel); r.OffsetBy(0.0, fCommandLabel->Bounds().Height() + 5.0); r.bottom = r.top + 75.0; r.right -= B_V_SCROLL_BAR_WIDTH; BRect textRect = r.OffsetToCopy(0.0, 0.0).InsetByCopy(10.0, 10.0); fCommandView = new BTextView(r, "command", textRect, B_FOLLOW_ALL); BScrollView *scroll = new BScrollView("scrollview", fCommandView, B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP, 0, false, true); top->AddChild(scroll); fCommandView->MakeEditable(false); fOK = new BButton(r, "ok", "Import", new BMessage(M_SCM_IMPORT), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM); fOK->ResizeToPreferred(); fOK->MoveTo(Bounds().right - 10.0 - fOK->Bounds().Width(), scroll->Frame().bottom + 10.0); ResizeTo(Bounds().Width(), fOK->Frame().bottom + 10.0); scroll->SetResizingMode(B_FOLLOW_ALL); top->AddChild(fOK); fOK->MakeDefault(true); fOK->SetEnabled(false); UpdateCommand(); fProviderField->MakeFocus(true); }
void SCMImportWindow::SetProvider(SCMProjectImporter *importer) { if (importer && !fProvider) { fSCMField->SetEnabled(true); fProjectBox->SetEnabled(true); fAnonymousBox->SetEnabled(true); fUserNameBox->SetEnabled(true); fRepository->SetEnabled(true); fCommandView->MakeEditable(false); fOK->SetEnabled(false); fProjectBox->MakeFocus(true); fProvider = importer; UpdateCommand(); } else if (!importer && fProvider) { fSCMField->SetEnabled(false); fProjectBox->SetEnabled(false); fAnonymousBox->SetEnabled(false); fUserNameBox->SetEnabled(false); fRepository->SetEnabled(false); fCommandView->MakeEditable(true); fCommandView->SetText(""); fCommandView->MakeFocus(true); fOK->SetEnabled(true); } fProvider = importer; if (fProvider) { BMenu *menu = fSCMField->Menu(); BMenuItem *item; item = menu->FindItem("Mercurial"); if (item) item->SetEnabled(fProvider->SupportsSCM(SCM_HG)); item = menu->FindItem("Git"); if (item) item->SetEnabled(fProvider->SupportsSCM(SCM_GIT)); item = menu->FindItem("Subversion"); if (item) item->SetEnabled(fProvider->SupportsSCM(SCM_SVN)); item = menu->FindMarked(); if (!item->IsEnabled()) { item->SetMarked(false); for (int32 i = 0; i < menu->CountItems(); i++) if (menu->ItemAt(i)->IsEnabled()) { menu->ItemAt(i)->SetMarked(true); break; } } } UpdateCommand(); }
void CMonsterSquad::Attack_AssignTargetDir(ENTITY_VEC &members, const CEntity *enemy) { _elem first; _elem last; lines.clear(); // сортировать по убыванию расстояния от npc до врага std::sort(members.begin(), members.end(), sort_predicate(enemy)); if (members.empty()) return; float delta_yaw = PI_MUL_2 / members.size(); // обработать ближний элемент first.pE = members.back(); first.p_from = first.pE->Position(); first.yaw = 0; members.pop_back(); lines.push_back(first); // обработать дальний элемент if (!members.empty()) { last.pE = members[0]; last.p_from = last.pE->Position(); last.yaw = PI; members.erase (members.begin()); lines.push_back(last); } Fvector target_pos = enemy->Position(); float next_right_yaw = delta_yaw; float next_left_yaw = delta_yaw; // проходим с конца members в начало (начиная с наименьшего расстояния) while (!members.empty()) { CEntity *pCur; pCur = members.back(); members.pop_back(); _elem cur_line; cur_line.p_from = pCur->Position(); cur_line.pE = pCur; // определить cur_line.yaw float h1,p1,h2,p2; Fvector dir; dir.sub(target_pos, first.p_from); dir.getHP(h1,p1); dir.sub(target_pos, cur_line.p_from); dir.getHP(h2,p2); bool b_add_left = false; if (angle_normalize_signed(h2 - h1) > 0) { // right if ((next_right_yaw < PI) && !fsimilar(next_right_yaw, PI, PI/60.f)) b_add_left = false; else b_add_left = true; } else { // left if ((next_left_yaw < PI) && !fsimilar(next_left_yaw, PI, PI/60.f)) b_add_left = true; else b_add_left = false; } if (b_add_left) { cur_line.yaw = -next_left_yaw; next_left_yaw += delta_yaw; } else { cur_line.yaw = next_right_yaw; next_right_yaw += delta_yaw; } lines.push_back(cur_line); } // Пройти по всем линиям и заполнить таргеты у npc float first_h, first_p; Fvector d; d.sub(target_pos,first.p_from); d.getHP(first_h, first_p); for (u32 i = 0; i < lines.size(); i++){ SSquadCommand command; command.type = SC_ATTACK; command.entity = enemy; command.direction.setHP (first_h + lines[i].yaw, first_p); UpdateCommand(lines[i].pE, command); } }
SCMImportWindow::SCMImportWindow(void) : DWindow(BRect(0,0,350,350), B_TRANSLATE("Import from repository")) { MakeCenteredOnShow(true); BMenu *menu = new BMenu(B_TRANSLATE("Providers")); for (int32 i = 0; i < fProviderMgr.CountImporters(); i++) { SCMProjectImporter *importer = fProviderMgr.ImporterAt(i); if (!importer) continue; BMessage *msg = new BMessage(M_USE_PROVIDER); menu->AddItem(new BMenuItem(importer->GetName(), msg)); } // Disable custom commands for now // menu->AddSeparatorItem(); // menu->AddItem(new BMenuItem("Custom", new BMessage(M_USE_CUSTOM_PROVIDER))); menu->SetLabelFromMarked(true); menu->ItemAt(0L)->SetMarked(true); fProviderField = new BMenuField("repofield", B_TRANSLATE("Provider:"), menu); menu = new BMenu(B_TRANSLATE("Methods")); if (gHgAvailable) menu->AddItem(new BMenuItem(B_TRANSLATE("Mercurial"), new BMessage(M_UPDATE_COMMAND))); if (gGitAvailable) menu->AddItem(new BMenuItem(B_TRANSLATE("Git"), new BMessage(M_UPDATE_COMMAND))); if (gSvnAvailable) menu->AddItem(new BMenuItem(B_TRANSLATE("Subversion"), new BMessage(M_UPDATE_COMMAND))); menu->SetLabelFromMarked(true); menu->ItemAt(0L)->SetMarked(true); fProvider = fProviderMgr.ImporterAt(0); fSCMField = new BMenuField("scmfield", B_TRANSLATE("Method:"), menu); fProjectBox = new AutoTextControl("project", B_TRANSLATE("Project:"), "", new BMessage(M_UPDATE_COMMAND)); fAnonymousBox = new BCheckBox("anonymous", B_TRANSLATE("Anonymous check-out"), new BMessage(M_TOGGLE_ANONYMOUS)); fAnonymousBox->SetValue(B_CONTROL_ON); fUserNameBox = new AutoTextControl("username", B_TRANSLATE("Username:"******"", new BMessage(M_UPDATE_COMMAND)); fUserNameBox->SetEnabled(false); fRepository = new AutoTextControl("repository", B_TRANSLATE("Repository owner:"), "", new BMessage(M_UPDATE_COMMAND)); fCommandLabel = new BStringView("commandlabel", B_TRANSLATE("Command:")); fCommandView = new BTextView("command"); BScrollView *scroll = new BScrollView("scrollview", fCommandView, 0, false, true); fCommandView->MakeEditable(false); fOK = new BButton("ok", B_TRANSLATE("Import"), new BMessage(M_SCM_IMPORT)); BLayoutBuilder::Group<>(this, B_VERTICAL) .SetInsets(10) .Add(fProviderField) .Add(fSCMField) .Add(fRepository) .Add(fProjectBox) .Add(fAnonymousBox) .Add(fUserNameBox) .Add(fCommandLabel) .Add(scroll) .Add(fOK) .End(); fOK->MakeDefault(true); fOK->SetEnabled(false); UpdateCommand(); fProviderField->MakeFocus(true); }
void CMonsterSquad::Idle_AssignAction(ENTITY_VEC &members) { // получить цель лидера SMemberGoal &goal = GetGoal(leader); if (goal.type == MG_WalkGraph) { front.clear(); back.clear(); left.clear(); right.clear(); for (ENTITY_VEC_IT IT = members.begin(); IT != members.end(); IT++) { if ((*IT) == leader) continue; front.push_back (*IT); back.push_back (*IT); left.push_back (*IT); right.push_back (*IT); } Fvector front_pos; Fvector back_pos; Fvector left_pos; Fvector right_pos; Fvector dir = leader->Direction(); front_pos.mad(leader->Position(), dir, CENTER_CIRCLE_DIST); std::sort(front.begin(),front.end(), CPredicateSideSort(front_pos)); dir.invert(); back_pos.mad(leader->Position(), dir, CENTER_CIRCLE_DIST); std::sort(back.begin(),back.end(), CPredicateSideSort(back_pos)); dir = leader->XFORM().i; right_pos.mad(leader->Position(), dir, CENTER_CIRCLE_DIST); std::sort(right.begin(),right.end(), CPredicateSideSort(right_pos)); dir.invert(); left_pos.mad(leader->Position(), dir, CENTER_CIRCLE_DIST); std::sort(left.begin(),left.end(), CPredicateSideSort(left_pos)); SSquadCommand command; command.type = SC_FOLLOW; command.entity = leader; command.direction = leader->Direction(); u8 cur_type = 0; while (!front.empty()) { float random_r; Fvector random_dir; random_dir.random_dir (); random_r = Random.randF(CIRCLE_RADIUS_MIN, CIRCLE_RADIUS_MAX); const CEntity *entity = 0; switch (cur_type) { case 0: // front entity = front.back (); front.pop_back(); for (u32 i=0; i<back.size(); i++) if (back[i] == entity) {back[i] = back.back(); back.pop_back(); break;} for (u32 i=0; i<right.size(); i++) if (right[i] == entity) {right[i] = right.back(); right.pop_back(); break;} for (u32 i=0; i<left.size(); i++) if (left[i] == entity) {left[i] = left.back(); left.pop_back(); break;} command.position.mad (front_pos, random_dir, random_r); break; case 1: // back entity = back.back (); back.pop_back(); for (u32 i=0; i<front.size(); i++) if (front[i] == entity) {front[i] = front.back(); front.pop_back(); break;} for (u32 i=0; i<right.size(); i++) if (right[i] == entity) {right[i] = right.back(); right.pop_back(); break;} for (u32 i=0; i<left.size(); i++) if (left[i] == entity) {left[i] = left.back(); left.pop_back(); break;} command.position.mad (back_pos, random_dir, random_r); break; case 2: // left entity = left.back (); left.pop_back(); for (u32 i=0; i<front.size(); i++) if (front[i] == entity) {front[i] = front.back(); front.pop_back(); break;} for (u32 i=0; i<right.size(); i++) if (right[i] == entity) {right[i] = right.back(); right.pop_back(); break;} for (u32 i=0; i<back.size(); i++) if (back[i] == entity) {back[i] = back.back(); back.pop_back(); break;} command.position.mad (left_pos, random_dir, random_r); break; case 3: // right entity = right.back (); right.pop_back(); for (u32 i=0; i<front.size(); i++) if (front[i] == entity) {front[i] = front.back(); front.pop_back(); break;} for (u32 i=0; i<left.size(); i++) if (left[i] == entity) {left[i] = left.back(); left.pop_back(); break;} for (u32 i=0; i<back.size(); i++) if (back[i] == entity) {back[i] = back.back(); back.pop_back(); break;} command.position.mad (right_pos, random_dir, random_r); break; default: NODEFAULT; } cur_type++; if (cur_type > 3) cur_type = 0; UpdateCommand(entity, command); } } else if (goal.type == MG_Rest) { // пересчитать положение в команде в соответствие с целью лидера for (ENTITY_VEC_IT it = members.begin(); it != members.end(); it++) { if ((*it) == leader) continue; SSquadCommand command; command.type = SC_REST; command.position = leader->Position(); command.node = leader->ai_location().level_vertex_id(); command.entity = 0; UpdateCommand (*it, command); } } }