View Single Post
  #37  
Old 09-07-2005, 02:55 PM
Zachery's Avatar
Zachery Zachery is offline
 
Join Date: Jul 2002
Location: Ontario, Canada
Posts: 11,440
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Quote:Knoman

HP drops and rises according to the members activeness.
MP determins how long a user has been with the forums, and how active they are.
EXP determins how close a user is to reaching the next level.

Let's break it down to simple English, shall we?

$level = pow (log10 ($post[posts]), 3);
This is a simple logarithm that will calculate the how much post a member needs in order to get to the next level. This is the engine that will control all other calculations. Now, I've cubed it so leveling resembles Final Fantasy; where the max level is 99. If you are into D&D, squaring the formula would be best, requiring a lot of post before a user can reach level 20. In short, the higher the exponent, the quicker it is to level up.

$ep = floor (100 * ($level - floor ($level)));
This is the basis for the Experience system. What i did here, was take the remainder (or mod) from the Level logarithm and converted it to a percentage. I wasnt sure if PHP had a MOD function, so I did it the hard way.

$showlevel = floor ($level + 1);
I cant have a user with level zero, but i didnt want to affect the engine with a false number either. So, I created another variable $showlevel and added 1, which will only be used to show users, and wont affect the calculations.

$hpmulti =round ($postsperday / 6, 1);
if ($hpmulti > 1.5) {
$hpmulti = 1.5;
}
if ($hpmulti < 1) {
$hpmulti = 1;
}
This code here was to add to the randomness. This is my HP bonus multiplier. I took the post per day and divided by six and rounded it to the tenths decimal. I use a few IF functions to prevent it from being too high and too low.

$maxhp = $level * 25 * $hpmulti;
Determins the Max HP. Not much to be said here, 25 just seem to be a nice number.

$hp= $postsperday / 10;
If a person couldnt perform a ten post per day average, HP will drop.

if ($hp >= 1) {
$hp= $maxhp;
} else {
$hp= floor ($hp * $maxhp);
}
Sets the limit on how high your HP will go. Keeps it at or under the Max HP

$hp= floor ($hp);
$maxhp= floor ($maxhp);
HP calcualations are down. Rounding down for viewing sake.

if ($maxhp <= 0) {
$zhp = 1;
} else {
$zhp = $maxhp;
}
Debugs the Divide by Zero error.

$hpf= floor (100 * ($hp / $zhp)) - 1;
Is used in the templates.

$maxmp= ($jointime * $level) / 5;
Determins Max MP. Again, the 5 just seems right.

$mp= $post[posts] / 3;
Determins MP, not sure why I chose to do what I did, but it works. This is the reason why MP is still a mystery to my members and even to me.

if ($mp >= $maxmp) {
$mp = $maxmp;
}
Keeps MP from going above its max.

$maxmp = floor ($maxmp);
$mp = floor ($mp);
MP calculations done. Rounding down.

if ($maxmp <= 0) {
$zmp = 1;
} else {
$zmp = $maxmp;
}
Debugs the divide by zero error.

$mpf= floor (100 * ($mp / $zmp)) - 1;
Is used in the templates.

like i've mentioned earlier, this hack was spun off of role playing games (i.e. final fantasy). hp stands for health points. the more your points, well.... the better your health is. mp stands for magic points, your ability to cast certain spells and such. and, well... you know what experience is.

now, what drives this entire system is this one code:
$level = pow (log10 ($post[posts]), 3);

what that code does is set the standard at when a member is able to level up, and how much hp/mp s/he should recieve. a low level member is able to reach the next level very easily (only requiring a handful of posts). those at the high end levels would require a whole lot more posts to achieve the next level.

the rise and fall of the hp meter is determine by this variable $postperday. what that does is take the total number of posts and devide it by the total number of days the person has been registered. the quotient is then taken and divided even further by the max hp... by doing so, it gives me a percentage that changes constantly.

i've feel that i've explained everything the best way that i could. any further would be me teaching you how to read and understand php... or any programming language for the matter. none of this is technical, it's mostly multiplication and division. this was my very first project with php. i knew nothing about it. but what i did was open a math book and headed to php.net.

you give a man a fish, he feeds for a day.
you teach a man to fish, he feeds for life.
Reply With Quote
 
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01204 seconds
  • Memory Usage 1,786KB
  • Queries Executed 11 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD_SHOWPOST
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_box
  • (1)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (1)post_thanks_postbit_info
  • (1)postbit
  • (1)postbit_onlinestatus
  • (1)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • reputationlevel
  • showthread
Included Files:
  • ./showpost.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showpost_start
  • bbcode_fetch_tags
  • bbcode_create
  • postbit_factory
  • showpost_post
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • showpost_complete