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 " "; break; case 1: echo " "; break; case 2: echo " "; break; } } else { echo " "; } } 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 " "; } 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 " "; } 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 " "; 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 " "; } echo "
$name $message[0] $when
$message[1]
{$regen['name']} $reply
댓글달기

"; } 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']}월:【아이템】{$nation['name']}{$general['name']}(이)가 ".getHorseName($it)."(을)를 습득했습니다!"; } elseif($vote == 1) { $history[0] = "●{$game['year']}년 {$game['month']}월:【설문상품】{$nation['name']}{$general['name']}(이)가 ".getHorseName($it)."(을)를 습득했습니다!"; } elseif($vote == 2) { $history[0] = "●{$game['year']}년 {$game['month']}월:【랜덤임관상품】{$nation['name']}{$general['name']}(이)가 ".getHorseName($it)."(을)를 습득했습니다!"; } elseif($vote == 3) { $history[0] = "●{$game['year']}년 {$game['month']}월:【건국상품】{$nation['name']}{$general['name']}(이)가 ".getHorseName($it)."(을)를 습득했습니다!"; } break; case 3: $log[] = "".getItemName($it)."(을)를 습득했습니다!"; $alllog[0] = "●{$game['month']}월:{$general['name']}(이)가 ".getItemName($it)."(을)를 습득했습니다!"; addHistory($general, "●{$game['year']}년 {$game['month']}월:".getItemName($it)."(을)를 습득"); if($vote == 0) { $history[0] = "●{$game['year']}년 {$game['month']}월:【아이템】{$nation['name']}{$general['name']}(이)가 ".getItemName($it)."(을)를 습득했습니다!"; } elseif($vote == 1) { $history[0] = "●{$game['year']}년 {$game['month']}월:【설문상품】{$nation['name']}{$general['name']}(이)가 ".getItemName($it)."(을)를 습득했습니다!"; } elseif($vote == 2) { $history[0] = "●{$game['year']}년 {$game['month']}월:【랜덤임관상품】{$nation['name']}{$general['name']}(이)가 ".getItemName($it)."(을)를 습득했습니다!"; } elseif($vote == 3) { $history[0] = "●{$game['year']}년 {$game['month']}월:【건국상품】{$nation['name']}{$general['name']}(이)가 ".getItemName($it)."(을)를 습득했습니다!"; } break; } pushAllLog($alllog); pushHistory($history); } } return $log; } function checkAbility($connect, $general, $log) { $limit = GameConst::upgradeLimit; $query = "select no,leader,leader2,power,power2,intel,intel2 from general where no='{$general['no']}'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $general = MYDB_fetch_array($result); if($general['leader2'] < 0) { $query = "update general set leader2='$limit'+leader2,leader=leader-1 where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $log[] = "통솔이 1 떨어졌습니다!"; } elseif($general['leader2'] >= $limit) { $query = "update general set leader2=leader2-'$limit',leader=leader+1 where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $log[] = "통솔이 1 올랐습니다!"; } if($general['power2'] < 0) { $query = "update general set power2='$limit'+power2,power=power-1 where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $log[] = "무력이 1 떨어졌습니다!"; } elseif($general['power2'] >= $limit) { $query = "update general set power2=power2-'$limit',power=power+1 where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $log[] = "무력이 1 올랐습니다!"; } if($general['intel2'] < 0) { $query = "update general set intel2='$limit'+intel2,intel=intel-1 where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $log[] = "지력이 1 떨어졌습니다!"; } elseif($general['intel2'] >= $limit) { $query = "update general set intel2=intel2-'$limit',intel=intel+1 where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $log[] = "지력이 1 올랐습니다!"; } return $log; } function checkDedication($connect, $general, $log) { $dedlevel = getDedLevel($general['dedication']); $query = "update general set dedlevel='$dedlevel' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 승급했다면 if($general['dedlevel'] < $dedlevel) { $log[] = "".getDed($general['dedication'])."(으)로 승급하여 봉록이 ".getBill($general['dedication'])."(으)로 상승했습니다!"; // 강등했다면 } elseif($general['dedlevel'] > $dedlevel) { $log[] = "".getDed($general['dedication'])."(으)로 강등되어 봉록이 ".getBill($general['dedication'])."(으)로 하락했습니다!"; } return $log; } function checkExperience($connect, $general, $log) { $explevel = getExpLevel($general['experience']); $query = "update general set explevel='$explevel' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 승급했다면 if($general['explevel'] < $explevel) { $log[] = "Lv $explevel로 레벨업!"; // 강등했다면 } elseif($general['explevel'] > $explevel) { $log[] = "Lv $explevel로 레벨다운!"; } return $log; } function getAdmin($connect) { $query = "select * from game where no='1'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); return $admin; } function getMe($connect) { $query = "select * from general where owner='{$_SESSION['noMember']}'"; $result = MYDB_query($query, $connect) or Error("접속자가 많아 접속을 중단합니다. 잠시후 갱신해주세요.
getMe : ".MYDB_error($connect),""); $me = MYDB_fetch_array($result); return $me; } function getTroop($connect, $troop) { $query = "select * from troop where troop='$troop'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $troop = MYDB_fetch_array($result); return $troop; } function getCity($connect, $city, $sel="*") { $query = "select {$sel} from city where city='$city'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $city = MYDB_fetch_array($result); return $city; } function getNation($connect, $nation) { $query = "select * from nation where nation='$nation'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $nation = MYDB_fetch_array($result); return $nation; } function deleteNation($connect, $general) { $date = substr($general['turntime'],11,5); $query = "select year,month from game where no='1'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); $nation = getNationStaticInfo($general['nation']); $history[] = "●{$admin['year']}년 {$admin['month']}월:【멸망】{$nation['name']}은(는) 멸망했습니다."; // 전 장수 재야로 // 전 장수 소속 무소속으로 $query = "update general set belong=0,troop=0,level=0,nation=0,makelimit=12 where nation='{$general['nation']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 도시 공백지로 $query = "update city set nation=0,front=0,gen1=0,gen2=0,gen3=0 where nation='{$general['nation']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 부대 삭제 $query = "delete from troop where nation='{$general['nation']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 국가 삭제 $query = "delete from nation where nation='{$general['nation']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); // 외교 삭제 $query = "delete from diplomacy where me='{$general['nation']}' or you='{$general['nation']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); pushHistory($history); refreshNationStaticInfo(); } function nextRuler($connect, $general) { $query = "select year,month from game where no='1'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); $query = "select nation,name from nation where nation='{$general['nation']}'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $nation = MYDB_fetch_array($result); $query = "select no,name from general where nation='{$general['nation']}' and level!='12' and level>='9' order by level desc"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $corecount = MYDB_num_rows($result); //npc or npc유저인 경우 후계 찾기 if($general['npc'] > 0) { $query = "select no,name,nation,IF(ABS(npcmatch-'{$general['npcmatch']}')>75,150-ABS(npcmatch-'{$general['npcmatch']}'),ABS(npcmatch-'{$general['npcmatch']}')) as npcmatch2 from general where nation='{$general['nation']}' and level!=12 and npc>0 order by npcmatch2,rand() limit 0,1"; $npcresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $npccount = MYDB_num_rows($npcresult); } else { $npccount = 0; } // 수뇌부가 없으면 공헌도 최고 장수 if($npccount > 0) { $nextruler = MYDB_fetch_array($npcresult); //국명 교체 //$query = "update nation set name='{$nextruler['name']}' where nation='{$general['nation']}'"; //MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); } elseif($corecount == 0) { $query = "select no,name from general where nation='{$general['nation']}' and level!='12' order by dedication desc"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $corecount = MYDB_num_rows($result); // 아무도 없으면 국가 삭제 if($corecount == 0) { //분쟁기록 모두 지움 DeleteConflict($connect, $general['nation']); deleteNation($connect, $general); return; } else { $nextruler = MYDB_fetch_array($result); } } else { $nextruler = MYDB_fetch_array($result); } //군주 교체 $query = "update general set level='12' where no='{$nextruler['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); //도시관직해제 $query = "update city set gen1=0 where gen1='{$nextruler['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); //도시관직해제 $query = "update city set gen2=0 where gen2='{$nextruler['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); //도시관직해제 $query = "update city set gen3=0 where gen3='{$nextruler['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $history[] = "●{$admin['year']}년 {$admin['month']}월:【유지】{$nextruler['name']}(이)가 {$nation['name']}의 유지를 이어 받았습니다"; pushHistory($history); addNationHistory($nation, "●{$admin['year']}년 {$admin['month']}월:【유지】{$nextruler['name']}(이)가 {$nation['name']}의 유지를 이어 받음."); // 장수 삭제 및 부대처리는 checkTurn에서 } function distance($connect, $from, $maxDist=99) { include_once("queue.php"); $query = "select city,path from city"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $cityNum = MYDB_num_rows($result); for($i=0; $i < $cityNum; $i++) { $city = MYDB_fetch_array($result); $cityPath[$city['city']] = $city['path']; $dist[$city['city']] = 99; } $select = 0; $queue = new Queue(20); $queue2 = new Queue(20); $q = $queue; $q2 = $queue2; $distance = $dist[$from] = 0; $q->push($from); while($q->getSize() > 0 || $q2->getSize() > 0) { $distance++; if($distance > $maxDist) return $dist; while($q->getSize() > 0) { $city = $q->pop(); unset($path); $path = explode("|", $cityPath[$city]); for($i=0; $i < count($path); $i++) { if($dist[$path[$i]] > $distance) { $dist[$path[$i]] = $distance; $q2->push($path[$i]); } } } if($select == 0) { $q2 = $queue; $q = $queue2; } else { $q = $queue; $q2 = $queue2; } $select = 1 - $select; } return $dist; } function isClose($connect, $nation1, $nation2) { $isClose = 0; // $nation1의 모든 도시 $query = "select path from city where nation='$nation1'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $citycount = MYDB_num_rows($result); // 국가의 모든 도시 검색 for($i=0; $i < $citycount; $i++) { $city = MYDB_fetch_array($result); // 각 도시당 모든 인접 도시 플래그 세팅 $path = explode("|", $city['path']); for($j=0; $j < count($path); $j++) { $barrier[$path[$j]] = 1; } } // $nation2의 모든 도시 선택 $query = "select city from city where nation='$nation2'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $citycount = MYDB_num_rows($result); for($i=0; $i < $citycount; $i++) { $city = MYDB_fetch_array($result); if($barrier[$city['city']] == 1) { $isClose = 1; } } return $isClose; } function CharExperience($exp, $personal) { switch($personal) { case 0: case 1; case 6: $exp *= 1.1; break; case 4: case 5: case 7: case 10: $exp *= 0.9; break; } $exp = round($exp); return $exp; } function CharDedication($ded, $personal) { switch($personal) { case 10: $ded *= 0.9; break; } $ded = round($ded); return $ded; } function CharAtmos($atmos, $personal) { switch($personal) { case 2: case 4: $atmos += 5; break; case 0: case 9: case 10: $atmos -= 5; break; } return $atmos; } function CharTrain($train, $personal) { switch($personal) { case 3: case 5: $train += 5; break; case 1: case 8: case 10: $train -= 5; break; } return $train; } function CharCost($cost, $personal) { switch($personal) { case 7: case 8: case 9: $cost *= 0.8; break; case 2: case 3: case 6: $cost *= 1.2; break; } return $cost; } function CharCritical($rate, $personal) { switch($personal) { case 10: $rate += 10; break; } return $rate; } function TrickInjury($connect, $city, $type=0) { $query = "select year,month 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,nation from general where city='$city'"; $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $gencount = MYDB_num_rows($result); if($type == 0) { $log[0] = "●{$admin['month']}월:계략으로 인해 부상을 당했습니다."; } else { $log[0] = "●{$admin['month']}월:재난으로 인해 부상을 당했습니다."; } for($i=0; $i < $gencount; $i++) { $general = MYDB_fetch_array($result); $injury = rand() % 100; if($injury < 30) { // 부상률 30% $injury = floor($injury / 2) + 1; // 부상 1~16 $query = "update general set crew=crew*0.98,atmos=atmos*0.98,train=train*0.98,injury=injury+'$injury' where no='{$general['no']}'"; MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); pushGenLog($general, $log); } } } function getRandTurn($term) { switch($term) { case 0: $randtime = rand() % 7200; break; case 1: $randtime = rand() % 3600; break; case 2: $randtime = rand() % 1800; break; case 3: $randtime = rand() % 1200; break; case 4: $randtime = rand() % 600; break; case 5: $randtime = rand() % 300; break; case 6: $randtime = rand() % 120; break; case 7: $randtime = rand() % 60; break; default:$randtime = rand() % 3600; break; } $turntime = date('Y-m-d H:i:s', strtotime('now') + $randtime); return $turntime; } function getRandTurn2($term) { switch($term) { case 0: $randtime = rand() % 7200; break; case 1: $randtime = rand() % 3600; break; case 2: $randtime = rand() % 1800; break; case 3: $randtime = rand() % 1200; break; case 4: $randtime = rand() % 600; break; case 5: $randtime = rand() % 300; break; case 6: $randtime = rand() % 120; break; case 7: $randtime = rand() % 60; break; default:$randtime = rand() % 3600; break; } $turntime = date('Y-m-d H:i:s', strtotime('now') - $randtime); return $turntime; }