admin 發表於 2015-9-16 10:30:43

毁月机率将由宇宙倍率限制改为最大每次20%

原本的机率好像太难了
(倍率越高越难)

所以改成原本的
毁月机率=(100 - √月球直径 ) * ( √死星数量 )
但每次执行毁月任务
将最大只有20%成功毁月
而不是只派一次舰队就能100%毁约

就跟造月最大机率一样

这样就比较平衡
牵顾容易与太难

joy104 發表於 2015-9-16 12:57:24

完蛋哒,这样月亮会比较容易被干掉,要小心啦

admin 發表於 2015-9-16 13:12:02

joy104 發表於 2015-9-16 12:57
完蛋哒,这样月亮会比较容易被干掉,要小心啦

Else

毁月机率=(100 - √月球直径 ) * (√死星数量*宇宙倍率)

也行

admin 發表於 2015-9-16 19:01:20

$moonDestroyChance      = round((100 - sqrt($targetPlanet['diameter'])) * sqrt($fleetAttack[$this->_fleet['fleet_id']]['unit']), 1);
if($moonDestroyChance > 20)
$moonDestroyChance = 20;u1已經改成如上所示

admin 發表於 2015-9-16 20:17:13

class MissionCaseDestruction extends MissionFunctions
{
        function __construct($Fleet)
        {
                $this->_fleet        = $Fleet;
        }
       
        function TargetEvent()
        {       
                global $resource, $reslist;
               
                $fleetAttack        = array();
                $fleetDefend        = array();
               
                $userAttack                = array();
                $userDefend                = array();
               
                $stealResource        = array(
                        901        => 0,
                        902        => 0,
                        903        => 0,
                );
               
                $debris                        = array();
                $planetDebris        = array();
               
                $raportInfo                = array();
               
                $debrisRessource        = array(901, 902);
               
                $messageHTML        = <<<HTML
<div class="raportMessage">
        <table>
                <tr>
                        <td colspan="2"><a href="CombatReport.php?raport=%s" target="_blank"><span class="%s">%s %s (%s)</span></a></td>
                </tr>
                <tr>
                        <td>%s</td><td><span class="%s">%s: %s</span> <span class="%s">%s: %s</span></td>
                </tr>
                <tr>
                        <td>%s</td><td><span>%s: <span class="raportSteal element901">%s</span> </span><span>%s: <span class="raportSteal element902">%s</span> </span><span>%s: <span class="raportSteal element903">%s</span></span></td>
                </tr>
                <tr>
                        <td>%s</td><td><span>%s: <span class="raportDebris element901">%s</span> </span><span>%s: <span class="raportDebris element902">%s</span></span></td>
                </tr>
        </table>
</div>
HTML;
                //Minize HTML
                $messageHTML        = str_replace(array("\n", "\t", "\r"), "", $messageHTML);
               
                $targetPlanet         = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".PLANETS." WHERE id = '".$this->_fleet['fleet_end_id']."';");
                $targetUser           = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".USERS." WHERE id = '".$targetPlanet['id_owner']."';");
               
                $targetUser['factor']        = getFactors($targetUser, 'basic', $this->_fleet['fleet_start_time']);
                $planetUpdater        = new ResourceUpdate();
               
                list($targetUser, $targetPlanet)        = $planetUpdater->CalcResource($targetUser, $targetPlanet, true, $this->_fleet['fleet_start_time']);
               
                if($this->_fleet['fleet_group'] != 0)
                {
                        $GLOBALS['DATABASE']->query("DELETE FROM ".AKS." WHERE id = '".$this->_fleet['fleet_group']."';");
                        $incomingFleetsResult = $GLOBALS['DATABASE']->query("SELECT * FROM ".FLEETS." WHERE fleet_group = '".$this->_fleet['fleet_group']."';");
               
                        while ($incomingFleetsRow = $GLOBALS['DATABASE']->fetch_array($incomingFleetsResult))
                        {
                                $incomingFleets[$incomingFleetsRow['fleet_id']] = $incomingFleetsRow;
                        }
                       
                        $GLOBALS['DATABASE']->free_result($incomingFleetsResult);
                }
                else
                {
                        $incomingFleets = array($this->_fleet['fleet_id'] => $this->_fleet);
                }
               
                foreach($incomingFleets as $fleetID => $fleetDetail)
                {
                        $fleetAttack[$fleetID]['fleetDetail']                = $fleetDetail;
                        $fleetAttack[$fleetID]['player']                        = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".USERS." WHERE id = '".$fleetDetail['fleet_owner']."';");
                        $fleetAttack[$fleetID]['player']['factor']        = getFactors($fleetAttack[$fleetID]['player'], 'attack', $this->_fleet['fleet_start_time']);
                        $fleetAttack[$fleetID]['unit']                                = fleetAmountToArray($fleetDetail['fleet_array']);
                       
                        $userAttack[$fleetAttack[$fleetID]['player']['id']]        = $fleetAttack[$fleetID]['player']['username'];
                }
                               
                $targetFleetsResult = $GLOBALS['DATABASE']->query("SELECT * FROM ".FLEETS." WHERE fleet_mission = '5' AND fleet_end_id = '".$this->_fleet['fleet_end_id']."' AND fleet_start_time <= '".TIMESTAMP."' AND fleet_end_stay >= '".TIMESTAMP."';");
                while ($fleetDetail = $GLOBALS['DATABASE']->fetch_array($targetFleetsResult))
                {
                        $fleetID        = $fleetDetail['fleet_id'];
                       
                        $fleetDefend[$fleetID]['fleetDetail']                = $fleetDetail;
                        $fleetDefend[$fleetID]['player']                        = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".USERS." WHERE id = '".$fleetDetail['fleet_owner']."';");
                        $fleetDefend[$fleetID]['player']['factor']        = getFactors($fleetDefend[$fleetID]['player'], 'attack', $this->_fleet['fleet_start_time']);
                        $fleetDefend[$fleetID]['unit']                                = fleetAmountToArray($fleetDetail['fleet_array']);
                       
                        $userDefend[$fleetDefend[$fleetID]['player']['id']]        = $fleetDefend[$fleetID]['player']['username'];
                }
                       
                $GLOBALS['DATABASE']->free_result($targetFleetsResult);
               
                $fleetDefend['player']                        = $targetUser;
                $fleetDefend['player']['factor']        = getFactors($fleetDefend['player'], 'attack', $this->_fleet['fleet_start_time']);
                $fleetDefend['fleetDetail']                = array(
                        'fleet_start_galaxy'        => $targetPlanet['galaxy'],
                        'fleet_start_system'        => $targetPlanet['system'],
                        'fleet_start_planet'        => $targetPlanet['planet'],
                        'fleet_start_type'                => $targetPlanet['planet_type'],
                );
               
                $fleetDefend['unit']                                = array();
               
                foreach(array_merge($reslist['fleet'], $reslist['defense']) as $elementID)
                {
                        if (empty($targetPlanet[$resource[$elementID]])) continue;

                        $fleetDefend['unit'][$elementID] = $targetPlanet[$resource[$elementID]];
                }
                       
                $userDefend[$fleetDefend['player']['id']]        = $fleetDefend['player']['username'];
               
                require_once('calculateAttack.php');
               
                $fleetIntoDebris        = $GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['Fleet_Cdr'];
                $defIntoDebris                = $GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['Defs_Cdr'];
               
                $combatResult                 = calculateAttack($fleetAttack, $fleetDefend, $fleetIntoDebris, $defIntoDebris);
               
                $sqlQuery        = "";
               
                foreach ($fleetAttack as $fleetID => $fleetDetail)
                {
                        $fleetArray = '';
                        $totalCount = 0;
                       
                        $fleetDetail['unit']        = array_filter($fleetDetail['unit']);
                        foreach ($fleetDetail['unit'] as $elementID => $amount)
                        {                               
                                $fleetArray .= $elementID.','.floattostring($amount).';';
                                $totalCount += $amount;
                        }
                       
                        if($totalCount == 0)
                        {
                                if($this->_fleet['fleet_id'] == $fleetID)
                                {
                                        $this->KillFleet();
                                }
                                else
                                {
                                        $sqlQuery .= "DELETE FROM ".FLEETS." WHERE fleet_id = ".$fleetID.";";
                                        $sqlQuery .= "DELETE FROM ".FLEETS_EVENT." WHERE fleetID = ".$fleetID.";";
                                }
                               
                                $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_state = 2 WHERE fleet_id = '".$fleetID."';";
                        }
                        elseif($totalCount > 0)
                        {
                                $sqlQuery .= "UPDATE ".FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."' WHERE fleet_id = '".$fleetID."';";
                                $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."', fleet_state = 1 WHERE fleet_id = '".$fleetID."';";
                        }
                        else
                        {
                                throw new Exception("Negative Fleet amount ....");
                        }
                }
               
                foreach ($fleetDefend as $fleetID => $fleetDetail)
                {
                        if($fleetID != 0)
                        {
                                $fleetArray = '';
                                $totalCount = 0;
                               
                                $fleetDetail['unit']        = array_filter($fleetDetail['unit']);
                                foreach ($fleetDetail['unit'] as $elementID => $amount)
                                {                               
                                        $fleetArray .= $elementID.','.floattostring($amount).';';
                                        $totalCount += $amount;
                                }
                       
                                if($totalCount == 0)
                                {
                                        $sqlQuery .= "DELETE FROM ".FLEETS." WHERE fleet_id = ".$fleetID.";";
                                        $sqlQuery .= "DELETE FROM ".FLEETS_EVENT." WHERE fleetID = ".$fleetID.";";
                                        $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_state = 2 WHERE fleet_id = '".$fleetID."';";
                                }
                                elseif($totalCount > 0)
                                {
                                        $sqlQuery .= "UPDATE ".FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."' WHERE fleet_id = '".$fleetID."';";
                                        $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."', fleet_state = 1 WHERE fleet_id = '".$fleetID."';";
                                }
                                else
                                {
                                        throw new Exception("Negative Fleet amount ....");
                                }
                        }
                        else
                        {
                                $fleetArray = array();
                                foreach ($fleetDetail['unit'] as $elementID => $amount)
                                {                               
                                        $fleetArray[] = $resource[$elementID]." = ".$amount;
                                }
                               
                                if(!empty($fleetArray))
                                {
                                        $sqlQuery .= "UPDATE ".PLANETS." SET ".implode(', ', $fleetArray)." WHERE id = '".$this->_fleet['fleet_end_id']."';";
                                }
                        }
                }
               
                $GLOBALS['DATABASE']->multi_query($sqlQuery);
               
                if ($combatResult['won'] == "a")
                {
                        require_once('calculateSteal.php');
                        $stealResource = calculateSteal($fleetAttack, $targetPlanet);
                }
               
                if($this->_fleet['fleet_end_type'] == 3)
                {
                        // Use planet debris, if attack on moons
                        $targetPlanet                 = array_merge(
                                $targetPlanet,
                                $GLOBALS['DATABASE']->getFirstRow("SELECT der_metal, der_crystal FROM ".PLANETS." WHERE id_luna = ".$this->_fleet['fleet_end_id'].";")
                        );
                }
               
                foreach($debrisRessource as $elementID)
                {
                        $debris[$elementID]                        = $combatResult['debris']['attacker'][$elementID] + $combatResult['debris']['defender'][$elementID];
                        $planetDebris[$elementID]        = $targetPlanet['der_'.$resource[$elementID]] + $debris[$elementID];
                }
               
                $debrisTotal                = array_sum($debris);
               
                $raportInfo        = array(
                        'thisFleet'                                => $this->_fleet,
                        'debris'                                => $debris,
                        'stealResource'                        => $stealResource,
                        'moonChance'                        => null,
                        'moonDestroy'                        => true,
                        'moonName'                                => null,
                        'moonDestroyChance'                => null,
                        'moonDestroySuccess'        => null,
                        'fleetDestroyChance'        => null,
                        'fleetDestroySuccess'        => false,
                );

      $destext      = "";
               
                switch($combatResult['won'])
                {
                        case "a":
                                $moonDestroyChance        = round((100 - sqrt($targetPlanet['diameter'])) * sqrt($fleetAttack[$this->_fleet['fleet_id']]['unit']), 1);
                               
                                // Max 100% | Min 0%
                                $moonDestroyChance        = min($moonDestroyChance, 100);
                                $moonDestroyChance        = max($moonDestroyChance, 0);
                               
                                $randChance        = mt_rand(1, 100);
                                if ($randChance <= $moonDestroyChance)
                                {
                                        $planetID        = $GLOBALS['DATABASE']->getFirstCell("SELECT id FROM ".PLANETS." WHERE id_luna = ".$targetPlanet['id'].";");
                                        $GLOBALS['DATABASE']->multi_query("
                                        UPDATE ".FLEETS." SET
                                        fleet_start_type = 1,
                                        fleet_start_id = ".$planetID."
                                        WHERE fleet_start_id = ".$targetPlanet['id'].";
                                        UPDATE ".FLEETS." SET
                                        fleet_end_type = 1,
                                        fleet_end_id = ".$planetID.",
                                        fleet_mission = IF(fleet_mission = 9, 1, fleet_mission)
                                        WHERE fleet_end_id = ".$this->_fleet['fleet_end_id']."
                                        AND fleet_id != ".$this->_fleet['fleet_id'].";
                                        UPDATE ".PLANETS."
                                        SET id_luna = 0
                                        WHERE id_luna = ".$targetPlanet['id'].";
                                        DELETE FROM ".PLANETS."
                                        WHERE id = ".$targetPlanet['id'].";");
                                       
                                        $raportInfo['moonDestroySuccess'] = 1;
                                } else {
                                        $raportInfo['moonDestroySuccess'] = 0;
                                }
                               
                                $fleetDestroyChance        = round(sqrt($targetPlanet['diameter']) / 2);
                               
                                $randChance        = mt_rand(1, 100);
                                if ($randChance <= $fleetDestroyChance)
                                {
                                        $this->KillFleet();
                                        $raportInfo['fleetDestroySuccess'] = true;
                                }
                                else
                                {
                                        $raportInfo['fleetDestroySuccess'] = false;
                                }
                       
                       
                                $raportInfo['moonDestroyChance']        = $moonDestroyChance;
                                $raportInfo['fleetDestroyChance']        = $fleetDestroyChance;
                               
                                $attackStatus        = 'wons';
                                $defendStatus        = 'loos';
                                $attackClass        = 'raportWin';
                                $defendClass        = 'raportLose';
                        break;
                        case "w":
                                $attackStatus        = 'draws';
                                $defendStatus        = 'draws';
                                $attackClass        = 'raportDraw';
                                $defendClass        = 'raportDraw';
                                $raportInfo['moonDestroySuccess'] = -1;
                        break;
                        case "r":
                                $attackStatus        = 'loos';
                                $defendStatus        = 'wons';
                                $attackClass        = 'raportLose';
                                $defendClass        = 'raportWin';
                                $raportInfo['moonDestroySuccess'] = -1;
                        break;
                }
               
                require_once('GenerateReport.php');
                $raportData        = GenerateReport($combatResult, $raportInfo);
               
                $raportID        = md5(uniqid('', true).TIMESTAMP);
                $sqlQuery        = "INSERT INTO ".RW." SET
                rid = '".$raportID."',
                raport = '".serialize($raportData)."',
                time = '".$this->_fleet['fleet_start_time']."',
                attacker = '".implode(',', array_keys($userAttack))."',
                defender = '".implode(',', array_keys($userDefend))."';";
                $GLOBALS['DATABASE']->query($sqlQuery);
               
                $sqlQuery                = "";
                foreach($userAttack as $userID => $userName)
                {
                        $LNG                = $this->getLanguage(NULL, $userID);
                       
                        $message        = sprintf($messageHTML,
                                $raportID,
                                $attackClass,
                                $LNG['sys_mess_attack_report'],
                                sprintf(
                                        $LNG['sys_adress_planet'],
                                        $this->_fleet['fleet_end_galaxy'],
                                        $this->_fleet['fleet_end_system'],
                                        $this->_fleet['fleet_end_planet']
                                ),
                                $LNG['type_planet_short'][$this->_fleet['fleet_end_type']],
                                $LNG['sys_lost'],
                                $attackClass,
                                $LNG['sys_attack_attacker_pos'],
                                pretty_number($combatResult['unitLost']['attacker']),
                                $defendClass,
                                $LNG['sys_attack_defender_pos'],
                                pretty_number($combatResult['unitLost']['defender']),
                                $LNG['sys_gain'],
                                $LNG['tech'],
                                pretty_number($stealResource),
                                $LNG['tech'],
                                pretty_number($stealResource),
                                $LNG['tech'],
                                pretty_number($stealResource),
                                $LNG['sys_debris'],
                                $LNG['tech'],
                                pretty_number($debris),
                                $LNG['tech'],
                                pretty_number($debris)
                        );
                               
                        SendSimpleMessage($userID, 0, $this->_fleet['fleet_start_time'], 3, $LNG['sys_mess_tower'], $LNG['sys_mess_attack_report'], $message);
                       
                        $sqlQuery        .= "INSERT INTO ".TOPKB_USERS." SET ";
                        $sqlQuery        .= "rid = '".$raportID."', ";
                        $sqlQuery        .= "role = 1, ";
                        $sqlQuery        .= "username = '".$GLOBALS['DATABASE']->escape($userName)."', ";
                        $sqlQuery        .= "uid = ".$userID.";";
                }
               
               
                foreach($userDefend as $userID => $userName)
                {
                        $LNG                = $this->getLanguage(NULL, $userID);
                       
                        $message        = sprintf($messageHTML,
                                $raportID,
                                $defendClass,
                                $LNG['sys_mess_attack_report'],
                                sprintf(
                                        $LNG['sys_adress_planet'],
                                        $this->_fleet['fleet_end_galaxy'],
                                        $this->_fleet['fleet_end_system'],
                                        $this->_fleet['fleet_end_planet']
                                ),
                                $LNG['type_planet_short'][$this->_fleet['fleet_end_type']],
                                $LNG['sys_lost'],
                                $defendClass,
                                $LNG['sys_attack_attacker_pos'],
                                pretty_number($combatResult['unitLost']['attacker']),
                                $attackClass,
                                $LNG['sys_attack_defender_pos'],
                                pretty_number($combatResult['unitLost']['defender']),
                                $LNG['sys_gain'],
                                $LNG['tech'],
                                pretty_number($stealResource),
                                $LNG['tech'],
                                pretty_number($stealResource),
                                $LNG['tech'],
                                pretty_number($stealResource),
                                $LNG['sys_debris'],
                                $LNG['tech'],
                                pretty_number($debris),
                                $LNG['tech'],
                                pretty_number($debris)
                        );
                               
                        SendSimpleMessage($userID, 0, $this->_fleet['fleet_start_time'], 3, $LNG['sys_mess_tower'], $LNG['sys_mess_attack_report'], $message);
                       
                        $sqlQuery        .= "INSERT INTO ".TOPKB_USERS." SET ";
                        $sqlQuery        .= "rid = '".$raportID."', ";
                        $sqlQuery        .= "role = 2, ";
                        $sqlQuery        .= "username = '".$GLOBALS['DATABASE']->escape($userName)."', ";
                        $sqlQuery        .= "uid = ".$userID.";";
                }
               
                if($this->_fleet['fleet_end_type'] == 3)
                {
                        $debrisType        = 'id_luna';
                }
                else
                {
                        $debrisType        = 'id';
                }
               
                $sqlQuery        .= "UPDATE ".PLANETS." SET
                                                der_metal = ".$planetDebris.",
                                                der_crystal = ".$planetDebris."
                                                WHERE
                                                ".$debrisType." = ".$this->_fleet['fleet_end_id'].";
                                                UPDATE ".PLANETS." SET
                                                metal = metal - ".$stealResource.",
                                                crystal = crystal - ".$stealResource.",
                                                deuterium = deuterium - ".$stealResource."
                                                WHERE
                                                id = ".$this->_fleet['fleet_end_id'].";
                                                INSERT INTO ".TOPKB." SET
                                                units = ".($combatResult['unitLost']['attacker'] + $combatResult['unitLost']['defender']).",
                                                rid = '".$raportID."',
                                                time = ".$this->_fleet['fleet_start_time'].",
                                                universe = ".$this->_fleet['fleet_universe'].",
                                                result = '".$combatResult['won'] ."';
                                                UPDATE ".USERS." SET
                                                ".$attackStatus." = ".$attackStatus." + 1,
                                                kbmetal = kbmetal + ".$debris.",
                                                kbcrystal = kbcrystal + ".$debris.",
                                                lostunits = lostunits + ".$combatResult['unitLost']['attacker'].",
                                                desunits = desunits + ".$combatResult['unitLost']['defender']."
                                                WHERE
                                                id IN (".implode(',', array_keys($userAttack)).");
                                                UPDATE ".USERS." SET
                                                ".$defendStatus." = ".$defendStatus." + 1,
                                                kbmetal = kbmetal + ".$debris.",
                                                kbcrystal = kbcrystal + ".$debris.",
                                                lostunits = lostunits + ".$combatResult['unitLost']['defender'].",
                                                desunits = desunits + ".$combatResult['unitLost']['attacker']."
                                                WHERE
                                                id IN (".implode(',', array_keys($userDefend)).");";
                                               
                $GLOBALS['DATABASE']->multi_query($sqlQuery);
               
                $this->setState(FLEET_RETURN);
                $this->SaveFleet();
        }
       
        function EndStayEvent()
        {
                return;
        }
       
        function ReturnEvent()
        {
                $LNG                = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
                $TargetName        = $GLOBALS['DATABASE']->getFirstCell("SELECT name FROM ".PLANETS." WHERE id = ".$this->_fleet['fleet_start_id'].";");
                $Message        = sprintf($LNG['sys_fleet_won'], $TargetName, GetTargetAdressLink($this->_fleet, ''), pretty_number($this->_fleet['fleet_resource_metal']), $LNG['tech'], pretty_number($this->_fleet['fleet_resource_crystal']), $LNG['tech'], pretty_number($this->_fleet['fleet_resource_deuterium']), $LNG['tech']);

                SendSimpleMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_time'], 3, $LNG['sys_mess_tower'], $LNG['sys_mess_fleetback'], $Message);
                       
                $this->RestoreFleet();
        }
}

kubashen 發表於 2015-12-21 09:44:36

a950216t 發表於 2015-9-16 20:17


大大。U4也是这样么?加不加宇宙倍率?
頁: [1]
檢視完整版本: 毁月机率将由宇宙倍率限制改为最大每次20%