파일 위치를 twe에서 hwe로 옮김.
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
|
||||
|
||||
function getCityPosition(){
|
||||
return {
|
||||
1: ["업", 345, 130],
|
||||
2: ["허창", 330, 215],
|
||||
3: ["낙양", 275, 180],
|
||||
4: ["장안", 145, 165],
|
||||
5: ["성도", 25, 290],
|
||||
6: ["양양", 255, 290],
|
||||
7: ["건업", 505, 305],
|
||||
8: ["북평", 465, 65],
|
||||
9: ["남피", 395, 95],
|
||||
10: ["완", 270, 235],
|
||||
11: ["수춘", 395, 270],
|
||||
12: ["서주", 440, 250],
|
||||
13: ["강릉", 245, 335],
|
||||
14: ["장사", 255, 375],
|
||||
15: ["시상", 360, 360],
|
||||
16: ["위례", 620, 145],
|
||||
17: ["계", 365, 35],
|
||||
18: ["복양", 410, 170],
|
||||
19: ["진류", 365, 185],
|
||||
20: ["여남", 330, 260],
|
||||
21: ["하비", 480, 235],
|
||||
22: ["서량", 25, 50],
|
||||
23: ["하내", 230, 150],
|
||||
24: ["한중", 135, 205],
|
||||
25: ["상용", 185, 225],
|
||||
26: ["덕양", 85, 275],
|
||||
27: ["강주", 70, 310],
|
||||
28: ["건녕", 80, 400],
|
||||
29: ["남해", 245, 480],
|
||||
30: ["계양", 230, 400],
|
||||
31: ["오", 510, 345],
|
||||
32: ["평양", 590, 100],
|
||||
33: ["사비", 605, 205],
|
||||
34: ["계림", 655, 200],
|
||||
35: ["진양", 295, 60],
|
||||
36: ["평원", 440, 115],
|
||||
37: ["북해", 470, 155],
|
||||
38: ["초", 365, 230],
|
||||
39: ["패", 430, 220],
|
||||
40: ["천수", 70, 105],
|
||||
41: ["안정", 95, 145],
|
||||
42: ["홍농", 210, 175],
|
||||
43: ["하변", 45, 190],
|
||||
44: ["자동", 75, 245],
|
||||
45: ["영안", 115, 295],
|
||||
46: ["귀양", 90, 360],
|
||||
47: ["주시", 30, 345],
|
||||
48: ["운남", 30, 415],
|
||||
49: ["남영", 135, 405],
|
||||
50: ["교지", 130, 480],
|
||||
51: ["신야", 250, 260],
|
||||
52: ["강하", 315, 295],
|
||||
53: ["무릉", 195, 355],
|
||||
54: ["영릉", 190, 395],
|
||||
55: ["상동", 210, 435],
|
||||
56: ["여강", 380, 315],
|
||||
57: ["회계", 480, 395],
|
||||
58: ["고창", 350, 405],
|
||||
59: ["대", 450, 480],
|
||||
60: ["안평", 530, 80],
|
||||
61: ["졸본", 570, 65],
|
||||
62: ["이도", 680, 260],
|
||||
63: ["강", 95, 35],
|
||||
64: ["저", 25, 120],
|
||||
65: ["흉노", 180, 95],
|
||||
66: ["남만", 80, 455],
|
||||
67: ["산월", 425, 430],
|
||||
68: ["오환", 610, 20],
|
||||
69: ["왜", 680, 320],
|
||||
70: ["호관", 285, 140],
|
||||
71: ["호로", 285, 205],
|
||||
72: ["사곡", 240, 175],
|
||||
73: ["함곡", 180, 175],
|
||||
74: ["사수", 310, 185],
|
||||
75: ["양평", 90, 220],
|
||||
76: ["가맹", 45, 225],
|
||||
77: ["역경", 410, 65],
|
||||
78: ["계교", 405, 135],
|
||||
79: ["동황", 515, 145],
|
||||
80: ["관도", 340, 165],
|
||||
81: ["정도", 400, 210],
|
||||
82: ["합비", 435, 285],
|
||||
83: ["광릉", 490, 275],
|
||||
84: ["적도", 130, 75],
|
||||
85: ["가정", 40, 160],
|
||||
86: ["기산", 110, 180],
|
||||
87: ["면죽", 35, 255],
|
||||
88: ["이릉", 215, 295],
|
||||
89: ["장판", 280, 315],
|
||||
90: ["백랑", 530, 30],
|
||||
91: ["적벽", 330, 325],
|
||||
92: ["파양", 430, 350],
|
||||
93: ["탐라", 605, 260],
|
||||
94: ["유구", 625, 435],
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,121 @@
|
||||
/**
|
||||
* <>& 등을 html에서도 그대로 보이도록 escape주는 함수
|
||||
* @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
|
||||
* @param {string} string escape하고자 하는 문자열
|
||||
* @returns {string}
|
||||
*/
|
||||
var escapeHtml = (function (string) {
|
||||
var entityMap = {
|
||||
'&': '&',
|
||||
'<': '<',
|
||||
'>': '>',
|
||||
'"': '"',
|
||||
"'": ''',
|
||||
'/': '/',
|
||||
'`': '`',
|
||||
'=': '='
|
||||
};
|
||||
|
||||
return function(string) {
|
||||
return String(string).replace(/[&<>"'`=\/]/g, function(s) {
|
||||
return entityMap[s];
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
|
||||
/**
|
||||
* object의 array를 id를 key로 삼는 object로 재 변환
|
||||
* @param {Array.{id: Object}} arr id를 가진 object의 array
|
||||
* @returns {Object}
|
||||
*/
|
||||
function convertDictById(arr) {
|
||||
var result = {};
|
||||
arr.forEach(function (v, i) {
|
||||
result[v.id] = v;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* array를 set 형태의 object로 변환
|
||||
* @param {Array} arr 값을 가진 array
|
||||
* @returns {Object}
|
||||
*/
|
||||
function convertSet(arr) {
|
||||
var result = {};
|
||||
arr.forEach(function (v) {
|
||||
result[v] = true;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {0}, {1}, {2}형태로 포맷해주는 함수
|
||||
*/
|
||||
String.prototype.format = function() {
|
||||
var args = arguments;
|
||||
return this.replace(/{(\d+)}/g, function(match, number) {
|
||||
return (typeof args[number] != 'undefined') ? args[number] : match;
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 게임내에서 지원하는 color type만 선택할 수 있도록 해주는 함수
|
||||
* @param {string} color #AAAAAA 또는 AAAAAA 형태로 작성된 RGB hex color string
|
||||
* @returns {string}
|
||||
*/
|
||||
function convColorValue(color) {
|
||||
if (color.charAt(0) == '#') {
|
||||
color = color.substr(1);
|
||||
}
|
||||
color = color.toUpperCase();
|
||||
|
||||
var colorBase = convertSet([
|
||||
'000080', '0000FF', '008000', '008080', '00BFFF', '00FF00', '00FFFF', '20B2AA',
|
||||
'2E8B57', '483D8B', '6495ED', '7B68EE', '7CFC00', '7FFFD4', '800000', '800080',
|
||||
'808000', '87CEEB', 'A0522D', 'A9A9A9', 'AFEEEE', 'BA55D3', 'E0FFFF', 'F5F5DC',
|
||||
'FF0000', 'FF00FF', 'FF6347', 'FFA500', 'FFC0CB', 'FFD700', 'FFDAB9', 'FFFF00',
|
||||
'FFFFFF'
|
||||
]);
|
||||
|
||||
if (!colorBase.hasOwnProperty(color)) {
|
||||
return '000000';
|
||||
}
|
||||
|
||||
return color;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 단순한 Template 함수. <%변수명%>으로 template 가능
|
||||
* @see https://github.com/krasimir/absurd/blob/master/lib/processors/html/helpers/TemplateEngine.js
|
||||
* @param {string} html
|
||||
* @param {object} options
|
||||
* @returns {string}
|
||||
*/
|
||||
var TemplateEngine = function (html, options) {
|
||||
var re = /<%(.+?)%>/g,
|
||||
reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g,
|
||||
code = 'with(obj) { var r=[];\n',
|
||||
cursor = 0,
|
||||
result,
|
||||
match;
|
||||
var add = function (line, js) {
|
||||
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
|
||||
(code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
|
||||
return add;
|
||||
}
|
||||
options.e = escapeHtml;
|
||||
while (match = re.exec(html)) {
|
||||
add(html.slice(cursor, match.index))(match[1], true);
|
||||
cursor = match.index + match[0].length;
|
||||
}
|
||||
add(html.substr(cursor, html.length - cursor));
|
||||
code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' ');
|
||||
try { result = new Function('obj', code).apply(options, [options]); }
|
||||
catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
|
||||
/*
|
||||
function showCityGeneral(cityIdx){
|
||||
|
||||
}
|
||||
*/
|
||||
/*
|
||||
function loadScenarioPreview(scenarioIdx){
|
||||
$(function(){
|
||||
reloadWorldMap({
|
||||
clickableAll:true,
|
||||
selectCallback:showCityGeneral,
|
||||
hrefTemplate:'#',
|
||||
neutralView:true,
|
||||
showMe:false,
|
||||
targetJson:'j_get_scenario_map.php?scenarioIdx={0}'.format(scenarioIdx)
|
||||
});
|
||||
});
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
|
||||
function loadScenarios(){
|
||||
$.ajax({
|
||||
method:'post',
|
||||
url:'j_load_scenarios.php',
|
||||
dataType:'json'
|
||||
}).then(function(result){
|
||||
if(!result.result){
|
||||
var deferred = $.Deferred();
|
||||
deferred.reject('fail');
|
||||
return deferred.promise();
|
||||
}
|
||||
|
||||
|
||||
var list = {};
|
||||
|
||||
|
||||
$.each(result.scenario, function(idx, value){
|
||||
var title = value.title || "-";
|
||||
var titles = title.split(/【|[0-9]*】/);
|
||||
var category = titles.length>2?titles[1]:'-';
|
||||
|
||||
value.title = title;
|
||||
value.category = category;
|
||||
value.idx = idx;
|
||||
value.year = value.year || 180;
|
||||
|
||||
if(!(category in list)){
|
||||
list[category] = {};
|
||||
}
|
||||
|
||||
list[category][idx] = value;
|
||||
});
|
||||
|
||||
var $select = $('#scenario_sel');
|
||||
$.each(list, function(category, items){
|
||||
var $optgroup = $('<optgroup>').attr('label', category);
|
||||
|
||||
$.each(items, function(idx, scenario){
|
||||
var $option = $('<option>')
|
||||
.data('scenario',scenario)
|
||||
.val(idx)
|
||||
.html(scenario.title);
|
||||
$optgroup.append($option);
|
||||
});
|
||||
|
||||
$select.append($optgroup);
|
||||
});
|
||||
|
||||
$select.val(0);
|
||||
$select.change();
|
||||
});
|
||||
}
|
||||
|
||||
function scenarioPreview(){
|
||||
var $select = $(this);
|
||||
var $option = $select.find('option:selected');
|
||||
|
||||
var $year = $('#scenario_begin');
|
||||
var $npc = $('#scenario_npc');
|
||||
var $npcEx = $('#scenario_npc_extend');
|
||||
var $nation = $('#scenario_nation');
|
||||
|
||||
var scenario = $option.data('scenario');
|
||||
console.log(scenario.idx, scenario.title);
|
||||
|
||||
$year.html('{0}년'.format(scenario.year));
|
||||
$npc.html('{0}명'.format(scenario.npc_cnt));
|
||||
if(scenario.npcEx_cnt == 0){
|
||||
$npcEx.html('');
|
||||
}
|
||||
else{
|
||||
$npcEx.html('+{0}명'.format(scenario.npcEx_cnt));
|
||||
}
|
||||
|
||||
$nation.html('');
|
||||
$.each(scenario.nation, function(idx, nation){
|
||||
$nation.append('<span style="color:{0}">{1}</span> {2}명. {3}<br>'.format(
|
||||
nation.color, nation.name, nation.generals, nation.cities.join(', ')
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
function formSetup(){
|
||||
$('#game_form').validate({
|
||||
rules:{
|
||||
turnterm:"required",
|
||||
sync:"required",
|
||||
scenario:"required",
|
||||
fiction:"required",
|
||||
extend:"required",
|
||||
npcmode:"required",
|
||||
show_img_level:"required",
|
||||
},
|
||||
errorElement: "div",
|
||||
errorPlacement: function ( error, element ) {
|
||||
// Add the `help-block` class to the error element
|
||||
error.addClass( "invalid-feedback" );
|
||||
|
||||
if ( element.prop( "type" ) === "checkbox" ) {
|
||||
error.insertAfter( element.parent( "label" ) );
|
||||
} else {
|
||||
error.insertAfter( element );
|
||||
}
|
||||
},
|
||||
highlight: function ( element, errorClass, validClass ) {
|
||||
$( element ).addClass( "is-invalid" ).removeClass( "is-valid" );
|
||||
},
|
||||
unhighlight: function (element, errorClass, validClass) {
|
||||
$( element ).addClass( "is-valid" ).removeClass( "is-invalid" );
|
||||
}
|
||||
});
|
||||
$('#game_form').submit(function(e){
|
||||
e.preventDefault();
|
||||
if(!$("#game_form").valid()){
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
cache:false,
|
||||
type:'post',
|
||||
url:'j_install.php',
|
||||
dataType:'json',
|
||||
data:{
|
||||
turnterm:$('#turnterm input:radio:checked').val(),
|
||||
sync:$('#sync input:radio:checked').val(),
|
||||
scenario:$('#scenario_sel').val(),
|
||||
fiction:$('#fiction input:radio:checked').val(),
|
||||
extend:$('#extend input:radio:checked').val(),
|
||||
npcmode:$('#npcmode input:radio:checked').val(),
|
||||
show_img_level:$('#show_img_level input:radio:checked').val()
|
||||
}
|
||||
}).then(function(result){
|
||||
var deferred = $.Deferred();
|
||||
|
||||
if(!result.result){
|
||||
alert(result.reason);
|
||||
deferred.reject('fail');
|
||||
}
|
||||
else{
|
||||
alert('게임이 리셋되었습니다.');
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
}).then(function(){
|
||||
//location.href = 'install.php';
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
$(function(){
|
||||
loadScenarios();
|
||||
$('#scenario_sel').change(scenarioPreview);
|
||||
formSetup();
|
||||
})
|
||||
@@ -0,0 +1,65 @@
|
||||
|
||||
$(document).ready( function () {
|
||||
$('#db_form').validate({
|
||||
rules:{
|
||||
db_host:"required",
|
||||
db_port:"required",
|
||||
db_id:"required",
|
||||
db_pw:"required",
|
||||
db_name:"required",
|
||||
},
|
||||
errorElement: "div",
|
||||
errorPlacement: function ( error, element ) {
|
||||
// Add the `help-block` class to the error element
|
||||
error.addClass( "invalid-feedback" );
|
||||
|
||||
if ( element.prop( "type" ) === "checkbox" ) {
|
||||
error.insertAfter( element.parent( "label" ) );
|
||||
} else {
|
||||
error.insertAfter( element );
|
||||
}
|
||||
},
|
||||
highlight: function ( element, errorClass, validClass ) {
|
||||
$( element ).addClass( "is-invalid" ).removeClass( "is-valid" );
|
||||
},
|
||||
unhighlight: function (element, errorClass, validClass) {
|
||||
$( element ).addClass( "is-valid" ).removeClass( "is-invalid" );
|
||||
}
|
||||
});
|
||||
$('#db_form').submit(function(e){
|
||||
e.preventDefault();
|
||||
if(!$("#db_form").valid()){
|
||||
return;
|
||||
}
|
||||
$.ajax({
|
||||
cache:false,
|
||||
type:'post',
|
||||
url:'j_install_db.php',
|
||||
dataType:'json',
|
||||
data:{
|
||||
full_reset:$('#full_reset input:radio:checked').val(),
|
||||
db_host:$('#db_host').val(),
|
||||
db_port:$('#db_port').val(),
|
||||
db_id:$('#db_id').val(),
|
||||
db_pw:$('#db_pw').val(),
|
||||
db_name:$('#db_name').val()
|
||||
}
|
||||
}).then(function(result){
|
||||
var deferred = $.Deferred();
|
||||
|
||||
if(!result.result){
|
||||
alert(result.reason);
|
||||
deferred.reject('fail');
|
||||
}
|
||||
else{
|
||||
alert('DB.php가 생성되었습니다.');
|
||||
deferred.resolve();
|
||||
}
|
||||
|
||||
return deferred.promise();
|
||||
}).then(function(){
|
||||
location.href = 'install.php';
|
||||
});
|
||||
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,69 @@
|
||||
|
||||
if (document.all) {
|
||||
document.onkeydown = function () {
|
||||
var key_f5 = 116; // 116 = F5
|
||||
var key_enter = 13; // 13 = 엔터
|
||||
if (key_f5 == event.keyCode) {
|
||||
event.keyCode=0;
|
||||
refreshing(0,0);
|
||||
return false;
|
||||
} else if(key_enter == event.keyCode) {
|
||||
event.keyCode=0;
|
||||
refreshing(4,message);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function refreshing(arg1, arg2) {
|
||||
// if(term <= 0) {
|
||||
switch(arg1) {
|
||||
case 0: location.reload(); break;
|
||||
case 1: go(arg2); break;
|
||||
case 2: turn(arg2); break;
|
||||
case 3: arg2.submit(); break;
|
||||
case 4:
|
||||
arg2.submit();
|
||||
message.msg.value = "";
|
||||
document.getElementById("msg").value = "";
|
||||
message.msg.focus();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function go(type) {
|
||||
if(type == 1) location.replace('b_nationboard.php');
|
||||
else if(type == 2) location.replace('b_troop.php');
|
||||
else if(type == 3) location.replace('b_nationrule.php');
|
||||
else if(type == 4) location.replace('b_chiefboard.php');
|
||||
else if(type == 5) location.replace('b_chiefcenter.php');
|
||||
else if(type == 6) window.open('b_genList.php');
|
||||
else if(type == 7) location.replace('b_myKingdomInfo.php');
|
||||
else if(type == 8) location.replace('b_myCityInfo.php');
|
||||
else if(type == 9) location.replace('b_myGenInfo.php');
|
||||
else if(type == 10) location.replace('b_myBossInfo.php');
|
||||
else if(type == 11) location.replace('b_currentCity.php');
|
||||
else if(type == 12) location.replace('b_myPage.php');
|
||||
else if(type == 13) location.replace('b_dipcenter.php');
|
||||
else if(type == 14) location.replace('b_diplomacy.php');
|
||||
else if(type == 15) window.open('b_tournament.php');
|
||||
else if(type == 16) window.open('b_betting.php');
|
||||
else if(type == 17) window.open('b_auction.php');
|
||||
else if(type == 18) window.open('b_battleCenter.php');
|
||||
}
|
||||
|
||||
function turn(type) {
|
||||
num = form2.sel.value;
|
||||
commandlist.location.replace('turn.php?type=' + type + '&sel=' + num);
|
||||
}
|
||||
|
||||
jQuery(function($){
|
||||
$('#message').submit(function(event){
|
||||
var $this = $(this);
|
||||
var target = $('[name="genlist"]').val();
|
||||
var msg = $('#msg').val();
|
||||
console.log(target, msg);
|
||||
return false;
|
||||
});
|
||||
});
|
||||
+530
@@ -0,0 +1,530 @@
|
||||
|
||||
|
||||
|
||||
function reloadWorldMap(option){
|
||||
var $world_map = $('.world_map');
|
||||
|
||||
if($world_map.length == 0){
|
||||
return;
|
||||
}
|
||||
|
||||
var defaultOption = {
|
||||
isDetailMap:true, //복잡 지도, 단순 지도
|
||||
clickableAll:false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도.
|
||||
selectCallback:null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행.
|
||||
hrefTemplate:'#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨
|
||||
|
||||
//아래부터는 post query에 들어갈 녀석
|
||||
year:null, //year값, 연감등에 사용
|
||||
month:null, //month값, 연감등에 사용
|
||||
aux:null, //기타 넣고 싶은 값을 입력
|
||||
neutralView:false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정
|
||||
showMe:true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개
|
||||
targetJson:'j_map.php'
|
||||
};
|
||||
|
||||
option = $.extend(defaultOption, option);
|
||||
|
||||
var isDetailMap = option.isDetailMap;
|
||||
var clickableAll = option.clickableAll;
|
||||
var selectCallback = option.selectCallback;
|
||||
var hrefTemplate = option.hrefTemplate;
|
||||
|
||||
var cityPosition = getCityPosition();
|
||||
|
||||
//OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity
|
||||
|
||||
|
||||
var deferred;
|
||||
|
||||
function checkReturnObject(obj){
|
||||
if(!obj.result){
|
||||
deferred.reject();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!$.isNumeric(obj.startYear)
|
||||
||!$.isNumeric(obj.year)
|
||||
||!$.isNumeric(obj.month)){
|
||||
deferred.reject();
|
||||
return;
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function setMapBackground(obj){
|
||||
var startYear = obj.startYear;
|
||||
var year = obj.year;
|
||||
var month = obj.month;
|
||||
|
||||
if(isDetailMap){
|
||||
$world_map.addClass('map_detail').removeClass('map_basic');
|
||||
}
|
||||
else{
|
||||
$world_map.addClass('map_basic').removeClass('map_detail');
|
||||
}
|
||||
|
||||
var $map_title = $('.map_title_text');
|
||||
if(year < startYear + 1){
|
||||
$map_title.css('color', 'magenta');
|
||||
}
|
||||
else if(year < startYear + 2){
|
||||
$map_title.css('color', 'orange');
|
||||
}
|
||||
else if(year < startYear + 3){
|
||||
$map_title.css('color', 'yellow');
|
||||
}
|
||||
|
||||
|
||||
$world_map.removeClass('map_string map_summer map_fall map_winter');
|
||||
if(month <= 3){
|
||||
$world_map.addClass('map_spring');
|
||||
}
|
||||
else if(month <= 6){
|
||||
$world_map.addClass('map_summer');
|
||||
}
|
||||
else if(month <= 6){
|
||||
$world_map.addClass('map_fall');
|
||||
}
|
||||
else{
|
||||
$world_map.addClass('map_winter');
|
||||
}
|
||||
|
||||
$map_title.html('{0}年 {1}月'.format(year, month));
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function convertCityObjs(obj){
|
||||
//원본 Obj는 굉장히 간소하게 온다, Object 형태로 변환해서 사용한다.
|
||||
|
||||
function toCityObj(arr){
|
||||
return {
|
||||
id:arr[0],
|
||||
level:arr[1],
|
||||
state:arr[2],
|
||||
nationId:(arr[3]>0)?arr[3]:null,
|
||||
region:arr[4],
|
||||
supply:(arr[5]!=0)
|
||||
};
|
||||
}
|
||||
|
||||
function toNationObj(arr){
|
||||
return {
|
||||
id:arr[0],
|
||||
name:arr[1],
|
||||
color:arr[2],
|
||||
capital:arr[3]
|
||||
};
|
||||
}
|
||||
|
||||
function convertSpyList(arr){
|
||||
var result = [];
|
||||
arr.forEach(function(v){
|
||||
var cityId = (v / 10) | 0;
|
||||
var spy = v % 10;
|
||||
result[cityId] = spy;
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var cityList = obj.cityList.map(toCityObj);
|
||||
var nationList = obj.nationList.map(toNationObj);
|
||||
nationList = convertDictById(nationList); //array of object -> dict
|
||||
|
||||
var spyList = convertSpyList(obj.spyList);//Array -> Dict
|
||||
var shownByGeneralList = convertSet(obj.shownByGeneralList);//Array -> Set
|
||||
|
||||
var myCity = obj.myCity;
|
||||
var myNation = obj.myNation;
|
||||
|
||||
function formatCityInfo(city) {
|
||||
var region_str = '';
|
||||
var level_str = '';
|
||||
switch(city.region) {
|
||||
case 1: region_str = "【하북|"; break;
|
||||
case 2: region_str = "【중원|"; break;
|
||||
case 3: region_str = "【서북|"; break;
|
||||
case 4: region_str = "【서촉|"; break;
|
||||
case 5: region_str = "【남중|"; break;
|
||||
case 6: region_str = "【 초|"; break;
|
||||
case 7: region_str = "【오월|"; break;
|
||||
case 8: region_str = "【동이|"; break;
|
||||
}
|
||||
|
||||
switch(city.level) {
|
||||
case 1: level_str = "수】"; break;
|
||||
case 2: level_str = "진】"; break;
|
||||
case 3: level_str = "관】"; break;
|
||||
case 4: level_str = "이】"; break;
|
||||
case 5: level_str = "소】"; break;
|
||||
case 6: level_str = "중】"; break;
|
||||
case 7: level_str = "대】"; break;
|
||||
case 8: level_str = "특】"; break;
|
||||
}
|
||||
|
||||
city.text = region_str + level_str + city.name;
|
||||
city.region_str = region_str;
|
||||
city.level_str = level_str;
|
||||
|
||||
return city;
|
||||
}
|
||||
|
||||
function mergePositionInfo(city){
|
||||
var id = city.id;
|
||||
if(!(id in cityPosition)){
|
||||
return city;
|
||||
}
|
||||
var xy_val = cityPosition[id];
|
||||
city.name = xy_val[0];
|
||||
city.x = xy_val[1];
|
||||
city.y = xy_val[2];
|
||||
return city;
|
||||
}
|
||||
|
||||
function mergeNationInfo(city){
|
||||
//nationId 값으로 isCapital, color, nation을 통합
|
||||
|
||||
var nationId = city.nationId;
|
||||
if(nationId === null || !(nationId in nationList)){
|
||||
city.nationId = null;
|
||||
city.nation = null;
|
||||
city.color = null;
|
||||
city.isCapital = false;
|
||||
return city;
|
||||
}
|
||||
|
||||
var nationObj = nationList[nationId];
|
||||
city.nation = nationObj.name;
|
||||
city.color = nationObj.color;
|
||||
city.isCapital = (nationObj.capital == city.id);
|
||||
|
||||
return city;
|
||||
}
|
||||
|
||||
function mergeClickable(city){
|
||||
//clickable = (remainSpy << 3) | (ourCity << 2) | (shownByGeneral << 1) | clickableAll
|
||||
var id = city.id;
|
||||
var nationId = city.nationId;
|
||||
var clickable = 0;
|
||||
if(id in spyList){
|
||||
clickable |= spyList[id] << 3;
|
||||
}
|
||||
if(myNation !== null && nationId == myNation){
|
||||
clickable |= 4;
|
||||
}
|
||||
if(shownByGeneralList.hasOwnProperty(id)){
|
||||
clickable |= 2;
|
||||
}
|
||||
if(myCity !== null && id == myCity){
|
||||
clickable |= 2;
|
||||
}
|
||||
if(clickableAll){
|
||||
clickable |= 1;
|
||||
}
|
||||
|
||||
|
||||
city.clickable = clickable;
|
||||
return city;
|
||||
}
|
||||
|
||||
cityList = cityList
|
||||
.map(mergePositionInfo)
|
||||
.map(mergeNationInfo)
|
||||
.map(mergeClickable)
|
||||
.map(formatCityInfo);
|
||||
|
||||
return {
|
||||
'cityList' : cityList,
|
||||
'myCity' : myCity
|
||||
};
|
||||
}
|
||||
|
||||
function drawDetailWorldMap(obj){
|
||||
|
||||
var $map_body = $('.world_map .map_body');
|
||||
|
||||
var cityList = obj.cityList;
|
||||
var myCity = obj.myCity;
|
||||
|
||||
cityList.forEach(function(city){
|
||||
var id = city.id;
|
||||
$('.city_base_{0}'.format(id)).detach();
|
||||
//이전 도시는 지운다.
|
||||
|
||||
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
|
||||
$cityObj.addClass('city_level_{0}'.format(city.level));
|
||||
$cityObj.data('obj', city).css({'left':city.x-20,'top':city.y-15});
|
||||
|
||||
if('color' in city && city.color !== null){
|
||||
var $bgObj = $('<div class="city_bg"></div>');
|
||||
$cityObj.append($bgObj);
|
||||
$bgObj.css({'background-image':'url(/images/b{0}.png)'.format(convColorValue(city.color))});
|
||||
}
|
||||
|
||||
var $linkObj = $('<a class="city_link"></a>');
|
||||
$linkObj.data({'text':city.text,'nation':city.nation,'id':city.id});
|
||||
$cityObj.append($linkObj);
|
||||
|
||||
var $imgObj = $('<div class="city_img"><img src="/images/cast_{0}.gif"><div class="city_filler"></div></div>'.format(city.level));
|
||||
$linkObj.append($imgObj);
|
||||
|
||||
|
||||
|
||||
if(city.state > 0){
|
||||
var $stateObj = $('<div class="city_state"><img src="/images/event{0}.gif"></div>'.format(city.state));
|
||||
$linkObj.append($stateObj);
|
||||
}
|
||||
|
||||
if(city.nationId && city.nationId > 0){
|
||||
var flagType = city.supply?'f':'d';
|
||||
var $flagObj = $('<div class="city_flag"><img src="/images/{0}{1}.gif"></div>'.format(flagType, convColorValue(city.color)));
|
||||
if(city.isCapital){
|
||||
var $capitalObj = $('<div class="city_capital"><img src="/images/event51.gif"></div>');
|
||||
$flagObj.append($capitalObj);
|
||||
}
|
||||
$imgObj.append($flagObj);
|
||||
}
|
||||
|
||||
|
||||
$map_body.append($cityObj);
|
||||
|
||||
|
||||
});
|
||||
|
||||
$world_map.find('.city_base_{0} .city_filler'.format(myCity)).addClass('my_city');
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function drawBasicWorldMap(obj){
|
||||
|
||||
var $map_body = $('.world_map .map_body');
|
||||
|
||||
var cityList = obj.cityList;
|
||||
var myCity = obj.myCity;
|
||||
|
||||
cityList.forEach(function(city){
|
||||
var id = city.id;
|
||||
$('.city_base_{0}'.format(id)).detach();
|
||||
//이전 도시는 지운다.
|
||||
|
||||
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
|
||||
$cityObj.addClass('city_level_{0}'.format(city.level));
|
||||
$cityObj.data('obj', city).css({'left':city.x-20,'top':city.y-15});
|
||||
|
||||
var $linkObj = $('<a class="city_link"></a>');
|
||||
$linkObj.data({'text':city.text,'nation':city.nation,'id':city.id});
|
||||
$cityObj.append($linkObj);
|
||||
|
||||
var $imgObj = $('<div class="city_img"><div class="city_filler"></div></div>');
|
||||
if('color' in city && city.color !== null){
|
||||
$imgObj.css({'background-color':city.color});
|
||||
}
|
||||
$linkObj.append($imgObj);
|
||||
|
||||
if(city.state > 0){
|
||||
var state_text = 'wrong';
|
||||
if(city.state < 10){
|
||||
state_text = 'good';
|
||||
}
|
||||
else if(city.state < 40){
|
||||
state_text = 'bad';
|
||||
}
|
||||
else if(city.state < 50){
|
||||
state_text = 'war';
|
||||
}
|
||||
|
||||
var $stateObj = $('<div class="city_state city_state_{0}"></div>'.format(state_text));
|
||||
$imgObj.append($stateObj);
|
||||
}
|
||||
|
||||
//단순 표기에서는 깃발 여부가 없음
|
||||
if(city.isCapital){
|
||||
var $capitalObj = $('<div class="city_capital"></div>');
|
||||
$imgObj.append($capitalObj);
|
||||
}
|
||||
|
||||
|
||||
$map_body.append($cityObj);
|
||||
});
|
||||
|
||||
$world_map.find('.city_base_{0} .city_filler'.format(myCity)).addClass('my_city');
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function setMouseWork(obj){
|
||||
var $tooltip = $('.world_map .city_tooltip');
|
||||
var $tooltip_city = $tooltip.find('.city_name');
|
||||
var $tooltip_nation = $tooltip.find('.nation_name');
|
||||
|
||||
var $objs = $('.world_map .city_link');
|
||||
|
||||
var $map_body = $('.world_map .map_body');
|
||||
|
||||
//터치스크린 탭
|
||||
|
||||
$objs.on('touchstart', function(e){
|
||||
var $this = $(this);
|
||||
|
||||
var touchMode = $this.data('touchMode');
|
||||
if($tooltip_city.data('target') != $this.data('id')){
|
||||
$this.data('touchMode', 1);
|
||||
}
|
||||
else if(touchMode === undefined){
|
||||
$this.data('touchMode', 1);
|
||||
}
|
||||
else{
|
||||
$this.data('touchMode', touchMode + 1);
|
||||
}
|
||||
$map_body.data('touchMode', 1);
|
||||
|
||||
$tooltip_city.data('target', $this.data('id'));
|
||||
|
||||
|
||||
});
|
||||
|
||||
$objs.on('touchend', function(e){
|
||||
var $this = $(this);
|
||||
var position = $this.parent().position();
|
||||
$tooltip_city.html($this.data('text'));
|
||||
|
||||
var nation_text = $this.data('nation');
|
||||
if(nation_text){
|
||||
$tooltip_nation.html(nation_text).show();
|
||||
}
|
||||
else{
|
||||
$tooltip_nation.html('').hide();
|
||||
}
|
||||
|
||||
$tooltip.css({'top': position.top + 25, 'left': position.left + 35}).show();
|
||||
|
||||
var touchMode = $this.data('touchMode');
|
||||
if(touchMode <= 1){
|
||||
return false;
|
||||
}
|
||||
|
||||
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
|
||||
$this.data('touchMode', 0);
|
||||
});
|
||||
|
||||
$map_body.on('touchend',function(e){
|
||||
|
||||
//위의 touchend bind에 해당하지 않는 경우 -> 빈 지도 터치
|
||||
$tooltip.hide();
|
||||
});
|
||||
|
||||
//Mouse over 모드 작동
|
||||
|
||||
$map_body.on('mousemove', function(e){
|
||||
if($(this).data('touchMode')){
|
||||
return true;
|
||||
}
|
||||
|
||||
var parentOffset = $map_body.offset();
|
||||
var relX = e.pageX - parentOffset.left;
|
||||
var relY = e.pageY - parentOffset.top;
|
||||
|
||||
$tooltip.css({'top': relY + 10, 'left': relX + 10});
|
||||
});
|
||||
|
||||
$objs.on('mouseenter', function(e){
|
||||
if($map_body.data('touchMode')){
|
||||
return true;
|
||||
}
|
||||
|
||||
var $this = $(this);
|
||||
|
||||
$tooltip_city.data('target', $this.data('id'));
|
||||
$tooltip_city.html($this.data('text'));
|
||||
var nation_text = $this.data('nation');
|
||||
if(nation_text){
|
||||
$tooltip_nation.html(nation_text).show();
|
||||
}
|
||||
else{
|
||||
$tooltip_nation.html('').hide();
|
||||
}
|
||||
|
||||
$tooltip.show();
|
||||
});
|
||||
|
||||
$objs.on('mouseleave', function(event){
|
||||
$tooltip.hide();
|
||||
});
|
||||
|
||||
$objs.on('click', function(e){
|
||||
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
|
||||
var touchMode = $(this).data('touchMode');
|
||||
if(touchMode === undefined){
|
||||
return;
|
||||
}
|
||||
|
||||
if(touchMode === 1){
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function setCityClickable(obj){
|
||||
|
||||
obj.cityList.forEach(function(city){
|
||||
var $cityLink = $world_map.find('.city_base_{0} .city_link'.format(city.id));
|
||||
|
||||
if('clickable' in city && city.clickable > 0){
|
||||
$cityLink.attr('href',hrefTemplate.format(city.id));
|
||||
}
|
||||
|
||||
if(selectCallback){
|
||||
$cityLink.click(function(){
|
||||
return selectCallback(city);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
function saveCityInfo(obj){
|
||||
$world_map.data('cityInfo', obj);
|
||||
return obj;
|
||||
}
|
||||
|
||||
if(isDetailMap){
|
||||
$world_map.addClass('map_detail');
|
||||
}
|
||||
else{
|
||||
$world_map.removeClass('map_datail');
|
||||
}
|
||||
|
||||
//deferred mode of jQuery. != promise-then.
|
||||
deferred = $.ajax({
|
||||
url: option.targetJson,
|
||||
type: 'post',
|
||||
dataType:'json',
|
||||
contentType: 'application/json',
|
||||
data: JSON.stringify({
|
||||
neutralView:option.neutralView,
|
||||
year:option.year,
|
||||
month:option.month,
|
||||
showMe:option.showMe,
|
||||
aux:option.aux
|
||||
})
|
||||
});
|
||||
|
||||
deferred
|
||||
.then(checkReturnObject)
|
||||
.then(setMapBackground)
|
||||
.then(convertCityObjs)
|
||||
.then(isDetailMap?drawDetailWorldMap:drawBasicWorldMap)
|
||||
.then(setMouseWork)
|
||||
.then(setCityClickable)
|
||||
.then(saveCityInfo);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user