I think it is designed, because when you have a mouse, you can click in the direction you want the arrow to fire. With a gamepad, your only option is to move a joystick. Moving the joystick aims, and letting it snap back into position fires. The problem arises when something else is also bound to that joystick, which it is by default.
By default, Grappling Hook is bound to Joy-Throttle Down and Joy-Rudder Right. On my gamepad that's right and down on the right analog stick, respectively. So when I tried to fire an arrow to the right, I would get a grappling hook instead.
There's no reason for the grappling hook to be bound to an axis, as I don't think it can be aimed. You can choose to fire it to the left or right while hanging by using the left or right move button, but you cannot aim it vertically.
I'm using the
Logitech Dual Action. It's modeled after the Playstation 3 controller.
I had a similar problem with the Wizard, but was able to figure that out before coming here. Draw and Levitate are both bound to Joy-Throttle Down and Joy-Rudder Right by default, just like the grappling hook. And again, these commands cannot be aimed. All those commands do is activate that mode while the button is held down, allowing you to move the cursor with something else. So by default moving the joystick simply activated levitate/draw, without actually moving the cursor. I had to bind levitate/draw to separate buttons and bind the X and Y axes to the joystick.
By default axis x and axis y are bound to axis_rx and axis_ry, which aren't used by my gamepad at all.
My left joystick is just joy-left, joy-right, joy-up and joy-down. My directional pad is joy-pov-left, joy-pov-right, joy-pov-up and joy-pov-down.
On my right joystick, Trine registers it as follows:
Left: joy-throttle-up
Right: joy-throttle-down
Up: joy-rudder-left
Down: joy-rudder right
I'm just going to post what I came up with that works:
joystick_x_axis = axis_throttle
joystick_y_axis = axis_ruddercontroller_type = 105
camera_move_forward = joy-up
camera_move_backward = joy-down
camera_move_left = joy-left,joy-pov-left
camera_move_right = joy-right,joy-pov-right
change_next_weapon = joy-but-8
quit = joy-but-5
screenshot = f11
console_toggle = f8
execute = joy-but-6
run_script_20 = joy-pov-up
run_script_21 = joy-pov-down
wizard_break_object = joy-but-3,joy-but-4
wizard_draw_levitate_1 = joy-but-7
wizard_draw_levitate_2 = joy-but-5thief_attack_current_weapon = joy-throttle-any,joy-rudder-any (not in game options, but here's the bind nonetheless)thief_use_rope = joy-but-4
thief_ninja_time = joy-but-2
warrior_attack_current_weapon = joy-but-3
warrior_charge = joy-but-4
warrior_shield_throw = joy-throttle-any,joy-rudder-any (same as thief attack I expect, though I haven't encountered this ability in the game yet)warrior_object_pickup = joy-but-2
open_upgrade = joy-but-9
jump = joy-but-1
open_pause_menu = joy-but-10
menu_select = joy-but-2
menu_special_1 = joy-but-1
menu_special_2 = joy-but-3
binds_v106 = 1