Doom Legacy - Doom Split-screen Source port
-
@quicksilver Glad to hear you got it working. As default in Doom Legacy when going to start a 2 player game it will always choose deathmatch type 3 with no monsters. If you want coop then you must change Deathmatch type to coop and change monsters to Yes
Monsters: Yes
Deathmatch Type: COOPOne more thing to be aware of, is that if you install other doom ports after installing Doom Legacy, it will override default emulator setting to be that specific doom port. ex Zdoom.
(Notice this will only happen if the other doom ports use the same Doom config folder as Doom Legacy).
-
@avensis Thank you for testing. Your feedback is appreciated. In that way i will know that it is also working for others as well :-)
Yes the test is running great. I stil think though that some fine tuning to the scriptmodule is required. I also have some ideas for creating a runcommand file to select and run mods (pwads) within Doom Legacy.
-
@tpo1990 thanks for the response. Unfortunately even with those settings it doesn't turn off the extra weapons. If doom legacy is still being developed, is there a place to report the issue to the developer?
-
@quicksilver I would think of that there might be some setting in the Doom Legacy options to turn off the extra weapons. Yes Doom Legacy is still active in development.
The version that i have made the scriptmodule for Retropie, is based on Doom Legacy 1.47.2. You could always try to contact or report bugs at the original developers website: http://doomlegacy.sourceforge.net/
-
@tpo1990 So I found this very old bug report: https://sourceforge.net/p/doomlegacy/bugs/372/
They noted that : "Possibly another bug; launching a similar Co-op game
using the external launcher uses the item placements
from Deathmatch, not Co-op."Ill comment on it and see if I get a response.
Thanks again for the help!
-
A big thanks @tpo1990 for the easy install steps, everything works great however I'm having a hard time configuring movements on my two controllers (Dualshock PS4 and Switch Gamepad).
For some reason it doesn't recognize D-Pad presses nor joystick movement (other buttons work fine) on both controllers, am I missing any configuration? -
@tiagop Happy to share my work. Doom Legacy does support joystick but not controller so it will only show as joy mappings when trying to configure your controller.
You need to use xboxdrv configuration for Doom Legacy. Thats the way i use it with my Zeroplus P4 controller (PS4 generic controller).
One thing to take note of is that i did get 2 controllers to work for both the players in split screen mode and noticed that all sound on my RetroPie system was gone and it appears to be caused by a bug when using Xboxdrv.
If you have never used xboxdrv or are interested i can share my xboxdrv configuration for Doom Legacy, but you will have to change the buttons and analog mappings to support your Dualshock PS4 controller. :-)
-
@quicksilver i downloaded the script module where do i place it?? I then go to retropie setup to install right?
-
@RetroFreak89 if you did the wget command as per the first post it's already in the right place. it will be in the 'experimental' section of retropie-setup package manager.
-
There's another way of configuring analog sticks in Doom Legacy (and maybe d-pad presses in the process). Take a look: Doom Legacy Player Controls
If you open the link above, and scroll down a bit, you'll find something similar as the table below:
command definition bindjoyaxis [<joynum> <axisnum> [<playernum> <control> <scale>]] Lists, releases or creates joystick axis bindings. A few years ago, I've done a few tests with this command, in order to see if it's possible to map the left analog stick to movement (forward / backward / strafe left / strafe right), and the right analog stick to mouselooking (even if it's only for left and right). The results weren't perfect, but they worked.
I don't remember exactly how to use that command, but maybe I still have something on my PC back home. I'll post it here if I find. But even without those files, you can find the values by tweaking its values in the console.
-
@Solid-One Good find. This can become useful. Maybe it could be inserted as part of a script to make it easier to configure.
I have used xboxdrv and it works great when it has been configured for specific keyboard buttons for my gamepad. I can only get it to work for 1 player and not the second player. I think the best solution is to create a libretro port of Doom Legacy, just like lr-prboom :-)
-
Yesterday I've done a few tests in Doom Legacy, in order to understand how the syntax of "bindjoyaxis" command works. The tests were done in the latest Doom Legacy version (1.47.2 rev1412), windows version, on my desktop (with Windows 7), and I've used a Xbox360 controller.
The first thing to mention is about the fourth parameter, <control>. Initially, I've thought that Doom Legacy would accept values such as:
forward, backward, strafe, straferight, strafeleft, speed, turnleft, turnright, fire, use, lookup, lookdown, centerview, mouseaiming, weapon1, weapon2, ..., weapon8, talkkey, scores, jump, console.
However, at least on that version of DL, none of the values above worked. Instead, I got it to work by using only numeric values from 0 to 3, where each number is associated to a specific control:
0 - Look up / down 1 - Move forward / backward 2 - Look left / right 3 - Strafe left / right
Any values other than the ones above won't work. Besides, this limit in the <control> parameter means that axis can be bound only to character movement. You won't be able to use Right Trigger to shoot, or D-Pad left / right to change weapons per example.
But at least it's better than nothing, so let's move on and make it work. Assuming you have two identical Xbox360 controllers such as mine, and want to play DL in split-screen, edit your "config.cfg" file, and include the following lines (ignore the comments in the process, they were included only for explanation purposes):
bindjoyaxis 0 0 0 3 0.001000 // 1st controller, Player 1, Strafe left / right, left analog stick bindjoyaxis 0 1 0 1 -0.001000 // 1st controller, Player 1, Forward / backward, left analog stick bindjoyaxis 0 4 0 2 -0.020000 // 1st controller, Player 1, Look left / right, right analog stick bindjoyaxis 0 3 0 0 -0.500000 // 1st controller, Player 1, Look up / down, right analog stick (optional) bindjoyaxis 1 0 1 3 0.001000 // 2nd controller, Player 2, Strafe left / right, left analog stick bindjoyaxis 1 1 1 1 -0.001000 // 2nd controller, Player 2, Forward / backward, left analog stick bindjoyaxis 1 4 1 2 -0.020000 // 2nd controller, Player 2, Look left / right, right analog stick bindjoyaxis 1 3 1 0 -0.500000 // 2nd controller, Player 2, Look up / down, right analog stick (optional)
A few notes:
- The bindings above will configure only doomguy movements for two controllers. You'll still have to configure the other buttons manually, such as shoot, open doors, change weapons / inventory, jump, etc;
- The axis movement bindings above won't be influenced by the "Run" command or the "Autorun" option. This will be automatically done according in the fifth parameter, <scale>, where according to the sensitivity, your doomguy may move normally or run;
- The second parameter, <axisnum>, may vary from controller to controller. You gotta adapt it, according to the controller you have. The axis 2 on my Xbox360 controller, per example, is associated to both LT and RT buttons;
- Although I've included it above, I don't recommend you to use the analog for looking up / down. I barely could use it to aim, since it's super sensitive and it keeps centering view automatically when you stop pressing the right analog stick up / down. I had more luck by deactivating that feature, and using the original "autoaim" feature present in the game;
- The fifth parameter, <scale>, refers to the analog sensibility. Negative values means inverted axis. And probably, the sensibility for each parameter may vary from controller to controller, so you gotta adapt it too, according to your controllers;
- You may find strange the low values in the <scale> parameter, but I noticed that values such as 1.0000 would result in super sensitive commands. The smallest movement in your analog sticks would result in your doomguy moving and spinning like crazy. And even on low values, I still got doomguy moving by itself even when the controller isn't being used.
-
@Solid-One This looks like a good workaround to get gamepad/controllers to work for split-screen in Doom Legacy. The DL version for RetroPie/Raspberry Pi is also the latest version like the one that you tested on Windows, so it should also work there.
Thank you for your tests and contribution. I will sure be testing this later to see how it works for my 2 PS4 Generic USB controllers.
I still think we should look into creating a libretro port of Doom Legacy but that will require som coding and work. :-) -
you can use it here.
it is already compiled for pi3
https://github.com/spartrekus/hexen-2-raspberry-multiplayer -
@spartrekus This post does not belong in this topic. Please create a new topic or use my topic for Hexen 2: Hammer of Thyrion
I have already created a working scriptmodule for RetroPie.
-
@Solid-One
Worked for me using the Wii U Pro controllers. I just had to play around with the values a bit. (I feel kinda dumb that I missed that in the documentation during my previous searches for a solution. http://doomlegacy.sourceforge.net/docs/console.html)Edit for clarity.... this is without needing to bother with xboxdrv
-
@jcook84 Glad to know it worked. But a few question: what about menu navigation? Could you navigate in the menus only with your controller, without bothering with xboxdrv? Or you had to attach a keyboard, just for that purpose?
@tpo1990 That would be awesome. I really like how Retroarch deals automatically with controllers in emulators and ports, and if DL becomes a libretro port with automatic analog controller mappings, that would be very handy to use for some Doom splitscreen fragfest. But indeed that would require a lot of coding and testing. However, if you wish to try that approach, I can test it for you in my free time.
BTW, yesterday I tested @tpo1990 's DL script module on my RPI2 and I confirm it worked. I used this PS2 USB adapter, with two PS2 controllers attached:
After adding the lines below in my "config.cfg" file, the analogs were configured just fine for my two controllers:
bindjoyaxis 0 0 0 3 0.001000 bindjoyaxis 0 1 0 1 -0.001000 bindjoyaxis 0 2 0 2 -0.020000 bindjoyaxis 1 0 1 3 0.001000 bindjoyaxis 1 1 1 1 -0.001000 bindjoyaxis 1 2 1 2 -0.020000
However, I couldn't navigate in the menus with my controllers. The only thing that worked is menu selection from one of the buttons of the first controller, but I couldn't navigate in the menus by pressing D-Pad or any of analog sticks. I've even tried turning on/off the analogs by pressing the button between Select and Start, but to no avail.
Although there's a way of mapping controller to keypresses by using xboxdrv, is there a way of allowing menu navigation from the controllers by default?
-
@Solid-One Good to know. Maybe i could find some useful information or look into another already built libretro source port, it could make it easier to implement a libretro port of Doom Legacy.
Im not sure if it is possible to configure the controller to be able to navigate the menu by it's native joystick support. It could very be, a limitation of Doom Legacy as a source port for Doom since all the avaliable Doom source ports out there can be different when it comes to how they work.
Right now at the moment our best option is to use Xboxdrv for mapping our controller.
-
These days I tried to tweak a bit with xboxdrv for Doom Legacy, in order to implement the following functionalities only through a joystick:
- Fully navigate the menu without the need of a keyboard or a mouse;
- Bind some commands that are unbindable by default (Ex: Show map by pressing TAB key);
- Add / remove bots inside a deathmatch game (without having to recur to console commands for that task).
I'm using two PS2 controllers connected through a USB adapter. And at the same time, I'm still using bindjoyaxis for analog sticks in both controllers, since it's the only way of having real movement sensitivity for two players (in other words, no mouse-to-controller mapping for looking / aiming).
Creating xboxdrv instances
Firstly, we're going to use xboxdrv in order to create two virtual joysticks with button mappings similar to a Xbox 360, except for some exceptions that will have to be mapped as keys. After following the instructions here, let's assume the event location by name of each controller is as shows:
- First controller:
/dev/input/by-id/usb-PS2Controller-p1-event
- Second controller:
/dev/input/by-id/usb-PS2Controller-p2-event
With the event locations in hands, let's start the first xboxdrv instance for player one's virtual joystick:
sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv --evdev /dev/input/by-id/usb-PS2Controller-p1-event \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Doom Legacy PS2 USB Mapper - P1" \ --trigger-as-button \ --axismap -Y1=Y1 \ --axismap -Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE=lb,BTN_BASE2=rb,BTN_TOP2=lt,BTN_PINKIE=rt,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE5=tl,BTN_BASE6=tr \ --ui-buttonmap du=KEY_UP,dd=KEY_DOWN,dl=KEY_LEFT,dr=KEY_RIGHT \ --ui-buttonmap rb=KEY_TAB,start=KEY_ESC,a=KEY_ENTER,b=KEY_BACKSPACE,y=KEY_Y,back+lb=KEY_B,back+rb=KEY_N &
Let me explain some parameters (ordered by relevance):
- --device-name: A friendly name of the virtual joystick. Will be useful for testing purposes;
- --evdev-absmap and --evdev-keymap: Needed for mapping axis and button names to a specific Xbox 360 button. More details here;
- --trigger-as-button: Convert Left / Right Trigger (LT and RT) to buttons. Needed for mapping buttons to L2 and R2 on my PS2 controller, since Doom Legacy treats LT and RT as axis, thus not allowing us to map them for actions such as shoot or open doors;
- --axismap: Needed if you get some inverted axes. On my controllers, both analog sticks were vertically inverted, so I had to include those two lines;
- --ui-buttonmap (first line): Map D-Pad to keyboard arrow keys. Needed for menu navigation and to allow binding actions to the D-pad (change weapons or inventory items per example), since there's no option to do that directly from the controller;
- --ui-buttonmap (second line): Map the following buttons to keyboard keys:
- Right Bumper (RB) to TAB key: To show automap from the controller's R1 button, since we can't change that binding from the menus;
- Start button to Escape key: To access main menu from the controller, since we can't do that without ESC key;
- A button to Enter key: To choose an option in the menus from the controller's Cross button;
- B button to Backspace key: To go back in the menus from the controller's Circle button;
- Y button to Y key: To choose Yes in menu confirmations from the controller's Triangle button. Without that, we won't be able to exit the game, per example;
- Back button + Left Bumper (LB) to B key: A button combination that calls the B key when you press Select + L1 from the controller. Used for adding bots in the game;
- Back button + Right Bumper (RB) to N key: A button combination that calls the N key when you press Select + L1 from the controller. Used for removing bots in the game;
Now let's start the second xboxdrv instance for player two's virtual joystick:
sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv --evdev /dev/input/by-id/usb-PS2Controller-p2-event \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Doom Legacy PS2 USB Mapper - P2" \ --trigger-as-button \ --axismap -Y1=Y1 \ --axismap -Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE=lb,BTN_BASE2=rb,BTN_TOP2=lt,BTN_PINKIE=rt,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE5=tl,BTN_BASE6=tr \ --ui-buttonmap du=KEY_I,dd=KEY_K,dl=KEY_J,dr=KEY_L \ --ui-buttonmap rb=KEY_TAB &
Most parameters are the same as the ones of the first xboxdrv instance, except for a few differences:
- --device-name: The virtual joystick name has its suffix changed from P1 to P2;
- --ui-buttonmap (first line): The D-Pad of the second controller isn't mapped to arrow keys, but to IJKL instead. This way, we'll be able to allow binding actions to the D-pad without conflicting with the ones from first xboxdrv instance. Besides, it'll allow menu navigation only to player one;
- --ui-buttonmap (second line): Instead of all the mappings above, we'll use only the one for showing automap. Player two won't be able to navigate through menus, neither allow adding / removing bots, so there's no need to map Enter / Escape / Backspace to player two, let alone the Back+LB/RB button combinations.
Including additional Doom Legacy bindings through autoexec.cfg
Now we're going to add axis and bots bindings. Just as I explained in previous posts, you have to use DL's "bindjoyaxis" command to allow character movement through analog sticks. So, I'm gonna assume you followed my bindjoyaxis instructions and have the commands at hand.
The first thing to mention is that we won't include the commands in the "config.cfg", but instead we'll create a "autoexec.cfg" file, put it in the same folder as the "doomlegacy" binary, and include our commands inside. The file "autoexec.cfg", as the name says, is a file containing commands that are automatically executed whenever Doom Legacy is opened. It's the preferred way of adding custom bindings.
The "config.cfg" file, on the other hand, won't work correctly: Whenever you open and close DL, the "config.cfg" file is automatically updated, and some custom binding commands can be deleted in the process. In my case, if I accidentally open DL without having the controllers plugged, DL fails to map the axis and delete the lines from the file. Besides, if I include in "config.cfg" the custom bindings for adding bots, they will work when you open DL, but will be deleted after DL is closed. Both issues were solved for me after I put those commands in "autoexec.cfg".
Anyway, here's the contents of "autoexec.cfg" (ignore the comments in the process):
// Player one's axis bindings bindjoyaxis 2 0 0 3 0.001000 bindjoyaxis 2 1 0 1 -0.001000 bindjoyaxis 2 4 0 2 -0.020000 // Player two's axis bindings bindjoyaxis 3 0 1 3 0.001000 bindjoyaxis 3 1 1 1 -0.001000 bindjoyaxis 3 4 1 2 -0.020000 // Custom bindings for managing bots bind b addbot bind n "kick Frag-God; kick Thresh; kick Reptile; kick Archer; kick Freak; kick TF-Master; kick Carmack; kick Quaker; kick FragMaster; kick Punisher; kick Romero; kick Xoleras; kick Hurdlerbot; kick Meisterbot; kick Borisbot; kick Tailsbot; kick crackbaby; kick 'yo momma'; kick crusher; kick aimbot; kick crash; kick akira; kick meiko; kick undead; kick death; kick TonyD-bot; kick unit; kick fodder; kick '2-vile'; kick nitemare; kick nos482; kick billy"
There's a few things to explain about the commands above.
Firstly, for the "bindjoyaxis" commands, you can see that the <joynum> parameter is 2 for player one, and 3 for player two, thus telling DL that the player one will use the third joystick and the player two will use the fourth joystick. But you don't have four controllers, but only two instead, so why?
That's needed due to how xboxdrv works: whenever you add a xboxdrv instance for a existing joystick, it basically creates a virtual joystick which tries to override the physical one. And since we've going to add two xboxdrv instances, it'll result in your SO having the following joystick recognizing structure:
- PS2Controller P1 (joynum 0, physical);
- PS2Controller P2 (joynum 1, physical);
- Doom Legacy PS2 USB Mapper - P1 (joynum 2, virtual);
- Doom Legacy PS2 USB Mapper - P2 (joynum 3, virtual).
As a result, Doom Legacy will recognize both physical and virtual joysticks, thus telling that you have four joysticks instead of two. That results in a problem: If you try accessing the axis for the physical joysticks, DL won't work, so you can't put <joynum> to 0 and 1. Instead, you have to access the axis for the virtual joysticks, thus putting <joynum> to 2 for player one, and to 3 for player two.
Secondly, about the custom bindings for managing bots, we'll bind "B" key to the command "addbot", so when a player press that key, a bot will be added in the game. The same applies for the "N" key, whose purpose is to kick all bots added in a game. The "kickings" routine works by running 32 kick commands by nickname, where the bot nicknames were obtained directly from DL's source code.
With the custom bindings added, now let's go back to the xboxdrv button combination for player one. Since Back button + Left Bumper (LB) will call the "B" key, then for adding a bot in a game, all I have to do is press Select + L1. And Since Back button + Right Bumper (RB) will call the "N" key", then you can remove all bots added in a match by pressing Select + R1.
Putting everything together
If you've done everything correctly so far, you'll have two things: the xboxdrv command parameters and the contents of "autoexec.cfg". Now let's put everything together and make it work.
Firstly, the xboxdrv parameters. Similarly as the instructions mentioned here, we'll create the
runcommand-onstart.sh
file in the/opt/retropie/configs/all/
folder (or edit if it doesn't already exist), in order to add a command section specific for "doomlegacy" port.#!/bin/sh if [ "$1" = "doomlegacy" ] then sudo killall >> /dev/shm/runcommand.log 2>&1 xboxdrv sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv --evdev /dev/input/by-id/usb-PS2Controller-p1-event \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Doom Legacy PS2 USB Mapper - P1" \ --trigger-as-button \ --axismap -Y1=Y1 \ --axismap -Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE=lb,BTN_BASE2=rb,BTN_TOP2=lt,BTN_PINKIE=rt,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE5=tl,BTN_BASE6=tr \ --ui-buttonmap du=KEY_UP,dd=KEY_DOWN,dl=KEY_LEFT,dr=KEY_RIGHT \ --ui-buttonmap rb=KEY_TAB,start=KEY_ESC,a=KEY_ENTER,b=KEY_BACKSPACE,y=KEY_Y,back+lb=KEY_B,back+rb=KEY_N & sudo /opt/retropie/supplementary/xboxdrv/bin/xboxdrv --evdev /dev/input/by-id/usb-PS2Controller-p2-event \ --silent \ --detach-kernel-driver \ --force-feedback \ --deadzone-trigger 15% \ --deadzone 4000 \ --device-name "Doom Legacy PS2 USB Mapper - P2" \ --trigger-as-button \ --axismap -Y1=Y1 \ --axismap -Y2=Y2 \ --evdev-absmap ABS_X=x1,ABS_Y=y1,ABS_RZ=x2,ABS_Z=y2,ABS_HAT0X=dpad_x,ABS_HAT0Y=dpad_y \ --evdev-keymap BTN_THUMB2=a,BTN_THUMB=b,BTN_TOP=x,BTN_TRIGGER=y,BTN_BASE=lb,BTN_BASE2=rb,BTN_TOP2=lt,BTN_PINKIE=rt,BTN_BASE3=back,BTN_BASE4=start,BTN_BASE5=tl,BTN_BASE6=tr \ --ui-buttonmap du=KEY_I,dd=KEY_K,dl=KEY_J,dr=KEY_L \ --ui-buttonmap rb=KEY_TAB & fi
If done right, the commands above will be executed whenever Doom Legacy is opened, thus automatically detecting your controllers and doing all needed button / axis mappings.
But it's not over yet: we still need to ensure that xboxdrv is torn down as DL is closed. That's done by creating the
runcommand-onend.sh
file in the/opt/retropie/configs/all/
folder, and putting the following commands inside:#!/bin/sh sudo killall >> /dev/shm/runcommand.log 2>&1 xboxdrv
Lastly, the autoexec.cfg. Go to the folder where resides the files "doomlegacy" and "legacy.wad" (probably in /opt/retropie/ports/doom/), create a file called "autoexec.cfg" and put the contents above in there. Then save and close the file. If done right, the binding commands should run automatically whenever DL is opened, thus binding the joystick axis and the commands for adding / removing bots.
If everything is done right, open Doom Legacy and try navigating in the menus through the joystick. Then go and configure your controllers for each player. Finally, start a two-player deathmatch game, and happy fragfesting!
Conclusion
Although those instructions can work at some extent, unfortunately it's kinda complicated for most users to implement IMO. And it's buggy as hell too. I decided to share those experiments of mine not only because it can work, but as a way of sharing knowledge as well. Maybe in the future it could be useful in order to make it easier to edit DL's source code to implement those missing features.
BTW, in parallel to those experiments, I'm studying DL's source code, trying to implement a way of allowing menu navigation, game exiting, and bot management in games, without having to recurr to xboxdrv to that task. If I succeed, I'll share my results here.
-
@Solid-One Thank you very much for your contribution. I still haven't figured out how to get the 2 player with both controllers working perfect with xboxdrv. Everytime i did do it, it resulted in breaking the sound for the Raspberry Pi.
Did you ever experience the error: alsa lib pcm.c:8306:(snd_pcm_recover) underrun occurred after running with both the xboxdrv controller configurations. I did everytime on my Raspberry Pi 3B. This is the error that broke the sound.
If your way does work without the sound error, then you have just saved me a bunch of time. :-)
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.