<?php
/*****************************************************************************
 *   Game Section Module (/inc/plugins/myplaza/gamesect.php)
 *     - MyPlaza for MyBB 1.2
 *    By ZiNgA BuRgA, 2007-2008
 * 
 * Integrates with Paretje's Game Section MyBB plugin to give money for games.
 *****************************************************************************/


if(!defined("IN_MYBB"))
	die("This file cannot be accessed directly.");

function gamesect_lang_admin()
{
	global $mybb, $lang;
	switch($mybb->settings['bblanguage'])
	{
		default:
			$lang->gamesect_name = 'Game Section Integration Module';
			$lang->gamesect_description = 'Integrates with Paretje\'s Game Section MyBB plugin to give money for games.';
			
			$lang->gamesect_score_factor = 'Score to Money Ratio<br /><small>The amount of money paid to a user, will equal the score of the game multiplied by this number</small>';
			$lang->gamesect_champ_bonus = 'Amount of money paid to a user for becomming the new champion of a game.';
			$lang->gamesect_champ_factor = 'Amount of <em>bonus</em> money paid to a user for each point (s)he beats the previous champion by.';
			
			$lang->setting_gamesect_play_pay = 'Pay Per Play';
			$lang->setting_gamesect_play_pay_desc = 'Amount of money to give/take, each time a user plays a game.';
			
			$lang->setting_gamesect_pay_maxscore = 'Maximum Payouts';
			$lang->setting_gamesect_pay_maxscore_desc = 'The maximum amount of money to pay out in a game.  Note, this will not include new champ bonuses.  Set 0 for no maximum.';
			
			$lang->setting_gamesect_asc_maxscore = 'Maximum Score for ASC Games';
			$lang->setting_gamesect_asc_maxscore_desc = 'This value controls the behaviour of games with a decreasing score.  The payout is calculated by assuming this number is the maximum score of the game.';
	}
}

function gamesect_info()
{
	global $lang;
	return array(
		"website"		=> "http://myplaza.zingaburga.com",
		"author"		=> "ZiNgA BuRgA",
		"authorsite"	=> "http://zingaburga.com/",
		"version"		=> "1.0.1",
		
		'compatibility'	=> array(0.5,0.51,0.52,0.53)
	);
}

function gamesect_activate()
{
	if(!defined("IN_MYPLAZA_ADMIN"))
		cperror('This is not a normal MyBB plugin!  Please upload this file to your /inc/plugins/myplaza directory.');
	
	
	db_add_columns('games', array(
		'myplaza_money_factor' => array('type' => 'float', 'size' => 8, 'not_null' => true, 'default' => 1),
		'myplaza_champ_bonus' => array('type' => 'decimal', 'size' => '20,10', 'not_null' => true, 'default' => 0),
		'myplaza_champ_factor' => array('type' => 'float', 'size' => 8, 'not_null' => true, 'default' => 1)
		
	));
	
	add_settings(array(
		array(
			'name' => 'gamesect_play_pay',
			'optionscode' => 'text',
			'value' => 0
		),
		array(
			'name' => 'gamesect_pay_maxscore',
			'optionscode' => 'text',
			'value' => 0
		),
		array(
			'name' => 'gamesect_asc_maxscore',
			'optionscode' => 'text',
			'value' => 0
		)
	));
	
	plugins_add_passive_hook('games_submit_end', 'gamesect_execute');
	plugins_add_passive_hook('games_play', 'gamesect_play');
	plugins_add_passive_hook('games_admin_start', 'gamesect_admin_display', 10, true);
	// compatibility fix
	plugins_add_passive_hook('admin_usergroups_add_code', 'gamesect_admin_add_ugroup_code', 100, true);
	plugins_add_passive_hook('admin_usergroups_edit_code', 'gamesect_admin_edit_ugroup_code', 100, true);
}

function gamesect_deactivate()
{
	global $db;
	$db->delete_query(MY_TABLE_PREFIX.'settings', "name IN ('gamesect_play_pay','gamesect_pay_maxscore','gamesect_asc_maxscore')");
	db_remove_columns('games', array('myplaza_money_factor', 'myplaza_champ_bonus', 'myplaza_champ_factor'));
	plugins_remove_passive_hooks();
}

function gamesect_play()
{
	global $mybb;
	user_change_money($mybb->user, round(floatval($mybb->settings['gamesect_play_pay']), $mybb->settings['myplaza_money_decimals']));
}


// TODO: games with ASC type scores
function gamesect_execute()
{
	global $game, $update_champ, $insert_champ, $mybb, $score, $champ;
	if(!is_array($game)) return;
	
	if($game['score_type'] == ASC) // is ASC actually define'd somewhere??
		$ourscore = intval($mybb->settings['gamesect_asc_maxscore']) - $score;
	else
		$ourscore = $score;
	
	// add money for the score
	$earnings = intval($ourscore) * $game['myplaza_money_factor'];
	
	// check if we have a new champ
	//$game['myplaza_champ_factor'] = floatval($game['myplaza_champ_factor']);
	$game['myplaza_champ_bonus'] = round($game['myplaza_champ_bonus'], $mybb->settings['myplaza_money_decimals']);
	if(is_array($insert_champ))
	{
		// well, lucky number 1 player will get all the bonuses... :P
		$earnings += intval($ourscore) * $game['myplaza_champ_factor'];
		user_change_money($mybb->user, $game['myplaza_champ_bonus']);
	}
	elseif(is_array($update_champ))
	{
		if($champ['uid'] != $mybb->user['uid'])
			user_change_money($mybb->user, $game['myplaza_champ_bonus']);
		$diff = abs($champ['score'] - intval($score));
		$earnings += $diff * $game['myplaza_champ_factor'];
	}
	
	$maxearnings = round(floatval($mybb->settings['gamesect_pay_maxscore']), $mybb->settings['myplaza_money_decimals']);
	if($maxearnings && $earnings > $maxearnings) $earnings = $maxearnings;
	user_change_money($mybb->user, $earnings);
}


function gamesect_admin_display()
{
	global $mybb, $db, $lang;
	switch($mybb->input['action'])
	{
		case 'do_add_game':
			if(!isset($mybb->input['cid']) || !isset($mybb->input['name']) || !isset($mybb->input['title']) || !isset($mybb->input['width']) || !isset($mybb->input['height']))
			{
				// do nothing
			}
			else
			{
				$new_game = array(
					'cid'		=> intval($mybb->input['cid']),
					'name'		=> $db->escape_string($mybb->input['name']),
					'title'		=> $db->escape_string($mybb->input['title']),
					'description'	=> $db->escape_string($mybb->input['description']),
					'what'		=> $db->escape_string($mybb->input['what']),
					'use_keys'	=> $db->escape_string($mybb->input['use_keys']),
					'bgcolor'	=> $db->escape_string($mybb->input['bgcolor']),
					'active'	=> $db->escape_string($mybb->input['active']),
					'width'		=> $db->escape_string($mybb->input['width']),
					'height'	=> $db->escape_string($mybb->input['height']),
					'dateline'	=> REQUEST_TIME,
					'score_type'	=> $db->escape_string($mybb->input['score_type']),
					'myplaza_money_factor' => floatval($mybb->input['myplaza_money_factor']),
					'myplaza_champ_bonus' => floatval($mybb->input['myplaza_champ_bonus']),
					'myplaza_champ_factor' => floatval($mybb->input['myplaza_champ_factor']),
				);
				
				$db->insert_query(MY_TABLE_PREFIX."games", $new_game);
				
				cpredirect("games.php?".SID, $lang->added_game);
				shutdown_exit();
			}
			
		case 'do_edit_game':
			$gid = intval($mybb->input['gid']);
			
			if(!isset($mybb->input['gid']) || !isset($mybb->input['cid']) || !isset($mybb->input['name']) || !isset($mybb->input['title']) || !isset($mybb->input['width']) || !isset($mybb->input['height']))
			{
				// do nothing
			}
			else
			{
				$edit_game = array(
					'cid'		=> intval($mybb->input['cid']),
					'name'		=> $db->escape_string($mybb->input['name']),
					'title'		=> $db->escape_string($mybb->input['title']),
					'description'	=> $db->escape_string($mybb->input['description']),
					'what'		=> $db->escape_string($mybb->input['what']),
					'use_keys'	=> $db->escape_string($mybb->input['use_keys']),
					'bgcolor'	=> $db->escape_string($mybb->input['bgcolor']),
					'active'	=> $db->escape_string($mybb->input['active']),
					'width'		=> $db->escape_string($mybb->input['width']),
					'height'	=> $db->escape_string($mybb->input['height']),
					'score_type'	=> $db->escape_string($mybb->input['score_type']),
					'myplaza_money_factor' => floatval($mybb->input['myplaza_money_factor']),
					'myplaza_champ_bonus' => floatval($mybb->input['myplaza_champ_bonus']),
					'myplaza_champ_factor' => floatval($mybb->input['myplaza_champ_factor']),
				);
				
				$db->update_query(MY_TABLE_PREFIX."games", $edit_game, "gid='".$gid."'");
				
				cpredirect("games.php?".SID, $lang->edited_game);
				shutdown_exit();
			}
		
		case 'add_game':
			//Navigation and header
			addacpnav($lang->nav_add_game);
			
			//Categories
			$query = $db->simple_select(MY_TABLE_PREFIX.'games_categories', '*', '', array('order_by' => 'title', 'order_dir' => 'ASC'));
			while($category = $db->fetch_array($query))
				$choise_category .= "<option value=\"".$category['cid']."\">".$category['title']."</option>";
			
			//Header, form and table
			cpheader();
			starttable();
			tableheader($lang->nav_add_game);
			startform("games.php", "", "do_add_game");
			
			//Insert game
			makeinputcode($lang->game_title, "title");
			makeinputcode($lang->game_name, "name");
			makelabelcode($lang->game_cat, "<select name=\"cid\">
		<option value=\"0\">".$lang->game_cat_no."</option>
		".$choise_category."
		</select>");
			maketextareacode($lang->game_description, "description");
			maketextareacode($lang->game_what, "what");
			maketextareacode($lang->game_keys, "use_keys");
			makeinputcode($lang->game_bgcolor, "bgcolor", "000000");
			makeinputcode($lang->game_width, "width", "500");
			makeinputcode($lang->game_height, "height", "500");
			makelabelcode($lang->game_score_type, "<select name=\"score_type\">
		<option value=\"DESC\">".$lang->game_high."</option>
		<option value=\"ASC\">".$lang->game_low."</option>
		</select>");
			makeyesnocode($lang->game_active, "active");
			
			$lang->load('myplaza');
			myplaza_langload('gamesect');
			tablesubheader($lang->myplaza);
			makeinputcode($lang->gamesect_score_factor, 'myplaza_money_factor', 1);
			makeinputcode($lang->gamesect_champ_bonus, 'myplaza_champ_bonus', 20);
			makeinputcode($lang->gamesect_champ_factor, 'myplaza_champ_factor', 1);
			
			//End of table and form
			endtable();
			endform($lang->save, $lang->reset);
			
			//Footer of Control Panel
			cpfooter();
			shutdown_exit();
			
		case 'edit_game':
			$gid = intval($mybb->input['gid']);
			
			$query = $db->simple_select(MY_TABLE_PREFIX.'games', '*', 'gid='.$gid);
			$game = $db->fetch_array($query);
			$test_game = $db->num_rows($query);
			
			if($test_game == 0)
			{
				cperror($lang->gamedoesntexist);
			}
			
			//Navigation and header
			addacpnav($lang->edit_game);
			
			//Categories
			$choise_cid[$game['cid']] = " selected=\"selected\"";
			
			$query = $db->simple_select(MY_TABLE_PREFIX.'games_categories', '*', '', array('order_by' => 'title', 'order_dir' => 'asc'));
			
			while($category = $db->fetch_array($query))
			{
				$choise_category .= "<option value=\"".$category['cid']."\"".$choise_cid[$category['cid']].">".$category['title']."</option>";
			}
			
			$s_score_type[$game['score_type']] = " selected=\"selected\"";
			
			//Header, form and table
			cpheader();
			starttable();
			tableheader($lang->edit_game);
			startform("games.php", "", "do_edit_game");
			makehiddencode("gid", $gid);
			
			//Edit game
			makeinputcode($lang->game_title, "title", $game['title']);
			makeinputcode($lang->game_name, "name", $game['name']);
			makelabelcode($lang->game_cat, "<select name=\"cid\">
<option value=\"0\"".$choise_cid['0'].">".$lang->game_cat_no."</option>
".$choise_category."
</select>");
			maketextareacode($lang->game_description, "description", $game['description']);
			maketextareacode($lang->game_what, "what", $game['what']);
			maketextareacode($lang->game_keys, "use_keys", $game['use_keys']);
			makeinputcode($lang->game_bgcolor, "bgcolor", $game['bgcolor']);
			makeinputcode($lang->game_width, "width", $game['width']);
			makeinputcode($lang->game_height, "height", $game['height']);
			makelabelcode($lang->game_score_type, "<select name=\"score_type\">
<option value=\"DESC\"".$s_score_type['DESC'].">".$lang->game_high."</option>
<option value=\"ASC\"".$s_score_type['ASC'].">".$lang->game_low."</option>
</select>");
			makeyesnocode($lang->game_active, "active", $game['active']);
			
			$lang->load('myplaza');
			myplaza_langload('gamesect');
			tablesubheader($lang->myplaza);
			makeinputcode($lang->gamesect_score_factor, 'myplaza_money_factor', $game['myplaza_money_factor']);
			makeinputcode($lang->gamesect_champ_bonus, 'myplaza_champ_bonus', round($game['myplaza_champ_bonus'], $mybb->settings['myplaza_money_decimals']));
			makeinputcode($lang->gamesect_champ_factor, 'myplaza_champ_factor', $game['myplaza_champ_factor']);
			
			//End of table and form
			endtable();
			endform($lang->save, $lang->reset);
			
			//Footer of Control Panel
			cpfooter();
			shutdown_exit();
		
	}
}

function gamesect_admin_add_ugroup_code()
{
	global $lang;
	tablesubheader($lang->perm_gamesection);
	makeyesnocode($lang->perm_canviewgames, "canviewgames", "yes");
	makeyesnocode($lang->perm_canplaygames, "canplaygames", "yes");
}
function gamesect_admin_edit_ugroup_code()
{
	global $lang, $usergroup;
	tablesubheader($lang->perm_gamesection);
	makeyesnocode($lang->perm_canviewgames, "canviewgames", $usergroup['canviewgames']);
	makeyesnocode($lang->perm_canplaygames, "canplaygames", $usergroup['canplaygames']);
}

function gamesect_admin($process)
{
	if($process)
	{
		myplaza_process_settings(array('gamesect_play_pay'));
	}
	else
	{
		global $lang;
		
		cpheader_myplaza_module();
		starttable();
		tableheader($lang->gamesect_name, "", 2);
		myplaza_generate_settings_code(array('gamesect_play_pay'));
		endtable();
		
		cpfooter_myplaza_module();
	}
}


?>