void piece_move (piece_info_t *obj) { int changed_loc; int speed, max_hits; int saved_moves; int need_input; long saved_loc; city_info_t *cityp; /* set func for piece if on city */ cityp = find_city (obj->loc); if (cityp != NULL) if (cityp->func[obj->type] != NOFUNC) obj->func = cityp->func[obj->type]; changed_loc = FALSE; /* not changed yet */ speed = piece_attr[obj->type].speed; max_hits = piece_attr[obj->type].max_hits; need_input = FALSE; /* don't require user input yet */ while (obj->moved < obj_moves (obj)) { saved_moves = obj->moved; /* save moves made */ saved_loc = obj->loc; /* remember starting location */ if (awake (obj) || need_input){ /* need user input? */ ask_user (obj); display_loc_u (obj->loc); /* let user see result */ need_input = FALSE; /* we got it */ } if (obj->moved == saved_moves) /* user set function? */ switch (obj->func) { /* handle preprogrammed function */ case NOFUNC: break; case RANDOM: move_random (obj); break; case SENTRY: obj->moved = speed; break; case FILL: move_fill (obj); break; case LAND: move_land (obj); break; case EXPLORE: move_explore (obj); break; case ARMYLOAD: move_armyload (obj); break; case ARMYATTACK:move_armyattack (obj); break; case TTLOAD: move_ttload (obj); break; case REPAIR: move_repair (obj); break; case WFTRANSPORT: move_transport (obj); break; case MOVE_N: case MOVE_NE: case MOVE_E: case MOVE_SE: case MOVE_S: case MOVE_SW: case MOVE_W: case MOVE_NW: move_dir (obj); break; default: move_path (obj); break; } if (obj->moved == saved_moves) need_input = TRUE; /* * handle fighters specially. If in a city or carrier, turn * is over and reset range to max. Otherwise, if * range = 0, fighter crashes and burns and turn is over. */ if (obj->type == FIGHTER && obj->hits > 0) { if ((user_map[obj->loc].contents == 'O' || user_map[obj->loc].contents == 'C') && obj->moved > 0) { obj->range = piece_attr[FIGHTER].range; obj->moved = speed; obj->func = NOFUNC; info("Landing confirmed."); } else if (obj->range == 0) { info("Fighter at %d crashed and burned.", obj->loc); kill_obj (obj, obj->loc); } } if (saved_loc != obj->loc) changed_loc = TRUE; } /* if a boat is in port, damaged, and never moved, fix some damage */ if (obj->hits > 0 /* still alive? */ && !changed_loc /* object never changed location? */ && obj->type != ARMY && obj->type != FIGHTER /* it is a boat? */ && obj->hits < max_hits /* it is damaged? */ && user_map[obj->loc].contents == 'O') /* it is in port? */ obj->hits++; /* fix some damage */ }
int main() { const std::string program_name{"Boussigon V0.2"}; assert(program_name != ""); const float window_x{700.0f}; const float window_y{700.0f}; assert(window_x > 0.0f); assert(window_y > 0.0f); const sf::Vector2f window_sizes{window_x, window_y}; const int delaz{25}; assert(delaz > 0); const std::chrono::milliseconds delay{delaz}; const sf::Color white{sf::Color(255, 255, 255)}; const sf::Color black{sf::Color(0, 0, 0)}; const sf::Color orange{sf::Color(255, 127, 0)}; const sf::Color purple{sf::Color(127, 0, 255)}; const sf::Color cyan{sf::Color(127, 255, 255)}; const sf::Color red{sf::Color(255, 0, 0)}; const sf::Color yellow{sf::Color(255, 255, 0)}; const sf::Color green{sf::Color(0, 255, 0)}; const sf::Color blue{sf::Color(0, 0, 255)}; sf::RenderWindow window{sf::VideoMode(window_x, window_y), program_name, sf::Style::Default}; const float delta_dist = 3.0f; const float circ_radius{50.0f}; const sf::Color circ_color{purple}; const sf::Color colli_color{orange}; const sf::Vector2f circ_position{0.25f*window_x, 0.5f*window_y}; player_circle player{circ_radius, circ_color, circ_position}; const float rect_radius{50.0f}; const sf::Color rect_color{green}; const sf::Vector2f rect_position{0.75f*window_x, 0.5f*window_y}; object_square object{rect_radius, rect_color, rect_position}; while (window.isOpen()) { sf::Event event; window.clear(black); show_object_square(window, object); show_player_circle(window, player); window.display(); std::this_thread::sleep_for(delay); move_dir(player, delta_dist); collision_color(player, object, colli_color, circ_color); if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) { window.close(); return 1; } while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) { window.close(); return 2; } } } return 0; }
void Engine::update(float dt) { // look // double x, y; glfwGetCursorPos(window, &x, &y); static double last_x = x, last_y = y; static float x_rot = glm::asin(camera.get_forward().y), y_rot = glm::asin(camera.get_forward().x); double dx = last_x - x, dy = last_y - y; if (glfwGetKey(window, GLFW_KEY_K) == GLFW_PRESS) { x_rot += dt * fake_mouse_change; } if (glfwGetKey(window, GLFW_KEY_J) == GLFW_PRESS) { x_rot -= dt * fake_mouse_change; } if (glfwGetKey(window, GLFW_KEY_H) == GLFW_PRESS) { y_rot -= dt * fake_mouse_change; } if (glfwGetKey(window, GLFW_KEY_L) == GLFW_PRESS) { y_rot += dt * fake_mouse_change; } last_x = x; last_y = y; // positive y_rot means left. y_rot -= mouse_sensitivity * dx; x_rot += mouse_sensitivity * dy; float max_angle = glm::radians(85.f); float min_angle = -max_angle; if (x_rot > max_angle) { x_rot = max_angle; } else if (x_rot < min_angle) { x_rot = min_angle; } glm::vec3 forward = glm::vec3( cos(x_rot) * sin(y_rot), sin(x_rot), -cos(x_rot) * cos(y_rot)); camera.lookat = camera.position + forward; // movement // glm::vec3 move_dir(0.f), right = camera.get_right(), up = glm::normalize(camera.up); if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) { move_dir += forward; } if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { move_dir -= forward; } if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) { move_dir += right; } if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) { move_dir -= right; } if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) { move_dir += up; } if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) { move_dir -= up; } float move_speed = normal_move_speed; if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { move_speed /= move_speed_change_factor; } if (glfwGetKey(window, GLFW_KEY_LEFT_CONTROL) == GLFW_PRESS) { move_speed *= move_speed_change_factor; } float len = glm::length(move_dir); if (len > 1.f) { move_dir = move_dir / len; } if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { dt *= 10; } if (glfwGetKey(window, GLFW_KEY_V) == GLFW_PRESS) { dt /= 10; } // Note: assumes dt will be >= 0. No timetravel... glm::vec3 move = dt * move_speed * move_dir; camera.position += move; camera.lookat += move; // physics // bool paused = (glfwGetKey(window, GLFW_KEY_C) == GLFW_RELEASE); if (!paused) { physics->step(dt); //auto printbtvec = [] (const char* fmt, btVector3 v) { // TODO // printf(fmt, v.x(), v.y(), v.z()); //}; btScalar pi = SIMD_PI; btVector3 local(0,0.2f,0); btVector3 target = from_vec3(nodes["redcube"]->position); KinematicChain* arm = roboarm3; std::vector<btScalar> angles = arm->get_angles(); std::vector<btScalar> tar_angles = arm->calc_angles_ccd(angles, target, local); btVector3 dest = arm->get_position(tar_angles, local); glm::vec3 offset = glm::vec3(0.05f, 0.f, 0.f); nodes["cyancube"]->position = to_vec3(dest) - offset; nodes["yellowcube"]->position = to_vec3(dest) + offset; std::vector<btScalar> velocities(angles.size()); for (size_t i = 0; i < angles.size(); ++i) { velocities[i] = (i+1)*7000.f*(tar_angles[i] - angles[i])*dt; } arm->apply_velocities(velocities); //for (size_t i = 0; i < angles.size(); ++i) { // TODO // printf("v[%lu] %f-%f ==> %f\n", i, angles[i], tar_angles[i], // velocities[i]); //} } if (glfwGetKey(window, GLFW_KEY_KP_ADD) == GLFW_PRESS) { nodes["redcube"]->position += move_speed * dt * glm::vec3(0.f, 1.f, 0.f); } if (glfwGetKey(window, GLFW_KEY_KP_SUBTRACT) == GLFW_PRESS) { nodes["redcube"]->position += move_speed * dt * glm::vec3(0.f, -1.f, 0.f); } if (glfwGetKey(window, GLFW_KEY_KP_2) == GLFW_PRESS) { nodes["redcube"]->position += move_speed * dt * glm::vec3(0.f, 0.f, 1.f); } if (glfwGetKey(window, GLFW_KEY_KP_8) == GLFW_PRESS) { nodes["redcube"]->position += move_speed * dt * glm::vec3(0.f, 0.f, -1.f); } if (glfwGetKey(window, GLFW_KEY_KP_4) == GLFW_PRESS) { nodes["redcube"]->position += move_speed * dt * glm::vec3(-1.f, 0.f, 0.f); } if (glfwGetKey(window, GLFW_KEY_KP_6) == GLFW_PRESS) { nodes["redcube"]->position += move_speed * dt * glm::vec3(1.f, 0.f, 0.f); } redcube_rb->setMotionState(redcube_rb->getMotionState()); nodes["cyancube"]->orientation *= glm::angleAxis(dt*glm::radians(90.f), glm::normalize(glm::vec3(1.f, 1.f, 1.f))); // quit // if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, GL_TRUE); } }
shadowtcb_status shadowtcb_move (/*@NULL@*/const char *user_newname, uid_t user_newid) { struct stat dirmode, filemode; char *tcbdir, *shadow; shadowtcb_status ret = SHADOWTCB_FAILURE; if (!getdef_bool ("USE_TCB")) { return SHADOWTCB_SUCCESS; } if (NULL == stored_tcb_user) { return SHADOWTCB_FAILURE; } if (NULL == user_newname) { user_newname = stored_tcb_user; } if (move_dir (user_newname, user_newid) == SHADOWTCB_FAILURE) { return SHADOWTCB_FAILURE; } if (-1 == user_newid) { return SHADOWTCB_SUCCESS; } if ( (asprintf (&tcbdir, TCB_DIR "/%s", user_newname) == -1) || (asprintf (&shadow, TCB_FMT, user_newname) == -1)) { OUT_OF_MEMORY; return SHADOWTCB_FAILURE; } if (stat (tcbdir, &dirmode) != 0) { fprintf (stderr, _("%s: Cannot stat %s: %s\n"), Prog, tcbdir, strerror (errno)); goto out_free; } if (chown (tcbdir, 0, 0) != 0) { fprintf (stderr, _("%s: Cannot change owners of %s: %s\n"), Prog, tcbdir, strerror (errno)); goto out_free; } if (chmod (tcbdir, 0700) != 0) { fprintf (stderr, _("%s: Cannot change mode of %s: %s\n"), Prog, tcbdir, strerror (errno)); goto out_free; } if (lstat (shadow, &filemode) != 0) { if (errno != ENOENT) { fprintf (stderr, _("%s: Cannot lstat %s: %s\n"), Prog, shadow, strerror (errno)); goto out_free; } fprintf (stderr, _("%s: Warning, user %s has no tcb shadow file.\n"), Prog, user_newname); } else { if (!S_ISREG (filemode.st_mode) || filemode.st_nlink != 1) { fprintf (stderr, _("%s: Emergency: %s's tcb shadow is not a " "regular file with st_nlink=1.\n" "The account is left locked.\n"), Prog, user_newname); goto out_free; } if (chown (shadow, user_newid, filemode.st_gid) != 0) { fprintf (stderr, _("%s: Cannot change owner of %s: %s\n"), Prog, shadow, strerror (errno)); goto out_free; } if (chmod (shadow, filemode.st_mode & 07777) != 0) { fprintf (stderr, _("%s: Cannot change mode of %s: %s\n"), Prog, shadow, strerror (errno)); goto out_free; } } if (unlink_suffs (user_newname) == SHADOWTCB_FAILURE) { goto out_free; } if (chown (tcbdir, user_newid, dirmode.st_gid) != 0) { fprintf (stderr, _("%s: Cannot change owner of %s: %s\n"), Prog, tcbdir, strerror (errno)); goto out_free; } ret = SHADOWTCB_SUCCESS; out_free: free (tcbdir); free (shadow); return ret; }