EXPORT_C TInt CSDL::SetSDLCode(TInt aScanCode, TInt aSDLCode) { const TInt current = GetSDLCode(aScanCode); if(aScanCode >= 0 && aScanCode < MAX_SCANCODE) KeyMap()[aScanCode] = static_cast<SDLKey>(aSDLCode); return current; }
AIAction PlayerAI::Tick(float _timespan, std::vector<Core*>& /*_allies*/, std::vector<Core*>& _enemies, Core* _self) { if(core_id_ == -1) { core_id_ = _self->GetSectionID(); if(core_id_ != -1) { core_ids_.push_back(core_id_); } else Logger::ErrorOut() << "Player ID of -1 encountered\n"; } if(core_ids_.size() == 1) { Radar::SetPlayerPosition(_self->GetGlobalPosition()); } AIAction action; Uint8* keystates = SDL_GetKeyState(0); int mx, my; int mb = SDL_GetMouseState(&mx, &my); Vector3f point_to_face; Vector3f peer_factor; bool lock_movement = false; bool lock_angle = false; bool look_backwards = false; if(SDL_NumJoysticks()) SDL_JoystickUpdate(); point_to_face = _self->GetGlobalPosition(); std::vector<InputConfig>& binds = bindings[player_id_]; for(std::vector<InputConfig>::iterator it = binds.begin(); it != binds.end(); ++it) { switch(it->type) { case BindingType::MouseAxisBinding: { float axis_value = 0; float ltv_axis_value = 0; switch(it->binding.mouse_axis) { case MouseAxis::MouseX: axis_value = static_cast<float>(mx); ltv_axis_value = ltv_mouse_position_.x; break; case MouseAxis::MouseY: axis_value = static_cast<float>(my); ltv_axis_value = ltv_mouse_position_.y; break; } switch(it->action) { case Action::LookXAxis: point_to_face.x = Camera::Instance().ScreenToWorld(Vector3f(axis_value, 0, 0)).x; peer_factor.x = (axis_value - (Camera::Instance().GetWindowWidth() / 2.0f)) * 2.0f / Camera::Instance().GetWindowWidth(); break; case Action::LookYAxis: point_to_face.y = Camera::Instance().ScreenToWorld(Vector3f(0, axis_value, 0)).y; peer_factor.y = -(axis_value - (Camera::Instance().GetWindowHeight() / 2.0f)) * 2.0f / Camera::Instance().GetWindowHeight(); break; case Action::XMovement: movement_integrator_.x *= (1.0f - 0.2f * _timespan); movement_integrator_.x += axis_value - ltv_axis_value; action.dx_ += movement_integrator_.x / (fabs(movement_integrator_.x) > 1.0f ? fabs(movement_integrator_.x) : 1.0f); break; case Action::YMovement: movement_integrator_.y *= (1.0f - 0.2f * _timespan); movement_integrator_.y += axis_value - ltv_axis_value; action.dx_ += movement_integrator_.y / (fabs(movement_integrator_.y) > 1.0f ? fabs(movement_integrator_.y) : 1.0f); break; } } break; case BindingType::JoystickAxisBinding: { float axis_value = 0; if(it->binding.joystick_axis.joystick) { Sint16 js_axis_val = SDL_JoystickGetAxis(it->binding.joystick_axis.joystick, it->binding.joystick_axis.axis_index); if(abs(js_axis_val) < MAXSHORT * 0.2f) js_axis_val = 0; axis_value = (float)js_axis_val / (float)MAXSHORT; } switch(it->action) { case Action::LookXAxis: point_to_face.x += axis_value; peer_factor.x = axis_value; break; case Action::LookYAxis: point_to_face.y -= axis_value; peer_factor.y = -axis_value; break; case Action::XMovement: action.dx_ += axis_value; break; case Action::YMovement: action.dy_ -= axis_value; break; } break; } case BindingType::KeyboardBinding: case BindingType::MouseButtonBinding: case BindingType::JoystickButtonBinding: if((it->type == BindingType::KeyboardBinding && keystates[it->binding.key]) || (it->type == BindingType::MouseButtonBinding && (mb & SDL_BUTTON(GetSDLCode(it->binding.mouse_button)))) || (it->type == BindingType::JoystickButtonBinding && it->binding.joystick_button.joystick && SDL_JoystickGetButton(it->binding.joystick_button.joystick, it->binding.joystick_button.button_index))) { switch(it->action) { case Action::Fire: action.firing_ = true; break; case Action::Boost: action.thrust_ = true; break; case Action::Target: break; case Action::MoveLeft: action.dx_--; break; case Action::MoveRight: action.dx_++; break; case Action::MoveUp: action.dy_++; break; case Action::MoveDown: action.dy_--; break; case Action::LockMovement: lock_movement = true; break; case Action::LockAngle: lock_angle = true; break; case Action::LookBackwards: look_backwards = true; break; } } break; } } if(look_backwards) { point_to_face *= -1; } if(lock_angle_) { point_to_face = lock_vector_ + _self->GetGlobalPosition();//+ _self->GetAngle(); } Vector3f point_to_face_relative = point_to_face - _self->GetGlobalPosition(); if(point_to_face_relative.lengthSq()!=0) { TurnData turn_data = GetTurnDirection(_self->GetAngle(), point_to_face_relative); float dotprod = turn_data.turn_factor; action.dtheta_ = ClampTurnDirection(dotprod, 0.4f); if(peer_factor.lengthSq() > 1) peer_factor.normalize(); Vector3f camera_centre = _self->GetGlobalPosition(); Camera::Instance().SetCentreTarget(camera_centre.x, camera_centre.y, peer_factor.x, peer_factor.y, CameraLevel::Human); Camera::Instance().SetFocus(_self->GetPosition().x, _self->GetPosition().y, CameraLevel::Human); } else { Camera::Instance().SetCentreTarget(_self->GetPosition().x, _self->GetPosition().y, 0, 0, CameraLevel::Human); Camera::Instance().SetFocus(_self->GetPosition().x, _self->GetPosition().y, CameraLevel::Human); } ltv_mouse_position_.x = static_cast<float>(mx); ltv_mouse_position_.y = static_cast<float>(my); if(lock_movement) { action.dx_ = 0; action.dy_ = 0; } if(lock_angle && !lock_angle_) { lock_vector_ = Vector3f(sinf(_self->GetAngle() * M_PI / 180.0f), cosf(_self->GetAngle() * M_PI / 180.0f), 0); } lock_angle_ = lock_angle; return action; }