성공 확률, 'fail' => 실패 확률) */ function CriticalRatioDomestic(&$general, $type) { $leader = getGeneralLeadership($general, false, true, true, false); $power = getGeneralPower($general, false, true, true, false); $intel = getGeneralIntel($general, false, true, true, false); $avg = ($leader+$power+$intel) / 3; /* * 능력치가 높아질 수록 성공 확률 감소. 실패 확률도 감소 * 무력 내정 기준(지력 내정 방식과 구조 동일) 756510(32%/30%), 707010(28%/25%), 657510(23%/20%) 106575(23%/20%), 107070(20%/17%), 107565(17%/15%) 506040(33%/30%), 505050(43%/40%), 504060(50%/50%) * 통솔 내정 기준 756510(25%/22%), 707010(31%/28%), 657510(38%,35%), 505050(50%,50%), 107070(50%,50%) */ switch($type) { case 'leader': case 0: $ratio = $avg / $leader; break; case 'power': case 1: $ratio = $avg / $power; break; case 'intel': case 2: $ratio = $avg / $intel; break; default: throw new MustNotBeReachedException(); } $ratio = min($ratio, 1.2); $fail = pow($ratio / 1.2, 1.4) - 0.3; $success = pow($ratio / 1.2, 1.5) - 0.25; $fail = min(max($fail, 0), 0.5); $success = min(max($success, 0), 0.5); return array( 'success'=>$success, 'fail'=>$fail ); } /** * 수뇌직 통솔 보너스 계산 * * @param array &$general 장수 정보. 'lbonus' 값에 통솔 보너스가 입력 됨 * @param int $nationLevel 국가 등급 * * @return int 계산된 $general['lbonus'] 값 */ function setLeadershipBonus(&$general, $nationLevel){ if($general['level'] == 12) { $lbonus = $nationLevel * 2; } elseif($general['level'] >= 5) { $lbonus = $nationLevel; } else { $lbonus = 0; } $general['lbonus'] = $lbonus; return $lbonus; } function CriticalScoreEx(string $type):float { if($type == 'success'){ return Util::randRange(2.2, 3.0); } if($type == 'fail'){ return Util::randRange(0.2, 0.4); } return 1; } function process_domestic(array $rawGeneral, int $type){ $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); $env = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']); $general = new General($rawGeneral, null, $env['year'], $env['month']); //TODO: 최종적으로는 클래스 명 그대로 가야함 $commandMap = [ 1=>'Command\che_농지개간', 2=>'Command\che_상업투자', 3=>'Command\che_기술연구', 4=>'Command\che_주민선정', 5=>'Command\che_수비강화', 6=>'Command\che_성벽보수', 7=>'Command\che_정착장려', 8=>'Command\che_치안강화', 9=>'Command\che_물자조달', ]; $cmdClass = $commandMap[$type]??null; if(!$cmdClass){ throw new \InvalidArgumentException('잘못된 내정 코드'); } $cmdObj = new $cmdClass($general, $env); if(!$cmdObj->isRunnable()){ return; } $cmdObj->run(); } function process_48(&$general) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); $connect=$db->get(); $log = []; $alllog = []; $history = []; $date = substr($general['turntime'],11,5); $admin = $gameStor->getValues(['year', 'month']); $city = getCity($general['city']); $command = DecodeCommand($general['turn0']); $type = $command[1]; if($type < 100) { $isweap = 0; } elseif($type < 200) { $type -= 100; $isweap = 1; } elseif($type < 300) { $type -= 200; $isweap = 2; } elseif($type < 400) { $type -= 300; $isweap = 3; } else { $type = 7; } if($isweap == 3) { $cost = getItemCost2($type); } else { $cost = getItemCost($type); } if($city['trade'] == 0) { $log[] = "●{$admin['month']}월:도시에 상인이 없습니다. 장비매매 실패. <1>$date"; } elseif($city['secu']/1000 < $type) { $log[] = "●{$admin['month']}월:이 도시에서는 구할 수 없었습니다. 구입 실패. <1>$date"; } elseif($type > 6 || $type < 0) { $log[] = "●{$admin['month']}월:구입할 수 있는 물건이 아닙니다. 구입 실패. <1>$date"; } elseif($general['gold'] < $cost && $type != 0) { $log[] = "●{$admin['month']}월:자금이 모자랍니다. 구입 실패. <1>$date"; } elseif($general['weap'] == 0 && $isweap == 0 && $type == 0) { $log[] = "●{$admin['month']}월:무기가 없습니다. 판매 실패. <1>$date"; } elseif($general['book'] == 0 && $isweap == 1 && $type == 0) { $log[] = "●{$admin['month']}월:서적이 없습니다. 판매 실패. <1>$date"; } elseif($general['horse'] == 0 && $isweap == 2 && $type == 0) { $log[] = "●{$admin['month']}월:명마가 없습니다. 판매 실패. <1>$date"; } elseif($general['item'] == 0 && $isweap == 3 && $type == 0) { $log[] = "●{$admin['month']}월:도구가 없습니다. 판매 실패. <1>$date"; } else { if($isweap == 0) { if($type != 0) { $josaUl = JosaUtil::pick(getWeapName($type), '을'); $log[] = "●{$admin['month']}월:".getWeapName($type)."{$josaUl} 구입했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',weap='$type',gold=gold-'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } else { $cost = Util::round(getItemCost($general['weap']) / 2); $josaUl = JosaUtil::pick(getWeapName($general['weap']), '을'); $log[] = "●{$admin['month']}월:".getWeapName($general['weap'])."{$josaUl} 판매했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',weap='0',gold=gold+'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } } elseif($isweap == 1) { if($type != 0) { $josaUl = JosaUtil::pick(getBookName($type), '을'); $log[] = "●{$admin['month']}월:".getBookName($type)."{$josaUl} 구입했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',book='$type',gold=gold-'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } else { $cost = Util::round(getItemCost($general['book']) / 2); $josaUl = JosaUtil::pick(getBookName($general['book']), '을'); $log[] = "●{$admin['month']}월:".getBookName($general['book'])."{$josaUl} 판매했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',book='0',gold=gold+'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } } elseif($isweap == 2) { if($type != 0) { $josaUl = JosaUtil::pick(getHorseName($type), '을'); $log[] = "●{$admin['month']}월:".getHorseName($type)."{$josaUl} 구입했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',horse='$type',gold=gold-'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } else { $cost = Util::round(getItemCost($general['horse']) / 2); $josaUl = JosaUtil::pick(getHorseName($general['horse']), '을'); $log[] = "●{$admin['month']}월:".getHorseName($general['horse'])."{$josaUl} 판매했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',horse='0',gold=gold+'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } } elseif($isweap == 3) { if($type != 0) { $josaUl = JosaUtil::pick(getItemName($type), '을'); $log[] = "●{$admin['month']}월:".getItemName($type)."{$josaUl} 구입했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',item='$type',gold=gold-'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } else { $cost = Util::round(getItemCost2($general['item']) / 2); $josaUl = JosaUtil::pick(getItemName($general['item']), '을'); $log[] = "●{$admin['month']}월:".getItemName($general['item'])."{$josaUl} 판매했습니다. <1>$date"; $query = "update general set resturn='SUCCESS',item='0',gold=gold+'$cost' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } } } $exp = 10; $ded = 0; // 성격 보정 $exp = CharExperience($exp, $general['personal']); $ded = CharDedication($ded, $general['personal']); // 명성 상승 $query = "update general set experience=experience+'$exp' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); pushGenLog($general, $log); } function process_49(&$general) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); $connect=$db->get(); $log = []; $alllog = []; $history = []; $date = substr($general['turntime'],11,5); $admin = $gameStor->getValues(['year', 'month']); $nation = getNationStaticInfo($general['nation']); $city = getCity($general['city']); $command = DecodeCommand($general['turn0']); $type = $command[2]; $amount = $command[1]; $amount *= 100; if($type != 1 && $type != 2) { $type = 1; } if($amount < 100) { $amount = 100; } elseif($amount > 10000) { $amount = 10000; } if($city['trade'] == 0 && $general['npc'] >= 2) { $city['trade'] = 100; } // 거상 f배 이득시 금 계산 // a : 쌀, b : 물가, f : 배수, c : 금 // (0.7 ~1.3) : c = a((1+f)b-f) // (0.99~1.01) : c = a((1-f)b+f) if($type == 1) { $dtype = "군량 판매"; if($general['rice'] < $amount) { $amount = $general['rice']; } $cost = $amount * $city['trade'] / 100; $tax = $cost * GameConst::$exchangeFee; $cost = $cost - $tax; } elseif($type == 2) { $dtype = "군량 구입"; $cost = $amount * $city['trade'] / 100; $tax = $cost * GameConst::$exchangeFee; $cost = $cost + $tax; if($general['gold'] < $cost) { $cost = $general['gold']; $tax = $cost * GameConst::$exchangeFee; $amount = ($cost-$tax) * 100 / $city['trade']; } } $cost = Util::round($cost); $amount = Util::round($amount); $tax = Util::round($tax); if($city['trade'] == 0 && $general['npc'] < 2) { $log[] = "●{$admin['month']}월:도시에 상인이 없습니다. $dtype 실패. <1>$date"; } elseif($general['nation'] != $city['nation'] && $nation['level'] != 0) { $log[] = "●{$admin['month']}월:아국이 아닙니다. $dtype 실패. <1>$date"; } elseif($city['supply'] == 0) { $log[] = "●{$admin['month']}월:고립된 도시입니다. $dtype 실패. <1>$date"; } elseif($type == 1 && $general['rice'] <= 0) { $log[] = "●{$admin['month']}월:군량이 없습니다. $dtype 실패. <1>$date"; } elseif($type == 2 && $general['gold'] <= 0) { $log[] = "●{$admin['month']}월:자금이 없습니다. $dtype 실패. <1>$date"; } else { // 판매 if($type == 1) { $log[] = "●{$admin['month']}월:군량 $amount을 팔아 자금 $cost을 얻었습니다. <1>$date"; // 군량 감소 $query = "update general set rice=rice-{$amount} where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 자금 증가 $query = "update general set gold=gold+{$cost} where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 구입 } elseif($type == 2) { $log[] = "●{$admin['month']}월:군량 $amount을 사서 자금 $cost을 썼습니다. <1>$date"; // 군량 증가 $query = "update general set rice=rice+{$amount} where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 자금 감소 $query = "update general set gold=gold-{$cost} where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } // 세금 국고로 $query = "update nation set gold=gold+'$tax' where nation='{$general['nation']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $exp = 30; $ded = 50; // 성격 보정 $exp = CharExperience($exp, $general['personal']); $ded = CharDedication($ded, $general['personal']); // 공헌도, 명성 상승 $query = "update general set resturn='SUCCESS',dedication=dedication+'$ded', experience=experience+'$exp' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 경험치 상승 switch(Util::choiceRandomUsingWeight([$general['leader'], $general['power'], $general['intel']])) { case 0: $general['leader2']++; $query = "update general set leader2='{$general['leader2']}' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); break; case 1: $general['power2']++; $query = "update general set power2='{$general['power2']}' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); break; case 2: $general['intel2']++; $query = "update general set intel2='{$general['intel2']}' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); break; } $log = checkAbility($general, $log); } pushGenLog($general, $log); }