Notifications
Clear all

Proposal code: autotrader and mouse functions


walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

Author: Darkdesire


-- /pioneersp/src/KeyBindings.inc.h
+++ /ShipController/KeyBindings.inc.h
@@ -21,7 +21,7 @@

BINDING_GROUP(Lang::WEAPONS)
KEY_BINDING(targetObject, "BindTargetObject", Lang::TARGET_OBJECT_IN_SIGHTS, SDLK_t, 0)
-KEY_BINDING(fireLaser, "BindFireLaser", Lang::FIRE_LASER, SDLK_SPACE, 0)
+KEY_BINDING(fireLaser, "BindFireLaser", Lang::FIRE_LASER, 0, 0)
KEY_BINDING(fireMissile, "BindFireMissile", Lang::FIRE_MISSILE, SDLK_m, 0)

BINDING_GROUP(Lang::SHIP_ORIENTATION)
@@ -40,6 +40,8 @@
KEY_BINDING(thrustLeft, "BindThrustLeft", Lang::THRUSTER_PORT, SDLK_j, 0)
KEY_BINDING(thrustRight, "BindThrustRight", Lang::THRUSTER_STARBOARD, SDLK_l, 0)
KEY_BINDING(thrustLowPower, "BindThrustLowPower", Lang::USE_LOW_THRUST, SDLK_LSHIFT, 0)
+KEY_BINDING(FlightFollowMouse, "BindFlightFollowMouse", Lang::FLIGHT_FOLLOW_MOUSE, SDLK_SPACE, 0)
+KEY_BINDING(ActivateAutoTrade, "BindActivateAutoTrade", Lang::ACTIVATE_AUTO_TRADE, SDLK_b, 0)

BINDING_GROUP(Lang::SPEED_CONTROL_MODE)
KEY_BINDING(increaseSpeed, "BindIncreaseSpeed", Lang::INCREASE_SET_SPEED, SDLK_RETURN, 0)


--- /pioneersp/src/LangStrings.inc.h
+++ /ShipController/LangStrings.inc.h
@@ -218,7 +218,8 @@
DECLARE_STRING(QUADRUPLE_SYSTEM)
DECLARE_STRING(TRIPLE_SYSTEM)
DECLARE_STRING(BINARY_SYSTEM)
-DECLARE_STRING(AUTOMATIC_SYSTEM_SELECTION)
+DECLARE_STRING(ENABLED_AUTOMATIC_SYSTEM_SELECTION)
+DECLARE_STRING(DISABLED_AUTOMATIC_SYSTEM_SELECTION)
DECLARE_STRING(FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED)
DECLARE_STRING(CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED)
DECLARE_STRING(CARGO_BAY_LIFE_SUPPORT_LOST)
@@ -430,6 +431,7 @@
DECLARE_STRING(HULL_INTEGRITY)
DECLARE_STRING(SHIELD_INTEGRITY)
DECLARE_STRING(FUEL)
+DECLARE_STRING(LAUNCH_PERMISSION_DENIED_BUSY)
DECLARE_STRING(HYPERSPACE_JUMP_ABORTED)
DECLARE_STRING(LANDED)
DECLARE_STRING(DOCKING)
@@ -491,3 +493,5 @@
DECLARE_STRING(MONTH_DEC)
DECLARE_STRING(MISCELLANEOUS)
DECLARE_STRING(PAUSED)
+DECLARE_STRING(FLIGHT_FOLLOW_MOUSE)
+DECLARE_STRING(ACTIVATE_AUTO_TRADE)


--- /pioneersp/src/ShipController.cpp
+++ /ShipController/ShipController.cpp
@@ -11,6 +11,7 @@
#include "Space.h"
#include "WorldView.h"
#include "OS.h"
+#include "LuaEvent.h"

void ShipController::StaticUpdate(float timeStep)
{
@@ -33,7 +34,8 @@
m_setSpeed(0.0),
m_flightControlState(CONTROL_MANUAL),
m_lowThrustPower(0.25), // note: overridden by the default value in GameConfig.cpp (DefaultLowThrustPower setting)
- m_mouseDir(0.0)
+ m_mouseDir(0.0),
+ m_AutoTradeActivated(false)
{
float deadzone = Pi::config->Float("JoystickDeadzone");
m_joystickDeadzone = deadzone * deadzone;
@@ -46,12 +48,22 @@
m_fireMissileKey = KeyBindings::fireMissile.onPress.connect(
sigc::mem_fun(this, &PlayerShipController::FireMissile));

+ m_FlightMouseFollowing = KeyBindings::FlightFollowMouse.onPress.connect(
+ sigc::mem_fun(this, &PlayerShipController::FlightMouseFollowing));
+
+ m_ActivateAutoTrade = KeyBindings::ActivateAutoTrade.onPress.connect(
+ sigc::mem_fun(this, &PlayerShipController::ActivateAutoTrade));
+
+ m_IncreaseSetSpeed = Pi::onMouseWheel.connect(sigc::mem_fun(this, &PlayerShipController~PlayerShipController()
{
m_connRotationDampingToggleKey.disconnect();
m_fireMissileKey.disconnect();
+ m_FlightMouseFollowing.disconnect();
+ m_IncreaseSetSpeed.disconnect();
+ m_ActivateAutoTrade.disconnect();
}

void PlayerShipControllerWriter &wr, Space *space)
@@ -171,53 +183,71 @@

// have to use this function. SDL mouse position event is bugged in windows
int mouseMotion[2];
- SDL_GetRelativeMouseState (mouseMotion+0, mouseMotion+1); // call to flush
- if (Pi::MouseButtonState(SDL_BUTTON_RIGHT))
+ SDL_GetRelativeMouseState (mouseMotion+0, mouseMotion+1); // call to flush
+ // if (Pi::MouseButtonState(SDL_BUTTON_RIGHT))
+// if (KeyBindings::FlightFollowMouse.IsActive())
+// {
+// if (Pi::FlightModel==0) Pi::FlightModel=1;
+// else
+// Pi::FlightModel=0;
+// }
+ if (Pi::FlightModel==1)
{
+ int x,y;
+ SDL_GetMouseState(&x,&y);
+ x-=Pi::renderer->GetWindow()->GetWidth()/2;
+ y-=Pi::renderer->GetWindow()->GetHeight()/2;
+ if ((x > -5) && (x < 5)) x = 0;
+ if ((y > -5) && (y < 5)) y = 0;
const matrix3x3d &rot = m_ship->GetOrient();
- if (!m_mouseActive) {
- m_mouseDir = -rot.VectorZ(); // in world space
- m_mouseX = m_mouseY = 0;
+// if (!m_mouseActive)
+ {
+ m_mouseDir = -rot.VectorZ(); // in world space
+ // m_mouseX = m_mouseY = 0;
m_mouseActive = true;
}
vector3d objDir = m_mouseDir * rot;

const double radiansPerPixel = 0.00002 * m_fovY;
- const int maxMotion = std::max(abs(mouseMotion[0]), abs(mouseMotion[1]));
- const double accel = Clamp(maxMotion / 4.0, 0.0, 90.0 / m_fovY);
-
- m_mouseX += mouseMotion[0] * accel * radiansPerPixel;
- double modx = clipmouse(objDir.x, m_mouseX);
- m_mouseX -= modx;
+ const int maxMotion = std::max(abs(x), abs(y));
+ const double accel = Clamp(maxMotion / 12.0, 0.0, 90.0 / m_fovY/20.0);
+
+ m_mouseX = x * accel * radiansPerPixel;
+ m_mouseX = clipmouse(objDir.x, m_mouseX);

const bool invertY = (Pi::IsMouseYInvert() ? !m_invertMouse : m_invertMouse);

- m_mouseY += mouseMotion[1] * accel * radiansPerPixel * (invertY ? -1 : 1);
- double mody = clipmouse(objDir.y, m_mouseY);
- m_mouseY -= mody;
-
- if(!is_zero_general(modx) || !is_zero_general(mody)) {
- matrix3x3d mrot = matrix3x3d::RotateY(modx) * matrix3x3d::RotateX(mody);
+ m_mouseY = y * accel * radiansPerPixel * (invertY ? -1 : 1);
+ m_mouseY = clipmouse(objDir.y, m_mouseY);
+
+ if(!is_zero_general(m_mouseX) || !is_zero_general(m_mouseY))
+ {
+ matrix3x3d mrot = matrix3x3d::RotateY(m_mouseX) * matrix3x3d::RotateX(m_mouseY);
m_mouseDir = (rot * (mrot * objDir)).Normalized();
}
}
else m_mouseActive = false;

- if (m_flightControlState == CONTROL_FIXSPEED) {
+ if (m_flightControlState == CONTROL_FIXSPEED)
+ {
double oldSpeed = m_setSpeed;
- if (stickySpeedKey) {
- if (!(KeyBindings::increaseSpeed.IsActive() || KeyBindings::decreaseSpeed.IsActive())) {
+ if (stickySpeedKey)
+ {
+ if (!(KeyBindings::increaseSpeed.IsActive() || KeyBindings::decreaseSpeed.IsActive()))
+ {
stickySpeedKey = false;
}
}

- if (!stickySpeedKey) {
+ if (!stickySpeedKey)
+ {
if (KeyBindings::increaseSpeed.IsActive())
m_setSpeed += std::max(fabs(m_setSpeed)*0.05, 1.0);
if (KeyBindings::decreaseSpeed.IsActive())
m_setSpeed -= std::max(fabs(m_setSpeed)*0.05, 1.0);
if ( ((oldSpeed < 0.0) && (m_setSpeed >= 0.0)) ||
- ((oldSpeed > 0.0) && (m_setSpeed <= 0.0)) ) {
+ ((oldSpeed > 0.0) && (m_setSpeed <= 0.0)) )
+ {
// flipped from going forward to backwards. make the speed 'stick' at zero
// until the player lets go of the key and presses it again
stickySpeedKey = true;
@@ -233,9 +263,11 @@
if (KeyBindings::thrustLeft.IsActive()) m_ship->SetThrusterState(0, -linearThrustPower);
if (KeyBindings::thrustRight.IsActive()) m_ship->SetThrusterState(0, linearThrustPower);

- if (KeyBindings::fireLaser.IsActive() || (Pi::MouseButtonState(SDL_BUTTON_LEFT) && Pi::MouseButtonState(SDL_BUTTON_RIGHT))) {
- //XXX worldview? madness, ask from ship instead
- m_ship->SetGunState(Pi::worldView->GetActiveWeapon(), 1);
+ // if (KeyBindings::fireLaser.IsActive() || (Pi::MouseButtonState(SDL_BUTTON_LEFT) && Pi::MouseButtonState(SDL_BUTTON_RIGHT)))
+ if (Pi::MouseButtonState(SDL_BUTTON_RIGHT))
+ {
+ //XXX worldview? madness, ask from ship instead
+ m_ship->SetGunState(Pi::worldView->GetActiveWeapon(), 1);
}

if (KeyBindings::yawLeft.IsActive()) wantAngVel.y += 1.0;
@@ -254,17 +286,20 @@
changeVec.z = KeyBindings::rollAxis.GetValue();

// Deadzone more accurate
- for (int axis=0; axis<3; axis++) {
- if (fabs(changeVec[axis]) < m_joystickDeadzone)
- changeVec[axis]=0.0;
- else
- changeVec[axis] = changeVec[axis] * 2.0;
+ for (int axis=0; axis<3; axis++)
+ {
+ if (fabs(changeVec[axis]) < m_joystickDeadzone)
+ changeVec[axis]=0.0;
+ else
+ changeVec[axis] = changeVec[axis] * 2.0;
}

wantAngVel += changeVec;

- if (wantAngVel.Length() >= 0.001 || force_rotation_damping || m_rotationDamping) {
- if (PiTIMEACCEL_1X) {
+ if (wantAngVel.Length() >= 0.001 || force_rotation_damping || m_rotationDamping)
+ {
+ if (PiTIMEACCEL_1X)
+ {
for (int axis=0; axis<3; axis++)
wantAngVel[axis] = wantAngVel[axis] * Pi::game->GetInvTimeAccelRate();
}
@@ -347,9 +382,36 @@
{
if (!Pi::player->GetCombatTarget())
return;
- LuaObject<Ship>player, "FireMissileAt", "any", static_cast<Ship*>(Pi::player->GetCombatTarget()));
-}
-
+
+ lua_State *l = Lua::manager->GetLuaState();
+ int pristine_stack = lua_gettop(l);
+ LuaObject<Ship>player);
+ lua_pushstring(l, "FireMissileAt");
+ lua_gettable(l, -2);
+ lua_pushvalue(l, -2);
+ lua_pushstring(l, "any");
+ LuaObject<Ship>player->GetCombatTarget()));
+ lua_call(l, 3, 1);
+ lua_settop(l, pristine_stack);
+}
+
+void PlayerShipController::FlightMouseFollowing()
+{
+ switch (Pi::FlightModel)
+ {
+ case 0:
+ {
+ Pi::FlightModel = 1;
+ break;
+ }
+ case 1:
+ {
+ Pi::FlightModel = 0;
+ break;
+ }
+ }
+}
+
Body *PlayerShipController::GetCombatTarget() const
{
return m_combatTarget;
@@ -381,4 +443,38 @@
else if (m_setSpeedTarget == m_navTarget)
m_setSpeedTarget = 0;
m_navTarget = target;
-}
+}
+
+void PlayerShipController::IncreaseSetSpeed(bool up)
+{
+ if (Pi::MouseWheel == 0)
+ {
+ if (up)
+ {
+ m_setSpeed += std::max(fabs(m_setSpeed)*0.05, 1.0);
+ }
+ else
+ {
+ m_setSpeed -= std::max(fabs(m_setSpeed)*0.05, 1.0);
+ }
+ }
+}
+
+void PlayerShipController::ActivateAutoTrade()
+{
+ switch (m_AutoTradeActivated)
+ {
+ case true:
+ {
+ LuaEvent::Queue("onActivateAutoTradeOFF", Pi::player);
+ m_AutoTradeActivated = false;
+ break;
+ }
+ case false:
+ {
+ LuaEvent::Queue("onActivateAutoTradeON", Pi::player);
+ m_AutoTradeActivated = true;
+ break;
+ }
+ }
+}


--- /pioneersp/src/ShipController.h
+++ /ShipController/ShipController.h
@@ -69,6 +69,9 @@
void SetRotationDamping(bool enabled);
void ToggleRotationDamping();
void FireMissile();
+ void FlightMouseFollowing();
+ void IncreaseSetSpeed(bool up);
+ void ActivateAutoTrade();

//targeting
//XXX AI should utilize one or more of these
@@ -92,6 +95,7 @@
bool m_invertMouse; // used for rear view, *not* for invert Y-axis option (which is Pi::IsMouseYInvert)
bool m_mouseActive;
bool m_rotationDamping;
+ bool m_AutoTradeActivated;
double m_mouseX;
double m_mouseY;
double m_setSpeed;
@@ -106,6 +110,9 @@

sigc::connection m_connRotationDampingToggleKey;
sigc::connection m_fireMissileKey;
+ sigc::connection m_FlightMouseFollowing;
+ sigc::connection m_IncreaseSetSpeed;
+ sigc::connection m_ActivateAutoTrade;
};

#endif


Quote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

@Darkdesire

 

You can do a brief overview of what players can expect from these functions?


ReplyQuote
Vuzz
 Vuzz
(@vuzz)
Warrant Officer Registered
Joined: 7 years ago
Posts: 491
 

Playing under automatic routine ? what is the interest to play like that ?

 

I'm a regular player of multi mmo online and that remind me somes cheat codes called "boot" used by some players to make money , but i don't think it's really "playing game".


ReplyQuote
ollobrain
(@ollobrain)
Lieutenant Registered
Joined: 13 years ago
Posts: 564
 

??? wtf


ReplyQuote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

It is a demonstration of how to turn an idea into code.  I agree with @jpab when he says that ideas are cheap, but the code is expensive. But I would like the author expose the original idea that led to his writing. That is, what will see the player. Then everyone can say if you like it or not. Or what would change. We can make a friendly environment here. 


ReplyQuote
Vuzz
 Vuzz
(@vuzz)
Warrant Officer Registered
Joined: 7 years ago
Posts: 491
 

 We can make a friendly environment here. 

 

Of course Walter , i agree.

 

I just simply explain why i don't like that , friendly ^^ afterall maybe somes players like this sort of gameplay.


ReplyQuote
Darkdesire
(@darkdesire)
Petty Officer Registered
Joined: 10 years ago
Posts: 10
 

High everybody

 

the aim is just to add some autopilot function. In this very early version, when invoke, the system goes only in local trade (searching for a station, go to the station in autopilot and give some money to simulate local trade, repeat the operation until the player stop this) BUT i just wanted to see how to code it. It was just to verify if it can be possible to give order to the player vessel.

 

What can be done with this:

- Playing pioneer with a little more strategic aspect (what i will try to do it's adding the possibility for the player to own more than one vessel and so giving order to other vessel and go for exploration for example)

 

The next stage will be to add this function in the f3 screen (no need to modify the code, only adding lua function)

 

That is.

 

DD


ReplyQuote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

Hi @Darkdesire

 

I wanted to compile (Linux64) and I got this error: 

 

SectorView.cpp: In member function ‘void SectorView 

SectorView.cpp error: ‘AUTOMATIC_SYSTEM_SELECTION’ is not a member of ‘Lang’

  label = (new GuiAUTOMATIC_SYSTEM_SELECTION))->Color(255, 255, 255);

 

Do not have much time to research, you take charge?  

 

What operating system do you use?

 

Now I kept wanting try it! 

 

 


ReplyQuote
Darkdesire
(@darkdesire)
Petty Officer Registered
Joined: 10 years ago
Posts: 10
 

@walterar

ÃŽm not to my house until thursday i'll take a look asap

Thank´s for your interrest


ReplyQuote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

@Darkdesire

 

No problem, I can wait until Thursday 


ReplyQuote
Darkdesire
(@darkdesire)
Petty Officer Registered
Joined: 10 years ago
Posts: 10
 

Hello Walterar

 

as promised, this is a link with source code modified

 

http://dl.free.fr/f9VqWFNbw

 

 

I've tried it => ok

 

i'm working on Win7 with visual 2013 express


ReplyQuote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

@Darkdesire

 

You are a man who keeps his promises.   Thanks!

 

  I will test this in Linux 


ReplyQuote
Marcel
(@marcel)
Captain Registered
Joined: 7 years ago
Posts: 1188
 

@Darkdesire

This is the type of behaviour that I would also expect of the AI ships. They should logically be trying to earn a living. That goes for pirates too. It would also be nice if a ship, once encountered by the player, would have a continuing life moving across star systems on its own. A player might become friends or enemies or rivals with the captain of an AI ship for example and possibly encounter it later with relations based on what happened the last time they met.


ReplyQuote
Vuzz
 Vuzz
(@vuzz)
Warrant Officer Registered
Joined: 7 years ago
Posts: 491
 

@ Marcel,

 

Interstellar travel by spacio temporal jumps can offer opportunities of meetings rehearsals.


ReplyQuote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

@Darkdesire

 

I finally had time to try this. Compiles without problems on Linux. The operation is what you have promised. I walked around the solar system, collecting money. I did not feel comfortable with the operation of the mouse. I like how you solved the events. 🙂


ReplyQuote
Darkdesire
(@darkdesire)
Petty Officer Registered
Joined: 10 years ago
Posts: 10
 

@Walterar

 

Thank's for your try,

 

i just don't understand your 2 last sentences: you were not comfortable with my mouse management ?

 

You said everything work as promised, but when i try, it doesn't work as expected for me (if the vessel was docked => asap i launch the autotrade function, the vessel launch but do nothing else), did ou try with your last code ? (if so, i'll donwload it, compile it and give an other try)


ReplyQuote
Darkdesire
(@darkdesire)
Petty Officer Registered
Joined: 10 years ago
Posts: 10
 

@Marcel,

 

asap i can solve the problem encounter with the Walterar version, i will continue to expand my script.


ReplyQuote
walterar
(@walterar)
Commander Registered
Joined: 7 years ago
Posts: 980
Topic starter  

@Darkdesire

 

I just update and synchronize the master. You want to try now? https://github.com/walterar/pioneer-sp.git 

 

There were many changes in the mouse area.


ReplyQuote