View Full Version : General opinion on the public release of a new scripting engine?
Shaelun
08-10-2005, 12:54 PM
While I'm sure the feedback I get to this question will be somewhat biased (due to the topic, I suspect 'anti-scripters' avoid this folder), I'd like to get some general opinions/comments on how people would feel about a new scripting engine being made publically available.
So, if a scripting engine that was compatible with all front-ends on all platforms (Windows & Linux at least, and I *think* Macs, though it's completely untested and unresearched on Macs) that incorporated the full functionality of existing Interpreted languages such as Java, Python, Perl, and Ruby were to be made publically available -- would you object to such a powerful scripting engine being readily available, or what?
I ask because I've been writing precisely that, and while it's still restricted to bare-functionality and totally unsuited to general use (buggy -- runs and works, but it's touchy), I'm nearly finished with it. I've always heard a surprising amount of concern over people 'abusing' scripts, but in my opinion, the currently available scripting utilities are more than adequate to 'abuse' the Hell out of the game already.
Anyway... what's everybody's thoughts?
StrayRogue
08-10-2005, 12:57 PM
There's loads out there already: Jamus', Kranar's, in my eyes they have to be pretty user friendly and not buggy to really be welcomed and used by alot of people.
Shaelun
08-10-2005, 01:04 PM
I agree, but Jamus' - to my knowledge - still hasn't been made publically accessible; I've never checked out Kranar's, but what I'm asking is if people would object to a totally unrestricted interface to a real interpreted language (specifically, Ruby). I wrote it for fun, and while it would be gratifying if it were widely used, I'm just asking if there would be a great deal of objection to it being readily available.
StrayRogue
08-10-2005, 01:07 PM
I don't see why anyone would mind.
hectomaner
08-10-2005, 01:28 PM
JSE is available to the public. just ask someone who has it and you'll get it
Celephais
08-10-2005, 02:11 PM
JSE (Jamus Scripting Engine?) is available? Umm... anyone have it? I would like it. Heck I'd like it if it's not for Psi-Net too. Better than spending time finishing my own instead of grinding.
Edit: Ontopic - It's tough for me to say I object to a public engine after asking for one huh? Script abuse already runs rampant, and GMs usually only notice when people point fingers (Heh, I got an RP award for not being AFK when a GM tested me and I RP'ed to the test)
Fine line... tough choice... make it have a built in screensaver function that spams "Report F You Gaymasters".
[Edited on 8-10-2005 by Celephais]
Shaelun
08-10-2005, 03:02 PM
Opinions like the last one are the reason I asked (no criticism for your thoughts is intended by that statement).
I know you weren't serious, but such a function would be pretty useless all the same: it's not a compiled binary, it's actually a Ruby application itself -- this means it's a plain-text file, just like a regular old GS script, that can be opened and viewed in notepad.exe (and edited just as easily if you know how). That's how it manages to be cross-platform; if there's an executable Ruby interpreter available, it should be fully functional, and it operates like PsiNet (meaning it intercepts the connection to the game and sits in the middle, sending & receiving data - making it fully compatible with any client you want to use). It's not so much a matter of implementing a scripting engine itself, like JSE and presumably UltraTech, as it is a simple method of passing game data to independent Ruby programs -- meaning anything Ruby can do, it can do. And Ruby can do a lot.
If it wasn't quite clear before why I'd ask for general feelings about it, perhaps that helps indicate why I'm asking such a silly-sounding question.
Drinin
08-10-2005, 03:55 PM
Based on your response in my thread, I'd be very interested in using it.
Celephais
08-10-2005, 06:21 PM
Opinions like the last one are the reason I asked (no criticism for your thoughts is intended by that statement).
Not sure how this is insulting... the way I interpret it you're actually Complimenting me for relevance (Don't worry about treading lightly so not to offend here... Not many others do). Unless you mean you don't want a scripting engine in the hands of my kind...
Perceived usage is a very tough subject, IE, who is responsible, the person who is abusing and/or the one gave them the tools. This is the sort of thing file sharer/gun maker arguments are made out of (Don't let this topic spill over, I'm just citing the similarity). You're obviously worried about the backlash of someone else abusing your tool, but at the same time you're benevolent and want to share with everyone.
Anyway throw up a voting thread if you want answers, people like to vote:
1. Release it for everyone
2. Horde it for yourself/close friends.
Edit ... # ' // REM I've been commented!
[Edited on 8-10-2005 by Celephais]
TheRoseLady
08-10-2005, 06:26 PM
First, you wrote a script that I use so much that I could kiss your feet. It has made that job so much easier. Even better is that you added functionality to it at my request.
So, I would be very open to anything that you provided.
Currently I need a good lockpicking script. :lol:
ElanthianSiren
08-10-2005, 06:26 PM
I would love to play with it when you release it :)
-M
Bobmuhthol
08-10-2005, 06:36 PM
I can't run Jamus' engine on my machine for whatever stupid fucking reason. It doesn't load. I'll trade someone the current PsiNet version installer for public hosting of the engine.
Shaelun
08-10-2005, 07:03 PM
Well, firstly, I didn't mean "in the hands of your kind," at all, nor anything remotely similar; as you assumed, I was just trying to ensure that I didn't come off the wrong way. Guess too many nights on PsiNet and too many people assuming I act the way I look (... no comment) make me assume everything I say is going to be taken like an insult. Moving on...
Thus far, it appears I'll not be lynched should I tidy this thing up and post it for whomever may so desire it. Now all that remains... is to tidy it up... don't hold your breath, could easily be 2 weeks ;)
And you totally lost me Bob -- I'm banned, don't forget, and (for whatever reason) you posted a response to my question... so what are you talking about, you the new PsiNet hoster or something? From what little I see here & there, you have no problem running his scripting engine, so I don't know what you're referring to...
P.S. -
Your kind words are as appreciated as ever, RoseLady, and for someone as polite and appreciative as you, I'd happily write a lockpicking script... but unfortunately, it's been more than half a decade since I was a rogue (or picker of any kind)... uhh, how's a 24/7 all-profession, all-spell, any-name script to spell people up though, heh? Oh, doesn't work in SF though... well, I tried, heh...
[Edited on 8-10-2005 by Shaelun]
[Edited on 8-10-2005 by Shaelun]
Bobmuhthol
08-10-2005, 09:34 PM
<<And you totally lost me Bob -- I'm banned, don't forget, and (for whatever reason) you posted a response to my question... so what are you talking about, you the new PsiNet hoster or something? From what little I see here & there, you have no problem running his scripting engine, so I don't know what you're referring to...>>
WTF? I'm not talking to you at all. I need the current PsiNet installer, and if I get it I'll host Jamus' scripting engine for anyone to download.
Shaelun
08-10-2005, 09:54 PM
As usual, Bob, I'm overwhelmed with warm fuzziness at your endless love and compassion for your fellow man.
Open the .exe in a text editor that can manage 1.2mb files. Or a hex editor, if you happen to be the type to have such tools.
Change the old info to the new info.
Remember not to add or delete even a single byte, total (compiled binaries have very specific static links to where the data is going to be when loaded into RAM at run-time, but no doubt someone of your intellectual prowess is well aware of such trivialities).
Enjoy the satisfaction that comes from fixing your own problems.
How's my warmth, there, Bob -- ya feelin' that fuzziness, heh?
Fengus
08-10-2005, 11:20 PM
If it uses Ruby it will rule all, but I think its your own call.
Scripting is available to most everyone, none of the platforms are particularily solid or stable. Jamus always was an egotistical jerk so anything he wrote it bound to display those traits. Notably ego interferes with writing good interfaces. Therefore its not adaptable or friendly.
Bobmuhthol
08-10-2005, 11:23 PM
I still have no clue wtf you're talking about, Shaelun. I need the newest version of PsiNet and you're telling me to edit the PsiNet.exe file to update it, but first I would sort of need the new one.
Shaelun
08-11-2005, 04:48 AM
Was just giving you a hard time and suggesting with a good dose of sarcasm that you should manually change the IP address and/or version in whatever file you have. Since I can't think of any improved functionality in the release after the IP changed. It's simple, as it is for any program that incorporates static strings to display during execution: they're there unmodified somewhere in the machine code.
Burnt out Priestess
08-11-2005, 06:12 AM
I would use it Shaelun,specially if it made spelling people up easier and watched mana on that like Psinet did.
Shaelun
08-11-2005, 07:24 AM
Alright, I'm getting nowhere fast tracking down the cause of this main bug... specifically, any scripts you run have to be shut down manually - if Ruby hits the end of the document and quits the way it's supposed to (and should), my application stops paying any attention to the data you try to send to the game. Yeah, forget 3 lines to loop the script until you kill it from my application, and you have to restart all the programs... not acceptable, as issues go. I've had no luck finding the cause for this, and I'm getting fed up - I need someone to tell me if this method is 100% functional in Windows, because if it isn't, I'm going to abandon the way it works now and find a different way (only reason I did it this way was to make multiple scripts able to be run simultaneously, but that part doesn't work yet anyway, so...). I no longer have a bootable Windows installation, and I've been avoiding reinstalling it just for situations like this because only the system files are corrupt, I still have 6gb of miscellaneous data/files (I run Linux) that I access on that partition, so I need input: can someone who thinks they'd like to play around with Ruby d/l the Windows Ruby installer and tell me if this code snippet executes properly in Windows? If it doesn't, then I'm wasting my time tracking down this bug and would like to know before I waste another morning studying/debugging... just post if it ran or gave you an error somebody? Direct link is http://rubyforge.org/frs/download.php/4174/ruby182-15.exe, and just save the following as a text file and tell Ruby to run the file (all it does is test the 'socket' library functionality in Windows by listening for a connection on port 10110, and accepting [itself] when it tries to connect. Then it pauses for 5 seconds and exits since it's the end of the file. Socket is technically a Linux library, but I *think* Ruby uses Winsock2 to make it work in Windows...):
[*edit* uhh, yeah... that's not a smily at the end there... It's a " then a close parenthesis., ) ... eesh]
require 'socket'
Thread.new {
server_socket = TCPServer.new("localhost", 10110)
liftoff = server_socket.accept
}
sleep 2
link = TCPSocket.open("localhost", 10110)
sleep 5
puts("No errors!")
[Edited on 8-11-2005 by Shaelun]
Shaelun
08-11-2005, 08:59 AM
... Sometimes I wish I were the type of person that actually paid attention to the first 10 pages of a manual or tutorial... as opposed to skipping ahead to the fun stuff that makes my head spin. The bug is fixed, scripts exit cleanly with no errors.
Seems the majority of people would like to see if this thing is any good; that correct? Well, some words on the subject:
This is not a .exe program, this is not my own implementation of a programming language (in the manner that UltraTech and JSE -- as I hear, they do it quite well -- actually act as the interpreter themselves), this is a surprisingly simple interface to the Ruby interpreter itself.
This means Ruby is required. The base 'interfacing engine' is a Ruby program itself. This is just a pretty little text file without Ruby.
I've taken to calling it the Lich (Wizard, Warlock -- well, a Lich is an undead Wizard, right... alright, so I played D&D, so what, heh). It's working pretty well. Only runs one script at a time, and a number of the functions I intend to include (simple commands that my application will turn into Ruby commands so you don't need a 2-year degree to use this thing, etc.) are unimplemented, but now that it runs scripts cleanly... I guess people can test it for me, if they promise not to hate me for giving them still-buggy software. Again, I need feedback on whether it runs smoothly on Windows with the socket lib or if I need to alter that... if you'd like to see the kinds of things it can do, double-click the first program you see on your desktop. Well yeah, that's a joke... but Ruby is a professional object-oriented interpreted language (often referred to as a scripting language), and The Lich feeds game data directly to it for Ruby to parse, match, and send data back in response to, making it... well... if you took the time, a script using Ruby and this app I'm almost done with could conceivably carry on conversations with people -- that would take a lot of time, but my point is, Ruby can do more or less anything any programming language can (speed, however, does not appear to be it's forte).
So, you guys want me to polish it for general use, or shall I not bother and just make it functional instead of spending a day and a half writing documentation gibberish?
(FYI, you can d/l Ruby, or check out http://www.rubycentral.com/book/ to get an idea of just what this thing is -- again, it's just some extra commands and a data-feeder to the scripts you tell it to start, reading/sending to/from the game and the Ruby apps)
Shaelun
08-11-2005, 10:50 AM
This is becoming ridiculous; from now on I'm not even going to bother saying something unless it was given to me on a stone tablet by a guy with a very long beard...
Again I'm modifying my statement: in the process of fixing that nasty bug while running scripts, it appears as a side effect, I may be able to convert all the necessary files into an independent binary executable... don't know, have to test more, but even if it does work like a charm and turns everything into one file with no dependencies, I can't cross-compile: meaning, I have to be running Windows to make a Windows executable. Alright, I give in... I'll reinstall Windows at some point this evening: post and let me know if anyone tries Ruby and how it works all the same though.
Latrinsorm
08-11-2005, 12:35 PM
If I don't know what Ruby is and have never used it before, and am I going to be able to do anything with Lich yet?
Shaelun
08-12-2005, 06:04 AM
Okay... I mean no offense to anyone by this, but judging from some of the posts I've seen, most people don't seem to have any idea what's going on. That's all well and good - nobody (and I mean nobody, one life just isn't long enough) can know everything. Computers just happen to be my thing, so maybe this will help people:
"What is a scripting engine?"
For our purposes here, a scripting engine is defined, very simply, as this: a program that converts english commands into computer-executable 0s and 1s (it turns 'MATCH aLabel taps you lightly on the shoulder' into machine language code that your computer can run).
"Is StormFront a scripting engine?"
It *includes* a scripting engine. StormFront is a front-end (hence the name), and a front-end is a program that sits in front of the behind-the-scenes computer-talk gibberish, and it interacts with the user. In this case, StormFront and The Wizard both *include* scripting engines, but are more accurately defined as front-ends or 'clients' for the game 'host' (the GS4 server itself)
"Is PsiNet a scripting engine?"
No (and to be clear, it doesn't incorporate one either - has nothing to do with scripting). PsiNet is a wonderfully useful, much loved program that is of great use to people who play GS4. It is not a front-end. What it does is monitor everything that goes to the game and everything that comes back from the game, and some of this information it uses to keep track of stuff like its MAGIC list, triggers when your Gift of Lumnis resets, or when your sending a command to PsiNet (in which case it doesn't let that command get past it - it grabs the command lines and processes them, and if it doesn't recognize a command, it just sends it right on to Gemstone, in most cases). I use PsiNet (even though I'm banned and I get force-uninstalled if I'm not fast enough and it connects to the server, stuff like its MAGIC tracking is just too handy to give up). Unfortunately, Jamus doesn't seem to give a goddamn about PsiNet at all anymore... really a shame, too: all in all, it's great software, and stuff like Paladin spell tracking would be really cool.
"So, what is JSE (Jamus' Scripting Engine)?"
Purely that: a scripting engine. The reason you have to replace the Simutronics launcher with the JSE 'launcher.exe' program is so that when you're connecting to the game, JSE can hijack the normal log-in process (NOTE, hijack in terms of step-by-step procedure, NOT steal something - it's totally safe, to my knowledge, though I've never even run it), and then start up the Real Simutronics launcher so that to the user, it looks like nothing ever happened. The rest is an assumption, as I haven't really looked at it too much: then, just like PsiNet, it monitors all data to/from the game, picking and choosing between things it recognizes as commands meant solely for it, and just letting anything else go right on through as if it weren't being monitored. It sees a line that says 'start a script, JSE!', and it does what it does: opens the file, reads it, and executes the commands therein. It *is* a scripting engine (or, in terms of software development, it is an interpreter - it interprets text and executes commands based on that text).
"And Ruby, what is that?"
Ruby is a 'scripting engine', or more accurately, an interpreter. It has been in development for more than a decade, and as such, is *very* powerful. Much moreso than anything anyone would ever bother writing for GemStone alone. It can create graphical windows using 'extension libraries' (has no bearing on this discussion), includes versatile text string scanning & manipulation (everything is a text string in GemStone), and basically, do anything else a professional software development tool can.
"So what's this Lich thingie you keep mentioning?"
PsiNet manages to do what it does without getting in the user's way because it gets in the middle of your connection with the game. You talk to it by sending commands it recognizes to the game, which it stops before they reach the game. That's why it can work with both StormFront and The Wizard: it doesn't talk to those programs at all; for all PsiNet cares, you could be using any program at all to send info to Gemstone (to keep things simple, I'm totally excluding some details that make this statement only half-true, FYI). That's exactly what the program I'm writing does. It gets in the middle of the connection, except it does so in a different way than both PsiNet and JSE do it (I guess standard software methods in Windows have made Windows programmers forget there are other ways to do things). Since it uses a totally different method than PsiNet or JSE, you could actually use The Lich *with* PsiNet, JSE, and The Wizard all running at the same time. In Windows or Linux or whatever you like. *That* is what I mean by universal compatibility.
"Why didn't Jamus do this 'connection interception' your way?"
I have no idea why not, since it has to be undone if you want to play without PsiNet by uninstalling PsiNet instead of just deleting it, or else Gemstone will probably be broken until you reinstall the Gemstone software... But the way he did it is by no means questionable - it's pretty much the status quo for Windows. To keep things simple, I'm skipping a lot of details about both methods, but I wanted to be sure I didn't accidentally sound like I'm bashing Jamus' software (again, I use PsiNet myself).
"So wait, you mean, I can use scripts for your engine, scripts for The Wizard, and scripts for JSE, all at the same time?!"
Yes, and to squash one bug I had to take out multiple simultaneously-running scripts for the moment, but you could conceivably run a Wizard script, a JSE script, and 5 Lich scripts all at the same time, BUT: *only once I am done*. And this isn't my job or anything (I'm not even a software engineer for a living, it's a *total* hobby for me, but I'm getting pretty good at it...), so it may be 1-4 weeks. There's a long tradition of Windows software being nicely packaged and all neat & user-friendly, but in the free, open source software world (read: Linux), we're used to quirky programs, because the people who wrote them did so for their own pleasure, and made it available for anyone else who wants to use it. Not so they can buy a new car. As such, it's suited to their needs, not user-friendliness. That's what my program is like. I can use it to run scripts just fine, but that's because I know every intimate detail of how it works. It's going to take time to polish it up all nice and neat and user friendly, and even then, now that JSE is publically available, I really doubt too many people will have any use for it. Why? Because as I've said, The Lich is not a scripting engine: it's a method of sending lines from the game to a Ruby application on-demand (so that you can start/stop scripts while playing), and because all it does is feed Ruby data and get data from Ruby back, all it understands are Ruby commands. And... well, again, Ruby is on par with Perl, Python, Java, and every other big name interpreter (yeah, those are all scripting engines, just professional ones) you've ever heard. So until I get *everything* else working just the way I want it to work, I'm not going to be including easy or simplified commands, but it is part of my plan (the last part), so eventually the idea is to be able to use Lich scripts to do things like play a sound if something happens, or pop open a window (know how maps.cmd works, gotta type-in your choice? Well since Ruby's so cool, maps.cmd in The Lich could open a window with a list of destinations like any other program, and go to the one you clicked on).
I'm having a blast writing this thing, but I'm not writing it for anyone but me, so I can't promise it'll ever be of any use to anyone. I'm not even writing it to use for scripting. I'm writing it because I love doing this nerdy programming stuff, and a year or two ago I did it with Wizard scripts. Well, now I know more, and I'm doing it with Ruby. The Linux world truly is a totally different world than the Windows one, and I've tried to illustrate what can be reasonably expected of The Lich once it's done -- I hope I've done so accurately.
"Well then what use is your stupid program!?"
... to someone who'd ask that question, absolutely none (and if you ever ask me that question, I will find you, show up on your doorstep and smack you). At least not unless something like qrs.cmd or maps.cmd or en.cmd got written for The Lich. To the general user, The Lich will probably always be of only one use: to use cool Ruby programs somebody else wrote, and that's very likely to never, ever happen.
Fine, I'll answer the stupid question... ;)
My maps.cmd example. Run the script, get a window with a list, click "take me there!" when you've highlighted the one you want, and off you go.
I'm going to write an auto-redux calc script (for my own use, actually) once I'm done with The Lich itself. This is a real, professional programming language: Wizard scripts can't do math. Well... to make a real-world comparison, Ruby's got a Master's degree in it.
To be clear: I am not associated with Ruby development *at all*. I am not trying to sound like I'm saying, "dude, I wrote a program that KICKS ASS! You've gotta see what my baby can do!" No, that is totally wrong. I'm writing a program that will feed your Gemstone IV data to a totally *different* program. But yeah, the program getting the data (that I only *wish* I wrote) totally kicks ass ;)
TheRoseLady
08-12-2005, 08:23 AM
I just care about who's going to write scripts to work with this stuff. I know I can't do it.
Shaelun
08-12-2005, 08:55 AM
Well, like I said, for my own use I want an auto-redux calculator, and I'll whip one up after I'm done with the core of this Lich thing. And I don't mean one that you feed the numbers into, I'm talking about a script you start that spits out your redux after it sees you take a hit.
... since Ruby is still the smallfry in the Western hemisphere (started in Japan, and who knows for sure, but they say it's bigger than Python and the like over there), um, I guess; me? Heh, and anyone who learns how to write programs in Ruby. I mean, who the Hell wrote QRS anyway? And Maps? Ever taken a look at how damn *long* these scripts are -- I'm not the only one nutty enough to play with this stuff until dawn, apparently, so I should hope if a reliable means is available, someone'll make use of it.
Bobmuhthol
08-12-2005, 09:52 AM
<<Well, like I said, for my own use I want an auto-redux calculator, and I'll whip one up after I'm done with the core of this Lich thing. And I don't mean one that you feed the numbers into, I'm talking about a script you start that spits out your redux after it sees you take a hit.>>
Good luck, man. It takes human judgement more times than not, so I'll be impressed when I see it done.
<<I mean, who the Hell wrote QRS anyway?>>
Scriptwise, QRS is a joke. It just has a lot of information that's been added over years.
Bobmuhthol
08-12-2005, 09:54 AM
Another scripting engine would be way sweet, if I haven't said that yet.
Shaelun
08-12-2005, 11:14 AM
I see what you mean by "QRS is a joke," but I was just talking about how many hours of work must've gone into that thing. Maps too. These are seriously involved projects that didn't make any money and were never supposed to make any money.
I've gotta disagree with you about Human judgement. Gemstone calculates your redux with pure mathematics. Nothing but computer-perfect number crunching.
So, computer-perfect number crunching will give you a precise range. Tell ya what, just to be snotty, when I write it, I'll make sure it gives you a range within .001 accuracy, heh...
Somehow ever since I fixed that one major bug, everything is just falling into place. I'm starting to become genuinely pleased with just how well something that *I* wrote is working. This is too cool :)
Now, what I'm trying to avoid is what happened with JSE. I'm not bashing Jamus, I mean he wrote it and never released it, therefore whether it's usable by anyone but him is immaterial. I've heard him publically comment that he would've released it but he didn't want to bother documenting it. Perfectly valid reason, and it's just kinda floated around ever since. Perfectly valid: trust me, it's a lot more work than one might think to properly document a program and make it usable for someone who didn't write it...
Anyway, that's what's taking so long. And then I have to whip up some sort of installation thingie... and I hate GUI's, but I understand that it's just how most people do things, so I'll probably write a really, really ugly but still point-and-click setup program for this thing... and that's why I say 1-4 weeks, and don't hold your breath. Because making sure it's intuitive is turning into twice the work writing the thing in the first place was, heh...
BTW, cool of you to host JSE, Bob.
Bobmuhthol
08-12-2005, 11:18 AM
<<Gemstone calculates your redux with pure mathematics. Nothing but computer-perfect number crunching.>>
GemStone knows things. Someone reading text has to figure out what something is quite often when calculating redux.
<<So, computer-perfect number crunching will give you a precise range.>>
The only way to get a real redux reading is to use the actual redux formula that nobody knows. Calculating redux on a hit in a non-controlled environment is just stupid.
<<BTW, cool of you to host JSE, Bob.>>
:)
Shaelun
08-12-2005, 11:45 AM
Well, Bob, here's the thing: whether it's stupid or not doesn't matter, because it's the most accurate method available (without, as you said, the actual formula).
BTW, I'm adding a post of JSE-recognized commands in your "it's hosted" thread (see said post for details)
Celephais
08-12-2005, 01:11 PM
As for calculating it perfectly... Gemstone might use computer perfect mathmatics, but it's a losey formula, it rounds. So you can't be accurate using a stateless script (Instant slope on a stairway). Now if it stores results and averages, that's fine but it's still not perfect, you've got the RNG to compete with and situations like the one I ran into in another thread where two crits have the same message but different crit damage.
Not saying you can't be accurate, but yeah... wait till it's working before you make claims about what it can do. Not trying to be a jerk, but claiming absolutes really draws fire. (It's unhackable!)
Tell ya what, just to be snotty, when I write it, I'll make sure it gives you a range within .001 accuracy
This is becoming ridiculous; from now on I'm not even going to bother saying something unless it was given to me on a stone tablet by a guy with a very long beard...
Bobmuhthol
08-12-2005, 01:12 PM
<<Well, Bob, here's the thing: whether it's stupid or not doesn't matter, because it's the most accurate method available (without, as you said, the actual formula).>>
Calculating redux on a hit in a non-controlled environment is just stupid.
StrayRogue
08-12-2005, 01:15 PM
I wasn't aware that the DFs of EVERY weapon type were known. They certainly aren't on Xygon's (for stuff like bite, charge and all the variant critter attacks). Effectively you won't be able to calculate redux without these numbers.
Shaelun
08-12-2005, 01:32 PM
There are two crits with the same crit message, but different damage adders? Hmmm, news to me... which one is it?
Now this is an assumption, since only GM's have access to the source code for Gemstone: the formula doesn't round, and the formula is not random. The result is either rounded or truncated, I never can remember which, and the crit from a melee hit is randomized as well, yeah; but the crit isn't even part of the redux formula to begin with. The redux formula is applied, *then* the crit is determined *based* on the outcome.
So, I'm assuming what you meant is the portion we can see doesn't allow for the calculation of a precise amount...? If so, yes, I agree - that's fact.
Calculate your redux by hand. Determine the maximum amount of redux you can possibly have, given the amount of damage you took. Now determine the minimum amount of redux you can possibly have, again, given the amount of damage you took. Make these calculations accurate to within .001.
... and, you get a range within .001 accuracy, from a single hit. Like I said.
Continually repeat this procedure for as long as you care to bother, and you will eventually know your redux to within ~.001 accuracy. I don't really understand why you would expect this to pose problems...?
Shaelun
08-12-2005, 01:39 PM
... I'm missing the problem here -- is this about whether or not *I* can write such a utility, or whether or not it's possible?
Because the former issue I'm unable to comment on without sounding like a pompous schmuck - that just can't be avoided without some sort of evidence.
If it's the latter, um... see my prior post. If a Human can do it, and it doesn't involve high-level judgement calls, a program can do it. Probably faster and better.
Bobmuhthol
08-12-2005, 01:51 PM
<<I wasn't aware that the DFs of EVERY weapon type were known. They certainly aren't on Xygon's (for stuff like bite, charge and all the variant critter attacks). Effectively you won't be able to calculate redux without these numbers.>>
They are known.
<<There are two crits with the same crit message, but different damage adders?>>
Yes, I think it's on chest crush or something.
<<Continually repeat this procedure for as long as you care to bother, and you will eventually know your redux to within ~.001 accuracy. I don't really understand why you would expect this to pose problems...?>>
Because anyone not wearing full plate being with a high DF weapon for a high endroll is going to have redux readings that vary upwards of 20%.
Bobmuhthol
08-12-2005, 01:51 PM
<<... I'm missing the problem here -- is this about whether or not *I* can write such a utility, or whether or not it's possible?>>
It's not possible for what you'd like it to do.
<<If it's the latter, um... see my prior post. If a Human can do it, and it doesn't involve high-level judgement calls, a program can do it. Probably faster and better.>>
Not really, no.
Bobmuhthol
08-12-2005, 01:57 PM
Refer to this thread on why you're not going to get the calculator to work (well).
http://forum.gsplayers.com/viewthread.php?tid=14781
These two quotes sum it up effectively:
Originally posted by Kranar
Calculates redux based on a single hit?
That can be done pretty easily.
Originally posted by Bobmuhthol
Hahahahahahahahahahaha.
So do it.
Celephais
08-12-2005, 02:34 PM
I have no idea what kind of development skills you possess or your program is capable of, so no, this isn't about a personal attack.
Losey formulas are ones that the result does not allow you to predict the variables. So if the formula is Trunc(x/2) and your result is 5, you don't know if x was 10 or 11 or 11.9.
I admit I missed you saying precise range, (10>=x<12) which is why I was saying it's impossible. What you said came off as being able to tell us redux to 0.001 precision with a single attack (IE Stateless).
I'm talking about a script you start that spits out your redux after it sees you take a hit.
Not trying to discourage you.
The thread I was talking about was this one: http://forum.gsplayers.com/viewthread.php?tid=16065
but that's an acid bolt, I'm positive there are more on the melee damage tables though.
AnticorRifling
08-12-2005, 02:39 PM
This is why it's good to not get hit.
Shaelun
08-12-2005, 02:49 PM
Yeah, without having known I meant the range, my statement would have been a big claim, indeed.
This is not the finished product. This does incorporate a simple aggregation of every value it's ever calculated, so that over time, it'll be more and more accurate. This won't run as-is, but I'm spread kinda thin writing the scripts *and* making the engine usable by someone other than me, so I'll come back to it later and fill in what's missing. Yes, this is Ruby code and will work with the Lich. If the post doesn't stay true to the tabs, this will be tough to follow, but unless you think you can code well enough to suggest an error I've made, just take my word for it being valid:
#!/usr/bin/env ruby
$game = TCPSocket.open("localhost", 10153)
weapon_stack = Array.new
redux_values = File.open("redux_values").readlines
weapons = [ "broadsword", "longsword" , "greatsword" , "(so on)" ]
crit_strings = [ "(insert first crit message)", "(second, and so on and so on until they're all here)" ]
crit_dmg = { "(insert first crit message)" => 1,
"(insert second msg)" => 5,
"(so on for every msg)" => 10 }
df_skin = { "(insert first weapon)" => 0.350,
"(second)" => 0.250,
"(so on for every known df)" }
df_leather = { (I think you get the idea) }
armor_type = "(I'll make it automatically determine the armor type over the period of a few hits until the AvD will be enough to single it out some other time, until then, the user will type in skin, leather, scale, chain, or plate here, or it'll just look at it when started and ask the user if it's some funky altered thing or something else it can't match)"
crit_in = String.new
damage_in = String.new
while string_in = $game.gets
case string_in
when / at you!/
weapons.each { |weapon|
if string_in =~ /#{weapon}/ then
stack.push(weapon)
else
break
end
}
if weapon_stack.length == 1 then
until damage_in == /... and hit for /
damage_in = $game.gets
end
taken_dmg = ($'.sub(" damage!", "").to_i)
until crit_in == /#{crit_strings}/
crit_in = $game.gets
end
case armor_type
when "skin"
dmg = (crit_dmg.find(crit_in) * df_skin.find(stack.first))
when "leather"
dmg = (crit_dmg.find(crit_in) * df_leather.find(stack.first))
when "scale"
dmg = (crit_dmg.find(crit_in) * df_scale.find(stack.first))
when "chain"
dmg = (crit_dmg.find(crit_in) * df_chain.find(stack.first))
when "plate"
dmg = (crit_dmg.find(crit_in) * df_plate.find(stack.first))
else
$game.puts("echo Error! Your type of armor is set to a value that doesn't exist! Quitting...")
exit
end
average_percent = (1 - (taken_dmg / dmg))
weapon_stack.pop
n = 0
redux_values.each { |val|
n = (n + val.to_i)
}
n = (n + average_percent)
over_time_average = (n / (redux_values.length.to_i + 1))
$game.puts("echo Average redux this hit: #{average_percent}")
$game.puts("echo Total average of all calculated hits: #{over_time_average}")
File.open("redux_values", "w+").print(average_percent)
else
break
end
end
end
Shaelun
08-12-2005, 02:56 PM
... as I feared, the tabs got deleted... well, in a nutshell, it calcs the average value of your redux everytime it sees you take a hit and recognizes the weapon being used as a DF it has in its database (which is implemented using a hash for each armor type: exact ASG and recognition of body area I'll add some other day), then spits out the average value for this hit, reads its past calculations from a file, tells you your final average redux, and waits until it recognizes another hit you take as one it can calculate. Fill in the hashes, and this works the way it is.
... so, you guys still say it's a far-fetched claim?
[Edited on 8-12-2005 by Shaelun]
Bobmuhthol
08-12-2005, 02:59 PM
Yeah. Mainly: it has a select few cases where it can successfully calculate things, if you wear miscellaneous armor it won't work, if you wear any armor that is not "some double leather" or something it won't work, it won't work for weapons you don't know about, it will give wildly inaccurate results like any other redux calculator.
Shaelun
08-12-2005, 03:13 PM
... did you bother to read the thing, or my comments at all...? Because those issues are addressed, and what it does is explained; so is the fact that I'm trying to polish the core of the Lich itself and will polish up that little snippet later.
... again, fill in the hashes, and it will work as-is.
I'd sure find a better one useful. So I assume you've written one, yes? What's the d/l link...?
Celephais
08-12-2005, 03:16 PM
I never thought it was far fetched to produce an agregate range (and neither did Bob).
Does ruby have a built in regular expression machine? I built a realtime parser that uses regular expressions to do something similar myself (Redux doesn't concern me), but implementing a regular expression engine is definatly the way to go.
Oh, don't case armor_type... instead of setting the armor_type, set df_armor = df_skin or whatever... better still if you make a multidimensional array for df (or artificially make it multidimentional)
Celephais
08-12-2005, 03:20 PM
I'd sure find a better one useful. So I assume you've written one, yes? What's the d/l link...?
Bob and I might be coming off as terse but we're trying to be constructive. None of us here have a functional, realtime, agregate, exception handling, redux calculator... or at least one we care to/have shared.
Until someone actually makes one, you can't prove a naesayer wrong.
... Cold fusion is impossible.
Bobmuhthol
08-12-2005, 03:35 PM
<<... did you bother to read the thing, or my comments at all...? Because those issues are addressed>>
They're addressed in that they can't be circumvented, yes.
<<I'd sure find a better one useful. So I assume you've written one, yes? What's the d/l link...?>>
Attached to this post. It's far more simple, efficient, and user-friendly, if you consider that better.
I take back the miscellaneous armor/not detecting armor thing after reading that the user inputs it (leading to it becoming just another calculator and doesn't really become any more convenient).
Shaelun
08-12-2005, 03:39 PM
That's a Visual Basic program, Bob? ... well Wine hasn't incorporated the runtime libraries for visual basic yet, and I assume that's why it's spitting errors at me all over the place. I can't run it. But you're saying it's better than typing in your armor type once, and having it forever calculate your redux...???
Bob pissed me off - not you, Celephais; you sound much too reasonable and intelligent to bug me.
Yes, Ruby has full regular expression support, as well as extended regular expression support (I've yet to study up on the difference, but I did come across that at some point this week...)
A regular expression starts with '/' and is delimited by the same.
The portion of a regular expression that came after the last match to a regular expression is accessible in the global variable $'
The portion before the match is stuck into $` (first one is an apostrophe, second one is the little thingie over the tilda at the top-left of your keyboard: since this medium doesn't lend itself to accuracy)
So on, and so on, and so on -- believe me, there seems to be almost no end to Ruby's uses.
Direct your browser to:
http://www.rubycentral.com/book/preface.html
(for the record, I chuckled at their claims when I first read it too. Now I agree. Unless the task at hand requires the efficiency of Objective C or Assembly, I'm really not convinced there's a better alternative to Ruby)
[Edited on 8-12-2005 by Shaelun]
Bobmuhthol
08-12-2005, 03:50 PM
<<That's a Visual Basic program, Bob? ... well Wine hasn't incorporated the runtime libraries for visual basic yet, and I assume that's why it's spitting errors at me all over the place. I can't run it. But you're saying it's better than typing in your armor type once, and having it forever calculate your redux...???>>
Yeah, it's a VB executable. If you're using any Windows platform you shouldn't have a problem running it.
Anyway, yes, I think my program is better than your script. I prefer using mine. Let's leave it at that.
Celephais
08-12-2005, 04:04 PM
Let's leave it at that.
aww, i like this thread.
Yeah I've never used ruby so it's all pseudo code to me.
Inline apps are nice, I didn't run bobs because I'm at work but I'm going to guess it's a stand alone parser, and doesn't hijack the port to output the redux in the FE, which is perfectly fine (Redux doesn't change too often... without training) but I'm sure someone would like to see it realtime (actually reducing it to a range could be a bad thing... might be nice to see 'Reduced by 40%' and the next hit 'Reduced by 42%')
Edit-Disabled smileys
[Edited on 8-12-2005 by Celephais]
Bobmuhthol
08-12-2005, 04:10 PM
It's a standalone I/O calculator. Plug in 3 numbers, get 1 back. It works splendidly for me.
Shaelun
08-12-2005, 04:24 PM
Er, Bob... you're saying you punch in the numbers for the hit? Perhaps you didn't get the point...
... what I posted, when used through the Lich, requires no user input. No interaction. No input, no clicking, no nothing. Simply start the script by typing:
;calcredux
(at the moment I haven't worked out the bugs for a dynamic Lich-command-character, so all it recognizes right now are statements that start with a semicolon)
And it monitors everything coming in from the game, and if it sees you take a hit that it knows the DF for... it calculates your redux. And saves the result. And tells you that instance of your average redux, and the average of all the hits it's ever seen you take as well. Automatically. As in, no input fields, no text boxes, no hassle.
... so, that's what the .exe you posted does, or...?
Bobmuhthol
08-12-2005, 04:28 PM
<<Er, Bob... you're saying you punch in the numbers for the hit? Perhaps you didn't get the point...>>
I get the point just fine. I like mine more. I know exactly what yours does.
<<... so, that's what the .exe you posted does, or...?>>
Nope. The .exe I posted uses a very simple formula and requires input of DF, raw damage, and endroll.
Shaelun
08-12-2005, 05:02 PM
Here. This is The Lich (please be forewarned, some of my comments in the prog and the readme contain profanity, and should you not wish to stumble upon such vulgarity, *do not* download or read this stuff).
NOTE!!!
This will take some tinkering to get it to work. I've realized I made a stupid oversight in the calcredux.lic script, and that it will return a totally invalid value (not that it would run in the first place without filling in the hashes... but if you did, it would tell you some stupid insane percentage, and otherwise work). I'm aware of this.
NOTE!!!
... this really is of no use to anyone, and without the Ruby interpreter, is again: nothing but a pretty little text file. But if you guys want to d/l it and take a peek in notepad.exe or whatever, be my guest.
NOTE!!!
yes, this will run exactly the way it is. But it will throw errors at you all over the place unless you set the directory it's in correctly at the very top of the script (the file 'lich'). In addition, you must put the file 'hosts-lich' into the same directory as your local hosts file. Also, should you want to use it with SF (I haven't tried yet, but it should work fine), the port it listens to is wrong. Should you want to play with it, setting the port at the top of the script will make it work.
NOTE!!!
... this is, more or less, totally useless. I also plan to follow the traditional "even number releases are stable, odd numbers are development releases and are not considered suitable for general use." Also, Alpha software is pre-beta testing. This is v0.1 Alpha. So to sum up: this is useless to you. Don't bother downloading it. But if you want to look at it and get it running, it will run, though again, I don't think anyone will be able to get it working properly because it's not user-friendly in the least yet. If you do, it'll print a nice little "--- Lich v0.1alpha. Type ';help' for more information." in the middle of your login scroll, and will respond to your commands and yes, if you're able to write Ruby code, it will run your scripts.
Don't complain that it gave you syntax errors - if it does, it's your own fault, because as it is right now it runs and scripts for me. Don't complain that it's bugged, because I bloody well know that and it's why I keep saying "don't hold your breath, this isn't my job, it's for fun, easily 1-4 weeks," blah blah blah. No, it will not damage your computer or your character or anything else, the worst that can happen is your commands to the game will stop being sent or responded to, and you'll have to log out. Don't complain that it sucks, because frankly, I don't give a goddamn. Go download JSE. I'm writing this because I'm a nerd and I enjoy it.
... we all on the same page here? Good. If you still want to d/l it, be my guest.
Bobmuhthol
08-12-2005, 05:32 PM
I see hosts.original, hosts-lich, lich, README.txt, scripts folder. I have Ruby installed. I don't see any Ruby programs. I can't even begin to make out the wall of text in README.
If this is intended, feel free to ignore me.
Shaelun
08-12-2005, 07:08 PM
Register files ending in ".rbw" (or .rb, but DOS/Windows has always worked off of 3 character file extensions, and I think they chose to abbreviate "Ruby Windows," but don't take it as written in stone) as being files to open with the Ruby program. Then you can double-click it and run it.
The docs say "ruby.exe" opens a command-line interface (CLI), which isn't necessary with The Lich (but you won't get any status info while it's linking up... though again, you'll know it's running and monitoring if the login scroll includes '--- Lich' blah blah), and "rubyw.exe" just runs a file exactly like it were a .exe without popping open any shells.
Linux neither cares nor pays attention to a file's filename extension unless the program wants to for some reason, hence the lack of one to the Lich (forgot to change it before I zipped it).
Also forgot to mention that if you're seriously gonna try to get the thing to work, the procedure is that it links to the game host *before* your client connects, so the game host will close the connection within 5-15 seconds (never timed it). Yet another user-friendly issue (I just have a hotkey set to run the Lich and SGE at the same time).
Any other problems or questions (serious ones), I'll be happy to answer or comment on.
If you wanna do something cool and manage to get it working (at all, not just linking to the game - but executing period), try to run the Ruby script 'rubyscript2exe' on it (gonna have to do it from a CLI, just type rubyscript2exe for usage info). Just because I'm being lazy as Hell and haven't installed Windows yet (is it obvious I'm in love with Linux yet?), and I'm not positive it can be turned into a .exe in Windows.
Bobmuhthol
08-12-2005, 07:16 PM
<<Register files ending in ".rbw" (or .rb, but DOS/Windows has always worked off of 3 character file extensions, and I think they chose to abbreviate "Ruby Windows," but don't take it as written in stone) as being files to open with the Ruby program. Then you can double-click it and run it.>>
There are no .rb or .rbw files in this zip.
Shaelun
08-12-2005, 07:22 PM
... alright, I've got a question about the PC boards now: anybody wanna explain to me why my posts keep getting turned into smileys when it says "HTML is off. Smilies are off. Img code is off." ? If you couldn't tell from my # of posts, up until the past 2-3 days, I've checked this place at best once every 6 months.
Shaelun
08-12-2005, 07:23 PM
... I forgot to rename it. Rename it to "lich.rbw" or if you want, "FUmofo.rbw", it really doesn't matter as long as the file extension is rbw.
Bobmuhthol
08-12-2005, 07:35 PM
<<... alright, I've got a question about the PC boards now: anybody wanna explain to me why my posts keep getting turned into smileys when it says "HTML is off. Smilies are off. Img code is off." ? If you couldn't tell from my # of posts, up until the past 2-3 days, I've checked this place at best once every 6 months.>>
It says that in the reply box but it's not true. Click "Disable smileys" above Post Reply.
<<... I forgot to rename it. Rename it to "lich.rbw" or if you want, "FUmofo.rbw", it really doesn't matter as long as the file extension is rbw.>>
So.. it's a Ruby program (no window), what do I do now? Executing it doesn't seem to have done anything. Unless it should be .rb to open a window?
Shaelun
08-12-2005, 07:55 PM
There are two .exe files that are installed into the "C:\Program Files\ruby\bin\" directory when you install the one-click Ruby installer for Windows: ruby.exe, and rubyw.exe.
The documentation (amusingly enough, I was able to install and can execute the Windows version of Ruby using my Windows emulator, but it can't properly handle Winsock2 functions, so it just gives me errors trying to run anything that uses Ruby's 'socket' library - which my app does), which I can't vouch for, says that 'ruby.exe' will open a command-prompt shell as it's running the program you've told it to run, so that status info, errors, etc. get printed to the command-prompt 'shell' window, and you can type stuff into it and have the Ruby app get it as well.
It says 'rubyw.exe' does *not* open any shells, and will just run a program and trust that it's not going to sit there and wait for the user to type something into a window that doesn't exist.
Lich will not sit there waiting for this. It does print "Connection to the game host is open." when it connects to GS and is waiting for your client to connect to it.
Don't forget, Bob, that while it's doing that, your hosts file has been replaced by the file 'hosts-lich', which points anything trying to connect to 'gs3.simutronics.net' to *your* computer instead. This is how the Lich is able to accept your client's connection request. If a program (any program, actually) *does not* connect to The Lich while it's sitting there waiting, your hosts file *will not be restored*. The next time you run The Lich, it will automatically detect this, but there's just no way around having it sit there waiting for a connection -- that hosts file *must* be 'hacked' at the time your client tries to connect to Gemstone, otherwise the client really *will* connect to Gemstone.
So you see the problem, I'm sure - if you just give up, and happen to have not run The Lich after a bunch of tries, and the last time just happened to be a run in which everything was fine with no errors and it sat waiting for a connection, your hosts file will forever be pointing to your own computer instead of the game. Again, simply running The Lich one more time will cause it to detect this error, print (to the shell window, which won't be open if you run it with rubyw.exe, so you'll see *nothing*) that it's restored your original hosts file, and it will exit (telling you to run it again if you weren't just trying to fix your hosts file).
It shouldn't ever happen, but if that hosts file doesn't exist and somehow goes 'poof' (I really have no idea how that would happen, but I'm not out to break anyone's computer), your computer will probably freak out really badly when you try to connect to stuff. I'm not sure, it might just say "oh, we have no hosts file! Weird, lets go ask the name server for the address," but anyway, just to be totally safe, that's why "hosts.original" is in the zip.
It's actually my own hosts file. You can use that if such a catastrophic event were to occur.
1) run the Lich
2) don't rush like mad, but don't dawdle either, as you next run SGE the way you usually would (assuming you use SGE)
3) log in like you always do.
4) when the Wizard opens, if it sits there doing nothing, you can be pretty sure Gemstone dropped the connection because it timed out. Or, something Windows-related that I haven't yet stumbled upon interfered. If it connects as usual, and you *don't* see "--- Lich: v0.1alpha," so on, right after "*** PsiNet" etc., it's not running and the only possibility is I didn't predict Windows behavior properly and the Hosts file wasn't auto-found like it should be.
5) If you *do* see that message... well, type ';help' and read the help info.
EDIT: don't bother... it won't find your hosts file - Linux uses '/' for directories, Windows uses '\' -- I forgot to take this into account while it looks for your hosts file... I put quotes around the directories to check, and in quotes, a '\' doesn't mean '\', it means "the following is an escape code and should be processed as such". Well, running it will probalby do nothing, except say "Error - hosts file not found!"
Stupid, stupid little sh*t like this pisses me off... if you want to do it yourself, change all of the lines saying Dir["c:\blahblah"] (just do a search for Dir[" and change the quotes to apostrophes.
Thanks for "making the bug report," Bob ;)
[Edited on 8-12-2005 by Shaelun]
Bobmuhthol
08-12-2005, 08:03 PM
Dude I seriously have no clue what you just said. I run Ruby.exe and then.. I get a window. WTF am I supposed to do with it?
C:\Documents and Settings\Owner\Desktop\lich_bundle_v0[1].1alpha>lich.rb
Critical Error: the Lich is unable to find your hosts file! (manual fix can be found in the readme)
That's what I get when I open it with the interpretator or with Windows. I need instructions, not an essay on how it works.
Shaelun
08-12-2005, 08:11 PM
See above.
Dude, don't let it irritate you -- I told you, this is not user-friendly and it is not suitable for general use.
I understand where you're coming from, Bob, but if you never have any idea how it works, then you'll never be able to write Ruby programs to use with it and only when I eventually get around to setting up quick-and-easy shortcuts for people would it be of use to you, so it's kind of pointless to even try and make it work at this point. But if you're doing it just to screw around, by all means, have at.
lich.rbw is attached and is fixed for the Dir issue.
[Edited on 8-12-2005 by Shaelun]
Bobmuhthol
08-12-2005, 08:37 PM
I ran lich.rbw in the command prompt (no error messages, but no messages at all), logged in about 10-15 seconds later, nothing changed other than that I've logged in. I don't know what I'm supposed to do with ruby.exe.
Shaelun
08-12-2005, 08:41 PM
... You typed "c:\program files\ruby\bin\ruby.exe c:\(where the lich is)\lich.rbw" and it gave you *no* output at all...? ... that's, not right... you opened the command prompt by start -> run -> "cmd" ??
... That shouldn't be the case. I give. I'm going to go install Windows. I'll be back in an hour or two when it's done.....
if you wanna play with it, do the above with this one -- I don't get it, but it may work.
[Edited on 8-12-2005 by Shaelun]
Bobmuhthol
08-12-2005, 08:52 PM
I ran ruby.exe and then typed in the path and lich.rbw, ruby.exe just closed. No engine.
Latrinsorm
08-12-2005, 09:18 PM
Originally posted by Shaelun
There are two crits with the same crit message, but different damage adders? Hmmm, news to me... which one is it?There's a pair of pierce crits that do this (I'm pretty sure Bob made up the chest thing). Rank 4-5 to left hand maybe? Anyway, DFs are not constant, so you'll never get an exact redux number, neither by hand nor with a computer. You usually won't even get a nice degree of accuracy, usually (if you do it the correct [my] way) you'll be in a 2-3% range. If you just average everything together, you'll get one (incorrect) number. Plus, low endrolls are notoriously bad for redux calculation, so you'd have to discount them somehow.
Bobmuhthol
08-12-2005, 09:24 PM
<<(I'm pretty sure Bob made up the chest thing).>>
Yeah it doesn't happen with chest.
<<Anyway, DFs are not constant>>
WTF? Yes they are.
Latrinsorm
08-12-2005, 10:44 PM
They just aren't. They vary slightly when they get reduxed.
Shaelun
08-13-2005, 12:18 AM
... I can't install Windows. I've spent the past 2-3 hours trying to coax it, trick it, force it, and no matter what I do... it will not work. However, this forum obviously has nothing to do with such problems.
For the time being, I have no way whatsoever of figuring out what's going wrong or what would fix it in Windows. I'm totally clueless at the moment. Thanks for pointing out to me that something's so broken it doesn't even say anything in Windows, Bob. I wasn't aware of it in the least.
And Latrin, how certain are you that weapon DF's vary from hit to hit? And to what degree do they vary -- I mean how much of an error factor are we talking about here, because a certain amount could be compensated for; but if that's the case, and it's more than a smidgeon... yeah. Could take hundreds or even thousands of hits for probability to balance it out, and that's presuming it isn't weighted one way or another (math people can check me on this, but at face value I'm thinking if the variation is equally random in both directions, theoretically it could still be calculated with an almost negligent level of inaccuracy, given a large enough sample... but my education in mathematics is frankly embarrassing: wouldn't be at all surprised if I'm wrong)
Shaelun
08-13-2005, 12:21 AM
... Wait just a minute -- you say you ran ruby. You don't mean you typed "ruby", hit enter, then typed in the rest...? Because Ruby can be used as a CLI itself, and typing "ruby" and hitting enter would explain why nothing happened. Pls tell me that's what you did...? Heh...
Latrinsorm
08-13-2005, 01:08 AM
Originally posted by Shaelun
And Latrin, how certain are you that weapon DF's vary from hit to hit?100%. Porcell said so, then I saw it happen myself.
As for how much, I don't recall seeing more than a .005 spread, but I sometimes have a terrible memory. If every point along that spread is equally likely to occur, then no amount of examples will bring the average to the correct point. If you took the high end observed and low end observed and split those, however, that would do the job nicely.
If your Lich thing could just keep track of all DFs observed and you didn't train any redux skill and you were sure the weapon being swung at you didn't have any damage weighting, then we could find out for sure either way (obviously we could do this with pen and paper too). The problem is by the time you're hit enough to make a decent sized sample, you'll most likely have trained in a redux skill or two (unless you're taking a dive or something). It's hard to keep a warrior alive for long enough to get a decent sized sample without getting him or her killed and without looking like you're trying to cheat the system and get an empath mad exp. The obvious solution is to make an empath with redux, but I don't know of anyone who has one of those.
Shaelun
08-13-2005, 03:57 AM
... That certainly isn't altogether promising, is it. Well, I suppose that as soon as multiple scripts run simultaneously again there won't be any actual disadvantage to running such a utility constantly. So what the Hell, a general idea's better than guessing or doing it by hand. Still, not nearly as useful as I thought such a thing would be.
Random DF's, random crits, perhaps at least one crit message that has two or more values... what a damn pain. The info's good to have though, and it's certainly news to me, so it's appreciated all the same.
Shaelun
08-13-2005, 08:02 AM
I need some input on whether or not this is intuitive enough to people to use, so if it's not, please speak up:
[edit: if you somehow read the list in the 10 mins it took me to realize my mistake, it's not manacheck - the script command is mana; 'manacheck' is the actual command the Lich recognizes, but you get the idea]
put & echo <-- same as the Wizard, except because of Ruby syntax, to speak:
say <-- otherwise the apostrophe to speak could get complicated
pause <-- 10s is 10 seconds, 10m is 10 minutes, accepts any value with 's' or 'm'
mana <-- by itself returns your mana, with a number returns true if you have more than that or false if you don't
health & spirit <-- same as manacheck
stunned? <-- returns false if you're not, or the rounds if you are
bleeding? <-- same deal, false if you're not, # per if you are
roundtime <-- same thing, false or if you're in RT the second duration
status <-- for now you can only ask it for "position" (which returns prone, standing, or whatever the case may be), "bleeding?" and "stunned?" do the same as asking directly for those (just to improve the chances that your script will be understood the way you meant it to be instead of making you figure out what little mistake you made, etc.), "health" "spirit" and "mana" are the same as above too, so is "roundtime"; may or may not add more, I dunno at this point.
This a Ruby class, and while that means nothing to you, what it translates to is that you make use of these in the following way:
if Lich.mana(19) then
put "incant 419"
else
say "Anyone spare some mana?"
end
... will that work for people? This is not a full list, it's the list of commands that so far the 'Lich' class I wrote will recognize if you choose to include it. You can choose not to if it interferes with something you want to do, and either way, everything Ruby recognizes is still available. This is just in addition. And please let me know if this isn't going to work out for people -- I mean no offense by this, but I'm starting to feel like what I'm doing is attempting to turn Ruby into something that isn't Ruby, which is just stupid since I'm assuming that without being precisely that - Ruby - there wouldn't really be anything this could do that JSE or UltraTech wouldn't be able to (I'm just assuming, since I've never used either of them). So should I stop wasting my time, or would people get something out of this that they won't from those two?
[Edited on 8-13-2005 by Shaelun]
Latrinsorm
08-13-2005, 11:31 AM
Originally posted by Shaelun
bleeding? <-- same deal, false if you're not, # per if you are Does it do the sum of all bleeders? As an aside, do bleeders all pulse simultaneously?
I've never seen JSE, but from what Bob says and from what I've seen of UltraTech, this looks quite a bit easier to use (possibly because it's shockingly reminiscent of my TI-83+).
And as a quick aside, randomized crits don't hamper redux calculations at all. It's the slightly randomized crit divisor that prevents one from always backing out the exact crit rank, which would negate the problem of multiple damages from one crit message. My suggestion is to just have your redux calcamalator ignore any hits with that crit message (you'll see which one it is when you look at the crit table for pierce).
That reminds me of something else. There are lots more crit tables than pierce, slash, and crush, but I don't know where you can get any of them. I know people have done some bolt DF research, so they have at least a few of the crit tables for fire, acid, etc, but then there's unbalance and who knows what else. I don't know how easy it would be, but you're going to have to ignore those unless and until you (or someone else) can obtain a crit table for each.
Bobmuhthol
08-13-2005, 01:17 PM
<<... Wait just a minute -- you say you ran ruby. You don't mean you typed "ruby", hit enter, then typed in the rest...? Because Ruby can be used as a CLI itself, and typing "ruby" and hitting enter would explain why nothing happened. Pls tell me that's what you did...? Heh...>>
I ran Ruby.exe and typed C:\...\lich.rbw in it, then it closed.
Bobmuhthol
08-13-2005, 01:18 PM
>
/qrs crit fire head
[Press the ESCape key to abort script.]
Rank | Damage | Messaging
----------------------------------------------------------------------------------
| 15 | Burst of flames char forehead a crispy black.
| 20 | Flames engulf head searing hair and scalp. Sickening!
| 30 | Head explodes in flames! Grab some marshmallows.
| 35 | Flame sets a giant rat's head alight like a torch. Burned beyond recognition.
| 40 | Head reduced to a charred stump.
| 50 | Head explodes, splattering sizzling bits of flesh and bone everywhere.
[Script finished!]
:)
QRS IS KING.
Latrinsorm
08-13-2005, 02:52 PM
Fire only has 6 crits?
Bobmuhthol
08-13-2005, 05:17 PM
.. apparently.
I don't have any other data showing otherwise.
Shaelun
08-13-2005, 11:51 PM
Yeah... the more I thought about it, the more I started to realize it wasn't my mistake that caused you to not be able to get it to work. It's just the fact that Linux is a command-line environment, and Ruby was designed with Linux in mind.
You started an interactive Ruby session, and tried to give it the name of my program as a Ruby value/command, not as a Ruby program to run.
Typing irb (interactive-ruby) is a much more advanced version of that, and I use it myself to test really quick syntax bits (like for instance, does this require an apostrophe, or will Ruby recognize it with quotes instead?)
Type, *all on one line*, "ruby.exe lich.rbw" and hit enter. Insert the directories you have them in.
That is, of course, if you still want to get it to work. If not, just uninstall Ruby (though it's a great tool) and ignore this thread forever ;)
Ya know, that's ironic -- the first programs I wrote were in middle school on my TI-82 :)
[Edited on 8-14-2005 by Shaelun]
Shaelun
08-14-2005, 12:15 AM
I have to rewrite the readme.txt -- I've come to realize only someone who can program Ruby could make sense of the damn thing, and it reads more like a changelog than a readme (cut me some slack, I've never shared what I programmed before, heh). So read it or don't read it, may help you, may not.
Also, don't bother trying to use the commands I mentioned. They're only half done.
Same schpiel goes for this copy. Totally in testing. Mildly quirky. Not point-and-click at all. Don't blame me, it works like a charm on my computer.
Doesn't time out anymore. You can run it and log in 10 minutes later if you want, it'll still work. But remember: until something connects to it while it's waiting, your hosts file will remain hacked. So you can run it once more and it should fix that, or you can manually replace "hosts" with the file "hosts.bak" from your hosts directory.
If you have absolutely no idea what anything I've been saying means, you're best off just avoiding it altogether. Sorry, don't mean to be rude, but it's just the truth. Also, I make no promises.
And use ';ka' to stop your script for now, otherwise it won't let you start a new one thinking you've got one already running. I know, quirky, but I don't want to rewrite it around a temporary fix for a bug, so it's still built for multiscripts.
Have fun. It works surprisingly well once you manage to get the hang of getting it working, so this may be the last copy for awhile (this is turning into a job of its own, and it's the bloody weekend...)
Shaelun
08-14-2005, 12:30 AM
Forgot the example.txt file. Don't try to run it, because it's more of a tutorial than a runnable program... but it's the best explanation I can give, and if I may say so, should help most anyone understand not just Ruby but the general concept of programming period.
[Edited on 8-14-2005 by Shaelun]
Shaelun
08-14-2005, 10:57 AM
Unless I do (successfully) turn Ruby into a Wizard-like language... there's only two types of people who are going to be able to make use of this thing:
The one(s) who wrote it (me),
And the one(s) who could have written it themselves.
... apparently my initial concern that the general player-base would be livid if a scripting engine powerful enough to do anything, including respond to speech and play all by itself, was released was -- well, naive seems like the most accurate way of putting it.
So, I'm (yet again) asking for input: would people prefer that I somehow found a Windows machine to turn an automatic redux calculator into an .exe on, and have it just do nothing except that (obviously way easier)... or make the redux calculator a script only usable if you run The Lich the way I originally planned (harder, but leaves the option of using The Lich to run anything, not just that)? Because no matter what happens, I'm going to finish this damn thing, and I sat down to continue it and realized the way I'm designing it now, I really might be the only person who can use it.
Also, two questions, one a stupid statistics question... since I need to know for sure at some point: if you get a result this time, save it to a file, get another result, average those two and only save the average to a file... then log in the next day, get another value, and average the value from the day before, saving only that to a file, etc., etc....... is it mathematically the same as saving every single redux value this thing ever calculates to a file and calculating every single one every time, or will the two methods result in a different value? Because it'd just be a lot faster, CPU-wise, if I could just do it without averaging (eventually) 1000 values everytime I take a hit.
Second, and way easier -- can somebody post a link to the most recent version of QRS, or tell me where I can get an accurate list of weapon DF's? :)
[Edited on 8-14-2005 by Shaelun]
Celephais
08-14-2005, 12:21 PM
Quick PC search..
http://www.bol.ucla.edu/~flooey/gs4sorcery/
(Thank you Bob for posting the original link)
Latrinsorm
08-14-2005, 01:09 PM
If you keep track of the number of hits you have and don't just average the two numbers directly, it'll be the same.
The language doesn't seem all that tricky to use, btw, for the kind of stuff we would need. When I get some free time, I'll dl this stuff and give it a whirl.
Celephais
08-14-2005, 01:30 PM
You store two values. RunningAverage, CurrentCount.
Store you first value into RunningAverage, and set CurrentCount = 1
For each additional value you calculate you do the following:
CurrentCount = CurrentCount + 1
RunningAverage = RunningAverage + ((NewCalc - RunningAverage) / CurrentCount)
Shaelun
08-14-2005, 08:10 PM
... Hm. Yes, I'm once again reminded that I screwed up when I didn't at least take Statistics along with the other 3,000+ undergrads at school... well, never too late.
... but I was busy then, and, uh, I'm busy now... ;)
Totally disregarding efficiency for the moment, what would yield the most accurate result -- no need to provide any examples, just a basic algorithm and a statement of "this is more accurate," and I can probably do the rest.
Shaelun
08-14-2005, 10:43 PM
Since I'm the only person who's ever seen this thing run, and since I just spent nearly half the day working on it, I feel the desire to share what I see when I log in:
You were unable to find the PsiNet, and so you cannot link to it.
*** PsiNet client version beta 13 build 32 running.
*** PsiNet client has intercepted connection. Attempting to contact Simutronics...
--- Lich v0.1 Alpha. Type ';help' for more information.
Please wait for connection to game server.
{trimmed in the interests of avoiding unnecessary spamming}
>;help
--- The Lich v0.1 Alpha Usage Info
HELP: Prints out this message (help, k, and ka are the only commands that do *not* require spaces in front of them). A number of these are for me to debug with and probably won't be of any real use to you.
KILL: Stops the last script that you started. May also be provided as STOP or K (K is for those 'oh sh*t!' moments, and needs no space -- also, append an A to instantly stop all scripts, so you'd type ';ka' to drop everything immediately, including that darn meteor swarm script you just accidentally started in TSC again...). I'm working on providing more fine control over what to stop, but so far it's either the last one started or all of 'em.
SEND: Unlike the Wizard, local commands don't get sent to scripts - use this to send something to all scripts running as though the game sent the string (e.g., '; send TurnipFarmer just slapped you!')
MANA: Prints the current value of the Lich's $mana variable.
HEALTH: Ditto, but with $health
SPIRIT: Guess ;)
README: Will print out the full readme.txt for the Lich (long scroll - you'd probably prefer to read it externally).
FLUSH: Shouldn't be an issue, but if for some reason The Lich has eaten up too much RAM with its caching of game data, this will flush the buffers.
LOG (or DUMP): Writes all data still in buffers (beware, a FLUSH empties the buffers) to a text file. This isn't really meant as a feasible way to keep regular logs, it's meant to facilitate script writing -- it prints *all* data from the game, including status lines, etc.; *lots* of usable info your client never shows you.
ABOUT: Prints out misc. data like version number, contact info, etc. (be forewarned, scroll is about a screen long).
(ANYTHING ELSE): Gets interpreted as the filename of the script you want to run. Note that commands have no abbreviations, and most require a space between the ';' and the command to minimize the chances of interfering with script names.
>;idontexist
--- Lich: linking with script...
--- Lich: error: No such file or directory - /home/fallen/progs/lich/scripts/idontexist.lic
{.... trim trim trim....}
>;calcredux
--- Lich: linking with script...
--- Lich: linked - script active.
[Lich: Histories read as: chain0scale0plate0skin0leather0chain0.0scale0.0pla te0.0skin0.0leather0.0]
[Lich]>inventory
You are wearing a swirling sonic barrier, ...{snip-snip}...
[Lich: CalcRedux: inventory scan has detected sonic armor; your armor class cannot be automatically determined. Please either PREP 1014 and sing your armor type again for a renewal cost of 6 mana, or edit the file 'calcredux-armor.txt' in your Lich scripts directory so that it includes your most frequently used armor class and then restart this script.]
{snipping away}
>sing 15
You restart your song. [Cost is 6 mana]
[Creating a swirling sonic barrier around you equivalent of ASG 15.]
(Forcing stance down to guarded)
[Lich: CalcRedux: sonic barrier identified as chain class protection.]
Sing Roundtime 3 Seconds.
{lots of snipping}
>;calcredux
--- Lich: linking with script...
--- Lich: linked - script active.
[Lich: Histories read as: chain0scale0plate0skin0leather0chain0.0scale0.0pla te0.0skin0.0leather0.0]
[Lich: CalcRedux: armor type 'chain' has been loaded from your settings file.]
..... {snip-snip} .....
A black forest ogre swings a rust-covered dhara at you!
AS: +312 vs DS: +320 with AvD: +34 + d100 roll: +13 = +39
A clean miss.
[Lich: attack detected...]
>
[Lich: weapon type known...]
[Lich: roll seen...]
[Lich: miss recognized, breaking to initial monitoring...]
.... {more snipping}.....
A black forest ogre swings a rust-covered dhara at you!
AS: +312 vs DS: +320 with AvD: +34 + d100 roll: +75 = +101
... and hits for 1 point of damage!
[Lich: attack detected...]
Blow glances off your shoulder.
[Lich: weapon type known...]
[Lich: roll seen...]
[Lich: damage parsed...]
[Lich: scanning hash keys for match...]
[Lich: key found, crit damage is known...]
[Lich: scanning for df...]
[Lich: df calculated as: ]
[Lich: CalcRedux: error!! Your armor type is not recognized as skin, leather, scale, chain, or plate; cannot calculate your redux! Exiting...]
... {snip} ...
I've got the debugging flag I wrote into it set to on: that's obviously not how it's designed to react every swing it sees; I don't know why it loaded my armor properly and then failed to look up the DF correctly. But it's almost functional.
... can somebody tell me if there's a more accurate way of calculating redux than taking the average of every previously calculated hit, so that I don't have to rewrite it once it's working (which wouldn't be too bad... but I just know I'll end up writing half a dozen new bugs into the thing if I do that)? Anything, or is an averaging as good as I'm going to get it?
Latrinsorm
08-15-2005, 12:01 AM
The way I'd do it is take the range of DFs that each hit could have (out to the thousandths place) and graph them or otherwise find which were the most common, with the hope that there's be a pretty obvious peak. I don't know a way to reliably do this with a computer, though.
Shaelun
08-15-2005, 02:38 PM
This just isn't working out nearly as nicely as I had wanted. Thank God I don't do this for a living... what started out as great fun is becoming a mildly amusing chore.
I don't mind turning a function or equation or algorithm or whatever the Hell real math is called into computer-speak if someone provides it... but the sad fact is I know very little about 'real' math. An average of all previous values is the best my head can come up with.
Well, point is, if anyone has any suggestions, I'm wide open to them. Whether anyone else ever uses the thing or not doesn't matter to me at this point, I really do want it for myself. You'd be doing me a favor by donating your cool math skills, heh.
Latrinsorm
08-15-2005, 04:14 PM
Maybe I'm not really following what you're saying, but what's so bad about keeping a running average? Can Lich not keep a value saved past game termination?
Shaelun
08-17-2005, 03:48 PM
Well... that depends. If you want to get technical - no, Lich doesn't. You'd have to write that in yourself. The script itself is what does it.
I'm just disappointed that I have no better option than a running average. What's it called, the 'principle of regression to the mean' or something aside, an ultimate average just isn't what I was after; I had hoped for a more precise method. Oh well. You can't change what you can't change, I guess.
Shaelun
08-19-2005, 04:15 PM
Just incase anyone wants it... here. For the moment, I have no plans of making it more user-friendly. I've included some random files, and the calcredux.lic script doesn't function as-is; still, it's an example, and I for one learn best through examples. Also, do not d/l this under the impression it will be easy -- frankly, I don't expect a single person to put it to use except for me, but the damn topic turned into such a fuss I feel obligated to at least offer something or other... grrr... the board just will not stop deleting the slashes in the directories, so you'll find a .txt with the instructions in the zip file.
Step-by-step directions for installation:
1) Download and install Ruby (http://rubyforge.org/frs/download.php/4174/ruby182-15.exe)
2) Create the directory "C:Program FilesLich", and then create the directory "C:Program FilesLichScripts"
3) Download Lich_v1.0.zip and unzip everything into the folder created in step 2 (meaning, put all the files in the .zip into that directory)
4) Right-click on the file Lich.rbw (it may or may not have the 3 letters after the period, depending on your system settings). Select "Create a short
cut," and click it.
5) Copy the newly created file, who's name will be "Shortcut to Lich.rbw," or something very similar to that, to your desktop by dragging and dropping
it there.
6) Double-click the shortcut on your desktop. A little window will pop up asking you what program you want to use to open it. Scroll through the list, and if Ruby isn't in it, you'll have to manually type in the path to "RubyW.exe" -- if you use "ruby.exe" (without the "W"), everytime you run The Lich a text box will pop open. Either will work, so it's your choice, but RubyW seems less aggravating to me. By default, it should be in the directory "C:Program Filesrubybinrubyw.exe".
7) Copy the file "lich-hosts" from your "C:Program FilesLich" directory into the appropriate directory for your OS (see below list).
That's it. You can now double-click The Lich shortcut on your desktop, and then log in the same way you always do -- if you have problems, the answer to your question is undoubtedly somewhere in this essay of a thread. If you just can't find the answer (but please look first), you're welcome to mail GS4Lich@yahoo.com and I'll do my best to respond promptly.
Please be aware that if you use StormFront, you'll have to manually edit the port number The Lich uses (it differs from the Wiz) -- open the main Lich
.rbw file in notepad.exe or any other text editor, and you'll see it right on the first 6-10 lines. Change that # to whatever port SF uses, and it should work just fine.
The list for where to put the file "hosts-lich" follows:
Windows XP Professional ... "C:winntsystem32driversetc"
(the WinXP Pro location is also the location for Windows NT and Win2K)
Windows XP Home ........... "C:windowssystem32driversetc"
Windows 95/98/ME .......... "C:windows"
I don't think anybody else uses *NIX, but the usual dir if you're using a UNIX-derived OS (FreeBSD, Linux, Irix, Solaris, etc.) is "/etc"
Shaelun
08-20-2005, 01:44 PM
It automatically calculates your redux by monitoring your game data, the way PsiNet tracks magic. It's tracking my redux to this level of accuracy: 76.5596160944998 (but truncates the value it displays, for aesthetic reasons). All values that it uses for calculations are that accurate. I want a real value, but since I can't get one, I want the best estimate that's mathematically possible, and there's enough random elements to start with -- it's for my personal use, so in a nutshell, I did the best I could. It ignores hits that are low enough to throw off the average (but still tells you that single hit's redux value). It stores values for each of your characters separately and on its own, so that your little 20th level warrior won't be screwing up your 90th level Rogue, or whatever. It should be 100% automated, will adjust itself to what char you're on, etc.. It also requires The Lich (since the Lich is what passes these things game-data, there's really no way around that requirement -- sorry). This runs flawlessly on my system, and has been for the past 16 hours straight (literally) without a single bug or problem. If it doesn't on yours, I'm willing to try and make it, but you've gotta give me the information I need to do that (and if people aren't aware of it... I've gotten none so far. Almost literally none whatsoever. If you don't care, cool man, no reason for you to give me feedback then -- but if you think I've got like a dozen people telling me what's screwy, you're wrong; I'm clueless about this on any computer but my own, which is why I won't promise any more than "it works perfectly *for me*". So give me data).
D/l it, don't d/l it; change it, play with it, host it, throw it in your trash can -- whatever. I can't promise I'll write more Lich scripts that take advantage of Ruby, but hey, the whole point is you can write your own. If you want to, have a ball with it. That's what I wrote it for.
3-step (stick it in the directory and unzip it, basically) instructions + more info than you probably want are both included.
Off the top of my head, I'd estimate it's got 65-75% of the crits and melee weapon DF's I have access to (it's giving me calculated values on about half the hits I take). If you want to know what it'll do if you decide to use it (and to illustrate that it's smart enough to not throw its running average out the window because a low roll unbalanced it... also, this is the only output once it runs through its startup sequence, won't interfere with your normal playing and can be stopped like any script at anytime):
A black forest ogre swings a rust-covered dhara at you!
AS: +324 vs DS: +310 with AvD: +34 + d100 roll: +56 = +104
... and hits for 1 point of damage!
A feeble blow to your right arm!
[Lich: Instance redux is 0.0%]
[Lich: Average redux is 18.346%]
A black forest ogre swings a rust-covered dhara at you!
AS: +324 vs DS: +276 with AvD: +34 + d100 roll: +24 = +106
... and hits for 1 point of damage!
Thumped your chest.
[Lich: Instance redux is 33.333%]
[Lich: Average redux is 18.346%]
A black forest ogre swings a rust-covered dhara at you!
AS: +324 vs DS: +271 with AvD: +34 + d100 roll: +56 = +143
... and hits for 11 points of damage!
Jarring blow to your back.
[Lich: Instance redux is 25.581%]
[Lich: Average redux is 19.139%]
Originally posted by Latrinsorm
Originally posted by Shaelun
And Latrin, how certain are you that weapon DF's vary from hit to hit?100%. Porcell said so, then I saw it happen myself.
Weapon DFs do not vary, ever.
DF Redux does vary, however.
-OoK
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.