2019-12-05, 01:26 PM
RPG Stats (1.2.0) give error and warning while open thread
<?php
/* #############################################################################
* RPG Stats for MyBB
* Authored by Settyness, Copyright (ɔ) 2019
* #############################################################################
* This plugin is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License v3 or later.
* <https://www.gnu.org/licenses/gpl.html>
* #############################################################################
*/
if(!defined('IN_MYBB')) die('This file cannot be accessed directly.');
$plugins->add_hook('postbit', 'rpgstats_postbit');
$plugins->add_hook('posbit_classic', 'rpgstats_postbit');
function rpgstats_info()
{
return [
'name' => 'RPG Stats',
'description' => 'Adds RPG stats, like HP and MP, to author details on postbits. The stats increase with authors\' post counts.',
'website' => 'https://community.mybb.com/thread-222664.html',
'author' => 'Settyness',
'authorsite' => 'http://anfinitinetwork.com',
'version' => '1.2.0',
'codename' => 'rpgstats',
'compatibility' => '18*'
];
}
// #############################################################################
/*
* Activate the plugin
*/
function rpgstats_activate()
{
global $db, $mybb, $lang;
$lang->load('rpgstats');
/*
* Install settings
*/
$q = $db->simple_select('settinggroups', 'COUNT(*) as item_rows');
$rows = $db->fetch_field($q, 'item_rows');
$setting_group = array(
'name' => 'rpgstats',
'title' => $lang->rpgstats_options,
'description' => $lang->rpgstats_options_description,
'disporder' => $rows + 1,
'isdefault' => 0
);
$gid = $db->insert_query("settinggroups", $setting_group);
$setting_array = array(
'rpgstats_view_by' => array(
'title' => $lang->rpgstats_view_by,
'description' => $lang->rpgstats_view_by_description,
'optionscode' => 'groupselect',
'value' => '-1',
'disporder' => 0
),
'exp_mult' => array(
'title' => $lang->exp_multiplier_seed,
'description' => $lang->exp_multiplier_seed_description,
'optionscode' => 'numeric',
'value' => '144.12345678',
'disporder' => 1
),
'hp_ini' => array(
'title' => $lang->initial_hp_value,
'description' => $lang->initial_hp_value_description,
'optionscode' => 'numeric',
'value' => '400',
'disporder' => 2
),
'hp_co' => array(
'title' => $lang->hp_coefficient,
'description' => $lang->hp_coefficient_description,
'optionscode' => 'numeric',
'value' => '180',
'disporder' => 3
),
'hp_damage_field' => array(
'title' => $lang->hp_damage_field,
'description' => $lang->hp_damage_field_description,
'optionscode' => 'numeric',
'value' => '',
'disporder' => 4
),
'mp_ini' => array(
'title' => $lang->initial_mp_value,
'description' => $lang->initial_mp_value_description,
'optionscode' => 'numeric',
'value' => '100',
'disporder' => 5
),
'mp_co' => array(
'title' => $lang->mp_coefficient,
'description' => $lang->mp_coefficient_description,
'optionscode' => 'numeric',
'value' => '60',
'disporder' => 6
),
'mp_spent_field' => array(
'title' => $lang->mp_spent_field,
'description' => $lang->mp_spent_field_description,
'optionscode' => 'numeric',
'value' => '',
'disporder' => 7
),
'limit_system_active' => array(
'title' => $lang->limit_system_active,
'description' => $lang->limit_system_active_description,
'optionscode' => 'yesno',
'value' => 0,
'disporder' => 8
),
'limit_cent_field' => array(
'title' => $lang->limit_cent_field,
'description' => $lang->limit_cent_field_description,
'optionscode' => 'numeric',
'value' => '',
'disporder' => 9
),
'limit_name_field' => array(
'title' => $lang->limit_name_field,
'description' => $lang->limit_name_field_description,
'optionscode' => 'numeric',
'value' => '',
'disporder' => 10
),
'element_system_active' => array(
'title' => $lang->element_system_active,
'description' => $lang->element_system_active_description,
'optionscode' => 'yesno',
'value' => 0,
'disporder' => 11
),
'element_optionstats' => array(
'title' => $lang->element_optionstats,
'description' => $lang->element_optionstats_description,
'optionscode' => 'textarea',
'value' => 'None|none.gif|200|200|200|200
Fire|fire.gif|200|240|200|160
Water|water.gif|200|160|200|240
Ice|ice.gif|200|140|200|260
Lightning|lightning.gif|200|260|200|140
Earth|earth.gif|200|300|200|100
Wind|wind.gif|200|100|200|300
Dark|dark.gif|300|320|100|80
Holy|holy.gif|100|80|300|320
Special|special.gif|350|350|400|400|1',
'disporder' => 12
),
'element_field' => array(
'title' => $lang->element_field,
'description' => $lang->element_field_description,
'optionscode' => 'numeric',
'value' => '',
'disporder' => 13
),
'gil_system_active' => array(
'title' => $lang->gil_system_active,
'description' => $lang->gil_system_active_description,
'optionscode' => 'yesno',
'value' => 0,
'disporder' => 14
),
'gil_field' => array(
'title' => $lang->gil_field,
'description' => $lang->gil_field_description,
'optionscode' => 'numeric',
'value' => '',
'disporder' => 15
),
'equip_system_active' => array(
'title' => $lang->equip_system_active,
'description' => $lang->equip_system_active_description,
'optionscode' => 'yesno',
'value' => 0,
'disporder' => 16
),
'equip_optionid' => array(
'title' => $lang->equip_optionid,
'description' => $lang->equip_optionid_description,
'optionscode' => 'textarea',
'value' => 'Weapon|12
Armor|13
Accessory|14',
'disporder' => 17
),
'exp_bar_image' => array(
'title' => $lang->exp_bar_image,
'description' => $lang->exp_bar_image_description,
'optionscode' => 'text',
'value' => 'images/bars/exp.gif',
'disporder' => 18
),
'exp_background_image' => array(
'title' => $lang->exp_background_image,
'description' => $lang->exp_background_image_description,
'optionscode' => 'text',
'value' => 'images/bars/exp-bg.gif',
'disporder' => 19
),
'hp_bar_image' => array(
'title' => $lang->hp_bar_image,
'description' => $lang->hp_bar_image_description,
'optionscode' => 'text',
'value' => 'images/bars/hp.gif',
'disporder' => 20
),
'hp_background_image' => array(
'title' => $lang->hp_background_image,
'description' => $lang->hp_background_image_description,
'optionscode' => 'text',
'value' => 'images/bars/hp-bg.gif',
'disporder' => 21
),
'mp_bar_image' => array(
'title' => $lang->mp_bar_image,
'description' => $lang->mp_bar_image_description,
'optionscode' => 'text',
'value' => 'images/bars/mp.gif',
'disporder' => 22
),
'mp_background_image' => array(
'title' => $lang->mp_background_image,
'description' => $lang->mp_background_image_description,
'optionscode' => 'text',
'value' => 'images/bars/mp-bg.gif',
'disporder' => 23
),
'limit_bar_image' => array(
'title' => $lang->limit_bar_image,
'description' => $lang->limit_bar_image_description,
'optionscode' => 'text',
'value' => 'images/bars/limit.gif',
'disporder' => 24
),
'limit_break_image' => array(
'title' => $lang->limit_break_image,
'description' => $lang->limit_break_image_description,
'optionscode' => 'text',
'value' => 'images/bars/limit-break.gif',
'disporder' => 25
),
'limit_background_image' => array(
'title' => $lang->limit_background_image,
'description' => $lang->limit_background_image_description,
'optionscode' => 'text',
'value' => 'images/bars/limit-bg.gif',
'disporder' => 26
),
'elements_image_path' => array(
'title' => $lang->elements_image_path,
'description' => $lang->elements_image_path_description,
'optionscode' => 'text',
'value' => 'images/elements/',
'disporder' => 27
),
'gil_image' => array(
'title' => $lang->gil_image,
'description' => $lang->gil_image_description,
'optionscode' => 'text',
'value' => 'images/gil.gif',
'disporder' => 28
),
);
foreach($setting_array as $name => $setting)
{
$setting['name'] = $name;
$setting['gid'] = $gid;
$db->insert_query('settings', $setting);
}
rebuild_settings();
/*
* Install templates
*/
$template = '<div class="smalltext" style="margin: 0 auto; width: 100%px; max-width: 180px;">
<div style="margin: 0 0 8px;">
<div id="rpgstats_lv">{$lang->lv} {$rpgstats[\'lv\']}</div>
<div id="rpgstats_exp">
{$lang->exp}<span style="float: right;">{$rpgstats[\'exp\']}{$lang->points}</span><br />
<div id="rpgstats_exp_bar" style="background: url(\'{$mybb->settings[\'exp_background_image\']}\'); width: 100%; height: 4px;">
<img src="{$mybb->settings[\'exp_bar_image\']}" style="width: {$rpgstats[\'exp_cent\']}%; height: 4px;" />
</div>
{$lang->next_level}<span style="float: right;">{$rpgstats[\'exp_next\']}{$lang->points}</span>
</div>
</div>
<div id="rpgstats_hp">
{$lang->hp}<span style="float: right;">{$rpgstats[\'hp_curr\']}/{$rpgstats[\'hp_max\']}</span><br />
<div id="rpgstats_hp_bar" style="background: url(\'{$mybb->settings[\'hp_background_image\']}\'); width: 100%; height: 4px;">
<img src="{$mybb->settings[\'hp_bar_image\']}" style="width: {$rpgstats[\'hp_cent\']}%; height: 4px;" alt="{$rpgstats[\'hp_cent\']}%" />
</div>
</div>
<div id="rpgstats_mp">
{$lang->mp}<span style="float: right;">{$rpgstats[\'mp_curr\']}/{$rpgstats[\'mp_max\']}</span><br />
<div id="rpgstats_mp_bar" style="background: url(\'{$mybb->settings[\'mp_background_image\']}\'); width: 100%; height: 4px;">
<img src="{$mybb->settings[\'mp_bar_image\']}" style="width: {$rpgstats[\'mp_cent\']}%; height: 4px;" alt="{$rpgstats[\'mp_cent\']}%" />
</div>
</div>
{$limit_bar}
{$element}
{$gil}
{$equip}
</div>';
$insert_array[] = array(
'title' => 'postbit_rpgstats',
'template' => $db->escape_string($template),
'sid' => '-1',
'version' => '',
'dateline' => time()
);
$template = '<div id="rpgstats_limit" style="margin: 8px 0 0;">
{$lang->limit}<span style="float: right;">{$rpgstats[\'limit\']}</span><br />
<div id="rpgstats_limit_bar" style="background: url(\'{$mybb->settings[\'limit_background_image\']}\'); width: 100%; height: 4px;">
<img src="{$rpgstats[\'limit_bar_type\']}" style="width: {$rpgstats[\'limit_cent\']}%; height: 4px;" alt="{$rpgstats[\'limit_cent\']}%" />
</div>
</div>';
$insert_array[] = array(
'title' => 'postbit_rpgstats_limit',
'template' => $db->escape_string($template),
'sid' => '-1',
'version' => '',
'dateline' => time()
);
$template = '<div id="rpgstats_element" style="margin: 8px 0 0;">
{$lang->element}<span style="float: right;">{$rpgstats[\'element_name\']} <img src="{$rpgstats[\'element_image\']}" alt="{$rpgstats[\'element_name\']}" /></span>
</div>';
$insert_array[] = array(
'title' => 'postbit_rpgstats_element',
'template' => $db->escape_string($template),
'sid' => '-1',
'version' => '',
'dateline' => time()
);
$template = '<div id="rpgstats_gil" style="margin: 8px 0 0;">
{$lang->gil}<span style="float: right;">{$rpgstats[\'gil\']} <img src="{$rpgstats[\'gil_image\']}" alt="{$rpgstats[\'gil\']} {$lang->gil_shorthand}" /></span>
</div>';
$insert_array[] = array(
'title' => 'postbit_rpgstats_gil',
'template' => $db->escape_string($template),
'sid' => '-1',
'version' => '',
'dateline' => time()
);
$template = '<div id="rpgstats_equip" style="margin: 8px 0 0;">
<select id="rpgstats_equip_dropdown" style="width: 100%; max-width: 180px;">
<option>{$lang->equip}</option>
{$rpgstats[\'equip\']}
</select>
</div>';
$insert_array[] = array(
'title' => 'postbit_rpgstats_equip',
'template' => $db->escape_string($template),
'sid' => '-1',
'version' => '',
'dateline' => time()
);
foreach($insert_array as $array)
{
$db->insert_query('templates', $array);
}
require_once(MYBB_ROOT.'/inc/adminfunctions_templates.php');
find_replace_templatesets(
'postbit',
'#\{\$post\[\'user_details\'\]\}#',
'{$post[\'user_details\']}{$post[\'rpgstats\']}'
);
find_replace_templatesets(
'postbit_classic',
'#\{\$post\[\'user_details\'\]\}#',
'{$post[\'user_details\']}{$post[\'rpgstats\']}'
);
}
// #############################################################################
/*
* Deactivate
*/
function rpgstats_deactivate()
{
global $db;
/*
* Uninstall settings
*/
$db->delete_query('settings', "name IN ('rpgstats_view_by', 'exp_mult', 'hp_ini', 'hp_co', 'hp_damage_field', 'mp_ini', 'mp_co', 'mp_spent_field', 'limit_system_active', 'limit_cent_field', 'limit_name_field', 'element_system_active', 'element_optionstats', 'element_field', 'gil_system_active', 'gil_field', 'equip_system_active', 'equip_optionid', 'exp_bar_image', 'exp_background_image', 'hp_bar_image', 'hp_background_image', 'mp_bar_image', 'mp_background_image', 'limit_bar_image', 'limit_break_image', 'limit_background_image', 'elements_image_path', 'gil_image')");
$db->delete_query('settinggroups', "name = 'rpgstats'");
rebuild_settings();
/*
* Uninstall templates
*/
$db->delete_query('templates', 'title = "postbit_rpgstats"');
$db->delete_query('templates', 'title = "postbit_rpgstats_limit"');
$db->delete_query('templates', 'title = "postbit_rpgstats_element"');
$db->delete_query('templates', 'title = "postbit_rpgstats_gil"');
$db->delete_query('templates', 'title = "postbit_rpgstats_equip"');
/*
* Uninstall legacy templates
*/
$db->delete_query('templates', 'title = "postbit_rpgstats_exp"');
$db->delete_query('templates', 'title = "postbit_rpgstats_hp"');
$db->delete_query('templates', 'title = "postbit_rpgstats_mp"');
require_once(MYBB_ROOT.'/inc/adminfunctions_templates.php');
find_replace_templatesets(
'postbit',
'#\{\$post\[\'rpgstats\'\]\}#',
''
);
find_replace_templatesets(
'postbit_classic',
'#\{\$post\[\'rpgstats\'\]\}#',
''
);
}
// #############################################################################
/*
* Process RPG stats for output
*/
function rpgstats($uid = 0, $posts = 0, $hp_damage = 0, $mp_spent = 0, $limit_cent_field = 0, $limit_name_field = 0, $element_field = 0, $gil_field = 0, $equip = '')
{
if($uid != 0)
{
global $mybb, $templates;
$posts = filter_var($posts, FILTER_SANITIZE_NUMBER_INT);
/*
* Apply default max HP and MP
*/
$rpgstats['hp_ini'] = $mybb->settings['hp_ini'];
$rpgstats['hp_co'] = $mybb->settings['hp_co'];
$rpgstats['mp_ini'] = $mybb->settings['mp_ini'];
$rpgstats['mp_co'] = $mybb->settings['mp_co'];
$rpgstats['hp_max'] = rpgstats_get_stats($posts, $rpgstats['hp_ini'], $rpgstats['hp_co']) + ($uid % 15);
$rpgstats['mp_max'] = intval(rpgstats_get_stats($posts, $rpgstats['mp_ini'], $rpgstats['mp_co']) + ($uid % 10) / 10);
/*
* Apply elements to max HP and MP
*/
if($mybb->settings['element_system_active'] == 1)
{
$elements = explode("\n", $mybb->settings['element_optionstats']);
if(isset($elements) && is_array($elements))
{
foreach($elements as $key => $line)
{
$e[$key] = explode('|', $line);
}
}
if(isset($e) && is_array($e))
{
foreach($e as $attr)
{
if($element_field == $attr[0])
{
$rpgstats['element_name'] = $attr[0];
$rpgstats['element_image'] = $mybb->settings['elements_image_path'].''.$attr[1];
$rpgstats['hp_max'] = rpgstats_get_stats($posts, $attr[2], $attr[3]) + ($uid % 15);
$rpgstats['mp_max'] = intval(rpgstats_get_stats($posts, $attr[4], $attr[5]) + ($uid % 10) / 10);
}
}
foreach($e as $attr)
{
if($attr[6] == intval($uid))
{
$rpgstats['element_name'] = $attr[0];
$rpgstats['element_image'] = $mybb->settings['elements_image_path'].''.$attr[1];
$rpgstats['hp_max'] = rpgstats_get_stats($posts, $attr[2], $attr[3]) + ($uid % 15);
$rpgstats['mp_max'] = intval(rpgstats_get_stats($posts, $attr[4], $attr[5]) + ($uid % 10) / 10);
}
}
}
}
/*
* Get and set current HP and MP values
*/
if(!empty($hp_damage) && $mybb->settings['hp_damage_field'] != '')
{
$rpgstats['hp_curr'] = $rpgstats['hp_max'] - $hp_damage;
}
if(empty($rpgstats['hp_curr']) || $rpgstats['hp_curr'] > $rpgstats['hp_max']) $rpgstats['hp_curr'] = $rpgstats['hp_max'];
elseif($rpgstats['hp_curr'] < 0) $rpgstats['hp_curr'] = 0;
$rpgstats['hp_cent'] = floor($rpgstats['hp_curr'] / $rpgstats['hp_max'] * 100);
if(!empty($mp_spent) && $mybb->settings['mp_spent_field'] != '')
{
$rpgstats['mp_curr'] = $rpgstats['mp_max'] - $mp_spent;
}
if(empty($rpgstats['mp_curr']) || $rpgstats['mp_curr'] > $rpgstats['mp_max']) $rpgstats['mp_curr'] = $rpgstats['mp_max'];
elseif($rpgstats['mp_curr'] < 0) $rpgstats['mp_curr'] = 0;
$rpgstats['mp_cent'] = floor($rpgstats['mp_curr'] / $rpgstats['mp_max'] * 100);
/*
* Get and set Exp values
*/
$rpgstats['exp_mult'] = $mybb->settings['exp_mult'];
$rpgstats['exp'] = intval(rpgstats_get_exp($posts) * $rpgstats['exp_mult']);
$rpgstats['exp_next'] = intval(rpgstats_get_nextlv($posts) * $rpgstats['exp_mult']);
$rpgstats['exp_curr'] = intval(rpgstats_get_lastlv($posts) * $rpgstats['exp_mult']);
$rpgstats['exp_gap'] = $rpgstats['exp_next'] - $rpgstats['exp_curr'];
$rpgstats['exp_prog'] = $rpgstats['exp'] - $rpgstats['exp_curr'];
$rpgstats['exp_cent'] = floor($rpgstats['exp_prog'] / $rpgstats['exp_gap'] * 100);
/*
* Get and set limit break gauge
*/
if($mybb->settings['limit_system_active'] == 1)
{
$rpgstats['limit_cent'] = $limit_cent_field;
$rpgstats['limit'] = $limit_name_field;
if(empty($rpgstats['limit_cent']) || $rpgstats['limit_cent'] < 0) $rpgstats['limit_cent'] = 0;
elseif($rpgstats['limit_cent'] > 100) $rpgstats['limit_cent'] = 100;
if($rpgstats['limit_cent'] == 100) $rpgstats['limit_bar_type'] = $mybb->settings['limit_break_image'];
else $rpgstats['limit_bar_type'] = $mybb->settings['limit_bar_image'];
}
/*
* Get Gil value
*/
if($mybb->settings['gil_system_active'] == 1)
{
$rpgstats['gil'] = my_number_format($gil_field);
$rpgstats['gil_image'] = $mybb->settings['gil_image'];
}
$rpgstats['equip'] = $equip;
/*
* Format numbers for output
*/
$rpgstats['lv'] = my_number_format(rpgstats_get_lv($posts));
$rpgstats['hp_curr'] = my_number_format($rpgstats['hp_curr']);
$rpgstats['hp_max'] = my_number_format($rpgstats['hp_max']);
$rpgstats['mp_curr'] = my_number_format($rpgstats['mp_curr']);
$rpgstats['mp_max'] = my_number_format($rpgstats['mp_max']);
$rpgstats['exp'] = my_number_format($rpgstats['exp']);
$rpgstats['exp_next'] = my_number_format($rpgstats['exp_next']);
return $rpgstats;
}
}
// #############################################################################
/*
* Postbit hook function
*/
function rpgstats_postbit($post)
{
global $mybb;
$allowed_groups = explode(',', $mybb->settings['rpgstats_view_by']);
if(in_array($mybb->user['usergroup'], $allowed_groups) || $mybb->settings['rpgstats_view_by'] == -1)
{
if($post['uid'] != 0)
{
global $lang, $templates;
$lang->load('rpgstats');
/*
* Figure out equipment slots and build their equipment field
*/
if($mybb->settings['equip_system_active'] == 1)
{
$equip = explode("\n", $mybb->settings['equip_optionid']);
if(isset($equip) && is_array($equip))
{
foreach($equip as $key => $line)
{
$e[$key] = explode('|', $line);
}
if(isset($e) && is_array($e))
{
$equipment = '';
foreach($e as $attr)
{
if(!isset($post['fid'.intval($attr[1])]) || $post['fid'.intval($attr[1])] == '')
{
$equipment .= '<optgroup label="'.$attr[0].'"><option>'.$lang->equip_empty.'</option></optgroup>';
}
else
{
$equipment .= '<optgroup label="'.$attr[0].'"><option>'.$post['fid'.intval($attr[1])].'</option></optgroup>';
}
}
}
}
}
/*
* Calculate RPG stats for postbit
*/
$rpgstats = rpgstats(
$post['uid'],
$post['postnum'],
$post['fid'.$mybb->settings['hp_damage_field']],
$post['fid'.$mybb->settings['mp_spent_field']],
$post['fid'.$mybb->settings['limit_cent_field']],
$post['fid'.$mybb->settings['limit_name_field']],
$post['fid'.$mybb->settings['element_field']],
$post['fid'.$mybb->settings['gil_field']],
$equipment
);
/*
* Fetch templates for output
*/
if($mybb->settings['limit_system_active'] == 1) eval('$limit_bar = "'.$templates->get('postbit_rpgstats_limit').'";');
if($mybb->settings['element_system_active'] == 1) eval('$element = "'.$templates->get('postbit_rpgstats_element').'";');
if($mybb->settings['gil_system_active'] == 1) eval('$gil = "'.$templates->get('postbit_rpgstats_gil').'";');
if($mybb->settings['equip_system_active'] == 1) eval('$equip = "'.$templates->get('postbit_rpgstats_equip').'";');
eval("\$post['rpgstats'] = \"".$templates->get("postbit_rpgstats")."\";");
return $post;
}
}
}
// #############################################################################
/*
* Turn posts into Exp
*/
function rpgstats_get_exp($posts)
{
$exp = max(($posts - 1), 0);
return $exp;
}
// #############################################################################
/*
* Derive Lv from Exp
*/
function rpgstats_get_lv($posts)
{
$exp = rpgstats_get_exp($posts);
$level = floor(.5 + sqrt(.25 + (2 * $exp)));
$level = $level;
return $level;
}
// #############################################################################
/*
* Return postcount required for next level increase
*/
function rpgstats_get_nextlv($posts)
{
$level = rpgstats_get_lv($posts);
$nextlvl = 0;
$tens = (int) ($level / 10);
for ($t = 0; $t < $tens; $t++) {
$nextlvl += $t * 100 + 55;
}
for ($x = $tens * 10 + 1; $x <= $level; $x++) {
$nextlvl += $x;
}
return $nextlvl;
}
function rpgstats_get_lastlv($posts)
{
$level = rpgstats_get_lv($posts);
$level = $level - 1;
$nextlvl = 0;
$tens = (int) ($level / 10);
for ($t = 0; $t < $tens; $t++) {
$nextlvl += $t * 100 + 55;
}
for ($x = $tens * 10 + 1; $x <= $level; $x++) {
$nextlvl += $x;
}
return $nextlvl;
}
// #############################################################################
/*
* Return stats based on posts, initial values, and coefficients
*/
function rpgstats_get_stats($posts, $stat_ini, $stat_co)
{
$level = rpgstats_get_lv($posts);
$stat = $stat_ini;
$tens = (int) ($level / 10);
for ($t = 0; $t < $tens; $t++) {
$stat += ($stat_co * 10 + 275) + (500 * $t);
}
for ($x = $tens * 10 + 1; $x <= $level; $x++) {
$stat += $stat_co + ($x * 5);
}
$stat = intval($stat /4);
return $stat;
}