mirror of
https://github.com/Relintai/mourne_rcpp_fw.git
synced 2024-11-13 05:57:21 +01:00
389 lines
7.8 KiB
PHP
389 lines
7.8 KiB
PHP
|
<?php
|
||
|
class Ai_model extends MO_Model
|
||
|
{
|
||
|
protected $settings;
|
||
|
|
||
|
function __construct()
|
||
|
{
|
||
|
parent::__construct();
|
||
|
}
|
||
|
|
||
|
function attack()
|
||
|
{
|
||
|
$this->parse_settings();
|
||
|
|
||
|
if (!$this->settings['on'])
|
||
|
return 'AI is off';
|
||
|
|
||
|
$sql = "SELECT * FROM ai_villages WHERE attacked='0'";
|
||
|
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
$ai_village_not_attacked = $q->num_rows();
|
||
|
|
||
|
$log = "ai_villages query returned " . $ai_village_not_attacked . " rows. \n";
|
||
|
|
||
|
$ai_villages = $q->result_array();
|
||
|
|
||
|
$attacking_num = $this->settings['max_attack_village_limit'];
|
||
|
|
||
|
//determining how much will attack
|
||
|
if ($this->settings['attack_village_rand'])
|
||
|
{
|
||
|
$a = rand(0, $this->settings['attack_village_rand']);
|
||
|
|
||
|
$attacking_num -= $a;
|
||
|
}
|
||
|
|
||
|
$log .= $attacking_num . " villages attacking. \n";
|
||
|
|
||
|
$reset = FALSE;
|
||
|
|
||
|
//resetting ai_villages's attack field if everything will be set to attacked
|
||
|
if ($ai_village_not_attacked < $attacking_num)
|
||
|
{
|
||
|
$attacking_num = $ai_village_not_attacked;
|
||
|
|
||
|
$reset = TRUE;
|
||
|
}
|
||
|
|
||
|
//determining which villages are going to attack
|
||
|
for ($i = 0; $i < $attacking_num; $i++)
|
||
|
{
|
||
|
$found = FALSE;
|
||
|
|
||
|
while (!$found)
|
||
|
{
|
||
|
foreach ($ai_villages as $row)
|
||
|
{
|
||
|
$r = rand(1, 100);
|
||
|
|
||
|
if ($r > 50 && !isset($s[$row['id']]))
|
||
|
{
|
||
|
$s[$row['id']] = TRUE;
|
||
|
$data[] = $row;
|
||
|
$found = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//saving to the db that they are attacked
|
||
|
if (!$reset)
|
||
|
{
|
||
|
$sql = "UPDATE ai_villages SET attacked='1' WHERE ";
|
||
|
|
||
|
$first = TRUE;
|
||
|
foreach ($data as $row)
|
||
|
{
|
||
|
if ($first)
|
||
|
$first = FALSE;
|
||
|
else
|
||
|
$sql .= " OR ";
|
||
|
|
||
|
$sql .= "id='" . $row['id'] . "'";
|
||
|
}
|
||
|
|
||
|
$this->db->query($sql);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$sql = "UPDATE ai_villages SET attacked='0'";
|
||
|
$this->db->query($sql);
|
||
|
$log .= "ai_villages's attacked field reseted.\n";
|
||
|
}
|
||
|
|
||
|
//getting ai_units
|
||
|
$sql = "SELECT * FROM ai_units";
|
||
|
$q = $this->db->query($sql);
|
||
|
$num_ai_units = $q->num_rows();
|
||
|
$res = $q->result_array();
|
||
|
|
||
|
if ($this->settings['ai_unit_max_diff'] < $num_ai_units)
|
||
|
{
|
||
|
$num = 0;
|
||
|
$d = FALSE;
|
||
|
|
||
|
while ($num != $this->settings['ai_unit_max_diff'])
|
||
|
{
|
||
|
foreach ($res as $row)
|
||
|
{
|
||
|
if (!isset($d[$row['id']]))
|
||
|
{
|
||
|
$r = rand(1,50);
|
||
|
if ($r > 50)
|
||
|
{
|
||
|
$ai_units[] = $row;
|
||
|
$d[$row['id']] = TRUE;
|
||
|
$num++;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$ai_units = $res;
|
||
|
}
|
||
|
|
||
|
//adding villages to log
|
||
|
$log .= "Attacking villages: \n";
|
||
|
foreach ($data as $row)
|
||
|
{
|
||
|
$log .= $row['name'] . "(" .$row['X'] . " " . $row['Y'] . ") \n";
|
||
|
}
|
||
|
|
||
|
//sending attackers
|
||
|
foreach ($data as $row)
|
||
|
{
|
||
|
$sql = "SELECT map.X,map.Y,villages.*
|
||
|
FROM map
|
||
|
LEFT JOIN villages ON (map.villageid=villages.id AND map.type='3')
|
||
|
WHERE (map.type = 3 AND
|
||
|
map.X > '" . ($row['X'] - 24) . "'
|
||
|
AND map.X < '" . ($row['X'] + 24) . "'
|
||
|
AND map.Y > '" . ($row['Y'] - 24) . "'
|
||
|
AND map.Y < '" . ($row['Y'] + 24) . "')";
|
||
|
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
//no villages in range
|
||
|
if (!$q->num_rows())
|
||
|
continue;
|
||
|
|
||
|
$log .= $row['name'] . " is attacking: \n";
|
||
|
|
||
|
$res = $q->result_array();
|
||
|
|
||
|
//sending attackers
|
||
|
foreach ($res as $rrow)
|
||
|
{
|
||
|
if ($rrow['ai_on'] || $rrow['ai_flagged'])
|
||
|
{
|
||
|
$log .= "Sending attackers to: " . $rrow['name'] . "[" . $rrow['id'] . "]";
|
||
|
$log .= " (S: " . $rrow['score'] . ")\n";
|
||
|
$log .= "Sent: \n";
|
||
|
|
||
|
foreach ($ai_units as $unit)
|
||
|
{
|
||
|
$a = ($rrow['score'] / $unit['rate']) / $unit['per_score'];
|
||
|
$num = floor($a);
|
||
|
|
||
|
$log .= $unit['name'] . "->" . $num . "\n";
|
||
|
|
||
|
$send[] = array('unitid' => $unit['id'],
|
||
|
'num' => $num);
|
||
|
}
|
||
|
|
||
|
$this->send_attack($send, $row, $rrow);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$this->load->helper('file');
|
||
|
|
||
|
$f = './logs/ai_log/log_' . time() . '.txt';
|
||
|
|
||
|
write_file($f, $log);
|
||
|
|
||
|
return $log;
|
||
|
|
||
|
}
|
||
|
|
||
|
function send_attack($send, $ai_village, $village)
|
||
|
{
|
||
|
$villageid = $village['id'];
|
||
|
|
||
|
$sql = "SELECT max(attackid) AS attackid FROM attacks WHERE villageid='$villageid'";
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
$res = $q->row_array();
|
||
|
|
||
|
if ($res['attackid'])
|
||
|
{
|
||
|
$atkid = ($res['attackid'] + 1);
|
||
|
}
|
||
|
else
|
||
|
$atkid = 1;
|
||
|
|
||
|
$first = TRUE;
|
||
|
$sql = "INSERT INTO attacks VALUES";
|
||
|
foreach ($send as $row)
|
||
|
{
|
||
|
if ($first)
|
||
|
$first = FALSE;
|
||
|
else
|
||
|
$sql .= ',';
|
||
|
|
||
|
$sql .= "(default, '$villageid', '$atkid', '" . $row['unitid'] . "', '" . $row['num']. "')";
|
||
|
}
|
||
|
|
||
|
$sql .= ";";
|
||
|
|
||
|
$this->db->query($sql);
|
||
|
|
||
|
//calculate distance
|
||
|
$dist = sqrt(pow($ai_village['X'] - $village['X'], 2) + pow($ai_village['Y'] - $village['Y'], 2));
|
||
|
|
||
|
//15 min 1 square
|
||
|
$time = $dist * 900;
|
||
|
$r = rand(3600, 10800);
|
||
|
$end = $time + $r;
|
||
|
|
||
|
//todo remove
|
||
|
$end = 20;
|
||
|
|
||
|
//attack random sides
|
||
|
$dir = rand(1, 4);
|
||
|
|
||
|
$ev['villageid'] = $villageid;
|
||
|
$ev['slotid'] = 0;
|
||
|
$ev['type'] = parent::EVENT_ATTACK;
|
||
|
$ev['time'] = $end;
|
||
|
$ev['data1'] = $atkid;
|
||
|
$ev['data2'] = $dir;
|
||
|
|
||
|
$this->add_event($ev);
|
||
|
|
||
|
}
|
||
|
|
||
|
function parse_settings()
|
||
|
{
|
||
|
$sql = "SELECT * FROM ai_settings";
|
||
|
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
$res = $q->result_array();
|
||
|
|
||
|
foreach ($res as $row)
|
||
|
{
|
||
|
$data[$row['setting']] = $row['value'];
|
||
|
}
|
||
|
|
||
|
$this->settings = $data;
|
||
|
}
|
||
|
|
||
|
function get_unit_list_drop_admin()
|
||
|
{
|
||
|
$sql = "SELECT * FROM ai_units";
|
||
|
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
$res = $q->result_array();
|
||
|
|
||
|
$data[0] = 'Nothing';
|
||
|
|
||
|
foreach ($res as $row)
|
||
|
{
|
||
|
$data[$row['id']] = $row['name'];
|
||
|
}
|
||
|
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
function list_units_admin()
|
||
|
{
|
||
|
$sql = "SELECT * FROM ai_units";
|
||
|
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
return $q->result_array();
|
||
|
}
|
||
|
|
||
|
function get_unit_admin($id)
|
||
|
{
|
||
|
$sql = "SELECT * FROM ai_units WHERE id='$id'";
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
return $q->row_array();
|
||
|
}
|
||
|
|
||
|
function add_unit_admin($data)
|
||
|
{
|
||
|
$sql = "INSERT INTO ai_units
|
||
|
VALUES(default,
|
||
|
'" . $data['name'] . "',
|
||
|
'" . $data['icon'] . "',
|
||
|
'" . $data['ability'] . "',
|
||
|
'" . $data['can_carry'] . "',
|
||
|
'" . $data['attack'] . "',
|
||
|
'" . $data['defense'] . "',
|
||
|
'" . $data['rate'] . "',
|
||
|
'" . $data['per_score'] . "',
|
||
|
'" . $data['turn'] . "',
|
||
|
'" . $data['strong_against'] . "',
|
||
|
'" . $data['weak_against'] . "')";
|
||
|
|
||
|
$this->db->query($sql);
|
||
|
|
||
|
$this->_create_sql($sql);
|
||
|
}
|
||
|
|
||
|
function edit_unit_admin($data)
|
||
|
{
|
||
|
$sql = "UPDATE ai_units
|
||
|
SET name='" . $data['name'] . "',
|
||
|
icon='" . $data['icon'] . "',
|
||
|
ability='" . $data['ability'] . "',
|
||
|
can_carry='" . $data['can_carry'] . "',
|
||
|
attack='" . $data['attack'] . "',
|
||
|
defense='" . $data['defense'] . "',
|
||
|
rate='" . $data['rate'] . "',
|
||
|
per_score='" . $data['per_score'] . "',
|
||
|
turn='" . $data['turn'] . "',
|
||
|
strong_against='" . $data['strong_against'] . "',
|
||
|
weak_against='" . $data['weak_against'] . "'
|
||
|
WHERE id='" . $data['id'] . "'";
|
||
|
|
||
|
$this->db->query($sql);
|
||
|
|
||
|
$this->_create_sql($sql);
|
||
|
}
|
||
|
|
||
|
function get_settings_list_admin()
|
||
|
{
|
||
|
$sql = "SELECT * FROM ai_settings";
|
||
|
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
return $q->result_array();
|
||
|
}
|
||
|
|
||
|
function get_setting_admin($id)
|
||
|
{
|
||
|
$sql = "SELECT * FROM ai_settings WHERE id='$id'";
|
||
|
$q = $this->db->query($sql);
|
||
|
|
||
|
return $q->row_array();
|
||
|
}
|
||
|
|
||
|
function edit_setting_admin($data)
|
||
|
{
|
||
|
$sql = "UPDATE ai_settings
|
||
|
SET setting='" . $data['setting'] . "',
|
||
|
value='" . $data['value'] . "',
|
||
|
description='" . $data['description'] . "'
|
||
|
WHERE id='" . $data['id'] . "'";
|
||
|
|
||
|
$this->db->query($sql);
|
||
|
|
||
|
$this->_create_sql($sql);
|
||
|
}
|
||
|
|
||
|
function add_setting_admin($data)
|
||
|
{
|
||
|
$sql = "INSERT INTO ai_settings
|
||
|
VALUES(default,
|
||
|
'" . $data['setting'] . "',
|
||
|
'" . $data['value'] . "' ,
|
||
|
'" . $data['description'] . "')";
|
||
|
|
||
|
$this->db->query($sql);
|
||
|
|
||
|
$this->_create_sql($sql);
|
||
|
}
|
||
|
}
|
||
|
//nowhitesp
|