George Greer wrote: > NOTE: 'table' is "best case" because of the way my trivial > benchmark ran the loops. The worst case is equal to or > slower than the silly equations I made up. > > So .00022446 seconds per switch saving throw. You save a whole .00020559 > seconds by using an equation over the switch. The only place you ever > might get a (minuscule) measurable difference is the "levels" command. > > I'd use an equation if we had one with a perfect regression. Oh, boy, we're talking about equations....my specialty. As you can probably tell from my tablestoformula patch, I've already outlined the method of changing most of the switches to single line formulas, that may run faster than the switch. I'm pretty sure they won't run any slower. Now your looking for a perfect formula for the levels command. In another word, your trying to find a decent formula to replace the switches in level_exp. Well, it's obvious here that you'd rather not use my previous formula that simply incremented it by 1000(or another magical number) for every level. So here is a re-written formula that I onced used for a graphical RPG game that I created on GW-Basic. Notice, I'm re-writing it for our specific usage here. // Sample Code #define XP_MOD_A 10 #define XP_MOD_B 20 /* Function to return the exp required for each class/level */ // Doesn't this system make more sense? - Jason Yarber int level_exp(int chclass, int level, int chrace) { if (level > LVL_IMPL || level < 0) { log("SYSERR: Requesting exp for invalid level %d!", level); return 0; } // Gods have exp close to EXP_MAX. This statement should never have to // changed, regardless of how many mortal or immortal levels exist. if (level > LVL_MAX) { return EXP_MAX - ((LVL_IMPL - level) * 1000); } // Exp required for normal mortals is below return ((level * XP_MOD_A)*(level*XP_MOD_B)); } // End Sample Code As you see, unlike the switch code, this is much simpler, and tends to work just a tad faster, although you will probably never notice the difference. However, you'll notice that my level_exp function also has int chrace as one of it's arguments. If I was to even attempt to recreate the switches for this, it'd be a really confusing and jumbled mess, cause then I'd have one switch statement for every level, for every race, and for every class. After you add a few races and classes, that ends up being a huge switch statement, and it does take a little processor time to work through, as well as it's harder for the coder to understand and track down bugs in. With a simple formula, it makes everything easier. Here are example returns from the previous sample code that I gave. Level Experience 1 200 2 800 3 1800 5 5000 6 7200 7 9800 30 18000 31 50000 32 72000 As you can see, this formula does produce an exponential result. You can adjust the modifiers to give larger or smaller results. However, if you were to use any formula in the level_exp function, I'd highly suggest checking the value that is returned to make sure it's not over EXP_MAX as doing so can cause undesired results. Jason Yarber "I'm not an expert, but I'm pretty sure I know what I'm doing." -- +---------------------------------------------------------------+ | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html | | Newbie List: http://groups.yahoo.com/group/circle-newbies/ | +---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT