Jump to content

The Experimental Autoit RPGenerator (IRC MOPRG Project) Python - Autoit - mIRC


Recommended Posts

Posted (edited)

@Andreik I would also like to say thank you for being in so prompt in checking thru this code! Its great to have another Autoit coder's opinion and eyes on the subject, especially for finding issues!

I'm curious how there are so many errors on your end when mine seems to run okay... It has to be a version issue. You did mention that it screams a bunch of errors when running RPG-EXE, what other errors are being displayed? I think I'll be uninstalling Autoit 3.3.8.1 with Scite Lite and installing current version wtih full SciTE and just going through and fixing whatever pops up. (For a version 0.02)

I also think if I get on the same current version it may make things easier to understand and figure out! As I really have just been putting down code, and messing with it until it works. Now, I think updating my Autoit is the priority.

 

Edited by coderusa
Posted
2 minutes ago, Andreik said:

I'll try again tomorrow and post full console log.

Okay, in the mean time, I'll spend some time tonight updating Autoit and install the full SciTE4Autoit and start pecking away at stuff.

  • coderusa changed the title to The Experimental Autoit RPGenerator (FIRST DEMO AVAILABLE FOR TESTING)
Posted

UPDATE! 

IF YOU HAVE DOWNLOADED THIS PROJECT SOURCE OR THE EXECUTEABLE, I HAVE MADE SOME IMPORTANT CHANGES

(Thanks to @Andreik for helping me realize the issues!)

I have updated my Autoit and SciTE installs to the latest full versions. Before this, the program was running normally for me, but not for people using newer versions. After updating my Autoit and SciTE installs I then experienced a plethora of issues, as described by Andreik. I fixed some of the code organization, add all "undeclared" variables to RPG-VARS.au3, and put RPG-VARS.au3 as the first included file. Also found some code discrepancies that were not notice in older Autoit. I have decided not to up the version, and it will still be v0.01 (For now).

It now appears to be working normally with newest version of Autoit.

PLEASE DELETE ALL SOURCE/EXE FILES THAT YOU MAY HAVE DOWNLOADED FROM GITHUB BEFORE THE TIME OF THIS POSTING, AND DOWNLOAD THE REVISION TO GET THE PROPER VERSION. I HAVE UPDATED ALL FILES IN THE GITHUB DOWNLOAD AND RECOMPILED THE EXECUTEABLES. 

Source Package 0.01 - GitHub Download

Windows 32bit (x86) Compiled 0.01

GitHub Repository

Posted (edited)

It works. I mean it starts without errors but I cannot create a new character and there is nothing in the combo box to select. I suppose there should be a file game_settings somewhere, am I right?

Edited by Andreik
Posted (edited)
25 minutes ago, Andreik said:

It works. I mean it starts without errors but I cannot create a new character and there is nothing in the combo box to select.

I may have to make the ReadMe.txt in RPGenerator-Source-Package-0-01.zip more understandable...

User GUI character creator is not finished, you are supplied with TestDummy character. You need to install the core files:

1) Put RPGSOURCE folder in C:\  - ( it MUST be C:\RPGSOURCE\ )

2) Run Install.au3 (Running Install.exe should acheive the same result, will place the executable in C:\RPGenerator\ and shortcut on desktop, you may delete the executable and shortcut if you are only going to run off the scripts) All core files are placed in C:\Program Data\.RPG\ by the install script

3) Run RPG-EXE.au3

EDIT: If needed, you may also uninstall all files by running Uninstall.au3.

Edited by coderusa
Posted (edited)

Got it to work. Tell me about the battle system. Sometimes I'm walking around the map and out of nowhere I am in the middle of a fight. If the opponent kills me I respawn at a location and when I press UP I am again in the middle of a fight and my HP is not restored, it's still zero. I also have to figure out what counter attack I need for each of my opponent attack. Anyway, nice work.

Edited by Andreik
Posted (edited)
49 minutes ago, Andreik said:

Got it to work. Tell me about the battle system. Sometimes I'm walking around the map and out of nowhere I am in the middle of a fight. If the opponent kills me I respawn at a location and when I press UP I am again in the middle of a fight and my HP is not restored, it's still zero. I also have to figure out what counter attack I need for each of my opponent attack. Anyway, nice work.

Thank you! When in certain areas of the map (non village areas) you are randomly thrown into battle encounters. I haven't come up with a fancy way of transitioning. The end goal will be to transition to the battle in a similar fashion as Final Fantasy games. It is definitely a little shaky, I may need to adjust the sensitivity of this. This is handled in RPG-GFX-CORE at line 185 to 193, if you feel like playing around with it. It SHOULD save your current location to $mROM_BPOS, and when battle is over it should spawn you back at that location. If you win the battle, it will display a victory screen that shows experience earned and possible prizes, after going thru that it will do the same and respawn you at the coordinates stored in $mROM_BPOS. The data stored in the variable is a token string: "Blockname,X?Y"

If $mROM_BLOCKTYPE = "Wild" Then
         If Random(1,20,1) = 1 And $Game_Mode = "Free" Then
            Global $mROM_BPOS = $mROM_CURRENTBLOCK & Chr(44) & $nX & Chr(63) & $nY
            ;Cons("BPOS: " & $mROM_BPOS)
            Global $Game_Mode = "Battle"
            mROM_Load_("MROM-PACK-TEST", "BATTLE001")
            ;Cons("Battle!!")
         EndIf
      EndIf

 

Abilities, OUTSIDE OF BATTLE: If you click the Player Stats & Abilities button in the top tool bar, it will bring up a side menu that lists your abilities and stats. You can select an ability from the lists and click the info button below each list, and ability information will be displayed in the text display.

When in battle, on the left menu it will say Turn: Attack or Turn: Defense, then whichever turn you are on, the respective abilities are listed in the drop down, select an ability and click "GO".

Keep an eye on your HP meter, when your HP gets low, on Turn: Attack, click the Item button and use "TestPotion" to restore HP, but forfeit that attack turn and you will then cycle to Turn: Defense.

HP not being re-filled will need to be fixed. If you wish you fix that yourself it can be found in RPG-B-ARCADE in the EndBattle() function, defeat section is in the bottom ELSE bracket. In RPG-B-ARCADE, replace EndBattle() with this:

Func EndBattle()

   If $OPP1_KO = "True" Then
      Global $AB_Prizes = NPC_Data($OPP1_NAME, "drop")
      Global $AB_Gold = NPC_Data($OPP1_NAME, "DGP")
      Global $AB_EXP = NPC_Data($OPP1_NAME, "dexp")
      Global $PlayerHP = $P1_HP
      Global $PlayerMP = $P1_MP
      ;Release Battle Memory
      B_GFXSet("RollCall", "0")
      B_GFXSet("BattleVars", "0")
      B_GFXSet("StatVars", "0")
      B_GFXSet("BattleReset", "0")
      BattlePanel("off")
      _GDIPlus_GraphicsClear($hcanvas, _color("API"))
      _GDIPlus_ShutDown()
      AB_Vic("load")
      Return
   Else
      B_GFXSet("RollCall", "0")
      B_GFXSet("BattleVars", "0")
      B_GFXSet("StatVars", "0")
      B_GFXSet("BattleReset", "0")
      BattlePanel("off")
      Global $PlayerHP = $PlayerTHP
      $HPMeterValue = ($PlayerHP / $PlayerTHP) * 100
      GUICtrlSetData($HPMeter, $HPMeterValue)
      Global $Game_Mode = "Free"
      _mROM_LOAD("MROM-PACK-TEST", GetTok($mROM_BPOS, "1", "44"), GetTok($mROM_BPOS, "2", "44"))
   EndIf
EndFunc

This will give you full HP if you lose a battle (for now.)

I have updated the EndBattle() function in my script, and will update that in the GitHub downloads. 

EDIT: GitHub files have been updated for the EndBattle() function fix. This will be the last revision to v0.01, after this fixes will be discussed and assessed and manually fixed, unless fatal. All revisions and fixes from this point on will be placed manually, to fix your own copy, and fixed in my copy, but won't be automatically updated, and instead released in the next version (0.02 ?) 

Edited by coderusa
Posted (edited)
12 hours ago, TheDcoder said:

I am slightly curious, why did you start working on this with an older version of AutoIt? :)

Edit: I started with the newest version.

The IRC portion of the script wouldn't stay connected because something changed in TCP after 3.3.8.1 I havent fiddled with the IRC portion since I updated yesterday.

Other people have had this issue in versions newer than 3.3.8.1, described here: 

 

Seems the only solution is to roll back to 3.3.8.1 I'll have to play around with it to see what I can do, but eh...

Edited by coderusa
Posted (edited)
14 hours ago, TheDcoder said:

Oh, that's an interesting issue, never encountered it while I was working with IRC in AutoIt.

Its because of TCPRecv return value changed, to where it closes the connection when TCPRecv returns 0 and sets @error, if i remember correctly. Which is pivital to keeping an IRC connection open, in older versions if TCPRecv returned 0 it didnt set @error and did not automatically close the connection when returning 0, where before, if TCPRecv returned 0, you just ContinueLoop and it kept connection open.

 

I may fiddle around with IRC stuff later this evening. I think there may be a way around this by using AutoIt3Wrapper directive by assigning 3.3.8.1 for %AutoItVer%

#AutoIt3Wrapper_Res_Field=AutoIt Version|%AutoItVer%
Edited by coderusa
Posted (edited)

@TheDcoder I tried your bot script, my script, and TrayIRC and none of them work properly in the newest version. 

In your bot script it connects but then says AUTH failed and disconnects.

My script won't even connect, just returns error 10038. (socket operation on non-socket)

TrayIRC says "unable to connect to server"

EDIT: If i repeatedly run the script after it exits, sometimes TrayIRC will connect. (1 out of 10 tries)

Even with the wrapper directive, no difference.

Seems IRC is broken on newer versions. :(

*Switches to Python* 😈

Edited by coderusa
Posted (edited)

This seems to work for IRC. If I do not use any of the old UDFs or scripts, and just write one up from scratch, it works.

Global $server = "irc.esper.net"
Global $port = "6667"
Global $nick = "TestWookie"
Global $channel = "#TestWookie"

Opt("TCPTimeout", 1500)

TCPStartUp()
$sock = TCPConnect(TCPNameToIP($server), $port)
Sleep(100)
If $sock = -1 Then
    ConsoleWrite("No response from server." & @CRLF)
    Exit
EndIf

TCPSend($sock, "NICK " & $nick & @CRLF)
TCPSend($sock, "USER " & $nick & " 0 0 " & $nick & @CRLF)

While 1
   $recv = TCPRecv($sock, 9999)
   If @error = -1 Then
        ConsoleWrite("ERROR: " & @error & @CRLF)
        Exit
    Else
        ConsoleWrite($recv & @CRLF)
    EndIf

    If $recv Then
        $sData = StringSplit($recv, @CRLF)
        For $i = 1 To $sData[0] Step 1
            $sTemp = StringSplit($sData[$i], Chr(32))

            If $sTemp[1] = "" Then
                ContinueLoop
            EndIf

            If $sTemp[1] = "PING" Then
                TCPSend($sock, "PONG " & $sTemp[2] & @CRLF)
                ContinueLoop
            EndIf
            If $sTemp[0] >= 2 Then
                If $sTemp[2] = "376" Then
                    TCPSend($sock, "JOIN " & $channel & @CRLF)
                    ContinueLoop
                EndIf
            EndIf
        Next
    EndIf
WEnd

Exit

 

Edited by coderusa
Posted
13 hours ago, coderusa said:

In your bot script it connects but then says AUTH failed and disconnects.

What's the exact error message? I looked at the script and the error messages are very detailed so we can pin-point the error :)

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Posted (edited)
6 hours ago, TheDcoder said:

What's the exact error message? I looked at the script and the error messages are very detailed so we can pin-point the error :)

I think yours should also be an easy fix. Also there were some variable issues, but I fixed those already, I'll have to find the original copy to get the full list....

>"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "D:\IRC Script\Bot.au3" /UserParams    
+>13:51:28 Starting AutoIt3Wrapper (21.316.1639.1) from:SciTE.exe (4.4.6.0)  Keyboard:00000409  OS:WIN_10/2009  CPU:X64 OS:X64  Environment(Language:0409)  CodePage:0  utf8.auto.check:4
+>         SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE   UserDir => C:\Users\Admin\AppData\Local\AutoIt v3\SciTE\AutoIt3Wrapper   SCITE_USERHOME => C:\Users\Admin\AppData\Local\AutoIt v3\SciTE 
>Running AU3Check (3.3.16.1)  from:C:\Program Files (x86)\AutoIt3  input:D:\IRC Script\Bot.au3
+>13:51:29 AU3Check ended.rc:0
>Running:(3.3.16.1):C:\Program Files (x86)\AutoIt3\autoit3.exe "D:\IRC Script\Bot.au3"    
+>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
[13:51:29] >>> CAP REQ :multi-prefix sasl
[13:51:29] <<< :stormlight.esper.net NOTICE * :*** Looking up your hostname...
[13:51:29] <<< :stormlight.esper.net NOTICE * :*** Checking Ident
[13:51:31] <<< :stormlight.esper.net NOTICE * :*** Found your hostname
[13:51:34] <<< :stormlight.esper.net NOTICE * :*** No Ident response
[13:51:34] <<< :stormlight.esper.net CAP * ACK :multi-prefix sasl
[13:51:34] >>> AUTHENTICATE PLAIN
[13:51:35] <<< AUTHENTICATE +
[13:51:35] >>> AUTHENTICATE VGVzdFNjcmlwdABUZXN0U2NyaXB0AA==
[13:51:35] <<< :stormlight.esper.net 904 * :SASL authentication failed

That is the SciTE log. I think that in your script using the _IRC_AuthPlainSASL function is what is causing the issue here, or possibly sending the AUTH request on connection, is it really needed? The example I made doesn't have any issues connecting, even if the server asks for an AUTH. With IRC, if you do not send AUTH when asked, it will bypass the SASL and connect normally, but that is all I know on SASL. I don't use it myself. 

It appears that it's not an issue in autoit TCP/IP, I think its that all the documentation and UDFs are outdated😬

I started adding some of my own IRC functions to my Frankenstein UDF using the same code I used in the example, and they seem to work fine. May just need to update your UDF?

Here are the IRC functions I've got so far. (EDIT: I also added in my Cons function, since I used it in the functions.)

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Server_Connect
; Description.....: Connect to IRC Server
; Syntax..........: IRC_Server_Connect($server, $port, $user)
; Parameters......: $server - Plain text server name "irc.server.net"
;                   $port - Numeric server port "6667"
;                   $user - User name
; Return Values...: Returns main socket identifier
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Server_Connect($server, $port, $user)
    $socket = TCPConnect(TCPNameToIp($server), $port)
    Sleep(100)
    If $socket = -1 Then
        Cons("No response from server.")
        Exit
    EndIf
    TCPSend($socket, "NICK " & $user & @CRLF)
    TCPSend($socket, "USER " & $user & " 0 0 " & $user & @CRLF)
    Return $socket
EndFunc ;===> IRC_Server_Connect

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Server_Ping
; Description.....: Sends PONG reply to server for Ping? Pong!
; Syntax..........: IRC_Server_Ping($socket, $msg)
; Parameters......: $socket - main socket identifier
;                   $msg - Ping message
; Return Values...: Failure: -1
;                   Success: 1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Server_Ping($socket, $msg)
    TCPSend($socket, "PONG " & $msg & @CRLF)
    If @error Then
        Cons("Server has disconnected.")
        Return -1
    EndIf
    Return 1
EndFunc ;===> IRC_Server_Ping

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Join_Channel
; Description.....: Join to IRC Channel
; Syntax..........: IRC_Join_Channel($socket, $chan)
; Parameters......: $socket - main socket identifier
;                   $chan - Channel name
; Return Values...: Failure: -1
;                   Success: 1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Join_Channel($socket, $chan)
    TCPSend($socket, "JOIN " & $chan & @CRLF)
    If @error Then
        Cons("Server has disconnected.")
        Return -1
    EndIf
    Return 1
EndFunc ;===> IRC_Join_Channel

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Part_Channel
; Description.....: Leaave IRC Channel
; Syntax..........: IRC_Part_Channel($socket, $chan)
; Parameters......: $socket - main socket identifier
;                   $chan - Channel name
; Return Values...: Failure: -1
;                   Success: 1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Part_Channel($socket, $chan, $msg = "")
    TCPSend($socket, "PART " & $chan & " :" & $msg & @CRLF)
    If @error Then
        Cons("Server has disconnected.")
        Return -1
    EndIf
    Return 1
EndFunc ;===> IRC_Part_Channel

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Send_PrivMsg
; Description.....: Send PRIVMSG
; Syntax..........: IRC_Send_PrivMsg($socket, $target, $msg)
; Parameters......: $socket - main socket identifier
;                   $target - #Channel or Username
;                   $message - PRIVMSG text
; Return Values...: Failure: -1
;                   Success: 1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Send_PrivMsg($socket, $target, $msg)
    TCPSend($socket, "PRIVMSG " & $target & " :" & $msg & @CRLF)
    If @error Then
        Cons("Server has disconnected.")
        Return -1
    EndIf
    Return 1
EndFunc ;===> IRC_Send_PrivMsg

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Send_Action
; Description.....: Send ACTION message
; Syntax..........: IRC_Send_Action($socket, $msg, $target)
; Parameters......: $socket - main socket identifier
;                   $target - #Channel or Username
;                   $message - ACTION text
; Return Values...: Failure: -1
;                   Success: 1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Send_Action($socket, $msg, $target)
    TCPSend($socket, "PRIVMSG " & $target & " :�ACTION " & $msg & "�" & @CRLF)
    If @error Then
        Cons("Server has disconnected.")
        Return -1
    EndIf
    Return 1
EndFunc ;===> IRC_Send_Action

; #FUNCTION# ====================================================================================================================
; Name............: IRC_Server_Disconnect
; Description.....: QUIT from server
; Syntax..........: IRC_Server_Disconnect($socket, $msg)
; Parameters......: $socket - main socket identifier
;                   $msg - Quit message
; Return Values...: Failure: -1
;                   Success: 1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func IRC_Server_Disconnect($socket, $msg)
    TCPSend($socket, "QUIT :" & $msg & @CRLF)
    If @error Then
        Cons("Server has disconnected.")
        Return -1
    EndIf
    Return 1
EndFunc ;===> IRC_Server_Disconnect

; #FUNCTION# ====================================================================================================================
; Name............: Cons
; Description.....: ConsoleWrite that includes @CRLF and only works if script is not compiled, for SciTE debugging
; Syntax..........: Cons($data)
; Parameters......: $data - Info to be written to STDOUT stream
; Return Values...: Success (Not Compiled): 1
;                   Failure (Compiled): -1
; Author..........: Neo_ (aka coderusa)
; Modified........:
; =================================================================================================================================
Func Cons($data)
   If Not @Compiled Then
      ConsoleWrite($data & @CRLF)
      Return 1
   EndIf
   Return -1
EndFunc ;===> Cons

 

Edited by coderusa
Posted (edited)

UPDATE:

Still taking a break from this project, for a little while longer.

Sort of, I have been working on IRC stuff, focusing on why IRC stopped working after 3.3.8.1, and now have IRC working wonderfully with the newest version of Autoit, and used to expand Frankenstein UDF, which is now available in the Autoit Examples section. The game currently comes with version 1.0, and all further versions will come with the updated version 1.1+ of Frankenstein. 

When I really get back into it I am going to first focus on another battle mode, where it will not be turn based and will instead be a screen with enemies, and you are able to maneuver around the screen attacking/dodging enemies, a comparison to this would be like what you see in the old Zelda games. The turn based mode will stay too, of course. Will also expand on stuff that already exists.

I may attempt to try adding full screen, tho my previous attempts at this have me thinking that if I do a full screen option, it will be the only screen option. I've found it being very tricky to get dimensions and images sizes correct when switching between full screen and non-full screen. We'll see what I can come up with.

Will also be going thru and refining some of the existing code. 

List of things I want to add later down the road:

Swimming/water stuff

Character survival (Eating and status ailments)

More NPC interaction and locomotion

Background animations in Free-mode (currently if you minimize the game and bring it back up the graphics in free roam disappear, because it's not in a constant state of animation.)

Shops/Armory

Toying with the idea of, if you die in the game your character is sent to the after life which contains a feiry maze full of enemies, if you navigate and survive the maze to the end you are respawned in the overworld alive again, if you die in the maze you respawn at the start. I got this idea from an old Macintosh RPG called TaskMaker.

More to come...

Edited by coderusa
Posted
On 11/15/2023 at 2:29 AM, coderusa said:

That is the SciTE log. I think that in your script using the _IRC_AuthPlainSASL function is what is causing the issue here, or possibly sending the AUTH request on connection, is it really needed?

It's not needed if you don't wish to authenticate, and the server will definitely disconnect you if you provide invalid credentials like "TestScript" ;)

So definitely remove the function calls to Auth functions.

On 11/15/2023 at 2:29 AM, coderusa said:

I think its that all the documentation and UDFs are outdated😬

Not sure about other UDFs but the documentation on mine should be up to date according to the IRCv3.1 standard, which is fairly modern compared to the older RFCs. The IRC standards committee doesn't use version numbers anymore but everything should be backward compatible.

EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time)

DcodingTheWeb Forum - Follow for updates and Join for discussion

Posted
Just now, TheDcoder said:

Not sure about other UDFs but the documentation on mine should be up to date according to the IRCv3.1 standard, which is fairly modern compared to the older RFCs. The IRC standards committee doesn't use version numbers anymore but everything should be backward compatible.

I meant more on the Autoit TCP/IP stuff,  there is definitely something different in newer versions of Autoit, where the socket closes in certain instances where it should stay open, I found that if I set the TCPTimeout to 1500+ ms and add Sleep(100) afte connecting, it works around this issue. Could have just been the way I was writing/using scripts also, but either way I am glad that I got it working for me, as that would've been a major bummer for this project if IRC could not work anymore. 

  • 3 weeks later...
Posted (edited)

Still taking a break, but update:

I will be returning to this project, soonish. Probably by the start of the new year (hopefully). Sorry to keep those interested waiting so long for updates to this code. 

I've been requested by some staff and friends on a couple IRC networks to make an IRC bot in python. This is a dual project that I am writing in autoit and python (to appeal to two crowds). The autoit version is just for fun, the python version is going to be implemented thru egg drop on their IRC networks, and whoever else may be interested in using it.

What is it? Well it's a FOSS DuckHunt bot. Currently the only half-decent version of DuckHunt available for egg dropping is written in TCL (there is also a add-on for supy bot, but not that great and some other lesser known versions out there.) The original TCL version (based off the NES classic), written by Menz Agitat, (and modified versions) is quite fun, but lags profusely in larger chats when multiple users play. I am attempting to eliminate this issue by writing a new version of this in a more capable language (calling it Super DuckHunt, to follow a Nintendo-era feel). 

When I roll out these two scripts for beta testing, I will post information here on the forum for those interested in the autoit (or python) versions.

😎

Edited by coderusa

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
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...