Help with Xboxdrv mapping dragonrise controller
-
I've had your post on my screen for a while, went off to eat and didn't notice your edit. Amiberry is tricky with this type of setup and I haven't fully explored all the options. However, with the unique identifiers you mention above, I have been able to get two virtual controllers to be recognized once selected from the Amiberry input settings.
Edit: Just make sure you aren't key-mapping for this particular use, as it will override the normal button functions of the virtual controllers.
-
You, Sir, are a hero. Thankyou for your super speedy reply and for your suggestions, that sounds like where I'm going wrong in terms of button maps... so you're saying it doesn't matter that the retroarch input setup screens only let me choose between the two dragonrise or no input at all? (...as there are no virtuals showing up here?)
When you talk about the the unique identifiers I mentioned above? Do you mean I should continue with the by-path method and it should work? Or should I try to use the --Device-Name option to rename each as a separate line in each controllers section config after calling the device?
Thanks mate. Without you currently I'd be a mess after the 60+ hours I must have spent on this system setup! I feel like this is almost my final hurdle to having my arcade properly built. Huge props to you, and the community here. Much appreciated. I will check out your helpful suggestions and update you on the sitch. :) -
...To follow up now I've had a crack (apologies for the double post)... unfortunately even though it makes total sense that your idea should work and I understand it - it seems I'm getting/understanding something wrong somewhere and still no dice. I must apologise for requiring so much hand holding. I hope that by having this conversation here it can help more than just me in the future. Thanks again for any help you could offer... Linux systems are a new beast and I've tried my best not to post on here and got pretty far myself on this project, (proud as punch) BUT but I really do appreciate your help on this... I'm getting to grips with the understanding and I've got the logging to work (after breaking the code once putting it in the wrong spot!) I've put that command now at the front of both controller's xboxdrv command lines
runcommand.log shows this:
xboxdrv 0.8.8 - http://pingus.seul.org/~grumbel/xboxdrv/ Copyright © 2008-2011 Ingo Ruhnke <grumbel@gmail.com> Licensed under GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions; see the file COPYING for details. xboxdrv 0.8.8 - http://pingus.seul.org/~grumbel/xboxdrv/ Copyright © 2008-2011 Ingo Ruhnke <grumbel@gmail.com> Licensed under GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions; see the file COPYING for details. Your Xbox/Xbox360 controller should now be available as: /dev/input/js2 /dev/input/event3 Press Ctrl-C to quit Your Xbox/Xbox360 controller should now be available as: /dev/input/js2 /dev/input/event3 Press Ctrl-C to quit
Now, I noticed a couple of things when I looked at the retroarch configs, firstly - when I went into retroarch GUI first time and setup the key maps for player 1, I noticed some (definitely not all - the ones like up,down,left,right,select,start were definitely there though already and probably should have already worked) but no avail. Nevertheless I went about changing each of the other keymaps using my actual keyboard to make sure they were all the same as the ones I mapped the arcade sticks and buttons to in xboxdrv. Weirdly - After saving autoconfig from the GUI frontend (and seeing confirmation of the autoconfig save dialogue in the bottom left corner) It hadn't seemed to do a thing... So I went into retroarch.cfg with text editor in the backend to double check it had changed... oddly not! It hadnt changed to my new config even though it told me the save had been successful? So this time I changed it by hand to match the desired key setup from my xboxdrv exactly as you showed (plus the other buttons). The contents of that retroarch.cfg is HERE: https://pastebin.com/ZixQdYDs
NOTE: I have not bothered changing player 2 controls here as i figure just get player one working firstDo you think I need to map the xboxdrv's second virtual controller to a different set of keys from the first xboxdrv virtual controller? (so not like z,x,c,v etc as the first one is) Would this be the answer to eventually splitting up the full functionality of two controllers rather than both pointing to the same set of keys?
Finally just incase it helps -
My output of cat /proc/bus/input/devices seems normal (from what I gather) for 2 xbox pads setup inplace of the 2 dragonrise and when setting up controllers for sticks both are still returning as KEYBOARD (i hope/assume this is correct!) :I: Bus=0003 Vendor=0079 Product=0006 Version=0110 N: Name="DragonRise Inc. Generic USB Joystick " P: Phys=usb-3f980000.usb-1.2/input0 S: Sysfs=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/0003:0079:0 006.0001/input/input0 U: Uniq= H: Handlers=js0 event0 B: PROP=0 B: EV=1b B: KEY=fff 0 0 0 0 0 0 0 0 0 B: ABS=3002f B: MSC=10 I: Bus=0003 Vendor=0079 Product=0006 Version=0110 N: Name="DragonRise Inc. Generic USB Joystick " P: Phys=usb-3f980000.usb-1.3/input0 S: Sysfs=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/0003:0079:0 006.0005/input/input1 U: Uniq= H: Handlers=js1 event1 B: PROP=0 B: EV=1b B: KEY=fff 0 0 0 0 0 0 0 0 0 B: ABS=3002f B: MSC=10 I: Bus=0003 Vendor=046d Product=404c Version=0111 N: Name="Logitech K830" P: Phys=usb-3f980000.usb-1.1.2:1 S: Sysfs=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.1/1-1.1.2/1-1.1.2:1.2/0 003:046D:C52B.0004/0003:046D:404C.0006/input/input2 U: Uniq=404c-1b-12-40-6e H: Handlers=sysrq kbd leds mouse0 event2 B: PROP=0 B: EV=12001f B: KEY=3007f 0 0 0 0 483ffff 17aff32d bf544446 0 0 ffff0001 130f93 8b17c007 ffff 7bfa d941dfff febeffdf ffefffff ffffffff fffffffe B: REL=1c3 B: ABS=1 0 B: MSC=10 B: LED=1f I: Bus=0003 Vendor=045e Product=028e Version=0110 N: Name="Microsoft X-Box 360 pad" P: Phys= S: Sysfs=/devices/virtual/input/input4 U: Uniq= H: Handlers=kbd js2 event3 B: PROP=0 B: EV=b B: KEY=70000000 0 0 0 0 0 1680 0 40f000 d0000000 B: ABS=3003c I: Bus=0003 Vendor=045e Product=028e Version=0110 N: Name="Microsoft X-Box 360 pad" P: Phys= S: Sysfs=/devices/virtual/input/input3 U: Uniq= H: Handlers=kbd js3 event4 B: PROP=0 B: EV=b B: KEY=70000000 0 0 0 0 0 1680 0 40f000 d0000000 B: ABS=3003c
Thanks again for your advice so far. Much appreciated!
-
@nighthurdles I haven't got access to my Pi at present, but can make the following comments:
You are not far away now from getting things 100% right.
I'm not sure if you've already done this, but you probably have:
Remember to change the 99-xboxdrv file in /etc/udev/rules.d/ to the following:
SUBSYSTEM=="input", ATTRS{name}=="Player_1", GROUP="users", MODE="0666", ENV{ID_INPUT_KEYBOARD}="1" SUBSYSTEM=="input", ATTRS{name}=="Player_2", GROUP="users", MODE="0666", ENV{ID_INPUT_KEYBOARD}="1"
(My reference to "Player_1" and "Player_2" corresponds to my naming convention I mention below.)
I've had a look at your
retroarch.cfg
and compared it with mine. It looks okay to me. You've changed the right inputs as far as I can see eginput_player1_select = "rshift" input_player1_select_btn = "nul" input_player1_select_axis = "nul"
That's good.
Also, when you are in the Retroarch GUI, you may find that you have to save the configuration in 2 different areas (within the joystick "area" and then in the "configuration" area on the initial menu). (Sorry - I'm doing this from memory). In any event, a lot of Retropie users prefer changing retroarch.cfg and other relevant files manually - the way you have ended up doing it. I use notepad++ via SMB/samba.
You are right - ultimately, the second controller will need to be mapped to different keys in Retroarch and
xboxdrv
, so they don't point to the same set of keys.It can be difficult to differentiate multiple controllers in Retroarch when using xboxdrv. The "virtual controllers" won't show up as separate controllers as such - they will still all be named "Dragonrise".
I've got 4 Dragonrise controllers so I wound up with a naming convention. I also use meleu's joystick configurator as well to "fix" the joysticks, but using the
by-path
method is the only way to properly differentiate multiple controllers of the same kind usingxboxdrv
.As a reminder, in my
runcommand-onstart.sh
, I have the following:### Note: Player 1 = Joystick 1 (left hand side) = User 1 (Retroarch) = JS3 = platform-3f980000.usb-usb-0:1.3.3:1.0-event-joystick ### Player 2 = Joystick 2 (right hand side) = User 2 (Retroarch) = JS1 = platform-3f980000.usb-usb-0:1.3.1:1.0-event-joystick ### Player 3 = Joystick 3 (cocktail left) = User 3 (Retroarch) = JS2 = platform-3f980000.usb-usb-0:1.3.2:1.0-event-joystick ### Player 4 = Joystick 4 (cocktail right) = User 4 (Retroarch) = JS4 = platform-3f980000.usb-usb-0:1.3.4:1.0-event-joystick
So each of my joysticks in
xboxdrv
configurations has a name eg joystick 1 has ---device-name "Player_1" \
and joystick 2 has--device-name "Player_2" \
etc. It was the only way I could keep track of things. You will see that some of the information is similar to the output you got fromcat /proc/bus/input/devices
but tailored to my system.A full example from my
runcommand-onstart.sh
of my lr-mame2003 configuration for all 4 Dragonrise joysticks is below:Player1_8Way_Mame2003="sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone=4000 \ --deadzone-trigger 15% \ --force-feedback \ --mimic-xpad \ --trigger-as-button \ --ui-buttonmap tl=void,tr=void,guide=void \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.3:1.0-event-joystick \ --device-name "Player_1" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --evdev-keymap BTN_THUMB2=a,BTN_PINKIE=b,BTN_TRIGGER=x,BTN_THUMB=y,BTN_TOP2=lb,BTN_TOP=rb,BTN_BASE3=back,BTN_BASE6=start,BTN_BASE2=lt,BTN_BASE5=rt \ --ui-axismap X1=KEY_LEFT:KEY_RIGHT,Y1=KEY_UP:KEY_DOWN \ --ui-buttonmap start+back=KEY_F2,back+start=KEY_F4 \ --ui-buttonmap a=KEY_LEFTCTRL,b=KEY_LEFTALT,x=KEY_SPACE,y=KEY_LEFTSHIFT,lb=KEY_UNKNOWN,rb=KEY_UNKNOWN,back=KEY_UNKNOWN,start=KEY_UNKNOWN,back+rt=KEY_SPACE+KEY_ESC,lt=KEY_5+KEY_1,rt=KEY_6+KEY_2 \ --ui-buttonmap lt+rt=exec:/opt/retropie/configs/all/SoundToggle.sh" Player2_8Way_Mame2003="sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone=4000 \ --deadzone-trigger 15% \ --force-feedback \ --mimic-xpad \ --trigger-as-button \ --ui-buttonmap lb=void,rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.1:1.0-event-joystick \ --device-name "Player_2" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --evdev-keymap BTN_THUMB=a,BTN_TOP=b,BTN_PINKIE=x,BTN_TRIGGER=y,BTN_THUMB2=back,BTN_TOP2=start \ --ui-axismap X1=KEY_D:KEY_G,Y1=KEY_R:KEY_F \ --ui-buttonmap a=KEY_A,b=KEY_S,x=KEY_Q,y=KEY_W,back=KEY_6+KEY_2,start=KEY_UNKNOWN,back+start=KEY_SPACE+KEY_ESC" Player3_8Way_Mame2003="sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone=4000 \ --deadzone-trigger 15% \ --force-feedback \ --mimic-xpad \ --trigger-as-button \ --ui-buttonmap lb=void,rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.2:1.0-event-joystick \ --device-name "Player_3" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --evdev-keymap BTN_THUMB=a,BTN_TOP=b,BTN_PINKIE=x,BTN_TRIGGER=y,BTN_THUMB2=back,BTN_TOP2=start \ --ui-axismap X1=KEY_DOWN:KEY_UP,Y1=KEY_RIGHT:KEY_LEFT \ --ui-buttonmap a=KEY_LEFTCTRL,b=KEY_LEFTALT,x=KEY_SPACE,y=KEY_LEFTSHIFT,back=KEY_5+KEY_1,start=KEY_6+KEY_2,back+start=KEY_SPACE+KEY_ESC" Player4_8Way_Mame2003="sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone=4000 \ --deadzone-trigger 15% \ --force-feedback \ --mimic-xpad \ --trigger-as-button \ --ui-buttonmap rb=void,tl=void,tr=void,guide=void,lt=void,rt=void \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3.4:1.0-event-joystick \ --device-name "Player_4" \ --evdev-absmap ABS_X=x1,ABS_Y=y1 \ --evdev-keymap BTN_THUMB=a,BTN_TOP=b,BTN_PINKIE=x,BTN_TRIGGER=y,BTN_BASE=lb,BTN_THUMB2=back,BTN_TOP2=start \ --ui-axismap X1=KEY_F:KEY_R,Y1=KEY_G:KEY_D \ --ui-buttonmap a=KEY_A,b=KEY_S,x=KEY_Q,y=KEY_W,back=KEY_6+KEY_2,lb=KEY_UNKNOWN,start=KEY_UNKNOWN,back+start=KEY_SPACE+KEY_ESC"
One last thing to remember with Mame is that you also need to map the keys you are using for Players 1 and 2 within Mame's own GUI. (Press TAB when in an arcade game and go to "general inputs" and map the keys accordingly).
-
Thanks for this bud, it looks like the missing steps as i haven't done any of this! I'll crack on with it and edit here when I know whats going on. If you saw myprevious message about 99-xboxdrv.rules not showing up - no matter - i had to make it i get it. My hat is off to you good sir!! :) I'll let you know how this all goes! Thanks again.
-
@nighthurdles said in Help with Xboxdrv mapping dragonrise controller:
Seems that you reckon I should I have another? 99-xboxdrv.rules? But it's not there :/
You'll have to create it yourself, I don't think it's created by default when installing the
xboxdrv
driver. -
@mitu Yep, I was just about to say that I couldn't recall whether it was already there or I had to create it. Thanks for answering that.
-
Between you guys, you've made my week! With some messing around I feel now I'm getting ever closer to a winning configuration, thankyou so very much. The joysticks are mapping now correctly in games 2player and in retropie backend and seem to select correctly in games now thanks to meleu joystick selection. Unfortunately I'm having a bit of a problem which is stopping me getting much further, it's to do with ownership of the runcommand.log.
I must apologise that the problem thats arisen from the xboxdrv setup deviates from the thread topic slightly, but I haven't been doing anything else but this joystick config with xboxdrv whenever I've been able to get some time in on the project since your advice, and now, although I have ideas, I'm not sure how this has popped up. For some reason since I've added the runcommand logging, runcommand.log is now giving me grief trying to run any games from any system and kicks me back to the retropie menu... I get errors:
runcommand.sh: line 982: /dev/shm/runcommand.log: permission denied
*rm: cannot remove '/dev/shm/runcommand.log':operation not permittedNow... it probably goes without saying that I'm a bit of an amateur here and I've been editing every text file I from command through 'sudo nano' unless it's a file which lets me update it normally through my filezilla client. some obviosuly don't like going back across through filezilla when overwriting or going into certain directories, and through my basic understanding, I figure this is because they are owned by root:root, and I also guess that's how its meant to be. (Please somebody do correct me if i'm being foolish!) Now... the real issue here is I'm seeing the runcommand.log file is owned by root:root and I figure this is actually giving me the problem of the errors above and kicking me back to menu on start of every game? permissions error... so after I googled the runcommand problem i found the command sudo chown -R which said it would revert back to user ownership...
I set about changing the following files:
pi@retropie:~ $ sudo chown -R pi:pi /dev/shm/ pi@retropie:~ $ sudo chown -R pi:pi /dev/shm/runcommand.log pi@retropie:~ $ sudo chown -R pi:pi /opt/retropie/supplementary/runcommand/runcommand.sh pi@retropie:~ $ sudo chown -R pi:pi /dev/shm/runcommand.info
After running these scripts, my games start loading again no probs and I could see that the xboxdrv config was working! Hooray! At this point, It all seem cool - and so I got on with the next task. All was fine until i reset. Now... problem is - when i reset the machine and loaded a game, I was kinda annoyed to see exactly the same errors coming back... looking at the files, some have set themselves back to root:root. (namely runcommand.log) Am I missing something?
IF anyone has any ideas as to what could have happened in my xboxdrv setup, they'd add to the list of golden joystick awards i need to send out! ;) The only thing I've been changing is the xboxdrv config in rc.local and also the runcommand-onend.sh (which is also switching back to root.)Now, I'm not sure what to show you other than the configuration files that I have been changing, the runcommand.log obviously doesnt write an error because permission denied.
My rc.local for xboxdrv config for 2 sanwa sticks (5 pin connector) through dragonrise generic usb joystick inputs (now almost working bar this (I believe to be sudo??) problem!)
#rc.local: sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv -i 0 >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone-trigger 15% \ --deadzone 4000 \ --mimic-xpad \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-joystick \ --device-name "Player_1" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --ui-axismap X1=KEY_LEFT:KEY_RIGHT,Y1=KEY_UP:KEY_DOWN \ --evdev-keymap BTN_TRIGGER=a,BTN_THUMB=b,BTN_THUMB2=x,BTN_TOP=y,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE4=back,BTN_BASE3=start \ --ui-buttonmap back+start=KEY_RIGHTSHIFT+KEY_ENTER,back+rb=KEY_RIGHTSHIFT+KEY_F4,back+lb=KEY_RIGHTSHIFT+KEY_F2 \ --ui-buttonmap a=KEY_Z,b=KEY_X,x=KEY_C,y=KEY_V,lb=KEY_A,rb=KEY_S,back=KEY_RIGHTSHIFT,start=KEY_ENTER \ & sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv -i 1 >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone-trigger 15% \ --deadzone 4000 \ --mimic-xpad \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3:1.0-event-joystick \ --device-name "Player_2" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --ui-axismap X1=KEY_J:KEY_L,Y1=KEY_I:KEY_K \ --evdev-keymap BTN_TRIGGER=a,BTN_THUMB=b,BTN_THUMB2=x,BTN_TOP=y,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE4=back,BTN_BASE3=start \ --ui-buttonmap a=KEY_B,b=KEY_N,x=KEY_M,y=KEY_O,lb=KEY_G,rb=KEY_H,back=KEY_LEFTSHIFT,start=KEY_LEFTCTRL \ & exit 0
My runcommand-onend.sh is exactly the same but has the killall xboxdrv command before reloading the virtual devices back again - (for if/when I need to change emulator controls individually across different cores - this file I gather will map the controls back.) Again please correct me if my understanding of this is flawed. Thank you.
#!/bin/sh sudo killall >> /dev/shm/runcommand.log xboxdrv sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv -i 0 >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone-trigger 15% \ --deadzone 4000 \ --mimic-xpad \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.2:1.0-event-joystick \ --device-name "Player_1" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --ui-axismap X1=KEY_LEFT:KEY_RIGHT,Y1=KEY_UP:KEY_DOWN \ --evdev-keymap BTN_TRIGGER=a,BTN_THUMB=b,BTN_THUMB2=x,BTN_TOP=y,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE4=back,BTN_BASE3=start \ --ui-buttonmap back+start=KEY_RIGHTSHIFT+KEY_ESC,back+rb=KEY_RIGHTSHIFT+KEY_F4,back+lb=KEY_RIGHTSHIFT+KEY_F2 \ --ui-buttonmap a=KEY_Z,b=KEY_X,x=KEY_C,y=KEY_V,lb=KEY_A,rb=KEY_S,back=KEY_RIGHTSHIFT,start=KEY_ENTER \ & sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv -i 1 >> /dev/shm/runcommand.log 2>&1 \ --silent \ --detach-kernel-driver \ --deadzone-trigger 15% \ --deadzone 4000 \ --mimic-xpad \ --evdev /dev/input/by-path/platform-3f980000.usb-usb-0:1.3:1.0-event-joystick \ --device-name "Player_2" \ --evdev-absmap ABS_X=y1,ABS_Y=x1 \ --ui-axismap X1=KEY_J:KEY_L,Y1=KEY_I:KEY_K \ --evdev-keymap BTN_TRIGGER=a,BTN_THUMB=b,BTN_THUMB2=x,BTN_TOP=y,BTN_TOP2=lb,BTN_PINKIE=rb,BTN_BASE4=back,BTN_BASE3=start \ --ui-buttonmap a=KEY_B,b=KEY_N,x=KEY_M,y=KEY_O,lb=KEY_G,rb=KEY_H,back=KEY_LEFTSHIFT,start=KEY_LEFTCTRL \ & exit 0
The only other thing left to show is my configs/all/retroarch.cfg which I've dropped to a pastebin here: https://pastebin.com/ZixQdYDs
Thankyou to anybody that may be able to help me figure this out. And to you guys who already helped, golden joysticks! x
-
Try removing
>> /dev/shm/runcommand.log 2>&1
from the xboxdrv launch command inrc.local
. What might be happening is that, sinceruncommand.log
doesn't exist at system launch, it's being created with root privileges by launching xboxdrv as root here. If removing that works, you could then try adding it back and puttingsudo --user=pi touch /dev/shm/runcommand.log
before the xboxdrv launch command. That would create theruncommand.log
file ahead of time with the proper privileges. Keep in mind, if this works, it would only need to be done in therc.local
. -
This absolutely worked no problems to fix the permissions errors as a permanent solution. Thanks very much! The dragonrise controllers work for me now including save/load and exit shortcuts! :) amazing advice thanks guys
Contributions to the project are always appreciated, so if you would like to support us with a donation you can do so here.
Hosting provided by Mythic-Beasts. See the Hosting Information page for more information.