Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

PROBLEM


RotimasI

Rekomendowane odpowiedzi

Opublikowano

Mam taki problem z serwerem, strasznie laguje... Mam pliki od Grajkowcy PL(coś takiego) i po wgraniu laguje, niby to przez problem z grzybiarzem ale jak go usunąć? (to nie problem z zasobami, serwer stoi na dość dobrym dedyku)

request.php:

<?php // globals
//include "globals.php";

ini_set('display_errors', '0');     # don't show any errors...
error_reporting(E_ALL | E_STRICT);  # ...but do log them


class SF_Calc {
// 	private $keys = array (
// 			"MyHP" => "\$pers1->getHP()",
// 			"MyMinDmg" => "\$pers1->WeaponMin()",
// 			"MyMaxDmg" => "\$pers1->WeaponMax()",
// 			"MyPrmAttr" => "\pers1->PrimaryAttr()",
// 			"MyRes" => "\$pers1->GetRes(\$pers2)",
// 			"MyArm" => "\$pers1->GetArm(\$pers2)",
// 			"OpHP" => "\$pers2->getHP()",
// 			"OpMinDmg" => "\$pers2->WeaponMin()",
// 			"OpMaxDmg" => "\$pers2->WeaponMax()",
// 			"OpRes" => "\$pers2->GetRes(\$pers1)",
// 			"OpArm" => "\$pers2->GetArm(\$pers1)",
// 			"OpBlock" => "\$pers2->GetBlock(\$pers1)",
// 			"Rnd" => "\$Rnd" 
// 	);
// 	private $test = "( random ( MyMinDmg * ( 1 + ( Rnd - 1 ) * 0.4 ), MyMaxDmg * ( 1 + ( Rnd - 1 ) * 0.4 ) ) ) * ( 1 + ( MyPrmAttr / 10 ) - OpRes ) * ( MyIfCrit ) * ( OpArm ) * ( OpBlock )";
	public static function calculateWin($pers1, $pers2) {
		
		// 0 = nothing | 1 = shield block | 2 = dodge ? | 3 = crit
		$logs = array ();
		
		$begin = rand ( 0, 100 ) < 50 ? TRUE : FALSE;
		
		while ( $pers1->getHP () > 0 && $pers2->getHP () > 0 ) {
			/*
			 * if($n>1 && $n<=4) $damage_k = 1.4; if($n>4 && $n<=6) $damage_k = 1.8; if($n>6)$damage_k += 0.4;
			 */
			if ($begin == FALSE) {
				$log1 = array(0,0,0);
			}else{
				$crit = $pers1->ifCrit ( $pers2->getLvl () );
				$hit = SF_Calc::getRandomDPS ( $pers1, $pers2, 0 ) * $crit * $pers2->getArmor ( $pers1 );
				$log1 = $pers2->setHit($hit, $crit, $pers1);
			}
			
			
			if (( int ) $pers2->getHP () <= 0) {
				$log2 = array(0,0,0);
			} else {
				$crit = $pers2->ifCrit ( $pers1->getLvl () );
				$hit = SF_Calc::getRandomDPS ( $pers2, $pers1, 0 ) * $crit * $pers1->getArmor ( $pers2 );
				$log2 = $pers1->setHit($hit,$crit,$pers2); 
			}
			
			$log1 [0] = $pers1->getHP ();
			$log2 [0] = $pers2->getHP ();
			array_push ( $logs, $log1, $log2 );
			
			$begin = TRUE;
		}
		
		return $logs;
	}
	private static function getRandomDPS($pers1, $pers2, $n) {
		$k = 1; // + ($n - 1) * 0.2;
		$dps = rand ( $pers1->WeaponMin () * $k, $pers1->WeaponMax () * $k );
		
		return max(1,ceil ( $dps ));
		return round ( $dps * (1 + (($pers1->PrimaryAttr ()) / 10) - $pers1->getRes ( $pers2 )) );
	}
}
class Char {
	protected $str;
	protected $dex;
	protected $int;
	protected $wit;
	protected $luck;
	protected $armor;
	protected $dmg;
	protected $class; // 1 - Warior(50), 2 - Mage(10), 3 - Ranger(25)
	protected $lvl;
	protected $hp;
	// db qry res
	protected $items;
	function __construct($db_data) {
		$this->class = $db_data ['class'];
		$this->lvl = $db_data ['lvl'];
		
		// TODO: count in all the items to stats
		$this->str = ( int ) $db_data ['attr_str'];
		$this->dex = ( int ) $db_data ['attr_agi'];
		$this->int = ( int ) $db_data ['attr_int'];
		$this->luck = ( int ) $db_data ['attr_luck'];
		$this->wit = ( int ) $db_data ['attr_wit'];
		
		// stats from items
		$qry = $GLOBALS ['db']->prepare ( "SELECT * FROM items WHERE owner_id = :id AND item_type <= 10 AND slot <= 9" );
		$qry->bindParam ( ':id', $db_data ['user_id'] );
		$qry->execute ();
		$this->items = $qry->fetchAll ();
		
		// 0 = no stat
		$itemStats = array_fill ( 0, 6, 0 );
		
		$potionStat1 = $db_data ['potion_value1'];
		$potionStat2 = $db_data ['potion_value2'];
		$potionStat3 = $db_data ['potion_value3'];
		
		foreach ( $this->items as $item ) {
			$itemStats [$item ['atr_type_1']] += $item ['atr_val_1'];
			$itemStats [$item ['atr_type_2']] += $item ['atr_val_2'];
			$itemStats [$item ['atr_type_3']] += $item ['atr_val_3'];
		}
		
		$this->str += $itemStats [1] + $itemStats [6];
		$this->dex += $itemStats [2] + $itemStats [6];
		$this->int += $itemStats [3] + $itemStats [6];
		$this->wit += $itemStats [4] + $itemStats [6];
		$this->luck += $itemStats [5] + $itemStats [6];
		
		for ($i = 1; $i < 4; $i ++){
		
			switch ($db_data ['potion_id' . $i]){
				case 1:
					$this->str += round($this->str * (5 / 100));
					break;
				case 2:
					$this->dex += round($this->dex * (5 / 100));
					break;
				case 3:
					$this->int += round($this->int *(5 / 100));
					break;
				case 4:
					$this->wit += round($this->wit * (5 / 100));
					break;
				case 5:
					$this->luck += round($this->luck * (15 / 100));
					break;
				case 6:
					$this->str += round($this->str * (15 / 100));
					break;
				case 7:
					$this->dex += round($this->dex * (15 / 100));
					break;
				case 8:
					$this->int += round($this->int * (15 / 100));
					break;
				case 9:
					$this->wit += round($this->wit * (15 / 100));
					break;
				case 10:
					$this->luck += round($this->luck * (25 / 100));
					break;
				case 11:
					$this->str += round($this->str * (25 / 100));
					break;
				case 12:
					$this->dex += round($this->dex * (25 / 100));
					break;
				case 13:
					$this->int += round($this->int * (25 / 100));
					break;
				case 14:
					$this->wit += round($this->wit * (25 / 100));
					break;
				case 15:
					$this->luck += round($this->luck * (25 / 100));
					break;
			}
		}
		// var_dump($this->int);
		
		$this->armor = $character_data [447]; // $character_data [447];
		                  
		// TODO: count out weapon dmg
		$weapon = $this->getWeapon ();
		$this->dmg = new stdClass ();
		$this->dmg->min_damage = $weapon ['dmg_min'] * (1 + $this->getPrimaryStatValue () / 10);
		$this->dmg->max_damage = $weapon ['dmg_max'] * (1 + $this->getPrimaryStatValue () / 10);
		
		switch ($this->class) {
			case 1 :
				$k = 5;
				break;
			case 2 :
				$k = 2;
				break;
			case 3 :
				$k = 4;
				break;
		}
		for ($i = 1; $i < 4; $i ++){
			if ($db_data ['potion_id' . $i] == 16){
				$hpPotionVal = round(($this->wit * $k * ($this->lvl + 1)) / 100 * 25);
			}
		}
		$this->hp = $this->wit * $k * ($this->lvl + 1) + $hpPotionVal;
	}
	public function getPrimaryStatValue() {
		switch ($this->class) {
			case 1 :
				return $this->str;
			case 2 :
				return $this->int;
			case 3 :
				return $this->dex;
		}
	}
	function getClassName() {
		switch ($this->class) {
			case 1 :
				return 'Warior';
				break;
			case 3 :
				return 'Ranger';
				break;
			case 2 :
				return 'Mage';
				break;
		}
	}
	function getClass() {
		switch ($this->class) {
			case 1 :
				return 1;
				break;
			case 3 :
				return 3;
				break;
			case 2 :
				return 2;
				break;
		}
	}
	function getHP() {
		return $this->hp;
	}
	function WeaponMin() {
		return $this->dmg->min_damage;
	}
	function WeaponMax() {
		return $this->dmg->max_damage;
	}
	function PrimaryAttr() {
		switch ($this->class) {
			case 1 :
				return $this->str;
				break;
			case 2 :
				return $this->int;
				break;
			case 3 :
				return $this->dex;
				break;
		}
	}
	function PrimaryAttrTitle() {
		switch ($this->class) {
			case 1 :
				return "Str";
				break;
			case 2 :
				return "Int";
				break;
			case 3 :
				return "Dex";
				break;
		}
	}
	function getStr() {
		return $this->str;
	}
	function getInt() {
		return $this->int;
	}
	function getDex() {
		return $this->dex;
	}
	function getWit() {
		return $this->wit;
	}
	function getLuck() {
		return $this->luck;
	}
	function ifCrit($oponent_lvl) {
		$rand = rand ( 0, 10000 );
		$k = 1;
		$krit = $this->luck * 5 / ($oponent_lvl * 2);
		if ($krit > 50)
			$krit = 50;
		$krit = $krit * 100;
		if ($rand < $krit)
			$k = 2;
		return $k;
	}
	// TODO:returns log array
	function setHit($hit, $crit, $op) {
		$crit = $crit == 2 ? 3 : 0;
		
		if ($op->getClass () != "2") {
			if ($this->getClass () == "3") {
				$rand = rand ( 0, 100 );
				if ($rand > 50) {
					$hit = 0;
					$crit = 2;
				}
			} else if ($this->getClass () == "1") {
				$rand = rand ( 0, 100 );
				if ($rand > 25 && $this ->hasShield() != 0) {
					$crit = 1;
					$hit = 0;
				}
			}
		}
		
		$this->hp = $this->hp - $hit;
		$ret = array (
				0,
				$hit,
				$crit 
		);
		
		return $ret;
	}
	function getLvl() {
		return $this->lvl;
	}
	function getBlock($oponent) {
		// TODO
	}
	function getArmor($oponent) {
		$armor = $this->armor / $oponent->getLvl ();
		if ($this->class == 1 && $armor > 50)
			$armor = 50;
		if ($this->class == 2 && $armor > 10)
			$armor = 10;
		if ($this->class == 3 && $armor > 25)
			$armor = 25;
		if ($oponent->getClass () == 2)
			return 1;
		else
			return 1 - ($armor / 100);
	}
	function getRes($oponent) {
		// return 0;
		if ($this->class == $oponent->getClass ()) {
			return 0;
		} else {
			$attr = "get" . $this->PrimaryAttrTitle ();
			return $oponent->$attr () / 20;
		}
	}
	// public function getPrimaryAttr() {
	// switch ($this->class) {
	// case 1 :
	// return $this->str;
	// case 2 :
	// return $this->int;
	// case 3 :
	// return $this->dex;
	// }
	// }
	public function getWeapon() {
		if (isset ( $this->items )) {
			foreach ( $this->items as $item ) {
				if ($item ['slot'] == 8)
					return $item;
			}
		}
		
		return array (
				"item_type" => 0,
				"item_id" => 0,
				"dmg_min" => 1,
				"dmg_max" => 2,
				"atr_type_1" => 0,
				"atr_type_2" => 0,
				"atr_type_3" => 0,
				"atr_val_1" => 0,
				"atr_val_2" => 0,
				"atr_val_3" => 0,
				"gold" => 0,
				"mush" => 0 
		);
	}
	public function getWeaponId() {
		$weap = $this->getWeapon ();
		$weap = ( int ) $weap ['item_id'];
		return $weap;
	}
	public function hasWeapon() {
		if (isset ( $this->items )) {
			foreach ( $this->items as $item ) {
				if ($item ['slot'] == 8)
					return 1;
			}
		}
		
		// move to Monster class
// 		if ($this->class == 1)
// 			return '0';
		
		return 0;
	}
	// returns 2 if has shield, 0 if not
	public function hasShield() {
		if (isset ( $this->items )) {
			foreach ( $this->items as $item ) {
				if ($item ['slot'] == 9) {
					return 2;
				}
			}
		}
		return 0;
	}
	public function getShield() {
		if (isset ( $this->items )) {
			foreach ( $this->items as $item ) {
				if ($item ['slot'] == 9) {
					return $item;
				}
			}
		}
		return array (
				"item_type" => 0,
				"item_id" => 0,
				"dmg_min" => 1,
				"dmg_max" => 2,
				"atr_type_1" => 0,
				"atr_type_2" => 0,
				"atr_type_3" => 0,
				"atr_val_1" => 0,
				"atr_val_2" => 0,
				"atr_val_3" => 0,
				"gold" => 0,
				"mush" => 0 
		);
	}
}
class Monster extends Char {
	
	// pic id
	private $id;
	
	// expierience from the monster
	private $exp;
	
	// gold from the monster
	private $silver;
	
	// weapon id
	private $weapid;
	
	// override constructor
	function __construct($lvl, $class, $str, $agi, $int, $wit, $luck, $dmg_min, $dmg_max, $hp, $armor, $id, $exp, $weapon_id) {
		$this->class = $class;
		$this->lvl = $lvl;
		$this->id = $id;
		
		// TODO: exp & gold
		$this->exp = $exp / 15 * 5 * rand(3,4);
		$this->silver = $lvl * rand(5000, 10000);
		
		$this->str = $str;
		$this->dex = $agi;
		$this->int = $int;
		$this->luck = $luck;
		$this->wit = $wit;
		$this->armor = $armor;
		
		// weapon && dmg
		$this->weapid = $weapon_id;
		$this->dmg = new stdClass ();
		$this->dmg->min_damage = $dmg_min;
		$this->dmg->max_damage = $dmg_max;
		
		$this->hp = $hp;
	}
	function getId() {
		return $this->id;
	}
	function getExp() {
		return $this->exp;
	}
	function getGold() {
		return $this->silver;
	}
	public function hasWeapon() {
		// if ($this->weapid > 0)
		// return 1;
		// else if ($this->weapid < 0)
		// return - 1;
		// return 0;
		return $this->weapid <= 0 ? $this->weapid : 1;
	}
	public function getWeaponId() {
		return $this->weapid;
	}
	public function getWeapon() {
		return array (
				"item_type" => 8,
				"item_id" => $this->weapid,
				"dmg_min" => 1,
				"dmg_max" => 2,
				"atr_type_1" => 1,
				"atr_type_2" => 0,
				"atr_type_3" => 0,
				"atr_val_1" => 1,
				"atr_val_2" => 0,
				"atr_val_3" => 0,
				"gold" => 0,
				"mush" => 0 
		);
	}
	public function hasShield(){
// 		if($this->class == 1)
// 			return 2;
		return 0;
	}
	public function getShield(){
		$ret = array (
				"item_type" => 0,
				"item_id" => 0,
				"dmg_min" => 0,
				"dmg_max" => 0,
				"atr_type_1" => 1,
				"atr_type_2" => 0,
				"atr_type_3" => 0,
				"atr_val_1" => 1,
				"atr_val_2" => 0,
				"atr_val_3" => 0,
				"gold" => 0,
				"mush" => 0 
		);
		
// 		if($this -> class == 1){
// 			$ret['item_type'] = 2;
// 			$ret['item_id'] = 5;
// 		}
		
		return $ret;
	}
}
function getQuestMonster($db_data){
	$OP_lvl = $db_data['lvl'] + rand(1, 10);
	$OP_class = rand (1, 3);
	$p = new Char ( $db_data );
	$weap = $p->getWeapon ();
	$hp = $p->getHP();
	switch ($OP_class){
		case 1:
			switch ($db_data['class']){
				case 1:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_str'] / 5, $db_data['attr_str'] / 2);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_agi'] / 8, $db_data['attr_agi'] / 5);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_str'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_str'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
				case 2:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_agi'] / 5, $db_data['attr_agi'] / 2);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_str'] / 8, $db_data['attr_str'] / 5);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_str'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_str'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
				case 3:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_agi'] / 8, $db_data['attr_agi'] / 5);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_str'] / 8, $db_data['attr_str'] / 5);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_str'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_str'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
			}
			
		case 2:
			switch ($db_data['class']){
				case 1:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_agi'] / 8, $db_data['attr_agi'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_str'] / 5, $db_data['attr_str'] / 2);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_agi'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_agi'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
				case 2:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_str'] / 8, $db_data['attr_str'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_agi'] / 5, $db_data['attr_agi'] / 2);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_agi'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_agi'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
				case 3:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_str'] / 8, $db_data['attr_str'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_int'] / 5, $db_data['attr_int'] / 2);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_agi'] / 8, $db_data['attr_agi'] / 5);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_agi'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_agi'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
			}
				
		case 3:
			switch ($db_data['class']){
				case 1:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_agi'] / 8, $db_data['attr_agi'] / 5);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_str'] / 5, $db_data['attr_str'] / 2);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_int'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_int'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
				case 2:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_str'] / 8, $db_data['attr_str'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_int'] / 8, $db_data['attr_int'] / 5);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_agi'] / 5, $db_data['attr_agi'] / 2);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_int'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_int'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
				case 3:
					$OP_str = $db_data['attr_str'] + rand($db_data['attr_str'] / 8, $db_data['attr_str'] / 5);
					$OP_agi = $db_data['attr_agi'] + rand($db_data['attr_agi'] / 8, $db_data['attr_agi'] / 5);
					$OP_int = $db_data['attr_int'] + rand($db_data['attr_int'] / 5, $db_data['attr_int'] / 2);
					$OP_wit = $db_data['attr_wit'] + rand($db_data['attr_wit'] / 6, $db_data['attr_wit'] / 4);
					$OP_luck = $db_data['attr_luck'] + rand($db_data['attr_luck'] / 5, $db_data['attr_luck'] / 2);
					$OP_minDmg = $weap['dmg_min'] + rand($weap['dmg_min'] / 12, $weap['dmg_min'] / 6) + $db_data['attr_int'];
					$OP_maxDmg = $weap['dmg_max'] + rand($weap['dmg_max'] / 12, $weap['dmg_max'] / 6) + $db_data['attr_int'];
					$OP_health = $hp + rand($hp / 7, $hp / 4);
					
			}
		}
	if ($db_data ['lvl'] > 19){
		return new Monster ( $OP_lvl, $OP_class, round($OP_str), round($OP_agi), round($OP_int), round($OP_wit), round($OP_luck), round($OP_minDmg), round($OP_maxDmg), $OP_health, 1, rand(1, 158), 1287, - 2 );
	} else {
		return new Monster ( $db_data['lvl'] + rand(1, 4), rand(1, 3), round($db_data['attr_str'] / rand(2, 3)),  round($db_data['attr_agi'] / rand(2, 3)),  round($db_data['attr_int'] / rand(2, 3)),  round($db_data['attr_wit'] / rand(2, 3)),  round($db_data['attr_luck'] / rand(2, 3)), $weap['dmg_min'] / 2, $weap['dmg_max'] / 2, $OP_health, 1, rand(1, 158), 1287, - 2 );
	}
}
function getDungMonster($dung, $stage, $db_data) {
	$stage -= 1;
	
	if ($stage < 1)
		$stage = 1;
	else if ($stage > 10)
		$stage = 10;
		// echo $dung . " - " .$stage."<br>";
	
	switch ($dung) {
		case 1 :
			switch ($stage) {
				case 1 :
					return new Monster ( 10, 2, 48, 52, 104, 77, 470, 342, 513, 1694, 85, 129, 1287, - 2 );
				case 2 :
					return new Monster ( 12, 1, 120, 6, 59, 101, 51, 208, 312, 6565, 510, 112, 1785, - 1 );
				case 3 :
					return new Monster ( 14, 1, 149, 78, 69, 124, 65, 302, 445, 9300, 595, 6, 2395, - 1 );
				case 4 :
					return new Monster ( 16, 3, 84, 195, 83, 131, 94, 554, 820, 8908, 340, 84, 3146, - 1 );
				case 5 :
					return new Monster ( 18, 1, 97, 99, 303, 198, 137, 2097, 3130, 9108, 187, 31, 4050, - 1 );
				case 6 :
					return new Monster ( 22, 2, 97, 99, 303, 198, 137, 2097, 3130, 9108, 187, 74, 6412, - 2 );
				case 7 :
					return new Monster ( 26, 1, 359, 135, 122, 260, 142, 1292, 1956, 35100, 1105, 116, 9631, 24 );
				case 8 :
					return new Monster ( 30, 2, 126, 130, 460, 279, 193, 4277, 6439, 17298, 255, 114, 13952, 1004 );
				case 9 :
					return new Monster ( 40, 1, 614, 207, 191, 445, 238, 3370, 5054, 91225, 1700, 4, 30909, - 1 );
				case 10 :
					return new Monster ( 50, 3, 221, 847, 213, 561, 292, 7284, 10884, 114444, 1065, 166, 60343, - 1 );
			}
		case 2 :
			switch ($stage) {
				case 1 :
					return new Monster ( 20, 3, 101, 264, 101, 174, 119, 932, 1397, 14616, 425, 131, 2124, - 1 );
				case 2 :
					return new Monster ( 24, 1, 317, 126, 117, 238, 130, 1046, 1570, 29750, 1020, 38, 7909, - 5 );
				case 3 :
					return new Monster ( 28, 1, 393, 138, 125, 284, 152, 1531, 2297, 41180, 1190, 112, 11652, - 1 );
				case 4 :
					return new Monster ( 34, 3, 143, 554, 144, 303, 216, 3215, 4850, 42420, 722, 86, 19539, - 1 );
				case 5 :
					return new Monster ( 38, 1, 592, 178, 162, 398, 195, 3070, 4635, 77610, 1615, 51, 26652, - 1 );
				case 6 :
					return new Monster ( 44, 2, 191, 190, 780, 411, 259, 10586, 15879, 36990, 374, 102, 40886, - 2 );
				case 7 :
					return new Monster ( 48, 1, 744, 243, 230, 563, 246, 4901, 7314, 137935, 2040, 23, 53228, - 4 );
				case 8 :
					return new Monster ( 56, 3, 250, 960, 240, 680, 345, 9215, 13774, 155040, 1190, 67, 86309, 9 );
				case 9 :
					return new Monster ( 66, 3, 300, 1160, 290, 880, 420, 13104, 19656, 233840, 1420, 92, 148282, 8 );
				case 10 :
					return new Monster ( 70, 1, 1240, 385, 360, 960, 340, 11875, 17750, 340800, 2975, 169, 181085, -2 );
			}
		case 3 :
			switch ($stage) {
				case 1 :
					return new Monster ( 32, 3, 155, 486, 161, 276, 205, 2678, 4018, 36432, 680, 28, 16557, -1 );
				case 2 :
					return new Monster ( 36, 3, 141, 602, 149, 344, 230, 3733, 5569, 50912, 765, 3, 22893, -1 );
				case 3 :
					return new Monster ( 42, 3, 205, 726, 224, 403, 247, 5226, 7875, 69316, 892, 57, 35642, -1 );
				case 4 :
					return new Monster ( 54, 1, 920, 265, 240, 640, 260, 6789, 10230, 176000, 2295, 94, 46757, 9 );
				case 5 :
					return new Monster ( 46, 1, 768, 215, 183, 539, 249, 4824, 7235, 126665, 1955, 140, 76872, 7 );
				case 6 :
					return new Monster ( 60, 3, 270, 1040, 260, 760, 375, 10710, 16065, 185440, 1275, 78, 108013, -1 );
				case 7 :
					return new Monster ( 64, 1, 1120, 340, 315, 840, 310, 9831, 14690, 273000, 2720, 93, 133734, 9 );
				case 8 :
					return new Monster ( 76, 3, 350, 1360, 340, 1080, 495, 17673, 26441, 332640, 1615, 162, 240784, -1 );
				case 9 :
					return new Monster ( 86, 1, 1560, 505, 480, 1280, 420, 18212, 27475, 556800, 3655, 142, 374041, 7 );
				case 10 :
					return new Monster ( 90, 1, 1640, 535, 510, 1360, 440, 20130, 30195, 618800, 3825, 170, 441608, 50 );
			}
		case 4 :
			switch ($stage) {
				case 1 :
					return new Monster ( 52, 3, 230, 880, 220, 601, 315, 7832, 11748, 127412, 1105, 124, 68234, -2 );
				case 2 :
					return new Monster ( 58, 3, 260, 1000, 250, 720, 360, 9898, 14847, 169920, 1232, 45, 96706, 7);
				case 3 :
					return new Monster ( 62, 1, 1080, 325, 300, 800, 300, 9156, 13734, 252000, 2635, 94, 120287, 9 );
				case 4 :
					return new Monster ( 68, 1, 1200, 370, 345, 920, 330, 11132, 16698, 317400, 2890, 107, 163994, -1);
				case 5 :
					return new Monster ( 74, 1, 1320, 415, 390, 1040, 360, 13300, 19950, 390000, 3145, 46, 163994, 21);
				case 6 :
					return new Monster ( 82, 3, 380, 1480, 370, 1200, 540, 20711, 31141, 398400, 1742, 39, 315135, 9 );
				case 7 :
					return new Monster ( 84, 1, 1520, 490, 465, 1240, 410, 17442, 26163, 527000, 3570, 141, 343618, 7 );
				case 8 :
					return new Monster ( 102, 3, 480, 1880, 470, 1600, 690, 32697, 49140, 659200, 2167, 47, 560797, 21);
				case 9 :
					return new Monster ( 96, 1, 1760, 580, 555, 1480, 470, 23010, 34515, 717800, 4080, 137, 704509, -1);
				case 10 :
					return new Monster ( 110, 3, 520, 2040, 510, 1760, 750, 38335, 57400, 781440, 2337, 172, 940791, 24);
			}
		case 5 :
			switch ($stage) {
				case 1 :
					return new Monster ( 72, 3, 330, 1280, 320, 1000, 465, 15738, 23607, 292000, 1530, 9, 199497, -1);
				case 2 :
					return new Monster ( 78, 3, 360, 1400, 350, 1120, 510, 18612, 27918, 353920, 1657, 150, 263817, 27);
				case 3 :
					return new Monster ( 80, 3, 370, 1440, 360, 1160, 525, 19720, 29580, 375840, 1700, 36, 288496, -1);
				case 4 :
					return new Monster ( 88, 3, 410, 1600, 400, 1320, 585, 23989, 36064, 469920, 1870, 153, 406744, 27);
				case 5 :
					return new Monster ( 94, 1, 1720, 565, 540, 1440, 460, 21971, 33043, 684000, 3995, 17, 518518, -1);
				case 6 :
					return new Monster ( 100, 3, 470, 1840, 460, 1560, 675, 31450, 47175, 630240, 2125, 151, 653687, 27);
				case 7 :
					return new Monster ( 108, 1, 2000, 670, 645, 1720, 530, 29346, 44220, 937400, 4590, 161, 876584, -1);
				case 8 :
					return new Monster ( 114, 2, 520, 540, 2200, 1760, 775, 76908, 115583, 404800, 969, 118, 1081088, -1);
				case 9 :
					return new Monster ( 122, 1, 2280, 775, 750, 2000, 600, 37785, 56792, 1230000, 5185, 160, 1412064, -1);
				case 10 :
					return new Monster ( 130, 3, 620, 2440, 610, 2160, 900, 54145, 81095, 1131840, 2762, 171, 1821461, 20);
			}
		case 6 :
			switch ($stage) {
				case 1 :
					return new Monster ( 92, 1, 1680, 550, 525, 1400, 450, 21125, 31603, 651000, 3910, 128, 478738, -1);
				case 2 :
					return new Monster ( 98, 3, 460, 1800, 450, 1520, 660, 30046, 45069, 601920, 2082, 86, 605700, -1);
				case 3 :
					return new Monster ( 104, 2, 470, 490, 2000, 1560, 700, 63918, 95877, 327600, 884, 77, 758451, -1);
				case 4 :
					return new Monster ( 106, 3, 500, 1960, 490, 1680, 720, 35460, 53190, 719040, 2252, 81, 815853, -3);
				case 5 :
					return new Monster ( 118, 3, 560, 2200, 520, 1920, 810, 44200, 66300, 913920, 2507, 89, 1237696, -1);
				case 6 :
					return new Monster ( 124, 1, 2320, 790, 765, 2040, 610, 39144, 58716, 1275000, 5270, 16, 1506706, -1);
				case 7 :
					return new Monster ( 128, 3, 610, 2400, 600, 2120, 885, 52297, 78566, 1093920, 2720, 88, 1710914, -1);
				case 8 :
					return new Monster ( 136, 2, 630, 650, 2640, 2200, 940, 110240, 165360, 602800, 1156, 30, 2187846, -1);
				case 9 :
					return new Monster ( 144, 3, 690, 2720, 680, 2440, 1005, 66612, 100191, 1415200, 3060, 87, 2767832, -1);
				case 10 :
					return new Monster ( 150, 3, 720, 2840, 710, 2560, 1050, 72675, 108870, 1546240, 3187, 167, 3280697, -1);
			}
		case 7 :
			switch ($stage) {
				case 1 :
					return new Monster ( 112, 3, 530, 2080, 520, 1800, 765, 39710, 59565, 813600, 2380, 66, 1009041, -1);
				case 2 :
					return new Monster ( 116, 3, 550, 2160, 540, 1880, 795, 42749, 64015, 879840, 2465, 97, 1157092, -1);
				case 3 :
					return new Monster ( 120, 2, 550, 570, 2320, 1880, 820, 85511, 128150, 454960, 1020, 82, 1322625, -3); 
				case 4 :
					return new Monster ( 126, 1, 2360, 805, 780, 2080, 620, 40527, 60909, 1320800, 5355, 52, 1606255, -6 );
				case 5 :
					return new Monster ( 138, 1, 2600, 895, 870, 2320, 680, 48807, 73341, 1612400, 5865, 158, 2059369, -1);
				case 6 :
					return new Monster ( 134, 1, 2520, 865, 840, 2240, 660, 46046, 69069, 1512000, 5695, 135, 2322552, -1);
				case 7 :
					return new Monster ( 142, 2, 660, 680, 2760, 2320, 985, 120218, 180327, 663520, 1207, 102, 2612278, -2);
				case 8 :
					return new Monster ( 146, 1, 2760, 955, 930, 2480, 720, 54846, 82269, 1822800, 6205, 52, 2930646, -6 );
				case 9 :
					return new Monster ( 148, 1, 2800, 970, 945, 2520, 730, 56481, 84581, 1877400, 6290, 149, 3101774, -1);
				case 10 :
					return new Monster ( 170, 1, 3240, 1135, 1110, 2960, 840, 75075, 112450, 2530800, 7225, 168, 5583708, -6 );
			}
		case 8 :
			switch ($stage) {
				case 1 :
					return new Monster ( 132, 1, 2480, 850, 825, 2200, 650, 44571, 66981, 1463000, 5610, 38, 1937541,-5);
				case 2 :
					return new Monster ( 140, 3, 670, 2640, 660, 2360, 975, 63070, 94605, 1331040, 2975, 143, 2463717, -2);
				case 3 :
					return new Monster ( 154, 1, 2920, 1015, 990, 2640, 760, 61237, 92002, 2046000, 6545, 147, 3663979, -1);
				case 4 :
					return new Monster ( 158, 3, 760, 3000, 750, 2720, 1110, 80668, 121002, 1729920, 3357, 144, 4082943, -2);
				case 5 :
					return new Monster ( 164, 3, 790, 3120, 780, 2840, 1155, 87014, 130834, 1874400, 3485, 99, 4785109, -1);
				case 6 :
					return new Monster ( 168, 2, 790, 810, 3280, 2840, 1180, 169106, 253659, 959920, 1428, 154, 5306545, -3);
				case 7 :
					return new Monster ( 172, 1, 3280, 1150, 1125, 3000, 850, 76657, 115150, 2595000, 7310, 146, 5873522, -1);
				case 8 :
					return new Monster ( 180, 3, 870, 3340, 860, 3160, 1275, 102510, 153765, 2287840, 3825, 98, 7157815, -1);
				case 9 :
					return new Monster ( 185, 2, 875, 895, 3620, 3180, 1305, 205458, 308187, 1182960, 1572, 156, 8070081, -3);
				case 10 :
					return new Monster ( 200, 2, 950, 970, 3920, 3480, 1410, 240516, 360774, 1398960, 1700, 164, 11412835, 2051 );
			}
		case 9 :
			switch ($stage) {
				case 1 :
					return new Monster ( 152, 1, 2880, 1000, 975, 2600, 750, 59534, 89590, 1989000, 6460, 136, 3467701,-1);
				case 2 :
					return new Monster ( 156, 2, 730, 750, 3040, 2600, 1090, 145485, 218380, 816400, 1326, 125, 3868959, -2);
				case 3 :
					return new Monster ( 160, 3, 770, 3040, 760, 2760, 1125, 82960, 124440, 1777440, 3400, 99, 4307201, -1);
				case 4 :
					return new Monster ( 162, 1, 3080, 1075, 1050, 2800, 800, 67980, 101970, 2282000, 6885, 37, 4541147, -5 );
				case 5 :
					return new Monster ( 166, 2, 780, 800, 3240, 2800, 1165, 164775, 247325, 935200, 1411, 129, 5040468, -2);
				case 6 :
					return new Monster ( 174, 1, 3320, 1165, 1140, 3040, 860, 78588, 117882, 2660000, 7395, 138, 6175189, 2004 );
				case 7 :
					return new Monster ( 176, 3, 850, 3360, 840, 3080, 1245, 100763, 150976, 2180640, 3740, 90, 6489101, 8 );
				case 8 :
					return new Monster ( 178, 3, 860, 3400, 850, 3120, 1260, 102982, 154473, 2233920, 3782, 42, 6816906, 9 );
				case 9 :
					return new Monster ( 190, 2, 900, 920, 3720, 3280, 1340, 216713, 325256, 1252960, 1615, 74, 9081081, -2 );
				case 10 :
					// TODO: MIRROR
					
					$p = new Char ( $db_data );
					$weap = $p->getWeapon ();
					return new Monster ( $db_data['lvl'], $db_data['class'], $p->getStr (), $p->getDex (), $p->getInt(), $p->getWit (), $p->getLuck (), $weap['dmg_min'], $weap['dmg_max'], getHp ( $db_data ), 11, - 1, 13322552, $p->getWeaponId () );
			}
		case 10 :
			switch ($stage) {
				case 1 :
					return new Monster ( 205, 3, 995, 3940, 985, 3660, 1450, 137460, 206190, 3015840, 4356, 101, 12751538, 24);
				case 2 :
					return new Monster ( 210, 1, 4040, 1420, 1395, 3760, 1010, 115425, 173340, 3966800, 8925, 115, 14222021, 24);
				case 3 :
					return new Monster ( 215, 1, 4140, 1455, 1430, 3860, 1030, 121180, 181770, 4168800, 9137, 159, 15824529, 13);
				case 4 :
					return new Monster ( 220, 1, 4240, 1490, 1465, 3960, 1050, 127075, 190400, 4375800, 9350, 21, 17581974, -4 );//patyk?
				case 5 :
					return new Monster ( 225, 3, 1095, 4340, 1085, 4060, 1590, 166170, 249255, 3670240, 4781, 61, 19491852, -1);
				case 6 :
					return new Monster ( 230, 3, 1120, 4440, 1110, 4160, 1615, 173995, 260770, 3843840, 4887, 163, 21576743, -1);
				case 7 :
					return new Monster ( 235, 2, 1125, 1145, 4620, 4180, 1655, 332897, 499114, 1972960, 1997, 161, 23839326, -1);
				case 8 :
					return new Monster ( 240, 1, 4640, 1630, 1605, 4360, 1130, 151590, 227385, 5253800, 10200, 159, 26302843, 13);
				case 9 :
					return new Monster ( 245, 1, 4740, 1665, 1640, 4460, 1150, 158175, 237025, 5485800, 10412, 158, 28966329, -1);
				case 10 :
					return new Monster ( 250, 1, 4840, 1700, 1675, 4560, 1170, 164900, 247350, 5722800, 10625, 165, 31862139, 10);
			}
		case 11 :
			switch ($stage) {
				case 1 :
					return new Monster ( 255, 1, 4940, 1735, 1710, 4660, 1190, 171270, 257400, 5964800, 10837, 173, 34985806, 20 );
				case 2 :
					return new Monster ( 260, 3, 1270, 5040, 1260, 4760, 1835, 223210, 334815, 4969440, 5525, 174, 38369989, 7 );
				case 3 :
					return new Monster ( 265, 1, 5140, 1805, 1780, 4860, 1230, 185400, 278100, 6463800, 11262, 175, 42016588, 12);
				case 4 :
					return new Monster ( 270, 1, 5240, 1840, 1815, 4960, 1250, 192675, 288750, 6720800, 11475, 176, 45958126, 6 );
				case 5 :
					return new Monster ( 275, 2, 1325, 1345, 5420, 4980, 1935, 456663, 685266, 2748960, 2337, 177, 50191950,-1 );
				case 6 :
					return new Monster ( 280, 3, 1370, 5440, 1360, 5160, 1975, 259420, 389130, 5799840, 5950, 178, 54764133, -4 );//patyk
				case 7 :
					return new Monster ( 285, 1, 5540, 1945, 1920, 5260, 1310, 214785, 322455, 7521800, 12112, 179, 59666036, 20 );
				case 8 :
					return new Monster ( 290, 3, 1420, 5640, 1410, 5360, 2045, 278545, 417535, 6239040, 6162, 180, 64942539, 29 );
				case 9 :
					return new Monster ( 295, 2, 1425, 1445, 5820, 5380, 2075, 525866, 789382, 3184960, 2507, 181, 70595045, 6 );
				case 10 :
					return new Monster ( 300, 1, 5840, 2050, 2025, 5560, 1370, 238680, 358020, 8367800, 12750, 182, 76669139, -1 );
			}
		case 12 :
			switch ($stage) {
				case 1 :
					return new Monster ( 305, 2, 1475, 1495, 6020, 5580, 2145, 562599, 843597, 3414960, 2592, 183, 83158305, -1 );
				case 2 :
					return new Monster ( 310, 2, 1500, 1520, 6120, 5680, 2180, 581124, 871686, 3532960, 2635, 184, 90125436, -1 );
				case 3 :
					return new Monster ( 315, 1, 6140, 2155, 2130, 5860, 1430, 263220, 394830, 9258800, 13387, 185, 97556858, -1 );
				case 4 :
					return new Monster ( 320, 3, 1570, 6240, 1560, 5960, 2255, 340000, 510000, 7652640, 6800, 186, 105514978, -5 );//splash
				case 5 :
					return new Monster ( 325, 2, 1575, 1595, 6420, 5980, 2285, 639142, 958713, 3898960, 2762, 187, 113997992, -1 );
				case 6 :
					return new Monster ( 330, 1, 6440, 2260, 2235, 6160, 1490, 288960, 434085, 10194800, 14025, 188, 123067419,30 );
				case 7 :
					return new Monster ( 335, 3, 1645, 6540, 1635, 6260, 2360, 372695, 559370, 8413440, 7118, 189, 132712488, -1 );
				case 8 :
					return new Monster ( 340, 1, 6640, 2330, 2305, 6360, 1530, 307230, 460845, 10843800, 14450, 190, 143018630, -5 );//splash
				case 9 :
					return new Monster ( 345, 1, 6740, 2365, 2340, 6460, 1150, 316575, 474525, 11175800, 14662, 191, 153964246, 53 );
				case 10 :
					return new Monster ( 350, 1, 6840, 2400, 2375, 6560, 1570, 326060, 489090, 11512800, 14875, 192, 165631756, 51 );
			}
		case 13 :
			switch ($stage) {
				case 1 :
					return new Monster ( 355, 1, 7570, 2655, 2630, 7290, 1716, 365356, 548792, 12976200, 15087, 243, 178017293, -1);
				case 2 :
					return new Monster ( 360, 2, 1970, 1990, 8000, 7560, 2838, 881901, 1323252, 5458320, 3060, 244, 191202824, 1003 );
				case 3 :
					return new Monster ( 365, 1, 8290, 2908, 2882, 8010, 1860, 411680, 617520, 14658300, 15512, 245, 205171015, -1);
				case 4 :
					return new Monster ( 370, 2, 2160, 2180, 8760, 8320, 3104, 992764, 1489146, 6173440, 3145, 246, 220033230, 1008 );
				case 5 :
					return new Monster ( 375, 1, 9340, 3275, 3250, 9060, 2070, 476850, 715275, 17032800, 15937, 247, 235758967, 0 ); //fist
				case 6 :
					return new Monster ( 380, 3, 2682, 10690, 2672, 10410, 3812, 691220, 1036830, 15864840, 8075, 248, 252458197, 2056 );//luk rakieta
				case 7 :
					return new Monster ( 385, 2, 2888, 2908, 11670, 11230, 4122, 1375904, 2063856, 8669560, 3272, 249, 270120546, 1056 );//gitara
				case 8 :
					return new Monster ( 390, 1, 12540, 4395, 4370, 12260, 2710, 665150, 997725, 23968300, 16575, 250, 288853442, 55 );
				case 9 :
					return new Monster ( 395, 1, 13540, 4724, 4720, 13260, 2910, 727635, 1090775, 26254800, 16787, 251, 308630400, 11 );
				case 10 :
					return new Monster ( 400, 1, 16840, 5900, 5875, 16540, 3570, 916640, 1374960, 33162700, 17000, 252, 329599075, 22 );
			}
	}
}

function getTowerMonster($stage, $db_data) {
		switch ($stage) {
			case 1 :
				return new Monster ( (198 + 2 * $stage), 1, 4194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, (399 + $stage), 178017293, -1);
			case 2 :
				return new Monster ( (198 + 2 * $stage), 2, 1714, 1682, 4240, 4034, 2621, 365356, 548792, 6551216, 15087, (399 + $stage), 178017293, -1);
			case 3 :
				return new Monster ( (198 + 2 * $stage), 3, 1733, 4288, 1696, 4081, 2655, 365356, 548792, 13385680, 15087, (399 + $stage), 178017293, -1);
			case 4 :
				return new Monster ( (198 + 2 * $stage), 1, 4340, 1746, 1715, 4128, 2690, 365356, 548792, 17089920, 15087, (399 + $stage), 178017293, -1);
			case 5 :
				return new Monster ( (198 + 2 * $stage), 1, 4385, 1763, 1733, 4178, 2726, 365356, 548792, 17464040, 15087, (399 + $stage), 178017293, -1);
			case 6 :
				return new Monster ( (198 + 2 * $stage), 2, 1780, 1750, 4434, 4228, 2756, 365356, 548792, 7136864, 15087, (399 + $stage), 178017293, -1);
			case 7 :
				return new Monster ( (198 + 2 * $stage), 1, 4482, 1794, 1766, 4275, 2790, 365356, 548792, 18211500, 15087, (399 + $stage), 178017293, -1);
			case 8 :
				return new Monster ( (198 + 2 * $stage), 2, 1811, 1784, 4532, 4321, 2826, 365356, 548792, 7432120, 15087, (399 + $stage), 178017293, -1);
			case 9 :
				return new Monster ( (198 + 2 * $stage), 2, 1828, 1804, 4577, 4370, 2857, 365356, 548792, 7586320, 15087, (399 + $stage), 178017293, -1);
			case 10 :
				return new Monster ( (198 + 2 * $stage), 1, 4627, 1847, 1818, 4420, 2891, 365356, 548792, 19359600, 15087, (399 + $stage), 178017293, -1);
			case 11 :
				return new Monster ( (198 + 2 * $stage), 2, 1864, 1835, 4678, 4463, 2925, 365356, 548792, 7890584, 15087, (399 + $stage), 178017293, -1);
			case 12 :
				return new Monster ( (198 + 2 * $stage), 2, 1877, 1853, 4721, 4513, 2960, 365356, 548792, 8051192, 15087, (399 + $stage), 178017293, -1);
			case 13 :
				return new Monster ( (198 + 2 * $stage), 1, 4771, 1898, 1869, 4561, 2991, 365356, 548792, 20524500, 15087, (399 + $stage), 178017293, -1);
			case 14 :
				return new Monster ( (198 + 2 * $stage), 1, 4820, 1909, 1887, 4610, 3027, 365356, 548792, 20929400, 15087, (399 + $stage), 178017293, -1);
			case 15 :
				return new Monster ( (198 + 2 * $stage), 1, 4870, 1928, 1907, 4655, 3060, 365356, 548792, 21319900, 15087, (399 + $stage), 178017293, -1);
			case 16 :
				return new Monster ( (198 + 2 * $stage), 2, 1943, 1925, 4914, 4705, 3092, 365356, 548792, 8694840, 15087, (399 + $stage), 178017293, -1);
			case 17 :
				return new Monster ( (198 + 2 * $stage), 1, 4964, 1962, 1940, 4755, 3126, 365356, 548792, 22158300, 15087, (399 + $stage), 178017293, -1);
			case 18 :
				return new Monster ( (198 + 2 * $stage), 3, 1976, 5013, 1958, 4800, 3163, 365356, 548792, 18048000, 15087, (399 + $stage), 178017293, -1);
			case 19 :
				return new Monster ( (198 + 2 * $stage), 1, 5059, 1993, 1975, 4848, 3198, 365356, 548792, 22979520, 15087, (399 + $stage), 178017293, -1);
			case 20 :
				return new Monster ( (198 + 2 * $stage), 3, 2010, 5107, 1992, 4897, 3228, 365356, 548792, 18726128, 15087, (399 + $stage), 178017293, -1);
			case 21 :
				return new Monster ( (198 + 2 * $stage), 1, 5157, 2024, 2009, 4945, 3262, 365356, 548792, 23834900, 15087, (399 + $stage), 178017293, -1);
			case 22 :
				return new Monster ( (198 + 2 * $stage), 1, 5206, 2043, 2028, 4990, 3295, 365356, 548792, 24251400, 15087, (399 + $stage), 178017293, -1);
			case 23 :
				return new Monster ( (198 + 2 * $stage), 1, 5252, 2058, 2042, 5040, 3330, 365356, 548792, 24696000, 15087, (399 + $stage), 178017293, -1);
			case 24 :
				return new Monster ( (198 + 2 * $stage), 1, 5302, 2077, 2061, 5090, 3362, 365356, 548792, 25144600, 15087, (399 + $stage), 178017293, -1);
			case 25 :
				return new Monster ( (198 + 2 * $stage), 2, 2092, 2078, 5352, 5135, 3397, 365356, 548792, 10228920, 15087, (399 + $stage), 178017293, -1);
			case 26 :
				return new Monster ( (198 + 2 * $stage), 3, 2108, 5400, 2094, 5183, 3429, 365356, 548792, 20814928, 15087, (399 + $stage), 178017293, -1);
			case 27 :
				return new Monster ( (198 + 2 * $stage), 3, 2141, 5446, 2129, 5237, 3475, 365356, 548792, 21199376, 15087, (399 + $stage), 178017293, -1);
			case 28 :
				return new Monster ( (198 + 2 * $stage), 1, 5498, 2173, 2162, 5290, 3522, 365356, 548792, 26979000, 15087, (399 + $stage), 178017293, -1);
			case 29 :
				return new Monster ( (198 + 2 * $stage), 1, 5549, 2207, 2198, 5339, 3567, 365356, 548792, 27442460, 15087, (399 + $stage), 178017293, -1);
			case 30 :
				return new Monster ( (198 + 2 * $stage), 1, 5596, 2241, 2228, 5393, 3613, 365356, 548792, 27935740, 15087, (399 + $stage), 178017293, -1);
			case 31 :
				return new Monster ( (198 + 2 * $stage), 1, 5646, 2275, 2263, 5448, 3657, 365356, 548792, 28438560, 15087, (399 + $stage), 178017293, -1);
			case 32 :
				return new Monster ( (198 + 2 * $stage), 2, 2309, 2296, 5698, 5497, 3703, 365356, 548792, 11565688, 15087, (399 + $stage), 178017293, -1);
			case 33 :
				return new Monster ( (198 + 2 * $stage), 1, 5744, 2340, 2331, 5551, 3751, 365356, 548792, 29420300, 15087, (399 + $stage), 178017293, -1);
			case 34 :
				return new Monster ( (198 + 2 * $stage), 1, 5796, 2377, 2362, 5603, 3794, 365356, 548792, 29920020, 15087, (399 + $stage), 178017293, -1);
			case 35 :
				return new Monster ( (198 + 2 * $stage), 1, 5846, 2405, 2396, 5657, 3840, 365356, 548792, 30434660, 15087, (399 + $stage), 178017293, -1);
			case 36 :
				return new Monster ( (198 + 2 * $stage), 3, 2438, 5895, 2429, 5708, 3886, 365356, 548792, 24749888, 15087, (399 + $stage), 178017293, -1);
			case 37 :
				return new Monster ( (198 + 2 * $stage), 3, 2473, 5947, 2464, 5763, 3930, 365356, 548792, 25172784, 15087, (399 + $stage), 178017293, -1);
			case 38 :
				return new Monster ( (198 + 2 * $stage), 1, 5995, 2507, 2498, 5816, 3975, 365356, 548792, 31988000, 15087, (399 + $stage), 178017293, -1);
			case 39 :
				return new Monster ( (198 + 2 * $stage), 1, 6046, 2538, 2531, 5863, 4022, 365356, 548792, 32481020, 15087, (399 + $stage), 178017293, -1);
			case 40 :
				return new Monster ( (198 + 2 * $stage), 1, 6092, 2572, 2566, 5917, 4069, 365356, 548792, 33016860, 15087, (399 + $stage), 178017293, -1);
			case 41 :
				return new Monster ( (198 + 2 * $stage), 2, 2606, 2600, 6144, 5972, 4112, 365356, 548792, 13425056, 15087, (399 + $stage), 178017293, -1);
			case 42 :
				return new Monster ( (198 + 2 * $stage), 2, 2641, 2631, 6194, 6021, 4158, 365356, 548792, 13631544, 15087, (399 + $stage), 178017293, -1);
			case 43 :
				return new Monster ( (198 + 2 * $stage), 1, 6245, 2671, 2668, 6073, 4203, 365356, 548792, 34616100, 15087, (399 + $stage), 178017293, -1);
			case 44 :
				return new Monster ( (198 + 2 * $stage), 3, 2705, 6295, 2699, 6130, 4248, 365356, 548792, 28148960, 15087, (399 + $stage), 178017293, -1);
			case 45 :
				return new Monster ( (198 + 2 * $stage), 3, 2741, 6342, 2733, 6178, 4295, 365356, 548792, 28567072, 15087, (399 + $stage), 178017293, -1);
			case 46 :
				return new Monster ( (198 + 2 * $stage), 1, 6396, 2771, 2765, 6231, 4340, 365356, 548792, 36264420, 15087, (399 + $stage), 178017293, -1);
			case 47 :
				return new Monster ( (198 + 2 * $stage), 3, 2804, 6444, 2798, 6284, 4385, 365356, 548792, 29459392, 15087, (399 + $stage), 178017293, -1);
			case 48 :
				return new Monster ( (198 + 2 * $stage), 1, 2838, 2834, 6492, 6340, 4430, 365356, 548792, 14962400, 15087, (399 + $stage), 178017293, -1);
			case 49 :
				return new Monster ( (198 + 2 * $stage), 2, 2874, 2866, 6542, 6388, 4477, 365356, 548792, 15177888, 15087, (399 + $stage), 178017293, -1);
			case 50 :
				return new Monster ( (198 + 2 * $stage), 1, 6593, 2905, 2902, 6441, 4523, 365356, 548792, 38517180, 15087, (399 + $stage), 178017293, -1);
			case 51 :
				return new Monster ( (198 + 2 * $stage), 1, 6640, 2937, 2932, 6494, 4569, 365356, 548792, 39093880, 15087, (399 + $stage), 178017293, -1);
			case 52 :
				return new Monster ( (198 + 2 * $stage), 1, 2977, 6707, 2973, 6555, 4612, 365356, 548792, 31778640, 15087, (399 + $stage), 178017293, -1);
			case 53 :
				return new Monster ( (198 + 2 * $stage), 3, 6776, 3010, 3013, 6616, 4654, 365356, 548792, 40357600, 15087, (399 + $stage), 178017293, -1);
			case 54 :
				return new Monster ( (198 + 2 * $stage), 2, 3047, 3052, 6839, 6679, 4699, 365356, 548792, 16403624, 15087, (399 + $stage), 178017293, -1);
			case 55 :
				return new Monster ( (198 + 2 * $stage), 1, 6906, 3089, 3091, 6741, 4741, 365356, 548792, 41659380, 15087, (399 + $stage), 178017293, -1);
			case 56 :
				return new Monster ( (198 + 2 * $stage), 1, 6973, 3121, 3132, 6805, 4784, 365356, 548792, 42327100, 15087, (399 + $stage), 178017293, -1);
			case 57 :
				return new Monster ( (198 + 2 * $stage), 1, 7040, 3160, 3173, 6864, 4828, 365356, 548792, 42968640, 15087, (399 + $stage), 178017293, -1);
			case 58 :
				return new Monster ( (198 + 2 * $stage), 1, 3197, 7106, 3211, 6930, 4871, 365356, 548792, 34927200, 15087, (399 + $stage), 178017293, -1);
			case 59 :
				return new Monster ( (198 + 2 * $stage), 3, 3235, 3249, 7171, 6990, 4915, 365356, 548792, 17726640, 15087, (399 + $stage), 178017293, -1);
			case 60 :
				return new Monster ( (198 + 2 * $stage), 1, 7240, 3270, 3291, 7049, 4958, 365356, 548792, 44972620, 15087, (399 + $stage), 178017293, -1);
			case 61 :
				return new Monster ( (198 + 2 * $stage), 1, 7303, 3309, 3331, 7112, 5005, 365356, 548792, 45659040, 15087, (399 + $stage), 178017293, -1);
			case 62 :
				return new Monster ( (198 + 2 * $stage), 3, 7370, 3348, 3368, 7173, 5043, 365356, 548792, 46337580, 15087, (399 + $stage), 178017293, -1);
			case 63 :
				return new Monster ( (198 + 2 * $stage), 2, 7436, 3382, 3409, 7236, 5088, 365356, 548792, 47034000, 15087, (399 + $stage), 178017293, -1);
			case 64 :
				return new Monster ( (198 + 2 * $stage), 1, 3148, 7502, 3447, 7298, 5134, 365356, 548792, 38183136, 15087, (399 + $stage), 178017293, -1);
			case 65 :
				return new Monster ( (198 + 2 * $stage), 1, 7567, 3458, 3487, 7359, 5177, 365356, 548792, 48422220, 15087, (399 + $stage), 178017293, -1);
			case 66 :
				return new Monster ( (198 + 2 * $stage), 1, 7634, 3495, 3528, 7424, 5217, 365356, 548792, 49146880, 15087, (399 + $stage), 178017293, -1);
			case 67 :
				return new Monster ( (198 + 2 * $stage), 1, 3531, 7701, 3568, 7483, 5265, 365356, 548792, 39869424, 15087, (399 + $stage), 178017293, -1);
			case 68 :
				return new Monster ( (198 + 2 * $stage), 2, 3567, 3607, 7767, 7544, 5307, 365356, 548792, 20217920, 15087, (399 + $stage), 178017293, -1);
			case 69 :
				return new Monster ( (198 + 2 * $stage), 1, 7833, 3609, 3645, 7606, 5347, 365356, 548792, 51264440, 15087, (399 + $stage), 178017293, -1);
			case 70 :
				return new Monster ( (198 + 2 * $stage), 1, 7900, 3641, 3687, 7669, 5392, 365356, 548792, 51995820, 15087, (399 + $stage), 178017293, -1);
			case 71 :
				return new Monster ( (198 + 2 * $stage), 1, 7967, 3680, 3729, 7728, 5436, 365356, 548792, 52704960, 15087, (399 + $stage), 178017293, -1);
			case 72 :
				return new Monster ( (198 + 2 * $stage), 1, 8031, 3717, 3764, 7792, 5480, 365356, 548792, 53453120, 15087, (399 + $stage), 178017293, -1);
			case 73 :
				return new Monster ( (198 + 2 * $stage), 1, 3755, 3804, 8098, 7855, 5523, 365356, 548792, 21679800, 15087, (399 + $stage), 178017293, -1);
			case 74 :
				return new Monster ( (198 + 2 * $stage), 3, 8167, 3790, 3845, 7914, 5566, 365356, 548792, 54923160, 15087, (399 + $stage), 178017293, -1);
			case 75 :
				return new Monster ( (198 + 2 * $stage), 1, 8229, 3829, 3886, 7977, 5611, 365356, 548792, 55679460, 15087, (399 + $stage), 178017293, -1);
			case 76 :
				return new Monster ( (198 + 2 * $stage), 1, 8297, 3868, 3923, 8038, 5651, 365356, 548792, 56426760, 15087, (399 + $stage), 178017293, -1);
			case 77 :
				return new Monster ( (198 + 2 * $stage), 1, 8541, 3976, 4007, 8268, 5767, 365356, 548792, 58372080, 15087, (399 + $stage), 178017293, -1);
			case 78 :
				return new Monster ( (198 + 2 * $stage), 1, 8787, 4088, 4093, 8494, 5881, 365356, 548792, 60307400, 15087, (399 + $stage), 178017293, -1);
			case 79 :
				return new Monster ( (198 + 2 * $stage), 1, 4200, 9030, 4174, 8726, 5993, 365356, 548792, 49842912, 15087, (399 + $stage), 178017293, -1);
			case 80 :
				return new Monster ( (198 + 2 * $stage), 1, 9274, 4313, 4256, 8956, 6107, 365356, 548792, 64304080, 15087, (399 + $stage), 178017293, -1);
			case 81 :
				return new Monster ( (198 + 2 * $stage), 1, 9996, 4642, 4556, 9639, 6534, 365356, 548792, 69593584, 15087, (399 + $stage), 178017293, -1);
			case 82 :
				return new Monster ( (198 + 2 * $stage), 1, 10761, 4999, 4877, 10373, 6989, 365356, 548792, 75311608, 15087, (399 + $stage), 178017293, -1);
			case 83 :
				return new Monster ( (198 + 2 * $stage), 1, 11583, 5380, 5215, 11157, 7466, 365356, 548792, 81447928, 15087, (399 + $stage), 178017293, -1);
			case 84 :
				return new Monster ( (198 + 2 * $stage), 1, 12460, 5781, 5578, 11994, 7980, 365356, 548792, 88041464, 15087, (399 + $stage), 178017293, -1);
			case 85 :
				return new Monster ( (198 + 2 * $stage), 3, 6214, 5957, 12883, 8525, 11994, 365356, 548792, 95076544, 15087, (399 + $stage), 178017293, -1);
			case 86 :
				return new Monster ( (198 + 2 * $stage), 2, 3567, 3607, 7767, 7544, 5307, 365356, 548792, 39498144, 15087, (399 + $stage), 178017293, -1);
			case 87 :
				return new Monster ( (198 + 2 * $stage), 1, 12410, 5781, 5578, 11994, 7980, 365356, 548792, 45123431, 15087, (399 + $stage), 178017293, -1);
			case 88 :
				return new Monster ( (198 + 2 * $stage), 1, 12820, 5781, 5578, 11994, 7980, 365356, 548792, 57432123, 15087, (399 + $stage), 178017293, -1);
			case 89 :
				return new Monster ( (198 + 2 * $stage), 1, 13230, 5781, 5578, 12394, 7980, 365356, 548792, 75123785, 15087, (399 + $stage), 178017293, -1);
			case 90 :
				return new Monster ( (198 + 2 * $stage), 1, 14360, 5781, 5578, 12994, 7980, 365356, 548792, 95126412, 15087, (399 + $stage), 178017293, -1);
			case 91 :
				return new Monster ( (198 + 2 * $stage), 1, 14440, 5781, 5578, 13594, 7980, 365356, 548792, 63234112, 15087, (399 + $stage), 178017293, -1);
			case 92 :
				return new Monster ( (198 + 2 * $stage), 1, 14830, 5781, 5578, 13994, 7980, 365356, 548792, 84412354, 15087, (399 + $stage), 178017293, -1);
			case 93 :
				return new Monster ( (198 + 2 * $stage), 1, 15020, 5781, 5578, 14994, 7980, 365356, 548792, 96543213, 15087, (399 + $stage), 178017293, -1);
			case 94 :
				return new Monster ( (198 + 2 * $stage), 1, 15430, 5781, 5578, 14394, 7980, 365356, 548792, 80541035, 15087, (399 + $stage), 178017293, -1);
			case 95 :
				return new Monster ( (198 + 2 * $stage), 1, 15680, 5781, 5578, 15994, 7980, 365356, 548792, 93312345, 15087, (399 + $stage), 178017293, -1);
			case 96 :
				return new Monster ( (198 + 2 * $stage), 1, 16070, 5781, 5578, 15994, 7980, 365356, 548792, 53354621, 15087, (399 + $stage), 178017293, -1);
			case 97 :
				return new Monster ( (198 + 2 * $stage), 1, 16210, 5781, 5578, 16494, 7980, 365356, 548792, 65432163, 15087, (399 + $stage), 178017293, -1);
			case 98 :
				return new Monster ( (198 + 2 * $stage), 1, 16420, 5781, 5578, 16994, 7980, 365356, 548792, 85531567, 15087, (399 + $stage), 178017293, -1);
			case 99 :
				return new Monster ( (198 + 2 * $stage), 1, 17450, 5781, 5578, 17594, 7980, 365356, 548792, 98543123, 15087, (399 + $stage), 178017293, -1);
			case 100 :
				return new Monster ( (198 + 2 * $stage), 1, 18000, 5781, 5578, 18994, 7980, 365356, 548792, 100000000, 15087, (399 + $stage), 178017293, -1);

		}
}
function getGuildMonster($stage, $db_data) {
		switch ($stage) {
			case 1 :
				return new Monster ( 50, 3, 209, 804, 202, 5329, 277, 3000, 4000, 1087116, 15087, 195, 450000, -1);
			case 2 :
				return new Monster ( 60, 3, 256, 988, 247, 7220, 356, 3650, 4300, 1761680, 15087, 193, 650000, -1);
			case 3 :
				return new Monster ( 70, 1, 1178, 365, 342, 9120, 323, 3700, 4500, 3237600, 15087, 194, 830000, -1);
			case 4 :
				return new Monster ( 80, 3, 351, 1368, 343, 11020, 360, 4000, 5885, 3570480, 15087, 196, 960000, -1);
			case 5 :		
				return new Monster ( 90, 1, 1558, 508, 484, 12920, 413, 4200, 6500, 5878600, 15087, 197, 1007000, -1);
			case 6 :
				return new Monster ( 100, 3, 446, 1748, 437, 14820, 702, 4300, 6975, 5987280, 15087, 198, 1116000, -1);	
			case 7 :
				return new Monster ( 110, 3, 446, 1948, 437, 16820, 702, 5500, 7275, 7487280, 15087, 199, 1250000, -1);	
			case 8 :
				return new Monster ( 120, 2, 646, 556, 2250, 17820, 800, 6000, 9000, 4300002, 15087, 200, 1320000, -1);	
			case 9 :
				return new Monster ( 130, 3, 602, 2470, 640, 20050, 770, 7000, 8000, 10752480, 15087, 201, 1450000, -1);	
			case 10 :
			    return new Monster ( 140, 3, 700, 2508, 710, 22420, 702, 9000, 12000, 12644880, 15087, 202, 1550000, -1);	
			case 11 :
				return new Monster ( 150, 2, 766, 699, 2998, 23080, 880, 10000, 13500, 1350000, 15087, 203, 178017293, -2);	
			case 12 :
				return new Monster ( 160, 3, 890, 2670, 1080, 23600, 900, 12000, 15000, 1500000, 15087, 204, 178017293, -1);	
            case 13 :
				return new Monster ( 170, 1, 3200, 1240, 1235, 26000, 650, 9500, 12500, 1970650, 15087, 205, 178017293, -1);	
            case 14 :
				return new Monster ( 180, 2, 1280, 1060, 3460, 24300, 790, 14500, 19000, 1350980, 15087, 206, 178017293, -1);	
            case 15 :
				return new Monster ( 190, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 207, 178017293, -1);	
            case 16 :
				return new Monster ( 200, 1, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 208, 178017293, -1);	
            case 17 :
				return new Monster ( 210, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 209, 178017293, -1);	
            case 18 :
				return new Monster ( 220, 1, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 210, 178017293, -1);	
            case 19 :
				return new Monster ( 230, 3, 4194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 213, 178017293, -1);	
			case 20 :
				return new Monster ( 240, 1, 4194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 211, 178017293, -1);	
            case 21 :
				return new Monster ( 250, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 212, 178017293, -1);	
            case 22 :
				return new Monster ( 260, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 214, 178017293, -1);	
            case 23 :
				return new Monster ( 270, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 215, 178017293, -1);	
            case 24 :
				return new Monster ( 280, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 216, 178017293, -1);	
            case 25 :
				return new Monster ( 290, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 217, 178017293, -1);	
            case 26 :
				return new Monster ( 300, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 218, 178017293, -1);	
            case 27 :
				return new Monster ( 300, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 219, 178017293, -1);	
            case 28 :
				return new Monster ( 300, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 220, 178017293, -1);	
            case 29 :
				return new Monster ( 300, 1, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 221, 178017293, -1);	
            case 30 :
				return new Monster ( 300, 1, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 222, 178017293, -1);	
            case 31 :
				return new Monster ( 300, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 223, 178017293, -1);	
            case 32 :
				return new Monster ( 305, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 224, 178017293, -1);	
            case 33 :
				return new Monster ( 315, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 225, 178017293, -1);	
            case 34 :
				return new Monster ( 320, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 226, 178017293, -1);	
            case 35 :
				return new Monster ( 325, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 227, 178017293, -1);	
            case 36 :
				return new Monster ( 330, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 228, 178017293, -1);	
            case 37 :
				return new Monster ( 335, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 229, 178017293, -1);	
            case 38 :
				return new Monster ( 340, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 230, 178017293, -1);	
            case 39 :
				return new Monster ( 345, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 231, 178017293, -1);	
            case 40 :
				return new Monster ( 350, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 232, 178017293, -1);	
            case 41 :
				return new Monster ( 355, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 233, 178017293, -1);	
            case 42 :
				return new Monster ( 360, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 234, 178017293, -1);	
            case 43 :
				return new Monster ( 365, 1, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 235, 178017293, -1);	
            case 44 :
				return new Monster ( 370, 1, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 236, 178017293, -1);	
            case 45 :
				return new Monster ( 375, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 237, 178017293, -1);	
            case 46 :
				return new Monster ( 380, 2, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 238, 178017293, -1);	
            case 47 :
				return new Monster ( 385, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 239, 178017293, -1);	
            case 48 :
				return new Monster ( 390, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 240, 178017293, -1);	
            case 49 :
				return new Monster ( 395, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 241, 178017293, -1);	
            case 50 :
				return new Monster ( 400, 3, 34194, 1697, 1665, 3985, 2589, 365356, 548792, 16019700, 15087, 242, 178017293, -1);					
		}
}

$SHOP_SHAKES = 0;
$SHOP_FIDGET = 1;;
function enterShop($shop, $db_data) {
	global $ret, $db;
	
	// shakes
	if ($shop == 0) {
		$index = 288;
		$table = "items_shakes";
	} else if($shop == 1) { // fidget
		$index = 361;
		$table = "items_fidget";
	}
	
	// check reroll time
	$time = new DateTime ();
	$time = $time->getTimestamp ();
	
	// get/gen items
	if ($time > $db_data ['shop_reroll_time']) {
		// generate new items
		$items = rerollItems ( $shop, $db_data );
	} else {
		$qry = $db->prepare ( "SELECT * FROM " . $table . " 
				WHERE owner_id = :uid 
				ORDER BY slot ASC" );
		$qry->bindParam ( ':uid', $db_data ['user_id'] );
		$qry->execute ();
		
		$items = $qry->fetchAll ();
	}
		

		
		
	
	// display items
	foreach ( $items as $item ) {
		$ret [$index] = $item ['item_type'];
		$ret [$index + 1] = $item ['item_id'];
		$ret [$index + 2] = $item ['dmg_min'];
		$ret [$index + 3] = $item ['dmg_max'];
		$ret [$index + 4] = $item ['atr_type_1'];
		$ret [$index + 5] = $item ['atr_type_2'];
		$ret [$index + 6] = $item ['atr_type_3'];
		$ret [$index + 7] = $item ['atr_val_1'];
		$ret [$index + 8] = $item ['atr_val_2'];
		$ret [$index + 9] = $item ['atr_val_3'];
		$ret [$index + 10] = $item ['gold'];
		$ret [$index + 11] = $item ['mush'];
		
		$index += 12;
	}
}
$shakes_item_ids = array (
		array (
				30,
				10,
				10,
				10,
				10,
				10,
				10 
		),
		array (
				10,
				0,
				10,
				10,
				10,
				10,
				10 
		),
		array (
				10,
				0,
				10,
				10,
				10,
				10,
				10 
		) 
);
$fidget_item_ids = array (
		21,
		16,
		37 
);
// used after buying
function genNewItem($lvl, $class, $shop, $slot, $itemid) {
	global $db;
	$item = genItem ( $lvl, $class, $shop );
	
	$table = $shop == 0 ? "items_shakes" : "items_fidget";
	
	$qry = $db->prepare ( 'UPDATE ' . $table . ' SET 
			item_type = ' . $item ['item_type'] . ', 
			item_id = ' . $item ['item_id'] . ',
			dmg_min = ' . $item ['dmg_min'] . ',
			dmg_max = ' . $item ['dmg_max'] . ',
			atr_type_1 = ' . $item ['atr_type_1'] . ',
			atr_type_2 = ' . $item ['atr_type_2'] . ',
			atr_type_3 = ' . $item ['atr_type_3'] . ',
			atr_val_1 = ' . $item ['atr_val_1'] . ',
			atr_val_2 = ' . $item ['atr_val_2'] . ',
			atr_val_3 = ' . $item ['atr_val_3'] . ',
			gold = ' . $item ['gold'] . ',
			mush = ' . $item ['mush'] . ' 
			WHERE id = ' . $itemid . ';' );
	if (! $qry->execute ()) {
		// var_dump($qry -> errorInfo());
	}
}
function genItem($lvl, $class, $shop, $option, $db_data) {
	global $shakes_item_ids, $fidget_item_ids;
	
	if ($shop == 0) {
		$type = rand ( 1, 7 );
	} else {
		if ($option == "toilet" or $option == "dungeon"){
			$type = rand ( 8, 10); //toilet, and dungeon isn't giving out keys or potions
		} elseif ($option == "tavern") {
			$type = rand ( 8, 11); //11 is keys, 12 is potions
		} else {
			$type = rand ( 8, 12); //11 is keys, 12 is potions
		}
		
		if ($type == 11 and $option != "tavern"){
			$type = rand ( 8, 10);
		}
	}
	
	if ($option == "toilet"){
		$epicRand = rand(1, 2); //if toilet
	} elseif ($option == "dungeon") {
		$epicRand = rand(1, 4); //if dungeon
	} elseif ($option == "tavern" and $lvl > 25) {
		$epicRand = rand(1, 15); //if tavern
	} elseif ($lvl > 25) {
		$epicRand = rand(1, 55); //if shop
	} else {
		$epicRand = -1;
	}
	
	// if epic event or chirstmas
	if (event () == 2 or event () == 5){
		if ($option == "toilet"){
			$epicRand = 1; //if toilet
		} elseif ($option == "dungeon") {
			$epicRand = rand(1, 3); //if dungeon
		} elseif ($option == "tavern") {
			$epicRand = rand(1, 10); //if tavern
		} else {
			$epicRand = rand(1, 25); //if shop
		}
	}
		
		
	$statNumRand = rand(1, 7);
	
	if ($shop == 1 and $type == 12){
		if ($lvl < 10){ //if level < 10 then shop gives only small potions
			$potionIDRand = rand (1, 5);
		} elseif ($lvl < 25 and $lvl > 9) { //if level < 25 then shop gives small potions and medium potions
			$potionIDRand = rand (1, 10);
		} elseif ($lvl > 24) { //if level > 24 then shop gives small, medium and big potions + Potion of the Eternal Life
			$potionIDRand = rand (1, 16);
		}
	}
	
	$itemMush = 0;
	
	if ($type == 1){ // if weapon item
	$itemGold = rand($lvl * $lvl * ($lvl * 4 + 10), $lvl * $lvl * ($lvl * 5 + 12));
	} else { // if normal item
	$itemGold = rand($lvl * $lvl * ($lvl * 3 + 10), $lvl * $lvl * ($lvl * 5 + 12)) / 2;
	}
	
	// potions - shop 2
	if ($potionIDRand > 0 and $potionIDRand < 6 and $type == 12){ // if small potions
		$itemGold = rand($lvl * $lvl * ($lvl * 5 + 10), $lvl * $lvl * ($lvl * 6 + 12)) / 20;
	} elseif ($potionIDRand > 5 and $potionIDRand < 11 and $type == 12){ // if medium potions
		$itemGold = rand($lvl * $lvl * ($lvl * 5 + 10), $lvl * $lvl * ($lvl * 6 + 12)) / 15;
	} elseif ($potionIDRand > 10 and $potionIDRand < 16 and $type == 12){ // if big potions
		$itemGold = rand($lvl * $lvl * ($lvl * 5 + 10), $lvl * $lvl * ($lvl * 6 + 12)) / 10;
	} elseif ($potionIDRand == 16 and $type == 12){ // if life potions
		$itemGold = rand($lvl * $lvl * ($lvl * 5 + 10), $lvl * $lvl * ($lvl * 6 + 12)) / 10;
	}
	
	if ($option == 'tavern' or $option == 'dungeon' or $option == 'toilet'){ // items - tavern, dungeon, toilet
	$itemGold = rand($lvl * $lvl * ($lvl * 5 + 10), $lvl * $lvl * ($lvl * 6 + 12)) / 5;
	}
	
	if ($type == 11){
	$itemGold = 10000000;
	}
	
	if ($epicRand == 1 and $type < 11){
		$itemMush = 15;
	} elseif ($statNumRand == 1 and $type < 11) { // if normal items with 2 stats
		$itemMush = 6;
	} elseif ($type == 12 and $potionIDRand == 16) { // if life potion
		$itemMush = 15;
	} else {
		$itemMush = 0;
	}
	
	if ($option == "toilet" or $option == "dungeon" or $option == "tavern"){
	$itemMush = 0;
	}
	
	$item = array (
			"item_type" => "1",
			"item_id" => "1005",
			"dmg_min" => "1",
			"dmg_max" => "0",
			"atr_type_1" => "0",
			"atr_type_2" => "0",
			"atr_type_3" => "0",
			"atr_val_1" => "0",
			"atr_val_2" => "0",
			"atr_val_3" => "0",
			"gold" => $itemGold,
			"mush" => $itemMush,
			"slot" => "0",
			"owner_id" => $itemOwner
	);
	
	if ($shop == 0) {
		while ( $class != 1 && $type == 2 )
			$type = rand ( 1, 7 );
		
		$item ['item_type'] = $type;
		$random = rand ( 1, $shakes_item_ids [$class - 1] [$type - 1] );
		if ($epicRand == 1){
			if ($class == 3){
				if ($type == 1 or $type == 2){
				$item ['item_id'] = rand(2050, 2060);
				} else {
				$item ['item_id'] = rand(2050, 2058);
				}
			}
			if ($class == 2){
				if ($type == 1 or $type == 2){
				$item ['item_id'] = rand(1050, 1060);
				} else {
				$item ['item_id'] = rand(1050, 1058);
				}
			}
			if ($class == 1){
				if ($type == 1 or $type == 2){
				$item ['item_id'] = rand(50, 60);
				} else {
				$item ['item_id'] = rand(50, 58);
				}
			}
		} else {
		$item ['item_id'] = $random + (($class - 1) * 1000);
		}
		
		if ($type == 1) {
			$class_weap_multiplier = array (
					1.2,
					4,
					2.1 
			);
			
			$m = mt_rand ( 900, 1100 ) / 1000;
			$avg = round($lvl * '1.3' * $class_weap_multiplier [$class - 1]);
			
			$minmax_m = round(mt_rand(750, 1000) / 1000);
			
			
			
			$item ['dmg_min'] = round($avg * $minmax_m);
			$item ['dmg_max'] = round($avg * ($minmax_m + '0.25') + rand (1, 50));
		} else {
			if ($type == 2){
				if ($lvl < 1){
				$shieldNumber = 2;
				}
				if ($lvl < 5 and $lvl > 10){
				$shieldNumber = 6;
				}
				if ($lvl < 9 and $lvl > 10){
				$shieldNumber = 10;
				}
				if ($lvl < 14 and $lvl > 10){
				$shieldNumber = 15;
				}
				if ($lvl < 20 and $lvl > 10){
				$shieldNumber = 20;
				}
				if ($lvl > 35){
				$shieldNumber = 25;
				}
			$item ['dmg_min'] = $shieldNumber;
			} else {
			$item ['dmg_min'] = $lvl * 2 * rand(1.51, 1.74) + rand(1, 6);
			}
		}
	} else {
		$item ['dmg_min'] = 0;
		$item ['item_type'] = $type;
		if ($epicRand == 1){
		$item ['item_id'] = rand (50, 58);
		} else {
		$item ['item_id'] = rand ( 1, $fidget_item_ids [$type - 8] );
		}
	}
	
	if ($class == 1){
	$classStat = 1;
	}
	if ($class == 2){
	$classStat = 3;
	}
	if ($class == 3){
	$classStat = 2;
	}
	if ($epicRand == 1){
		if (rand(1, 2) == 1){ //epic item with 3 stats
			$stat_type2 = 4;
			$stat_type3 = 5;
			$m = mt_rand ( 850, 1300 ) / rand(850, 1000) * rand(1.4, 1.5);
			$stat_val1 = round ( $lvl * $m );
			$stat_val2 = round ( $lvl * $m );
			$stat_val3 = round ( $lvl * $m );
			
			$item ['atr_type_1'] = $classStat;
			$item ['atr_val_1'] = $stat_val1;
			$item ['atr_type_2'] = $stat_type2;
			$item ['atr_val_2'] = $stat_val2;
			$item ['atr_type_3'] = $stat_type3;
			$item ['atr_val_3'] = $stat_val3;
		} else { //epic item with all stat
			$stat_type = 6;
			$m = mt_rand ( 850, 1300 ) / rand(850, 1000) * rand(1.1, 1.2);
			$stat_val = round ( $lvl * $m );
			
			$item ['atr_type_1'] = $stat_type;
			$item ['atr_val_1'] = $stat_val;
		}
	} else {
		if ($statNumRand == 1){ //normal item with 2 stats
			$stat_type1 = rand ( 1, 5 );
			$stat_type2 = rand ( 1, 5 );
			if ($stat_type2 == $stat_type1){
				if ($stat_type1 < 2){
					$stat_type2 = $stat_type1 + 1;
				} else {
					$stat_type2 = $stat_type1 - 1;
				}
			}
			$m1 = mt_rand ( 850, 1300 ) / rand(850, 1000);
			$m2 = mt_rand ( 850, 1300 ) / rand(850, 1000);
			$stat_val1 = round ( $lvl * rand(1.3, 1.6) * $m1 );
			$stat_val2 = round ( $lvl * rand(1.2, 1.4) * $m2 );
			
			$item ['atr_type_1'] = $stat_type1;
			$item ['atr_val_1'] = $stat_val1;
			$item ['atr_type_2'] = $stat_type2;
			$item ['atr_val_2'] = $stat_val2;
		} else { //normal item with 1 stat
			$stat_type = rand ( 1, 5 );
			$m = mt_rand ( 850, 1300 ) / rand(850, 1000);
			$stat_val = round ( $lvl * rand(2, 2.2) * $m );
		
			$item ['atr_type_1'] = $stat_type;
			$item ['atr_val_1'] = $stat_val;
		}
	}
	
	if ($type == 11){ //if key then
		$item ['item_id'] = -1; // default value
		if ($option == 'tavern'){
		
			
		//	if (rand (1, 2) == 1 and $lvl > 50 and $db_data ['magic_mirror'] == 0){
		//		$item ['item_id'] = 21; // magic mirror key ?? what's this?
		//	}
			
		//	if (rand (1, 50) == 1){
		//		$item ['item_id'] = rand(22, 24); // eggs ?? what's this?
		//	}
			
			if (rand (1, 3) == 1 and $lvl > 50 and $db_data ['magic_mirror'] == 0 and $db_data ['magic_mirror_shard'] < 43){
				$item ['item_id'] = $db_data['magic_mirror_shard']; // magic mirrors
			}
		
			if (rand (1, 2) == 1 and $lvl > 99 and $db_data ['toilet'] == 0){
				$item ['item_id'] = 20; // toilet key
			}
			
			if ($item ['item_id'] == -1){
				if ($db_data ['dungeon_1'] == 0 and $lvl > 9){
					$item ['item_id'] = 1;
				} elseif ($db_data ['dungeon_2'] == 0 and $lvl > 19){
					$item ['item_id'] = 2;
				} elseif ($db_data ['dungeon_3'] == 0 and $lvl > 29){
					$item ['item_id'] = 3;
				} elseif ($db_data ['dungeon_4'] == 0 and $lvl > 39){
					$item ['item_id'] = 4;
				} elseif ($db_data ['dungeon_5'] == 0 and $lvl > 49){
					$item ['item_id'] = 5;
				} elseif ($db_data ['dungeon_6'] == 0 and $lvl > 59){
					$item ['item_id'] = 6;
				} elseif ($db_data ['dungeon_7'] == 0 and $lvl > 59){
					$item ['item_id'] = 7;
				} elseif ($db_data ['dungeon_8'] == 0 and $lvl > 69){
					$item ['item_id'] = 8;
				} elseif ($db_data ['dungeon_9'] == 0 and $lvl > 79){
					$item ['item_id'] = 9;
				} else {
					return ('0/0/0/0/0/0/0/0/0/0/0/0');
					break;
				}
			}
			
		} else {
		$item ['item_id'] = rand (1, 9);
		}
	$item ['dmg_min'] = 0;
	$item ['atr_type_1'] = 0;
	$item ['atr_val_1'] = 0;
	$item ['atr_type_2'] = 0;
	$item ['atr_val_2'] = 0;
	$item ['atr_type_3'] = 0;
	$item ['atr_val_3'] = 0;
	}
	
	if ($type == 12){
	$item ['item_id'] = $fidget_item_ids [$type - 8] + $potionIDRand;
	
	switch ($potionIDRand) {
	case 1:
        $potionAtr_type = 1;
		$potionAtr_val = 5;
		break;
	case 2:
        $potionAtr_type = 2;
		$potionAtr_val = 5;
		break;
	case 3:
        $potionAtr_type = 3;
		$potionAtr_val = 5;
		break;
	case 4:
        $potionAtr_type = 4;
		$potionAtr_val = 5;
		break;
	case 5:
        $potionAtr_type = 5;
		$potionAtr_val = 5;
		break;
	case 6:
        $potionAtr_type = 1;
		$potionAtr_val = 15;
		break;
	case 7:
        $potionAtr_type = 2;
		$potionAtr_val = 15;
		break;
	case 8:
        $potionAtr_type = 3;
		$potionAtr_val = 15;
		break;
	case 9:
        $potionAtr_type = 4;
		$potionAtr_val = 15;
		break;
	case 10:
        $potionAtr_type = 5;
		$potionAtr_val = 15;
		break;
	case 11:
        $potionAtr_type = 1;
		$potionAtr_val = 25;
		break;
	case 12:
        $potionAtr_type = 2;
		$potionAtr_val = 25;
		break;
	case 13:
        $potionAtr_type = 3;
		$potionAtr_val = 25;
		break;
	case 14:
        $potionAtr_type = 4;
		$potionAtr_val = 25;
		break;
	case 15:
        $potionAtr_type = 5;
		$potionAtr_val = 25;
		break;
	case 16:
		$potionAtr_type = 12;
		$potionAtr_val = 25;
		break;
	}
	$item ['atr_type_1'] = $potionAtr_type;
	$item ['atr_val_1'] = $potionAtr_val;
	$item ['dmg_min'] = 0;
	$item ['atr_type_2'] = 0;
	$item ['atr_val_2'] = 0;
	$item ['atr_type_3'] = 0;
	$item ['atr_val_3'] = 0;
	}
	
	return $item;
}
// returns items array
function rerollOneShop($shop, $db_data) {
	global $db;
	
	$items = array ();
	
	$table = $shop == 0 ? "items_shakes" : "items_fidget";
	
	$qry = $db->prepare ( "DELETE FROM $table WHERE owner_id = :uid" );
	// $qry->bindParam ( ':ssid', $SSID );
	$qry->bindParam ( ':uid', $db_data ['user_id'] );
	$qry->execute ();
	
	$qry = $db->prepare ( "INSERT INTO $table(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
			VALUES(:type, :iid, :dmin, :dmax, :at1, :at2, :at3, :av1, :av2, :av3, :gold, :mush, :slot, :owner)" );
	
	for($a = 0; $a < 6; $a ++) {
		$items [] = genItem ( $db_data ['lvl'], $db_data ['class'], $shop );
		
		$qry->bindParam ( ':type', $items [$a] ['item_type'] );
		$qry->bindParam ( ':iid', $items [$a] ['item_id'] );
		$qry->bindParam ( ':dmin', $items [$a] ['dmg_min'] );
		$qry->bindParam ( ':dmax', $items [$a] ['dmg_max'] );
		$qry->bindParam ( ':at1', $items [$a] ['atr_type_1'] );
		$qry->bindParam ( ':at2', $items [$a] ['atr_type_2'] );
		$qry->bindParam ( ':at3', $items [$a] ['atr_type_3'] );
		$qry->bindParam ( ':av1', $items [$a] ['atr_val_1'] );
		$qry->bindParam ( ':av2', $items [$a] ['atr_val_2'] );
		$qry->bindParam ( ':av3', $items [$a] ['atr_val_3'] );
		$qry->bindParam ( ':gold', $items [$a] ['gold'] );
		$qry->bindParam ( ':mush', $items [$a] ['mush'] );
		$qry->bindParam ( ':slot', $a );
		$qry->bindParam ( ':owner', $db_data ['user_id'] );
		if (! $qry->execute ()) {
			var_dump ( $qry->errorInfo () );
		}
	}
	
	return $items;
}
function rerollItems($shop, $db_data) {
	global $db;
	
	// return items for the shop specified
	$ret = array ();
	
	$tables = array (
			"items_shakes",
			"items_fidget" 
	);
	
	// reset update time
	$time = strtotime ( 'tomorrow' );
	$qry = $db->prepare ( "UPDATE user_data SET shop_reroll_time = :time WHERE user_id = :uid" );
	$qry->bindParam ( ':time', $time );
	$qry->bindParam ( ':uid', $db_data ['user_id'] );
	$qry->execute ();
	
	for($i = 0; $i < 2; $i ++) {
		$items = array ();
		for($a = 0; $a < 6; $a ++)
			$items [] = genItem ( $db_data ['lvl'], $db_data ['class'], $i );
		
		if ($i == $shop)
			$ret = $items;
			
			// update db
		$qry = $db->prepare ( "DELETE FROM " . $tables [$i] . " WHERE owner_id = :uid" );
		$qry->bindParam ( ':uid', $db_data ['user_id'] );
		$qry->execute ();
		
		$qry = $db->prepare ( "INSERT INTO " . $tables [$i] . "(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id)
				VALUES(:type, :iid, :dmin, :dmax, :at1, :at2, :at3, :av1, :av2, :av3, :gold, :mush, :slot, :owner)" );
		$slot = 0;
		foreach ( $items as $item ) {
			// set slot && owner id
			$item ['owner_id'] = $db_data ['user_id'];
			$item ['slot'] = $slot;
			$slot ++;
			
			$qry->bindParam ( ':type', $item ['item_type'] );
			$qry->bindParam ( ':iid', $item ['item_id'] );
			$qry->bindParam ( ':dmin', $item ['dmg_min'] );
			$qry->bindParam ( ':dmax', $item ['dmg_max'] );
			$qry->bindParam ( ':at1', $item ['atr_type_1'] );
			$qry->bindParam ( ':at2', $item ['atr_type_2'] );
			$qry->bindParam ( ':at3', $item ['atr_type_3'] );
			$qry->bindParam ( ':av1', $item ['atr_val_1'] );
			$qry->bindParam ( ':av2', $item ['atr_val_2'] );
			$qry->bindParam ( ':av3', $item ['atr_val_3'] );
			$qry->bindParam ( ':gold', $item ['gold'] );
			$qry->bindParam ( ':mush', $item ['mush'] );
			$qry->bindParam ( ':slot', $item ['slot'] );
			$qry->bindParam ( ':owner', $item ['owner_id'] );
			$qry->execute ();
		}
	}
	
	return $ret;
}
// EXP FUNCTION 3 - (x^0.1683)
function getQuestExp($lvl) {
	
	return ($lvl * $lvl / 5 * 16);
// 	return ($lvl * 200);
	
	
// 	$m = '0.1683';
	
// // 	if($lvl >= 350)
// // 		$m = '0.43';
	
// 	$lvl = ( int ) $lvl;
// 	$ret = ((3 - pow ( $lvl, $m )) / 20) * $GLOBALS ['LEVELS'] [$lvl];
// 	return $ret;
}

$LEVELS = array (
		400,
		900,
		1400,
		1800,
		2200,
		2890,
		3580,
		4405,
		5355,
		6435,
		7515,
		8925,
		10335,
		11975,
		13715,
		15730,
		17745,
		20250,
		22755,
		25620,
		28660,
		32060,
		35460,
		39535,
		43610,
		48155,
		52935,
		58260,
		63585,
		69760,
		75935,
		82785,
		89905,
		97695,
		105485,
		114465,
		123445,
		133260,
		143425,
		154545,
		165665,
		178210,
		190755,
		204430,
		218540,
		233785,
		249030,
		266140,
		283250,
		301715,
		320685,
		341170,
		361655,
		384360,
		407065,
		431545,
		456650,
		483530,
		510410,
		540065,
		569720,
		601435,
		633910,
		668670,
		703430,
		741410,
		779390,
		819970,
		861400,
		905425,
		949450,
		997485,
		1045520,
		1096550,
		1148600,
		1203920,
		1259240,
		1319085,
		1378930,
		1442480,
		1507225,
		1575675,
		1644125,
		1718090,
		1792055,
		1870205,
		1949685,
		2033720,
		2117755,
		2208040,
		2298325,
		2393690,
		2490600,
		2592590,
		2694580,
		2803985,
		2913390,
		3028500,
		3145390,
		3268435,
		3391480,
		3522795,
		3654110,
		3792255,
		3932345,
		4079265,
		4226185,
		4382920,
		4539655,
		4703955,
		4870500,
		5045205,
		5219910,
		5405440,
		5590970,
		5785460,
		5982490,
		6188480,
		6394470,
		6613125,
		6831780,
		7060320,
		7291640,
		7533530,
		7775420,
		8031275,
		8287130,
		8554570,
		8825145,
		9107305,
		9389465,
		9687705,
		9985945,
		10296845,
		10611275,
		10939230,
		11267185,
		11612760,
		11958335,
		12318585,
		12682650,
		13061390,
		13440130,
		13839160,
		14238190,
		14653230,
		15072545,
		15508870,
		15945195,
		16403485,
		16861775,
		17338505,
		17819980,
		18319895,
		18819810,
		19344795,
		19869780,
		20414715,
		20964770,
		21536005,
		22107240,
		22705735,
		23304230,
		23925545,
		24552535,
		25202340,
		25852145,
		26532725,
		27213305,
		27918540,
		28630050,
		29367610,
		30105170,
		30875945,
		31646720,
		32445505,
		33251010,
		34084530,
		34918050,
		35789075,
		36660100,
		37561220,
		38469755,
		39410080,
		40350405,
		41330960,
		42311515,
		43326065,
		44348735,
		45405405,
		46462075,
		47563900,
		48665725,
		49804020,
		50951005,
		52136360,
		53321715,
		54555530,
		55789345,
		57064175,
		58348500,
		59673840,
		60999180,
		62378435,
		63757690,
		65180715,
		66614100,
		68093535,
		69572970,
		71110105,
		72647240,
		74233350,
		75830465,
		77476555,
		79122645,
		80832985,
		82543325,
		84305910,
		86080505,
		87909870,
		89739235,
		91636870,
		93534505,
		95490375,
		97459260,
		99486380,
		101513500,
		103616290,
		105719080,
		107883715,
		110062180,
		112305475,
		114548770,
		116872700,
		119196630,
		121589225,
		123996780,
		126473000,
		128949220,
		131514215,
		134079210,
		136717090,
		139371155,
		142101400,
		144831645,
		147656105,
		150480565,
		153385655,
		156307860,
		159310695,
		162313530,
		165420140,
		168526750,
		171718645,
		174929030,
		178228565,
		181528100,
		184937365,
		188346630,
		191849945,
		195373130,
		198990370,
		202607610,
		206345275,
		210082940,
		213920015,
		217778100,
		221739815,
		225701530,
		229790630,
		233879730,
		238078150,
		242299140,
		246629445,
		250959750,
		255429090,
		259898430,
		264482960,
		269091720,
		273820565,
		278549410,
		283425105,
		288300800,
		293302740,
		298330180,
		303483865,
		308637550,
		313951595,
		319265640,
		324712695,
		330187105,
		335799860,
		341412615,
		347193920,
		352975225,
		358901970,
		364857940,
		370959350,
		377060760,
		383345695,
		389630630,
		396068325,
		402536785,
		409164155,
		415791525,
		422612215,
		429432905,
		436420230,
		443440385,
		450627180,
		457813975,
		465210300,
		472606625,
		480177945,
		487784290,
		495572280,
		503360270,
		511368340,
		519376410,
		527574890,
		535810100,
		544235725,
		552661350,
		561325655,
		569989960,
		578853765,
		587756750,
		596866840,
		605976930,
		615337095,
		624697260,
		634274025,
		643892430,
		653727435,
		663562440,
		673667980,
		683773520,
		694105920,
		704481995,
		715093150,
		725704305,
		736599015,
		747493725,
		758634285,
		769821230,
		781254025,
		792686820,
		804425165,
		816163510,
		828158780,
		856843923,
		903283173,
		958437234,
		1000000000,
		1074683294,
		1284736283,
		1465423455,
		1675464565,
		1843534543,
		2000000000,
		2456435435,
		2854353453,
		3400543334,
		3805433454,
		4500534534,
		5000000000,
		6006453433,
		7435345435,
		8543534543,
		10000000000,
		10534543543,
		11543543534,
		12543543534,
		14564345344,
		16435435346,
		19024231123,
		21254322133,
		25323423423,
		30544353453,
		36050000653,
		45043534543,
		55040353534,
		68435345345,
		82453454354,
		100000000000,
		150000000000,
		200000000000,
		500000000000,
		1000000000000,
		10000000000000,
		100000000000000,
		1000000000000000,
		10000000000000000,
		100000000000000000,
		1000000000000000000,
		99999999999999999999,
		999999999999999999999,
		
);
function getStatCost($class, $race, $stat_index, $stat) {
	$base = loadDefaultStats ( $class, $race );
	// var_dump($base, $stat);
	$stat -= $base [$stat_index - 1];
	
	// STAT COST
	$attPriceLimitation = false;
	$GoldKurve = array (
			0,
			25,
			50,
			75 
	);
	$TrueAttPreis = array ();
	
	for($i = 4; $i <= 15000; $i ++) {
		$GoldKurve [$i] = ((( int ) ($GoldKurve [($i - 1)]) + ( int ) (($GoldKurve [(($i / 2))] / 3))) + ( int ) (($GoldKurve [(( int ) ($i / 3))] / 4)));
		$GoldKurve [$i] = ( int ) (($GoldKurve [$i] / 5));
		$GoldKurve [$i] = ($GoldKurve [$i] * 5);
	}
	
	for($i = 0; $i <= 15000; $i ++) {
		$TrueAttPreis [$i] = $GoldKurve [( int ) ((1 + ($i / 5)))];
	}
	
	for($i = 0; $i < 14996; $i ++) {
		if ($attPriceLimitation) {
			$TrueAttPreis [$i] = 1000000000; // 0x3B9ACA00;
		} else {
			$TrueAttPreis [$i] = ((((( int ) ($TrueAttPreis [$i]) + ($TrueAttPreis [($i + 1)])) + ( int ) ($TrueAttPreis [($i + 2)])) + ( int ) ($TrueAttPreis [($i + 3)])) + ( int ) ($TrueAttPreis [($i + 4)]));
			$TrueAttPreis [$i] = ( int ) (($TrueAttPreis [$i] / 5));
			$TrueAttPreis [$i] = ( int ) (($TrueAttPreis [$i] / 5));
			$TrueAttPreis [$i] = ( int ) (($TrueAttPreis [$i] * 5));
			if ($TrueAttPreis [$i] > 1000000000) {
				$TrueAttPreis [$i] = 1000000000;
				$attPriceLimitation = true;
			}
		}
	}
	$i = 1;
	
	return $TrueAttPreis [$stat];
}

$ACT_LOGIN_FOLLOW_UP = "503";
$ACT_REGISTER = "001";
$ACT_LOGIN = "002";
$ACT_LOGOUT = "535";
$ACT_HERO = "004";
$ACT_ENTER_DUNGEON = "008";
$ACT_ENDQUEST = "010";
$ACT_TAVERN_ENTER = "010";
$ACT_ARENA_ENTER = "011";
$ACT_WORK_ENTER = "012";
$ACT_ENTER_SHOP_SHAKES = "013";
$ACT_ENTER_SHOP_FIDGET = "014";
$ACT_BARN = "015";
$ACT_SCREEN_PILZDEALER = "016";
$ACT_WHISPER = "537";
$ACT_BUY_MOUNT = "020";
$ACT_VIEW_GUILD = "023";
$ACT_ENTER_GUILD = "006";
$ACT_CREATE_GUILD = "101";
$ACT_GUILD_DELETE = "102";
$ACT_GUILD_INVITE = "103";
$ACT_GUILD_EXPEL = "104";
$ACT_GUILD_SET_MASTER = "105";
$ACT_GUILD_SET_OFFICER = "106";
$ACT_GUILD_IMPROVE = "107";
$ACT_GUILD_SET_DESC = "108";
$ACT_GUILD_RENAME = "109";
$ACT_GUILD_JOIN = "110";
$ACT_GUILD_DONATE = "111";
$ACT_GUILD_JOIN_ATTACK = "112";
$ACT_GUILD_JOIN_DEFENSE = "113";
$ACT_GUILD_COMMENCE_ATTACK = "114";
$ACT_GUILD_INVITE_PLAYER = "115";
$ACT_PULL_CHAT_DATA = "";
$ACT_SEND_CHAT = "516";
$ACT_GET_CHAT_HISTORY = "517";
$ACT_MAIL = "005";
$ACT_MAIL_READ = "507";
$ACT_MAIL_DELETE = "508";
$ACT_MAIL_SEND = "509";
$ACT_ARENA = "512";
$ACT_VIEW_CHAR = "513";
$ACT_CHANGE_HERO_DESC = "514";
$ACT_SCREEN_WITCH = "322";
$ACT_SCREEN_TOILET = "303";
$ACT_TOILET_FLUSH  = "302";
$ACT_ENDWORK = "012";
$ACT_WORK = "502";
$ACT_WORK_CANCEL = "505";
$ACT_BUY_MOUNT_10 = "0201";
$ACT_BUY_MOUNT_20 = "0202";
$ACT_BUY_MOUNT_30 = "0203";
$ACT_BUY_MOUNT_50 = "0204";
$ACT_MAINQUEST = "519"; // dungeon
$ACT_DRINK_BEER = "518";
$ACT_GUILD_ENTER = "006";
$ACT_GUILD_DEF = "113%3B";
$ACT_GUILD_ATT = "112%3B";
$ACT_RANKING = "007";
$ACT_GUILD_RANKING = "024";
$ACT_USE_ITEM = "504";
$ACT_GAMBLE = "022";
$ACT_SETTINGS = "009";
$ACT_START_QUEST = "510";
$ACT_BUY_STAT = "021";
$ACT_REROLL_ITEMS = "506";
$ACT_BUY_LUXURY = "195";
$ACT_KILL_POTION = "27";
$ACT_QUEST_CANCEL = "511";
$ACT_QUEST_SKIP = "189";
$ACT_SCREEN_TOWER = "312";
$ACT_TOWER_TRY = "313";
$ACT_COPYCAT_BOOST = "314";
$ACT_ROB_PLAYER = "313";
$ACT_MOVE_COPYCAT_ITEM = "318";
$ACT_SCREEN_PILZDEALER = "16";
$ACT_SCREEN_WITCH = "322";
$ACT_WITCH_DONATE = "323";
$ACT_CHANGE_FACE = "801";
$ACT_DELETE_ACCOUNT = "802";
$ACT_CHANGE_NAME = "803";
$ACT_CHANGE_MAIL = "804";
$ACT_CHANGE_PASS = "805";
$ACT_FORGOT_PASSWORD = "3";

$SF_PAYMENT_ID = 0;
$SF_PLAYER_ID = 1;
$SF_LAST_ACTION_DATE = 2;
$SF_REGISTRATION_DATE = 3;
$SF_REGISTRATION_IP = 4;

$SF_MSG_COUNT = 5;
$SF_UNREAD_MSGS = 434;

$SF_VALIDATION_IP = 6;

// ???
$SF_CLASS_RANK = 12;

// tower

$SF_TOWER_LEVEL = 513;

// looks of the character
$SF_FACE_1 = 17;
$SF_FACE_2 = 18;
$SF_FACE_3 = 19;
$SF_FACE_4 = 20;
$SF_FACE_5 = 21;
$SF_FACE_6 = 22;
$SF_FACE_7 = 23;
$SF_FACE_8 = 24;
$SF_FACE_9 = 25;
$SF_FACE_10 = 26;

$SF_RACE = 27;
$SF_GENDER = 28;
$SF_CLASS = 29;

// validation???
$SF_VALIDATION = 6;

$GUILD_ATT_TIME = 365;
$GUILD_DEF_TIME = 367;

$SF_MSG_COUNT = 5;
$SF_LEVEL = 7;
$SF_EXP = 8;
$SF_EXP_REQ = 9;
$SF_HONOR = 10;
$SF_RANK = 11;
$SF_SILVER = 13;
$SF_MUSH = 14;
$SF_MSUH_GAINED = 15;
$SF_MUSH_SPEND = 16;
$SF_MUSH_MAY_DONATE = 437;
$SF_STATUS = 45; // 2 quest /1work /0none
$SF_WORK_LENGHT = 46; // depends on status
$SF_CHOSEN_QUEST = 46; // ^
$SF_ACT_ENDTIME = 47;

// beetwen the values - information about item in the slot bellow
// item type value
$SF_BACKPACK_SLOT1_TYPE = 168;
$SF_BACKPACK_SLOT2_TYPE = 180;
$SF_BACKPACK_SLOT3_TYPE = 192;
$SF_BACKPACK_SLOT4_TYPE = 204;
$SF_BACKPACK_SLOT5_TYPE = 216;

$ITEM_TYPE_WEAPON = 1;
$ITEM_TYPE_SHIELD = 2;
$ITEM_TYPE_CHEST = 3;
$ITEM_TYPE_BOOTS = 4;
$ITEM_TYPE_GLOVES = 5;
$ITEM_TYPE_HELMET = 6;
$ITEM_TYPE_BELT = 7;
$ITEM_TYPE_NECKLACE = 8;
$ITEM_TYPE_RING = 9;
$ITEM_TYPE_RELIC = 10;
$ITEM_TYPE_POTION = 12;
$ITEM_TYPE_KEY = 11;
$ITEM_TYPE_MIRROR_PIECE = 11;

// slot + value of constant to get the acctual value
$SF_ITEM_TYPE = 0;
$SF_ITEM_ID = 1; // ??
$SF_ITEM_DMG_MIN = 2;
$SF_ITEM_DMG_MAX = 3;
$SF_ITEM_ATTRIBTYP1 = 4;
$SF_ITEM_ATTRIBTYP2 = 5;
$SF_ITEM_ATTRIBTYP3 = 6;
$SF_ITEM_ATTRIBVAL1 = 7;
$SF_ITEM_ATTRIBVAL2 = 8;
$SF_ITEM_ATTRIBVAL3 = 9;
$SF_ITEM_GOLD = 10;
$SF_ITEM_MUSH = 11;

$ITEM_STAT_STR = 1;
$ITEM_STAT_AGI = 2;
$ITEM_STAT_INT = 3;
$ITEM_STAT_WIT = 4;
$ITEM_STAT_LUCK = 5;
$ITEM_STAT_ALL = 6;

// ITEM IDs

$ITEM_POT_AGI = 12;
$ITEM_POT_STR = 11;
$ITEM_POT_INT = 13;
$ITEM_POT_WIT = 14;
$ITEM_POT_LUCK = 15;
$ITEM_POT_HP = 16;

$SF_SHAKES_ITEM_1 = 288;
$SF_SHAKES_ITEM_2 = 300;
$SF_SHAKES_ITEM_3 = 312;
$SF_SHAKES_ITEM_4 = 324;
$SF_SHAKES_ITEM_5 = 336;
$SF_SHAKES_ITEM_6 = 348;

$SF_FIDGET_ITEM_1 = 361;
$SF_FIDGET_ITEM_2 = 373;
$SF_FIDGET_ITEM_3 = 385;
$SF_FIDGET_ITEM_4 = 397;
$SF_FIDGET_ITEM_5 = 409;
$SF_FIDGET_ITEM_6 = 421;

$SF_QUEST_DURATION_1 = 241;
$SF_QUEST_DURATION_2 = 242;
$SF_QUEST_DURATION_3 = 243;
$SF_QUEST_REWARD_1_TYPE = 244;
$SF_QUEST_REWARD_2_TYPE = 256;
$SF_QUEST_REWARD_3_TYPE = 268;
$SF_QUEST_DESC_1 = 232;
$SF_QUEST_DESC_2 = 233;
$SF_QUEST_DESC_3 = 234;
$SF_QUEST_EXP_1 = 280;
$SF_QUEST_EXP_2 = 281;
$SF_QUEST_EXP_3 = 282;
$SF_QUEST_GOLD_1 = 283;
$SF_QUEST_GOLD_2 = 284;
$SF_QUEST_GOLD_3 = 285;
$SF_MOUNT = 286;
$SF_MOUNT_DURATION = 451;
$SF_THIRST = 456; // w sekundach
$SF_BEERS = 457;
$SF_DUNGEON_DONE = 458; // max 100
$SF_DUNGEON_ENDTIME = 459;
$SF_ARENA_ENDTIME = 460;
// 0 = zamkniety, 1 = otwarty, 12 = skonczony 2-11 = (lvl-1)
$SF_DUNGEON_1 = 480;
$SF_DUNGEON_2 = 481;
$SF_DUNGEON_3 = 482;
$SF_DUNGEON_4 = 483;
$SF_DUNGEON_5 = 484;
$SF_DUNGEON_6 = 485;
$SF_DUNGEON_7 = 486;
$SF_DUNGEON_8 = 487;
$SF_DUNGEON_9 = 488;
$SF_DUNGEON_10 = 489;
$SF_DUNGEON_11 = 441;
$SF_DUNGEON_12 = 442;
$SF_DUNGEON_13 = 490;
// 0 nie zgloszony, 1 zgloszony na atak, 2 na obrone, 3 atak i obrona
$SF_GUILD_WAR_STATUS = 508;
$SF_GUILD_INDEX = 435;
$SF_GUILD_RANK = 436;

$SF_MUSHROOMS_MAY_DONATE = 437;
$SF_ALBUM = 438;

$SF_EXP_BONUS = 461;
$SF_GOLD_BONUS = 462;

$SF_DMG_MIN = 448;
$SF_DMG_MAX = 449;

$SF_SERVERTIME = 510;
$SF_SSID = 511;

//item??

$SG_QUEST_OFFER_REWARD_ITM1 = 245;

// achievements
$SF_ACHIEVEMENT_LVL = 465;
$SF_ACHIEVEMENT_DUNG = 466;
$SF_ACHIEVEMENT_ARENA = 467;
$SF_ACHIEVEMENT_QUEST = 468;
$SF_ACHIEVEMENT_WORK = 469;
$SF_ACHIEVEMENT_GOLD = 470;
$SF_ACHIEVEMENT_HONOR = 471;
$SF_ACHIEVEMENT_FRIEND = 472;

// char attributes
$SF_ATTR_STR = 30;
$SF_ATTR_AGI = 31;
$SF_ATTR_WIT = 33;
$SF_ATTR_INT = 32;
$SF_ATTR_LUCK = 34;
// char attribute bonuses from items
$SF_ATTR_STR_BONUS = 35;
$SF_ATTR_AGI_BONUS = 36;
$SF_ATTR_INT_BONUS = 37;
$SF_ATTR_WIT_BONUS = 38;
$SF_ATTR_LUCK_BONUS = 39;

$STATUS_QUEST = 2;
$STATUS_WORK = 1;
$STATUS_IDLE = 0;

$SF_TIME = time(); 

// guild ranks
$GR_LEADER = 2;
$GR_OFFICER = 1;
$GR_MEMBER = 0;

$ERR_NAME_EXISTS = "E001";
$ERR_NAME_TOO_SHORT = "E002";
$ERR_PASSWORD_TOO_SHORT = "E003";
$ERR_EMAIL_REJECTED = "E004";
$ERR_NAME_REJECTED = "E005";
$ERR_LOGIN_FAILED = "E006";
$ERR_TOO_EXPENSIVE = "E007";
$ERR_WRONG_PASSWORD = "E008";
$ERR_FACE_DATA_INCORRECT = "E009";
$ERR_EMAIL_WRONG = "E010";
$ERR_GENDER_OR_RACE = "E011";
$ERR_EMAIL_EXISTS = "E012";
$ERR_ALREADY_IN_GUILD = "E013";
$ERR_NO_INDEX_FREE = "E014";
$ERR_FIGHT_SELF = "E015";
$ERR_GUILD_NOT_FOUND = "E016";
$ERR_GUILD_NOT_ALLOWED = "E017";
$ERR_GUILD_LACK_MUSH = "E018";
$ERR_GUILD_LACK_GOLD = "E019";
$ERR_GUILD_BUILDING_NOT_FOUND = "E020";
$ERR_GUILD_BUILDING_MAX = "E021";
$ERR_GUILD_NOT_MEMBER = "E022";
$ERR_GUILD_MASTER_CANT_BE_OFFICER = "E023";
$ERR_GUILD_IS_FULL = "E024";
$ERR_GUILD_ALREADY_YOU_OTHER = "E025";
$ERR_GUILD_NOT_REAL_MEMBER = "E026";
$ERR_GUILD_ALREADY_YOU_THIS = "E027";
$ERR_GUILD_PLAYER_NOT_FOUND = "E028";
$ERR_SUBJECT_TOO_SHORT = "E029";
$ERR_GUILD_TOO_EXPENSIVE = "E030";
$ERR_GUILD_CHAT_NOT_MEMBER = "E031";
$ERR_GUILD_CHAT_HISTORY = "E032";
$ERR_GUILD_CHAT_TEXT_ERROR = "E033";
$ERR_BEER = "E034";
$ERR_BOOST = "E042";
$ERR_GUILD_NAME_REJECTED = "E043";
$ERR_GUILD_NAME_LENGTH = "E044";
$ERR_GUILD_NAME_CHARACTERS = "E045";
$ERR_GUILD_EMAIL_VALIDATE = "E046";
$ERR_GUILD_MUSH_FREE = "E047";
$ERR_ATTACK_AGAIN = "E048";
$ERR_REQUEST_PW = "E049";
$ERR_VALIDATE = "E050";
$ERR_NO_MUSH_BAR = "E035";
$ERR_NO_ENDURANCE = "E036";
$ERR_WORSE_MOUNT = "E037";
$ERR_GUILD_ALREADY_MEMBER = "E038";
$ERR_NOT_INVITED = "E039";
$ERR_NO_MUSH_PVP = "E040";
$ERR_NO_MUSH_MQ = "E041";
$ERR_GUILD_DONATE_NEG = "E051";
$ERR_GUILD_DONATE_FRA = "E052";
$ERR_LOCKED_PAYMENT = "E053";
$ERR_LOCKED_ADMIN = "E054";
$ERR_TOO_SOON = "E055";
$ERR_ACCOUNTS_PER_IP = "E056";
$ERR_PLACE_BET = "E057";
$ERR_INVENTORY_FULL = "E058";
$ERR_GUILD_FIGHT_TOO_EXPENSIVE = "E060";
$ERR_GUILD_ALREADY_UNDER_ATTACK = "E061";
$ERR_GUILD_ATTACK_DELAY = "E062";
$ERR_GUILD_ALREADY_ATTACKING = "E063";
$ERR_GUILD_ATTACK_STATUS = "E064";
$ERR_SESSION_ID_EXPIRED = "E065";
$ERR_STOP_TUNNELING = "E066";
$ERR_REVOLT_FAILED = "E067";
$ERR_JOINED_TOO_RECENTLY = "E068";
$ERR_SERVER_DOWN = "E069";
$ERR_MSG_LEVEL_TOO_LOW = "E084";
$ERR_MSG_NOT_VALIDATED = "E085";
$ERR_INVENTORY_FULL_ADV = "E086";
$ERR_INVITE_NOT_VALIDATED = "E090";
$ERR_INVITE_TOO_MANY = "E091";
$ERR_INVITE_EMAIL_REJECTED = "E092";
$ERR_NO_ALBUM = "E093";
$ERR_LUXURY_ALREADY = "E094";
$ERR_GUILD_RANK_WRONG = "E095";
$ERR_NO_CHAT_INFO = "E096";
$ERR_NO_CHAT_OVERFLOW = "E097";
$ERR_TOWER_CLOSED = "E098";
$ERR_TOWER_ITEMMOVE = "E100";
$ERR_TOWER_NO_COPYCATS = "E101";
$ERR_GUILD_DESCR_TOO_LONG = "E102";
$ERR_NO_SLOT_FOR_FLUSHING = "E307";
$ERR_TOILET_EMPTY = "E310";
$ERR_MSG_NO_SUCH_NAME = "204";
$ERR_DEALER_SPONSOR = "177";
$ERR_INBOX_FULL = "203";
$ERR_RECIPIENT_NOT_FOUND = "204";
$ERR_RECIPIENT_SELF = "205";
$ERR_DEALER_AKTION = "175";

$RESP_ACCOUNT_SUCCESS = 1;
$RESP_LOGIN_SUCCESS = 2;
$RESP_FAME_LIST = 3;
$RESP_SCREEN_BUILDCHAR = 4;
$RESP_SCREEN_WITCH = 324;
$RESP_GUILD_DATA = 101;
$RESP_SAVEGAME_STAY = 102;
$RESP_ARBEIT_ERLEDIGT = 103;
$RESP_ARBEIT_START = 104;
$RESP_ARBEIT_STOP = 105;
$RESP_QUEST_DONE = 106;
$RESP_QUEST_START = 107;
$RESP_QUEST_STOP = 108;
$RESP_PLAYER_DESC_SUCCESS = 109;
$RESP_PLAYER_SCREEN = 111;
$RESP_PLAYER_NOT_FOUND = 112;
$RESP_DEMO_SCREEN = 113;
$RESP_ATTACK_NOT_EXIST = 114;
$RESP_CHANGE_FACE_OK = 115;
$RESP_CHANGE_PASS_OK = 116;
$RESP_CHANGE_NAME_OK = 117;
$RESP_CHANGE_MAIL_OK = 118;
$RESP_DELETE_ACCOUNT_OK = 119;
$RESP_NO_LOGIN = 120;
$RESP_REQUEST_GUILD = 121;
$RESP_MAINQUEST = 122;
$RESP_GUILD_FOUND_SUCCESS = 150;
$RESP_GUILD_DELETE_SUCCESS = 151;
$RESP_GUILD_RENAME_SUCCESS = 152;
$RESP_GUILD_CHANGE_DESC_SUCCESS = 153;
$RESP_GUILD_IMPROVE_SUCCESS = 154;
$RESP_GUILD_OFFICER_SUCCESS = 155;
$RESP_GUILD_EXPEL_SUCCESS = 156;
$RESP_GUILD_INVITE_SUCCESS = 157;
$RESP_GUILD_JOIN_SUCCESS = 158;
$RESP_GUILD_MASTER_SUCCESS = 159;
$RESP_GUILD_DONATE_SUCCESS = 160;
$RESP_CHAT_HISTORY = 161;
$RESP_CHAT_LINE = 162;
$RESP_TRANS_COUNT = 163;
$RESP_EMAIL_RESENT = 164;
$RESP_PASSWORD_SENT = 165;
$RESP_VALIDATE_OK = 166;
$RESP_UPDATE_CHECK = 167;
$RESP_BET_WON = 168;
$RESP_BET_LOST = 169;
$RESP_SCREEN_GILDENHALLE = 170;
$RESP_OTHER_GUILD = 172;
$RESP_SAVEGAME_STAY_ERROR = 173;
$RESP_DEALER_AKTION = 174;
$RESP_DEALER_SPONSOR = 176;
$RESP_GUILD_FIGHT = 178;
$RESP_GUILD_JOIN_ATTACK_OK = 179;
$RESP_GUILD_JOIN_DEFENSE_OK = 180;
$RESP_GUILD_COMMENCE_ATTACK_OK = 181;
$RESP_GUILD_NAMES = 183;
$RESP_LOGIN_SUCCESS_BOUGHT = 184;
$RESP_REQUEST_GUILD_QUIET = 186;
$RESP_LOGOUT_SUCCESS = 187;
$RESP_QUEST_DONE_PIXEL = 188;
$RESP_WHISPER_SUCCESS = 190;
$RESP_INVITE_SUCCESS = 191;
$RESP_ALBUM = 192;
$RESP_QUEST_SKIP_ALLOWED = 193;
$RESP_QUEST_SKIP_ALLOWED_START = 194;
$RESP_TOILET_LOCKED = 304;
$RESP_TOILET_DROPPED = 305;
$RESP_TOILET_FULL = 306;
$RESP_TOILET_FLUSHED = 308;
$RESP_TOILET_UNLOCKED = 309;
$RESP_TOILET_TANKFULL = 311;
$REPS_TOILET_DROPTWICE = 357;
$RESP_TOWER_SAVE = 315;
$RESP_SAVEGAME_SHARD = 316;
$RESP_SAVEGAME_MIRROR = 317;
$RESP_MOVE_TOWER_ITEM = 319;
$RESP_TOWER_FIGHT = 321;
$RESP_SCREEN_WITCH = 324;
$RESP_READ_MESSAGE = 201;
$RESP_MESSAGE_SENT = 202;

$RACE_HUMAN = 1;
$RACE_ELF = 2;
$RACE_DWARF = 3;
$RACE_GNOME = 4;
$RACE_ORC = 5;
$RACE_DARK_ELF = 6;
$RACE_GOBLIN = 7;
$RACE_DEMON = 8;

$CLASS_WARRIOR = 1;
$CLASS_MAGE = 2;
$CLASS_ROUGE = 3;

$MOUNT_10 = 1;
$MOUNT_20 = 2;
$MOUNT_30 = 3;
$MOUNT_50 = 4;
function mountCost($mount) {
	$ret = array ();
	
	switch ($mount) {
		case $GLOBALS ['MOUNT_10'] :
			$ret ['silver'] = 100;
			$ret ['shroom'] = 0;
			break;
		case $GLOBALS ['MOUNT_20'] :
			$ret ['silver'] = 500;
			$ret ['shroom'] = 0;
			break;
		case $GLOBALS ['MOUNT_30'] :
			$ret ['silver'] = 1000;
			$ret ['shroom'] = 1;
			break;
		case $GLOBALS ['MOUNT_50'] :
			$ret ['silver'] = 0;
			$ret ['shroom'] = 25;
			break;
	}
	
	return $ret;
}

// returns arrray of default stats: str/agi/int/wit/luck
function loadDefaultStats($class, $race) {
	$ret = array_fill ( 0, 5, 10 );
	
	switch ($class) {
		case $GLOBALS ['CLASS_WARRIOR'] :
			$ret [0] += 7;
			$ret [1] += 3;
			$ret [3] += 5;
			break;
		case $GLOBALS ['CLASS_MAGE'] :
			$ret [2] += 8;
			$ret [3] += 2;
			$ret [4] += 5;
			break;
		case $GLOBALS ['CLASS_ROUGE'] :
			$ret [0] += 1;
			$ret [1] += 7;
			$ret [2] += 1;
			$ret [3] += 4;
			$ret [4] += 2;
			break;
	}
	switch ($race) {
		case $GLOBALS ['RACE_ORC'] :
			$ret [0] += 1;
			$ret [2] -= 1;
			break;
		case $GLOBALS ['RACE_ELF'] :
			$ret [0] -= 1;
			$ret [1] += 2;
			$ret [3] -= 1;
			break;
		case $GLOBALS ['RACE_DARK_ELF'] :
			$ret [0] -= 2;
			$ret [1] += 2;
			$ret [2] += 1;
			$ret [3] -= 1;
			break;
		case $GLOBALS ['RACE_DWARF'] :
			$ret [1] -= 2;
			$ret [2] -= 1;
			$ret [3] += 2;
			$ret [4] += 1;
			break;
		case $GLOBALS ['RACE_GOBLIN'] :
			$ret [0] -= 2;
			$ret [1] += 2;
			$ret [3] -= 1;
			$ret [4] += 1;
			break;
		case $GLOBALS ['RACE_GNOME'] :
			$ret [0] -= 2;
			$ret [1] += 3;
			$ret [2] -= 1;
			$ret [3] -= 1;
			$ret [4] += 1;
			break;
		case $GLOBALS ['RACE_DEMON'] :
			$ret [0] += 3;
			$ret [1] -= 1;
			$ret [3] += 1;
			$ret [4] -= 3;
			break;
		default :
			break;
	}
	
	return $ret;
}
function getGoldForWork($lvl) {
	return $lvl * 15000;
}

// for action add stat mysql qry
function getStatName($a) {
	switch ($a) {
		case 1 :
			return "str";
		case 2 :
			return "agi";
		case 3 :
			return "int";
		case 4 :
			return "wit";
		case 5 :
			return "luck";
	}
}
// returns slot number for item type
function getSlotIndex($type) {
	$type = ( int ) $type;
	// $ITEM_TYPE_RELIC = 10;
	// $ITEM_TYPE_RING = 9;
	// $ITEM_TYPE_BELT = 7;
	// $ITEM_TYPE_NECKLACE = 8;
	// $ITEM_TYPE_HELMET = 6;
	switch ($type) {
		// weapon
		case 1 :
			return 8;
		// shield
		case 2 :
			return 9;
		// chest
		case 3 :
			return 1;
		// boots
		case 4 :
			return 3;
		// gloves
		case 5 :
			return 2;
		// helmet
		case 6 :
			return 0;
		// belt
		case 7 :
			return 5;
		// necklace
		case 8 :
			return 4;
		// ring
		case 9 :
			return 6;
		// relic
		case 10 :
			return 7;
		// key
		case 11 :
			return 10; //something
		// potion
		case 12 :
			return 10; //something
	}
}
function mountMultiplier($mount) {
	switch ($mount) {
		case 0 :
			return 1;
		case 1 :
			return '0.9';
		case 2 :
			return '0.8';
		case 3 :
			return '0.7';
		case 4 :
			return '0.5';
	}
}
function getHp($db_data) {
	switch ($db_data ['class']) {
		case 1 :
			$k = 5;
			break;
		case 2 :
			$k = 2;
			break;
		case 3 :
			$k = 4;
			break;
	}
	
	$hp = ( int ) $db_data ['attr_wit'] * $k * (( int ) $db_data ['lvl'] + 1);
	return $hp;
}
// SQLI protection for dungeon stage updating
function getDungeonTableName($dung) {
	if (( int ) $dung > 13)
		exit ( "don't try anything..." );
	
	return "dungeon_" . $dung;
}
function getGuildBuildingCost($current_lvl) {
	$current_lvl ++;
	$ret = array (
			"mushroom" => ($current_lvl - 25) * 5,
			"silver" => 0 
	);
	
	if ($ret ['mushroom'] < 0)
		$ret ['mushroom'] = 0;
	
	switch ($current_lvl) {
		case 1 :
			$ret ['silver'] = 500;
			break;
		case 2 :
			$ret ['silver'] = 900;
			break;
		case 3 :
			$ret ['silver'] = 1500;
			break;
		case 4 :
			$ret ['silver'] = 2200;
			break;
		case 5 :
			$ret ['silver'] = 3200;
			break;
		case 6 :
			$ret ['silver'] = 4500;
			break;
		case 7 :
			$ret ['silver'] = 6000;
			break;
		case 8 :
			$ret ['silver'] = 7800;
			break;
		case 9 :
			$ret ['silver'] = 10100;
			break;
		case 10 :
			$ret ['silver'] = 12800;
			break;
		case 11 :
			$ret ['silver'] = 16000;
			break;
		case 12 :
			$ret ['silver'] = 19700;
			break;
		case 13 :
			$ret ['silver'] = 24000;
			break;
		case 14 :
			$ret ['silver'] = 29100;
			break;
		case 15 :
			$ret ['silver'] = 34800;
			break;
		case 16 :
			$ret ['silver'] = 41200;
			break;
		case 17 :
			$ret ['silver'] = 48700;
			break;
		case 18 :
			$ret ['silver'] = 57000;
			break;
		case 19 :
			$ret ['silver'] = 66400;
			break;
		case 20 :
			$ret ['silver'] = 77000;
			break;
		case 21 :
			$ret ['silver'] = 88800;
			break;
		case 22 :
			$ret ['silver'] = 101800;
			break;
		case 23 :
			$ret ['silver'] = 116400;
			break;
		case 24 :
			$ret ['silver'] = 132500;
			break;
		case 25 :
			$ret ['silver'] = 150200;
			break;
		case 26 :
			$ret ['silver'] = 169900;
			break;
		case 27 :
			$ret ['silver'] = 191400;
			break;
		case 28 :
			$ret ['silver'] = 214900;
			break;
		case 29 :
			$ret ['silver'] = 240800;
			break;
		case 30 :
			$ret ['silver'] = 269000;
			break;
		case 31 :
			$ret ['silver'] = 299600;
			break;
		case 32 :
			$ret ['silver'] = 333000;
			break;
		case 33 :
			$ret ['silver'] = 369200;
			break;
		case 34 :
			$ret ['silver'] = 408300;
			break;
		case 35 :
			$ret ['silver'] = 450900;
			break;
		case 36 :
			$ret ['silver'] = 496800;
			break;
		case 37 :
			$ret ['silver'] = 546100;
			break;
		case 38 :
			$ret ['silver'] = 599600;
			break;
		case 39 :
			$ret ['silver'] = 656900;
			break;
		case 40 :
			$ret ['silver'] = 718400;
			break;
		case 41 :
			$ret ['silver'] = 784700;
			break;
		case 42 :
			$ret ['silver'] = 855700;
			break;
		case 43 :
			$ret ['silver'] = 931500;
			break;
		case 44 :
			$ret ['silver'] = 1012900;
			break;
		case 45 :
			$ret ['silver'] = 1099700;
			break;
		case 46 :
			$ret ['silver'] = 1192200;
			break;
		case 47 :
			$ret ['silver'] = 1291200;
			break;
		case 48 :
			$ret ['silver'] = 1396500;
			break;
		case 49 :
			$ret ['silver'] = 1508200;
			break;
		case 50 :
			$ret ['silver'] = 1627700;
			break;
	}
	return $ret;
}

function calculateHonor($p1, $op, $win) {
	
	// if($win){
	// $honor =
	// }else{
	
	// }
	if ($win === TRUE) {
		$diff = $p1 ['honor'] - $op ['honor'];
		$honor = 100 - ($diff / 10);
		// var_dump ( $diff );
	} else {
		$diff = $op ['honor'] - $p1 ['honor'];
		$honor = 100 - ($diff / 10);
	}
	// var_dump($honor);
	
	if ($honor < 0)
		$honor = 0;
	else if ($honor > 200)
		$honor = 200;
	
	//TODO: check if honor goes bellow 0
// 	if($win === TRUE && $op['honor']>$honor)
// 		$honor = $op['honor'];
// 	else if ($win === FALSE && $p1['honor']<$honor)
// 		$honor = $p1['honor'];

	if($win === TRUE){
		if($honor > $op['honor'])
			$honor = $op['honor'];
	}else{
		if($honor > $p1['honor'])
			$honor = $p1['honor'];
	}
	
	if($honor < 0)
		$honor = 0;
	
	$a = $win ? 1 : - 1;
	
	return $honor * $a;
}
// reverses the perspective/character places for arena logs
function reverseArenaLog($log) {
	$log = explode ( ';', $log );
	
	// ----looks - first index------
	$looks = explode ( '/', $log [0] );
	$stats = array ();
	for($i = 6; $i <= 11; $i ++)
		$stats [] = $looks [$i];
	
	for($i = 0; $i <= 5; $i ++)
		$stats [] = $looks [$i];
	
	$log [0] = join ( '/', $stats );
	// ------------------------------
	
	// -----logs - 2nd index-------
	$logs = explode ( '/', $log [1] );
	$flogs = array();
	
	$i = 0;
	while($i < count($logs)){
		$flogs[] = $logs[$i + 3];
		$flogs[] = $logs[$i + 4];
		$flogs[] = $logs[$i + 5];
		
		$flogs[] = $logs[$i + 0];
		$flogs[] = $logs[$i + 1];
		$flogs[] = $logs[$i + 2];
		
		$i += 6;
	}
	
	$log[1] = join('/', $flogs);
	// ----------------------------
	
	//-----looks, 3rd index ------
	$looks = explode('/', $log[2]);
	$flooks = array();
	
	for($i = 15; $i <= 29; $i++)
		$flooks[] = $looks[$i];
	for($i = 0; $i <= 14; $i++)
		$flooks[] = $looks[$i];
	
	$log[2] = join('/', $flooks);
	//----------------------------
	
	//---weapons, 4th index-----
	$weap = explode('/', $log[3]);
	$fweap = array();
	
	for($i = 12; $i < 24; $i++)
		$fweap[] = $weap[$i];
	for($i = 0; $i < 12 ;$i++)
		$fweap[] = $weap[$i];
	
	$log[3] = join('/', $fweap);
	//----------------------------
	
	//honor gained
	$log[7] = (int)$log[7] * -1;
	
	$ret = join ( ';', $log );
	return $ret;
	
	// if arg array
	// //-------stat part---------
	// $stats1 = array();
	// for($i = 0; $i <= 5; $i++)
	// $stats1[] = $log[$i];
	
	// $stats2 = array();
	// for($i = 6; $i <=10; $i++)
	// $stats2[] = $log[$i];
	
	// $stats2[] = explode(';', $log[11]);
	// $stats2[5] = $stats2[5][0];
	// //-------------------------
	
	// //LOGS
	// $logs = array($stats2[0], 0, 0, $stats1[0]);
	
	// $i = 12;
	// while(strpos($log[$i],';') === false){
	// $logs[] = $log[$i];
	// $i++;
	// }
	// $first = str_replace(';', '', $log[$i]);
	// $looks1 = array($first);
	// $i++;
	// for($a = 0; $a < 14; $a++){
	// $looks1[] = $log[$i];
	// $i++;
	// }
	
	// $looks2 = array();
	// for($a = 0; $a < 14; $a++){
	// $looks2[] = $log[$i];
	// $i++;
	// }
	// $last = explode(';', $)
	
	// //RETURN
	// $ret = array();
	
	// foreach($stats2 as $s)
	// $ret[] = $s;
	// foreach($stats1 as $s)
	// $ret[] = $s;
	// foreach($logs as $l)
	// $ret[] = $l;
	// foreach($looks2 as $l)
	// $ret[] = $l;
	// foreach($looks1 as $l)
	// $ret = $l;
	
	// return $ret;
}
function finishQuest($db_data){
	global $ret, $db, $LEVELS, $SSID;
	
	$OP = getQuestMonster ( $db_data );
	$p = new Char ( $db_data );
		
	// response
	$t_ret = array ();
	
	// player stats
	array_push ( $t_ret, "122" . $p->getHP (), $p->getStr (), $p->getDex (), $p->getInt (), $p->getWit (), $p->getLuck () );
		
	// mob stats
	array_push ( $t_ret, $OP->getHP (), $OP->getStr (), $OP->getDex (), $OP->getInt (), $OP->getWit (), $OP->getLuck () . ";" ); // . $p->getHp () );
		                                                                                                                             
	// simulation
	$sim = SF_Calc::calculateWin ( $p, $OP );
		
	$win = $sim [count ( $sim ) - 1] [0] <= 0 ? true : false;
	
	$t_ret [count ( $t_ret ) - 1] .= $sim [0] [0];
	
	// if win -> update exp, lvl, etc...
	if ($win) {
	
	$mushRand = rand(1, 20);

	if (event () == 4 or event () == 5){ // if mushroom event or chirstmas event
		$mushRand = rand(5, 10);
	}
	
	if ($mushRand == 1){
		$mushReward = 1;
		$db_data ['mushroom'] = $db_data ['mushroom'] + $mushReward;
	} else {
		$mushReward = 0;
	}
	
	// picked quest
	$pq = $db_data ['status_extra'];
	// duration
	$dur = 30 * $db_data ['quest_dur_' . $pq];
	// guild bonuses
	$ebonus = 1 + (($db_data ['instructor'] + $db_data ['dung']) / 50);
	$gbonus = 1 + (($db_data ['treasure'] + $db_data ['dung']) / 50);
	// add rewards
	$db_data ['silver'] = $db_data ['silver'] + ($db_data ['quest_gold_' . $pq] * $gbonus);
	$db_data ['exp'] = $db_data ['exp'] + ($db_data ['quest_exp_' . $pq] * $ebonus);
	
	$db_data ['medal_adventurer'] = $db_data ['medal_adventurer'] + 1;
	
	$item_slot = 10;
	
			$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 10 AND owner_id = " . $db_data['user_id'] );  
			$qry->execute ();
			if ($qry->rowCount () < 1) {
				$item_slot = 10;
				$allowItemReward = true;
			} else {
				$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 11 AND owner_id = " . $db_data['user_id'] );  
				$qry->execute ();
				if ($qry->rowCount () < 1) {
					$item_slot = 11;
					$allowItemReward = true;
				} else {
					$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 12 AND owner_id = " . $db_data['user_id'] );  
					$qry->execute ();
					if ($qry->rowCount () < 1) {
						$item_slot = 12;
						$allowItemReward = true;
					} else {
						$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 13 AND owner_id = " . $db_data['user_id']);  
						$qry->execute ();
						if ($qry->rowCount () < 1) {
							$item_slot = 13;
							$allowItemReward = true;
						} else {
							$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 14 AND owner_id = " . $db_data['user_id'] );  
							$qry->execute ();
							if ($qry->rowCount () < 1) {
								$item_slot = 14;
								$allowItemReward = true;
							} else {
								$allowItemReward = false;
							}
						}
					}
				}
			}
			
	if ($allowItemReward == true) {
			
		$qry = $db->prepare ( "SELECT * FROM items_tavern 
		WHERE owner_id = :uid AND quest = $pq" );
		$qry->bindParam ( ':uid', $db_data ['user_id'] );
		$qry->execute ();
		
		$items = $qry->fetchAll ();
	
		foreach ( $items as $item ) {
	
		$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
				VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
				' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
				' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item_slot . ',' . $db_data['user_id'] . ')' );   
		$qry->execute ();
	
		}
	
	}
	
	
	
	// subtract thirst
	$mount = 0;
	$time = new DateTime ();
	$time = $time->getTimestamp ();
	if ($time < ( int ) $db_data ['mount_dur']) {
		$mount = $db_data ['mount'];
	}
	$db_data ['thirst'] = ( int ) $db_data ['thirst'] - ($dur * mountMultiplier ( $mount ));
	
	// lvl up
	while ( ( int ) $db_data ['exp'] > $LEVELS [$db_data ['lvl']] ) {
		$db_data ['exp'] = ( int ) $db_data ['exp'] - $LEVELS [$db_data ['lvl']];
		$db_data ['lvl'] = ( int ) $db_data ['lvl'] + 1;
	}
	
	} // end if win
	
	// generate new quests
	$quests = array ();
	
	for($i = 0; $i < 3; $i ++) {
		// multiplier
		$m = mt_rand ( 900, 1100 ) / 1000;
		
		$lvl = $db_data ['lvl'];
		
		$randomMore = rand(1, 5);
		$extra = 1;
		if ($lvl > 49){
			$l = rand(2, 13) * 2;
			if($db_data ['thirst'] < 10){
				$l / 2;
			}
		} elseif ($lvl < 50 and $lvl > 19){
			$l = rand(4, 10) * 2;
			if($db_data ['thirst'] < 10){
				$l / 2;
			}
		} else {
			$l = rand(1, 12);
		}
			
		if ($randomMore == 1 and $db_data ['thirst'] > 19){ // quests with more reward
			$extra = rand(2, 3);
			if ($lvl > 49){
				$l = rand(10, 17) * 2;
			} elseif ($lvl < 50 and $lvl > 19){
				$l = rand(7, 14) * 2;
			} else {
				$l = rand(6, 18);
			}
		}
		
		$tpBonus = 1;
		$goldBonus = 1;
		$epicBonus = 0;
		$mushBonus = 1;
		
		if (event () == 1){ // tp event
		$tpBonus = 1.5;
		}
		if (event () == 3){ // gold event
		$goldBonus = 2;
		}
		if (event () == 5){ // chirstmas event
		$tpBonus = 1.5;
		$goldBonus = 2;
		$mushBonus = 3;
		}
			
		$quests [] = array (
				(rand($lvl * $lvl * ($lvl * 5 + 10), $lvl * $lvl * ($lvl * 7 + 12)) / 10 * $extra + rand($lvl * 25 + 100, $lvl * 25 + 300)) * $goldBonus,
				(getQuestExp ( $lvl ) * $l * $m * $extra / 25 + rand($lvl * 25 + 100, $lvl * 25 + 300)) * $tpBonus,
				$l
		);
	}
	
	// update database
	$qry = $db->prepare ( "UPDATE user_data SET
						silver = :silver,
						exp = :exp,
						mushroom = :mushroom,
						lvl = :lvl,
						status = 0,
						thirst = :awa,
						medal_adventurer = :medal_adventurer,
						quest_location_1 = :ql1,
						quest_location_2 = :ql2,
						quest_location_3 = :ql3,
						quest_gold_1 = :qg1,
						quest_gold_2 = :qg2,
						quest_gold_3 = :qg3,
						quest_exp_1 = :qe1,
						quest_exp_2 = :qe2,
						quest_exp_3 = :qe3,
						quest_dur_1 = :qd1,
						quest_dur_2 = :qd2,
						quest_dur_3 = :qd3
						WHERE ssid = :ssid" );
	$qry->bindParam ( ':ssid', $SSID );
	$qry->bindParam ( ':silver', $db_data ['silver'] );
	$qry->bindParam ( ':exp', $db_data ['exp'] );
	$qry->bindParam ( ':mushroom', $db_data ['mushroom'] );
	$qry->bindParam ( ':lvl', $db_data ['lvl'] );
	$qry->bindParam ( ':awa', $db_data ['thirst'] );
	$qry->bindParam ( ':ql1', rand(1, 21) );
	$qry->bindParam ( ':ql2', rand(1, 21) );
	$qry->bindParam ( ':ql3', rand(1, 21) );
	$qry->bindParam ( ':medal_adventurer', $db_data ['medal_adventurer'] );
	$i = 1;
	foreach ( $quests as $q ) {
		$qry->bindParam ( ':qg' . $i, $q [0] );
		$qry->bindParam ( ':qe' . $i, $q [1] );
		$qry->bindParam ( ':qd' . $i, $q [2] );
			
		$i ++;
	}
	$qry->execute ();
	
	// ---logs----
	// first 3, one in previous index, separated by semicolon
	array_push ( $t_ret, $sim [0] [1], $sim [0] [2] );
		
	for($i = 1; $i < count ( $sim ); $i ++) {
		array_push ( $t_ret, $sim [$i] [0], $sim [$i] [1], $sim [$i] [2] );
		// echo $sim [$i][0]."/".$sim [$i][1]."/".$sim [$i][2]."/";
	}
		
	// looks
	array_push ( $t_ret, ";" . $db_data ['user_name'], $p->getLvl (), $db_data ['race'], $db_data ['gender'], $db_data ['class'] );
	// faces
	for($i = 1; $i <= 9; $i ++) {
		$t_ret [] = $db_data ['face' . $i];
	}
		
	// mob looks, lvl, weapon
	array_push ( $t_ret, "0", "0", $OP->getLvl (), "0", "0", "1", "-" . $OP->getId (), "0", "0", "0", "0", "0", "0", "0", "0", "0;" . $p->hasWeapon () );
		
	// weapon info - player
	$weap = $p->getWeapon ();
	array_push ( $t_ret, $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] );
		
	// weapon info - mob
	$weap = $OP->getWeapon ();
	array_push ( $t_ret, $OP->hasWeapon (), $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] . ";" . $p->hasShield () );
		
	// shields
	$sh = $p->getShield ();
	array_push ( $t_ret, $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'], $sh ['mush'] );
	$sh = $OP->getShield ();
	array_push ( $ret, $OP->hasShield (), $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'] );
	
	// ?;?;?;exp;silver;win?
	$t_ret [] = "0;1;" . $mushReward . ";" . $db_data ['exp'] . ";" . $db_data ['silver'] . ";-1;";
		
	// rest is default data
	$t_ret [count ( $t_ret ) - 1] .= $ret [0];
		
	for($i = 1; $i < count ( $ret ); $i ++) {
		$t_ret [] = $ret [$i];
	}
	

	
	//delete current items
	
	$qry = $db->prepare ( 'DELETE FROM items_tavern WHERE quest = 1 AND owner_id = :uid' );   
	$qry->bindParam ( ':uid', $db_data ['user_id'] );
	$qry->execute ();
	$qry = $db->prepare ( 'DELETE FROM items_tavern WHERE quest = 2 AND owner_id = :uid' );   
	$qry->bindParam ( ':uid', $db_data ['user_id'] );
	$qry->execute ();
	$qry = $db->prepare ( 'DELETE FROM items_tavern WHERE quest = 3 AND owner_id = :uid' );   
	$qry->bindParam ( ':uid', $db_data ['user_id'] );
	$qry->execute ();
	
	//gen item
	
	$lvl = $db_data ['lvl'];
	$class = $db_data ['class'];
	
	$rewardItemRand1 = rand(1, 2);
	$rewardItemRand2 = rand(1, 2);
	$rewardItemRand3 = rand(1, 2);
	
	if( $rewardItemRand1 == 1 ){
		$shop = rand(0, 1);
		$item = genItem ($lvl, $class, $shop, 'tavern', $db_data);	
		if ($item != '0/0/0/0/0/0/0/0/0/0/0/0'){
		$qry = $db->prepare ( 'INSERT INTO items_tavern(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, quest, owner_id) 
			VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
			' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
			' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . 1 . ',' . $db_data['user_id'] . ')' );   
		$qry->execute ();
		}
	}
	if( $rewardItemRand2 == 1 ){
		$shop = rand(0, 1);
		$item = genItem ($lvl, $class, $shop, 'tavern', $db_data);	
		if ($item != '0/0/0/0/0/0/0/0/0/0/0/0'){
		$qry = $db->prepare ( 'INSERT INTO items_tavern(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, quest, owner_id) 
			VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
			' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
			' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . 2 . ',' . $db_data['user_id'] . ')' );   
		$qry->execute ();
		}
	}
	if( $rewardItemRand3 == 1 ){
		$shop = rand(0, 1);
		$item = genItem ($lvl, $class, $shop, 'tavern', $db_data);
		if ($item != '0/0/0/0/0/0/0/0/0/0/0/0'){
		$qry = $db->prepare ( 'INSERT INTO items_tavern(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, quest, owner_id) 
			VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
			' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
			' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . 3 . ',' . $db_data['user_id'] . ')' );   
		$qry->execute ();
		}
	}
	exit(join ( "/", $t_ret )) ;
	// var_dump($qry -> errorInfo());
}






// request
$req = $_GET ['req'];
$SSID = substr ( $req, 0, 32 ); // substring 0 32

$action = substr ( $req, 32, 3 ); // substring 32
$action_extra = substr ( $req, 35 );


try{
	$db = new PDO ( 'mysql:host=localhost;dbname=xxx;charset=utf8', 'xxx', 'xxx');
}catch(Exception $e){
	exit();
}

$db->setAttribute ( PDO::ATTR_ORACLE_NULLS, PDO::NULL_TO_STRING );



// returned value
$ret = array_fill ( 0, 512, '0' );

switch ($action) {
	case $ACT_REGISTER :
		// req structure
		// 001Admin;spierdalaj;[email protected];;;1;1;2;3/510/501/4/510/2/2/7/1/%3B
			
		$npe = explode ( ";", $action_extra );
		
		$nick = $npe [0];
		$pass = $npe [1];
		$email = urlencode(strtolower($npe [2]));
		
		// var_dump($npe);
		
		// break;
		
		// nick & pass lenghts
		if (strlen ( $nick ) < 3 || strlen ( $nick ) > 20) {
			// throw error & break;
			$ret = array (
					$ERR_NAME_TOO_SHORT 
			);
			break;
		}
		if ( preg_match("/[^-a-z0-9_]/i", $nick) )
		{
			// throw error & break;
			$ret = array (
					$ERR_NAME_EXISTS
			);
			break;
		}
		if (strlen ( $pass ) < 4) {
			// throw error & break;
			$ret = array (
					$ERR_PASSWORD_TOO_SHORT 
			);
			break;
		}
		if ( preg_match("/[^-a-z0-9_]/i", $pass) )
		{
			// throw error & break;
			$ret = array (
					$ERR_NAME_EXISTS
			);
			break;
		}
		
		// TODO: validate email
		
		// check db for duplicates
		$qry = $db->prepare ( "SELECT user_name, email FROM user_data 
								WHERE user_name = :name OR email = :email" );
		$qry->bindParam ( ':name', $nick );
		$qry->bindParam ( 'email', $email );
		$qry->execute ();
		
		// var_dump ( $qry->fetchAll ()[0] );
		// exit ();
		
		// if duplicates, throw error & break
		if ($qry->rowCount () > 0) {
			$duplicate = $qry->fetchAll ( PDO::FETCH_ASSOC );
			$duplicate = $duplicate [0];
			
			if ($duplicate ['email'] == $email) {
				// throw error & break;
				$ret = array (
						$ERR_EMAIL_EXISTS 
				);
				break;
			}
			
			// throw error & break;
			$ret = array (
					$ERR_NAME_EXISTS 
			);
			break;
		}
		
		// character looks
		$looks = explode ( "/", $npe [8] );
		$looks [1] = substr_replace ( $looks [1], "0", 1, 1 );
		$looks [2] = substr_replace ( $looks [2], "0", 1, 1 );
		$looks [4] = substr_replace ( $looks [4], "0", 1, 1 );
		// var_dump($looks);
		// break;
		
		// class
		$class = $npe [7];
		
		// race
		$race = $npe [5];
		
		// gender
		$gender = $npe [6];
		
		// stats
		$stats = loadDefaultStats ( $class, $race );
		
		//hash password
		$pass = md5($pass);
		
		// add new user to DB
		$qry = $db->prepare ( "INSERT INTO user_data(user_name, password, email, face1, face2, face3, face4, face5, face6, face7, face8, face9, face10, reg_date, class, race, gender, attr_str, attr_agi, attr_int, attr_wit, attr_luck) 
								VALUES(:name, :pass, :email, :face1, :face2, :face3, :face4, :face5, :face6, :face7, :face8, :face9, :face10, :reg_date, :class, :race, :gender, :str, :agi, :int, :wit, :luck)" );
		$qry->bindParam ( ':name', $nick );
		$qry->bindParam ( ':pass', $pass );
		$qry->bindParam ( ':email', $email );
		for($i = 1; $i < 11; $i ++) {
			$qry->bindParam ( ':face' . $i, $looks [$i - 1] );
		}
		// timestmp
		$time = new DateTime ();
		$qry->bindParam ( ':reg_date', $time->getTimestamp () );
		
		$qry->bindParam ( ':class', $class );
		$qry->bindParam ( ':race', $race );
		$qry->bindParam ( ':gender', $gender );
		
		// default stats
		$qry->bindParam ( ':str', $stats [0] );
		$qry->bindParam ( ':agi', $stats [1] );
		$qry->bindParam ( ':int', $stats [2] );
		$qry->bindParam ( ':wit', $stats [3] );
		$qry->bindParam ( ':luck', $stats [4] );
		
		$qry->execute ();
		
		// get user id
		$qry = $db->prepare ( "SELECT user_id FROM user_data WHERE user_name = :name" );
		$qry->bindParam ( ":name", $nick );
		$qry->execute ();
		
		$res = $qry->fetchAll ();
		$a = $res [0] ['user_id'];
		
		$ret = array (
				$ACT_REGISTER . $a 
		);
		
		
		break;
	case $ACT_LOGIN_FOLLOW_UP :
		// structure:
		// echo +101[guild name];[guild id]
		$qry = $db->prepare ( "SELECT name, guild_id FROM guilds 
				WHERE guild_id = (SELECT user_data.guild_id FROM user_data WHERE user_data.ssid = :ssid)" );
		$qry->bindParam ( ':ssid', $SSID );
		if (! $qry->execute ()) {
			var_dump ( $qry->errorInfo () );
		}
		
		$res = $qry->fetchAll ();
		$res = $res [0];
		
		$ret = array (
				"+101" . $res ['name'] . ";" . $res ['guild_id'] 
		);
		
		break;
	case $ACT_LOGIN :
		// req structure
		// 000...002Lama%3B9c4c7db44e0e052a942accedb1731da7%3Bv1.70
		
		$nnp = explode ( ';', substr ( $req, 35 ) );
		
		$nick = $nnp [0];
		$pass = $nnp [1];
		
		// ret structure
		// 0021463844515/278943/1387059536/1354973173/930801237/14/0/101/2650259/3391480/9231/17024/-1/328034687/92/644/576/5/102/105/3/103/5/1/2/1/0/6/2141978625/2/63/67/306/229/70/47/67/197/66/124/0/0/232/163/0/0/0/0/6/1006/47/0/2/3/4/17/15/0/412/0/3/1006/21/0/2/3/5/18/14/0/631/0/5/1007/39/0/3/1/4/19/15/0/842/0/4/1002/9/0/4/5/2/6/0/0/118/0/8/51/0/0/3/4/5/28/28/28/7936/0/7/1007/52/0/3/4/5/33/0/0/714/0/9/7/0/0/3/1/2/56/0/0/7512/0/10/53/0/0/6/0/0/32/0/0/13254/0/1/1006/53/155/5/1/3/64/0/0/2060/0/0/0/0/0/0/0/0/0/0/0/0/0/1/1009/333/513/4/5/1/352/0/0/278980/0/1/1008/361/503/5/3/4/224/156/0/114989/0/8/20/0/0/5/1/2/105/73/0/73436/0/11/40/0/0/0/0/0/0/0/0/0/0/5/1010/281/0/1/2/5/102/88/0/94372/0/1387023983/101/101/101/4/6/1/-55/-27/-70/13/20/20/900/900/300/0/31/0/0/2/5/3/196/0/0/187643/0/0/14/0/0/2/3/5/107/87/0/78922/0/0/1010/274/0/1/4/5/116/78/0/148642/0/62600/29000/20600/875500/1516200/331300/0/1385644107/6/1008/194/0/5/4/3/89/87/0/283597/10/7/1009/271/0/4/2/3/172/0/0/509638/0/5/1009/132/0/2/3/4/103/67/0/387432/10/1/1009/246/610/3/5/2/376/0/0/1597458/0/7/1010/212/0/1/5/4/103/75/0/371449/10/7/1010/208/0/4/1/3/98/76/0/366471/10/1385643304/8/11/0/0/3/2/5/179/0/0/512765/0/8/4/0/0/5/2/1/176/0/0/482435/0/12/15/0/0/11/5/0/72/25/0/201308/0/12/11/0/0/11/1/0/72/25/0/201308/0/8/1/0/0/1/2/3/168/0/0/399945/0/9/7/0/0/2/5/4/87/87/0/72832/1/0/0/0/1/1/10170/0/0/0/0/1354976531/0/0/0/168/53/155/0/0/0/0/0/1387017833/0/0/17/1386425067/1386336236/50/50/1/13549730/101/17/1/3894/4598/337084657/21948/0/0/55/0/0/4/1386421467/4/11/7/5/2/2/2/2/2/0/0/120/0/0/0/0/0/0/0/0/0/0/0/0/-1283791275/-1283791275/-1283791275/1/1355336963/0/0/1387059536/;0;900Kv99994c731E6696F9Oj4u973O47m;0;470;0
		
		// get user data
		$qry = $db->prepare ( "SELECT user_data.*, guilds.treasure, guilds.instructor, guilds.dung,  
				(
				SELECT Count(*) FROM messages WHERE messages.read = 0 AND messages.reciver_id = user_id
				) AS c, (
				    SELECT Count(*) + 1 FROM user_data WHERE user_data.honor > (
				        SELECT honor FROM user_data WHERE user_name = :name
				    )
				) AS rank
				FROM user_data 
				LEFT JOIN guilds ON guilds.guild_id = user_data.guild_id 
				WHERE user_name = :name2" );
		$qry->bindParam ( ':name', $nick );
		$qry->bindParam ( ':name2', $nick );
		$qry->execute ();
		
		// if qry returned nothing, throw no such player exception & break
		if ($qry->rowCount () == 0) {
			$ret = array (
					$ERR_LOGIN_FAILED 
			);
			break;
		}
		
		// user data
		$db_data = $qry->fetchAll ( PDO::FETCH_ASSOC );
		$db_data = $db_data [0];
		
		// compare passwords, if wrong, throw wrong password exception & break
		
		$db_pass = $db_data ['password'];
		
		if ($pass != $db_pass) {
			$ret = array (
					$ERR_LOGIN_FAILED  // $ERR_WRONG_PASSWORD
						);
			
			break;
		}
		
		// load data
		loadDefaultData ( $db_data );
		
		// set action
		$ret [0] = $ACT_LOGIN . $ret [0];
		
		// GEN SSID
		$SSID = md5 ( microtime () );
		
		// set ssid in database
		$qry = $db->prepare ( "UPDATE user_data SET ssid = :ssid WHERE user_id = :id" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':id', $db_data ['user_id'] );
		$qry->execute ();
		
		// structure
		// ;0;ji6m720a88R6kIT68ik8D8K84AF1t8DJ;0;470;0
		// 470???
		$ret [511] = ";0;$SSID;0;470;0";
		
		// SET GUILD INDEX
		
		$ret [$SF_GUILD_INDEX] = $db_data ['guild_id'];
		
		break;
	case $ACT_LOGOUT :
		// check stuff
		$ret = array (
				"184" 
		);
		
		// remove SSID from db
		$qry = $db->prepare ( "UPDATE user_data SET ssid = '0' WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		break;
	case $ACT_HERO :
		// structure
		// 0041463844515/278943/1387057780/1354973173/930801237/14/0/101/2650259/3391480/9231/17025/-1/328034687/92/644/576/5/102/105/3/103/5/1/2/1/0/6/2141978625/2/63/67/2999306/229/70/47/67/197/66/124/0/0/232/163/0/1/10/1387081793/6/1006/47/0/2/3/4/17/15/0/412/0/3/1006/21/0/2/3/5/18/14/0/631/0/5/1007/39/0/3/1/4/19/15/0/842/0/4/1002/9/0/4/5/2/6/0/0/118/0/8/51/0/0/3/4/5/28/28/28/7936/0/7/1007/52/0/3/4/5/33/0/0/714/0/9/7/0/0/3/1/2/56/0/0/7512/0/10/53/0/0/6/0/0/32/0/0/13254/0/1/1006/53/155/5/1/3/64/0/0/2060/0/0/0/0/0/0/0/0/0/0/0/0/0/1/1009/333/513/4/5/1/352/0/0/278980/0/1/1008/361/503/5/3/4/224/156/0/114989/0/8/20/0/0/5/1/2/105/73/0/73436/0/11/40/0/0/0/0/0/0/0/0/0/0/5/1010/281/0/1/2/5/102/88/0/94372/0/1387023983/101/101/101/4/6/1/-55/-27/-70/13/20/20/900/900/300/0/31/0/0/2/5/3/196/0/0/187643/0/0/14/0/0/2/3/5/107/87/0/78922/0/0/1010/274/0/1/4/5/116/78/0/148642/0/62600/29000/20600/875500/1516200/331300/0/1385644107/6/1008/194/0/5/4/3/89/87/0/283597/10/7/1009/271/0/4/2/3/172/0/0/509638/0/5/1009/132/0/2/3/4/103/67/0/387432/10/1/1009/246/610/3/5/2/376/0/0/1597458/0/7/1010/212/0/1/5/4/103/75/0/371449/10/7/1010/208/0/4/1/3/98/76/0/366471/10/1385643304/8/11/0/0/3/2/5/179/0/0/512765/0/8/4/0/0/5/2/1/176/0/0/482435/0/12/15/0/0/11/5/0/72/25/0/201308/0/12/11/0/0/11/1/0/72/25/0/201308/0/8/1/0/0/1/2/3/168/0/0/399945/0/9/7/0/0/2/5/4/87/87/0/72832/1/0/5/0/1/1/10170/0/0/0/0/1354976531/0/0/0/168/53/155/0/0/0/0/0/1387017833/0/0/17/1386425067/1386336236/50/50/1/1354973210/101/17/1/3894/4598/337084657/21948/0/0/55/0/0/4/1386421467/4/11/7/5/2/2/2/2/2/0/0/120/0/0/0/0/0/0/0/0/0/0/0/0/-1283791275/-1283791275/-1283791275/1/1355336963/0/0/1387057780;;";
		
		$db_data = loadDefaultData ();
		
		$ret [0] = $ACT_HERO . $ret [0];
		
		// medals
		
		if ($db_data ['medal_commerce'] < $db_data ['silver']){
			$db_data ['medal_commerce'] = $db_data ['silver'];	
			$qry = $db->prepare ( "UPDATE user_data SET
					medal_commerce = :medalc
					WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID);
			$qry->bindParam ( ':medalc', $db_data ['medal_commerce']);
			$qry->execute ();
		}
		if ($db_data ['medal_bravery'] < $db_data ['honor']){
			$db_data ['medal_bravery'] = $db_data ['honor'];	
			$qry = $db->prepare ( "UPDATE user_data SET
					medal_bravery = :medalb
					WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID);
			$qry->bindParam ( ':medalb', $db_data ['medal_bravery']);
			$qry->execute ();
		}
		
		// potions
		
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		// check if reroll time
		if ($time > ( int ) $db_data ['potion_time1'] and $db_data['potion_time1'] != 0) {
			$qry = $db->prepare ( "UPDATE user_data SET
				potion_id1 = 0,
				potion_value1 = 0,
				potion_time1 = 0
				WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID);
			$qry->execute ();
			$db_data['potion_id1'] = 0;
			$db_data['potion_value1'] = 0;
			$db_data['potion_time1'] = 0;
		}
		if ($time > ( int ) $db_data ['potion_time2'] and $db_data['potion_time2'] != 0) {
			$qry = $db->prepare ( "UPDATE user_data SET
				potion_id2 = 0,
				potion_value2 = 0,
				potion_time2 = 0
				WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID);
			$qry->execute ();
			$db_data['potion_id2'] = 0;
			$db_data['potion_value2'] = 0;
			$db_data['potion_time2'] = 0;
		}
		if ($time > ( int ) $db_data ['potion_time3'] and $db_data['potion_time3'] != 0) {
			$qry = $db->prepare ( "UPDATE user_data SET
				potion_id3 = 0,
				potion_value3 = 0,
				potion_time3 = 0
				WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID);
			$qry->execute ();
			$db_data['potion_id3'] = 0;
			$db_data['potion_value3'] = 0;
			$db_data['potion_time3'] = 0;
		}
			
		// user desc
	
		$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
		
		break;
	case $ACT_ARENA_ENTER :
		// structure
		// 011nick;lvl;gildia;1387059433/
		
		$qry = $db->prepare ( "SELECT user_name, lvl, guild_id FROM user_data ORDER BY RAND() LIMIT 1" );
		$qry->execute ();
		$user_data = $qry->fetchAll ();
		$user_data = $user_data [0];
		
		$qry = $db->prepare ( "SELECT name FROM guilds WHERE guild_id = :gid" );
		$qry->bindParam ( ':gid', $user_data ['guild_id'] );
		$qry->execute ();
		$guild = $qry->fetchAll ();
		$guild = $guild [0];
		
		// $qry = $db->prepare ( "SELECT user_data.user_name, user_data.lvl, guilds.name
		// FROM user_data
		// LEFT JOIN guilds ON user_data.guild_id = guilds.guild_id
		// ORDER BY user_data.honor DESC
		// LIMIT :lim, 15" );
		// $limstr = "(SELECT Count(*) FROM user_data WHERE honor < (SELECT honor FROM user_data WHERE ssid = $SSID))";
		// $qry->bindParam ( ':lim', $limstr );
		// $qry->execute ();
		
		// var_dump ( $qry->errorInfo () );
		// echo "<br>" . $qry->rowCount () . "<br>";

		
		$ret = array (
				"011" . $user_data ['user_name'] . ";" . $user_data ['lvl'] . ";" . $guild ['name'] . ";0/" 
		);
		
		break;
	case $ACT_ARENA :
		
		// $s = "106 2562784/1781/1781/6097/4711/4426/9450/120/46/50/126/48;2562753/0/3/9450/31/0/2562753/1/0/-681970/32/0/;Elmer/271/6/1/3/3/208/203/1/204/2/3/12/1/0/polska2001/14/6/1/1/1/305/302/3/303/2/1/2/1/0;1/1051/704/1780/3/4/5/656/656/656/44901496/0/1/8/20/36/1/3/4/16/0/0/135/0;0/0/0/0/0/0/0/0/0/0/0/0/2/3/25/0/1/4/3/20/0/0/360/0;2;0;0;0;-1";
		// $ret = explode ( '/', $s );
		// break;
		// structure:
		// 106[player:hp]/[str]/[agi]/[int]/[wit]/[luck]/[OP:hp]/[str]/[agi]/[int]/[wit]/[luck];
		
		$nick = $action_extra;
		
		$qry = $db->prepare ( "SELECT *    
				FROM user_data WHERE ssid = :ssid OR user_name = :name" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':name', $nick );
		if (! $qry->execute ()) {
			var_dump ( $qry->errorInfo () );
			break;
		}
		
		$res = $qry->fetchAll ();
		
		if (count ( $res ) <= 1 || $res [0] ['user_id'] == $res [1] ['user_id']) {
			$ret = array (
					$ERR_FIGHT_SELF 
			);
			break;
		}
		
		$p1 = $nick == $res [0] ['user_name'] ? $res [1] : $res [0];
		$op = $nick == $res [0] ['user_name'] ? $res [0] : $res [1];
		
		// check times
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		if ($time < $p1 ['arena_time']) {
			if ($p1 ['mushroom'] <= 0) {
				$ret = array (
						$ERR_NO_MUSH_PVP 
				);
				break;
			}
			$p1 ['mushroom'] = $p1 ['mushroom'] - 1;
			$time = $p1 ['arena_time'];
		} else {
			$time += 600;
		}
		
		// char objects
		$charP1 = new Char ( $p1 );
		$charOP = new Char ( $op );
		
		$ret = array ();
		
		$ret = array ();
		
		// player
		array_push ( $ret, "106" . $charP1->getHp (), $charP1->getStr (), $charP1->getDex (), $charP1->getInt (), $charP1->getWit (), $charP1->getLuck () );
		
		array_push ( $ret, $charOP->getHp (), $charOP->getStr (), $charOP->getDex (), $charOP->getInt (), $charOP->getWit (), $charOP->getLuck () );
		
		// simulation
		$sim = SF_Calc::calculateWin ( $charP1, $charOP );
		
		// fight result
		$win = $charP1->getHP () <= 0 ? false : true;
		
		// update honor values
		$honor = calculateHonor ( $p1, $op, $win );
		$p1 ['honor'] += $honor;
		$op ['honor'] += - 1 * $honor;
		
		$ret [11] .= ";" . $sim [0] [0];
		array_push ( $ret, $sim [0] [1], $sim [0] [1] );
		
		for($i = 1; $i < count ( $sim ); $i ++) {
			array_push ( $ret, $sim [$i] [0], $sim [$i] [1], $sim [$i] [2] );
		}
		
		// update 'arena' medal
		
		if ($win == true){
		$p1['medal_gladiator'] += 1;
		} else {
		$op['medal_gladiator'] += 1;
		}
		
		// players info
		
		$ret [count ( $ret ) - 1] = ";" . $p1 ['user_name'];
		array_push ( $ret, $p1 ['lvl'], $p1 ['race'], $p1 ['gender'], $p1 ['class'] );
		for($a = 1; $a < 11; $a ++) {
			$ret [] = $p1 ['face' . $a];
		}
		
		array_push ( $ret, $op ['user_name'], $op ['lvl'], $op ['race'], $op ['gender'], $op ['class'] );
		for($a = 1; $a < 11; $a ++) {
			$ret [] = $op ['face' . $a];
		}
		
		// player weapon
		$ret [count ( $ret ) - 1] .= ";" . $charP1->hasWeapon (); // wepaon boolean/weapon id/?/?...
		$weap = $charP1->getWeapon ();
		array_push ( $ret, $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] );
		
		// opponent weapon
		$weap = $charOP->getWeapon ();
		array_push ( $ret, $charOP->hasWeapon (), $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] );
		
		// shields?
		$p1shield = $charP1->getShield ();
		$opshield = $charOP->getShield ();
		$ret [count ( $ret ) - 1] .= ";" . $charP1->hasShield ();
		array_push ( $ret, $p1shield ['item_id'], $p1shield ['dmg_min'], $p1shield ['dmg_max'] );
		array_push ( $ret, $p1shield ['atr_type_1'], $p1shield ['atr_type_2'], $p1shield ['atr_type_3'] );
		array_push ( $ret, $p1shield ['atr_val_1'], $p1shield ['atr_val_2'], $p1shield ['atr_val_3'], $p1shield ['gold'], $p1shield ['mush'] );
		array_push ( $ret, $charOP->hasShield (), $opshield ['item_id'], $opshield ['dmg_min'], $opshield ['dmg_max'] );
		array_push ( $ret, $opshield ['atr_type_1'], $opshield ['atr_type_2'], $opshield ['atr_type_3'], $opshield ['atr_val_1'], $opshield ['atr_val_2'], $opshield ['atr_val_3'], $opshield ['gold'] );
		
		// ? ; ? ; ? ; honor ; silver ; ?
		$ret [] = $opshield ['mush'] . ";2;250;$honor;0;-1";
		
		// update db
		// player
		$qry = $db->prepare ( "UPDATE user_data SET  
				arena_time = :time,  
				mushroom = :shroom, 
				honor = :honor, 
				medal_gladiator = :medalg
				WHERE user_id = :uid" );
		$qry->bindParam ( ':time', $time );
		$qry->bindParam ( ':shroom', $p1 ['mushroom'] );
		$qry->bindParam ( ':honor', $p1 ['honor'] );
		$qry->bindParam ( ':uid', $p1 ['user_id'] );
		$qry->bindParam ( ':medalg', $p1 ['medal_gladiator'] );
		$qry->execute ();
		
		// opponent
		$qry = $db->prepare ( "UPDATE user_data SET honor = :honor, medal_gladiator = :medalg WHERE user_id = :uid" );
		$qry->bindParam ( ':honor', $op ['honor'] );
		$qry->bindParam ( ':uid', $op ['user_id'] );
		$qry->bindParam ( ':medalg', $op ['medal_gladiator'] );
		$qry->execute ();
		
		// SEND log to opponent
		// $mlog = "2055400/849/5570/904/2150/1785/1526000/1409/1297/5579/3815/3083
		// #1385407/367067/0/1158932/669993/0/453755/572793/0/586138/931652/0/453755/673333/0/-87194/0/0/
		// #Piotr/238/4/1/3/9/405/409/6/410/6/6/17/1/0/AneA›/199/4/2/2/2/408/404/3/1/1/5/2/1/0
		// #1/2009/315/755/2/4/1/854/0/0/11298269/0/1/1056/868/914/3/4/5/472/472/472/88682148/0
		// #0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0#2#0#106#231500#-1";
		$mlog = $ret;
		$mlog [0] = substr ( $mlog [0], 3 );
		$mlog = join ( "/", $mlog );
		$mlog = reverseArenaLog ( $mlog );
		$mlog = str_replace ( ';', '#', $mlog );
		
		$sub = $win ? 6 : 7;
		
		$qry = $db->prepare ( "INSERT INTO messages(sender_id, reciver_id, time, subject, msg) 
				VALUES(:sid, :rid, :time, :subj, :msg)" );
		$qry->bindParam ( ':sid', $p1 ['user_id'] );
		$qry->bindParam ( ':rid', $op ['user_id'] );
		$a = new DateTime ();
		$a = $a->getTimestamp ();
		$qry->bindParam ( ':time', $a );
		$qry->bindParam ( ':subj', $sub ); // 7 | 6
		$qry->bindParam ( ':msg', $mlog );
		$qry->execute ();
		
		break;
	case $ACT_BUY_STAT :
		$stat = $action_extra;
		
		$statRowName = 'attr_' . getStatName ( $stat );
		
		$qry = $db->prepare ( "SELECT silver, " . $statRowName . " AS stat, class, race 
				FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$db_data = $qry->fetchAll ();
		$db_data = $db_data [0];
		// var_dump($db_data);
		// echo "<br>";
		$cost = getStatCost ( $db_data ['class'], $db_data ['race'], $stat, $db_data ['stat'] );
		
		// if not enought gold, throw error
		if (( int ) $db_data ['silver'] < ( int ) $cost) {
			$ret = array (
					$GLOBALS ['ERR_TOO_EXPENSIVE'] 
			);
			break;
		}
		
		// update database
		$qry = $db->prepare ( "UPDATE user_data SET 
				silver = :silver, 
				" . $statRowName . " = :statval 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':silver', $a = (( int ) $db_data ['silver']) - $cost );
		$qry->bindParam ( ':statval', $a = 10 + $db_data ['stat'] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		// response
		
		// $qry = $db->prepare ( "SELECT *,
		// (
		// SELECT Count(*) FROM messages WHERE messages.read = 0 AND messages.reciver_id = user_id
		// ) AS c, (
		// SELECT Count(*) + 1 FROM user_data WHERE user_data.honor > (
		// SELECT honor FROM user_data WHERE ssid = :ssid
		// )
		// ) AS rank
		// FROM user_data WHERE ssid = :ssid2" );
		// $qry->bindParam ( ':ssid', $SSID );
		// $qry->bindParam ( ':ssid2', $SSID );
		// $qry->execute ();
		
		// $db_data = $qry->fetchAll ()[0];
		
		$db_data = loadDefaultData ();
		
		$ret [0] = $ACT_HERO . $ret [0];
		
		// user desc
	
		$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
		
		break;
	case $ACT_RANKING :
		
		$res;
		$pos;
		$posFrom;
		
		// if (strpos ( $action_extra, ';' ) !== FALSE) {
		$in = explode ( ';', $action_extra );
		if (ctype_digit ( $in [1] )) {
			
			// position
			$pos = ( int ) str_replace ( ';', '', $action_extra );
		} else {
			
			// name
			$nick = $action_extra;
			$qry = $db->prepare ( "SELECT Count(*) + 1 AS pos FROM user_data 
					WHERE honor > (SELECT honor FROM user_data WHERE user_name = :name) " );
			$qry->bindParam ( ':name', $nick );
			$qry->execute ();
			
			$pos = $qry->fetchAll ();
			$pos = $pos [0] ['pos'];
		}
		
		if ($pos < 8) {
			$pos = 8;
		}
		
		$posFrom = $pos - 8;
		
		// TODO: if pos > count(*) user_data, go to last
		$qry = $db->prepare ( "SELECT *,
					(SELECT guilds.name FROM guilds WHERE guilds.guild_id = user_data.guild_id) AS guild
					FROM user_data ORDER BY honor DESC LIMIT :pos1, 15" );
		$qry->bindParam ( ':pos1', $posFrom, PDO::PARAM_INT );
		
		$qry->execute ();
		
		$res = $qry->fetchAll ();
		
		// structure 007startpos
		// 00716957/matrixon/ekipa z Chicago/-53/9305/16958/daniello3/Youhei Kabuto/62/9305/-16959/silverek//54/9305/16960/lukas030/niepokonani 14/-56/9303/16961/kopytko200//61/9303/16962/nick25371/sztorm/66/9303/16963/eddyhouse//-60/9301/16964/Pan Marcel/jakastam/-101/9301/16965/BloCked12//-54/9300/16966/vanczo/KabanosyZiom/-50/9300/16967/piter3010/Terrorist Force/-63/9299/-16968/sthil/szsz/59/9298/16969/kujawiaczek//-55/9298/16970/Coxays/Huragan Wligruchy/-77/9298/16971/Stazz//54/9297/;
		
		$ret = array (
				"007" 
		);
		
		$pos -= 7;
		$index = 0;
		for($i = 0; $i < count ( $res ); $i ++) {
			$data = $res [$i];
			
			// pos
			$ret [$index] = urldecode($pos);
			
			// nick
			$ret [$index + 1] = $res [$i] ['user_name'];
			
			// guild
			$ret [$index + 2] = $res [$i] ['guild']; // ""; // $res[$i][''];
			                                         
			// lvl
			$ret [$index + 3] = $res [$i] ['lvl'];
			
			// honor
			$ret [$index + 4] = $res [$i] ['honor'];
			
			// set class
			$class = ( int ) $res [$i] ['class'];
			
			if ($class == 2) { // mage
				$ret [$index + 3] = "-" . $ret [$index + 3];
			} else if ($class == 3) { // rouge
				$ret [$index] = "-" . $ret [$index];
			}
			
			$pos ++;
			$index += 5;
		}
		
		$ret [0] = "007" . $ret [0];
		
		// $ret [count ( $ret )] = count ( $res );
		
		// last index semicolon?
		$ret [] = ";";
		
		break;
		
	case $ACT_SCREEN_PILZDEALER :
	//not working
	
		
		$ret = array (
				"0160" 
		);

		break;
		
	case $ACT_SCREEN_WITCH : 
	//enter witch
	//not working
		$db_data = loadDefaultData ();
		
		$ret [0] = $RESP_SCREEN_WITCH . $ret [0];
		
		// STRUCTURE
		
		$magicMoney = 100000;
		
		$ret [] = ";9/8436/-1/4/1397606420/0/1397644086/9/7/11/1387655264/3/91/1388586438/8/101/1389626569/1/71/1390766637/4/81/1391972225/0/61/1393191032/5/31/1394552882/2/41/1396116139/6/51/1397644140/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/;0/" . $magicMoney;

		break;
		
	case $ACT_WITCH_DONATE :
	//idk what
	//not working
		$db_data = loadDefaultData ();
		
		$ret [0] = $RESP_SCREEN_WITCH . $ret [0];
		
		
		break;
		
	case $ACT_SCREEN_TOWER :
	//enter tower
		$db_data = loadDefaultData ();
		
		if ($db_data ['tower_level'] > 100){
			$ret = array (
					'E048'
			);
			break;
		}
		
		$ret [0] = $RESP_TOWER_SAVE . $ret [0]; //I'm not sure this is the good way.
		
		$ret [] = (";92087/1479412/" . ($db_data ['tower_level'] - 1));
		
		// TOWER HELPERS
		
		for ($i = 1; $i < 4; $i ++){
		
			//         lvl    class   ? ? stat [5]             item stat [5]  ? [5]
			$ret [] = "150/" . $i . "/0/0/1528/1511/2713/2503/2025/0/0/0/0/0/0/0/0/0/0/2362/819/1467";
			
			
			// DISPLAY ITEMS
			for ($i2 = 1; $i2 < 11; $i2 ++){
			
				$qry = $db->prepare ( "SELECT * FROM tower_helper_items 
				WHERE user_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid) AND tower_helper = :thelper AND slot = :slot" );
				$qry->bindParam ( ':ssid', $SSID);
				$qry->bindParam ( ':thelper', $i);
				$qry->bindParam ( ':slot', $i2);
				if (! $qry->execute ()) {
					var_dump ( $qry->errorInfo () );
				}
		
				$item = $qry->fetchAll ();
				$item = $item [0];
	
				$ret [] = $item ['item_type'];
				$ret [] = $item ['item_id'];
				$ret [] = $item ['dmg_min'];
				$ret [] = $item ['dmg_max'];
				$ret [] = $item ['atr_type_1'];
				$ret [] = $item ['atr_type_2'];
				$ret [] = $item ['atr_type_3'];
				$ret [] = $item ['atr_val_1'];
				$ret [] = $item ['atr_val_2'];
				$ret [] = $item ['atr_val_3'];
				$ret [] = $item ['gold'];
				$ret [] = $item ['mush'];
				
			}
			
			$ret [] = "55574460"; // + level cost value
			
			$ret [] = "0/0/0/0/0";
		
		}
		
		$ret [] = ("0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/");
		
		break;
		
	case $ACT_MOVE_COPYCAT_ITEM :
	//move item in tower
	//not working
		
		// resp
		$in = explode ( ';', $action_extra );
		
		// $in [0] = 101, 102, 103 // from tower helper items OR 2 // from normal items
		// $in [1] = slot
		// $in [2] = target slot
		// $in [3] = target slot
		
		if ($in [2] == 101){
			$towerHelper = 1;
		} elseif ($in [2] == 102){
			$towerHelper = 2;
		} elseif ($in [2] == 103){
			$towerHelper = 3;
		}
		
		
		// get item
		$slot = $in [1] + 9;
		$qry = $db->prepare ( "SELECT * FROM items 
				WHERE owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)  
				AND slot = :slot" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':slot', $slot);
		$qry->execute ();
		$item = $qry->fetchAll ();
		$item = $item [0];
		
		if (( int ) $in [3] == -1) {
		
			if ($item ['item_type'] < 8 and ($item ['item_id'] < $towerHelper * 1000 - 1000 or $item ['item_id'] > $towerHelper * 1000)){
					// You can't wear this item.. the item is another class than you
			} else {
		
				$in [2] = getSlotIndex ( $item ['item_type'] );	
				
				$item ['slot'] = $in [2] + 1;
				
				// insert into tower_helper_items
				
				$qry = $db->prepare ( 'SELECT * FROM tower_helper_items WHERE slot = :slot AND user_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid) AND tower_helper = :thelper' );
				$qry->bindParam ( ':slot', $item ['slot'] );	
				$qry->bindParam ( ':thelper', $towerHelper);
				$qry->bindParam ( ':ssid', $SSID );	
				$qry->execute ();
				if ($qry->rowCount () < 1) {
					
					$qry = $db->prepare ( 'INSERT INTO tower_helper_items(user_id, tower_helper, item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot) 
						VALUES((SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid), :thelper,' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
						' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
						' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item ['slot'] . ')' );   
					$qry->bindParam ( ':thelper', $towerHelper);
					$qry->bindParam ( ':ssid', $SSID );	
					$qry->execute ();
					
					// delete from items
					$curslot = $in [1] + 9;
					$qry = $db->prepare ( "DELETE FROM items 
							WHERE owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)  
							AND slot = :curslot" );
					$qry->bindParam ( ':curslot', $curslot);
					$qry->bindParam ( ':ssid', $SSID );
					if (! $qry->execute ()) {
						var_dump ( $qry->errorInfo () );
					}
				} else {
			
				// ALREADY ITEM IN INVENTORY / TOWER HELPER INVENTORY
			
				}
			}
			
		} else {	

			if ($in [0] == 101 or $in [0] == 102 or $in [0] == 103){ // insert items to "items" from "tower_helper_items"
			
					if ($in [0] == 101){
						$towerHelper = 1;
					} elseif ($in [0] == 102){
						$towerHelper = 2;
					} elseif ($in [0] == 103){
						$towerHelper = 3;
					}		
					
					// get item
					
					$slot2 = $in [1];
					$qry = $db->prepare ( "SELECT * FROM tower_helper_items 
							WHERE user_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)  
							AND slot = :slot AND tower_helper = :thelper" );
					$qry->bindParam ( ':slot', $slot2);
					$qry->bindParam ( ':thelper', $towerHelper);
					$qry->bindParam ( ':ssid', $SSID );
					$qry->execute ();
					$item2 = $qry->fetchAll ();
					$item2 = $item2 [0];
				
					$item2 ['slot'] = $in [3] + 9;
					
					// insert into tower_helper_items
					
					$qry = $db->prepare ( 'SELECT * FROM items WHERE slot = :slot AND owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)' );
					$qry->bindParam ( ':slot', $item2 ['slot'] );	
					$qry->bindParam ( ':ssid', $SSID );	
					$qry->execute ();
					if ($qry->rowCount () < 1) {
					
						$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
							VALUES(' . $item2 ['item_type'] . ',' . $item2 ['item_id'] . ',' . $item2 ['dmg_min'] . ',' . $item2 ['dmg_max'] . ',
							' . $item2 ['atr_type_1'] . ',' . $item2 ['atr_type_2'] . ',' . $item2 ['atr_type_3'] . ',' . $item2 ['atr_val_1'] . ',' . $item2 ['atr_val_2'] . ',
							' . $item2 ['atr_val_3'] . ',' . $item2 ['gold'] . ',' . $item2 ['mush'] . ',' . $item2 ['slot'] . ',(SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid))' );   
						$qry->bindParam ( ':ssid', $SSID );	
						$qry->execute ();
						
						// delete from tower_helper_items
						$qry = $db->prepare ( "DELETE FROM tower_helper_items 
								WHERE user_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)  
								AND slot = :curslot AND tower_helper = :thelper" );
						$qry->bindParam ( ':curslot', $in [1]);
						$qry->bindParam ( ':thelper', $towerHelper);
						$qry->bindParam ( ':ssid', $SSID );
						if (! $qry->execute ()) {
							var_dump ( $qry->errorInfo () );
						}
					}
			} else { // just update slot
				$tarslot = $in [3] + 9;
				$curslot = $item ['slot'];
				// update database
				// move the item in target place
				$qry = $db->prepare ( "UPDATE items SET slot = :slot 
						WHERE owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)  
						AND slot = :curslot" );
				$qry->bindParam ( ':slot', $curslot );
				$qry->bindParam ( ':curslot', $tarslot );
				$qry->bindParam ( ':ssid', $SSID );
				if (! $qry->execute ()) {
					var_dump ( $qry->errorInfo () );
				}
		
				// move target item
				$qry = $db->prepare ( "UPDATE items SET slot = :tarslot 
						WHERE id = :itemid" );
				$qry->bindParam ( ':tarslot', $tarslot );
				$qry->bindParam ( ':itemid', $item ['id'], PDO::PARAM_INT );
				if (! $qry->execute ()) {
					var_dump ( $qry->errorInfo () );
				}
			}
		}
		
		// resp
		$db_data = loadDefaultData ();
		
		// ret
		
		$ret [0] = $RESP_MOVE_TOWER_ITEM . $ret [0];
		
		// I'm not sure this is the best way:
		
		$ret [] = (";92087/1479412/" . ($db_data ['tower_level'] - 1));
		
		// TOWER HELPERS
		
		for ($i = 1; $i < 4; $i ++){
		
			//         lvl    class   ? ? stat [5]             item stat [5]  ? [5]
			$ret [] = "150/" . $i . "/0/0/1528/1511/2713/2503/2025/0/0/0/0/0/0/0/0/0/0/2362/819/1467";
			
			
			// DISPLAY ITEMS
			for ($i2 = 1; $i2 < 11; $i2 ++){
			
				$qry = $db->prepare ( "SELECT * FROM tower_helper_items 
				WHERE user_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid) AND tower_helper = :thelper AND slot = :slot" );
				$qry->bindParam ( ':ssid', $SSID);
				$qry->bindParam ( ':thelper', $i);
				$qry->bindParam ( ':slot', $i2);
				if (! $qry->execute ()) {
					var_dump ( $qry->errorInfo () );
				}
		
				$item = $qry->fetchAll ();
				$item = $item [0];
	
				$ret [] = $item ['item_type'];
				$ret [] = $item ['item_id'];
				$ret [] = $item ['dmg_min'];
				$ret [] = $item ['dmg_max'];
				$ret [] = $item ['atr_type_1'];
				$ret [] = $item ['atr_type_2'];
				$ret [] = $item ['atr_type_3'];
				$ret [] = $item ['atr_val_1'];
				$ret [] = $item ['atr_val_2'];
				$ret [] = $item ['atr_val_3'];
				$ret [] = $item ['gold'];
				$ret [] = $item ['mush'];
				
			}
			
			$ret [] = "55574460"; // + level cost value
			
			$ret [] = "0/0/0/0/0";
		
		}
		
		$ret [] = ("0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/");
		
		break;
		
	case $ACT_COPYCAT_BOOST :
	//move item in tower
	//not working
		$db_data = loadDefaultData ();
	
		$ret [0] = $RESP_TOWER_SAVE . $ret [0];
	
		break;
	
	case $ACT_TOWER_TRY :
	//tower fight
		
		$db_data = loadDefaultData ();
		
		// STRUCTURE
		//$ret [0] = '3215216960/7103/1791/1770/4384/3909/25172784/2473/5947/2464/5763/3930;4655420/0/0/25172784/561540/3/4405539/0/2/25172784/249880/0/4153589/0/2/25172784/251950/0/3787388/936784/3/24236000/366200/0/2288974/1346645/3/22889354/1498414/3/1706694/765428/0/22123926/582280/0/151549/883898/0/21240028/1555145/3/-661731/1047733/0/20192294/813280/0/;' . $db_data ['user_name'] . '/237/0/0/1/-391/0/0/0/0/0/0/0/0/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/57/458/646/1/4/5/328/328/328/0/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37§-1/2/3/' . $db_data ['user_name'] . '///-1/////§1191428/1528/1511/6632/2503/3746/25172784/2473/5947/2464/5763/3930;695733/0/0/20192294/495694/0/25093/1744524/3/18447770/670640/0/-946245/2487723/3/15960047/971338/3/;' . $db_data ['user_name'] . '/237/0/0/2/-392/0/0/0/0/0/0/0/0/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/1009/819/1467/3/1/2/986/0/0/22997039/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37§-1/3/' . $db_data ['user_name'] . '////20192294/////§4363968/1528/6323/1508/4584/3565/25172784/2473/5947/2464/5763/3930;4128753/357705/3/15602342/235215/0/4128753/0/2/15602342/0/2/3783833/296818/0/15305524/344920/0/3783833/0/2/15305524/0/2/3783833/0/2/15305524/0/2/3144072/427037/0/14878487/639761/3/2733022/0/2/14878487/411049/0/2733022/0/2/14878487/0/2/2222398/0/2/14878487/510624/0/1531360/609312/0/14269175/691038/0/1531360/0/2/14269175/0/2/232841/0/2/14269175/1298519/3/232841/787640/0/13481535/0/2/232841/864448/0/12617087/0/2/232841/0/2/12617087/0/2/-1730563/1884610/3/10732477/1963404/3/;' . $db_data ['user_name'] . '/237/0/0/3/-393/0/0/0/0/0/0/0/0/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/2056/600/644/2/4/5/588/588/588/0/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37§-1/' . $db_data ['user_name'] . '/////15960047/////§1082424/961/1005/6661/2274/2125/25172784/2473/5947/2464/5763/3930;166101/1403916/3/9328561/916323/3/-632401/995043/0/8333517/798503/0/;' . $db_data ['user_name'] . '/237/1/1/2/2/103/102/2/109/3/2/15/1/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/1009/1046/1410/3/4/5/1064/0/0/18758009/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37§-1//////10732477/////§;0;-1;0;0;0§1264302793/92087/1397866973/1301994663/841267025/22/0/237/111298869/123996780/96905/933/-1/65338476/0/1338/1324/2/103/102/2/109/3/2/15/1/0/1/257/2/961/804/1950/1791/1700/0/201/4711/483/425/870/709/1848/1697/1602/0/1/0/1023410182/656368/443/0/3/4/2/492/0/0/11048178/0/3/1008/783/0/3/2/1/539/0/0/17891075/0/855638021/66546/532/0/3/4/5/532/0/0/9488487/0/687865860/1967089/437/0/3/2/1/500/0/0/6277787/0/1358954504/655369/0/0/3/1/5/528/0/0/7667088/0/1191182343/66544/622/0/3/2/4/512/0/0/8327251/0/1526726665/655368/0/0/4/1/5/483/0/0/0/0/1694498826/1310746/0/0/3/2/1/544/0/0/8864890/0/184549377/328689/1046/1410/3/4/5/1064/0/0/18758009/0/0/0/0/0/0/0/0/0/0/0/0/0/8/19/0/0/1/5/3/571/0/0/29292628/0/0/1008/532/0/4/3/1/548/0/0/0/0/0/2010/2154/0/1/2/3/295/269/0/0/0/0/15/0/0/11/5/0/72/25/0/1852482/0/0/1/0/0/1/5/3/304/248/0/0/0/0/237/237/237/5/4/1/-90/-93/-80/17/8/2/720/720/960/0/1010/718/0/4/1/5/295/269/0/27657353/0/0/1008/743/0/4/3/2/332/242/0/30570794/0/0/19/0/0/1/5/3/571/0/0/29292628/0/234800/839600/340000/28276200/10709600/34308500/2359298/1397782503/5/1008/579/0/3/1/5/552/0/0/40004185/0/3/1009/676/0/4/5/3/283/283/0/52922554/10/5/1009/411/0/5/4/2/289/267/0/55685219/10/5/1008/827/0/1/2/4/316/260/0/41133282/1/1/1008/809/1739/2/5/4/1120/0/0/99431632/0/1/1009/1160/1378/1/3/5/634/458/0/158498908/10/1397782757/8/7/0/0/1/3/2/342/224/0/21909165/10/12/16/0/0/11/12/0/168/25/0/3087470/15/9/5/0/0/5/4/2/557/0/0/39474100/0/8/5/0/0/1/4/2/340/224/0/10585665/1/9/14/0/0/1/5/3/350/218/0/12332167/1/8/12/0/0/4/3/5/552/0/0/37778355/0/37/0/829/3/272/10968/921711/1357235982/12/10/1391589443/0/0/1/2817/1046/1410/0/1398880351/3/0/0/1397866956/6000/0/100/1397870573/1397859709/146/146/1/1356631675/237/100/5192/9239/8082/1000000000/102529/2/1362/83/0/0/4/1397866973/5/12/12/12/12/12/12/12/12/12/12/120/16/485/15/12/0/1398042462/1398040963/0/25/25/0/0/304900910/304900910/304900910/1/1368876356/0/1596/1397866973';
		//break;
		
		// check time restrictions
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		if ($time < $db_data ['dungeon_time']) {
			if ($db_data ['mushroom'] <= 0) {
				// TODO throw error
				break;
			}
			$db_data ['mushroom'] = $db_data ['mushroom'] - 1;
			$time = $db_data ['dungeon_time'];
		} else {
			$time = $time + 1800;
		}
		
		
		$stage = $db_data['tower_level'];
		
		$OP = getTowerMonster ( $stage, $db_data );
		$p = new Char ( $db_data );
		
		// response
		$t_ret = array ();
		
		// player stats
		array_push ( $t_ret, "122" . $p->getHP (), $p->getStr (), $p->getDex (), $p->getInt (), $p->getWit (), $p->getLuck () );
		
		// mob stats
		array_push ( $t_ret, $OP->getHP (), $OP->getStr (), $OP->getDex (), $OP->getInt (), $OP->getWit (), $OP->getLuck () . ";" ); // . $p->getHp () );
		                                                                                                                             
		// simulation
		$sim = SF_Calc::calculateWin ( $p, $OP );
		
		$win = $sim [count ( $sim ) - 1] [0] <= 0 ? true : false;

		
		// if win -> update exp, lvl, etc...
		if ($win) {
			// increment stage lvl
			$stage ++;
			
			// add gained exp & gold
			$db_data ['exp'] = ( int ) $db_data ['exp'] + $OP->getExp ();
			$db_data ['silver'] = ( int ) $db_data ['silver'] + $OP->getGold ();
			
			
			// add item rewards
			
			$lvl = $db_data ['lvl'];
			$class = $db_data ['class'];
			$shop = rand(0, 1);

			$item = genItem ($lvl, $class, $shop, 'dungeon');
	

			$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 10 AND owner_id = " . $db_data['user_id'] );  
			$qry->execute ();
			if ($qry->rowCount () < 1) {
				$item ['slot'] = 10;
			} else {
				$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 11 AND owner_id = " . $db_data['user_id'] );  
				$qry->execute ();
				if ($qry->rowCount () < 1) {
					$item ['slot'] = 11;
				} else {
					$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 12 AND owner_id = " . $db_data['user_id'] );  
					$qry->execute ();
					if ($qry->rowCount () < 1) {
						$item ['slot'] = 12;
					} else {
						$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 13 AND owner_id = " . $db_data['user_id']);  
						$qry->execute ();
						if ($qry->rowCount () < 1) {
							$item ['slot'] = 13;
						} else {
							$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 14 AND owner_id = " . $db_data['user_id'] );  
							$qry->execute ();
							if ($qry->rowCount () < 1) {
								$item ['slot'] = 14;
							} else {
								$ret = array (
									$ERR_INVENTORY_FULL
								);
								break;
							}
						}
					}
				}
			}

			
			$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
				VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
				' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
				' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item ['slot'] . ',' . $db_data['user_id'] . ')' );   
			$qry->execute ();
			
			
			// lvl up
			while ( $db_data ['exp'] > $LEVELS [$db_data ['lvl']] ) {
				$db_data ['exp'] -= $LEVELS [$db_data ['lvl']];
				$db_data ['lvl'] = ( int ) $db_data ['lvl'] + 1;
			}
		}
		
		// update database
		$qry_str = "UPDATE user_data SET 
				exp = :exp, 
				lvl = :lvl, 
				silver = :silver, 
				mushroom = :shroom, 
				dungeon_time = :time,
				tower_level = :tower_level ";
		$qry_str .= " WHERE ssid = :ssid";
		$qry = $db->prepare ( $qry_str );
		$qry->bindParam ( ':exp', $db_data ['exp'] );
		$qry->bindParam ( ':lvl', $db_data ['lvl'] );
		$qry->bindParam ( ':silver', $db_data ['silver'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':time', $time );
		$qry->bindParam ( ':tower_level', $stage );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$t_ret [count ( $t_ret ) - 1] .= $sim [0] [0];
		
		// ---logs----
		// first 3, one in previous index, separated by semicolon
		array_push ( $t_ret, $sim [0] [1], $sim [0] [2] );
		
		for($i = 1; $i < count ( $sim ); $i ++) {
			array_push ( $t_ret, $sim [$i] [0], $sim [$i] [1], $sim [$i] [2] );
			// echo $sim [$i][0]."/".$sim [$i][1]."/".$sim [$i][2]."/";
		}
		
		// looks
		array_push ( $t_ret, ";" . $db_data ['user_name'], $p->getLvl (), $db_data ['race'], $db_data ['gender'], $db_data ['class'] );
		// faces
		for($i = 1; $i <= 9; $i ++) {
			$t_ret [] = $db_data ['face' . $i];
		}
		
		// mob looks, lvl, weapon
		array_push ( $t_ret, "0", "0", $OP->getLvl (), "0", "0", "1", "-" . $OP->getId (), "0", "0", "0", "0", "0", "0", "0", "0", "0;" . $p->hasWeapon () );
		
		// weapon info - player
		$weap = $p->getWeapon ();
		array_push ( $t_ret, $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] );
		
		// weapon info - mob
		$weap = $OP->getWeapon ();
		array_push ( $t_ret, $OP->hasWeapon (), $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] . ";" . $p->hasShield () );
		
		// shields
		$sh = $p->getShield ();
		array_push ( $t_ret, $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'], $sh ['mush'] );
		$sh = $OP->getShield ();
		array_push ( $ret, $OP->hasShield (), $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'] );
		// ?;?;?;exp;silver;win?
		$t_ret [] = $sh ['mush'] . ";3;0;" . $OP->getExp () . ";" . $OP->getGold () . ";-1;";
		
		// rest is default data
		$t_ret [count ( $t_ret ) - 1] .= $ret [0];
		
		// set dungeon time left
		$ret [$SF_DUNGEON_ENDTIME] = $time;
		
		for($i = 1; $i < count ( $ret ); $i ++) {
			$t_ret [] = $ret [$i];
		}
		
		exit ( join ( "/", $t_ret ) );
	
		break;
		
	case $ACT_SCREEN_TOILET :
	//enter toilet
	//not working 100%
	
		$time = new DateTime ();
		$time = $time->getTimestamp ();
	
		$db_data = loadDefaultData ();
		
		if ($time > ( int ) $db_data ['toilet_time']) {
			// reset beer && thirst && reroll time
			$db_data ['toilet_time'] = strtotime ( 'tomorrow' );
			$db_data ['toilet_full'] = 0;
			
			$qry = $db->prepare ( "UPDATE user_data SET 
					toilet_time = :time, 
					toilet_full = :toilet_full
					WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->bindParam ( ':time', $db_data ['toilet_time'] );
			$qry->bindParam ( ':toilet_full', $db_data ['toilet_full'] );
			$qry->execute ();
		}

		
		if ($db_data ['lvl'] < 100){
			$ret [0] = $RESP_TOILET_LOCKED . $ret [0];
			break;
		} elseif ($db_data ['toilet'] == 0) {
			$ret [0] = $RESP_TOILET_LOCKED . $ret [0];
			break;
		} elseif ($db_data ['toilet'] == 1)	{
			$ret [0] = $ACT_SCREEN_TOILET . $ret [0];
		} else {
			//error
			break;
		}
		
		$ret [] = (";" . $db_data['toilet_full'] . ";" . $db_data['aura'] . ";" . $db_data['fill_level'] . ";" . $db_data['fill_level_next']);
	
		break;
	
	case $ACT_TOILET_FLUSH :
	//flush toilet
	//working 80%
	
	
	$db_data = loadDefaultData ();
	

	if ($db_data ['fill_level'] < $db_data ['fill_level_next']){
		$ret [0] =  $ERR_TOILET_EMPTY . $ret [0];
		$ret [] = (";" . $db_data['toilet_full'] . ";" . $db_data['aura'] . ";" . $db_data['fill_level'] . ";" . $db_data['fill_level_next']);
		break;
	}

	
	$lvl = $db_data ['lvl'];
	$class = $db_data ['class'];
	$shop = rand(0, 1);

	$item = genItem ($lvl, rand(1, 3), $shop, 'toilet');
	
	$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 10 AND owner_id = " . $db_data ['user_id'] );  
	$qry->execute ();
	if ($qry->rowCount () < 1) {
		$item ['slot'] = 10;
		$slot = 0;
	} else {
		$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 11 AND owner_id = " . $db_data ['user_id'] );  
		$qry->execute ();
		if ($qry->rowCount () < 1) {
			$item ['slot'] = 11;
			$slot = 1;
		} else {
			$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 12 AND owner_id = " . $db_data ['user_id'] );  
			$qry->execute ();
			if ($qry->rowCount () < 1) {
				$item ['slot'] = 12;
				$slot = 2;
			} else {
				$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 13 AND owner_id = " . $db_data ['user_id'] );  
				$qry->execute ();
				if ($qry->rowCount () < 1) {
					$item ['slot'] = 13;
					$slot = 3;
				} else {
					$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 14 AND owner_id = " . $db_data ['user_id'] );  
					$qry->execute ();
					if ($qry->rowCount () < 1) {
						$item ['slot'] = 14;
						$slot = 4;
					} else {
						$ret [0] =  $ERR_TOILET_EMPTY . $ret [0];
						$ret [] = (";" . $db_data['toilet_full'] . ";" . $db_data['aura'] . ";" . $db_data['fill_level'] . ";" . $db_data['fill_level_next']);
						break;
					}
				}
			}
		}
	}

			
	$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
		VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
		' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
		' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item ['slot'] . ',' . $db_data ['user_id'] . ')' );   
	$qry->execute ();
	
	$db_data ['fill_level'] = 0;
	$db_data ['toilet_full'] = 0;
	$db_data ['aura'] = $db_data ['aura'] + 1;
	$db_data ['fill_level_next'] = getFillLevel ($db_data['aura']);
	
	
	$qry = $db->prepare ( "UPDATE user_data SET 
					fill_level = :fill_level, 
					fill_level_next = :fill_level_next,
					aura = :aura,
					toilet_full = :toilet_full
					WHERE ssid = :ssid" );
	$qry->bindParam ( ':ssid', $SSID );
	$qry->bindParam ( ':fill_level', $db_data ['fill_level'] );
	$qry->bindParam ( ':fill_level_next', $db_data ['fill_level_next'] );
	$qry->bindParam ( ':aura', $db_data ['aura'] );
	$qry->bindParam ( ':toilet_full', $db_data ['toilet_full'] );
	$qry->execute ();
	

	
	$db_data = loadDefaultData ();
			
	$ret [0] =  $RESP_TOILET_FLUSHED . $ret [0];
		
	$ret [] = (";" . $db_data['toilet_full'] . ";" . $db_data['aura'] . ";" . $db_data['fill_level'] . ";" . $db_data['fill_level_next'] . ";" . $slot);
		
		
		break;
	
	case $ACT_GUILD_RANKING :
		$input = explode ( ';', $action_extra );
		
		$guild = $input [0];
		$pos = ( int ) $input [1];
		
		if ($guild != "0") {
			
			// name
			$nick = $action_extra;
			
			// get pos
			$qry = $db->prepare ( "SELECT Count(*) + 1 AS pos FROM guilds
					WHERE honor > (SELECT honor FROM guilds WHERE name = :name) " );
			$qry->bindParam ( ':name', $guild );
			$qry->execute ();
			
			$pos = $qry->fetchAll ();
			$pos = $pos [0] ['pos'];
		}
		
		if ($pos < 8) {
			$pos = 8;
		}
		
		$posFrom = $pos - 8;
		// echo $posFrom. " ";
		
		$qry = $db->prepare ( "SELECT name, honor, guild_id, 
				(SELECT user_data.user_name FROM user_data WHERE user_data.user_id = leader_id) AS leader, 
				(SELECT Count(user_data.guild_id) FROM user_data WHERE user_data.guild_id = guilds.guild_id) AS members 
				FROM guilds 
				ORDER BY honor DESC LIMIT :pos, 15" );
		$qry->bindParam ( ':pos', $posFrom, PDO::PARAM_INT );
		$qry->execute ();
		
		// echo $qry -> rowCount();
		
		$res = $qry->fetchAll ();
		
		$ret = array (
				"170" 
		);
		
		$pos -= 7;
		// pos/leader/name/members/honor
		for($i = 0; $i < count ( $res ); $i ++) {
			
			$a = $i * 5;
			
			// pos
			$ret [$a] = urldecode($pos);
			
			// leader
			$ret [$a + 1] = $res [$i] ['leader'];
			
			// name
			$ret [$a + 2] = $res [$i] ['name'];
			
			// member count
			$ret [$a + 3] = $res [$i] ['members'];
			
			// honor
			$ret [$a + 4] = $res [$i] ['honor'];
			
			$pos ++;
		}
		
		$ret [0] = "170" . $ret [0];
		
		// potrzeba?
		// $ret [count ( $ret )] = count ( $res );
		
		break;
	case $ACT_TAVERN_ENTER :
		
		// current timestamp
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		$db_data = loadDefaultData ();
		
		// check if reroll time
		if ($time > ( int ) $db_data ['quest_reroll_time']) {
			// reset beer && thirst && reroll time
			$db_data ['quest_reroll_time'] = strtotime ( 'tomorrow' );
			$db_data ['thirst'] = 6000;
			$db_data ['beers'] = 0;
			
			// set in return var
			$ret [$SF_THIRST] = 6000;
			$ret [$SF_BEERS] = 0;
			
			$qry = $db->prepare ( "UPDATE user_data SET 
					quest_reroll_time = :time, 
					thirst = 6000, 
					beers = 0 
					WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->bindParam ( ':time', $db_data ['quest_reroll_time'] );
			$qry->execute ();
		}
		
		// check if work
		if ($db_data ['status'] == 1) {
			$ret = array (
					"012" . getGoldForWork ( $db_data ['lvl'] ) . ";1" 
			);
			break;
		}
		
		// check if ended quest
		if ($db_data ['status'] == 2) {
			if ($time > ( int ) $db_data ['status_end']) {		
				finishQuest ($db_data);
				break;
			}
		}

		// i'm not sure it work's
		// if ($time < strtotime ( 'tomorrow' ) and $time > (strtotime ( 'tomorrow' ) - 18000)){
		//	$ret [0] = $RESP_QUEST_SKIP_ALLOWED_START . $ret [0];
		// } else {
		//	$ret [0] = $RESP_QUEST_START . $ret [0];
		// }
		
		$ret [0] = $RESP_QUEST_SKIP_ALLOWED . $ret [0];
		
		$ret [] = ";" . event () . ";0"; // if there's some event
		
		break;
	case $ACT_START_QUEST :
		// quest;ignore full eq?
		$in = explode ( ';', $action_extra );
		
		$db_data = loadDefaultData ();
		
		// server time
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		// mount multiplier
		$mount = $time < $db_data ['mount_dur'] ? mountMultiplier ( $db_data ['mount'] ) : 1;
		// length
		$dur = (( int ) $db_data ['quest_dur_' . $in [0]] * 30 * $mount);
		// end timestamp
		$end = $time + $dur;
		
		// check time?
		if ($db_data ['status'] != 0) {
			// error
			break;
		}
		// chec if enought thirst
		if ($db_data ['thirst'] < $dur) {
			$ret = array (
					$ERR_NO_ENDURANCE 
			);
			break;
		}
		
		$qry = $db->prepare ( "UPDATE user_data SET status = 2, status_extra = :qpick, status_end = :end 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':qpick', $in [0] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':end', $end );
		$qry->execute ();
		
		
		
		
		// current timestamp
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		$db_data = loadDefaultData ();
		
		
		$ret [0] = $RESP_QUEST_SKIP_ALLOWED_START . $ret [0];
		
		$ret [$SF_STATUS] = 2;
		$ret [$SF_CHOSEN_QUEST] = $in [0];
		$ret [$SF_ACT_ENDTIME] = $end;
		
		break;

	case $ACT_QUEST_CANCEL :
		$db_data = loadDefaultData ();
		$qry = $db->prepare ( "UPDATE user_data SET status = '0', status_end = '0' WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$ret [$SF_STATUS] = 0;
		
		
		$ret [0] = $RESP_QUEST_STOP . $ret [0];
	
		break;
	case $ACT_QUEST_SKIP :
		
		// $qry = $db->prepare ( "SELECT * FROM user_data WHERE ssid = :ssid" );
		// $qry->bindParam ( ':ssid', $SSID );
		// $qry->execute ();
		
		// $db_data = $qry->fetchAll ();
		// $db_data = $db_data [0];
		
		$db_data = loadDefaultData ();
		
		if ($db_data ['mushroom'] <= 0) {
			$ret = array (
					$ERR_NO_MUSH_BAR
			);
			break;
		}
		$db_data ['mushroom'] = $db_data ['mushroom'] - 1;
		
		$qry = $db->prepare ( "UPDATE user_data SET mushroom = :shroom, status_end = 0 WHERE ssid = :ssid" );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		finishQuest ( $db_data );
		
		$ret [$SF_STATUS] = 0;
		

		
		
		break;
	case $ACT_WORK_ENTER :
		// structure
		// 012 67500;0 -- 67500 = money in silver
		
		// end work, check if done etc...
		$qry = $db->prepare ( "SELECT * FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$db_data = $qry->fetchAll ();
		$db_data = $db_data [0];
		
		// server time
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		// silverper hour
		$sph = getGoldForWork ( $db_data ['lvl'] );
		
		// if work end resp 103 + defalt, last .= ;gained gold
		if (( int ) $db_data ['status'] == 1 && ( int ) $db_data ['status_end'] < $time) {
			
			$gain = ($sph * ( int ) $db_data ['status_extra']);
			
			$db_data ['silver'] = ( int ) $db_data ['silver'] + $gain;
			
			$db_data ['medal_employment'] = $db_data ['medal_employment'] + 1;
			
			// update database
			$qry = $db->prepare ( "UPDATE user_data SET status = 0, silver = :silver, medal_employment = :medal_employment 
					WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->bindParam ( ':silver', $db_data ['silver'] );
			$qry->bindParam ( ':medal_employment', $db_data ['medal_employment'] );
			$qry->execute ();
			
			loadDefaultData ();
			
			$ret [0] = "103" . $ret [0];
			
			$ret [511] .= ";" . $gain;
		} else {
			$ret = array (
					"012" . $sph . ";0" 
			);
		}
		
		break;
	case $ACT_WORK :
		
		// desired length
		$in = $action_extra;
		
		// TODO check if not already in stat 1 || 2
		$db_data = loadDefaultData ();
		
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		if (( int ) $db_data ['status'] == 1 && ( int ) $db_data ['status_end'] < $time) {
			// error
			break;
		}
		
		$end = $time + (3600 * ( int ) $in);
		
		$qry = $db->prepare ( "UPDATE user_data SET status = 1, status_end = :end, status_extra = :hours 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':end', $end );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':hours', $in );
		$qry->execute ();
		
		$ret [0] = "104" . $ret [0];
		$ret [$SF_STATUS] = 1;
		$ret [$SF_ACT_ENDTIME] = $end;
		// work length
		$ret [46] = $in;
		break;
	case $ACT_WORK_CANCEL :
		// resp 105 + default
		$qry = $db->prepare ( "UPDATE user_data SET status = 0 WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		loadDefaultData ();
		
		$ret [0] = "105" . $ret [0];
		break;
	case $ACT_BARN :
		
		$ret = array (
				"015" 
		);
		break;
	case $ACT_BUY_MOUNT :
		
		$mount = $action_extra;
		$cost = mountCost ( $mount );
		$silver = $cost ['silver'];
		$shroom = $cost ['shroom'];
		
		// TODO: get current mount
		$qry = $db->prepare ( "SELECT mount, mount_dur, silver, mushroom FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$res = $qry->fetchAll ();
		$res = $res [0];
		
		// time to check if expired
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		if ($time < ( int ) $res ['mount_dur'])
			$cur_mount = ( int ) ($res ['mount']);
		else
			$cur_mount = 0;
		
		if ($cur_mount > $mount) {
			// throw error got better mount
			
			break;
		}
		
		if ($silver > $res ['silver']) {
			// throw error not enought silver/shrooms
			$ret = array (
					$ERR_TOO_EXPENSIVE 
			);
			break;
		}
		if ($shroom > $res ['mushroom']) {
			$ret = array (
					$ERR_NO_MUSH_MQ 
			);
			break;
		}
		
		// - the cost
		$silver = $res ['silver'] - $silver;
		$shroom = $res ['mushroom'] - $shroom;
		
		// current time
		$time = new DateTime ();
		
		$time = $time->getTimestamp ();
		
		// current mount duration
		$mount_dur = $res ['mount_dur'];
		
		// TODO: UPDATE DATABASE
		if ($mount_dur <= $time || $mount != $cur_mount) {
			$mount_dur = $time + 1209600; // +2 weeks in secs
		} else {
			$mount_dur += 1209600; // +2 weeks in secs
		}
		
		$qry = $db->prepare ( "UPDATE user_data 
				SET mount = :mount, 
				mount_dur = :mount_dur, 
				silver = :silver, 
				mushroom = :shroom 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':mount', $mount );
		$qry->bindParam ( ':mount_dur', $mount_dur );
		$qry->bindParam ( ':silver', $silver );
		$qry->bindParam ( ':shroom', $shroom );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		// return user to hero screen
		
		// $qry = $db->prepare ( "SELECT *,
		// (
		// SELECT Count(*) FROM messages WHERE messages.read = 0 AND messages.reciver_id = user_id
		// ) AS c, (
		// SELECT Count(*) + 1 FROM user_data WHERE user_data.honor > (
		// SELECT honor FROM user_data WHERE ssid = :ssid
		// )
		// ) AS rank
		// FROM user_data WHERE ssid = :ssid2" );
		// $qry->bindParam ( ':ssid', $SSID );
		// $qry->bindParam ( ':ssid2', $SSID );
		// $qry->execute ();
		
		// $db_data = $qry->fetchAll ()[0];
		
		loadDefaultData ();
		
		$ret [0] = $ACT_HERO . $ret [0];
		
		// user desc
	
		$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
		
		break;
	case $ACT_ENTER_SHOP_SHAKES :
	
		
		$db_data = loadDefaultData ();
		
		enterShop ( $SHOP_SHAKES, $db_data );
		
		$ret [0] = $ACT_ENTER_SHOP_SHAKES . $ret [0];
		
		$ret [] = ";" . event (); // if there's some event
		
		break;
	case $ACT_ENTER_SHOP_FIDGET :
	
		
		$db_data = loadDefaultData ();
		enterShop ( $SHOP_FIDGET, $db_data );
		
		$ret [0] = $ACT_ENTER_SHOP_FIDGET . $ret [0];
		
		$ret [] = ";" . event (); // if there's some event
		
		break;
	case $ACT_DRINK_BEER :
		
		$db_data = loadDefaultData ();
		
		// check if exceded limit
		if ($db_data ['beers'] >= 10) {
			$ret = array (
					$ERR_BEER 
			);
			break;
		}
		
		
		// check if enought mushrooms
		if ($db_data ['mushroom'] <= 0) {
			$ret = array (
					$ERR_NO_MUSH_BAR 
			);
			break;
		}
		
		// check if thirst is low enought
		if ($db_data ['thirst'] > 5800) {
			break;
		}
		
		$db_data ['thirst'] += 1200;
		$db_data ['beers'] += 0;
		$db_data ['mushroom'] -= 1;
		
		// update db
		$qry = $db->prepare ( "UPDATE user_data SET 
				thirst = :thirst, 
				beers = :beers, 
				mushroom = :shroom
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':thirst', $db_data ['thirst'] );
		$qry->bindParam ( ':beers', $db_data ['beers'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		// response
		$ret [0] = "010" . $ret [0];
		
		$ret [$SF_THIRST] = $db_data ['thirst'];
		$ret [$SF_BEERS] = $db_data ['beers'];
		$ret [$SF_MUSH] = $db_data ['mushroom'];
		
		break;
	case $ACT_ENTER_GUILD :
		
		// get guild info and members
		$qry = $db->prepare ( "SELECT * 
				FROM guilds 
				WHERE guild_id = (SELECT user_data.guild_id FROM user_data WHERE user_data.ssid = :ssid)" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		// if player has no guild -> return this
		if ($qry->rowCount () == 0) {
			$ret = array (
					"017" 
			);
			break;
		}
		
		$g_data = $qry->fetchAll ();
		$g_data = $g_data [0];
		
		// get guild members
		$qry = $db->prepare ( "SELECT * FROM user_data  
				WHERE guild_id = (SELECT user_data.guild_id FROM user_data WHERE ssid = :ssid) 
				 
				ORDER BY guild_rank ASC, lvl DESC" );
		$qry->bindParam ( ':ssid', $SSID );
		// $qry -> bindParam(':gid', $g_data['']):
		$qry->execute ();
		$m_data = $qry->fetchAll ();
		
		// get invited players
		$qry = $db->prepare ( "SELECT user_data.*, guild_invites.guild_id FROM user_data 
				INNER JOIN guild_invites 
				ON user_data.user_id = guild_invites.user_id 
				WHERE guild_invites.guild_id = :gid
				ORDER BY user_data.lvl DESC" );
		$qry->bindParam ( ':gid', $g_data ['guild_id'] );
		$qry->execute ();
		
		$im_data = $qry->fetchAll ();
		
		loadGuildData ( $g_data, $m_data, $im_data, true );
		
		// $ret [count ( $ret ) - 1] .= ";Admin;99999;1";
		
		break;
		
		$qry = $db->prepare ( "SELECT guild_id FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		if (! $qry->execute ()) {
			break;
		}
		
		$guild_id = $qry->fetchAll ();
		$guild_id = $guild_id [0] ['guild_id'];
		
		// get other users from guild, order by lvl DESC, guild_rank ASC
		
		break;
	
	case $ACT_ENTER_DUNGEON :
		
		// $qry = $db->prepare ( "SELECT *, (SELECT Count(*) FROM messages WHERE messages.read = 0 AND messages.reciver_id = user_id) AS c
		// FROM user_data WHERE ssid = :ssid" );
		// $qry->bindParam ( ':ssid', $SSID );
		// $qry->execute ();
		
		// $db_data = $qry->fetchAll ()[0];
		
		$db_data = loadDefaultData ();
		
		for ($i = 1; $i < 10; $i ++){
			if ($db_data['dungeon_' . $i] == 1){
			$db_data['dungeon_' . $i] = 2;
			
			$qry = $db->prepare ( "UPDATE user_data SET dungeon_" . $i . " = 2 WHERE ssid = :ssid" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->execute ();
			}
		}
		

		
		$ret [0] = $ACT_ENTER_DUNGEON . $ret [0];
		
		// monster IDs
		$monsters = array ();
		for($i = 1; $i <= 13; $i ++) {
			$monsters [] = getDungMonster ( $i, $db_data ['dungeon_' . $i] );
		}
		
		$ret [count ( $ret )] = ";" . $monsters [0]->getId ();
		
		for($i = 1; $i < 13; $i ++) {
			$ret [] = $monsters [$i]->getId ();
		}
		
		break;
	case $ACT_MAINQUEST :
		$dung = ( int ) $action_extra;
		
		$db_data = loadDefaultData ();
		
		// check time restrictions
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		if ($time < $db_data ['dungeon_time']) {
			if ($db_data ['mushroom'] <= 0) {
				// TODO throw error
				break;
			}
			$db_data ['mushroom'] = $db_data ['mushroom'] - 1;
			$time = $db_data ['dungeon_time'];
		} else {
			$time = $time + 1800;
		}
		
		$stage = ( int ) $db_data ['dungeon_' . $dung];
		
		$OP = getDungMonster ( $dung, $stage, $db_data );
		$p = new Char ( $db_data );
		
		// response
		$t_ret = array ();
		
		// player stats
		array_push ( $t_ret, "122" . $p->getHP (), $p->getStr (), $p->getDex (), $p->getInt (), $p->getWit (), $p->getLuck () );
		
		// mob stats
		array_push ( $t_ret, $OP->getHP (), $OP->getStr (), $OP->getDex (), $OP->getInt (), $OP->getWit (), $OP->getLuck () . ";" ); // . $p->getHp () );
		                                                                                                                             
		// simulation
		$sim = SF_Calc::calculateWin ( $p, $OP );
		
		$win = $sim [count ( $sim ) - 1] [0] <= 0 ? true : false;
		
		$stage2 = 0;
		
		// if win -> update exp, lvl, etc...
		if ($win) {
			// increment stage lvl
			$stage ++;
			
			// if the dungeon is 9 or above && the dungeon is complete
			// open the next one, set value to 2, update in database
			if ($dung >= 9 && $dung <= 12 && $stage == 12)
				$stage2 = 2;
				
				// update $ret global var that has already been loaded
			$ret [${"SF_DUNGEON_" . $dung}] = $stage;
			
			// add gained exp & gold
			$db_data ['exp'] = ( int ) $db_data ['exp'] + $OP->getExp ();
			$db_data ['silver'] = ( int ) $db_data ['silver'] + $OP->getGold ();			
			
			// add item rewards
			
			$itemRand = rand(1, 3);
			
			if ($itemRand == 1 or $stage == 11){
			
			$lvl = $db_data ['lvl'];
			$class = $db_data ['class'];
			$shop = rand(0, 1);

			$item = genItem ($lvl, $class, $shop, 'dungeon');
	

			$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 10 AND owner_id = " . $db_data['user_id'] );  
			$qry->execute ();
			if ($qry->rowCount () < 1) {
				$item ['slot'] = 10;
				$allowItemReward = true;
			} else {
				$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 11 AND owner_id = " . $db_data['user_id'] );  
				$qry->execute ();
				if ($qry->rowCount () < 1) {
					$item ['slot'] = 11;
					$allowItemReward = true;
				} else {
					$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 12 AND owner_id = " . $db_data['user_id'] );  
					$qry->execute ();
					if ($qry->rowCount () < 1) {
						$item ['slot'] = 12;
						$allowItemReward = true;
					} else {
						$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 13 AND owner_id = " . $db_data['user_id']);  
						$qry->execute ();
						if ($qry->rowCount () < 1) {
							$item ['slot'] = 13;
							$allowItemReward = true;
						} else {
							$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 14 AND owner_id = " . $db_data['user_id'] );  
							$qry->execute ();
							if ($qry->rowCount () < 1) {
								$item ['slot'] = 14;
								$allowItemReward = true;
							} else {
								$allowItemReward = false;
							}
						}
					}
				}
			}

			if ($allowItemReward == true){
			
			$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
				VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
				' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
				' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item ['slot'] . ',' . $db_data['user_id'] . ')' );   
			$qry->execute ();
			
			}
			
			}
			
			
			// lvl up
			while ( $db_data ['exp'] > $LEVELS [$db_data ['lvl']] ) {
				$db_data ['exp'] -= $LEVELS [$db_data ['lvl']];
				$db_data ['lvl'] = ( int ) $db_data ['lvl'] + 1;
			}
		}
		
		// update database
		$qry_str = "UPDATE user_data SET 
				exp = :exp, 
				lvl = :lvl, 
				silver = :silver, 
				mushroom = :shroom, 
				dungeon_time = :time, 
				" . getDungeonTableName ( $dung ) . " = :dung ";
		if ($stage2 == 2)
			$qry_str .= ", " . getDungeonTableName ( $dung + 1 ) . "= :dung2";
		$qry_str .= " WHERE ssid = :ssid";
		$qry = $db->prepare ( $qry_str );
		$qry->bindParam ( ':exp', $db_data ['exp'] );
		$qry->bindParam ( ':lvl', $db_data ['lvl'] );
		$qry->bindParam ( ':silver', $db_data ['silver'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':time', $time );
		$qry->bindParam ( ':dung', $stage );
		if ($stage2 == 2)
			$qry->bindParam ( ':dung2', $stage2 );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$t_ret [count ( $t_ret ) - 1] .= $sim [0] [0];
		
		// ---logs----
		// first 3, one in previous index, separated by semicolon
		array_push ( $t_ret, $sim [0] [1], $sim [0] [2] );
		
		for($i = 1; $i < count ( $sim ); $i ++) {
			array_push ( $t_ret, $sim [$i] [0], $sim [$i] [1], $sim [$i] [2] );
			// echo $sim [$i][0]."/".$sim [$i][1]."/".$sim [$i][2]."/";
		}
		
		// looks
		array_push ( $t_ret, ";" . $db_data ['user_name'], $p->getLvl (), $db_data ['race'], $db_data ['gender'], $db_data ['class'] );
		// faces
		for($i = 1; $i <= 9; $i ++) {
			$t_ret [] = $db_data ['face' . $i];
		}
		
		// mob looks, lvl, weapon
		array_push ( $t_ret, "0", "0", $OP->getLvl (), "0", "0", "1", "-" . $OP->getId (), "0", "0", "0", "0", "0", "0", "0", "0", "0;" . $p->hasWeapon () );
		
		// weapon info - player
		$weap = $p->getWeapon ();
		array_push ( $t_ret, $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] );
		
		// weapon info - mob
		$weap = $OP->getWeapon ();
		array_push ( $t_ret, $OP->hasWeapon (), $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] . ";" . $p->hasShield () );
		
		// shields
		$sh = $p->getShield ();
		array_push ( $t_ret, $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'], $sh ['mush'] );
		$sh = $OP->getShield ();
		array_push ( $ret, $OP->hasShield (), $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'] );
		// ?;?;?;exp;silver;win?
		$t_ret [] = "0;3;0;" . $OP->getExp () . ";" . $OP->getGold () . ";-1;";
		
		// rest is default data
		$t_ret [count ( $t_ret ) - 1] .= $ret [0];
		
		// set dungeon time left
		$ret [$SF_DUNGEON_ENDTIME] = $time;
		
		for($i = 1; $i < count ( $ret ); $i ++) {
			$t_ret [] = $ret [$i];
		}
		
		exit ( join ( "/", $t_ret ) );
		break;
	case $ACT_MAIL :
		
		$ret = array_fill ( 0, 45, "" );
		
		$in = explode ( ';', $action_extra );
		$a = ( int ) $in [0] - 1;
		// var_dump($a);
		
		// structure 005[mail count];nick/subject/timestamp/.../;count
		// 00512;Viper750PL/6/1387140501/Pan Marcel/1/1387055482/kaczken7/gildia/1387032973/xRDFGx/6/1387026444/kosmonalta/6/1386952029/GreenDG/6/1386857503/Viper750PL/6/1386427677/Viper750PL/6/1386423587/Viper750PL/6/1386414830/Viper750PL/6/1386361836/Tohr/6/1386266661/Tohr/6/1386021979/////////////;12
		
		// if empty
		
		$qry = $db->prepare ( "SELECT messages.msg, messages.subject, messages.time, user_data.user_name,  
				(SELECT Count(*) FROM messages WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)) AS c  
				FROM messages 
				LEFT JOIN user_data ON messages.sender_id = user_data.user_id 
				WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)
				GROUP BY msg_id
				ORDER BY time DESC 
				LIMIT :from, 15" );
		// LIMIT 0, 15 -- get from action_extra
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':from', $a, PDO::PARAM_INT );
		$qry->execute ();
		
		// var_dump($qry -> fetchAll());
		
		if ($qry->rowCount () == 0) {
			$ret [0] = "0050";
			$ret [44] = ";0";
			break;
		}
		
		$db_data = $qry->fetchAll ();
		
		// $msg_count = $db_data[0]['c'];
		$msg_count = count ( $db_data );
		
		$ret [0] = "005" . $msg_count . ";";
		$ret [44] = ";" . $msg_count;
		
		$y = 0;
		for($i = 0; $i < $msg_count; $i ++) {
			
			// TODO: nie potrzebne?
			// $msg = $db_data[$i]['msg'];
			$sub = $db_data [$i] ['subject'];
			$time = $db_data [$i] ['time'];
			$sender_name = $db_data [$i] ['user_name'];
			
			$ret [$y] .= $sender_name;
			$ret [$y + 1] = urldecode($sub);
			$ret [$y + 2] = $time;
			
			$y += 3;
		}
		
		// mark messages read
		$qry = $db->prepare ( "UPDATE messages SET messages.read = 1 
				WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		break;
	case $ACT_MAIL_SEND :
		// 509 odbiorca;temat;wiadomosc
		
		$action_extra = explode ( ';', $action_extra );
		
		$time = new DateTime ();
		
		$time = $time->getTimestamp ();
		$to = $action_extra [0];
		$sub = urlencode($action_extra [1]);
		$msg = urlencode($action_extra [2]);
		
		if (strlen ( $sub ) < 3) {
			$ret = array (
					$ERR_SUBJECT_TOO_SHORT 
			);
			break;
		}
		
		$qry = $db->prepare ( "INSERT INTO messages(sender_id, reciver_id, time, subject, msg)
				VALUES((SELECT user_id FROM user_data WHERE ssid = :ssid),
					(SELECT user_id FROM user_data WHERE user_name = :to),
					:time, :sub, :msg)" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':to', $to );
		$qry->bindParam ( ':time', $time );
		$qry->bindParam ( ':sub', $sub );
		$qry->bindParam ( ':msg', $msg );
		
		if (! $qry->execute ()) {
			// throw error & break;
			$ret = array (
					$ERR_MSG_NO_SUCH_NAME 
			);
			break;
		}
		
		// if succesful
		$ret = array (
				202 
		);
		
		break;
	
	case $ACT_MAIL_READ :
		// structure
		// 201sender_name;sub;timestamp;msg;0?? || :# == \n
		
		$mail_id = ( int ) $action_extra;
		
		$qry = $db->prepare ( "SELECT messages.*, user_data.user_name FROM messages
						JOIN user_data ON messages.sender_id = user_data.user_id  
						WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid) 
						GROUP BY msg_id
						ORDER BY time DESC LIMIT :from, :to" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':from', $a = $mail_id - 1, PDO::PARAM_INT );
		$qry->bindParam ( ':to', $mail_id, PDO::PARAM_INT );
		if (! $qry->execute ()) {
			// ??
			$ret = array (
					$ERR_BEER 
			);
			break;
		}
		
		$res = $qry->fetchAll ();
		$res = $res [0];
		
		$ret = array (
				"201" . $res ['user_name'] . ";" . urldecode($res ['subject']) . ";" . $res ['time'] . ";" . urldecode($res ['msg']) . ";" 
		);
		
		// if subject is guild invite, include guild id
		if ($res ['subject'] == "5") {
			$qry = $db->prepare ( "SELECT guild_id FROM guilds WHERE name = :name" );
			$qry->bindParam ( ':name', $res ['msg'] );
			$qry->execute ();
			$a = $qry->fetchAll ();
			$ret [0] .= $a [0] ['guild_id'];
		} else {
			$ret [0] .= "0";
		}
		
		break;
	case $ACT_MAIL_DELETE :
		
		$mail_id = ( int ) $action_extra;
		
		// delete all
		if ($mail_id == '-1') {
			$ret = array_fill ( 0, 45, '' );
			$ret [0] = "0050;";
			$ret [44] = ";0";
			
			$qry = $db->prepare ( "DELETE FROM messages WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->execute ();
			
			break;
		}
		
		// ---------delete mail----------------
		
		// get mail id
		$qry = $db->prepare ( "SELECT * FROM messages
								WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)
								ORDER BY time DESC
								LIMIT :from, :to" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':from', $a = $mail_id - 1, PDO::PARAM_INT );
		$qry->bindParam ( ':to', $mail_id, PDO::PARAM_INT );
		$qry->execute ();
		
		$mail_id = $qry->fetchAll ();
		// var_dump ( $mail_id );
		$mail_id = $mail_id [0] ['msg_id'];
		// exit();
		$qry = $db->prepare ( "DELETE FROM messages WHERE msg_id = :msg_id" );
		$qry->bindParam ( ':msg_id', $mail_id, PDO::PARAM_INT );
		$qry->execute ();
		
		// -------------------------------------
		
		// ------------read mail again--------------
		
		$ret = array_fill ( 0, 45, "" );
		
		// structure 005[mail count];nick/subject/timestamp/.../;count
		// 00512;Viper750PL/6/1387140501/Pan Marcel/1/1387055482/kaczken7/gildia/1387032973/xRDFGx/6/1387026444/kosmonalta/6/1386952029/GreenDG/6/1386857503/Viper750PL/6/1386427677/Viper750PL/6/1386423587/Viper750PL/6/1386414830/Viper750PL/6/1386361836/Tohr/6/1386266661/Tohr/6/1386021979/////////////;12
		
		// if empty
		
		$qry = $db->prepare ( "SELECT messages.msg, messages.subject, messages.time, user_data.user_name
								FROM messages
								JOIN user_data ON messages.sender_id = user_data.user_id
								WHERE reciver_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)
								GROUP BY msg_id
								ORDER BY time DESC" );
		// LIMIT 0, 15 -- get from action_extra
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		if ($qry->rowCount () == 0) {
			$ret [0] = "0050";
			$ret [44] = ";0";
			break;
		}
		
		$db_data = $qry->fetchAll ();
		
		// $msg_count = $db_data[0]['c'];
		$msg_count = count ( $db_data );
		
		$ret [0] = "005" . $msg_count . ";";
		$ret [44] = ";" . $msg_count;
		
		$y = 0;
		for($i = 0; $i < $msg_count; $i ++) {
			
			// TODO: nie potrzebne?
			// $msg = $db_data[$i]['msg'];
			$sub = $db_data [$i] ['subject'];
			$time = $db_data [$i] ['time'];
			$sender_name = $db_data [$i] ['user_name'];
			
			$ret [$y] .= $sender_name;
			$ret [$y + 1] = urldecode($sub);
			$ret [$y + 2] = $time;
			
			$y += 3;
		}
		
		break;
	case $ACT_VIEW_CHAR :
		$name = $action_extra;
		
		// load char data
		$qry = $db->prepare ( "SELECT *,  
				(
				    SELECT Count(*) + 1 FROM user_data WHERE user_data.honor > (
				        SELECT honor FROM user_data WHERE user_name = :name2
				    )
				) AS rank, 
				(
					SELECT guilds.name FROM guilds WHERE guilds.guild_id = user_data.guild_id
				) AS guild
				FROM user_data WHERE user_name = :name" );
		$qry->bindParam ( ':name', $name );
		$qry->bindParam ( ':name2', $name );
		$qry->execute ();
		
		$a = $qry->fetchAll ();
		loadCharData ( $a [0] );
		
		break;
	case $ACT_CREATE_GUILD :
		$action_extra = explode ( ';', $action_extra );
		
		$leader = $action_extra [0];
		$guild = $action_extra [1];
		$leader_id;
		
		// check input & get user_id
		$qry = $db->prepare ( "SELECT user_id, silver FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		if ($qry->rowCount () != 1) {
			// ??
			$ret = array (
					$ERR_GUILD_NAME_REJECTED 
			);
			break;
		}
		
		if ( preg_match("/[^-a-z0-9_]/i", $guild) )
		{
			// ??
			$ret = array (
					$ERR_GUILD_NAME_REJECTED 
			);
			break;
		}
		$res = $qry->fetchAll ();
		$res = $res [0];
		
		// check if enought gold
		if (( int ) $res ['silver'] < 1000) {
			$ret = array (
					$ERR_GUILD_LACK_GOLD 
			);
			break;
		}
		
		// fetch leader id
		$leader_id = $res ['user_id'];
		
		// check for guild with the same name
		$qry = $db->prepare ( "SELECT name FROM guilds WHERE name = :name" );
		$qry->bindParam ( ':name', $guild );
		$qry->execute ();
		if ($qry->rowCount () > 0) {
			$ret = array (
					$ERR_GUILD_NAME_REJECTED 
			);
			break;
		}
		
		// insert new guild
		$qry = $db->prepare ( "INSERT INTO guilds(name, leader_id) 
				VALUES(:name, :lid)" );
		$qry->bindParam ( ':name', $guild );
		$qry->bindParam ( ':lid', $leader_id );
		if (! $qry->execute ()) {
			
			break;
		}
		
		// subtract the cost
		$silver = ( int ) $res ['silver'] - 1000;
		
		// update user
		$qry = $db->prepare ( "UPDATE user_data 
				SET guild_rank = 1, 
				guild_id = (SELECT guilds.guild_id FROM guilds WHERE guilds.name = :name),
				silver = :silver  
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':name', $guild );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':silver', $silver );
		$qry->execute ();
		// f0fd0fa39c48805494193838e4a77ea7 101Admin%3BAdministracja%3Bd41d8cd98f00b204e9800998ecf8427e
		
		// if succesful
		$ret = array (
				"150" 
		);
		
		break;
	case $ACT_CHANGE_HERO_DESC :
		
		$desc = urlencode($action_extra);
		
		$qry = $db->prepare ( "UPDATE user_data SET user_desc = :desc WHERE ssid = :ssid" );
		$qry->bindParam ( ':desc', $desc );
		$qry->bindParam ( ':ssid', $SSID );
		if ($qry->execute ()) {
			$ret = array (
					"109" 
			);
		} else {
		}
		
		break;
	case $ACT_GUILD_SET_DESC :
		// Nick, guild_name, desc, password (md5)
		$data = explode ( ';', $action_extra );
		
		$desc = urldecode ( '%A7' );
		$desc = explode ( $desc, $data [2] );
		$desc = $desc;
		
		$qry = $db->prepare ( "UPDATE guilds SET description = :description
				WHERE guild_id = (SELECT user_data.guild_id FROM user_data WHERE user_data.ssid = :ssid)" );
		$qry->bindParam ( ':description', urlencode($desc [1]) );
		$qry->bindParam ( ':ssid', $SSID );
		if ($qry->execute ()) {
			$ret = array (
					"153" 
			);
		}
		
		break;
		
		
	case $ACT_SEND_CHAT :

		break;
		
	case $ACT_GUILD_INVITE :
		// act;gildia ; nick zaproszonego ; pass (md5)
		// 103;Administracja;zaproszony;ecc41f36d9827fb628b53aa33360f0e3;
		$in = explode ( ';', $action_extra );
		
		// insert into guild invites
		$qry = $db->prepare ( "INSERT INTO guild_invites(guild_id, user_id)  
				VALUES(
				(SELECT guilds.guild_id FROM guilds WHERE guilds.name = :guild), 
				(SELECT user_id FROM user_data WHERE user_data.user_name = :name))" );
		$qry->bindParam ( ':guild', $in [1] );
		$qry->bindParam ( ':name', $in [2] );
		$qry->execute ();
		
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		
		// send invitation message
		// 201kamilchg;5;1383206692;chrobry glogA3w;27770
		$qry = $db->prepare ( "INSERT INTO messages(sender_id, reciver_id, time, subject, msg) 
				VALUES(
				(SELECT user_id FROM user_data WHERE ssid = :ssid), 
				(SELECT user_id FROM user_data WHERE user_name = :sname), 
				:time, 
				5, 
				:msg
				)" );
		$qry->bindParam ( ':sname', $in [2] );
		$qry->bindParam ( ':msg', $in [1] );
		$qry->bindParam ( ':time', $time );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$ret = array (
				"157" 
		);
		
		break;
	case $ACT_GAMBLE :
		// bet {silver, shrooms}
		$bet = explode ( ';', $action_extra );
		
		// get data
		$qry = $db->prepare ( "SELECT *, 
				(
					SELECT Count(*) FROM messages WHERE messages.read = 0 AND messages.reciver_id = user_id
				) AS c, (
				    SELECT Count(*) + 1 FROM user_data WHERE user_data.honor > (
				        SELECT honor FROM user_data WHERE ssid = :ssid
				    )
				) AS rank 
				 FROM user_data WHERE ssid = :ssid2" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':ssid2', $SSID );
		$qry->execute ();
		
		$db_data = $qry->fetchAll ();
		$db_data = $db_data [0];
		
		// check if enoguht gold && shrooms
		if ($bet [0] > $db_data ['silver']) {
			// throw error
			break;
		}
		if ($bet [1] > $db_data ['mushroom']) {
			// throw error
			break;
		}
		
		// gen rand 100
		$r = rand ( 0, 100 );
		
		// if rand <= 33 -> win
		if ($r < 33) {
			$db_data ['silver'] += $bet [0];
			$db_data ['mushroom'] += $bet [1];
		} else {
			$db_data ['silver'] -= $bet [0];
			$db_data ['mushroom'] -= $bet [1];
		}
		
		// update db
		$qry = $db->prepare ( "UPDATE user_data SET 
				silver = :silver, 
				mushroom = :shroom 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':silver', $db_data ['silver'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		loadDefaultData ( $db_data );
		
		// 168 win || 169 lose
		if ($r < 33) {
			$ret [0] = "168" . $ret [0];
		} else {
			$ret [0] = "169" . $ret [0];
		}
		
		break;
	case $ACT_GUILD_SET_OFFICER :
		// 106Admin;Administracja;test5;ecc41f36d9827fb628b53aa33360f0e3;
		$in = explode ( ';', $action_extra );
		
		// get user(leader) id for serucity reasons
		$qry = $db->prepare ( "SELECT user_id  FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		if (! $qry->execute () || $qry->rowCount () == 0) {
			// var_dump ( $qry->errorInfo () );
			break;
		}
		
		$lid = $qry->fetchAll ();
		$lid = $lid [0] ['user_id'];
		
		// get current rank
		$qry = $db->prepare ( "SELECT guild_rank FROM user_data WHERE user_name = :name" );
		$qry->bindParam ( ':name', $in [2] );
		$qry->execute ();
		
		$rank = $qry->fetchAll ();
		$rank = $rank [0] ['guild_rank'];
		$rank = abs ( $rank - 5 );
		
		$qry = $db->prepare ( "UPDATE user_data SET guild_rank = :rank 
				WHERE guild_id = (SELECT guilds.guild_id FROM guilds WHERE leader_id = :lid) 
				AND user_name = :name" );
		$qry->bindParam ( ':name', $in [2] );
		$qry->bindParam ( ':lid', $lid );
		$qry->bindParam ( ':rank', $rank );
		if (! $qry->execute ()) {
			// var_dump ( $qry->errorInfo () );
			break;
		}
		
		$ret = array (
				"155" 
		);
		
		break;
	case $ACT_GUILD_SET_MASTER :
		$in = explode ( ';', $action_extra );
		
		// 105Admin;Admin;dyzio1;e5c6b74e2f43122f62df6422f3ea2da6
		
		$qry = $db->prepare ( "SELECT guild_id, guild_rank, user_id FROM user_data 
				WHERE ssid = :ssid OR user_name = :name 
				ORDER BY guild_rank ASC" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':name', $in [2] );
		$qry->execute ();
		
		$db_data = $qry->fetchAll ();
		
		if (count ( $db_data ) != 2) {
			break;
		}
		
		// check if in the same guild
		if ($db_data [0] ['guild_id'] != $db_data [1] ['guild_id']) {
			
			break;
		}
		
		// check if is leader
		if ($db_data [0] ['guild_rank'] != 1) {
			
			break;
		}
		
		$qry = $db->prepare ( "UPDATE user_data SET guild_rank = :rank WHERE user_id = :uid" );
		
		$qry->bindParam ( ':rank', $a = 1 );
		$qry->bindParam ( ':uid', $db_data [1] ['user_id'] );
		$qry->execute ();
		
		$qry->bindParam ( ':rank', $a = 2 );
		$qry->bindParam ( ':uid', $db_data [0] ['user_id'] );
		$qry->execute ();
		
		$ret = array (
				$RESP_GUILD_MASTER_SUCCESS 
		);
		
		$qry = $db -> prepare("UDPATE guilds SET leader_id = :lid WHERE guild_id = :gid");
		$qry -> bindParam(':gid', $db_data[0]['guild_id']);
		$qry -> bindParam(':lid', $db_data[1]['user_id']);
		$qry -> execute();
		
		break;
	case $ACT_GUILD_EXPEL :
		// 104Admin;Administracja;test8;ecc41f36d9827fb628b53aa33360f0e3
		
		$ret = array (
				"156" 
		);
		
		$in = explode ( ';', $action_extra );
		
		$qry = $db->prepare ( "SELECT user_id, user_name, guild_id, guild_rank FROM user_data 
				WHERE ssid = :ssid OR user_name = :name 
				ORDER BY guild_rank ASC" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':name', $in [2] );
		$qry->execute ();
		
		$db_data = $qry->fetchAll ();
		
		// var_dump($db_data);
		// break;
		
		// if not master
		if ($db_data [0] ['guild_rank'] != 1) {
			// if not expelling self
			if ($in [0] != $in [2]) {
				// rank = officer, if target is not member, break
				if ($db_data [1] ['guild_rank'] >= 2) {
					break;
				}
			}
		}
		
		// if not from the same guild, remove invitation
		if (count ( $db_data ) == 2 && $db_data [0] ['guild_id'] != $db_data [1] ['guild_id']) {
		
			// If user hasn't guild
			if ($db_data [0] ['guild_id'] == 0){
				$qry = $db->prepare ( "DELETE FROM guild_invites WHERE guild_id = :gid 
						AND user_id = :uid" );
				$qry->bindParam ( ':gid', $db_data [1] ['guild_id'] );
				$qry->bindParam ( ':uid', $db_data [0] ['user_id'] );
				$qry->execute ();
			} else {
				$qry = $db->prepare ( "DELETE FROM guild_invites WHERE guild_id = :gid 
						AND user_id = :uid" );
				$qry->bindParam ( ':gid', $db_data [0] ['guild_id'] );
				$qry->bindParam ( ':uid', $db_data [1] ['user_id'] );
				$qry->execute ();
			}	
			
		break;
		} else {
			
			$uid = count ( $db_data ) == 1 ? 0 : 1;
			
			
			$qry = $db->prepare ( "UPDATE user_data SET guild_id = 0, guild_rank = 0 
					WHERE user_id = :uid" );
			$qry->bindParam ( ':uid', $db_data [$uid] ['user_id'] );
			$qry->execute ();

		}
		
		// check if leader removed himself
		if ($db_data [0] ['user_name'] == $in [2] && ( int ) $db_data [0] ['guild_rank'] == 1) {
			// delete guild
			$qry = $db->prepare ( "DELETE FROM guilds WHERE guild_id = :gid" );
			$qry->bindParam ( ':gid', $db_data [0] ['guild_id'] );
			$qry->execute ();
		}
		
		break;
	case $ACT_GUILD_JOIN :
		// 110 test3;5;ecc41f36d9827fb628b53aa33360f0e3
		// 110 nick ; guild id ; hashed password
		$in = explode ( ';', $action_extra );
		
		// delete guild invite
		$qry = $db->prepare ( "DELETE FROM guild_invites WHERE 
				user_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid) 
				AND guild_id = :gid" );
		$qry->bindParam ( ':gid', $in [1] );
		$qry->bindParam ( ':ssid', $SSID );
		if (! $qry->execute ()) {
			// var_dump ( $qry->errorInfo () );
		}
		
		if ($qry->rowCount () == 0) {
			$ret [0] = 1;
			break;
		}
		
		// set users guild id
		$qry = $db->prepare ( "UPDATE user_data SET guild_id = :gid, guild_rank = 3 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':gid', $in [1] );
		$qry->bindParam ( ':ssid', $SSID );
		if ($qry->execute () && $qry->rowCount () == 1) {
			$ret = array (
					"158" 
			);
		}
		
		break;
	case $ACT_GUILD_DONATE :
		
	$in = explode ( ';', $action_extra );
		
		$donation = array (
				'silver' => 0,
				'mushroom' => 0 
		);
		
		if ($in [0] == 1)
			$donation ['silver'] = ( int ) $in [1];
		else{
			$donation ['mushroom'] = ( int ) $in [1];
//			$ret = array($ERR_GUILD_MUSH_FREE);
//			break;
		}
			
			// get gold and mush of donor
		$qry = $db->prepare ( "SELECT user_data.silver AS silver, user_data.mushroom AS mushroom,  
				user_data.guild_id, guilds.silver AS gsilver, guilds.mushroom AS gmushroom
				FROM user_data  
				LEFT JOIN guilds ON user_data.guild_id = guilds.guild_id
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$db_data = $qry->fetchAll ();
		$db_data = $db_data [0];
		
		// if not enought gold
		if ($db_data ['silver'] < $donation ['silver']) {
			$ret = array (
					$ERR_TOO_EXPENSIVE 
			);
			break;
		}
		// if not enought silver
		if ($db_data ['mushroom'] < $donation ['mushroom']) {
			$ret = array (
					$ERR_GUILD_LACK_MUSH 
			);
			break;
		}
		
		// transfer gold && mushroom
		$db_data ['silver'] = $db_data ['silver'] - $donation ['silver'];
		$db_data ['mushroom'] = $db_data ['mushroom'] - $donation ['mushroom'];
		$db_data ['gsilver'] = $db_data ['gsilver'] + $donation ['silver'];
		$db_data ['gmushroom'] = $db_data ['gmushroom'] + $donation ['mushroom'];
		
		// update database
		$qry = $db->prepare ( "UPDATE user_data  
				SET silver = :silver, 
				mushroom = :shroom 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':silver', $db_data ['silver'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->execute ();
		
		$qry = $db->prepare ( "UPDATE guilds SET  
				silver = :silver, 
				mushroom = :shroom 
				WHERE guild_id = :gid" );
		$qry->bindParam ( ':gid', $db_data ['guild_id'] );
		$qry->bindParam ( ':silver', $db_data ['gsilver'] );
		$qry->bindParam ( ':shroom', $db_data ['gmushroom'] );
		$qry->execute ();
		
		// var_dump($qry -> errorInfo());
		
		// response
		loadDefaultData ();
		
		$ret [0] = $RESP_GUILD_DONATE_SUCCESS . $ret [0];
		
		break;

	case $ACT_GUILD_JOIN_ATTACK :
		break;
	case $ACT_GUILD_JOIN_DEFENSE :
		break;
	case $ACT_GUILD_COMMENCE_ATTACK :
	
	    //Guild atack (1vs1) BETA 1.0
		//Guild atack (1vs1) BETA 1.0
		//Guild atack (1vs1) BETA 1.0
		//Guild atack (1vs1) BETA 1.0
		
		
		$db_data = loadDefaultData ();
		
		// STRUCTURE
		//$ret [0] = '3215216960/7103/1791/1770/4384/3909/25172784/2473/5947/2464/5763/3930;4655420/0/0/25172784/561540/3/4405539/0/2/25172784/249880/0/4153589/0/2/25172784/251950/0/3787388/936784/3/24236000/366200/0/2288974/1346645/3/22889354/1498414/3/1706694/765428/0/22123926/582280/0/151549/883898/0/21240028/1555145/3/-661731/1047733/0/20192294/813280/0/;' . $db_data ['user_name'] . '/237/0/0/1/-391/0/0/0/0/0/0/0/0/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/57/458/646/1/4/5/328/328/328/0/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37ǭ1/2/3/' . $db_data ['user_name'] . '///-1/////DZ191428/1528/1511/6632/2503/3746/25172784/2473/5947/2464/5763/3930;695733/0/0/20192294/495694/0/25093/1744524/3/18447770/670640/0/-946245/2487723/3/15960047/971338/3/;' . $db_data ['user_name'] . '/237/0/0/2/-392/0/0/0/0/0/0/0/0/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/1009/819/1467/3/1/2/986/0/0/22997039/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37ǭ1/3/' . $db_data ['user_name'] . '////20192294/////Ǵ363968/1528/6323/1508/4584/3565/25172784/2473/5947/2464/5763/3930;4128753/357705/3/15602342/235215/0/4128753/0/2/15602342/0/2/3783833/296818/0/15305524/344920/0/3783833/0/2/15305524/0/2/3783833/0/2/15305524/0/2/3144072/427037/0/14878487/639761/3/2733022/0/2/14878487/411049/0/2733022/0/2/14878487/0/2/2222398/0/2/14878487/510624/0/1531360/609312/0/14269175/691038/0/1531360/0/2/14269175/0/2/232841/0/2/14269175/1298519/3/232841/787640/0/13481535/0/2/232841/864448/0/12617087/0/2/232841/0/2/12617087/0/2/-1730563/1884610/3/10732477/1963404/3/;' . $db_data ['user_name'] . '/237/0/0/3/-393/0/0/0/0/0/0/0/0/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/2056/600/644/2/4/5/588/588/588/0/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37ǭ1/' . $db_data ['user_name'] . '/////15960047/////DZ082424/961/1005/6661/2274/2125/25172784/2473/5947/2464/5763/3930;166101/1403916/3/9328561/916323/3/-632401/995043/0/8333517/798503/0/;' . $db_data ['user_name'] . '/237/1/1/2/2/103/102/2/109/3/2/15/1/0/37/272/0/0/3/-436/0/0/0/0/0/0/0/0/0;1/1009/1046/1410/3/4/5/1064/0/0/18758009/0/1/2003/455/909/0/0/0/0/0/0/0/0;0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0;2;0;0;0;-1;;36;37ǭ1//////10732477/////ǻ0;-1;0;0;0DZ264302793/92087/1397866973/1301994663/841267025/22/0/237/111298869/123996780/96905/933/-1/65338476/0/1338/1324/2/103/102/2/109/3/2/15/1/0/1/257/2/961/804/1950/1791/1700/0/201/4711/483/425/870/709/1848/1697/1602/0/1/0/1023410182/656368/443/0/3/4/2/492/0/0/11048178/0/3/1008/783/0/3/2/1/539/0/0/17891075/0/855638021/66546/532/0/3/4/5/532/0/0/9488487/0/687865860/1967089/437/0/3/2/1/500/0/0/6277787/0/1358954504/655369/0/0/3/1/5/528/0/0/7667088/0/1191182343/66544/622/0/3/2/4/512/0/0/8327251/0/1526726665/655368/0/0/4/1/5/483/0/0/0/0/1694498826/1310746/0/0/3/2/1/544/0/0/8864890/0/184549377/328689/1046/1410/3/4/5/1064/0/0/18758009/0/0/0/0/0/0/0/0/0/0/0/0/0/8/19/0/0/1/5/3/571/0/0/29292628/0/0/1008/532/0/4/3/1/548/0/0/0/0/0/2010/2154/0/1/2/3/295/269/0/0/0/0/15/0/0/11/5/0/72/25/0/1852482/0/0/1/0/0/1/5/3/304/248/0/0/0/0/237/237/237/5/4/1/-90/-93/-80/17/8/2/720/720/960/0/1010/718/0/4/1/5/295/269/0/27657353/0/0/1008/743/0/4/3/2/332/242/0/30570794/0/0/19/0/0/1/5/3/571/0/0/29292628/0/234800/839600/340000/28276200/10709600/34308500/2359298/1397782503/5/1008/579/0/3/1/5/552/0/0/40004185/0/3/1009/676/0/4/5/3/283/283/0/52922554/10/5/1009/411/0/5/4/2/289/267/0/55685219/10/5/1008/827/0/1/2/4/316/260/0/41133282/1/1/1008/809/1739/2/5/4/1120/0/0/99431632/0/1/1009/1160/1378/1/3/5/634/458/0/158498908/10/1397782757/8/7/0/0/1/3/2/342/224/0/21909165/10/12/16/0/0/11/12/0/168/25/0/3087470/15/9/5/0/0/5/4/2/557/0/0/39474100/0/8/5/0/0/1/4/2/340/224/0/10585665/1/9/14/0/0/1/5/3/350/218/0/12332167/1/8/12/0/0/4/3/5/552/0/0/37778355/0/37/0/829/3/272/10968/921711/1357235982/12/10/1391589443/0/0/1/2817/1046/1410/0/1398880351/3/0/0/1397866956/6000/0/100/1397870573/1397859709/146/146/1/1356631675/237/100/5192/9239/8082/1000000000/102529/2/1362/83/0/0/4/1397866973/5/12/12/12/12/12/12/12/12/12/12/120/16/485/15/12/0/1398042462/1398040963/0/25/25/0/0/304900910/304900910/304900910/1/1368876356/0/1596/1397866973';
		//break;
		
		// check time restrictions
		$time = new DateTime ();
		$time = $time->getTimestamp ();
		if ($time < $db_data ['dungeon_time']) {
			if ($db_data ['mushroom'] <= 0) {
				// TODO throw error
				break;
			}
			$db_data ['mushroom'] = $db_data ['mushroom'] - 15;  // 15 grzybĂłw za walke
			$time = $db_data ['dungeon_time'];
		} else {
			$time = $time + 3600; // niedziała/not working 75%
		}
		
		
		$stage = $db_data['guild_level'];
		
		$OP = getGuildMonster ( $stage, $db_data ); //P.S GUILDMONSTER - TABELA Z POTWORAMI !!! //working 20% not 100% efect !
		$p = new Char ( $db_data );
		
		// response
		$t_ret = array ();
		
		// Staty gracza
		array_push ( $t_ret, "122" . $p->getHP (), $p->getStr (), $p->getDex (), $p->getInt (), $p->getWit (), $p->getLuck () );
		
		// Staty przeciwnika
		array_push ( $t_ret, $OP->getHP (), $OP->getStr (), $OP->getDex (), $OP->getInt (), $OP->getWit (), $OP->getLuck () . ";" ); // . $p->getHp () );
		                                                                                                                             
		// walka/sumulacja
		$sim = SF_Calc::calculateWin ( $p, $OP );
		
		$win = $sim [count ( $sim ) - 1] [0] <= 0 ? true : false;
	
		// Gdy wgramy .... 

             if ($win) {
            // increment stage lvl
             $stage ++;

            // Bonus Gildijny
			//Not working  ;/ Update v2.0  
			$ebonus = 1;
	        $gbonus = 1;
	        $ebonus = 1 + (($db_data ['instructor'] + $db_data ['guild_level']) / 50);
	        $gbonus = 1 + (($db_data ['treasure'] + $db_data ['guild_level']) / 50);
		
			// Dodanie expa i golda : ...
			$db_data ['exp'] = ( int ) $db_data ['exp'] + $OP->getExp ();
			$db_data ['silver'] = ( int ) $db_data ['silver'] + $OP->getGold ();
			
			
			// Dodanie itemkĂłw
			
			$itemRand = rand(99,100);  //szansa na item        NOT WORKING !
			
			$lvl = $db_data ['lvl'];
			$class = $db_data ['class'];
			$epicRand = 1; //epic item - not working 100%
			$shop = rand(0, 1);

			$item = genItem ($lvl, $class, $shop, 'dungeon');
	

			$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 10 AND owner_id = " . $db_data['user_id'] );  
			$qry->execute ();
			if ($qry->rowCount () < 1) {
				$item ['slot'] = 10;
			} else {
				$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 11 AND owner_id = " . $db_data['user_id'] );  
				$qry->execute ();
				if ($qry->rowCount () < 1) {
					$item ['slot'] = 11;
				} else {
					$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 12 AND owner_id = " . $db_data['user_id'] );  
					$qry->execute ();
					if ($qry->rowCount () < 1) {
						$item ['slot'] = 12;
					} else {
						$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 13 AND owner_id = " . $db_data['user_id']);  
						$qry->execute ();
						if ($qry->rowCount () < 1) {
							$item ['slot'] = 13;
						} else {
							$qry = $db->prepare ( "SELECT slot FROM items WHERE slot = 14 AND owner_id = " . $db_data['user_id'] );  
							$qry->execute ();
							if ($qry->rowCount () < 1) {
								$item ['slot'] = 14;
							} else {
								$ret = array (
									$ERR_INVENTORY_FULL
								);
								break;
							}
						}
					}
				}
			}

			
			$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
				VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
				' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
				' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item ['slot'] . ',' . $db_data['user_id'] . ')' );   
			$qry->execute ();
			
			
			// lvl up --- >>>
			while ( $db_data ['exp'] > $LEVELS [$db_data ['lvl']] ) {
				$db_data ['exp'] -= $LEVELS [$db_data ['lvl']];
				$db_data ['lvl'] = ( int ) $db_data ['lvl'] + 1;
			}
		}
		
		
		// UPDATE DATBASE GRACZA !!!!!!!!!!!!
		$qry_str = "UPDATE user_data SET 
				exp = :exp, 
				lvl = :lvl, 
				silver = :silver, 
				mushroom = :shroom, 
				dungeon_time = :time,
				guild_level = :guild_level ";
		$qry_str .= " WHERE ssid = :ssid";
		$qry = $db->prepare ( $qry_str );
		$qry->bindParam ( ':exp', $db_data ['exp'] );
		$qry->bindParam ( ':lvl', $db_data ['lvl'] );
		$qry->bindParam ( ':silver', $db_data ['silver'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':time', $time );
		$qry->bindParam ( ':guild_level', $stage );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
	
	    $t_ret [count ( $t_ret ) - 1] .= $sim [0] [0];
		
		
				// UPDATE DATBASE gildi !!!!!!!!!!!!
		$qry_str = "UPDATE guilds SET 
				guild_id = :guild_id, 
				instructor = :instructor,
				gid = :guild_id, 
				treasure = :treasure ";				
		$qry = $db->prepare ( $qry_str );
		$qry->bindParam ( ':guild_id', $db_data ['guild_id'] );
		$qry->bindParam ( ':instructor', $db_data ['instructor'] );
		$qry->bindParam ( ':treasure', $db_data ['treasure'] );
		$qry->bindParam ( ':gid', $db_data ['guild_id'] );
		$qry->execute ();
		
		
				$qry = $db->prepare ( "UPDATE guilds SET 
				instructor = :instructor, 
				treasure = :treasure,
				gid = :guild_id, 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':guild_id', $db_data ['guild_id'] );
		$qry->bindParam ( ':instructor', $a = 2 + $db_data ['instructor'] );
		$qry->bindParam ( ':treasure', $a = 2 + $db_data ['treasure'] );
		$qry->bindParam ( ':gid', $db_data ['guild_id'] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		// var_dump($qry -> errorInfo());
		
		
		
		// ---logs----
		// first 3, one in previous index, separated by semicolon
		array_push ( $t_ret, $sim [0] [1], $sim [0] [2] );
		
		for($i = 1; $i < count ( $sim ); $i ++) {
			array_push ( $t_ret, $sim [$i] [0], $sim [$i] [1], $sim [$i] [2] );
			 //echo $sim [$i][0]."/".$sim [$i][1]."/".$sim [$i][2]."/";
		}
		
		// looks
		array_push ( $t_ret, ";" . $db_data ['user_name'], $p->getLvl (), $db_data ['race'], $db_data ['gender'], $db_data ['class'] );
		// faces
		for($i = 1; $i <= 9; $i ++) {
			$t_ret [] = $db_data ['face' . $i];
		}
		
		// mob looks, lvl, weapon
		array_push ( $t_ret, "0", "0", $OP->getLvl (), "0", "0", "1", "-" . $OP->getId (), "0", "0", "0", "0", "0", "0", "0", "0", "0;" . $p->hasWeapon () );
		
		// weapon info - player
		$weap = $p->getWeapon ();
		array_push ( $t_ret, $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] );
		
		// weapon info - mob
		$weap = $OP->getWeapon ();
		array_push ( $t_ret, $OP->hasWeapon (), $weap ['item_id'], $weap ['dmg_min'], $weap ['dmg_max'], $weap ['atr_type_1'], $weap ['atr_type_2'], $weap ['atr_type_3'], $weap ['atr_val_1'], $weap ['atr_val_2'], $weap ['atr_val_3'], $weap ['gold'], $weap ['mush'] . ";" . $p->hasShield () );
		
		// shields
		$sh = $p->getShield ();
		array_push ( $t_ret, $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'], $sh ['mush'] );
		$sh = $OP->getShield ();
		array_push ( $ret, $OP->hasShield (), $sh ['item_id'], $sh ['dmg_min'], $sh ['dmg_max'], $sh ['atr_type_1'], $sh ['atr_type_2'], $sh ['atr_type_3'], $sh ['atr_val_1'], $sh ['atr_val_2'], $sh ['atr_val_3'], $sh ['gold'] );
		// ?;?;?;exp;silver;win?
		$t_ret [] = $sh ['mush'] . ";3;0;" . $OP->getExp () . ";" . $OP->getGold () . ";-1;";
		
		// rest is default data
		$t_ret [count ( $t_ret ) - 1] .= $ret [0];
		
		// set dungeon time left
		$ret [$SF_DUNGEON_ENDTIME] = $time;
		
		for($i = 1; $i < count ( $ret ); $i ++) {
			$t_ret [] = $ret [$i];
		}
		
		exit ( join ( "/", $t_ret ) );
	
		break;
		
	// exit/koniec
	
	case $ACT_GUILD_IMPROVE :
		// nick ; gildia ; pass (md5) ; building
		$in = explode ( ';', $action_extra );
		$keys = array (
				'fortress',
				'treasure',
				'instructor' 
		);
		$in [3] = $keys [$in [3] - 1];
		
		$qry = $db->prepare ( "SELECT user_data.guild_rank, guilds.fortress, guilds.treasure, guilds.instructor, guilds.guild_id, guilds.mushroom, guilds.silver   
				FROM user_data 
				LEFT JOIN guilds ON user_data.guild_id = guilds.guild_id 
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		$db_data = $qry->fetchAll ();
		$db_data = $db_data [0];
		
		if ($db_data ['guild_id'] == "" || $db_data ['guild_id'] == 0) {
			// throws error
			breaK;
		}
		
		// if is already 50
		if ($db_data [$in [3]] >= 50)
			break;
		
		$cost = getGuildBuildingCost ( $db_data [$in [3]] );
		
		// if not enought gold/shroom
		if ($cost ['mushroom'] > $db_data ['mushroom']) {
			$ret = array (
					$ERR_GUILD_LACK_MUSH 
			);
			breaK;
		}
		if ($cost ['silver'] > $db_data ['silver']) {
			$ret = array (
					$ERR_GUILD_LACK_GOLD 
			);
			break;
		}
		
		// update
		$db_data ['mushroom'] = $db_data ['mushroom'] - $cost ['mushroom'];
		$db_data ['silver'] -= $cost ['silver'];
		$db_data [$in [3]] ++;
		
		$qry = $db->prepare ( "UPDATE guilds SET " . $in [3] . " = :nlvl,  
				silver = :silver,
				mushroom = :shroom
				WHERE guild_id = :gid" );
		$qry->bindParam ( ':nlvl', $db_data [$in [3]] );
		$qry->bindParam ( ':gid', $db_data ['guild_id'] );
		$qry->bindParam ( ':silver', $db_data ['silver'] );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->execute ();
		
		// response
		$ret = array (
				$RESP_GUILD_IMPROVE_SUCCESS 
		);
		
		break;
	case $ACT_SETTINGS :
		$ret = array (
				$ACT_SETTINGS 
		);
		break;
		
	case $ACT_KILL_POTION :
	
		$in = explode ( ';', $action_extra );
		
		$qry = $db->prepare ( "UPDATE user_data SET
				potion_id" . $in[0] . " = 0,
				potion_value" . $in[0] . " = 0,
				potion_time" . $in[0] . " = 0
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID);
		$qry->execute ();
		
		$db_data = loadDefaultData ();
		
		$ret [0] = $ACT_HERO . $ret [0];
		
		// user desc
	
		$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
		

		break;
		
	case $ACT_BUY_LUXURY :
		$db_data = loadDefaultData ();
		
		if ($db_data ['golden_frame'] == 32){
		break;
		}
		
		$db_data ['mushroom'] = $db_data ['mushroom'] - 1000;
		$db_data ['golden_frame'] = 32;
		
		$qry = $db->prepare ( "UPDATE user_data SET
				golden_frame = :golden_frame,
				mushroom = :shroom				
				WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':shroom', $db_data ['mushroom'] );
		$qry->bindParam ( ':golden_frame', $db_data ['golden_frame'] );
		$qry->execute ();
		
		$db_data = loadDefaultData ();
		
		$ret [0] = $ACT_HERO . $ret [0];
		
		// user desc
	
		$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";

		break;
	
	case $RESP_TOILET_DROPPED :
		
		break;
	
	case $ACT_REROLL_ITEMS :
		$in = abs ( ( int ) $action_extra - 2 );
		
		// $qry = $db -> prepare("SELECT user_id, mushrooms FROM user_data WHERE ssid = :ssid");
		// $qry -> bindParam(':ssid', $SSID);
		// $qry -> execute();
		// $user = $qry -> fetchAll();
		// $user = $user[0];
		
		$db_data = loadDefaultData ();
		
		if ($db_data ['mushroom'] <= 0) {
			// throw error
			break;
		}
		
		$ret [$SF_MUSH] = ( int ) $ret [$SF_MUSH] - 1;
		
		$qry = $db->prepare ( "UPDATE user_data SET mushroom = mushroom - 1 WHERE user_id = :uid" );
		$qry->bindParam ( ':uid', $db_data ['user_id'] );
		$qry->execute ();
		
		// gen items
		$items = rerollOneShop ( $in, $db_data );
		
		// display items
		$i = $in == 0 ? 288 : 361;
		foreach ( $items as $item ) {
			$ret [$i] = $item ['item_type'];
			$ret [$i + 1] = $item ['item_id'];
			$ret [$i + 2] = $item ['dmg_min'];
			$ret [$i + 3] = $item ['dmg_max'];
			$ret [$i + 4] = $item ['atr_type_1'];
			$ret [$i + 5] = $item ['atr_type_2'];
			$ret [$i + 6] = $item ['atr_type_3'];
			$ret [$i + 7] = $item ['atr_val_1'];
			$ret [$i + 8] = $item ['atr_val_2'];
			$ret [$i + 9] = $item ['atr_val_3'];
			$ret [$i + 10] = $item ['gold'];
			$ret [$i + 11] = $item ['mush'];
			$i += 12;
		}
		
		// response
		$a = 13 + $in;
		$ret [0] = "0" . $a . $ret [0];
		
		$ret [] = ";" . event (); // if there's some event
		
		break;

	case $ACT_USE_ITEM :
		
		$in = explode ( ';', $action_extra );
		

		// BUY ITEM
		if ($in [0] == 3 || $in [0] == 4) {
		

			
			// set shop slot
			$in [1] = ( int ) $in [1] - 1;
			
			
			// get item
			$table = $in [0] == 3 ? "items_shakes" : "items_fidget";
			$qry = $db->prepare ( "SELECT * FROM $table 
					WHERE owner_id = (SELECT user_id FROM user_data WHERE ssid = :ssid) 
					AND slot = :slot" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->bindParam ( ':slot', $in [1] );
			$qry->execute ();
			$item = $qry->fetchAll ();
			$item = $item [0];
			
			// set target slot
			if (( int ) $in [2] == 1) {
				$in [3] = getSlotIndex ( $item ['item_type'] );
			} else {
				$in [3] = ( int ) $in [3] + 9;
			}
			
			// set slot for insert
			$item ['slot'] = $in [3];
			
			// check if any items at cur slot
			$qry = $db->prepare ( "SELECT id, slot FROM items WHERE slot = :slot AND owner_id = :oid" );
			$qry->bindParam ( ':slot', $in [3] );
			$qry->bindParam ( ':oid', $item ['owner_id'] );
			$qry->execute ();
			
			if ($qry->rowCount () > 0) {
				$db_data = loadDefaultData ();
				enterShop ( $a = $in [0] - 3, $db_data );
				$ret [0] = "102" . $ret [0];
				break;
			}
			
			$qry = $db->prepare ( "SELECT silver, mushroom FROM user_data WHERE user_id = :uid" );
			$qry->bindParam ( ':uid', $item ['owner_id'] );
			$qry->execute ();
			$user = $qry->fetchAll ();
			$user = $user [0];
			
			if ($user ['silver'] < $item ['gold']) {
				$ret = array (
						$ERR_TOO_EXPENSIVE 
				);
				break;
			}
			if ($user ['mushroom'] < $item ['mush']) {
				$ret = array (
						$ERR_NO_MUSH_MQ 
				);
				break;
			}
			
			$user ['silver'] = $user ['silver'] - $item ['gold'];
			$user ['mushroom'] = $user ['mushroom'] - $item ['mush'];
			
			// update db
			$qry = $db->prepare ( "UPDATE user_data SET silver = :silver, mushroom = :shroom 
					WHERE user_id = :uid" );
			$qry->bindParam ( ':silver', $user ['silver'] );
			$qry->bindParam ( ':shroom', $user ['mushroom'] );
			$qry->bindParam ( ':uid', $item ['owner_id'] );
			$qry->execute ();
			
			// lower resell value
			$item ['gold'] = round ( ( int ) $item ['gold'] * '0.3' );
			$item ['mush'] = 0;
			
			$qry = $db->prepare ( 'INSERT INTO items(item_type, item_id, dmg_min, dmg_max, atr_type_1, atr_type_2, atr_type_3, atr_val_1, atr_val_2, atr_val_3, gold, mush, slot, owner_id) 
					VALUES(' . $item ['item_type'] . ',' . $item ['item_id'] . ',' . $item ['dmg_min'] . ',' . $item ['dmg_max'] . ',
					' . $item ['atr_type_1'] . ',' . $item ['atr_type_2'] . ',' . $item ['atr_type_3'] . ',' . $item ['atr_val_1'] . ',' . $item ['atr_val_2'] . ',
					' . $item ['atr_val_3'] . ',' . $item ['gold'] . ',' . $item ['mush'] . ',' . $item ['slot'] . ',' . $item ['owner_id'] . ')' );
			$qry->execute ();
			
			// response
			$db_data = loadDefaultData ();
			
			// GEN NEW ITEM
			genNewItem ( $db_data ['lvl'], $db_data ['class'], $a = $in [0] - 3, $in [1], $item ['id'] );
			
			enterShop ( $a = $in [0] - 3, $db_data );
			// enterShop ( 1, $db_data );
			
			$ret [0] = "102" . $ret [0];
			
			break;
		}
		
		
		// set current slot
		if (( int ) $in [0] == 1) {
			$in [1] = ( int ) $in [1] - 1;
		} else if (( int ) $in [0] == 2) {
			$in [1] = ( int ) $in [1] + 9;
			
		}
		
		// get selected item
		$qry = $db->prepare ( "SELECT * FROM items WHERE slot = :slot AND
				owner_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)" );
		$qry->bindParam ( ':slot', $in [1] );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$item = $qry->fetchAll ();
		$item = $item [0];
		
		$qry = $db->prepare ( "SELECT class FROM user_data WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->execute ();
		
		$user = $qry->fetchAll ();
		$user = $user [0];
		

		if ($item ['item_type'] < 8 and ($item ['item_id'] < $user ['class'] * 1000 - 1000 or $item ['item_id'] > $user ['class'] * 1000)){
			if ($in [2] == 1){
					// You can't wear this item.. another class.
					// resp
					$db_data = loadDefaultData ();
					enterShop ( 0, $db_data );
					enterShop ( 1, $db_data );
					
					// ret
					$ret [0] = "102" . $ret [0];
					break;
				}
		}
		
		// set target slot
		if (( int ) $in [2] == 1) {
			$in [3] = getSlotIndex ( $item ['item_type'] );
			
			// keys
			if ($item ['item_type'] == 11){
			
				switch ($item ['item_id']){
				
				
					// dungeon keys
					case 1 :
					case 2 :
					case 3 :
					case 4 :
					case 5 :
					case 6 :
					case 7 :
					case 8 :
					case 9 :
					
					$qry = $db->prepare ( "UPDATE user_data SET dungeon_" . $item ['item_id'] . " = 1 WHERE ssid = :ssid" );
					$qry->bindParam ( ':ssid', $SSID );
					$qry->execute ();
					
					$qry = $db->prepare ( "DELETE FROM items WHERE id = :iid" );
					$qry->bindParam ( ':iid', $item ['id'] );
					$qry->execute ();
					
					// load dungeon data
					
					$db_data = loadDefaultData ();
		
					for ($i = 1; $i < 10; $i ++){
						if ($db_data['dungeon_' . $i] == 1){
							$db_data['dungeon_' . $i] = 2;
			
							$qry = $db->prepare ( "UPDATE user_data SET dungeon_" . $i . " = 2 WHERE ssid = :ssid" );
							$qry->bindParam ( ':ssid', $SSID );
							$qry->execute ();
						}
					}
		
					$ret [0] = $ACT_ENTER_DUNGEON . $ret [0];
		
					// monster IDs
					$monsters = array ();
					for($i = 1; $i <= 13; $i ++) {
						$monsters [] = getDungMonster ( $i, $db_data ['dungeon_' . $i] );
					}
		
					$ret [count ( $ret )] = ";" . $monsters [0]->getId ();
		
					for($i = 1; $i < 13; $i ++) {
						$ret [] = $monsters [$i]->getId ();
					}
						break;
					
					
					// dungeon 10's key. This has been removed from the main game.
					case 10 :
					
						break;


					// toilet key
					case 20 :
					$qry = $db->prepare ( "UPDATE user_data SET toilet = 1 WHERE ssid = :ssid" );
					$qry->bindParam ( ':ssid', $SSID );
					$qry->execute ();
					
					$qry = $db->prepare ( "DELETE FROM items WHERE id = :iid" );
					$qry->bindParam ( ':iid', $item ['id'] );
					$qry->execute ();
					
					$db_data = loadDefaultData ();
					$ret [0] =  $RESP_TOILET_UNLOCKED . $ret [0];
					$ret [] = (";" . $db_data['toilet_full'] . ";" . $db_data['aura'] . ";" . $db_data['fill_level'] . ";" . $db_data['fill_level_next']);
						break;
					
					
					// magic mirror key? what?
					case 21 :
					
						break;
					
					
					// eggs ?? what's that?
					case 22 :
					case 23 :
					case 23 :
					
						break;
						
						
					// magic mirrors
					case 30 :
					case 31 :
					case 32 :
					case 33 :
					case 34 :
					case 35 :
					case 36 :
					case 37 :
					case 38 :
					case 39 :
					case 40 :
					case 41 :
					case 42 :
					
					$qry = $db->prepare ( "DELETE FROM items WHERE id = :iid" );
					$qry->bindParam ( ':iid', $item ['id'] );
					$qry->execute ();
					
					$db_data = loadDefaultData ();
					
					$mms = $db_data ['magic_mirror_shard'] + 1;
					
					$qry = $db->prepare ( "UPDATE user_data SET magic_mirror_shard = :mms WHERE ssid = :ssid" );
					$qry->bindParam ( ':mms',  $mms );
					$qry->bindParam ( ':ssid', $SSID );
					$qry->execute ();
					
					if ($db_data ['magic_mirror_shard'] == 42){
						$qry = $db->prepare ( "UPDATE user_data SET magic_mirror = 1 WHERE ssid = :ssid" );
						$qry->bindParam ( ':ssid', $SSID );
						$qry->execute ();
						$ret [0] =  $RESP_SAVEGAME_MIRROR . $ret [0];
					} else {
						$ret [0] =  $RESP_SAVEGAME_SHARD . $ret [0];
					}
					
						break;
				}		
				break;		
			}
			
			// potions
			if ($item ['item_type'] == 12){
			
				$qry = $db->prepare ( "SELECT potion_id1, potion_id2, potion_id3, potion_time1, potion_time2, potion_time3 FROM user_data WHERE user_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)" );
				$qry->bindParam ( ':ssid', $SSID );
				$qry->execute ();
				$user = $qry->fetchAll ();
				$user = $user [0];
			
			
				for ($i = 1; $i <= 3; $i ++){
					if (($item ['item_id'] == $user ['potion_id' . $i]) or ($item ['item_id'] == $user ['potion_id' . $i] + 5) or ($item ['item_id'] == $user ['potion_id' . $i] + 10) or ($item ['item_id'] == $user ['potion_id' . $i] + 15)) {
								$potionSlot = $i; // the potion is same size, or bigger than user's, it's ok
					}
					if ((($item ['item_id'] == $user ['potion_id' . $i] - 5) or ($item ['item_id'] == $user ['potion_id' . $i] - 10) or ($item ['item_id'] == $user ['potion_id' . $i] - 15)) and $user ['potion_id' . $i] != 16) {
								$potionSlot = -1; // the potion is smaller than user's, it's not ok
					}
				}
				
				if ($item ['item_id'] == 16){ // if life potion
					$potionSlot = NULL;
					for ($i = 1; $i <= 3; $i ++){
						if ($item ['item_id'] == $user ['potion_id' . $i]) {
									$potionSlot = $i; // if user use already a life potion
						}
					}
				}
			
				if ($potionSlot == NULL){ // if there isn't already a same potion
					if ($user ['potion_id1'] == 0){
						$potionSlot = 1;
					} elseif ($user ['potion_id2'] == 0) {
						$potionSlot = 2;
					} elseif ($user ['potion_id3'] == 0) {
						$potionSlot = 3;
					} else { // user use already 3 potions
						$db_data = loadDefaultData ();
						$ret [0] = $ACT_HERO . $ret [0];
						// user desc
						$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
					break;
					}	
				}
				
				if ($potionSlot == -1){ // if potion smaller than your
					$db_data = loadDefaultData ();
					$ret [0] = $ACT_HERO . $ret [0];
					// user desc
					$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
				break;
				}
				
			
				$time = new DateTime ();
				$time = $time->getTimestamp ();
			
				if ($user ['potion_time' . $potionSlot] == 0){
					$potionTime = $time + 86400 * 3;
				} else {
					$potionTime = $user ['potion_time' . $potionSlot] + 86400 * 3;
				}
			
				$qry = $db->prepare ( "UPDATE user_data SET potion_id" . $potionSlot . " = " . $item ['item_id'] . ", potion_value" . $potionSlot . " = ". $item ['atr_val_1'] . ", potion_time" . $potionSlot . " = " . $potionTime . " WHERE ssid = :ssid" );
				$qry->bindParam ( ':ssid', $SSID );
				$qry->execute ();
					
				$qry = $db->prepare ( "DELETE FROM items WHERE id = :iid" );
				$qry->bindParam ( ':iid', $item ['id'] );
				$qry->execute ();
					
				$db_data = loadDefaultData ();
				$ret [0] = $ACT_HERO . $ret [0];
		
				// user desc
	
				$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
		
			break;
			}
			
		} else if (( int ) $in [2] == 2) {
			$in [3] = ( int ) $in [3] + 9;
		} else {
		// SELL ITEM
		
		
			$qry = $db->prepare ( "SELECT user_id, toilet_full, fill_level, fill_level_next, aura FROM user_data WHERE user_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)" );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->execute ();
			$user = $qry->fetchAll ();
			$user = $user [0];
		
			if ($in[2] == 10){ // if user drop item into the toilet
		
				if ($user ['toilet_full'] == 1){
				
				$db_data = loadDefaultData ();
	
				$ret [0] =  $RESP_TOILET_FULL . $ret [0];
		
				$ret [] = (";" . $user['toilet_full'] . ";" . $user['aura'] . ";" . $user['fill_level'] . ";" . $user['fill_level_next']);
				
				break;
	
				}
				
				if ($user ['fill_level'] == $user ['fill_level_next']){
				
				$db_data = loadDefaultData ();
				
				$ret [0] =  $RESP_TOILET_TANKFULL . $ret [0];
		
				$ret [] = (";" . $user['toilet_full'] . ";" . $user['aura'] . ";" . $user['fill_level'] . ";" . $user['fill_level_next']);
				
				break;
				}
				
				$slot = $in [1];
				// var_dump($slot);
			
				// get item
				$qry = $db->prepare ( "SELECT id, item_id, owner_id FROM items WHERE slot = :slot 
					AND owner_id = " . $user ['user_id']);
				$qry->bindParam ( ':slot', $slot );
				if (! $qry->execute ()) {
					var_dump ( $qry->errorInfo () );
				}
				$item = $qry->fetchAll ();
				// var_dump($item);
				$item = $item [0];
				
				if (($item ['item_id'] < 61 and $item ['item_id'] > 49) or ($item ['item_id'] < 1061 and $item ['item_id'] > 1049) or ($item ['item_id'] < 2061 and $item ['item_id'] > 2049)){
				$itemValue = 50;
				} else {
				$itemValue = 25;
				}
				
				$user ['toilet_full'] = 1;
				$user ['fill_level'] = $user ['fill_level'] + $itemValue;
				
				if ($user ['fill_level'] > $user ['fill_level_next']){
				$user ['fill_level'] = $user ['fill_level_next'];
				}
				
	
				$qry = $db->prepare ( "UPDATE user_data SET 
								toilet_full = :toilet_full, 
								fill_level = :fill_level
								WHERE ssid = :ssid" );
				$qry->bindParam ( ':ssid', $SSID );
				$qry->bindParam ( ':toilet_full', $user ['toilet_full'] );
				$qry->bindParam ( ':fill_level', $user ['fill_level'] );
				$qry->execute ();
				
				
				
			
				// delete item
				$qry = $db->prepare ( "DELETE FROM items WHERE id = :iid" );
				$qry->bindParam ( ':iid', $item ['id'] );
				$qry->execute ();
				
				$db_data = loadDefaultData ();
				
				$ret [0] =  $RESP_TOILET_DROPPED . $ret [0];
		
				$ret [] = (";" . $db_data['toilet_full'] . ";" . $db_data['aura'] . ";" . $db_data['fill_level'] . ";" . $db_data['fill_level_next']);
				
				break;
			}
			
			// slot
			$slot = $in [1];
			// var_dump($slot);
			
			// get item
			$qry = $db->prepare ( "SELECT id, gold, mush, owner_id FROM items WHERE slot = :slot 
					AND owner_id = (SELECT user_id FROM user_data WHERE ssid = :ssid)" );
			$qry->bindParam ( ':slot', $slot );
			$qry->bindParam ( ':ssid', $SSID );
			if (! $qry->execute ()) {
				var_dump ( $qry->errorInfo () );
			}
			$item = $qry->fetchAll ();
			// var_dump($item);
			$item = $item [0];
			
			// update user gold and mush
			$qry = $db->prepare ( "UPDATE user_data SET silver = silver + :silver, mushroom = mushroom + :shroom 
					WHERE user_id = :uid" );
			$qry->bindParam ( ':uid', $item ['owner_id'] );
			$qry->bindParam ( ':silver', $item ['gold'] );
			$qry->bindParam ( ':shroom', $item ['mush'] );
			$qry->execute ();
			
			// delete item
			$qry = $db->prepare ( "DELETE FROM items WHERE id = :iid" );
			$qry->bindParam ( ':iid', $item ['id'] );
			$qry->execute ();
			
			// response
			$db_data = loadDefaultData ();
			
			enterShop ( 0, $db_data );
			enterShop ( 1, $db_data );
			$ret [0] = "102" . $ret [0];
			
			break;
		}
		
		// update database
		// move the item in target place
		$qry = $db->prepare ( "UPDATE items SET slot = :slot 
				WHERE owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)  
				AND slot = :curslot" );
		$qry->bindParam ( ':slot', $in [1] );
		$qry->bindParam ( ':curslot', $in [3] );
		$qry->bindParam ( ':ssid', $SSID );
		if (! $qry->execute ()) {
			var_dump ( $qry->errorInfo () );
		}
		
		// move target item
		$qry = $db->prepare ( "UPDATE items SET slot = :tarslot 
				WHERE id = :itemid" );
		$qry->bindParam ( ':tarslot', $in [3] );
		$qry->bindParam ( ':itemid', $item ['id'], PDO::PARAM_INT );
		if (! $qry->execute ()) {
			var_dump ( $qry->errorInfo () );
		}
		
		// resp
		$db_data = loadDefaultData ();
		enterShop ( 0, $db_data );
		enterShop ( 1, $db_data );
		
		// ret
		$ret [0] = "102" . $ret [0];
		

		
		break;
	case $ACT_VIEW_GUILD :
		// loadGuildData($g_data, $m_data, $im_data)
		
		$in = explode ( ';', $action_extra );
		
		$qry = $db->prepare ( 'SELECT * FROM guilds WHERE name = :name' );
		$qry->bindParam ( ':name', $in [0] );
		$qry->execute ();
		// var_dump($in);
		$g_data = $qry->fetchAll ();
		$g_data = $g_data [0];
		
		// get guild members
		$qry = $db->prepare ( "SELECT * FROM user_data
				WHERE guild_id = :gid
				ORDER BY guild_rank ASC, lvl DESC" );
		$qry->bindParam ( ':gid', $g_data ['guild_id'] );
		$qry->execute ();
		$m_data = $qry->fetchAll ();
		
		// get invited players
		$qry = $db->prepare ( "SELECT user_data.*, guild_invites.guild_id FROM user_data
				INNER JOIN guild_invites
				ON user_data.user_id = guild_invites.user_id
				WHERE guild_invites.guild_id = :gid
				ORDER BY user_data.lvl DESC" );
		$qry->bindParam ( ':gid', $g_data ['guild_id'] );
		$qry->execute ();
		
		$im_data = $qry->fetchAll ();
		
		loadGuildData ( $g_data, $m_data, $im_data, false );
		
		// $ret [count ( $ret ) - 1] .= ";Admin;99999;1";
		
		break;
		
	case $ACT_FORGOT_PASSWORD :
		$in = explode ( ';', $action_extra );
		
		//	$in[0] = name
		// $in[1] = email
		
		break;
	
	case $ACT_CHANGE_PASS :
		$db_data = loadDefaultData ();
		$in = explode ( ';', $action_extra );
		//$in[0] = name
		//$in[1] = pass
		//$in[2] = new pass
		//$in[3] = new pass again
		
		$pass = $in[1];
		$newpass = $in[2];
		$confirmnewpass = $in[3];
		
		if (md5($pass) != $db_data ['password']) {
			$ret = array (
					$ERR_WRONG_PASSWORD
			);
			break;
		}
		
		
		if ($newpass != $confirmnewpass){
		break;
		}
		
			$ret = array (
					$RESP_CHANGE_PASS_OK 
			);
			
			
			$qry = $db->prepare ( "UPDATE user_data SET password = :newpass WHERE user_id = :id AND ssid = :ssid" );
			$qry->bindParam ( ':newpass', md5($newpass) );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->bindParam ( ':id', $db_data ['user_id'] );
			$qry->execute ();
		break;
		
	case $ACT_CHANGE_MAIL :
	
		$db_data = loadDefaultData ();
		$in = explode ( ';', $action_extra );
		//$in[0] = name
		//$in[1] = pass
		//$in[2] = old email
		//$in[3] = new email
		
		$pass = $in[1];
		$oldmail = strtolower($in[2]);
		$newmail = urlencode(strtolower($in[3]));
		
		if (md5($pass) != $db_data ['password']) {
			$ret = array (
					$ERR_WRONG_PASSWORD
			);
			break;
		}
		
		
		if ($oldmail != $db_data ['email']){
		$ret = array (
					$ERR_EMAIL_WRONG
		);
		break;
		}
		
			$ret = array (
					$RESP_CHANGE_MAIL_OK
			);
			
			
			$qry = $db->prepare ( "UPDATE user_data SET email = :newmail WHERE user_id = :id AND ssid = :ssid" );
			$qry->bindParam ( ':newmail', $newmail );
			$qry->bindParam ( ':ssid', $SSID );
			$qry->bindParam ( ':id', $db_data ['user_id'] );
			$qry->execute ();
	
		break;
		
	case $ACT_DELETE_ACCOUNT :
		$ret = array (
				"E999"
		);
		break;
		
	case $ACT_CHANGE_FACE :
		$npe = explode ( ";", $action_extra );


		

		
		// character looks
		$looks = explode ( "/", $npe [4] );
		$looks [1] = substr_replace ( $looks [1], "0", 1, 1 );
		$looks [2] = substr_replace ( $looks [2], "0", 1, 1 );
		$looks [4] = substr_replace ( $looks [4], "0", 1, 1 );
		// var_dump($looks);
		// break;
		
		
		// race
		$race = $npe [2];
		
		// gender
		$gender = $npe [3];
		
		// edit user look
		$qry = $db->prepare ( "UPDATE user_data SET face1 = :face1, face2 = :face2, face3 = :face3, face4 = :face4, face5 = :face5, face6 = :face6, face7 = :face7, face8 = :face8, face9 = :face9, face10 = :face10,
		race = :race, gender = :gender
		WHERE ssid = :ssid" );
		$qry->bindParam ( ':ssid', $SSID );
		$qry->bindParam ( ':race', $race );
		$qry->bindParam ( ':gender', $gender );
		for($i = 1; $i < 11; $i ++) {
			$qry->bindParam ( ':face' . $i, $looks [$i - 1] );
		}
		
		$qry->execute ();
		
		$db_data = loadDefaultData ();
		
		$ret [0] = $ACT_HERO . $ret [0];
		
		// user desc
	
		$ret [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
		
		break;
	default :
		$ret = array (
				"0" 
		);
		break;
}

echo join ( "/", $ret );
$db = NULL;
function loadDefaultData() {
	$db_data;
	if (func_num_args () != 1) {
		$qry = $GLOBALS ['db']->prepare ( "SELECT user_data.*, guilds.treasure, guilds.instructor, guilds.dung, 
				(
					SELECT Count(*) FROM messages WHERE messages.read = 0 AND messages.reciver_id = user_id
				) AS c, (
				    SELECT Count(*) + 1 FROM user_data WHERE user_data.honor > (
				        SELECT honor FROM user_data WHERE ssid = :ssid
				    )
				) AS rank
				FROM user_data 
				LEFT JOIN guilds ON user_data.guild_id = guilds.guild_id 
				WHERE ssid = :ssid2" );
		$qry->bindParam ( ':ssid', $GLOBALS ['SSID'] );
		$qry->bindParam ( ':ssid2', $GLOBALS ['SSID'] );
		if (! $qry->execute ()) {
			// var_dump ( $qry->errorInfo () );
		}
		
		$db_data = $qry->fetchAll ();
		$db_data = $db_data [0];
		
	} else {
		$db_data = func_get_arg ( 0 );
	}
	
	// char looks
	for($i = $GLOBALS ['SF_FACE_1']; $i <= $GLOBALS ['SF_FACE_10']; $i ++) {
		$GLOBALS ['ret'] [$i] = $db_data ['face' . ($i - 16)];
	}
	
	$GLOBALS ['ret'] [$GLOBALS ['SF_RACE']] = $db_data ['race'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_GENDER']] = $db_data ['gender'] == 1 ? 257 : 256; // 335;//$db_data ['gender'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_CLASS']] = $db_data ['class'];
	
	$GLOBALS ['ret'] [0] = "23132312"; // random, payment id
	$GLOBALS ['ret'] [$GLOBALS ['SF_PLAYER_ID']] = $db_data ['user_id'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_REGISTRATION_DATE']] = $db_data ['reg_date'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_REGISTRATION_IP']] = "123837423"; // random shit
	                                                                  
	// status
	$GLOBALS ['ret'] [$GLOBALS ['SF_STATUS']] = $db_data ['status'];
	$GLOBALS ['ret'] [46] = $db_data ['status_extra'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACT_ENDTIME']] = $db_data ['status_end'];
	
	$GLOBALS ['ret'] [$GLOBALS ['SF_LEVEL']] = $db_data ['lvl'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_EXP']] = $db_data ['exp'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_EXP_REQ']] = $GLOBALS ['LEVELS'] [$db_data ['lvl']];
	$GLOBALS ['ret'] [$GLOBALS ['SF_HONOR']] = 0;
	$GLOBALS ['ret'] [$GLOBALS ['SF_RANK']] = 1;
	$GLOBALS ['ret'] [$GLOBALS ['SF_SILVER']] = $db_data ['silver'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_MUSH']] = $db_data ['mushroom'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_THIRST']] = $db_data ['thirst'];
	
	// TODO: set stats from items
	// stats
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_STR']] = ( int ) $db_data ['attr_str'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_AGI']] = ( int ) $db_data ['attr_agi'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_INT']] = ( int ) $db_data ['attr_int'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_WIT']] = ( int ) $db_data ['attr_wit'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_LUCK']] = ( int ) $db_data ['attr_luck'];
	
	// dungeons
	for($i = 1; $i <= 12; $i ++) {
		$GLOBALS ['ret'] [$GLOBALS ['SF_DUNGEON_' . $i]] = $db_data ['dungeon_' . $i];
	}
	$GLOBALS ['ret'] [490] = 120 + ( int ) $db_data ['dungeon_13'];
	
	// quest desc 1-6 except 4
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_DESC_1']] = 3;
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_DESC_2']] = 1;
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_DESC_3']] = 5;
	
	// unread msgs
	$GLOBALS ['ret'] [$GLOBALS ['SF_UNREAD_MSGS']] = $db_data ['c'];
	
	// honor and ranking - not pulled in every query
	$GLOBALS ['ret'] [$GLOBALS ['SF_HONOR']] = $db_data ['honor'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_RANK']] = @$db_data ['rank'];
	
	// ----achievements----
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_LVL']] = $db_data ['lvl'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_ARENA']] = $db_data ['medal_gladiator'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_QUEST']] = $db_data ['medal_adventurer'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_WORK']] = $db_data ['medal_employment'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_GOLD']] = $db_data ['medal_commerce'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_HONOR']] = $db_data ['medal_bravery'];
	
	// dung achievement
	$sum = 0;
	for($i = 1; $i <= 10; $i ++) {
		$a = $db_data ['dungeon_' . $i];
		if ($a > 2)
			$sum += ($a - 2);
	}
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_DUNG']] = $sum;
	
	// ----------------------
	
	// MQ STATE - ???
	// $GLOBALS['ret'] [458] = 1;
	
	// ------------- items--------------
	$qry = $GLOBALS ['db']->prepare ( "SELECT * FROM items 
			WHERE owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid)" );
	$qry->bindParam ( ':ssid', $GLOBALS ['SSID'] );
	if (! $qry->execute ()) {
		var_dump ( $qry->errorInfo () );
	}
	
	$items = $qry->fetchAll ();
	
	// set slot values for the loop
	for($i = 0; $i < count ( $items ); $i ++) {
		
		if (( int ) $items [$i] ['slot'] < 10) {
			$items [$i] ['slot'] = 48 + (( int ) $items [$i] ['slot'] * 12);
		} else {
			$items [$i] ['slot'] = 168 + ((( int ) $items [$i] ['slot'] - 10) * 12);
		}
	}
	
	// default weapon dmg without weapon 1-2
	$GLOBALS ['ret'] [$GLOBALS ['SF_DMG_MIN']] = 1;
	$GLOBALS ['ret'] [$GLOBALS ['SF_DMG_MAX']] = 2;
	
	foreach ( $items as $item ) {
		$i = $item ['slot'];
		// echo "AaaaSAdA" . $i . " ";
		$GLOBALS ['ret'] [$i] = $item ['item_type'];
		$GLOBALS ['ret'] [$i + 1] = $item ['item_id'];
		$GLOBALS ['ret'] [$i + 2] = $item ['dmg_min'];
		$GLOBALS ['ret'] [$i + 3] = $item ['dmg_max'];
		$GLOBALS ['ret'] [$i + 4] = $item ['atr_type_1'];
		$GLOBALS ['ret'] [$i + 5] = $item ['atr_type_2'];
		$GLOBALS ['ret'] [$i + 6] = $item ['atr_type_3'];
		$GLOBALS ['ret'] [$i + 7] = $item ['atr_val_1'];
		$GLOBALS ['ret'] [$i + 8] = $item ['atr_val_2'];
		$GLOBALS ['ret'] [$i + 9] = $item ['atr_val_3'];
		$GLOBALS ['ret'] [$i + 10] = $item ['gold'];
		$GLOBALS ['ret'] [$i + 11] = $item ['mush'];
		
		// add stats if item is equiped
		if (( int ) $item ['slot'] < 168) {
			if ($item ['atr_type_1'] == 6) {
				// all stats
				for($i = 0; $i < 5; $i ++) {
					$GLOBALS ['ret'] [35 + $i] += $item ['atr_val_1'];
				}
			} else {
				// one / thre stats
				$GLOBALS ['ret'] [34 + $item ['atr_type_1']] += $item ['atr_val_1'];
				$GLOBALS ['ret'] [34 + $item ['atr_type_2']] += $item ['atr_val_2'];
				$GLOBALS ['ret'] [34 + $item ['atr_type_3']] += $item ['atr_val_3'];
			}
			// if the item is a weapon and is equiped, set dmg bounds (calculate dmg including pirmary stat)
			if ($item ['item_type'] == 1 && $item ['slot'] = 150) {
				$GLOBALS ['ret'] [$GLOBALS ['SF_DMG_MIN']] = $item ['dmg_min'];
				$GLOBALS ['ret'] [$GLOBALS ['SF_DMG_MAX']] = $item ['dmg_max'];
			}
		}
	}

	
	// server time
	$time = new DateTime ();
	
	$GLOBALS ['ret'] [$GLOBALS ['SF_SERVERTIME']] = $time->getTimestamp ();
	
	// mount - check if expired
	if ($time->getTimestamp () < ( int ) $db_data ['mount_dur']) {
		$GLOBALS ['ret'] [$GLOBALS ['SF_MOUNT']] = $db_data ['mount'];
		$GLOBALS ['ret'] [$GLOBALS ['SF_MOUNT_DURATION']] = $db_data ['mount_dur'];
	}
	
	// $GLOBALS['ret'][2] = "1387666979";
	// email validated
	$GLOBALS ['ret'] [463] = "1";
	
	// stat cost
	$base = loadDefaultStats ( $db_data ['class'], $db_data ['race'] );
	$GLOBALS ['ret'] [40] = $db_data ['attr_str'] - $base [0];
	$GLOBALS ['ret'] [41] = $db_data ['attr_agi'] - $base [1];
	$GLOBALS ['ret'] [42] = $db_data ['attr_int'] - $base [2];
	$GLOBALS ['ret'] [43] = $db_data ['attr_wit'] - $base [3];
	$GLOBALS ['ret'] [44] = $db_data ['attr_luck'] - $base [4];
	
	// mount multiplier
	$mount = mountMultiplier ( $GLOBALS ['ret'] [$GLOBALS ['SF_MOUNT']] );
	
	$ebonus = 1;
	$gbonus = 1;
	$ebonus = 1 + (($db_data ['instructor'] + $db_data ['dung']) / 50);
	$gbonus = 1 + (($db_data ['treasure'] + $db_data ['dung']) / 50);
	
	// quests
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_DURATION_1']] = ( int ) $db_data ['quest_dur_1'] * 30 * $mount;
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_EXP_1']] = round($db_data ['quest_exp_1'] * $ebonus);
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_GOLD_1']] = $db_data ['quest_gold_1'] * $gbonus;
	
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_DURATION_2']] = ( int ) $db_data ['quest_dur_2'] * 30 * $mount;
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_EXP_2']] = round($db_data ['quest_exp_2'] * $ebonus);
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_GOLD_2']] = $db_data ['quest_gold_2'] * $gbonus;
	
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_DURATION_3']] = ( int ) $db_data ['quest_dur_3'] * 30 * $mount;
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_EXP_3']] = round($db_data ['quest_exp_3'] * $ebonus);
	$GLOBALS ['ret'] [$GLOBALS ['SF_QUEST_GOLD_3']] = $db_data ['quest_gold_3'] * $gbonus;
	
	// >---SHROOM DONATIONS---<
	$GLOBALS ['ret'] [$GLOBALS ['SF_MUSHROOMS_MAY_DONATE']] = 0;
	$GLOBALS ['ret'] [506] = 0;
	$GLOBALS ['ret'] [507] = 0;
	$GLOBALS ['ret'] [$GLOBALS ['SF_']] = 2;
	
	// first payment, can't be 0 in order for player to donate
	$GLOBALS ['ret'] [479] = 1;
	
	// exp & gold bonus from guild
	$GLOBALS ['ret'] [461] = ($db_data ['instructor'] + $db_data ['dung']) * 2;
	$GLOBALS ['ret'] [462] = ($db_data ['treasure'] + $db_data ['dung']) * 2;
	
	// guild id and rank
	@$GLOBALS ['ret'] [435] = $db_data ['guild_id'];
	@$GLOBALS ['ret'] [436] = $db_data ['guild_rank'];
	// guild join date
	$GLOBALS ['ret'] [443] = 123737;
	
	// dung & arena time left
	$GLOBALS ['ret'] [459] = $db_data ['dungeon_time'];
	$GLOBALS ['ret'] [460] = $db_data ['arena_time'];
	
	// beers
	$GLOBALS ['ret'] [457] = $db_data ['beers'];
	
	// armor
	
	$GLOBALS ['ret'] [447] = $db_data['lvl'] * rand(5, 50);
	
	// display quest items
	
	for($i = 1; $i < 4; $i ++){
	
		$qry = $GLOBALS ['db']->prepare ( "SELECT * FROM items_tavern 
			WHERE owner_id = (SELECT user_data.user_id FROM user_data WHERE user_data.ssid = :ssid) AND quest = $i" );
		$qry->bindParam ( ':ssid', $GLOBALS ['SSID'] );
		$qry->execute ();
	
		$items = $qry->fetchAll ();
	
		$index = 244 + ($i * 12 - 12);
	
		foreach ( $items as $item ) {
			$GLOBALS ['ret'] [$index] = $item ['item_type'];
			$GLOBALS ['ret'] [$index + 1] = $item ['item_id'];
			$GLOBALS ['ret'] [$index + 2] = $item ['dmg_min'];
			$GLOBALS ['ret'] [$index + 3] = $item ['dmg_max'];
			$GLOBALS ['ret'] [$index + 4] = $item ['atr_type_1'];
			$GLOBALS ['ret'] [$index + 5] = $item ['atr_type_2'];
			$GLOBALS ['ret'] [$index + 6] = $item ['atr_type_3'];
			$GLOBALS ['ret'] [$index + 7] = $item ['atr_val_1'];
			$GLOBALS ['ret'] [$index + 8] = $item ['atr_val_2'];
			$GLOBALS ['ret'] [$index + 9] = $item ['atr_val_3'];
			$GLOBALS ['ret'] [$index + 10] = $item ['gold'];
			$GLOBALS ['ret'] [$index + 11] = $item ['mush'];
		}
	
	}
	
	// display quest bg
	
	$GLOBALS ['ret'] [238] = $db_data ['quest_location_1']; // bg 1
	$GLOBALS ['ret'] [239] = $db_data ['quest_location_2']; // bg 2
	$GLOBALS ['ret'] [240] = $db_data ['quest_location_3']; // bg 3
		
	// potions
	
	$GLOBALS ['ret'] [499] = $db_data['potion_value1']; // potion value 1
	$GLOBALS ['ret'] [500] = $db_data['potion_value2']; // potion value 2
	$GLOBALS ['ret'] [501] = $db_data['potion_value3']; // potion value 3
		

	$GLOBALS ['ret'] [493] = $db_data['potion_id1']; // potion id 1
	$GLOBALS ['ret'] [494] = $db_data['potion_id2']; // potion id 2
	$GLOBALS ['ret'] [495] = $db_data['potion_id3']; // potion id 3
		
	$GLOBALS ['ret'] [496] = $db_data['potion_time1']; // potion date 1
	$GLOBALS ['ret'] [497] = $db_data['potion_time2']; // potion date 2
	$GLOBALS ['ret'] [498] = $db_data['potion_time3']; // potion date 3
	
	// golden frame
	
	$GLOBALS ['ret'] [444] = $db_data['golden_frame'];
	
	// add potion stats
	
	for ($i = 1; $i < 4; $i ++){
		
			switch ($db_data ['potion_id' . $i]){
				case 1:
					$GLOBALS ['ret'] [35] += (($GLOBALS ['ret'] [35] + $GLOBALS ['ret'] [30]) * 0.05);
					break;
				case 2:
					$GLOBALS ['ret'] [36] += (($GLOBALS ['ret'] [36] + $GLOBALS ['ret'] [31]) * 0.05);
					break;
				case 3:
					$GLOBALS ['ret'] [37] += (($GLOBALS ['ret'] [37] + $GLOBALS ['ret'] [32]) * 0.05);
					break;
				case 4:
					$GLOBALS ['ret'] [38] += (($GLOBALS ['ret'] [38] + $GLOBALS ['ret'] [33]) * 0.05);
					break;
				case 5:
					$GLOBALS ['ret'] [39] += (($GLOBALS ['ret'] [39] + $GLOBALS ['ret'] [34]) * 0.05);
					break;
				case 6:
					$GLOBALS ['ret'] [35] += (($GLOBALS ['ret'] [35] + $GLOBALS ['ret'] [30]) * 0.15);
					break;
				case 7:
					$GLOBALS ['ret'] [36] += (($GLOBALS ['ret'] [36] + $GLOBALS ['ret'] [31]) * 0.15);
					break;
				case 8:
					$GLOBALS ['ret'] [37] += (($GLOBALS ['ret'] [37] + $GLOBALS ['ret'] [32]) * 0.15);
					break;
				case 9:
					$GLOBALS ['ret'] [38] += (($GLOBALS ['ret'] [38] + $GLOBALS ['ret'] [33]) * 0.15);
					break;
				case 10:
					$GLOBALS ['ret'] [39] += (($GLOBALS ['ret'] [39] + $GLOBALS ['ret'] [34]) * 0.15);
					break;
				case 11:
					$GLOBALS ['ret'] [35] += (($GLOBALS ['ret'] [35] + $GLOBALS ['ret'] [30]) * 0.25);
					break;
				case 12:
					$GLOBALS ['ret'] [36] += (($GLOBALS ['ret'] [36] + $GLOBALS ['ret'] [31]) * 0.25);
					break;
				case 13:
					$GLOBALS ['ret'] [37] += (($GLOBALS ['ret'] [37] + $GLOBALS ['ret'] [32]) * 0.25);
					break;
				case 14:
					$GLOBALS ['ret'] [38] += (($GLOBALS ['ret'] [38] + $GLOBALS ['ret'] [33]) * 0.25);
					break;
				case 15:
					$GLOBALS ['ret'] [39] += (($GLOBALS ['ret'] [39] + $GLOBALS ['ret'] [34]) * 0.25);
					break;
			}
	}
	
	return $db_data;
}
function event(){
	$event = 5; //0 = nothing, 1 = TP event, 2 = Epic event, 3 = gold event, 4 = mushroom event, 5 = chirstmas event
	return $event;
}
function loadCharData($db_data) {
	
	// sctructure
	// 1110000000000/24795/0/0/0/0/0/262/101852404/198990370/140661/191/-1/0/0/0/0/8/105/103/6/1/1/6/1/1/0/1/258/2/1398/1401/2565/2169/1747/697/697/4226/3370/2863/1308/1308/2466/2077/1651/0/0/0/6/1055/624/0/6/0/0/224/0/0/6594675/0/3/1051/574/0/3/4/5/277/277/277/7543664/0/5/1055/311/0/6/0/0/222/0/0/16613070/0/4/1058/680/0/3/4/5/318/318/318/81538166/0/8/50/0/0/3/4/5/322/322/322/8913882/0/7/1054/563/0/6/0/0/251/0/0/68291186/0/9/50/0/0/3/4/5/325/325/325/17743928/0/10/56/0/0/3/4/5/323/323/323/12423447/0/1/1009/723/1733/3/2/1/1078/0/0/25068605/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/-39/-117/-80/5/16/4/210/420/210/0/1009/517/0/3/4/2/528/0/0/22105860/0/0/1008/615/0/4/1/3/295/239/0/9736031/0/0/1008/735/1713/3/2/4/606/462/0/21066326/0/275300/257700/372600/11872300/37991500/8675900/3145731/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/9/3/0/11686/0/0/12/12/0/0/0/0/2752/723/1733/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/262/100/2452/10733/12563/1000000000/141007/0/1185/81/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/124/13/275/10/14/8/1387535557/1387692841/1387433642/15/25/15/0/0/0/0/0/0/0/0/1387371955;Lochy: # [X] [X] [X]# [X] [X] [X]# [X] [X] [X]# [X] [X] [X]# [2];d2jsp
	
	// 0 index
	$GLOBALS ['ret'] [0] = "1110000000000";
	
	// player id
	$GLOBALS ['ret'] [$GLOBALS ['SF_PLAYER_ID']] = $db_data ['user_id'];
	
	// TODO: exp bar
	$GLOBALS ['ret'] [$GLOBALS ['SF_EXP']] = $db_data ['exp'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_EXP_REQ']] = $GLOBALS ['LEVELS'] [$db_data ['lvl']];
	
	// honor && ranking
	$GLOBALS ['ret'] [$GLOBALS ['SF_HONOR']] = $db_data ['honor'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_RANK']] = $db_data ['rank'];
	
	// lvl
	$GLOBALS ['ret'] [$GLOBALS ['SF_LEVEL']] = $db_data ['lvl'];
	
	// ----achievements----
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_LVL']] = $db_data ['lvl'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_ARENA']] = $db_data ['medal_gladiator'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_QUEST']] = $db_data ['medal_adventurer'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_WORK']] = $db_data ['medal_employment'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_GOLD']] = $db_data ['medal_commerce'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_HONOR']] = $db_data ['medal_bravery'];
	
	// dung achievement
	$sum = 0;
	for($i = 1; $i <= 12; $i ++) {
		$a = $db_data ['dungeon_' . $i];
		if ($a > 2)
			$sum += ($a - 2);
		else if ($a > 10)
			$a = 10;
	}
	$GLOBALS ['ret'] [$GLOBALS ['SF_ACHIEVEMENT_DUNG']] = $sum;
	
	// ----------------------
	
	// stats
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_STR']] = $db_data ['attr_str'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_AGI']] = $db_data ['attr_agi'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_INT']] = $db_data ['attr_int'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_WIT']] = $db_data ['attr_wit'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_ATTR_LUCK']] = $db_data ['attr_luck'];
	
	// char looks
	for($i = $GLOBALS ['SF_FACE_1']; $i <= $GLOBALS ['SF_FACE_10']; $i ++) {
		$GLOBALS ['ret'] [$i] = $db_data ['face' . ($i - 16)];
	}
	$GLOBALS ['ret'] [$GLOBALS ['SF_RACE']] = $db_data ['race'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_GENDER']] = $db_data ['gender'];
	$GLOBALS ['ret'] [$GLOBALS ['SF_CLASS']] = $db_data ['class'];
	
	// ----------------items-------------
	$qry = $GLOBALS ['db']->prepare ( "SELECT * FROM items
			WHERE owner_id = :id AND slot < 10" );
	$qry->bindParam ( ':id', $db_data ['user_id'] );
	$qry->execute ();
	
	$items = $qry->fetchAll ();
	
	// set slot values for the loop
	for($i = 0; $i < count ( $items ); $i ++) {
		
		if (( int ) $items [$i] ['slot'] < 10) {
			$items [$i] ['slot'] = 48 + (( int ) $items [$i] ['slot'] * 12);
		} else {
			$items [$i] ['slot'] = 168 + ((( int ) $items [$i] ['slot'] - 10) * 12);
		}
	}
	
	foreach ( $items as $item ) {
		$i = $item ['slot'];
		// echo "AaaaSAdA" . $i . " ";
		$GLOBALS ['ret'] [$i] = $item ['item_type'];
		$GLOBALS ['ret'] [$i + 1] = $item ['item_id'];
		$GLOBALS ['ret'] [$i + 2] = $item ['dmg_min'];
		$GLOBALS ['ret'] [$i + 3] = $item ['dmg_max'];
		$GLOBALS ['ret'] [$i + 4] = $item ['atr_type_1'];
		$GLOBALS ['ret'] [$i + 5] = $item ['atr_type_2'];
		$GLOBALS ['ret'] [$i + 6] = $item ['atr_type_3'];
		$GLOBALS ['ret'] [$i + 7] = $item ['atr_val_1'];
		$GLOBALS ['ret'] [$i + 8] = $item ['atr_val_2'];
		$GLOBALS ['ret'] [$i + 9] = $item ['atr_val_3'];
		$GLOBALS ['ret'] [$i + 10] = $item ['gold'];
		$GLOBALS ['ret'] [$i + 11] = $item ['mush'];
		
		// add stats if item is equiped
		if ($item ['slot'] < 168) {
			if ($item ['atr_type_1'] == 6) {
				// all stats
				for($i = 0; $i < 5; $i ++) {
					$GLOBALS ['ret'] [35 + $i] += $item ['atr_val_1'];
				}
			} else {
				// one / thre stats
				$GLOBALS ['ret'] [34 + $item ['atr_type_1']] += $item ['atr_val_1'];
				$GLOBALS ['ret'] [34 + $item ['atr_type_2']] += $item ['atr_val_2'];
				$GLOBALS ['ret'] [34 + $item ['atr_type_3']] += $item ['atr_val_3'];
			}
		}
		// if the item is a weapon and is equiped, set dmg bounds (calculate dmg including pirmary stat)
		if ($item ['item_type'] == 1 && $item ['slot'] = 150) {
			$GLOBALS ['ret'] [$GLOBALS ['SF_DMG_MIN']] = $item ['dmg_min'];
			$GLOBALS ['ret'] [$GLOBALS ['SF_DMG_MAX']] = $item ['dmg_max'];
		}
	}
	
	// --------------------------------
	
	$time = new DateTime ();
	$time = $time->getTimestamp ();
	
	
	// armor
	
	$GLOBALS ['ret'] [447] = $db_data['lvl'] * 10;
	
	// server time & description & guild name
	$GLOBALS ['ret'] [511] = $time . ";" . urldecode($db_data ['user_desc']) . ";";
	@$GLOBALS ['ret'] [511] .= $db_data ['guild'];
	

	$GLOBALS ['ret'] [499] = $db_data['potion_value1']; // potion value 1
	$GLOBALS ['ret'] [500] = $db_data['potion_value2']; // potion value 2
	$GLOBALS ['ret'] [501] = $db_data['potion_value3']; // potion value 3
		

	$GLOBALS ['ret'] [493] = $db_data['potion_id1']; // potion id 1
	$GLOBALS ['ret'] [494] = $db_data['potion_id2']; // potion id 2
	$GLOBALS ['ret'] [495] = $db_data['potion_id3']; // potion id 3
		
	$GLOBALS ['ret'] [496] = $db_data['potion_time1']; // potion date 1
	$GLOBALS ['ret'] [497] = $db_data['potion_time2']; // potion date 2
	$GLOBALS ['ret'] [498] = $db_data['potion_time3']; // potion date 3
	
	// golden frame
	
	$GLOBALS ['ret'] [444] = $db_data['golden_frame'];
	
	// user desc
	
	$GLOBALS ['ret'] [511] .= ";" . urldecode($db_data ['user_desc']) . ";";
	
	// mount
	if ($time < $db_data ['mount_dur']) {
		$GLOBALS ['ret'] [$GLOBALS ['SF_MOUNT']] = $db_data ['mount'];
	}
	
	// add potion stats
	for ($i = 1; $i < 4; $i ++){
		
			switch ($db_data ['potion_id' . $i]){
				case 1:
					$GLOBALS ['ret'] [35] += (($GLOBALS ['ret'] [35] + $GLOBALS ['ret'] [30]) * 0.05);
					break;
				case 2:
					$GLOBALS ['ret'] [36] += (($GLOBALS ['ret'] [36] + $GLOBALS ['ret'] [31]) * 0.05);
					break;
				case 3:
					$GLOBALS ['ret'] [37] += (($GLOBALS ['ret'] [37] + $GLOBALS ['ret'] [32]) * 0.05);
					break;
				case 4:
					$GLOBALS ['ret'] [38] += (($GLOBALS ['ret'] [38] + $GLOBALS ['ret'] [33]) * 0.05);
					break;
				case 5:
					$GLOBALS ['ret'] [39] += (($GLOBALS ['ret'] [39] + $GLOBALS ['ret'] [34]) * 0.05);
					break;
				case 6:
					$GLOBALS ['ret'] [35] += (($GLOBALS ['ret'] [35] + $GLOBALS ['ret'] [30]) * 0.15);
					break;
				case 7:
					$GLOBALS ['ret'] [36] += (($GLOBALS ['ret'] [36] + $GLOBALS ['ret'] [31]) * 0.15);
					break;
				case 8:
					$GLOBALS ['ret'] [37] += (($GLOBALS ['ret'] [37] + $GLOBALS ['ret'] [32]) * 0.15);
					break;
				case 9:
					$GLOBALS ['ret'] [38] += (($GLOBALS ['ret'] [38] + $GLOBALS ['ret'] [33]) * 0.15);
					break;
				case 10:
					$GLOBALS ['ret'] [39] += (($GLOBALS ['ret'] [39] + $GLOBALS ['ret'] [34]) * 0.15);
					break;
				case 11:
					$GLOBALS ['ret'] [35] += (($GLOBALS ['ret'] [35] + $GLOBALS ['ret'] [30]) * 0.25);
					break;
				case 12:
					$GLOBALS ['ret'] [36] += (($GLOBALS ['ret'] [36] + $GLOBALS ['ret'] [31]) * 0.25);
					break;
				case 13:
					$GLOBALS ['ret'] [37] += (($GLOBALS ['ret'] [37] + $GLOBALS ['ret'] [32]) * 0.25);
					break;
				case 14:
					$GLOBALS ['ret'] [38] += (($GLOBALS ['ret'] [38] + $GLOBALS ['ret'] [33]) * 0.25);
					break;
				case 15:
					$GLOBALS ['ret'] [39] += (($GLOBALS ['ret'] [39] + $GLOBALS ['ret'] [34]) * 0.25);
					break;
			}
	}
}

function getFillLevel($aura) {

if ($aura < 17){
	$returnVal = (150 + $aura * 50);
} else {
	$returnVal = 1000;
}
return $returnVal;
}

function loadGuildData($g_data, $m_data, $im_data, $member_of) {
	
	// $GLOBALS['ret'] = explode("/", "00679098/1000/0/1/0/10/0/0/0/0/0/1387449484/1387449484/100/278943/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/102/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1387451340/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1000/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1387451340;;/Pan Marcel;jakastam;100;15895");
	// return;
	
	// clear global ret
	// unset ( $GLOBALS ['ret'] );
	$ret = array_fill ( 0, 374, 0 );
	
	// counter
	$index = 0;
	
	// members
	$mc = count ( $m_data );
	
	// invited members
	$imc = count ( $im_data );
	
	$ret [0] = "172603";
	if ($member_of === TRUE) {
		$ret [0] = "006111";
		
		// gold & shrooms
		$ret [1] = $g_data ['silver'];
		$ret [2] = $g_data ['mushroom'];
		
		// tower - skarbiec - trener
		$ret [5] = $g_data ['fortress'];
		$ret [6] = $g_data ['treasure'];
		$ret [7] = $g_data ['instructor'];
	}
	
	// num of members
	$ret [3] = $mc + $imc;
	
	// ??
	$ret [4] = 0;
	
	// dungs
	$ret [8] = $g_data ['dung'];
	
	// ??
	$ret [9] = 0;
	
	// attack initiater id ?
	$ret [10] = 19503;
	
	// ?? timestamp ?? attack/def??
	$ret [11] = 1388506425;
	$ret [12] = 1388506425;
	
	// honor
	$ret [13] = $g_data ['honor'];
	
	$index = 14;
	// ID grazcy
	for($i = 0; $i < $mc; $i ++) {
		// $ret [$index] = "19503";
		$ret [$index] = $m_data [$i] ['user_id'];
		$index ++;
	}
	
	// INVITED PLAYERS id
	for($i = 0; $i < $imc; $i ++) {
		$ret [$index] = $im_data [$i] ['user_id'];
		$index ++;
	}
	
	$index = 64;
	// war_status + lvl
	for($i = 0; $i < $mc; $i ++) {
		// $ret [$i + 64] = 15;
		$ret [$index] = "0" . $m_data [$i] ['lvl'];
		$index ++;
	}
	
	// invited player levels
	for($i = 0; $i < $imc; $i ++) {
		$ret [$index] = $im_data [$i] ['lvl'];
		$index ++;
	}
	
	if ($member_of === TRUE) {
		$index = 114;
		// LAST LOGIN timestamps
		for($i = 0; $i < $mc; $i ++) {
			// $ret [$i + 115] = 1387295559;
			$ret [$index] = 0;
			$index ++;
		}
		
		$index = 164;
		// ?? - wszystkie byly zera
		for($i = 0; $i < $mc; $i ++) {
			$ret [$index] = 1;
			$index ++;
		}
		
		$index = 214;
		// wplacony gold
		for($i = 0; $i < $mc; $i ++) {
			$ret [$index] = 0;
			$index ++;
		}
		
		$index = 264;
		// wplacone grzyby
		for($i = 0; $i < $mc; $i ++) {
			$ret [$index] = 0;
			$index ++;
		}
	}
	$index = 314;
	// rangi
	for($i = 0; $i < $mc; $i ++) {
		// $ret [$index] = 0;
		$ret [$index] = $m_data [$i] ['guild_rank'];
		$index ++;
	}
	
	for($i = 0; $i < $imc; $i ++) {
		$ret [$index] = 4; // $im_data[$i
		$index ++;
	}
	
	// for($i = 0; $i < $; $i)
	
	$index = 364;
	
	// 3899/1387470968/0/0/1922/1387457892;opis;
	
	$ret [$index] = "0";
	// attacked guild id ??
	$ret [$index + 1] = "0";
	// czas obrony
	$ret [$index + 2] = "0"; // "1387296865";
	
	$ret [$index + 3] = "0";
	$ret [$index + 4] = "0";
	// guild id attacking u ?
	$ret [$index + 5] = "0";
	$ret [$index + 6] = "1387295590";
	
	// description
	$ret [$index + 6] .= ';0C1400000400310A060503§' . urldecode($g_data ['description']) . ';';
	
	$index += 7;
	
	// user names
	for($i = 0; $i < $mc; $i ++) {
		$ret [$index] = $m_data [$i] ['user_name'];
		$index ++;
	}
	
	// invited players user names
	for($i = 0; $i < $imc; $i ++) {
		$ret [$index] = $im_data [$i] ['user_name'];
		$index ++;
	}
	
	// LAST MEMBER NAME +
	// ;Crissco;22797;1 - ;guild name;honor;ranking
	// $index = count ( $ret ) - 1;
	// $ret [374] .= "lider;nazwa gildi;honor;ranking";
	@$ret [$index] .= $m_data [0] ['user_name'] . ';' . $g_data ['name'] . ';' . $g_data ['honor'] . ';' . $g_data ['rank'];
	
	$GLOBALS ['ret'] = $ret;
} ?>
1377863814-U611928.png

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...