Esempio n. 1
0
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;

}
Esempio n. 3
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);
    }
}
Esempio n. 4
0
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;
}