 |
The Hardcore OxygeNation Every turn is sacred.
|
| View previous topic :: View next topic |
| Author |
Message |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Tue Oct 03, 2006 1:21 pm Post subject: bigfreak's Louvre It Script ver. 1.1.0 |
|
|
5-24-07: bigfreak has 'retired'.
c_wraith has an updated version:
http://www.jick-nerfed.us/c_wraith/louvre_it.user.js
-kevbob
bigfreak's Louvre It Script v1.1.0
http://www.rghware.com/gm.php/hcs/louvre_it.user.js
This script learns the Louvre It or Leave It maze and allows you to pick the reward you want.
A few things:
1.) You'll see some percentages next to each reward. This percent is the likely hood that the script can traverse all the untested choices in the maze and still bring home the correct reward. At first the odds are small, but they increase drastically as it learns the maze.
2.) You can still traverse the louvre manually, but when you do so the script will be recording the map data you uncover. This is handy if you have, for example, mapped the louvre by hand. You can use your map to train the script.
Also, several choices lead back to the center of the maze. If you know some of these choices, it would help the script if you traversed them manually. These are critical paths, which allow the script to recover from a bad situation.
3.) Finally, the end of this script causes a page load which _should_ show the reward. In the case where the script has to make an educated guess, there is a chance that the page load may result in a trip back to the center of the maze. If this happens, simply reclick the reward you want.
Version History
version 1.1.0
* fixed maximum depth error which didn't allow the script to explore deep enough
version 1.0.0
* ascension is now detected at the main map via charsheet request
* fixed bug which caused you to load the main map and possible insert 'undefined' into the map array
* added a routine to patch up any places 'undefined' may have worked its way into your map
* added the locations where each choice up/down/sideways may lead and the chances of that actually working.
* replaced the choice adventure numbers with their names
* added a delay so you can see what the script has done to get your reward
* Added manual map reset button.
* Added buttons to import & export learned map data
version 0.0.2
* fixed bug that caused the script to pick the wrong path
version 0.0.1
* fixed: percentages no longer plummet when you gain a level
* should you gain a reward unexpectedly, the script no longer kicks you back to the main map, but shows the mansion. It will also show you the reward for one full second.
version 0.0.0
First release. _________________ -bigfreak-
Last edited by bigfreak on Thu Oct 19, 2006 4:35 pm; edited 4 times in total |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Tue Oct 03, 2006 1:23 pm Post subject: |
|
|
From another thread:
| Residium wrote: |
i also lead it to the moxie bonus. the next 2x times it remembered how to get there (saying chance is 100%)
(i then did the leaflet quest and then) the next time i adventured there, it said 16% chance of finding it. didn't want to risk it, if it had actually forgoten the way, but thought i would mention it... |
| Code: |
me.ascended = level > me.gv( 'lvl', 0 );
|
Whoops!!
| Code: |
me.ascended = level < me.gv( 'lvl', 0 );
|
*corrected*
In all the testing my multi didn't gain any levels. (What are the odds?)
Just so everyone knows, when this happens, the learned map information is not lost. It will not reset the map to it's default state. Instead, it flags every choice as untested. This isn't great news because it may pick a path you didn't test previously and avoid one you did. To correct the problem, update to the latest version and re-introduce the script to your hand-made map.
EDIT: appologies for releasing this half-baked. I would have used / tested it more if my main and my HCT didn't ascend past the Louve rescently. _________________ -bigfreak- |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Tue Oct 03, 2006 1:55 pm Post subject: |
|
|
Does this version also fix the issue with not learning properly when you lead it to a result you already know?
Also, you mentioned something (when working on other scripts) about having a system in place that took your source .js and mapped it into something greasemonkey was happier with. As I rather like graph problems, I'd like to take a look at the code and see if I can contribute anything, but the greasemonkey-is-happy form is not really human-understandable. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
kevbob bobkev

Joined: 14 Dec 2005 Posts: 2770
|
Posted: Tue Oct 03, 2006 1:56 pm Post subject: |
|
|
dagnabit, i split the posts from the other thread and moved them to this forum before i realized you'd started a new thread!
ok, i'm re-merging. |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Tue Oct 03, 2006 2:59 pm Post subject: |
|
|
| c_wraith wrote: |
| Does this version also fix the issue with not learning properly when you lead it to a result you already know? |
I remember the bug report on the other thread. Did you happen to advance a level when this happened? If not, I need your map data to figure out why it's showing the wrong percentage. You can get this from about:config filter for 'rghware'. Look for the Louvre section.
| c_wraith wrote: |
I rather like graph problems, I'd like to take a look at the code and see if I can contribute anything, but the greasemonkey-is-happy form is not really human-understandable. |
http://www.rghware.com/gm.php/hcs/louvre_it.user.js
You take away '/gm.php' and '.user' you get:
http://www.rghware.com/hcs/louvre_it.js
In terms of logic, this is the guts of the operation:
| Code: |
louvreMapper.prototype.getRoute = function( here, dest, line )
{ var me = this;
if ( here == dest )
return { percent: 1, route: '' };
if ( line == null )
line = line || ( (here >= 92 && here <= 95) ? 3 : 4 );
if ( here < 91 || here > 104 || line == 0 || !me.map[here] )
return { percent: 0, route: '' };
var routes = [];
for ( i = 0; i < 3; ++i )
{
var route = me.getRoute( me.map[here][i], dest, line - 1 );
if ( route.percent > 0 )
routes[routes.length] = { 'percent': route.percent * me.lo.mask.getOdds( here, i ), 'route': i + ', ' + route.route };
}
if ( routes.length == 0 )
return { percent: 0, route: '' };
var bestChance = 0;
for ( var i = 0; i < routes.length; ++i )
if ( routes[i].percent > bestChance )
bestChance = routes[i].percent;
if ( bestChance == 0 )
return { percent: 0, route: '' };
var shortest = 0;
for ( var i = 0; i < routes.length; ++i )
if ( routes[i].route.split( ',' ).length < routes[shortest].route.split( ',' ).length )
if ( bestChance == routes[i].percent )
shortest = i;
return routes[shortest];
};
|
Everything up to the for-loop is just basically checking that we didn't a) hit a dead end or b) find the goal.
The for-loop calculates all successful routes from here.
Next we look at the the route that has the best chances of success. Of those routes, you may have multiple routes that have the same chances to the given goal. We want to take the shortest path. Taking the shortest path isn't for the server's benifit, but to prevent it from walking in circles.
The part that learns is here:
| Code: |
louvreMapper.prototype.processDatum = function( lastArea, lastChoice, newArea )
{ var me = this;
if ( !me.map[lastArea] )
return -1; // lastArea isn't in this map
var data = me.map[lastArea];
for ( var i = 0; i < data.length && newArea != data[i]; ++i );
if ( newArea != data[i] )
{
if ( newArea >= 92 && newArea <= 95 )
{
for ( var j = 0; j < data.length && !( data[j] >= 92 && data[j] <= 95 ); ++j );
if ( j >= data.length )
return -2;
data[j] = newArea;
me.lo.mask.validate( lastArea, lastChoice );
return me.processDatum( lastArea, lastChoice, newArea );
}
else
return -2; // You shouldn't be able to get to newArea from lastArea
}
me.lo.mask.validate( lastArea, lastChoice );
if ( data[lastChoice-1] == newArea )
{
me.save();
return 0; // no change
}
// learning new info
var tmp = data[lastChoice-1];
data[lastChoice-1] = newArea;
data[i] = tmp;
me.save();
return 1; //map updated
};
|
First we make sure we're not getting bogus info.
The for-loop checks to make sure that you can reach the new area from the last area. This is also checking for bogus data, but I found that the paths to middle (92 to 95) can change from map to map. So if one of these situations crops up, I just readjust the map and process it again.
Next, we check if the outcome of this choice was expected. If not, we swap the two parts of that map which didn't agree. We also mark the path from location a to location b as 'valid'. This is what ultimately increases the percentages.
I feel myself writing a book. lol Feel free to scan through it those two functions are the meat and taders.
P.S. not sure why I use 'we' in my code comments. Maybe there are two of me. <.<
| kevbob wrote: |
dagnabit, i split the posts from the other thread and moved them to this forum before i realized you'd started a new thread!
ok, i'm re-merging. |
I should have started a thread for this at the start. appologies. _________________ -bigfreak- |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Tue Oct 03, 2006 4:52 pm Post subject: |
|
|
| bigfreak wrote: |
| I remember the bug report on the other thread. Did you happen to advance a level when this happened? If not, I need your map data to figure out why it's showing the wrong percentage. You can get this from about:config filter for 'rghware'. Look for the Louvre section. |
I've ascended since, so I can't test properly on that character. Also, that character is in oxy, and won't hit the gallery again for a few days. Still, I can test on a multi.
This is actually a vague interesting problem from an algorithm perspective... I really want to attack it later, as I haven't done anything interesting in that way in some time. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
shadowhntr7 Hard as Pat Buchanan

Joined: 07 Jul 2006 Posts: 400 Location: Dancing with the Cocoabos
|
Posted: Tue Oct 03, 2006 9:32 pm Post subject: |
|
|
I downloaded this- it's awesomeness. First try I got a Manetwich instead of muscle, then I had muscle every time I tried. Thanks muchly for the great script. _________________
 |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Wed Oct 04, 2006 1:10 am Post subject: |
|
|
Do you mind general coding criticism? I mean, things that aren't related to the problem being solved, but are both significantly slower to execute and more confusing than they need to be? _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Wed Oct 04, 2006 9:36 am Post subject: |
|
|
| c_wraith wrote: |
| Do you mind general coding criticism? |
Feel free.  _________________ -bigfreak- |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Wed Oct 04, 2006 1:57 pm Post subject: |
|
|
Replace:
| Code: |
String.prototype.reverse = function()
{
var rev = '';
for ( var i = this.length-1; i >= 0; --i )
rev += this.substring( i, i + 1 );
return rev;
};
String.prototype.parseRev = function( strLeft, strRight )
{
var rev = this.reverse();
strLeft = strLeft.reverse();
strRight = strRight.reverse();
var ret = rev.parse( strRight, strLeft );
return ret.reverse();
}; |
with:
| Code: |
String.prototype.parseRev = function( strLeft, strRight )
var rightPos = this.lastIndexOf( strRight );
if ( rightPos == -1 )
return '';
var leftPos = this.lastIndexOf( strLeft, rightPos );
if ( leftPos == -1 )
leftPos = -strLeft.length;
return this.substring( leftPos + strLeft.length, rightPos );
}; |
First, it makes the difference between parse and parseRev much more obvious. I had to read through parseRev several times before I caught the two key differences.
Second, it has the potential to be a LOT faster. The reverse() function you added to String runs in O(n^2) time, and was only used in parseRev. Calling it many times with potentially large input is not good for worst-case behavior. This change makes the algorithm simpler and faster on large input.
Do note that I haven't tested it.. Because I couldn't find a good reference, I can't tell if I have an off-by-one error on the second lastIndexOf call. The second argument might need to be rightPos - 1.
Anyway, I didn't get into any of the real logic... I'll probably get to that tonight.
edit:
I've figured out what your general architecture is.. I'd do it differently. Too bad testing it is non-trivial.. (Mostly because I lack your gm.php transformation algorithm.)
I'd try to approach it as something resembling an online A* algorithm. That would remove the need for storing both a mask and a map, which would hopefully simplify matters. I'll see if I can both cobble something together and play my turns tonight. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Wed Oct 04, 2006 8:15 pm Post subject: |
|
|
Good call on parseRev. I didn't know lastIndexOf() even existed. Buff Me was my first real dive into Javascript, much less greasemonkey.
| Quote: |
Mostly because I lack your gm.php transformation algorithm.
|
I could paste it here, but it's ugly (I'll admit) and the code itself wouldn't do you any good without the library files it includes. I was thinking about making a form for gm.php where folks could paste their edited scripts and hit submit.
My time is limited but I'll try to get something up there.
Can you explain your idea? You said you wouldn't have to store the map and the mask? _________________ -bigfreak- |
|
| Back to top |
|
 |
Cristiona DIAMOND HARD

Joined: 22 Jan 2006 Posts: 1655 Location: Hallucinating through Goofball withdrawl.
|
Posted: Wed Oct 04, 2006 8:19 pm Post subject: |
|
|
Can I ask a really stupid question?
Does this require anything else to run? Do I need to have Mafia running, or can I just install it like a GM script (Install User Created Script, or however that works)?
I do so much of my playing on computers that aren't mine, I'm really behind on installing things to streamline KoL. |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Wed Oct 04, 2006 9:54 pm Post subject: |
|
|
| Cristiona wrote: |
Does this require anything else to run? Do I need to have Mafia running, or can I just install it like a GM script (Install User Created Script, or however that works)? |
Right click -> install user script.
It should run by itself. _________________ -bigfreak- |
|
| Back to top |
|
 |
plutopia Hard as a math test

Joined: 18 Jun 2006 Posts: 264 Location: Top of the Rockies!
|
Posted: Thu Oct 05, 2006 1:39 am Post subject: |
|
|
First off - this is a great tool! Thanks.
Mapping the louvre is fun the first ten times and then just becomes another chore. I'm going to love this!
Second, a (possibly) stupid question.
Does the script show the path it used to get to the reward? I didn't see it and I'd kind of like to know how to get there manuallly.
Also, if I upgrade to 0.0.1, will I lose the stored map info? I don't want to upgrade without knowing how to get around the map if I'm going to lose my way!
Thanks,
-plut _________________
 |
|
| Back to top |
|
 |
Slave_Merk Hard to the Core
Joined: 29 Aug 2006 Posts: 43
|
Posted: Thu Oct 05, 2006 2:10 am Post subject: |
|
|
first adventure at lourve, i go for the muscle adventure, and get it! with a chance of 3%
where is the newer update though? as it kicked me out to the main map
great script, lets hope it works like this for everything else  |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Thu Oct 05, 2006 1:51 pm Post subject: |
|
|
Hmm.. The software engineer in me is saying that if it works, I shouldn't screw with it too much. And I'm starting to listen to that voice a bit more.
But... I'm still tempted to try stuff. Oh, I think I wasn't very clear explaining the smaller state requirements of my approach. It'd still need to store the map, it just wouldn't also need the mask.
So, yeah. I still need to understand some of the details better before I make any solid decisions. I'll get to that, in time. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
Slave_Merk Hard to the Core
Joined: 29 Aug 2006 Posts: 43
|
Posted: Thu Oct 05, 2006 9:38 pm Post subject: |
|
|
wow ok, this has gone fantastic for me, every adventure is now around 88% or 100%, out of about 6 adventures there, two have gone wrong, but still given me good things (boost to level 9 )
i would reccomend it to everyone its pretty awesome |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Thu Oct 05, 2006 11:03 pm Post subject: |
|
|
| Slave_Merk wrote: |
| every adventure is now around 88% or 100%, out of about 6 adventures there, two have gone wrong |
You're picking different rewards, right? _________________ -bigfreak- |
|
| Back to top |
|
 |
fo shizz Hard Candy Shell
Joined: 13 Jul 2006 Posts: 27
|
Posted: Fri Oct 06, 2006 12:13 am Post subject: |
|
|
whenever i try to load this script it says: 'Document' is undefined.
could somebody please tell me what this means, and how i could get the script to work please? |
|
| Back to top |
|
 |
Slave_Merk Hard to the Core
Joined: 29 Aug 2006 Posts: 43
|
Posted: Fri Oct 06, 2006 4:03 am Post subject: |
|
|
| bigfreak wrote: |
| Slave_Merk wrote: |
| every adventure is now around 88% or 100%, out of about 6 adventures there, two have gone wrong |
You're picking different rewards, right? |
yes. i picked muscle, mysticality, moxie and manetwich
most of them went right
whats weird though, i go on today, and all the stats are back to 3%
but i still got the muscle first turn  |
|
| Back to top |
|
 |
Residium HCO

Joined: 10 Apr 2006 Posts: 779 Location: benztown
|
Posted: Fri Oct 06, 2006 10:12 am Post subject: |
|
|
hmm, that might be, that if you click on the adventure again link, that greasmonkey has problems loading the scripts...
it should load after the reload properly... _________________ I can resist everything - except temptation! |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Fri Oct 06, 2006 8:01 pm Post subject: |
|
|
| c_wraith wrote: |
| Does this version also fix the issue with not learning properly when you lead it to a result you already know? |
I just saw the bug. It's not a learning issue but an issue with calculating percentages. It got the moxie bonus for me before so it should have been 100%, instead it showed 33%, but the map lead me to the bonus none the less.
I'll dig into this once I get a chance (been away on business past three days). It bugs me to not see "100%". _________________ -bigfreak-
Last edited by bigfreak on Mon Oct 09, 2006 1:22 pm; edited 2 times in total |
|
| Back to top |
|
 |
kevbob bobkev

Joined: 14 Dec 2005 Posts: 2770
|
Posted: Fri Oct 06, 2006 8:05 pm Post subject: |
|
|
on a side note,
you kick ass. this script is hella amazing.
thank you bunches! |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Sun Oct 08, 2006 2:06 pm Post subject: |
|
|
I've got probability calculations and known-path finding worked out exactly. Well, ignoring unknown links back to the center of the map. Ignoring those is a good idea, as they are kind of... a pain.
I don't quite have the exploration part when no path to the destination is known pinned down exactly, but I've got a good idea how I'll do it, and it should be straight-forward.
As I don't really have a good way to test, I've been working in python, simulating the map. If you're familiar with python, that should be everything you need. If not, well, it's a fairly easy language to understand, especially when it's commented. I'll post my algorithm once I've got the second part worked out, and I have comments in place.
It turns out that I'm using a Floyd-Warshall algorithm with slightly interesting cost calculations. A couple simple heuristics should work for the search portion. Should be a couple more hours for everything. Will post again soon. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
IvanGS flufflycuddlehugglebunny!

Joined: 24 Nov 2005 Posts: 565
|
Posted: Sun Oct 08, 2006 2:18 pm Post subject: |
|
|
| c_wraith wrote: |
| It turns out that I'm using a Floyd-Warshall algorithm with slightly interesting cost calculations. A couple simple heuristics should work for the search portion. Should be a couple more hours for everything. Will post again soon. |
Just reverse the polarity on the tractor phazon beam, then cross the stream of quantom neutrino Al-gore-rhytms. It's elementery, my dear Wattson.
In summary: omg u r smart. <_<;;
(Seriously, wow, that sounds fancy =D) _________________
 |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Sun Oct 08, 2006 4:43 pm Post subject: |
|
|
Ok... What I have seems to work. Too bad it's not javascript. I tried to avoid using any hardcore pythonisms, though I did use a couple where it reduced the length of the code significantly.
I commented heavily, hopefully aiding understanding. Percentage calculation is still somewhat wrong (you have a better-than-3.7% chance of getting each reward with nothing mapped, obviously), but fixing that is non-trivial.. And it's also not all that useful.
Hopefully this is of some use to you.
Code at http://www.pwrsrc.net/~chowells/louvre.py. If you have any questions about what I'm doing or why, just ask.
Edit:
I thought more about the exact probability calculations while in the shower.. First, it's difficult to describe exactly what you're calculating the probability of. That's the first part of the problem.
Second, the full probability calculations would likely involve some sort of multiple-iteration fixed-point algorithm to get correct, with the fact that path lengths can get up to a fair length even in an optimized search that got unlucky.
Third, the inaccuracies (at least in my algorithm) don't matter that much. If there is a known path to a result, my algorithm will print 100% for that result. Conversely, if it prints 100%, there is a known path. All the other probabilites that can be shown will at least give the user an idea what's going on. It's not exact, but it is representative. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Mon Oct 09, 2006 1:22 pm Post subject: |
|
|
| bigfreak wrote: |
| It got the moxie bonus for me before so it should have been 100%, instead it showed 33%, but the map lead me to the bonus none the less. |
I found another huge bug. The script wasn't picking the path with the best chances of success. Ironically, the percentages were correct, but the paths taken weren't This has some crazy implications in the context of a recusive function so if the script was been working at all in these situations, it's been pure, dumb luck.
Anyway, the bug is fixed in 0.0.2 (bump, bump). Sorry for the delay. I've been away for some time. _________________ -bigfreak- |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Tue Oct 10, 2006 12:07 pm Post subject: |
|
|
The new version still has bugs. My first time at the louvre on a particular character, I told it to find a particular reward, and it didn't. (Not the bug. ) The next time I found the louvre, it was displaying a 50% chance of finding the reward that it *did* find previously. So I clicked on that reward, and it, in fact, did not find it.
Sorry I didn't think to grab state info when I saw this...
But the algorithm I suggest would *not* have this kind of bug. Have you even considered switching to it? _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
bigfreak Hard as a math test

Joined: 20 Jun 2006 Posts: 147 Location: earth
|
Posted: Tue Oct 10, 2006 2:47 pm Post subject: |
|
|
| c_wraith wrote: |
| The new version still has bugs. |
Yes, some still lurk it seems. I went back to the Louvre after the airship, castle, HitS and found all my percentages reduced back to 3% -- something needs attention. I haven't had any issues with the percentages though. Curiously, are you traversing the map manually? I've been clicking the attempt buttons to train mine.
To be honest with you, I don't have the desire to overhaul the script. It isn't 100% optimum and has some elusive quirks, but I'm determined to work it all out.
It's obviously that you're a talented and educated software engineer. Your code is a concise and elegant. If you wrote a GM script out of it, and it worked better than mine, I wouldn't be offended -- I'd use it. First and foremost, I play the game. I'm not overly concerned about the 'right way' or the 'better way'. I just want it to work. With the hard-to-test nature of the Louvre, it's going to take some time to work through the wrinkles. _________________ -bigfreak- |
|
| Back to top |
|
 |
c_wraith HCO
Joined: 04 Jun 2006 Posts: 173
|
Posted: Tue Oct 10, 2006 3:27 pm Post subject: |
|
|
| bigfreak wrote: |
| To be honest with you, I don't have the desire to overhaul the script. |
Then I guess I'll try it. It's always worth it to learn about a new programming language, after all... Even if it *is* javascript.
I'd love to use your script as a base. You've already done a great job on the UI portion, and I'd hate to try to redo that. Can you post the source for your gm.php script somewhere? I'll tweak it as necessary to work with my stuff. _________________ In-game: c_wraith (#120510) |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
smartBlue Style © 2002 Smartor
Powered by phpBB © 2001, 2002 phpBB Group
|