diff --git a/hwe/b_myCityInfo.php b/hwe/b_myCityInfo.php index c6f67f91..b3e4fd7b 100644 --- a/hwe/b_myCityInfo.php +++ b/hwe/b_myCityInfo.php @@ -37,13 +37,10 @@ $sel = [$type => "selected"]; <?=UniqueConst::$serverName?>: 세력도시 - - - - + diff --git a/hwe/js/ext.expand_city.js b/hwe/js/ext.expand_city.js deleted file mode 100644 index dc946be3..00000000 --- a/hwe/js/ext.expand_city.js +++ /dev/null @@ -1,899 +0,0 @@ - -$(function() { - - var cityList = {}; - var userList = {}; - - var cityGroupOrder = ['하북','중원','서북','서촉','남중','초','오월','동이']; - var city규모 = {특:1,대:2,중:3,소:4,이:5,진:6,관:7,수:8}; - window.cityList = cityList; - window.userList = userList; - - var basicPath = document.location.pathname; - basicPath = basicPath.substring(0, basicPath.lastIndexOf('/'))+'/'; - - - - var mergeSort = function(arr,cmpFunc){ - - if(typeof cmpFunc == "undefined"){ - cmpFunc = function(a,b){ - if(ab) return 1; - return 0; - } - } - - var merge = function(left,right){ - var retVal=[]; - - var leftIdx=0; - var rightIdx=0; - - while(leftIdx'+ - '
'+ - ''+ - '
도시태수군사종사
'+ - '
: '+ - '
'+ - ''+ - ''+ - ''+ - '
'); - $win.hide(); - - $win.css('font-size','9pt'); - - - - $('#fake_form').css('display','inline'); - $('body').append($win); - - $('#inner_table').attr('border','1').attr('cellspacing',"0").attr('cellpadding',"0") - .attr('bordercolordark',"gray").attr('bordercolorlight',"black").attr('align','center') - .css('font-size','13px').css('width','290px'); - - $('#inner_table thead tr'); - - $('#fake_form').submit(function(){ - return false; - }); - - $('#in_frame').load(function(){ - $('#in_frame').contents().find('div').click(function(){$('#city_select').change();}); - }); - - $("#duty_radio").buttonset(); - - var $city_select = $('#city_select'); - $city_select.css('color','white').css('background-color','black'); - - - $city_select.change(function(event){ - if($city_select.val()==null){ - $city_select.val(tmpOldVal); - return false; - } - - if($city_select.val() == tmpOldVal){ - return false; - } - - tmpOldVal = $city_select.val(); - //console.log(tmpOldVal); - var newInfo = subCityList[tmpOldVal]; - var cityInfo = newInfo.city; - - var p태수 = cityInfo.p태수 && currUser.p태수; - var p군사 = cityInfo.p군사 && currUser.p군사; - var p종사 = cityInfo.p종사 && currUser.p종사; - - //console.log(p태수,p군사,p종사); - - $('#duty_type1').button({disabled:!p태수}); - $('#duty_type2').button({disabled:!p군사}); - $('#duty_type3').button({disabled:!p종사}); - - var $태수 = cityInfo.$태수; - var $군사 = cityInfo.$군사; - var $종사 = cityInfo.$종사; - - - - return true; - }); - - - $win.dialog({ - autoOpen:false, - width:1005, - height:680, - buttons:{ - "임명":function(){ - //console.log("임명!"); - - var $checked = $('#duty_radio :radio:checked'); - - if($checked.length==0 || $checked.attr('disabled')=='disabled'){ - alert('직책을 선택해주세요!'); - return false; - } - var type = $checked.attr('value'); - var text = $checked.next().text(); - var userVal = currUser.val; - var userName = currUser.name; - var cityVal = $city_select.val(); - - var cityInfo = subCityList[cityVal].city; - - $.post(basicPath+'j_myBossInfo.php',{ - destCityID:cityVal, - destGeneralID:userVal, - officerLevel:type, - action:'임명' - },function(rawData){ - - cityInfo['p'+text]=false; - var $target = cityInfo.users.find('.mode_'+type); - $target.prop('disabled',true); - $target.css('background','transparent'); - $target.css('border','0'); - $target.css('color',''); - - cityInfo['$'+text].html(userName); - - $win.dialog("close"); - }); - - - }, - "닫기":function(){ - $win.dialog("close"); - } - - } - }); - - - - //console.log($win.parent()); - $win.parent().css('font-size','10pt'); - } - - $('#ext_win').dialog("close").dialog( "option", "position", { my: "center top", at: "center bottom", of: userInfo.$user} ); - - var $innerContent = $('#inner_table .content'); - $innerContent.html(''); - $("#user_name").html(userInfo.name+'['+userInfo.city+']'); - - $('#city_select').html(''); - - $.each(cityList,function(idx,cityInfo){ - var 지역 = cityInfo.지역; - - var p태수 = cityInfo.p태수 && currUser.p태수; - var p군사 = cityInfo.p군사 && currUser.p군사; - var p종사 = cityInfo.p종사 && currUser.p종사; - - var newInfo = { - 지역 : 지역, - 규모 : cityInfo.규모, - 이름 : cityInfo.이름, - val : cityInfo.val, - city : cityInfo, - p태수 : p태수, - p군사 : p군사, - p종사 : p종사 - }; - - //console.log(newInfo); - - if(p태수 || p군사 || p종사){ - if(typeof subCityGroupList[지역] == 'undefined'){ - subCityGroupList[지역] = []; - } - subCityGroupList[지역].push(newInfo); - subCityList[cityInfo.val] = newInfo; - } - - }); - - $.each(cityGroupOrder,function(idx,groupName){ - if(typeof subCityGroupList[groupName] == 'undefined'){ - - return true; - } - - var subList = subCityGroupList[groupName]; - - var $group = $('【 '+groupName+' 】'); - $innerContent.append($group); - - subList.sort(function(a,b){ - - var cmp규모 = city규모[a.규모] - city규모[b.규모]; - if(cmp규모 != 0) return cmp규모; - - return a.이름.localeCompare(b.이름); - }); - var $optgroup = $(''); - - $.each(subList,function(idx,newInfo){ - $optgroup.append(''); - - var cityInfo = newInfo.city; - var $city = $(''+newInfo.이름+''); - - var $태수 = cityInfo.$태수.clone(); - $city.append($태수); - if(!newInfo.p태수){ - $태수.css('color','red'); - } - else{ - $태수.click(function(){ - $('#duty_radio :radio:eq(0)').attr('checked','checked'); - $('#duty_radio :radio').button('refresh'); - }).css('cursor','pointer'); - } - - - var $군사 = cityInfo.$군사.clone(); - $city.append($군사); - if(!newInfo.p군사)$군사.css('color','red'); - else{ - $군사.click(function(){ - $('#duty_radio :radio:eq(1)').attr('checked','checked'); - $('#duty_radio :radio').button('refresh'); - }).css('cursor','pointer'); - } - - var $종사 = cityInfo.$종사.clone(); - $city.append($종사); - if(!newInfo.p종사)$종사.css('color','red'); - else{ - $종사.click(function(){ - $('#duty_radio :radio:eq(2)').attr('checked','checked'); - $('#duty_radio :radio').button('refresh'); - }).css('cursor','pointer'); - } - - $innerContent.append($city); - $city.click(function(){ - $('#city_select').val(newInfo.val).change(); - }); - - }); - - $('#city_select').append($optgroup); - }); - - tmpOldVal = $('#city_select').val(); - $('#city_select').change(); - $('#ext_win').dialog("open"); - }; - - var loadDuty = function(){ - - try{ - $('.for_duty').remove(); - $.get(basicPath+'b_myBossInfo.php',function(rawData){ - $html = $(rawData); - //window.$html = $html; - - var cnt =0; - var $tmpTable = $html.filter('#officer_list').eq(0); - - $selects = $tmpTable.find("select"); - if($selects.length == 0){ - alert("수뇌가 아닙니다!"); - return false; - } - - var setUserAvailable = function($userList,typeName){ - $userList.each(function(idx){ - var $this = $(this); - - var val = $this.val(); - var name = $.trim($this.text()); - - for(var i=name.length-1;i>0;i--){ - if(name[i]=='【'){ - name = $.trim(name.substr(0,i)); - break; - } - } - - if(val == '0'){ - return true; - } - - if(typeof userList[name] != 'undefined'){ - userList[name].val = val; - userList[name][typeName] = true; - } - - }); - }; - - var setCityAvailiable = function($cityList,typeName){ - $cityList.each(function(idx){ - - var $this = $(this); - - var val = $.trim($this.val()); - var name = $.trim($this.text()); - - cityList[name].val = val; - cityList[name][typeName] = true; - }); - } - - $.each(cityList,function(idx,cityInfo){ - cityInfo.p태수=false; - cityInfo.p군사=false; - cityInfo.p종사=false; - }); - - $.each(userList,function(idx,userInfo){ - userInfo.p태수=false; - userInfo.p군사=false; - userInfo.p종사=false; - }); - - setUserAvailable($selects.eq(1).find("option"),"p태수"); - setUserAvailable($selects.eq(3).find("option"),"p군사"); - setUserAvailable($selects.eq(5).find("option"),"p종사"); - - setCityAvailiable($selects.eq(0).find("option"),"p태수"); - setCityAvailiable($selects.eq(2).find("option"),"p군사"); - setCityAvailiable($selects.eq(4).find("option"),"p종사"); - - - $.each(cityList,function(idx,cityInfo){ - - //console.log(cityInfo.users.children()); - - cityInfo.users.children().each(function(idx){ - //console.log(this); - var $this = $(this); - - var username = $this.data('username'); - - var userInfo = userList[username]; - if(!userInfo){ - return true; - } - - if(userInfo.val == '-1'){ - return true; - } - - $name = $this.find('.nameplate'); - - $name.append('
'); - - - var addBtn=function($name,cityInfo,userInfo,type,text,warn){ - - var enabled = cityInfo['p'+text]&&userInfo['p'+text]; - var cityVal = cityInfo.val; - var $btn = $(''); - $btn.addClass('mode_'+type); - $btn.addClass('for_duty'); - - if(!enabled){ - $btn.prop('disabled',true); - $btn.css('background','transparent'); - $btn.css('border','0'); - } - else{ - if(userInfo.is수뇌){ - $btn.css('color','red'); - } - } - - $btn.css('padding','1px 4px'); - $btn.css('margin','0'); - - $btn.click(function(){ - if(userInfo.is수뇌){ - if(!confirm('수뇌입니다. 임명할까요?')){ - return false; - } - } - - $.post(basicPath+'j_myBossInfo.php',{ - destCityID:cityVal, - destGeneralID:userInfo.val, - officerLevel:type, - action:'임명' - },function(rawData){ - - cityInfo['p'+text]=false; - var $target = cityInfo.users.find('.mode_'+type); - $target.prop('disabled',true); - $target.css('background','transparent'); - $target.css('border','0'); - $target.css('color',''); - - cityInfo['$'+text].html(userInfo.name); - }); - }); - - //console.log($btn); - $name.append($btn); - }; - - addBtn($name,cityInfo,userInfo,4,'태수'); - addBtn($name,cityInfo,userInfo,3,'군사'); - addBtn($name,cityInfo,userInfo,2,'종사'); - - //특수 버튼! - if(userInfo.p태수||userInfo.p군사||userInfo.p종사){ - var $btn = $(''); - $btn.addClass('for_duty'); - if(userInfo.is수뇌){ - $btn.css('color','red'); - } - $btn.css('padding','1px 4px'); - $btn.css('margin','0'); - - $btn.click(function(){ - if(userInfo.is수뇌){ - if(!confirm('수뇌입니다. 임명할까요?')){ - return false; - } - } - - extDutyWindow(userInfo); - }); - - $btn.css('border','solid 1px Chocolate').css('background-color','#400000').css('margin-left','4px'); - $btn.css('line-hight','20px').css('color','GhostWhite').css('padding','2px 2px').css('height','18px').css('line-height','8px'); - - //$name.append($btn); - - } - }); - }); - - }); - - - } - catch(a){ - console.log(a); - } - - return false; - }; - - var loadUser = function(){ - $.each(cityList,function(idx,val){ - if(typeof val.users == "undefined"){ - val.obj.append(''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '
이 름통무지부 대자 금군 량병 종병 사훈련사기명 령삭턴
'); - - val.users = val.obj.find(".cityUserBody"); - } - else{ - val.users.html(""); - } - }); - - - $.get(basicPath+'b_genList.php',function(rawData){ - var cnt =0; - - var $helper = $('#helper_genlist'); - $helper.html('').append($.parseHTML(rawData)); - - var tmpUsers = $('#general_list tbody tr'); - - tmpUsers.each(function(idx){ - var $this = $(this); - - var $city = $this.children('.i_city'); - $city.remove(); - var cityName = $.trim($city.text()); - - var $name = $this.children('.i_name'); - $name.addClass('nameplate'); - - var name = $name.find('.t_name').text(); - - var $work = $this.children('.i_action'); - - var cityInfo = cityList[cityName]; - if(typeof cityInfo == 'undefined'){ - return true; - } - if(cityInfo.warn주민)$work.html($work.html().split('정착 장려').join('정착 장려')); - if(cityInfo.warn농업)$work.html($work.html().split('농지 개간').join('농지 개간')); - if(cityInfo.warn상업)$work.html($work.html().split('상업 투자').join('상업 투자')); - if(cityInfo.warn치안)$work.html($work.html().split('치안 강화').join('치안 강화')); - if(cityInfo.warn수비)$work.html($work.html().split('수비 강화').join('수비 강화')); - if(cityInfo.warn성벽)$work.html($work.html().split('성벽 보수').join('성벽 보수')); - - - - var $stat = $this.children('.i_stat'); - var stat = $stat.text(); - - var is수뇌 = stat.indexOf('+')>=0; - - $this.data('username',name); - - if(cityList[cityName].$태수.text() == name){ - cityList[cityName].$태수.html('{0}'.format(name)); - } - if(cityList[cityName].$군사.text() == name){ - cityList[cityName].$군사.html('{0}'.format(name)); - } - if(cityList[cityName].$종사.text() == name){ - cityList[cityName].$종사.html('{0}'.format(name)); - } - - userList[name]={ - $city:cityInfo, - city:cityName, - $user:$this, - name:name, - val:'-1', - p태수:false, - p군사:false, - p종사:false, - is수뇌:is수뇌 - }; - - if(cityList[cityName]){ - cityList[cityName].users.append($this); - } - - }); - }); - - if($("#loadDutyBtn").length == 0){ - - var $onBossList = $(''); - $onBossList.click(function(){ - loadDuty(); - return false; - }); - - $('form').append($onBossList); - } - - $('#by_users').show(); - }; - - var mainFunc = function(){ - //대상 추출 - window.cityList = {}; - window.userList = {}; - - $("form").each(function(){ - var $this = $(this); - $this.attr('name','p'+$this.attr('name')); - }); - - $("table").each(function(idx,val){ - $this = $(this); - - - if($this.attr('class')=='tb_layout bg2'){ - $this.addClass('cityInfo'); - } - else{ - return true; - } - - window.$tmpTable = $this; - var cityInfo = {}; - - //이름 추출 - { - - var titleText = $this.find('tr:eq(0)>td:eq(0)').text(); - var loc0 = titleText.indexOf("【"); - var loc1 = titleText.indexOf("|"); - var loc2 = titleText.indexOf("】"); - - var cityLoc = $.trim(titleText.substring(loc0+1,loc1)); - var citySize = $.trim(titleText.substring(loc1+1,loc2)); - var cityName = $.trim(titleText.substring(loc2+1)); - - cityName = cityName.replace("[",""); - cityName = cityName.replace("]",""); - - $this.data('cityname',cityName); - - cityInfo.지역 = cityLoc; - cityInfo.규모 = citySize; - cityInfo.이름 = cityName; - - cityInfo.val = '-1'; - - cityInfo.p태수 = false; - cityInfo.p군사 = false; - cityInfo.p종사 = false; - - } - - //주민, 농상치성수 - - - { - var $baseTr = $this.find('tr:eq(1)'); - cityInfo.$주민 = $baseTr.find('td:eq(1)'); - cityInfo.$농업 = $baseTr.find('td:eq(3)'); - cityInfo.$상업 = $baseTr.find('td:eq(5)'); - cityInfo.$치안 = $baseTr.find('td:eq(7)'); - cityInfo.$수비 = $baseTr.find('td:eq(9)'); - cityInfo.$성벽 = $baseTr.find('td:eq(11)'); - - var tmpVal; - - tmpVal = cityInfo.$주민.text().split('/'); - cityInfo.주민 = parseInt(tmpVal[0]); - cityInfo.max주민 = parseInt(tmpVal[1]); - - tmpVal = cityInfo.$농업.text().split('/'); - cityInfo.농업 = parseInt(tmpVal[0]); - cityInfo.max농업 = parseInt(tmpVal[1]); - - tmpVal = cityInfo.$상업.text().split('/'); - cityInfo.상업 = parseInt(tmpVal[0]); - cityInfo.max상업 = parseInt(tmpVal[1]); - - tmpVal = cityInfo.$치안.text().split('/'); - cityInfo.치안 = parseInt(tmpVal[0]); - cityInfo.max치안 = parseInt(tmpVal[1]); - - tmpVal = cityInfo.$수비.text().split('/'); - cityInfo.수비 = parseInt(tmpVal[0]); - cityInfo.max수비 = parseInt(tmpVal[1]); - - tmpVal = cityInfo.$성벽.text().split('/'); - cityInfo.성벽 = parseInt(tmpVal[0]); - cityInfo.max성벽 = parseInt(tmpVal[1]); - - if (cityInfo.주민>cityInfo.max주민*0.9){ cityInfo.$주민.css('color','lightgreen');} - else if (cityInfo.주민>cityInfo.max주민*0.7){ cityInfo.$주민.css('color','yellow');} - else { cityInfo.$주민.css('color','orangered');} - - if (cityInfo.농업>cityInfo.max농업*0.8){ cityInfo.$농업.css('color','lightgreen');} - else if (cityInfo.농업>cityInfo.max농업*0.4){ cityInfo.$농업.css('color','yellow');} - else { cityInfo.$농업.css('color','orangered');} - - if (cityInfo.상업>cityInfo.max상업*0.8){ cityInfo.$상업.css('color','lightgreen');} - else if (cityInfo.상업>cityInfo.max상업*0.4){ cityInfo.$상업.css('color','yellow');} - else { cityInfo.$상업.css('color','orangered');} - - if (cityInfo.치안>cityInfo.max치안*0.8){ cityInfo.$치안.css('color','lightgreen');} - else if (cityInfo.치안>cityInfo.max치안*0.4){ cityInfo.$치안.css('color','yellow');} - else { cityInfo.$치안.css('color','orangered');} - - if (cityInfo.수비>cityInfo.max수비*0.6){ cityInfo.$수비.css('color','lightgreen');} - else if (cityInfo.수비>cityInfo.max수비*0.3){ cityInfo.$수비.css('color','yellow');} - else { cityInfo.$수비.css('color','orangered');} - - if (cityInfo.성벽>cityInfo.max성벽*0.6){ cityInfo.$성벽.css('color','lightgreen');} - else if (cityInfo.성벽>cityInfo.max성벽*0.3){ cityInfo.$성벽.css('color','yellow');} - else { cityInfo.$성벽.css('color','orangered');} - - - cityInfo.remain주민 = cityInfo.주민-cityInfo.max주민; - cityInfo.remain농업 = cityInfo.농업-cityInfo.max농업; - cityInfo.remain상업 = cityInfo.상업-cityInfo.max상업; - cityInfo.remain치안 = cityInfo.치안-cityInfo.max치안; - cityInfo.remain수비 = cityInfo.수비-cityInfo.max수비; - cityInfo.remain성벽 = cityInfo.성벽-cityInfo.max성벽; - - cityInfo.warn주민 = false; - cityInfo.warn농업 = false; - cityInfo.warn상업 = false; - cityInfo.warn치안 = false; - cityInfo.warn수비 = false; - cityInfo.warn성벽 = false; - - if(cityInfo.remain주민 > -10*2000) cityInfo.warn주민 = true; - if(cityInfo.주민 > 0.92*cityInfo.max주민) cityInfo.warn주민 = true; - if(cityInfo.remain농업 > -10*100) cityInfo.warn농업 = true; - if(cityInfo.remain상업 > -10*100) cityInfo.warn상업 = true; - if(cityInfo.remain치안 > -10*100) cityInfo.warn치안 = true; - if(cityInfo.remain수비 > -10*70) cityInfo.warn수비 = true; - if(cityInfo.remain성벽 > -10*70) cityInfo.warn성벽 = true; - - if(cityInfo.warn농업) cityInfo.$농업.append('['+cityInfo.remain농업+']'); - if(cityInfo.warn상업) cityInfo.$상업.append('['+cityInfo.remain상업+']'); - if(cityInfo.warn치안) cityInfo.$치안.append('['+cityInfo.remain치안+']'); - if(cityInfo.warn수비) cityInfo.$수비.append('['+cityInfo.remain수비+']'); - if(cityInfo.warn성벽) cityInfo.$성벽.append('['+cityInfo.remain성벽+']'); - - } - - //태수,군사,종사 - { - var $baseTr = $this.find('tr:eq(2)'); - cityInfo.$태수 = $baseTr.find('td:eq(7)'); - cityInfo.$군사 = $baseTr.find('td:eq(9)'); - cityInfo.$종사 = $baseTr.find('td:eq(11)'); - } - - //기타 - { - - cityInfo.userCnt = $this.find('tr:eq(3) td:eq(1)').text().split(',').length -1; - } - - cityInfo.obj = $this; - cityList[cityInfo.이름] = cityInfo; - }); - - - var $onGenList = $(''); - $onGenList.click(function(){ - loadUser(); - return false; - }); - $('form').append($onGenList); - - - $('table:eq(0) tr:last').after(''); - - - $sort_more = $('#sort_more'); - $sort_more.html('재 정렬 순서 :'); - - var sortIt = function(callback){ - var arCity = []; - $('.cityInfo').each(function(){ - var $this = $(this); - var cityName = $this.data('cityname'); - - var cityInfo = cityList[cityName]; - arCity.push(cityInfo); - }); - - arCity = mergeSort(arCity,callback); - //console.log(arCity); - - var $anchor = $('.anchor'); - //console.log($anchor); - - $('body > br').remove(); - - $('.cityInfo').detach(); - - $.each(arCity,function(idx,val){ - $anchor.before('
'); - $anchor.before(val.obj); - }); - $anchor.before('
'); - - }; - - var $btn; - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.이름.localeCompare(b.이름); - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return 1.0*a.주민/a.max주민 - 1.0*b.주민/b.max주민; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.remain주민 - b.remain주민; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.remain농업 - b.remain농업; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.remain상업 - b.remain상업; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.remain치안 - b.remain치안; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.remain수비 - b.remain수비; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return a.remain성벽 - b.remain성벽; - }); - }); - $sort_more.append($btn); - - $btn = $('').click(function(){ - sortIt(function(a,b){ - return b.userCnt - a.userCnt; - }); - }); - $sort_more.append($btn); - }; - - mainFunc(); -}); \ No newline at end of file diff --git a/hwe/ts/extExpandCity.ts b/hwe/ts/extExpandCity.ts new file mode 100644 index 00000000..aff0751f --- /dev/null +++ b/hwe/ts/extExpandCity.ts @@ -0,0 +1,670 @@ + +import $ from 'jquery'; +import { unwrap_any } from './util/unwrap_any'; + +type UserItem = { + val: string, + name: string, + city: string, + + + 태수: boolean, + 군사: boolean, + 종사: boolean, + is수뇌: boolean, + $city: CityItem, + $user: JQuery, +} + +type CityLevel = '특' | '대' | '중' | '소' | '이' | '진' | '관' | '수' + +type OfficerItem = { + preserved: boolean, + $obj: JQuery +} + +type CityItem = { + 지역: string, + 규모: CityLevel, + 이름: string, + + val: string, + users: JQuery, + userCnt: number, + obj: JQuery, + + 태수: OfficerItem, + 군사: OfficerItem, + 종사: OfficerItem, + + warn주민: boolean, + warn농업: boolean, + warn상업: boolean, + warn치안: boolean, + warn수비: boolean, + warn성벽: boolean, + + $주민: JQuery, + $농업: JQuery, + $상업: JQuery, + $치안: JQuery, + $수비: JQuery, + $성벽: JQuery, + + 주민: number, + 농업: number, + 상업: number, + 치안: number, + 수비: number, + 성벽: number, + + max주민: number, + max농업: number, + max상업: number, + max치안: number, + max수비: number, + max성벽: number, + + remain주민: number, + remain농업: number, + remain상업: number, + remain치안: number, + remain수비: number, + remain성벽: number, +}; + +type OfficerSelector = '태수' | '군사' | '종사'; + + +const cityList: Record = {}; +const userList: Record = {}; + +$(function () { + let basicPath = document.location.pathname; + basicPath = basicPath.substring(0, basicPath.lastIndexOf('/')) + '/'; + + const mergeSort = function (arr: T[], cmpFunc: (lhs: T, rhs: T) => number) { + const merge = function (left: T[], right: T[]): T[] { + const retVal = []; + + let leftIdx = 0; + let rightIdx = 0; + + + + while (leftIdx < left.length && rightIdx < right.length) { + const cmpVal = cmpFunc(left[leftIdx], right[rightIdx]); + + if (cmpVal <= 0) { + retVal.push(left[leftIdx]); + leftIdx++; + } + else { + retVal.push(right[rightIdx]); + rightIdx++; + } + } + + return retVal.concat(left.slice(leftIdx)).concat(right.slice(rightIdx)); + }; + + const _mergeSort = function (arr: T[]): T[] { + if (arr.length < 2) { + return arr; + } + + const middle = Math.floor(arr.length / 2); + + const left = arr.slice(0, middle); + const right = arr.slice(middle); + + return merge(_mergeSort(left), _mergeSort(right)); + }; + + return _mergeSort(arr); + + }; + + const loadDuty = function () { + + try { + $('.for_duty').remove(); + void $.get(basicPath + 'b_myBossInfo.php', function (rawData) { + const $html = $(rawData); + + const $tmpTable = $html.filter('#officer_list').eq(0); + + const $selects = $tmpTable.find("select"); + if ($selects.length == 0) { + alert("수뇌가 아닙니다!"); + return false; + } + + const setUserAvailable = function ($userList: JQuery, typeName: OfficerSelector) { + $userList.each(function () { + const $this = $(this); + + const val = unwrap_any($this.val()); + let name = $.trim($this.text()); + + for (let i = name.length - 1; i > 0; i--) { + if (name[i] == '【') { + name = $.trim(name.substr(0, i)); + break; + } + } + + if (val == '0') { + return; + } + + if (userList[name] !== undefined) { + userList[name].val = val; + userList[name][typeName] = true; + } + + }); + }; + + const setCityAvailiable = function ($cityList: JQuery, typeName: OfficerSelector) { + $cityList.each(function () { + + const $this = $(this); + + const val = $.trim(unwrap_any($this.val())); + const name = $.trim($this.text()); + + cityList[name].val = val; + cityList[name][typeName].preserved = true; + }); + } + + for (const cityInfo of Object.values(cityList)) { + cityInfo.태수.preserved = false; + cityInfo.군사.preserved = false; + cityInfo.종사.preserved = false; + } + + $.each(userList, function (idx, userInfo) { + userInfo.태수 = false; + userInfo.군사 = false; + userInfo.종사 = false; + }); + + setUserAvailable($selects.eq(1).find("option"), "태수"); + setUserAvailable($selects.eq(3).find("option"), "군사"); + setUserAvailable($selects.eq(5).find("option"), "종사"); + + setCityAvailiable($selects.eq(0).find("option"), "태수"); + setCityAvailiable($selects.eq(2).find("option"), "군사"); + setCityAvailiable($selects.eq(4).find("option"), "종사"); + + + $.each(cityList, function (idx, cityInfo) { + + //console.log(cityInfo.users.children()); + + cityInfo.users.children().each(function () { + //console.log(this); + const $this = $(this); + + const username = $this.data('username'); + + const userInfo = userList[username]; + if (!userInfo) { + return; + } + + if (userInfo.val == '-1') { + return; + } + + const $name = $this.find('.nameplate'); + + $name.append('
'); + + + const addBtn = function ($name: JQuery, cityInfo: CityItem, userInfo: UserItem, level: number, typeName: OfficerSelector) { + + const enabled = cityInfo[typeName] && userInfo[typeName]; + const cityVal = cityInfo.val; + const $btn = $(''); + $btn.addClass(`mode_${level}`); + $btn.addClass('for_duty'); + + if (!enabled) { + $btn.prop('disabled', true); + $btn.css('background', 'transparent'); + $btn.css('border', '0'); + } + else { + if (userInfo.is수뇌) { + $btn.css('color', 'red'); + } + } + + $btn.css('padding', '1px 4px'); + $btn.css('margin', '0'); + + $btn.click(function () { + if (userInfo.is수뇌) { + if (!confirm('수뇌입니다. 임명할까요?')) { + return false; + } + } + + void $.post(basicPath + 'j_myBossInfo.php', { + destCityID: cityVal, + destGeneralID: userInfo.val, + officerLevel: level, + action: '임명' + }, function () { + cityInfo[typeName].preserved = false; + const $target = cityInfo.users.find(`.mode_${level}`); + $target.prop('disabled', true); + $target.css('background', 'transparent'); + $target.css('border', '0'); + $target.css('color', ''); + + cityInfo[typeName].$obj.html(userInfo.name); + }); + }); + + //console.log($btn); + $name.append($btn); + }; + + addBtn($name, cityInfo, userInfo, 4, '태수'); + addBtn($name, cityInfo, userInfo, 3, '군사'); + addBtn($name, cityInfo, userInfo, 2, '종사'); + }); + }); + + }); + + + } + catch (a) { + console.log(a); + } + + return false; + }; + + const loadUser = function () { + $.each(cityList, function (idx, val) { + if (typeof val.users == "undefined") { + val.obj.append('' + + '' + + '' + + '' + + '' + + '' + + '' + + '
이 름통무지부 대자 금군 량병 종병 사훈련사기명 령삭턴
'); + + val.users = val.obj.find(".cityUserBody"); + } + else { + val.users.html(""); + } + }); + + + void $.get(basicPath + 'b_genList.php', function (rawData) { + const $helper = $('#helper_genlist'); + $helper.html('').append($.parseHTML(rawData)); + + const tmpUsers = $('#general_list tbody tr'); + + tmpUsers.each(function () { + const $this = $(this); + + const $city = $this.children('.i_city'); + $city.remove(); + const cityName = $.trim($city.text()); + + const $name = $this.children('.i_name'); + $name.addClass('nameplate'); + + const name = $name.find('.t_name').text(); + + const $work = $this.children('.i_action'); + + const cityInfo = cityList[cityName]; + if (typeof cityInfo == 'undefined') { + return; + } + if (cityInfo.warn주민) $work.html($work.html().split('정착 장려').join('정착 장려')); + if (cityInfo.warn농업) $work.html($work.html().split('농지 개간').join('농지 개간')); + if (cityInfo.warn상업) $work.html($work.html().split('상업 투자').join('상업 투자')); + if (cityInfo.warn치안) $work.html($work.html().split('치안 강화').join('치안 강화')); + if (cityInfo.warn수비) $work.html($work.html().split('수비 강화').join('수비 강화')); + if (cityInfo.warn성벽) $work.html($work.html().split('성벽 보수').join('성벽 보수')); + + + + const $stat = $this.children('.i_stat'); + const stat = $stat.text(); + + const is수뇌 = stat.indexOf('+') >= 0; + + $this.data('username', name); + + if (cityList[cityName].태수.$obj.text() == name) { + cityList[cityName].태수.$obj.html('{0}'.format(name)); + } + if (cityList[cityName].군사.$obj.text() == name) { + cityList[cityName].군사.$obj.html('{0}'.format(name)); + } + if (cityList[cityName].종사.$obj.text() == name) { + cityList[cityName].종사.$obj.html('{0}'.format(name)); + } + + userList[name] = { + $city: cityInfo, + city: cityName, + $user: $this, + name: name, + val: '-1', + 태수: false, + 군사: false, + 종사: false, + is수뇌: is수뇌 + }; + + if (cityList[cityName]) { + cityList[cityName].users.append($this); + } + + }); + }); + + if ($("#loadDutyBtn").length == 0) { + + const $onBossList = $(''); + $onBossList.click(function () { + loadDuty(); + return false; + }); + + $('form').append($onBossList); + } + + $('#by_users').show(); + }; + + const mainFunc = function () { + //대상 추출 + + $("form").each(function () { + const $this = $(this); + $this.attr('name', 'p' + $this.attr('name')); + }); + + $("table").each(function () { + const $this = $(this); + + + if ($this.attr('class') == 'tb_layout bg2') { + $this.addClass('cityInfo'); + } + else { + return; + } + + const cityInfo: CityItem = { + 태수:{}, + 군사:{}, + 종사:{}, + } as CityItem; + + //이름 추출 + { + const titleText = $this.find('tr:eq(0)>td:eq(0)').text(); + const loc0 = titleText.indexOf("【"); + const loc1 = titleText.indexOf("|"); + const loc2 = titleText.indexOf("】"); + + const cityLoc = $.trim(titleText.substring(loc0 + 1, loc1)); + const citySize = $.trim(titleText.substring(loc1 + 1, loc2)); + let cityName = $.trim(titleText.substring(loc2 + 1)); + + cityName = cityName.replace("[", ""); + cityName = cityName.replace("]", ""); + + $this.data('cityname', cityName); + + cityInfo.지역 = cityLoc; + cityInfo.규모 = citySize as CityLevel; + cityInfo.이름 = cityName; + + cityInfo.val = '-1'; + + cityInfo.태수.preserved = false; + cityInfo.군사.preserved = false; + cityInfo.종사.preserved = false; + } + + //주민, 농상치성수 + + + { + const $baseTr = $this.find('tr:eq(1)'); + cityInfo.$주민 = $baseTr.find('td:eq(1)'); + cityInfo.$농업 = $baseTr.find('td:eq(3)'); + cityInfo.$상업 = $baseTr.find('td:eq(5)'); + cityInfo.$치안 = $baseTr.find('td:eq(7)'); + cityInfo.$수비 = $baseTr.find('td:eq(9)'); + cityInfo.$성벽 = $baseTr.find('td:eq(11)'); + + let tmpVal; + + tmpVal = cityInfo.$주민.text().split('/'); + cityInfo.주민 = parseInt(tmpVal[0]); + cityInfo.max주민 = parseInt(tmpVal[1]); + + tmpVal = cityInfo.$농업.text().split('/'); + cityInfo.농업 = parseInt(tmpVal[0]); + cityInfo.max농업 = parseInt(tmpVal[1]); + + tmpVal = cityInfo.$상업.text().split('/'); + cityInfo.상업 = parseInt(tmpVal[0]); + cityInfo.max상업 = parseInt(tmpVal[1]); + + tmpVal = cityInfo.$치안.text().split('/'); + cityInfo.치안 = parseInt(tmpVal[0]); + cityInfo.max치안 = parseInt(tmpVal[1]); + + tmpVal = cityInfo.$수비.text().split('/'); + cityInfo.수비 = parseInt(tmpVal[0]); + cityInfo.max수비 = parseInt(tmpVal[1]); + + tmpVal = cityInfo.$성벽.text().split('/'); + cityInfo.성벽 = parseInt(tmpVal[0]); + cityInfo.max성벽 = parseInt(tmpVal[1]); + + if (cityInfo.주민 > cityInfo.max주민 * 0.9) { cityInfo.$주민.css('color', 'lightgreen'); } + else if (cityInfo.주민 > cityInfo.max주민 * 0.7) { cityInfo.$주민.css('color', 'yellow'); } + else { cityInfo.$주민.css('color', 'orangered'); } + + if (cityInfo.농업 > cityInfo.max농업 * 0.8) { cityInfo.$농업.css('color', 'lightgreen'); } + else if (cityInfo.농업 > cityInfo.max농업 * 0.4) { cityInfo.$농업.css('color', 'yellow'); } + else { cityInfo.$농업.css('color', 'orangered'); } + + if (cityInfo.상업 > cityInfo.max상업 * 0.8) { cityInfo.$상업.css('color', 'lightgreen'); } + else if (cityInfo.상업 > cityInfo.max상업 * 0.4) { cityInfo.$상업.css('color', 'yellow'); } + else { cityInfo.$상업.css('color', 'orangered'); } + + if (cityInfo.치안 > cityInfo.max치안 * 0.8) { cityInfo.$치안.css('color', 'lightgreen'); } + else if (cityInfo.치안 > cityInfo.max치안 * 0.4) { cityInfo.$치안.css('color', 'yellow'); } + else { cityInfo.$치안.css('color', 'orangered'); } + + if (cityInfo.수비 > cityInfo.max수비 * 0.6) { cityInfo.$수비.css('color', 'lightgreen'); } + else if (cityInfo.수비 > cityInfo.max수비 * 0.3) { cityInfo.$수비.css('color', 'yellow'); } + else { cityInfo.$수비.css('color', 'orangered'); } + + if (cityInfo.성벽 > cityInfo.max성벽 * 0.6) { cityInfo.$성벽.css('color', 'lightgreen'); } + else if (cityInfo.성벽 > cityInfo.max성벽 * 0.3) { cityInfo.$성벽.css('color', 'yellow'); } + else { cityInfo.$성벽.css('color', 'orangered'); } + + + cityInfo.remain주민 = cityInfo.주민 - cityInfo.max주민; + cityInfo.remain농업 = cityInfo.농업 - cityInfo.max농업; + cityInfo.remain상업 = cityInfo.상업 - cityInfo.max상업; + cityInfo.remain치안 = cityInfo.치안 - cityInfo.max치안; + cityInfo.remain수비 = cityInfo.수비 - cityInfo.max수비; + cityInfo.remain성벽 = cityInfo.성벽 - cityInfo.max성벽; + + cityInfo.warn주민 = false; + cityInfo.warn농업 = false; + cityInfo.warn상업 = false; + cityInfo.warn치안 = false; + cityInfo.warn수비 = false; + cityInfo.warn성벽 = false; + + if (cityInfo.remain주민 > -10 * 2000) cityInfo.warn주민 = true; + if (cityInfo.주민 > 0.92 * cityInfo.max주민) cityInfo.warn주민 = true; + if (cityInfo.remain농업 > -10 * 100) cityInfo.warn농업 = true; + if (cityInfo.remain상업 > -10 * 100) cityInfo.warn상업 = true; + if (cityInfo.remain치안 > -10 * 100) cityInfo.warn치안 = true; + if (cityInfo.remain수비 > -10 * 70) cityInfo.warn수비 = true; + if (cityInfo.remain성벽 > -10 * 70) cityInfo.warn성벽 = true; + + if (cityInfo.warn농업) cityInfo.$농업.append('[' + cityInfo.remain농업 + ']'); + if (cityInfo.warn상업) cityInfo.$상업.append('[' + cityInfo.remain상업 + ']'); + if (cityInfo.warn치안) cityInfo.$치안.append('[' + cityInfo.remain치안 + ']'); + if (cityInfo.warn수비) cityInfo.$수비.append('[' + cityInfo.remain수비 + ']'); + if (cityInfo.warn성벽) cityInfo.$성벽.append('[' + cityInfo.remain성벽 + ']'); + + } + + //태수,군사,종사 + { + const $baseTr = $this.find('tr:eq(2)'); + cityInfo.태수.$obj = $baseTr.find('td:eq(7)'); + cityInfo.군사.$obj = $baseTr.find('td:eq(9)'); + cityInfo.종사.$obj = $baseTr.find('td:eq(11)'); + } + + //기타 + { + + cityInfo.userCnt = $this.find('tr:eq(3) td:eq(1)').text().split(',').length - 1; + } + + cityInfo.obj = $this; + cityList[cityInfo.이름] = cityInfo as CityItem; + }); + + + const $onGenList = $(''); + $onGenList.click(function () { + loadUser(); + return false; + }); + $('form').append($onGenList); + + + $('table:eq(0) tr:last').after(''); + + + const $sort_more = $('#sort_more'); + $sort_more.html('재 정렬 순서 :'); + + const sortIt = function(callback: (lhs:CityItem, rhs:CityItem)=>number) { + let arCity: CityItem[] = []; + $('.cityInfo').each(function () { + const $this = $(this); + const cityName = $this.data('cityname'); + + const cityInfo = cityList[cityName]; + arCity.push(cityInfo); + }); + + arCity = mergeSort(arCity, callback); + //console.log(arCity); + + const $anchor = $('.anchor'); + //console.log($anchor); + + $('body > br').remove(); + + $('.cityInfo').detach(); + + $.each(arCity, function (idx, val) { + $anchor.before('
'); + $anchor.before(val.obj); + }); + $anchor.before('
'); + + }; + + let $btn: JQuery; + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.이름.localeCompare(b.이름); + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return 1.0 * a.주민 / a.max주민 - 1.0 * b.주민 / b.max주민; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.remain주민 - b.remain주민; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.remain농업 - b.remain농업; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.remain상업 - b.remain상업; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.remain치안 - b.remain치안; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.remain수비 - b.remain수비; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return a.remain성벽 - b.remain성벽; + }); + }); + $sort_more.append($btn); + + $btn = $('').click(function () { + sortIt(function (a, b) { + return b.userCnt - a.userCnt; + }); + }); + $sort_more.append($btn); + }; + + mainFunc(); +}); \ No newline at end of file diff --git a/hwe/ts/ext.plugin_troop.ts b/hwe/ts/extPluginTroop.ts similarity index 100% rename from hwe/ts/ext.plugin_troop.ts rename to hwe/ts/extPluginTroop.ts diff --git a/hwe/ts/troop.ts b/hwe/ts/troop.ts index 9c96b652..80e1ac15 100644 --- a/hwe/ts/troop.ts +++ b/hwe/ts/troop.ts @@ -1,5 +1,5 @@ import { errUnknown } from "./common_legacy"; -import { launchTroopPlugin } from "./ext.plugin_troop"; +import { launchTroopPlugin } from "./extPluginTroop"; import jQuery from "jquery"; import "../scss/troop.scss"; @@ -22,9 +22,9 @@ jQuery(function($){ alert(data.reason); location.reload(); } - + location.reload(); - + }, errUnknown); return false; }); @@ -43,9 +43,9 @@ jQuery(function($){ alert(data.reason); location.reload(); } - + location.reload(); - + }, errUnknown); return false; }); @@ -64,9 +64,9 @@ jQuery(function($){ alert(data.reason); location.reload(); } - + location.reload(); - + }, errUnknown); return false; }); @@ -85,9 +85,9 @@ jQuery(function($){ alert(data.reason); location.reload(); } - + location.reload(); - + }, errUnknown); return false; }); @@ -106,13 +106,13 @@ jQuery(function($){ alert(data.reason); location.reload(); } - + location.reload(); - + }, errUnknown); return false; }); - + launchTroopPlugin($); }); \ No newline at end of file diff --git a/webpack.config.cjs b/webpack.config.cjs index c6b18ea9..7666444f 100644 --- a/webpack.config.cjs +++ b/webpack.config.cjs @@ -30,6 +30,7 @@ module.exports = (env) => { board: '@/board.ts', bossInfo: '@/bossInfo.ts', myPage: '@/myPage.ts', + extExpandCity: '@/extExpandCity.ts', //FORM 입력용, frontend 변경후 제거