Jump to content

BindControl - Keybinds Generator and Manager


Recommended Posts

Sorry if I came off weird, was just unsure if maybe I was misusing certain terms in a way that was causing confusion ("Controller" Vs "Gamepad" vs 'Joypad") If you're working on that, I'll take a crack at re-creating and revising my old control scheme as a template, if that helps.

Link to comment
Share on other sites

19 hours ago, Premmy said:

Sorry if I came off weird, was just unsure if maybe I was misusing certain terms in a way that was causing confusion ("Controller" Vs "Gamepad" vs 'Joypad") If you're working on that, I'll take a crack at re-creating and revising my old control scheme as a template, if that helps.

Nono, not weird at all, no worries.  I'm away on holiday travel right now so won't be getting to this for a bit, but yeah if you have input on anything that might be useful while implementing this, I'd be glad to see it.  Thanks!

Link to comment
Share on other sites

Getting a chance to work on this a little.  I have BindControl now correctly able to bind to controller buttons.  Doing joystick / axis movements is a little hairier, and I haven't yet looked at the D-pad.  It's coming along, though.  Hopefully I'll have something to show off this next week.

Link to comment
Share on other sites

I've got and tested this basic Setup for X-input controls. It works to the degree that I played for about an hour+ of constant mission and open world gameplay without having to use a keyboard or mouse, which is about what I'd consider a success. Put together a basic guide for it that I'd hope would be helpful both for other players and for testing.

control templates.txt

Link to comment
Share on other sites

3 hours ago, Premmy said:

I've got and tested this basic Setup for X-input controls.

Oh this is fantastic for working on possible use cases, thank you!

 

What controller are you using?  I ask because all I've been working with so far are a couple of XBox 360-flavored controllers, and they're a bit of a hassle with wx, the toolkit that BindControl uses.  I have my controller working perfectly well now, in Linux, but it requires a little bit of a kludge, and in Windows the same code doesn't work and is going to need to be modified.  I also start to suspect, from my initial Windows tinkerings, that the dpad on this controller is simply not supported in wx in Windows.

 

So I'm thinking I'm going to have platform-specific and controller-specific code in there, which is going to be a bit of a headache but I'm game to try.  Hopefully most controllers are going to fall into a few general classes that I can support.  I also have access to PS3 controllers, and I'm not averse to getting a more modern controller or two, to tinker with this.  Oh I also have Steam Controllers but I think they're such strange beasts that they oddly might not be helpful here.

 

Also, looking at your setup, I'm discovering I'm going to need to do a little bit of internal restructuring of BindControl -- it currently thinks of "Mod Keys" and "Keys" mostly separately because of how wx keyboard events work, but there's a lot of combinations of buttons and bumpers and triggers in your examples, so I'll have to make a more general case for combining inputs that doesn't have strong opinions on what qualifies as a "Mod Key."

 

Finally, there's a longstanding UI concern that I might need to address finally -- currently BindControl has one spot to pick, for instance, the bind for Forward, even though the game of course supports binding any number of keys or buttons to +forward.  So, this is an existing feature failure -- BindControl can't bind both "W" and "Up Arrow" to +forward (or, more interestingly, to the Speed-On-Demand versions of "Forward"), and this is just made more apparent when we add controller support into the mix.

 

Thanks again, this gives me a lot to think about and work with.  If I can get this 360 controller working in Windows, I may release a beta for you to play with and see whether it works at all in your case or whether I have a lot more work to do.  🙂

Link to comment
Share on other sites

13 hours ago, emersonrp said:

What controller are you using?  I ask because all I've been working with so far are a couple of XBox 360-flavored controllers, and they're a bit of a hassle with wx, the toolkit that BindControl uses.  I have my controller working perfectly well now, in Linux, but it requires a little bit of a kludge, and in Windows the same code doesn't work and is going to need to be modified.  I also start to suspect, from my initial Windows tinkerings, that the dpad on this controller is simply not supported in wx in Windows.

My primary controller for this was this Logitech G F710 

 

It was just what I had lying around. It works alright. It has a Tab for swapping from Direct to X-input. It also has a button for swapping the  inputs of the left stick and d-pad. 


These features are useful because the original version of this layout was made for

 

This Contraption 

 

Instead of  using Custom Modfier buttons(which didn’t exist at the time) I just… kinda….Stretched my thumbs down to the Ctrl, alt, and shift Keys on the integrated keyboard.

 

I wouldn’t recommend that.


It has a built in Gyro mouse and full keyboard, tho, so It worked pretty well, if clunky.

 

It /also/ has a function that swaps the left joystick and dpad.


That said, this is a weird edge case and I wouldn’t recommend wasting time trying to factor it in. It seems to mostly just use direct input.

 

When I transitioned to

A GPD win 2

in 2020 it was more or less an easy shift of the original layout, with the unfortunate caveat that the Buttons jumbled around a bit, as the GPD uses X-input and the Cideko uses direct.  

 

But I was still Hyper-extending my fingers to the keyboard buttons, Swapping from gamepad to Mouse Mode, and sometimes just sliding my hands all the way down to the keyboard and just playing it that way. When Playing on the gpd  and Docked to a monitor and USB hub at home, I just plugged the Cideko in and played “normally” (which admittedly still occasionally involved all of the listed behaviors). I never really tried to get the Logitech controller working, as that was mostly for other types of games. And also didn’t have a way to integrate button modifiers until the update.

 

13 hours ago, emersonrp said:

So I'm thinking I'm going to have platform-specific and controller-specific code in there, which is going to be a bit of a headache but I'm game to try.  Hopefully most controllers are going to fall into a few general classes that I can support.  I also have access to PS3 controllers, and I'm not averse to getting a more modern controller or two, to tinker with this.  Oh I also have Steam Controllers but I think they're such strange beasts that they oddly might not be helpful here.

I have a DS4 and several old 360 controllers sitting around my house, but no decent means of interfacing them with my Computer, I might look into some receivers over the weekend.

 

13 hours ago, emersonrp said:

Also, looking at your setup, I'm discovering I'm going to need to do a little bit of internal restructuring of BindControl -- it currently thinks of "Mod Keys" and "Keys" mostly separately because of how wx keyboard events work, but there's a lot of combinations of buttons and bumpers and triggers in your examples, so I'll have to make a more general case for combining inputs that doesn't have strong opinions on what qualifies as a "Mod Key."

Depending on how much of this you want to be user-facing or which ways you want users to interact with it. You could either have something in the options to Set/define what the mod keys for the current profile is, or do away with defining mod keys within BindControl at all, and  instead have a  “control customization” tab that  users can enter which buttons they want to be modifiers(possibly also the options for virtual mouse controls) and then spits out a copy/pasteable /slash command that will change them when executed in-

14 hours ago, emersonrp said:

Thanks again, this gives me a lot to think about and work with.  If I can get this 360 controller working in Windows, I may release a beta for you to play with and see whether it works at all in your case or whether I have a lot more work to do.  🙂

 

5 hours ago, emersonrp said:

I've put up a release with rudimentary controller support, just as a proof of concept.  It needs plenty of work -- it's certainly not capable of creating most of the binds in your document yet -- and plenty of testing, I'm sure.  Let me know your luck.

Dude this was crazy fast, amazing job. I’m not 100% sure when I’ll have access to my pc, due to some issues at home, hopefully in a day or two. But when I get my hands on It I’ll run some tests. 

Link to comment
Share on other sites

10 hours ago, Premmy said:

My primary controller for this was this Logitech G F710

Ah cool, I was originally developing with a Logitech F310, which I assume works similarly under the hood.  Discovered that a bunch of the problems I was having with Windows was that the controller itself is faulty (though Linux seems to handle it fine) -- moving to an actual XBox 360 controller fixed up all my Windows issues, though this actual controller is old and decrepit and has some trouble registering some button pressed sometimes, ugh.  I'll maybe grab an F710 just to have a modern working controller for this.

10 hours ago, Premmy said:

Instead of  using Custom Modfier buttons(which didn’t exist at the time) I just… kinda….Stretched my thumbs down to the Ctrl, alt, and shift Keys on the integrated keyboard.

Ow yes that sounds awful.

10 hours ago, Premmy said:

I have a DS4 and several old 360 controllers sitting around my house, but no decent means of interfacing them with my Computer, I might look into some receivers over the weekend.

Don't worry about collecting extra hardware unless you're really excited about it.  I plugged in a PS3 controller and it mostly Just Worked in Linux (don't get me started about how Linux behaves better with old hardware than Windows ever did or will) so I'm guessing that layers like XInput are going to make this pretty portable.  If you're on fire to try it out with a bunch of different hardware, though, I'm totally happy to hear reports.

10 hours ago, Premmy said:

Depending on how much of this you want to be user-facing or which ways you want users to interact with it. You could either have something in the options to Set/define what the mod keys for the current profile is

That's where I was angling, more stuff in the "preferences" dialog, or maybe a separate controller tab in that dialog, to select the /controller_modifiers and/or /extra_modifiers which will then act as Mod Keys in the key-picker-dialog logic.  I'm redoing the latter to be smarter and more general with some success, so I expect it to be possible to bind, for instance, "Joy9+Joypad1" using the controller inside BindControl, Real Soon Now.  For the moment, I have the six controller buttons/triggers you mentioned hard-coded as mod keys but yeah exposing some UI for that will be next up once it's working.

 

And then, the "Write Binds" button currently offers up a copyable "/bindloadfile" line to paste into the game;  I'll make that include multiple lines with the /controller_modifiers etc incantations, as appropriate.  I think this can be all pretty smooth.

 

The only part that's still a big question mark is the larger issue of binding more than one thing to a function, which as I said, is a longstanding low-priority feature failure that I'd like to figure out someday.

 

Conveniently, I have a bunch of free time right now after the holidays, so I'm being all on fire to get this done.  🙂

Link to comment
Share on other sites

1 hour ago, emersonrp said:

I'm redoing the latter to be smarter and more general with some success, so I expect it to be possible to bind, for instance, "Joy9+Joypad1" using the controller inside BindControl, Real Soon Now.

"Real Soon Now" is now.  I have just released controller prerelease 0.2, which has working-but-fiddly support for modifier binds like "LTrigger+Joy2" and the like.

 

Please read the release note for more info.

 

https://github.com/emersonrp/bindcontrol/releases/tag/controller-0.2

Link to comment
Share on other sites

Is there any way to get the old (pre-Issue 27) behaviors out of flight with BindControl? My desired end state is that when I'm moving, Fly is toggled on, but then when I stop it is toggled off, leaving Hover on, so I can use non-SoD mousechord movement to reposition in combat without zooming all over the place inside buildings.

As it stands now, I can't see any way to get that behavior short of figuring what edits to make to the keybind files directly, which sorta defeats the purpose of a utility like BindControl.

Is this just a case of not having gotten around to it, or is there a technical issue I'm not aware of?

Link to comment
Share on other sites

On 1/7/2024 at 8:01 PM, kenlon said:

Is there any way to get the old (pre-Issue 27) behaviors out of flight with BindControl? My desired end state is that when I'm moving, Fly is toggled on, but then when I stop it is toggled off, leaving Hover on, so I can use non-SoD mousechord movement to reposition in combat without zooming all over the place inside buildings.

As it stands now, I can't see any way to get that behavior short of figuring what edits to make to the keybind files directly, which sorta defeats the purpose of a utility like BindControl.

Is this just a case of not having gotten around to it, or is there a technical issue I'm not aware of?

Not currently near a machine where I can actually play the game to look at this, but I wanted to reply:

 

That's almost certainly a case of not having gotten around to it.  The SoD stuff is basically unchanged in design since Gnarly's binds came out like 20 years ago.  They almost certainly don't work as designed post-issue-27, and that's on the TODO list for sure.  The SoD code is so tangly and fragile that I have a bit of fear getting into it to change behavior, but it needs to be done.

 

So, to make sure I understand, though, what you're wanting is that here in a post-27 world, the SoD stuff works the way it used to, ie, toggles between Hover and Fly, or at the very least leaves Hover running while toggling Fly;  and then mousechord can be left non-SoD for minor adjustments in combat and inside missions etc.  And currently, instead, it's doing something undesired with turning Hover on and off?  Again, not near a machine where I can test it for the next several days, but wanting to understand what it's doing wrong ('cause it almost certainly is doing several things wrong in the post-27 world).

 

Thanks for the feedback, and I'm hoping I can get around to making SoD less broken here in 2024.

 

 

BTW, a few months ago I released a preview of some initial work on including some of the post-27 power changes into the existing code, which can be found on Github:

 

https://github.com/emersonrp/bindcontrol/releases/tag/movement-0.1

 

...but this won't address your issue almost certainly.

 

Link to comment
Share on other sites

5 hours ago, emersonrp said:

BTW, a few months ago I released a preview of some initial work on including some of the post-27 power changes into the existing code, which can be found on Github:

 

https://github.com/emersonrp/bindcontrol/releases/tag/movement-0.1

 

...but this won't address your issue almost certainly.

 

 

I did try using that version, but it had the same behavior.

 

What it does now is that fly remains turned on along with hover when stationary, despite the notification messages in chat saying that it's being turned off. I believe that it used to rely on Hover and Fly being mutually exclusive, and now that they are not, the binds would need to include an explicit turning off of Fly when switching to Hover, and vice versa.

Link to comment
Share on other sites

On 1/9/2024 at 1:53 AM, kenlon said:

What it does now is that fly remains turned on along with hover when stationary, despite the notification messages in chat saying that it's being turned off. I believe that it used to rely on Hover and Fly being mutually exclusive, and now that they are not, the binds would need to include an explicit turning off of Fly when switching to Hover, and vice versa.

Yeah it almost certainly relies on that behavior.  I'm seeing this as a bit of a technical hurdle, as a given bind can only manipulate one power, typically, so the SoD stuff won't be able to toggle both Hover and Fly, for instance.  In a scheme that works post-27, it'll probably have to be that the player is expected to turn Hover on and leave it, and the SoD binds will simply toggle Fly on and off.  This doesn't give -quite- the same endurance savings as the original behavior, but it may just need to be that way.  I'll be able to tinker with this some in the next couple of days.

Link to comment
Share on other sites

So I did a little poking at the binds, and came up with a shell script to edit them:

#!/usr/bin/env bash

grep -rl "powexecname Fly\$\$powexecname Fly" * | xargs sed -i "s/powexecname Fly\$\$powexecname Fly/powexectoggleoff Hover\$\$powexectoggleon Fly/g"
grep -rl "powexecname Hover\$\$powexecname Hover" * | xargs sed -i "s/powexecname Hover\$\$powexecname Hover/powexectoggleoff Fly\$\$powexectoggleon Hover/g"

 

Basically, it found every place that the binds turned on either Hover or Fly, and edited them so as to turn off the other power before turning on the new one. 

 

This results in, for example, the F/F111000.txt bind being:

A "+down$$up 1$$down 1$$forward 1$$backward 0$$left 1$$right 0$$powexectoggleoff Hover$$powexectoggleon Fly$$bindloadfilesilent C:\coh\flight\F\F111010.txt"
D "+down$$up 1$$down 1$$forward 1$$backward 0$$left 0$$right 1$$powexectoggleoff Hover$$powexectoggleon Fly$$bindloadfilesilent C:\coh\flight\F\F111001.txt"
F "+down$$bindloadfilesilent C:\coh\flight\F\F111000r.txt"
R "forward 1$$backward 0$$up 1$$down 1$$left 0$$right 0$$powexectoggleoff Hover$$powexectoggleon Fly$$bindloadfilesilent C:\coh\flight\AF\AF111000.txt"
LCTRL+R "up 0$$down 0$$forward 0$$backward 0$$left 0$$right 0$$powexectoggleoff Fly$$powexectoggleon Hover$$t $name, SoD Binds Reset$$bindloadfilesilent C:\coh\flight\subreset.txt$$bindloadfilesilent C:\coh\flight\F\F000000.txt"
S "+down$$up 1$$down 1$$forward 1$$backward 1$$left 0$$right 0$$powexectoggleoff Hover$$powexectoggleon Fly$$bindloadfilesilent C:\coh\flight\F\F111100.txt"
SPACE "-down$$up 0$$down 1$$forward 1$$backward 0$$left 0$$right 0$$bindloadfilesilent C:\coh\flight\F\F011000.txt"
TILDE "follow$$powexectoggleoff Hover$$powexectoggleon Fly$$bindloadfilesilent C:\coh\flight\FF\FF111000.txt"
W "-down$$up 1$$down 1$$forward 0$$backward 0$$left 0$$right 0$$powexectoggleoff Hover$$powexectoggleon Fly$$bindloadfilesilent C:\coh\flight\F\F110000.txt"
X "-down$$up 1$$down 0$$forward 1$$backward 0$$left 0$$right 0$$bindloadfilesilent C:\coh\flight\F\F101000.txt"


So if you change the bind generation code to do powexectoggleoff/powexectoggleon combos, you'll be set. And I won't have to run this every time I regenerate binds. 😄 (And would also mean I don't have to come up with versions of this for all the alternate travel powers like Mystic Flight or the PB flight powers and whatnot. )

Edited by kenlon
Link to comment
Share on other sites

2 hours ago, kenlon said:

So if you change the bind generation code to do powexectoggleoff/powexectoggleon combos, you'll be set. And I won't have to run this every time I regenerate binds. 😄 (And would also mean I don't have to come up with versions of this for all the alternate travel powers like Mystic Flight or the PB flight powers and whatnot. )

 

This is actually some very helpful guidance.

 

The innards of the SoD code in BindControl are a python port of the original lua innards of CityBinder, which are themselves an adaptation of the original BASIC code released by Gnarly, lo those many years ago.  It's been fairly untouched in its logic since early CityBinder, and is like 1500 lines of twisty passages, all slightly different.

 

The code that actually outputs the bind strings is called in every possible permutation of travel powers and options, so it's the same 25 lines, packed with inscrutable looping config, that format the hundreds of bind strings depending on what your default SoD mode is, or whether or not you -have- hover, or if you're doing jump-vs-combat-jump, or teleport, or non-speed-on-demand Sprint, or or or or.  Any quick change to that area of the code is gonna require *rigorous* testing to make sure it doesn't destroy the universe.

 

That said, the original code does have a fairly modular notion of calling powers by name versus using toggleon and toggleoff.  For Fly, it's using the by-name code path and relying on the mutual exclusivity to twiddle the states of Hover and Fly.

 

If we're all extremely fortunate, it'll be possible to tinker the inscrutable config to force it down one path or another.  I am starting to look at what it would take to get Hover-vs-Fly to use the toggleon/toggleoff path and see if that magically just does the right thing without making any actual changes to the output code.  If we're less lucky, I'm basically going to have to dismantle and rebuild like 25% of this 1500 line giant nested loop, which will take a -lot- of tinkering.

 

All of that to say, this might be a complete yak shave, still, but your testing with the powexectoggleoff etc was extremely helpful in guiding my thinking, and has me at least hoping this might be a fairly straightforward fix.  I'll be poking at it on and off over the coming days and will hopefully have either something to show off or sad head-shaking reports of dismal failure by the weekend or early next week.  I still only have spotty and occasional access to the game so it's also possible I'll just make some changes, roll up an alpha build, and let y'all test it for me.

 

Thanks again for doing some of the legwork on this.

Link to comment
Share on other sites

1 hour ago, emersonrp said:

Thanks again for doing some of the legwork on this.

 

Glad to be of assistance! Looking at SoD.py, I don't envy you the task of refactoring into something more maintainable. 

Link to comment
Share on other sites

Try it out!

 

Given my very light testing, I think it is doing the right thing as far as toggling Hover and Fly in particular.  I still need to test it out with other movement powersets, and with some of the alternate movement powers like, say, Mystic Flight.  It also seems a little laggy but that might just be the laptop I'm currently confined to.  Anyway, please check it out and file issues on github as y'all find them.  Hopefully we're on our way to making Speed on Demand work as intended in a post-issue-27 world.

 

https://github.com/emersonrp/bindcontrol/releases/tag/movement-0.2

 

Edit to add:  Also briefly checked it with Super Jump + Combat Jumping and it works fine.

Edited by emersonrp
Link to comment
Share on other sites

Flight bind works almost perfectly, from what I can tell. The only thing is that when you first hit F to activate it, both hover and fly come on. This is not a big deal as it sorts out as soon as you move, just noting it for the record. Thanks!

Link to comment
Share on other sites

5 hours ago, kenlon said:

Flight bind works almost perfectly, from what I can tell. The only thing is that when you first hit F to activate it, both hover and fly come on. This is not a big deal as it sorts out as soon as you move, just noting it for the record. Thanks!

Excellent.  Yeah I'll track down the "F" behavior;  I do want all of that to act right.  Thanks for checking it out.  Let me know if you find anything else.  I've been doing a bit more tidying up and polishing of the code, though still not any sort of major refactor, but I'm planning to release it as the official version here in a little while, since, at the very least, Speed on Demand is no -more- broken.

Link to comment
Share on other sites

OK, looking at the 'F' behavior, I think it's related to the notion CityBinder originally had, and that BindControl has inherited, of "Blast Off," where if you hold down the F key when toggling flight mode on, it launches upward until you release it.  In tinkering, I feel like tapping 'F' triggers blast off, then releasing it triggers the stationary/Hover state, but if the tap and release happen too fast, it ends up with both Fly and Hover activated because of lag.  If you hold down 'F' for just like half a second, you end up launching upward a little bit, but then releasing it does the right thing.

 

Is this the case for you?  Just trying to decide whether I'm on the right track here.  It might be that "Blast Off" is a corner case that nobody wants to use, and removing it could simplify the code and the binds a bit, but if it's actually useful, I'll try to figure out how to make it work better.

Link to comment
Share on other sites

You were correct about the Blast Off bind being my issue. However, there's a few other things I've noticed: 

1: For some reason, hitting enter no longer starts chat, even though it's set in the chat binds section.

2. You can't actually bind the Enter key - if you try to bind it, hitting enter just closes the bind window, instead of setting the bind to enter.

3: Deselecting a power pool hides the associated powers, but does not change the binding settings. This led to some confusion when my default profile, with no power pools selected, was causing all my windows to vanish when I hit shift. 

 

And not actually a problem, but just weird: the default inspiration popper binds have almost all of them set to SHIFT+$KEY, but resist damage is S + SPACE. I could have sworn the old Citybinder bind was SHIFT+SPACE.

Edited by kenlon
Link to comment
Share on other sites

8 hours ago, kenlon said:

However, there's a few other things I've noticed: 

1: For some reason, hitting enter no longer starts chat, even though it's set in the chat binds section.

2. You can't actually bind the Enter key - if you try to bind it, hitting enter just closes the bind window, instead of setting the bind to enter.

These two things might be related.  I am on it.

8 hours ago, kenlon said:

3: Deselecting a power pool hides the associated powers, but does not change the binding settings. This led to some confusion when my default profile, with no power pools selected, was causing all my windows to vanish when I hit shift. 

Ah that's a good one,  I already understand what's going on there, but getting it to act the right way may take a little tinkering.  There's a whole balance between remembering hidden controls so they don't lose state, and accidentally writing them to the binds files.

9 hours ago, kenlon said:

And not actually a problem, but just weird: the default inspiration popper binds have almost all of them set to SHIFT+$KEY, but resist damage is S + SPACE. I could have sworn the old Citybinder bind was SHIFT+SPACE.

Oh this is a regression -- when the button labels get too long for the buttons, ie "SHIFT-PRINTSCREEN" or something, I have it change SHIFT to S, CTRL to C, and ALT to A, and use smaller text.  So where the display says "S+SPACE" it actually means "SHIFT+SPACE".  -EXCEPT- that it's supposed to store the actual state and write that to the bind files and to the Profile, and instead it's storing/writing the display string.  I will re-fix this.  I'll also maybe change it to be "Sh+SPACE" in the display so it's a little less confusing.

 

Thanks for testing.  Oh also:

9 hours ago, kenlon said:

You were correct about the Blast Off bind being my issue.

I'm going to keep looking at whether there's a way to make this work more smoothly because yeah that's a little irritating.

Link to comment
Share on other sites

22 hours ago, kenlon said:

For some reason, hitting enter no longer starts chat, even though it's set in the chat binds section.

What does it do instead?  Do you have the typing notifier or custom colors or both enabled?  Does it put anything at all in the chat window?  What does the bind in reset.txt say?

22 hours ago, kenlon said:

You can't actually bind the Enter key - if you try to bind it, hitting enter just closes the bind window, instead of setting the bind to enter.

22 hours ago, kenlon said:

Deselecting a power pool hides the associated powers, but does not change the binding settings.

22 hours ago, kenlon said:

the default inspiration popper binds have almost all of them set to SHIFT+$KEY, but resist damage is S + SPACE

These three are fixed in git and will be in the next release.  This also surfaced a bug where often it wasn't possible to do multiple mod keys in a bind, ie, "SHIFT+CTRL+S" or the like.  That also is fixed.  I'll roll up a new release in the next day or two.

Edited by emersonrp
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...