queryFirstField('select no from general where owner = %i', $userID);
if(!$generalID && $forceExit){
header('Location:..');
die();
}
if($generalID && $countLogin){
//로그인으로 처리
//XXX: 'get' 함수인데 update가 들어가있다.
//TODO: 조금더 적절한 형태의 로그인 카운트를 생각해볼 것
$query=$db->query("update general set logcnt=logcnt+1 ,ip = %s_ip,lastconnect=%s_lastConnect,conmsg=%s_conmsg where owner= %s_userID",[
'ip' => getenv("REMOTE_ADDR"),
'lastConnect' => date('Y-m-d H:i:s'),
'conmsg' => util::array_get($_SESSION['conmsg'], ''),
'userID' => $userID
]);
$_SESSION[$idKey] = $generalID;
}
return $generalID;
}
/**
* 로그인한 유저의 장수명을 받아옴
*
* @return string|null
*/
function getGeneralName($forceExit=false)
{
$generalID = getGeneralID();
if(!$generalID){
if($forceExit){
header('Location:..');
die();
}
return null;
}
$nameKey = getServPrefix().'p_name';
$generalName = util::array_get($_SESSION[$nameKey], null);
if($generalName){
return $generalName;
}
//흠?
$generalName = getDB()->queryFirstField('select name from general where no = %i', $generalID);
if(!$generalName){
//이게 말이 돼?
resetSessionGeneralValues();
if($forceExit){
header('Location:..');
die();
}
}
if($generalName){
$_SESSION[$nameKey] = $generalName;
}
return $generalName;
}
/**
* nationID를 이용하여 국가의 '어지간해선' 변경되지 않는 정보(이름, 색, 성향, 규모, 수도)를 반환해줌
*
* @param int|null $nationID 국가 코드, -1인 경우 전체, null인 경우 수행하지 않음
* @param bool $forceRefresh 강제 갱신 여부
*
* @return array|null nationID에 해당하는 국가가 있을 경우 array 반환. 그외의 경우 null
*/
function getNationStaticInfo($nationID, $forceRefresh=false)
{
static $nationList = null;
if ($forceRefresh) {
$nationList = null;
}
if($nationID === null || $nationID == 0){
return null;
}
if($nationList === null){
$nationAll = getDB()->query("select nation, name, color, type, level, capital from nation");
$nationList = ArrayToDict($nationAll, "nation");
$nationList[-1] = $nationAll;
}
if(isset($nationList[$nationID])){
return $nationList[$nationID];
}
return null;
}
/**
* getNationStaticInfo() 함수의 국가 캐시를 초기화
*/
function refreshNationStaticInfo(){
getNationStaticInfo(null, true);
}
/**
* getNationStaticInfo(-1) 의 단축형
*/
function getAllNationStaticInfo(){
return getNationStaticInfo(-1);
}
function GetImageURL($imgsvr) {
global $image, $image1;
if($imgsvr == 0) {
return $image;
} else {
return $image1;
}
}
/**
* generalID를 이용해 각 서버 등록 여부를 확인함
*
* FIXME: 현재의 구현으로는 session에 p_no가 남아있지만 general 테이블에서는 삭제되어있는 진풍경(!)이 펼쳐질 수도 있음.
* 장수가 사망했을 때에 바로 테이블에서 삭제하는 것이 아니라 삭제 플래그를 설정하는 것이 나을 것임.
* (퀘 섭등 NPC가 빙의할 경우에도 마찬가지!)
*
* 세팅된 플래그는 새롭게 장수를 생성하거나, 새로 빙의할 때 초기화하는 것이 적절한 해결책일 것.
*
* @return bool
*/
function isSigned(){
$generalID = getGeneralID();
if(!$generalID){
return false;
}
return true;
}
function checkLimit($con, $conlimit) {
if(getUserGrade()>=4){
return 0;
}
if($con > $conlimit) {
return 2;
//접속제한 90%이면 경고문구
} elseif($con > $conlimit * 0.9) {
return 1;
} else {
return 0;
}
}
function getBlockLevel() {
return getDB()->queryFirstField('select block from general where no = %i', getGeneralID());
}
function getRandGenName() {
$first = array('가', '간', '감', '강', '고', '공', '공손', '곽', '관', '괴', '교', '금', '노', '뇌', '능', '도', '동', '두',
'등', '마', '맹', '문', '미', '반', '방', '부', '비', '사', '사마', '서', '설', '성', '소', '손', '송', '순', '신', '심',
'악', '안', '양', '엄', '여', '염', '오', '왕', '요', '우', '원', '위', '유', '육', '윤', '이', '장', '저', '전', '정',
'제갈', '조', '종', '주', '진', '채', '태사', '하', '하후', '학', '한', '향', '허', '호', '화', '황',
'공손', '손', '왕', '유', '장', '조');
$last = array('가', '간', '강', '거', '건', '검', '견', '경', '공', '광', '권', '규', '녕', '단', '대', '도', '등', '람',
'량', '례', '로', '료', '모', '민', '박', '범', '보', '비', '사', '상', '색', '서', '소', '속', '송', '수', '순', '습',
'승', '양', '연', '영', '온', '옹', '완', '우', '웅', '월', '위', '유', '윤', '융', '이', '익', '임', '정', '제', '조',
'주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해', '혁', '현', '화', '환', '회', '횡',
'후', '훈', '휴', '흠', '흥');
$firstname = $first[rand()%count($first)];
$lastname = $last[rand()%count($last)];
$fullname = "{$firstname}{$lastname}";
return $fullname;
}
function cityInfo($connect) {
global $_basecolor, $_basecolor2, $images;
$query = "select no,city,skin from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
// 도시 정보
$city = getCity($connect, $me['city']);
$nation = getNationStaticInfo($city['nation']);
$pop = $city['pop'] / $city['pop2'] * 100;
$rate = $city['rate'];
$agri = $city['agri'] / $city['agri2'] * 100;
$comm = $city['comm'] / $city['comm2'] * 100;
$secu = $city['secu'] / $city['secu2'] * 100;
$def = $city['def'] / $city['def2'] * 100;
$wall = $city['wall'] / $city['wall2'] * 100;
if($city['trade'] == 0) {
$trade = 0;
$tradeStr = "상인없음";
} else {
$trade = ($city['trade']-95) * 10;
$tradeStr = $city['trade'] . "%";
}
if($nation['color'] == "" || $me['skin'] < 1) { $nation['color'] = "000000"; }
echo "
【 ".getRegion($city['region'])." | ".getCityLevel($city['level'])." 】 {$city['name']}
";
if($city['nation'] == 0) {
echo "공 백 지";
} else {
echo "지배 국가 【 {$nation['name']} 】";
}
if($city['gen1'] > 0) {
$query = "select name from general where no='{$city['gen1']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1 = MYDB_fetch_array($result);
} else {
$gen1['name'] = '-';
}
if($city['gen2'] > 0) {
$query = "select name from general where no='{$city['gen2']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen2 = MYDB_fetch_array($result);
} else {
$gen2['name'] = '-';
}
if($city['gen3'] > 0) {
$query = "select name from general where no='{$city['gen3']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen3 = MYDB_fetch_array($result);
} else {
$gen3['name'] = '-';
}
echo "
주민
".bar($pop, $me['skin'])."
민심
".bar($rate, $me['skin'])."
태수
{$gen1['name']}
{$city['pop']}/{$city['pop2']}
{$city['rate']}
농업
".bar($agri, $me['skin'])."
상업
".bar($comm, $me['skin'])."
치안
".bar($secu, $me['skin'])."
군사
{$gen2['name']}
{$city['agri']}/{$city['agri2']}
{$city['comm']}/{$city['comm2']}
{$city['secu']}/{$city['secu2']}
수비
".bar($def, $me['skin'])."
성벽
".bar($wall, $me['skin'])."
시세
".bar($trade, $me['skin'])."
시중
{$gen3['name']}
{$city['def']}/{$city['def2']}
{$city['wall']}/{$city['wall2']}
{$tradeStr}
";
}
function myNationInfo($connect) {
global $_basecolor, $_basecolor2, $images;
$query = "select startyear,year from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$query = "select skin,no,nation from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select nation,name,color,power,msg,gold,rice,bill,rate,scout,war,tricklimit,surlimit,tech,totaltech,level,type from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select COUNT(*) as cnt, SUM(pop) as totpop, SUM(pop2) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select COUNT(*) as cnt, SUM(crew) as totcrew,SUM(leader)*100 as maxcrew from general where nation='{$nation['nation']}'"; // 장수 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$query = "select name from general where nation='{$nation['nation']}' and level='12'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level12 = MYDB_fetch_array($genresult);
$query = "select name from general where nation='{$nation['nation']}' and level='11'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level11 = MYDB_fetch_array($genresult);
echo "
【재 야】"; }
else { echo "style=font-weight:bold;font-size:13px;>국가【 {$nation['name']} 】"; }
} else {
if($me['nation'] == 0) { echo "style=color:white;background-color:000000;font-weight:bold;font-size:13px;>【재 야】"; }
else { echo "style=color:".newColor($nation['color']).";background-color:{$nation['color']};font-weight:bold;font-size:13px;>국가【 {$nation['name']} 】"; }
}
echo "
성 향
".getNationType($nation['type'])." (".getNationType2($nation['type']).")
".getLevel(12, $nation['level'])."
";echo $level12==''?"-":"{$level12['name']}"; echo "
".getLevel(11, $nation['level'])."
";echo $level11==''?"-":"{$level11['name']}"; echo "
총주민
";echo $me['nation']==0?"해당 없음":"{$city['totpop']}/{$city['maxpop']}";echo "
총병사
";echo $me['nation']==0?"해당 없음":"{$general['totcrew']}/{$general['maxcrew']}"; echo "
국 고
";echo $me['nation']==0?"해당 없음":"{$nation['gold']}";echo "
병 량
";echo $me['nation']==0?"해당 없음":"{$nation['rice']}";echo "
지급율
";
if($me['nation'] == 0) {
echo "해당 없음";
} else {
echo $nation['bill']==0?"0 %":"{$nation['bill']} %";
}
echo "
세 율
";
if($me['nation'] == 0) {
echo "해당 없음";
} else {
echo $nation['rate']==0?"0 %":"{$nation['rate']} %";
}
$techCall = getTechCall($nation['tech']);
if(TechLimit($admin['startyear'], $admin['year'], $nation['tech'])) { $nation['tech'] = "{$nation['tech']} "; }
else { $nation['tech'] = "{$nation['tech']} "; }
$nation['tech'] = "$techCall / {$nation['tech']}";
if($me['nation']==0){
$nation['tricklimit'] = "해당 없음 ";
$nation['surlimit'] = "해당 없음 ";
$nation['scout'] = "해당 없음 ";
$nation['war'] = "해당 없음 ";
$nation['power'] = "해당 없음 ";
} else {
if($nation['tricklimit'] != 0) { $nation['tricklimit'] = "{$nation['tricklimit']}턴 "; }
else { $nation['tricklimit'] = "가 능 "; }
if($nation['surlimit'] != 0) { $nation['surlimit'] = "{$nation['surlimit']}턴 "; }
else { $nation['surlimit'] = "가 능 "; }
if($nation['scout'] != 0) { $nation['scout'] = "금 지 "; }
else { $nation['scout'] = "허 가 "; }
if($nation['war'] != 0) { $nation['war'] = "금 지 "; }
else { $nation['war'] = "허 가 "; }
}
if($me['skin'] == 0) {
$nation['tech'] = unfont($nation['tech']);
$nation['tricklimit'] = unfont($nation['tricklimit']);
$nation['surlimit'] = unfont($nation['surlimit']);
$nation['scout'] = unfont($nation['scout']);
$nation['war'] = unfont($nation['war']);
}
echo "
속 령
";echo $me['nation']==0?"-":"{$city['cnt']}"; echo "
장 수
";echo $me['nation']==0?"-":"{$general['cnt']}"; echo "
국 력
{$nation['power']}
기술력
";echo $me['nation']==0?"-":"{$nation['tech']}"; echo "
전 략
{$nation['tricklimit']}
외 교
{$nation['surlimit']}
임 관
{$nation['scout']}
전 쟁
{$nation['war']}
";
}
function addCommand($typename, $value, $valid = 1, $color=0) {
if($valid == 1) {
switch($color) {
case 0:
echo "
{$typename} ";
break;
case 1:
echo "
{$typename} ";
break;
case 2:
echo "
{$typename} ";
break;
}
} else {
echo "
{$typename} ";
}
}
function commandGroup($typename, $type=0) {
if($type == 0) {
echo "
";
} else {
echo "
";
}
}
function commandTable($connect) {
$query = "select startyear,year,develcost,scenario from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$query = "select no,npc,troop,city,nation,level,crew,makelimit,special from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$troop = getTroop($connect, $me['troop']);
$city = getCity($connect, $me['city']);
$nationcount = count(getAllNationStaticInfo());
$query = "select city from city where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
$query = "select no from general where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$nation = getNationStaticInfo($me['nation']);
$develcost = $admin['develcost'];
$develcostA = $admin['develcost']; $colorA = 0;
$develcostB = $admin['develcost']; $colorB = 0;
$develcostC = $admin['develcost']; $colorC = 0;
$develcostD = $admin['develcost']; $colorD = 0;
$develcostE = $admin['develcost']*2; $colorE = 0;
$develcost3 = $admin['develcost']*3;
$develcost5 = $admin['develcost']*5;
// 농상 국가보정
if($nation['type'] == 2 || $nation['type'] == 12) { $develcostA *= 0.8; $colorA = 1; }
if($nation['type'] == 8 || $nation['type'] == 11) { $develcostA *= 1.2; $colorA = 2; }
// 기술 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $develcostB *= 0.8; $colorB = 1; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $develcostB *= 1.2; $colorB = 2; }
// 수성 국가보정
if($nation['type'] == 3 || $nation['type'] == 5 || $nation['type'] == 10 || $nation['type'] == 11) { $develcostC *= 0.8; $colorC = 1; }
if($nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 13) { $develcostC *= 1.2; $colorC = 2; }
// 치안 국가보정
if($nation['type'] == 1 || $nation['type'] == 4) { $develcostD *= 0.8; $colorD = 1; }
if($nation['type'] == 6 || $nation['type'] == 9) { $develcostD *= 1.2; $colorD = 2; }
// 민심,정착장려 국가보정
if($nation['type'] == 2 || $nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 10) { $develcostE *= 0.8; $colorE = 1; }
if($nation['type'] == 1 || $nation['type'] == 3 || $nation['type'] == 9) { $develcostE *= 1.2; $colorE = 2; }
$develcostA = round($develcostA);
$develcostB = round($develcostB);
$develcostC = round($develcostC);
$develcostD = round($develcostD);
$develcostE = round($develcostE);
echo "
";
addCommand("휴 식", 0);
addCommand("요 양", 50);
commandGroup("========= 내 정 ==========");
if($me['level'] >= 1 && ($citycount != 0 || $admin['year'] >= $admin['startyear']+3) && $city['supply'] != 0) {
addCommand("농지개간(지력경험, 자금$develcostA)", 1, 1, $colorA);
addCommand("상업투자(지력경험, 자금$develcostA)", 2, 1, $colorA);
addCommand("기술연구(지력경험, 자금$develcostB)", 3, 1, $colorB);
addCommand("수비강화(무력경험, 자금$develcostC)", 5, 1, $colorC);
addCommand("성벽보수(무력경험, 자금$develcostC)", 6, 1, $colorC);
addCommand("치안강화(무력경험, 자금$develcostD)", 8, 1, $colorD);
addCommand("정착장려(통솔경험, 군량$develcostE)", 7, 1, $colorE);
addCommand("주민선정(통솔경험, 군량$develcostE)", 4, 1, $colorE);
} else {
addCommand("농지개간(지력경험, 자금$develcostA)", 1, 0);
addCommand("상업투자(지력경험, 자금$develcostA)", 2, 0);
addCommand("기술연구(지력경험, 자금$develcostB)", 3, 0);
addCommand("수비강화(무력경험, 자금$develcostC)", 5, 0);
addCommand("성벽보수(무력경험, 자금$develcostC)", 6, 0);
addCommand("치안강화(무력경험, 자금$develcostD)", 8, 0);
addCommand("정착장려(통솔경험, 군량$develcostE)", 7, 0);
addCommand("주민선정(통솔경험, 군량$develcostE)", 4, 0);
}
if($me['level'] >= 1 && (($nation['level'] > 0 && $city['nation'] == $me['nation'] && $city['supply'] != 0) || $nation['level'] == 0)) {
addCommand("물자조달(랜덤경험)", 9, 1);
} else {
addCommand("물자조달(랜덤경험)", 9, 0);
}
commandGroup("", 1);
commandGroup("========= 군 사 ==========");
if($me['level'] >= 1 && $citycount > 0) {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31);
addCommand("징병(통솔경험)", 11);
addCommand("모병(통솔경험, 자금x2)", 12);
addCommand("훈련(통솔경험, 사기↓)", 13);
addCommand("사기진작(통솔경험, 자금↓)", 14);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15);
addCommand("출병", 16);
} else {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31, 0);
addCommand("징병(통솔경험)", 11, 0);
addCommand("모병(통솔경험, 자금x2)", 12, 0);
addCommand("훈련(통솔경험, 사기↓)", 13, 0);
addCommand("사기진작(통솔경험, 자금↓)", 14, 0);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15, 0);
addCommand("출병", 16, 0);
}
if($me['crew'] > 0) {
addCommand("소집해제(병사↓, 주민↑)", 17);
} else {
addCommand("소집해제(병사↓, 주민↑)", 17, 0);
}
commandGroup("", 1);
commandGroup("========= 인 사 ==========");
addCommand("이동(통솔경험, 자금$develcost, 사기↓)", 21);
addCommand("강행(통솔경험, 자금$develcost5, 병력/사기/훈련↓)", 30);
if($nation['level'] > 0 && $me['level'] >= 1) {
addCommand("인재탐색(랜덤경험, 자금$develcost)", 29);
} else {
addCommand("인재탐색(랜덤경험, 자금$develcost)", 29, 0);
}
//TODO:등용장 재 디자인
//xxx:등용장 일단 끔
/*
if($me['level'] >= 1 && $city['supply'] != 0) {
addCommand("등용(자금{$develcost5}+장수가치)", 22);
} else {
addCommand("등용(자금{$develcost5}+장수가치)", 22, 0);
}
*/
if($me['no'] == $troop['no'] && $citycount > 0 && $city['supply'] != 0 && $city['nation'] == $me['nation']) {
addCommand("집합(통솔경험)", 26);
} else {
addCommand("집합(통솔경험)", 26, 0);
}
if($me['level'] >= 1 && $me['level'] <= 12 && $nation['level'] > 0) {
addCommand("귀환(통솔경험)", 28);
} else {
addCommand("귀환(통솔경험)", 28, 0);
}
if($me['level'] == 0 && $nationcount != 0 && $me['makelimit'] == 0) {
addCommand("임관", 25);
} else {
addCommand("임관", 25, 0);
}
commandGroup("", 1);
commandGroup("========= 계 략 ==========");
if($me['level'] >= 1 && (($nation['level'] > 0 && $city['nation'] == $me['nation'] && $city['supply'] != 0) || $nation['level'] == 0)) {
addCommand("화계(지력경험, 자금$develcost5, 군량$develcost5)", 32);
addCommand("탈취(무력경험, 자금$develcost5, 군량$develcost5)", 33);
addCommand("파괴(무력경험, 자금$develcost5, 군량$develcost5)", 34);
addCommand("선동(통솔경험, 자금$develcost5, 군량$develcost5)", 35);
// addCommand("기습(통, 무, 지, 자금$develcost10, 군량$develcost10)", 36);
} else {
addCommand("화계(지력경험, 자금$develcost5, 군량$develcost5)", 32, 0);
addCommand("탈취(무력경험, 자금$develcost5, 군량$develcost5)", 33, 0);
addCommand("파괴(무력경험, 자금$develcost5, 군량$develcost5)", 34, 0);
addCommand("선동(통솔경험, 자금$develcost5, 군량$develcost5)", 35, 0);
// addCommand("기습(통, 무, 지, 자금500, 군량500)", 36, 0);
}
commandGroup("", 1);
commandGroup("========= 개 인 ==========");
if($me['level'] >= 1) {
addCommand("단련(자금$develcost, 군량$develcost)", 41);
} else {
addCommand("단련(자금$develcost, 군량$develcost)", 41, 0);
}
addCommand("견문(자금?, 군량?, 경험치?)", 42);
if($city['trade'] > 0 || $me['special'] == 30) {
addCommand("장비매매", 48);
addCommand("군량매매", 49);
} else {
addCommand("장비매매", 48, 0);
addCommand("군량매매", 49, 0);
}
if($city['supply'] != 0 && $city['nation'] == $me['nation']) {
addCommand("증여(통솔경험)", 43);
} else {
addCommand("증여(통솔경험)", 43, 0);
}
if($me['level'] >= 1 && $city['supply'] != 0 && $city['nation'] == $me['nation']) {
addCommand("헌납(통솔경험)", 44);
} else {
addCommand("헌납(통솔경험)", 44, 0);
}
if($me['npc'] == 0) {
if($me['level'] >= 1 && $me['level'] < 12) {
addCommand("하야", 45);
} else {
addCommand("하야", 45, 0);
}
}
if($me['level'] == 0) {
addCommand("거병", 55);
} else {
addCommand("거병", 55, 0);
}
if($me['level'] == 12 &&
($city['level'] == 5 || $city['level'] == 6) &&
$city['nation'] == 0 &&
$me['makelimit'] == 0 &&
$gencount >= 2 &&
$citycount == 0 &&
$admin['year'] < $admin['startyear']+2
) {
addCommand("건국", 46);
} else {
addCommand("건국", 46, 0);
}
if($me['level'] == 12) {
addCommand("선양", 54);
if($citycount != 0) {
addCommand("방랑", 47);
addCommand("해산", 56, 0);
} else {
addCommand("방랑", 47, 0);
addCommand("해산", 56);
}
} else {
addCommand("선양", 54, 0);
addCommand("방랑", 47, 0);
addCommand("해산", 56, 0);
}
if($me['level'] > 1 && $me['level'] < 12) {
addCommand("모반시도", 57);
} else {
addCommand("모반시도", 57, 0);
}
commandGroup("", 1);
echo "
";
}
function CoreCommandTable($connect) {
$query = "select develcost from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$query = "select no,nation,city,level from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select level,colset from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select no from general where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
$query = "select supply from city where city='{$me['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
if($nation['level'] > 0) { $valid = 1; }
else { $valid = 0; }
if($city['supply'] == 0) { $valid = 0; }
echo "
";
addCommand("휴 식", 99);
commandGroup("", 1);
commandGroup("====== 인 사 ======");
addCommand("발령", 27, $valid);
addCommand("포상", 23, $valid);
addCommand("몰수", 24, $valid);
commandGroup("", 1);
commandGroup("====== 외 교 ======");
if($citycount <= 4) {
addCommand("통합 제의", 53, $valid);
} else {
addCommand("통합 제의", 53, 0);
}
addCommand("항복 권고", 51, $valid);
if($nation['level'] >= 2) {
addCommand("물자 원조", 52, $valid);
} else {
addCommand("물자 원조", 52, 0);
}
addCommand("불가침 제의", 61, $valid);
addCommand("선전 포고", 62, $valid);
addCommand("종전 제의", 63, $valid);
addCommand("파기 제의", 64, $valid);
commandGroup("", 1);
commandGroup("====== 특 수 ======");
if($citycount >= 5) {
addCommand("초토화", 65, $valid);
} else {
addCommand("초토화", 65, 0);
}
addCommand("천도/3턴(금쌀{$admin['develcost']}0)", 66, $valid);
$cost = $admin['develcost'] * 500 + 60000; // 7만~13만
addCommand("증축/6턴(금쌀{$cost})", 67, $valid);
addCommand("감축/6턴", 68, $valid);
commandGroup("", 1);
commandGroup("====== 전 략 ======");
$term = round(sqrt($genCount*8)*10);
addCommand("필사즉생/3턴(전략{$term})", 71, $valid);
$term = round(sqrt($genCount*4)*10);
addCommand("백성동원/1턴(전략{$term})", 72, $valid);
$term = round(sqrt($genCount*4)*10);
addCommand("수몰/3턴(전략{$term})", 73, $valid);
$term = round(sqrt($genCount*4)*10);
addCommand("허보/2턴(전략{$term})", 74, $valid);
$term = round(sqrt($genCount*2)*10);
if($term < 72) { $term = 72; }
addCommand("피장파장/3턴(전략{$term})", 75, $valid);
$term = round(sqrt($genCount*10)*10);
addCommand("의병모집/3턴(전략{$term})", 76, $valid);
$term = round(sqrt($genCount*16)*10);
addCommand("이호경식/1턴(전략{$term})", 77, $valid);
$term = round(sqrt($genCount*16)*10);
addCommand("급습/1턴(전략{$term})", 78, $valid);
commandGroup("", 1);
commandGroup("====== 기 타 ======");
if($nation['colset'] > 0) {
addCommand("국기 변경", 81, 1);
} else {
addCommand("국기 변경", 81, 0);
}
commandGroup("", 1);
echo "
";
}
function myInfo($connect) {
$query = "select no,skin from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
generalInfo($connect, $me['no'], $me['skin']);
}
function generalInfo($connect, $no, $skin) {
global $_basecolor, $_basecolor2, $image, $images;
$query = "select img from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$query = "select skin from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select block,no,name,picture,imgsvr,injury,nation,city,troop,leader,leader2,power,power2,intel,intel2,explevel,experience,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,killturn,age,personal,special,specage,special2,specage2,mode,con,connect from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
if($general['level'] == 12) {
$lbonus = $nation['level'] * 2;
} elseif($general['level'] >= 5) {
$lbonus = $nation['level'];
} else {
$lbonus = 0;
}
if($lbonus > 0) {
$lbonus = "+{$lbonus} ";
} else {
$lbonus = "";
}
$troop = getTroop($connect, $general['troop']);
$level = getLevel($general['level'], $nation['level']);
if($general['level'] == 2) {
$query = "select name from city where gen3='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$level = $city['name']." ".$level;
} elseif($general['level'] == 3) {
$query = "select name from city where gen2='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$level = $city['name']." ".$level;
} elseif($general['level'] == 4) {
$query = "select name from city where gen1='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$level = $city['name']." ".$level;
}
$call = getCall($general['leader'], $general['power'], $general['intel']);
$typename = getTypename($general['crewtype']);
$weapname = getWeapName($general['weap']);
$bookname = getBookName($general['book']);
$horsename = getHorseName($general['horse']);
$itemname = getItemName($general['item']);
if($general['injury'] > 0) {
$leader = floor($general['leader'] * (100 - $general['injury'])/100);
$power = floor($general['power'] * (100 - $general['injury'])/100);
$intel = floor($general['intel'] * (100 - $general['injury'])/100);
} else {
$leader = $general['leader'];
$power = $general['power'];
$intel = $general['intel'];
}
if($general['injury'] > 60) { $color = ""; $injury = "위독"; }
elseif($general['injury'] > 40) { $color = ""; $injury = "심각"; }
elseif($general['injury'] > 20) { $color = ""; $injury = "중상"; }
elseif($general['injury'] > 0) { $color = ""; $injury = "경상"; }
else { $color = ""; $injury = "건강"; }
$remaining = substr($general['turntime'], 14, 2) - date('i');
if($remaining < 0) { $remaining = 60 + $remaining; }
if($nation['color'] == "" || $skin < 1) { $nation['color'] = "000000"; }
if($general['age'] < 60) { $general['age'] = "{$general['age']} 세 "; }
elseif($general['age'] < 80) { $general['age'] = "{$general['age']} 세 "; }
else { $general['age'] = "{$general['age']} 세 "; }
$general['connect'] = round($general['connect'] / 10, 0) * 10;
$special = $general['special'] == 0 ? "{$general['specage']}세" : "".getGenSpecial($general['special'])." ";
$special2 = $general['special2'] == 0 ? "{$general['specage2']}세" : "".getGenSpecial($general['special2'])." ";
switch($general['personal']) {
case 2: case 4:
$atmos = "{$general['atmos']} (+5) "; break;
case 0: case 9: case 10:
$atmos = "{$general['atmos']} (-5) "; break;
default:
$atmos = "{$general['atmos']}"; break;
}
switch($general['personal']) {
case 3: case 5:
$train = "{$general['train']} (+5) "; break;
case 1: case 8: case 10:
$train = "{$general['train']} (-5) "; break;
default:
$train = "{$general['train']}"; break;
}
if($general['troop'] == 0) { $troop['name'] = "-"; }
if($general['mode'] == 2) { $general['mode'] = "수비 함(훈사80) "; }
elseif($general['mode'] == 1) { $general['mode'] = "수비 함(훈사60) "; }
else { $general['mode'] = "수비 안함 "; }
if($skin == 0) {
$general['age'] = unfont($general['age']);
$special = unfont($special);
$special2 = unfont($special2);
$atmos = unfont($atmos);
$train = unfont($train);
$general['mode'] = unfont($general['mode']);
}
$weapImage = "{$images}/weap{$general['crewtype']}.jpg";
if($admin['img'] < 2) { $weapImage = "{$image}/default.jpg"; };
$imageTemp = GetImageURL($general['imgsvr']);
echo "
0?" background={$imageTemp}/{$general['picture']}":""; echo ">
{$specUser} {$general['name']} 【 {$level} | {$call} | {$color}{$injury} 】 ".substr($general['turntime'], 11)."
통솔
{$color}{$leader}{$lbonus}
".bar(expStatus($general['leader2']), $skin, 20)."
무력
{$color}{$power}
".bar(expStatus($general['power2']), $skin, 20)."
지력
{$color}{$intel}
".bar(expStatus($general['intel2']), $skin, 20)."
명마
$horsename
무기
$weapname
서적
$bookname
0?" background={$weapImage}":""; echo ">
자금
{$general['gold']}
군량
{$general['rice']}
도구
$itemname
병종
$typename
병사
{$general['crew']}
성격
".getGenChar($general['personal'])."
훈련
$train
사기
$atmos
특기
$special / $special2
Lv
{$general['explevel']}
".bar(getLevelPer($general['experience'], $general['explevel']), $skin, 20)."
연령
{$general['age']}
수비
{$general['mode']}
삭턴
{$general['killturn']} 턴
실행
$remaining 분 남음
부대
{$troop['name']}
벌점
".getConnect($general['connect'])." {$general['connect']}({$general['con']})
";
}
function myInfo2($connect) {
$query = "select no,skin from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
generalInfo2($connect, $me['no'], $me['skin']);
}
function generalInfo2($connect, $no, $skin) {
global $_basecolor, $_basecolor2, $image, $images, $_dexLimit;
$query = "select personal,experience,dedication,firenum,warnum,killnum,deathnum,killcrew,deathcrew,belong,killnum*100/warnum as winrate,killcrew/deathcrew*100 as killrate,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['winrate'] = round($general['winrate'], 2);
$general['killrate'] = round($general['killrate'], 2);
switch($general['personal']) {
case 0: case 1; case 6:
$experience = "".getHonor($general['experience'])." ({$general['experience']}) "; break;
case 4: case 5: case 7: case 10:
$experience = "".getHonor($general['experience'])." ({$general['experience']}) "; break;
default:
$experience = getHonor($general['experience'])." ({$general['experience']})"; break;
}
switch($general['personal']) {
case 10:
$dedication = "".getDed($general['dedication'])." ({$general['dedication']}) "; break;
default:
$dedication = getDed($general['dedication'])." ({$general['dedication']})"; break;
}
if($skin == 0) {
$experience = unfont($experience);
$dedication = unfont($dedication);
}
$dex0 = $general['dex0'] / $_dexLimit * 100;
$dex10 = $general['dex10'] / $_dexLimit * 100;
$dex20 = $general['dex20'] / $_dexLimit * 100;
$dex30 = $general['dex30'] / $_dexLimit * 100;
$dex40 = $general['dex40'] / $_dexLimit * 100;
if($dex0 > 100) { $dex0 = 100; }
if($dex10 > 100) { $dex10 = 100; }
if($dex20 > 100) { $dex20 = 100; }
if($dex30 > 100) { $dex30 = 100; }
if($dex40 > 100) { $dex40 = 100; }
$general['dex0'] = getDexCall($general['dex0']);
$general['dex10'] = getDexCall($general['dex10']);
$general['dex20'] = getDexCall($general['dex20']);
$general['dex30'] = getDexCall($general['dex30']);
$general['dex40'] = getDexCall($general['dex40']);
echo "
추 가 정 보
명성
$experience
계급
$dedication
전투
{$general['warnum']}
계략
{$general['firenum']}
사관
{$general['belong']}년
승률
{$general['winrate']} %
승리
{$general['killnum']}
패배
{$general['deathnum']}
살상률
{$general['killrate']} %
사살
{$general['killcrew']}
피살
{$general['deathcrew']}
숙 련 도
보병
{$general['dex0']}
".bar($dex0, $skin, 16)."
궁병
{$general['dex10']}
".bar($dex10, $skin, 16)."
기병
{$general['dex20']}
".bar($dex20, $skin, 16)."
귀병
{$general['dex30']}
".bar($dex30, $skin, 16)."
차병
{$general['dex40']}
".bar($dex40, $skin, 16)."
";
}
function pushTrickLog($log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/_tricklog.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushProcessLog($log) {
$size = count($log);
if($size > 0) {
$date = date('Y_m_d');
$fp = fopen("logs/_{$date}_processlog.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function delStepLog() {
$date = date('Y_m_d');
@unlink("logs/_{$date}_steplog.txt");
}
function pushStepLog($log) {
$date = date('Y_m_d');
$fp = fopen("logs/_{$date}_steplog.txt", "a");
fwrite($fp, $log."\n");
fclose($fp);
}
function pushLockLog($log) {
$size = count($log);
if($size > 0) {
$date = date('Y_m_d');
$fp = fopen("logs/_{$date}_locklog.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushAdminLog($log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/_adminlog.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushAuctionLog($log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/_auctionlog.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushGenLog($general, $log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/gen{$general['no']}.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushBatRes($general, $log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/batres{$general['no']}.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushBatLog($general, $log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/batlog{$general['no']}.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushAllLog($log) {
$size = count($log);
if($size > 0) {
$fp = fopen("logs/_alllog.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $log[$i]."\n");
}
fclose($fp);
}
}
function pushHistory($history) {
$size = count($history);
if($size > 0) {
$fp = fopen("logs/_history.txt", "a");
for($i=0; $i < $size; $i++) {
fwrite($fp, $history[$i]."\n");
}
fclose($fp);
}
}
function getRawLog($path, $count, $line_length, $skin){
//TODO: tail과 유사한 형태로 처리할 수 있는게 나을 듯. 그 이전에 파일 로그는 좀... ㅜㅜ
if(!file_exists($path)){
return NULL;
}
$fp = fopen($path, 'r');
@fseek(fp, -$count * $line_length, SEEK_END);
$data = fread($fp, $count * $line_length);
fclose($fp);
}
function TrickLog($count, $skin) {
if(!file_exists("logs/_tricklog.txt")){
return '';
}
$fp = @fopen("logs/_tricklog.txt", "r");
@fseek($fp, -$count*150, SEEK_END);
$file = @fread($fp, $count*150);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) { $str .= ConvertLog($log[count($log)-2-$i], $skin)." "; }
echo $str;
}
function AllLog($count, $skin) {
if(!file_exists("logs/_alllog.txt")){
return '';
}
$fp = @fopen("logs/_alllog.txt", "r");
@fseek($fp, -$count*300, SEEK_END);
$file = @fread($fp, $count*300);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) {
$str .= isset($log[count($log)-2-$i]) ? ConvertLog($log[count($log)-2-$i], $skin)." " : " ";
}
echo $str;
}
function AuctionLog($count, $skin) {
if(!file_exists("logs/_auctionlog.txt")){
return '';
}
$fp = @fopen("logs/_auctionlog.txt", "r");
@fseek($fp, -$count*300, SEEK_END);
$file = @fread($fp, $count*300);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) { $str .= ConvertLog($log[count($log)-2-$i], $skin)." "; }
echo $str;
}
function History($count, $skin) {
if(!file_exists("logs/_history.txt")){
return '';
}
$fp = @fopen("logs/_history.txt", "r");
@fseek($fp, -300*$count, SEEK_END); //
$file = @fread($fp, $count*300);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) {
$str .= isset($log[count($log)-2-$i]) ? ConvertLog($log[count($log)-2-$i], $skin)." " : " ";
}
echo $str;
}
function MyLog($no, $count, $skin) {
if(!file_exists("logs/gen{$no}.txt")){
return '';
}
$fp = @fopen("logs/gen{$no}.txt", "r");
@fseek($fp, -$count*300, SEEK_END);
$file = @fread($fp, $count*300);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) {
$str .= isset($log[count($log)-2-$i]) ? ConvertLog($log[count($log)-2-$i], $skin)." " : " ";
}
echo $str;
}
function MyBatRes($no, $count, $skin) {
if(!file_exists("logs/batres{$no}.txt")){
return '';
}
$fp = @fopen("logs/batres{$no}.txt", "r");
@fseek($fp, -$count*300, SEEK_END);
$file = @fread($fp, $count*300);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) {
$str .= isset($log[count($log)-2-$i]) ? ConvertLog($log[count($log)-2-$i], $skin)." " : " ";
}
echo $str;
}
function MyBatLog($no, $count, $skin) {
if(!file_exists("logs/batlog{$no}.txt")){
return '';
}
$fp = @fopen("logs/batlog{$no}.txt", "r");
@fseek($fp, -$count*300, SEEK_END);
$file = @fread($fp, $count*300);
@fclose($fp);
$log = explode("\n",$file);
$str = "";
for($i=0; $i < $count; $i++) {
$str .= isset($log[count($log)-2-$i]) ? ConvertLog($log[count($log)-2-$i], $skin)." " : " ";
}
echo $str;
}
function MyHistory($connect, $no, $skin) {
$query = "select history from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
echo ConvertLog($general['history'], $skin);
}
function addHistory($me, $history) {
getDB()->query("update general set history=concat(%s, history) where no=%i",
$history.' ', $me['no']);
}
function addNationHistory($nation, $history) {
//FIXME: update 쿼리만으로도 구성 가능해보임.
$nation['history'] = "{$nation['history']}{$history} ";
getDB()->query("update nation set history=concat(%s, history) where nation=%i",
$history.' ', $nation['nation']);
}
function adminMsg($connect, $skin=1) {
$query = "select msg from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
echo "운영자 메세지 : ";
echo $admin['msg']." ";
}
function getOnlineNum() {
return getDB()->queryFirstField('select `online` from `game` where `no`=1');
}
function onlinegen($connect) {
$onlinegen = "";
$generalID = getGeneralID();
$nationID = getDB()->queryFirstField('select `nation` from `general` where `no` = %i', $generalID);
if($nationID !== null || toInt($nationID) === 0) {
$query = "select onlinegen from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$game = MYDB_fetch_array($result);
$onlinegen = $game['onlinegen'];
} else {
$query = "select onlinegen from nation where nation='{$_SESSION['p_nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$onlinegen = $nation['onlinegen'];
}
return $onlinegen;
}
function onlineNation($connect) {
$query = "select onlinenation from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$game = MYDB_fetch_array($result);
return $game['onlinenation'];
}
function nationMsg($connect) {
$query = "select no,nation,skin from general where owner='{$_SESSION['noMember']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select msg from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
echo "".$nation['msg']." ";
}
function PushMsg($type, $nation, $picture, $imgsvr, $from, $fromcolor, $to, $tocolor, $msg) {
if($nation == 0) { $nation = 0; }
if($fromcolor == "") { $fromcolor = "#FFFFFF"; }
if($to == "") { $to = "재야"; }
if($tocolor == "") { $tocolor = "#FFFFFF"; }
$date = date('Y-m-d H:i:s');
if($type == 1) { $file = "_all_msg.txt"; }
else { $file = "_nation_msg{$nation}.txt"; }
$fp = fopen("logs/{$file}", "a");
//로그 파일에 기록
$str = "{$type}|"._String::Fill($from,12," ")."|"._String::Fill($to,12," ")."|".$date."|".$msg."|".$fromcolor."|".$tocolor."|".$picture."|".$imgsvr;
fwrite($fp, "{$str}\n");
fclose($fp);
}
function msgprint($connect, $msg, $name, $picture, $imgsvr, $when, $num, $type) {
global $_basecolor2, $_basecolor4, $images;
$message = explode("|", $msg);
$count = (count($message) - 2)/2;
$message[0] = Tag2Code($message[0]);
$message[1] = Tag2Code($message[1]);
// $message[0] = str_replace("\n", " ", $message[0]);
// $message[1] = str_replace("\n", " ", $message[1]);
if($type == 0) { $board = "c_nationboard.php"; }
else { $board = "c_chiefboard.php"; }
$imageTemp = GetImageURL($imgsvr);
echo "
$name
$message[0]
$when
$message[1]
";
for($i=0; $i < $count; $i++) {
$who = Tag2Code($message[2+$i*2]);
$reply = Tag2Code($message[3+$i*2]);
$query = "select name from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$regen = MYDB_fetch_array($result);
echo "
{$regen['name']}
$reply
";
}
echo "
";
}
function banner() {
return sprintf('%s / %s %s ', GameConst::version, GameConst::banner, GameConst::helper);
}
function addTurn($date, $turnterm=1) {
$lastday = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
$year = $date[0].$date[1].$date[2].$date[3];
$month = floor($date[5].$date[6]);
$day = $date[8].$date[9];
$hour = $date[11].$date[12];
$min = $date[14].$date[15];
$sec = $date[17].$date[18];
//윤년계산
if((($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0)) { $lastday[2] = 29; }
if($turnterm == 0) { $hour += 2; }
elseif($turnterm == 1) { $hour += 1; }
elseif($turnterm == 2) { $min += 30; }
elseif($turnterm == 3) { $min += 20; }
elseif($turnterm == 4) { $min += 10; }
elseif($turnterm == 5) { $min += 5; }
elseif($turnterm == 6) { $min += 2; }
elseif($turnterm == 7) { $min += 1; }
if($min >= 60) { $min %= 60; $hour++; }
if($hour >= 24) { $hour %= 24; $day++; }
if($day > $lastday[$month]) { $month++; $day = 1; }
if($month >= 13) { $year++; $month = 1; }
$month = _String::Fill2($month, 2, "0");
$day = _String::Fill2($day, 2, "0");
$hour = _String::Fill2($hour, 2, "0");
$min = _String::Fill2($min, 2, "0");
$sec = _String::Fill2($sec, 2, "0");
return "{$year}-{$month}-{$day} {$hour}:{$min}:{$sec}";
}
function add12Turn($date, $turnterm=1) {
$lastday = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
$year = $date[0].$date[1].$date[2].$date[3];
$month = floor($date[5].$date[6]);
$day = $date[8].$date[9];
$hour = $date[11].$date[12];
$min = $date[14].$date[15];
$sec = $date[17].$date[18];
//윤년계산
if((($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0)) { $lastday[2] = 29; }
if($turnterm == 0) { $day += 1; }
elseif($turnterm == 1) { $hour += 12; }
elseif($turnterm == 2) { $hour += 6; }
elseif($turnterm == 3) { $hour += 4; }
elseif($turnterm == 4) { $hour += 2; }
elseif($turnterm == 5) { $hour += 1; }
elseif($turnterm == 6) { $min += 24; }
elseif($turnterm == 7) { $min += 12; }
if($min >= 60) { $min %= 60; $hour++; }
if($hour >= 24) { $hour %= 24; $day++; }
if($day > $lastday[$month]) { $month++; $day = 1; }
if($month >= 13) { $year++; $month = 1; }
$month = _String::Fill2($month, 2, "0");
$day = _String::Fill2($day, 2, "0");
$hour = _String::Fill2($hour, 2, "0");
$min = _String::Fill2($min, 2, "0");
$sec = _String::Fill2($sec, 2, "0");
return "{$year}-{$month}-{$day} {$hour}:{$min}:{$sec}";
}
function subTurn($date, $turnterm=1) {
$lastday = array(0,31,28,31,30,31,30,31,31,30,31,30,31);
$year = $date[0].$date[1].$date[2].$date[3];
$month = floor($date[5].$date[6]);
$day = $date[8].$date[9];
$hour = $date[11].$date[12];
$min = $date[14].$date[15];
$sec = $date[17].$date[18];
if($turnterm == 0) { $hour -= 2; }
elseif($turnterm == 1) { $hour -= 1; }
elseif($turnterm == 2) { $min -= 30; }
elseif($turnterm == 3) { $min -= 20; }
elseif($turnterm == 4) { $min -= 10; }
elseif($turnterm == 5) { $min -= 5; }
elseif($turnterm == 6) { $min -= 2; }
elseif($turnterm == 7) { $min -= 1; }
//윤년계산
if((($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0)) { $lastday[2] = 29; }
if($min < 0) { $min = 60 + $min; $hour--; }
if($hour < 0) { $hour = 24 + $hour; $day--; }
if($day <= 0) { $month--; $day = $lastday[$month]; }
if($month <= 0) { $year--; $month = 12; }
$year = _String::Fill2($year, 2, "0");
$month = _String::Fill2($month, 2, "0");
$day = _String::Fill2($day, 2, "0");
$hour = _String::Fill2($hour, 2, "0");
$min = _String::Fill2($min, 2, "0");
$sec = _String::Fill2($sec, 2, "0");
return "{$year}-{$month}-{$day} {$hour}:{$min}:{$sec}";
}
function cutTurn($date, $turnterm=1) {
// 0123456789012345678
// $date = "2000-01-01 00:00:00";
// 0 : 120분, 1 : 60분, 2 : 30분, 3 : 10분, 4 : 5분
switch($turnterm) {
case 0:
$hour = $date[11].$date[12];
if($hour % 2 == 1) { $hour--; }
$date[11] = floor($hour / 10);
$date[12] = $hour % 10;
$date[14] = "0";
$date[15] = "0";
$date[17] = "0";
$date[18] = "0";
break;
case 1:
$date[14] = "0";
$date[15] = "0";
$date[17] = "0";
$date[18] = "0";
break;
case 2:
$min = $date[14].$date[15];
if($min < 30) { $min = 0; }
else { $min = 30; }
$date[14] = floor($min / 10);
$date[15] = $min % 10;
$date[17] = "0";
$date[18] = "0";
break;
case 3:
$min = $date[14].$date[15];
if($min < 20) { $min = 0; }
elseif($min < 40) { $min = 20; }
else { $min = 40; }
$date[14] = floor($min / 10);
$date[15] = $min % 10;
$date[17] = "0";
$date[18] = "0";
break;
case 4:
$min = $date[14].$date[15];
if($min < 10) { $min = 0; }
elseif($min < 20) { $min = 10; }
elseif($min < 30) { $min = 20; }
elseif($min < 40) { $min = 30; }
elseif($min < 50) { $min = 40; }
else { $min = 50; }
$date[14] = floor($min / 10);
$date[15] = $min % 10;
$date[17] = "0";
$date[18] = "0";
break;
case 5:
$min = $date[14].$date[15];
if($min < 5) { $min = 0; }
elseif($min < 10) { $min = 5; }
elseif($min < 15) { $min = 10; }
elseif($min < 20) { $min = 15; }
elseif($min < 25) { $min = 20; }
elseif($min < 30) { $min = 25; }
elseif($min < 35) { $min = 30; }
elseif($min < 40) { $min = 35; }
elseif($min < 45) { $min = 40; }
elseif($min < 50) { $min = 45; }
elseif($min < 55) { $min = 50; }
else { $min = 55; }
$date[14] = floor($min / 10);
$date[15] = $min % 10;
$date[17] = "0";
$date[18] = "0";
break;
case 6:
$min = $date[14].$date[15];
$min = floor($min / 2) * 2;
$date[14] = floor($min / 10);
$date[15] = $min % 10;
$date[17] = "0";
$date[18] = "0";
break;
case 7:
$date[17] = "0";
$date[18] = "0";
break;
}
return $date;
}
function CutDay($date) {
$hour = $date[11].$date[12];
if($hour >= 19) {
$date[11] = "0";
$date[12] = "1";
$date = add12Turn($date, 1);
$date = add12Turn($date, 1);
} elseif($hour < 07) {
$date[11] = "0";
$date[12] = "1";
} else {
$date[11] = "1";
$date[12] = "3";
}
$date[14] = "0";
$date[15] = "0";
$date[17] = "0";
$date[18] = "0";
return $date;
}
function increaseRefresh($type="", $cnt=1) {
$date = date('Y-m-d H:i:s');
getDB()->query('UPDATE game set refresh=refresh+%i where `no`=1', $cnt);
if(!util::array_get($_SESSION['noMember'], null)) {
getDB()->query('UPDATE general set `lastrefresh`=%s_date, `con`=`con`+%i_cnt, `connect`=`connect`+%i_cnt, refcnt=refcnt+%i_cnt, refresh=refresh+%i_cnt where `no`=%i_no',[
'date'=>$date,
'cnt'=>$cnt,
'owner'->getGeneralID()
]);
}
$date = date('Y_m_d H:i:s');
$date2 = substr($date, 0, 10);
$online = getOnlineNum();
$fp = fopen("logs/_{$date2}_refresh.txt", "a");
$msg = _String::Fill2($date,20," ")._String::Fill2($_SESSION['p_id'],13," ")._String::Fill2($_SESSION['p_name'],13," ")._String::Fill2($_SESSION['p_ip'],16," ")._String::Fill2($type, 10, " ")." 동접자: {$online}";
fwrite($fp, $msg."\n");
fclose($fp);
$proxy_headers = array(
'HTTP_VIA',
'HTTP_X_FORWARDED_FOR',
'HTTP_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'HTTP_FORWARDED_FOR_IP',
'VIA',
'X_FORWARDED_FOR',
'FORWARDED_FOR',
'X_FORWARDED',
'FORWARDED',
'CLIENT_IP',
'FORWARDED_FOR_IP',
'HTTP_PROXY_CONNECTION'
);
$str = "";
foreach($proxy_headers as $x) {
if(isset($_SERVER[$x])) $str .= "//{$x}:{$_SERVER[$x]}";
}
if($str != "") {
file_put_contents("logs/_{$date2}_ipcheck.txt",
sprintf("ID:%s//name:%s//REMOTE_ADDR:%s%s\n",
$_SESSION['p_id'],$_SESSION['p_name'],$_SERVER['REMOTE_ADDR'],$str), FILE_APPEND);
}
}
function updateTraffic() {
$online = getOnlineNum();
$db = getDB();
$game = $db->queryFirstRow('SELECT year,month,refresh,maxonline,maxrefresh from game where no=1');
//최다갱신자
$user = $db->queryFirstRow('select name,refresh from general order by refresh desc limit 1');
if($game['maxrefresh'] < $game['refresh']) {
$game['maxrefresh'] = $game['refresh'];
}
if($game['maxonline'] < $online) {
$game['maxonline'] = $online;
}
$db->update('game',[
'refresh'=>0,
'maxrefresh'=>$game['maxrefresh'],
'maxonline'=>$game['maxonline']
], 'no=1');
$db->update('general', ['refresh'=>0]);
$date = date('Y-m-d H:i:s');
$fp = fopen("logs/_traffic.txt", "a");
//일시|년|월|총갱신|접속자|최다갱신자
$msg = _String::Fill2($date,20," ")."|"._String::Fill2($game['year'],3," ")."|"._String::Fill2($game['month'],2," ")."|"._String::Fill2($game['refresh'],8," ")."|"._String::Fill2($online,5," ")."|"._String::Fill2($user['name']."(".$user['refresh'].")",20," ");
fwrite($fp, $msg."\n");
fclose($fp);
}
function CheckOverhead($connect) {
//서버정보
$query = "select conweight,turnterm,conlimit from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$onlineNumber = getOnlineNum();
switch($admin['turnterm']) {
case 0: $thr1 = 30; $thr2 = 60; $thr3 = 120; $con1 = 480; $con2 = 360; $con3 = 240; $con4 = 120; break; // 120분턴
case 1: $thr1 = 30; $thr2 = 60; $thr3 = 120; $con1 = 480; $con2 = 360; $con3 = 240; $con4 = 120; break; // 60분턴
case 2: $thr1 = 10; $thr2 = 20; $thr3 = 30; $con1 = 360; $con2 = 240; $con3 = 120; $con4 = 60; break; // 30분턴
case 3: $thr1 = 10; $thr2 = 20; $thr3 = 30; $con1 = 240; $con2 = 180; $con3 = 120; $con4 = 60; break; // 20분턴
case 4: $thr1 = 10; $thr2 = 20; $thr3 = 30; $con1 = 240; $con2 = 180; $con3 = 120; $con4 = 60; break; // 10분턴
case 5: $thr1 = 5; $thr2 = 10; $thr3 = 20; $con1 = 120; $con2 = 90; $con3 = 60; $con4 = 30; break; // 5분턴
case 6: $thr1 = 5; $thr2 = 10; $thr3 = 20; $con1 = 90; $con2 = 60; $con3 = 40; $con4 = 30; break; // 2분턴
case 7: $thr1 = 5; $thr2 = 10; $thr3 = 20; $con1 = 90; $con2 = 60; $con3 = 40; $con4 = 30; break; // 1분턴
}
$thr1 *= $admin['conweight'] / 100;
$thr2 *= $admin['conweight'] / 100;
$thr3 *= $admin['conweight'] / 100;
$con1 *= $admin['conweight'] / 100;
$con2 *= $admin['conweight'] / 100;
$con3 *= $admin['conweight'] / 100;
$con4 *= $admin['conweight'] / 100;
//if($onlineNumber > $thr2) { $me['map'] = 1; }
if ($onlineNumber > $thr3 && $admin['conlimit'] != $con4) {
$query = "update game set conlimit='$con4' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($onlineNumber > $thr2 && $admin['conlimit'] != $con3) {
$query = "update game set conlimit='$con3' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($onlineNumber > $thr1 && $admin['conlimit'] != $con2) {
$query = "update game set conlimit='$con2' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($onlineNumber <= $thr1 && $admin['conlimit'] != $con1) {
$query = "update game set conlimit='$con1' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
}
}
function isLock() {
return getDB()->queryFirstField("select plock from plock where no=1") != 0;
}
function tryLock() {
//NOTE: 게임 로직과 관련한 모든 insert, update 함수들은 lock을 거칠것을 권장함.
$db = getDB();
//테이블 락
$db->query("lock tables plock write");
// 잠금
$isUnlocked = $db->queryFirstField("select plock from plock where no=1") != 0;
if($isUnlocked){
$db->query("update plock set plock=1 where no=1");
}
//테이블 언락
$db->query("unlock tables");
return $isUnlocked;
}
function unlock() {
// 풀림
//NOTE: unlock에는 table lock이 필요없는가?
getDB()->query("update plock set plock=0 where no=1");
}
function timeover($connect) {
$query = "select turnterm,TIMESTAMPDIFF(SECOND,turntime,now()) as diff from game where no=1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
switch($admin['turnterm']) {
case 0: $t = 20; break; // 120분턴
case 1: $t = 10; break; // 60분턴
case 2: $t = 10; break; // 30분턴
case 3: $t = 10; break; // 20분턴
case 4: $t = 10; break; // 10분턴
case 5: $t = 5; break; // 5분턴
case 6: $t = 2; break; // 2분턴
case 7: $t = 1; break; // 1분턴
}
$term = $admin['diff'];
if($term >= $t || $term < 0) { return 1; }
else { return 0; }
}
function checkDelay($connect) {
//서버정보
$query = "select turnterm,now() as now,TIMESTAMPDIFF(MINUTE,turntime,now()) as offset from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
// 1턴이상 갱신 없었으면 서버 지연
switch($admin['turnterm']) {
case 0: $term = 120; $threshold = 1; break;
case 1: $term = 60; $threshold = 1; break;
case 2: $term = 30; $threshold = 1; break;
case 3: $term = 20; $threshold = 1; break;
case 4: $term = 10; $threshold = 2; break;
case 5: $term = 5; $threshold = 3; break;
case 6: $term = 2; $threshold = 3; break;
case 7: $term = 1; $threshold = 3; break;
}
//지연 해야할 밀린 턴 횟수
$iter = floor($admin['offset'] / $term);
if($iter > $threshold) {
$minute = $iter * $term;
$query = "update game set turntime=DATE_ADD(turntime, INTERVAL $minute MINUTE),starttime=DATE_ADD(starttime, INTERVAL $minute MINUTE),tnmt_time=DATE_ADD(tnmt_time, INTERVAL $minute MINUTE)";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set turntime=DATE_ADD(turntime, INTERVAL $minute MINUTE) where turntime<=DATE_ADD(turntime, INTERVAL $term MINUTE)";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update auction set expire=DATE_ADD(expire, INTERVAL $minute MINUTE)";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
function updateOnline($connect) {
//국가별 이름 매핑
foreach(getAllNationStaticInfo() as $nation) {
$nationname[$nation['nation']] = $nation['name'];
}
$nationname[0] = "재야";
//동접수
$query = "select no,name,nation from general where lastrefresh > DATE_SUB(NOW(), INTERVAL 5 MINUTE)";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$onlinenum = MYDB_num_rows($result);
$onnation = array();
$onnationstr = "";
//국가별 접속중인 장수
for($i=0; $i < $onlinenum; $i++) {
$general = MYDB_fetch_array($result);
if(isset($onnation[$general['nation']])){
$onnation[$general['nation']] .= $general['name'].', ';
}else {
$onnation[$general['nation']] = $general['name'].', ';
}
}
//$onnation이 empty라면 굳이 foreach를 수행 할 이유가 없음.
if(!empty($onnation)){
foreach($onnation as $key => $val) {
$onnationstr .= "【{$nationname[$key]}】, ";
if($key == 0) {
$query = "update game set onlinegen='$onnation[0]' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$query = "update nation set onlinegen='$onnation[$key]' where nation='$key'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
}
//접속중인 국가
$query = "update game set online='$onlinenum',onlinenation='$onnationstr' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
function checkTurn($connect) {
// 잦은 갱신 금지 현재 10초당 1회
if(!timeover($connect)) { return; }
// 현재 처리중이면 접근 불가
// 파일락 획득
//FIXME:이미 DB 테이블로 lock을 시도하는데 이게 따로 필요한가?
$fp = fopen('lock.txt', 'r');
if(!flock($fp, LOCK_EX)) {
return;
}
if(!tryLock()){
return;
}
$locklog[0] = "- checkTurn() : ".date('Y-m-d H:i:s')." : ".$_SESSION['p_id'];
pushLockLog($locklog);
// 파일락 해제
if(!flock($fp, LOCK_UN)) { return; }
// 세마포어 해제
//if(!@sem_release($sema)) { echo "치명적 에러! 유기체에게 문의하세요!"; exit(1); }
$locklog[0] = "- checkTurn() 입 : ".date('Y-m-d H:i:s')." : ".$_SESSION['p_id'];
pushLockLog($locklog);
//if(STEP_LOG) delStepLog();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', 진입');
//천통시에는 동결
$query = "select turntime from game where isUnited=2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$down = MYDB_num_rows($result);
if($down > 0) {
$query = "update plock set plock=1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
return;
}
// 1턴이상 갱신 없었으면 서버 지연
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', checkDelay');
checkDelay($connect);
// 접속자수, 접속국가, 국가별 접속장수 갱신
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', checkDelay');
updateOnline($connect);
//접속자 수 따라서 갱신제한 변경
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', CheckOverhead');
CheckOverhead($connect);
//서버정보
$query = "select startyear,year,month,turntime,turnterm,scenario from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$date = date('Y-m-d H:i:s');
// 최종 처리 월턴의 다음 월턴시간 구함
$prevTurn = cutTurn($admin['turntime'], $admin['turnterm']);
$nextTurn = addTurn($prevTurn, $admin['turnterm']);
// 현재 턴 이전 월턴까지 모두처리.
//최종 처리 이후 다음 월턴이 현재 시간보다 전이라면
while($nextTurn <= $date) {
// 월턴이전 장수 모두 처리
$query = "select no,name,turntime,turn0,npc from general where turntime < '$nextTurn' order by turntime";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
//if(PROCESS_LOG) $processlog[0] = "[{$date}] 월턴 이전 갱신: name({$general['name']}), no({$general['no']}), turntime({$general['turntime']}), turn0({$general['turn0']})";
//if(PROCESS_LOG) pushProcessLog($processlog);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processAI');
if($general['npc'] >= 2) { processAI($connect, $general['no']); } // npc AI 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', PreprocessCommand');
PreprocessCommand($connect, $general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processCommand');
processCommand($connect, $general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateCommand');
updateCommand($connect, $general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateTurntime');
updateTurntime($connect, $general['no']);
}
// 트래픽 업데이트
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateTraffic');
updateTraffic();
// 1달마다 처리하는 것들, 벌점 감소 및 건국,전턴,합병 -1, 군량 소모
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', preUpdateMonthly');
$result = preUpdateMonthly($connect);
if($result == false) {
$locklog[0] = "-- checkTurn() 오류출 : ".date('Y-m-d H:i:s')." : ".$_SESSION['p_id'];
pushLockLog($locklog);
// 잡금 해제
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', unlock');
unlock();
return false;
}
// 그 시각 년도,월 저장
$dt = turnDate($connect, $nextTurn);
$admin['year'] = $dt[0]; $admin['month'] = $dt[1];
$locklog[0] = "-- checkTurn() ".$admin['month']."월 : ".date('Y-m-d H:i:s')." : ".$_SESSION['p_id'];
pushLockLog($locklog);
// 분기계산. 장수들 턴보다 먼저 있다면 먼저처리
if($admin['month'] == 1) {
// NPC 등장
if($admin['scenario'] > 0 && $admin['scenario'] < 20) { RegNPC($connect); }
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processGoldIncome');
processGoldIncome($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processSpring');
processSpring($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateYearly');
updateYearly($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', tradeRate');
tradeRate($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', addAge');
addAge($connect);
// 새해 알림
$alllog[] = "◆>{$admin['month']}월:{$admin['year']}>년이 되었습니다.";
pushAllLog($alllog);
} elseif($admin['month'] == 4) {
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster($connect);
} elseif($admin['month'] == 7) {
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processRiceIncome');
processRiceIncome($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processFall');
processFall($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', tradeRate');
tradeRate($connect);
} elseif($admin['month'] == 10) {
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly($connect);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster($connect);
}
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', postUpdateMonthly');
postUpdateMonthly($connect);
// 다음달로 넘김
$prevTurn = $nextTurn;
$nextTurn = addTurn($prevTurn, $admin['turnterm']);
}
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', '.__LINE__);
// 이시각 정각 시까지 업데이트 완료했음
$query = "update game set turntime='$prevTurn' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 그 시각 년도,월 저장
$dt = turnDate($connect, $prevTurn);
$admin['year'] = $dt[0]; $admin['month'] = $dt[1];
// 현재시간의 월턴시간 이후 분단위 장수 처리
do {
$query = "select no,name,turntime,turn0,npc from general where turntime<='$date' order by turntime";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
//if(PROCESS_LOG) $processlog[0] = "[{$date}] 월턴 이후 갱신: name({$general['name']}), no({$general['no']}), turntime({$general['turntime']}), turn0({$general['turn0']})";
//if(PROCESS_LOG) pushProcessLog($processlog);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processAI');
if($general['npc'] >= 2) { processAI($connect, $general['no']); } // npc AI 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', PreprocessCommand');
PreprocessCommand($connect, $general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processCommand');
processCommand($connect, $general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateCommand');
updateCommand($connect, $general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateTurntime');
updateTurntime($connect, $general['no']);
}
} while($gencount > 0);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', '.__LINE__);
$query = "update game set turntime='$date' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 3턴 전 시간
$letterdate = $date;
$letterdate = subTurn($letterdate, $admin['turnterm']);
$letterdate = subTurn($letterdate, $admin['turnterm']);
$letterdate = subTurn($letterdate, $admin['turnterm']);
//기한 지난 외교 메세지 지움(3개월 유지)
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', '.__LINE__);
for($i=0; $i < 5; $i++) {
$query = "update nation set dip{$i}='',dip{$i}_who='0',dip{$i}_type='0',dip{$i}_when='' where dip{$i}_when < '$letterdate'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 부상 과도 제한
$query = "update general set injury='80' where injury>'80'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//토너먼트 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processTournament');
processTournament($connect);
//거래 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processAuction');
processAuction($connect);
// 잡금 해제
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', unlock');
unlock();
$locklog[0] = "- checkTurn() 출 : ".date('Y-m-d H:i:s')." : ".$_SESSION['p_id'];
pushLockLog($locklog);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', finish');
return true;
}
function addAge($connect) {
//나이와 호봉 증가
$query = "update general set age=age+1,belong=belong+1";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select startyear,year,month from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
if($admin['year'] >= $admin['startyear']+3) {
$query = "select no,name,nation,leader,power,intel from general where specage<=age and special='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
$special = getSpecial($connect, $general['leader'], $general['power'], $general['intel']);
$query = "update general set special='$special' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "●>특기 【".getGenSpecial($special)."> 】(을)를 익혔습니다!";
addHistory($general, "●>{$admin['year']}년 {$admin['month']}월:특기 【".getGenSpecial($special)."> 】(을)를 습득");
pushGenLog($general, $log);
}
$query = "select no,name,nation,leader,power,intel,npc,dex0,dex10,dex20,dex30,dex40 from general where specage2<=age and special2='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
$special2 = getSpecial2($connect, $general['leader'], $general['power'], $general['intel'], 0, $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']);
$query = "update general set special2='$special2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "●>특기 【".getGenSpecial($special2)."> 】(을)를 익혔습니다!";
addHistory($general, "●>{$admin['year']}년 {$admin['month']}월:특기 【".getGenSpecial($special2)."> 】(을)를 습득");
pushGenLog($general, $log);
}
}
}
function turnDate($connect, $curtime) {
$query = "select startyear,starttime,turnterm,year,month from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$turn = $admin['starttime'];
$curturn = cutTurn($curtime, $admin['turnterm']);
$num = 0;
switch($admin['turnterm']) {
case 0: $term = 7200; break;
case 1: $term = 3600; break;
case 2: $term = 1800; break;
case 3: $term = 1200; break;
case 4: $term = 600; break;
case 5: $term = 300; break;
case 6: $term = 120; break;
case 7: $term = 60; break;
}
$num = floor((strtotime($curturn) - strtotime($turn)) / $term);
$year = $admin['startyear'] + floor($num / 12);
$month = 1 + (12+$num) % 12;
// 바뀐 경우만 업데이트
if($admin['month'] != $month || $admin['year'] != $year) {
$query = "update game set year='$year',month='$month' where no='1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$value[0] = $year;
$value[1] = $month;
return $value;
}
function triggerTournament($connect) {
$query = "select tournament,tnmt_trig from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
//현재 토너먼트 없고, 자동개시 걸려있을때, 40%확률
if($admin['tournament'] == 0 && $admin['tnmt_trig'] > 0 && rand() % 100 < 40) {
$type = rand() % 6; // 0 : 전력전, 1 : 통솔전, 2 : 일기토, 3 : 설전
//전력전 50%, 통, 일, 설 각 17%
if($type > 3) { $type = 0; }
startTournament($connect, $admin['tnmt_trig'], $type);
}
}
function PreprocessCommand($connect, $no) {
$query = "select no,name,city,injury,special2,item,turn0 from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) {
//특기보정 : 의술
//의서 사용
if($general['injury'] > 0) {
$general['injury'] = 0;
$query = "update general set injury=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "●>의술>을 펼쳐 스스로 치료합니다!";
pushGenLog($general, $log);
}
$query = "select no,name,injury from general where city='{$general['city']}' and injury>10 order by rand()";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$patientCount = MYDB_num_rows($result);
if($patientCount > 0) {
// 50% 확률로 치료
$patientCount = round($patientCount * 0.5);
$patientName = "";
for($i=0; $i < $patientCount; $i++) {
$patient = MYDB_fetch_array($result);
//부상 치료
$query = "update general set injury=0 where no='{$patient['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "●>{$general['name']}>(이)가 의술>로써 치료해줍니다!";
pushGenLog($patient, $log);
if($patientName == "") {
$patientName = $patient['name'];
}
}
if($patientCount == 1) {
$log[0] = "●>의술>을 펼쳐 도시의 장수 {$patientName}>(을)를 치료합니다!";
} else {
$patientCount -= 1;
$log[0] = "●>의술>을 펼쳐 도시의 장수들 {$patientName}> 외 {$patientCount}>명을 치료합니다!";
}
pushGenLog($general, $log);
}
}
if($general['injury'] > 0) {
if($general['item'] >=7 && $general['item'] <= 11) {
//영구약 사용
$query = "update general set injury=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "●>".getItemName($general['item']).">(을)를 사용하여 치료합니다!";
pushGenLog($general, $log);
} elseif($general['injury'] > 10 && $general['item'] == 1 && $general['turn0'] != EncodeCommand(0, 0, 0, 50)) {
//환약 사용
$query = "update general set injury=0,item=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "●>환약>을 사용하여 치료합니다!";
pushGenLog($general, $log);
} elseif($general['injury'] > 10) {
//부상 감소
$query = "update general set injury=injury-10 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
//부상 감소
$query = "update general set injury=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
}
function updateTurntime($connect, $no) {
$query = "select year,month,isUnited,turnterm from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$admin = MYDB_fetch_array($result);
$query = "select no,name,name2,nation,troop,age,turntime,killturn,level,deadyear,npc,npc_org,npcmatch,npcid from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
// 삭턴장수 삭제처리
if($general['killturn'] <= 0) {
// npc유저 삭턴시 npc로 전환
if($general['npc'] == 1 && $general['deadyear'] > $admin['year']) {
$general['killturn'] = ($general['deadyear'] - $admin['year']) * 12;
$general['npc'] = $general['npc_org'];
$query = "update general set owner=-1,npc='{$general['npc']}',killturn='{$general['killturn']}',mode=2 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$alllog[0] = "●>{$admin['month']}월:{$general['name2']}>(이)가 {$general['name']}>의 육체에서 유체이탈>합니다!";
pushAllLog($alllog);
if($admin['isUnited'] == 0) {
CheckHall($connect, $no);
}
} else {
// 군주였으면 유지 이음
if($general['level'] == 12) {
nextRuler($connect, $general);
}
//도시의 태수, 군사, 시중직도 초기화
$query = "update city set gen1='0' where gen1='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen2='0' where gen2='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3='0' where gen3='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대 처리
$query = "select no from troop where troop='{$general['troop']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$troop = MYDB_fetch_array($result);
//부대장일 경우
if($troop['no'] == $general['no']) {
// 모두 탈퇴
$query = "update general set troop='0' where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대 삭제
$query = "delete from troop where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$query = "update general set troop='0' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 장수 삭제
$query = "delete from general where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//기존 국가 기술력 그대로
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < 10) $gencount = 10;
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 병, 요절, 객사, 번개, 사채, 일확천금, 호랑이, 곰, 수영, 처형, 발견
switch(rand()%42) {
case 0: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 역병에 걸려 죽고> 말았습니다."; break;
case 1: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 요절>하고 말았습니다."; break;
case 2: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 거리에서 갑자기 객사>하고 말았습니다."; break;
case 3: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 안타깝게도 번개에 맞아 죽고> 말았습니다."; break;
case 4: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 고리대금에 시달리다가 자살>하고 말았습니다."; break;
case 5: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 일확천금에 놀라 심장마비로 죽고> 말았습니다."; break;
case 6: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 산속에서 호랑이에게 물려 죽고> 말았습니다."; break;
case 7: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 산책중 곰에게 할퀴어 죽고> 말았습니다."; break;
case 8: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 수영을 하다 익사>하고 말았습니다."; break;
case 9: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 황제를 모독하다가 처형>당하고 말았습니다."; break;
case 10: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 이튿날 침실에서 죽은채로>발견되었습니다."; break;
case 11: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 색에 빠져 기력이 쇠진해 죽고>말았습니다."; break;
case 12: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 미녀를 보고 심장마비로 죽고>말았습니다."; break;
case 13: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 우울증에 걸려 자살>하고 말았습니다."; break;
case 14: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 천하 정세를 비관하며 분신>하고 말았습니다."; break;
case 15: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 어떤 관심도 못받고 쓸쓸히 죽고>말았습니다."; break;
case 16: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 유산 상속 문제로 다투다가 살해>당했습니다."; break;
case 17: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 누군가의 사주로 자객에게 암살>당했습니다."; break;
case 18: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 바람난 배우자에게 독살>당하고 말았습니다."; break;
case 19: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 농약을 술인줄 알고 마셔 죽고>말았습니다."; break;
case 20: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 아무 이유 없이 죽고>말았습니다."; break;
case 21: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 전재산을 잃고 화병으로 죽고>말았습니다."; break;
case 22: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 단식운동을 하다가 굶어 죽고>말았습니다."; break;
case 23: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 귀신에게 홀려 시름 앓다가 죽고>말았습니다."; break;
case 24: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 사람들에게 집단으로 맞아서 죽고>말았습니다."; break;
case 25: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 갑자기 성벽에서 뛰어내려 죽고>말았습니다."; break;
case 26: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 농사중 호미에 머리를 맞아 죽고>말았습니다."; break;
case 27: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 저세상이 궁금하다며 자살>하고 말았습니다."; break;
case 28: $alllog[0] = "●>{$admin['month']}월:운좋기로 소문난 {$general['name']}>(이)가 불운하게도 죽고>말았습니다."; break;
case 29: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 무리하게 단련을 하다가 죽고>말았습니다."; break;
case 30: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 생활고를 비관하며 자살>하고 말았습니다."; break;
case 31: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 평생 결혼도 못해보고 죽고> 말았습니다."; break;
case 32: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 과식하다 배가 터져 죽고> 말았습니다."; break;
case 33: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 웃다가 숨이 넘어가 죽고> 말았습니다."; break;
case 34: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 추녀를 보고 놀라서 죽고> 말았습니다."; break;
case 35: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 물에 빠진 사람을 구하려다 같이 죽고> 말았습니다."; break;
case 36: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 독살을 준비하다 독에 걸려 죽고> 말았습니다."; break;
case 37: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 뒷간에서 너무 힘을 주다가 죽고> 말았습니다."; break;
case 38: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 돌팔이 의사에게 치료받다가 죽고> 말았습니다."; break;
case 39: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 남의 보약을 훔쳐먹다 부작용으로 죽고> 말았습니다."; break;
case 40: $alllog[0] = "●>{$admin['month']}월:희대의 사기꾼 {$general['name']}>(이)가 사망>했습니다."; break;
case 41: $alllog[0] = "●>{$admin['month']}월:희대의 호색한 {$general['name']}>(이)가 사망>했습니다."; break;
default: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 사망>했습니다."; break;
}
// 엔피씨,엠피씨,의병 사망로그
if($general['npc'] == 2) {
$alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 사망>했습니다.";
} elseif($general['npc'] >= 3) {
switch(rand()%10) {
case 0: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 푸대접에 실망하여 떠났습니다."; break;
case 1: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 갑자기 화를 내며 떠났습니다."; break;
case 2: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 의견차이를 좁히지 못하고 떠났습니다."; break;
case 3: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 판단 착오였다며 떠났습니다."; break;
case 4: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 생활고가 나아지지 않는다며 떠났습니다."; break;
case 5: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 기대가 너무 컸다며 떠났습니다."; break;
case 6: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 아무 이유 없이 떠났습니다."; break;
case 7: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 자기 목적은 달성했다며 떠났습니다."; break;
case 8: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 자기가 없어도 될것 같다며 떠났습니다."; break;
case 9: $alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 처자식이 그립다며 떠났습니다."; break;
}
}
pushAllLog($alllog);
return;
}
}
if($general['age'] >= 80 && $general['npc'] == 0) {
if($admin['isUnited'] == 0) {
CheckHall($connect, $no);
}
$query = "update general set leader=leader*0.85,power=power*0.85,intel=intel*0.85,injury=0,experience=experience*0.5,dedication=dedication*0.5,firenum=0,warnum=0,killnum=0,deathnum=0,killcrew=0,deathcrew=0,age=20,specage=0,specage2=0,crew=crew*0.85,dex0=dex0*0.5,dex10=dex10*0.5,dex20=dex20*0.5,dex30=dex30*0.5,dex40=dex40*0.5 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$alllog[0] = "●>{$admin['month']}월:{$general['name']}>(이)가 은퇴>하고 그 자손이 유지를 이어받았습니다.";
pushAllLog($alllog);
$log[0] = "●>나이가 들어 은퇴>하고 자손에게 자리를 물려줍니다.";
pushGenLog($general, $log);
addHistory($general, "●>{$admin['year']}년 {$admin['month']}월:나이가 들어 은퇴하고, 자손에게 관직을 물려줌");
}
$turntime = addTurn($general['turntime'], $admin['turnterm']);
$query = "update general set turntime='$turntime' where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
function CheckHall($connect, $no) {
$type = array(
"experience",
"dedication",
"firenum",
"warnum",
"killnum",
"winrate",
"killcrew",
"killrate",
"dex0",
"dex10",
"dex20",
"dex30",
"dex40",
"ttrate",
"tlrate",
"tprate",
"tirate",
"betgold",
"betwin",
"betwingold",
"betrate"
);
$query = "select name,nation,picture,
experience,dedication,warnum,firenum,killnum,
killnum/warnum*10000 as winrate,killcrew,killcrew/deathcrew*10000 as killrate,
dex0,dex10,dex20,dex30,dex40,
ttw/(ttw+ttd+ttl)*10000 as ttrate, ttw+ttd+ttl as tt,
tlw/(tlw+tld+tll)*10000 as tlrate, tlw+tld+tll as tl,
tpw/(tpw+tpd+tpl)*10000 as tprate, tpw+tpd+tpl as tp,
tiw/(tiw+tid+til)*10000 as tirate, tiw+tid+til as ti,
betgold, betwin, betwingold, betwingold/betgold*10000 as betrate
from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
for($k=0; $k < 21; $k++) {
$query = "select * from hall where type='$k' order by data desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
//승률,살상률인데 10회 미만 전투시 스킵
if(($k == 5 || $k == 7) && $general['warnum']<10) { continue; }
//토너승률인데 50회 미만시 스킵
if($k == 13 && $general['tt'] < 50) { continue; }
//토너승률인데 50회 미만시 스킵
if($k == 14 && $general['tl'] < 50) { continue; }
//토너승률인데 50회 미만시 스킵
if($k == 15 && $general['tp'] < 50) { continue; }
//토너승률인데 50회 미만시 스킵
if($k == 16 && $general['ti'] < 50) { continue; }
//수익률인데 1000미만시 스킵
if($k == 20 && $general['betgold'] < 1000) { continue; }
$rank = 10;
for($i=0; $i < $count; $i++) {
$ranker = MYDB_fetch_array($result);
if($general[$type[$k]] >= $ranker['data']) {
$rank = $i;
break;
}
}
for($i=8; $i >= $rank; $i--) {
$j = $i + 1;
$query = "select * from hall where type='$k' and rank='$i'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$ranker = MYDB_fetch_array($result);
$query = "update hall set name='{$ranker['name']}', nation='{$ranker['nation']}', data='{$ranker['data']}', color='{$ranker['color']}', picture='{$ranker['picture']}' where type='$k' and rank='$j'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$query = "update hall set name='{$general['name']}', nation='{$nation['name']}', data='{$general[$type[$k]]}', color='{$nation['color']}', picture='{$general['picture']}' where type='$k' and rank='$rank'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
function uniqueItem($connect, $general, $log, $vote=0) {
if($general['npc'] >= 2 || $general['betray'] > 1) { return $log; }
if($general['weap'] > 6 || $general['book'] > 6 || $general['horse'] > 6 || $general['item'] > 6) { return $log; }
$query = "select year,month,scenario from game where no='1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$game = MYDB_fetch_array($result);
$query = "select count(*) as cnt from general where npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen = MYDB_fetch_array($result);
if($game['scenario'] == 0) { $prob = $gen['cnt'] * 5; } // 5~6개월에 하나씩 등장
else { $prob = $gen['cnt']; } // 1~2개월에 하나씩 등장
if($vote == 1) { $prob = round($gen['cnt'] * 0.7 / 3); } // 투표율 70%, 투표 한번에 2~3개 등장
elseif($vote == 2) { $prob = round($gen['cnt'] / 10 / 2); } // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?)
elseif($vote == 3) { $prob = round($gen['cnt'] / 10 / 4); } // 건국시 4개(20%) 등장(200명시 20국 정도 됨)
if($prob < 3) { $prob = 3; }
//아이템 습득 상황
if(rand() % $prob == 0) {
//셋중 선택
$sel = rand() % 4;
switch($sel) {
case 0: $type = "weap"; break;
case 1: $type = "book"; break;
case 2: $type = "horse"; break;
case 3: $type = "item"; break;
}
$query = "select no,{$type} from general where {$type}>6";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
if($count < 20) {
for($i=0; $i < $count; $i++) {
$gen = MYDB_fetch_array($result);
$occupied[$gen[$type]] = 1;
}
for($i=7; $i <= 26; $i++) {
if($occupied[$i] == 0) {
$item[count($item)] = $i;
}
}
$it = $item[rand() % count($item)];
$query = "update general set {$type}='$it' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = getNationStaticInfo($general['nation']);
if($nation == null) {
$nation['name'] = "재야";
}
switch($sel) {
case 0:
$log[] = "●>".getWeapName($it).">(을)를 습득했습니다!";
$alllog[0] = "●>{$game['month']}월:{$general['name']}>(이)가 ".getWeapName($it).">(을)를 습득했습니다!";
addHistory($general, "●>{$game['year']}년 {$game['month']}월:".getWeapName($it).">(을)를 습득");
if($vote == 0) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【아이템】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getWeapName($it).">(을)를 습득했습니다!";
} elseif($vote == 1) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【설문상품】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getWeapName($it).">(을)를 습득했습니다!";
} elseif($vote == 2) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【랜덤임관상품】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getWeapName($it).">(을)를 습득했습니다!";
} elseif($vote == 3) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【건국상품】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getWeapName($it).">(을)를 습득했습니다!";
}
break;
case 1:
$log[] = "●>".getBookName($it).">(을)를 습득했습니다!";
$alllog[0] = "●>{$game['month']}월:{$general['name']}>(이)가 ".getBookName($it).">(을)를 습득했습니다!";
addHistory($general, "●>{$game['year']}년 {$game['month']}월:".getBookName($it).">(을)를 습득");
if($vote == 0) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【아이템】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getBookName($it).">(을)를 습득했습니다!";
} elseif($vote == 1) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【설문상품】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getBookName($it).">(을)를 습득했습니다!";
} elseif($vote == 2) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【랜덤임관상품】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getBookName($it).">(을)를 습득했습니다!";
} elseif($vote == 3) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【건국상품】 >{$nation['name']} >의 {$general['name']}>(이)가 ".getBookName($it).">(을)를 습득했습니다!";
}
break;
case 2:
$log[] = "●>".getHorseName($it).">(을)를 습득했습니다!";
$alllog[0] = "●>{$game['month']}월:{$general['name']}>(이)가 ".getHorseName($it).">(을)를 습득했습니다!";
addHistory($general, "●>{$game['year']}년 {$game['month']}월:".getHorseName($it).">(을)를 습득");
if($vote == 0) {
$history[0] = "●>{$game['year']}년 {$game['month']}월:【아이템】 >