Compare commits

...
191 Commits
Author SHA1 Message Date
Hide_D f33e645113 초반 m장 스탯 관련 문제 해결, 장수 선택 term 해결 2021-01-01 21:09:43 +09:00
Hide_D 528d30c317 의병모집 버그 수정 2021-01-01 19:56:29 +09:00
Hide_D 7f0a3d320c 버그 수정
- 의병 모집
- 장수 변경 시 생성 폼 남음
2021-01-01 19:54:28 +09:00
Hide_D 8e940aeb65 버그 수정. 시간 변경 2020-12-31 16:21:57 +09:00
Hide_D a77ee60809 버그.. 2020-12-31 13:34:37 +09:00
Hide_D 83383c29cd 버그 수정2 2020-12-31 13:33:45 +09:00
Hide_D b6393141e8 버그 수정 2020-12-31 13:29:57 +09:00
Hide_D 10ce1827d8 버그 수정 2020-12-31 13:27:11 +09:00
Hide_D 605f3a12ff select pool 수 증가 2020-12-31 13:24:33 +09:00
Hide_D a33539e75f 턴 변경을 합리적으로 변경 2020-12-31 08:09:23 +09:00
Hide_D b2cca3687a 버그 수정 2020-12-31 07:49:33 +09:00
Hide_D 628c54044f general_pool 에서 장수 선택 기능 추가 2020-12-31 07:43:56 +09:00
Hide_D c0e7a3eece readme 수정 2020-12-27 19:49:39 +09:00
Hide_D c7c13c19c1 일부 수정
composer update, README.md 업데이트
2020-12-27 02:11:53 +09:00
Hide_D d5f71b5878 DummySession 준비 2020-12-26 15:48:05 +09:00
Hide_D cb589e9e26 종전수락 버그 수정 2020-12-13 22:05:07 +09:00
Hide_D eaeed47297 도시 정보 출력 순서 변경 2020-11-11 23:34:53 +09:00
Hide_D e00e5c5cd7 이벤트 빼빼로 추가 2020-11-11 23:04:08 +09:00
Hide_D b3719f7166 수극 연속 사용 버그 수정 2020-09-09 14:20:15 +09:00
Hide_D 337896974b 피장파장 로그 버그 수정 2020-09-09 14:20:15 +09:00
Hide_D bb7d1fc9ab 수몰을 아무 국가에나 쓸 수 있는 버그 수정 2020-09-09 14:20:15 +09:00
Hide_D 07765c8d44 훈사 제한 버그 2020-08-17 09:21:37 +09:00
Hide_D 85cb91071e 기본 도시 정보 데이터 대폭 추가 2020-08-15 03:46:43 +09:00
Hide_D d41839845a 귀병 첫 페이즈 매우 높은 확률로 계략 시도 2020-08-11 22:43:45 +09:00
Hide_D c3d12aa55f 전쟁/선포 중인 국가에 선포 확률 대폭 감소 2020-08-11 22:36:26 +09:00
Hide_D a781e4b84c 인탐 성공 시 확률따라 추가 보정, 인탐/의병 지장 버그 수정 2020-08-11 22:33:50 +09:00
Hide_D 1fc0989fd2 계략 강화, 탈취량 시간에 따라 증가 2020-08-11 22:33:00 +09:00
Hide_D 14752260d3 회피 필살 중첩 가능 2020-07-24 14:19:05 +09:00
Hide_D 84675c874f 이호경식 버그 수정 2020-07-21 22:38:53 +09:00
Hide_D f30e6057be 버그 테스트 2020-07-21 22:34:10 +09:00
Hide_D ba8b629f0e 격노비급 버그 수정 2020-07-21 03:41:27 +09:00
Hide_D a0a45ff2aa 격노 비급 버그 수정 2020-07-21 03:32:37 +09:00
Hide_D 325f890a0b 방랑시 버그 수정 2020-07-20 23:24:15 +09:00
Hide_D 923cac5408 전략 턴 버그 수정. 글로벌 쿨 9턴으로 변경 2020-07-17 00:16:48 +09:00
Hide_D 23505326c7 격노 추가 향상 2020-07-16 02:57:37 +09:00
Hide_D 5f1a48f523 아이템 짝 안맞는 것 수정 2020-07-16 02:38:40 +09:00
Hide_D a607d39030 아이템 수정 2020-07-16 02:31:18 +09:00
Hide_D 96d108729e 위압 사기버그 수정 2020-07-15 11:55:35 +09:00
Hide_D ef15adaaf8 저격 약간 더 강화 2020-07-15 02:56:31 +09:00
Hide_D f190b74a7e 필살 조금 더 강화 2020-07-15 02:52:14 +09:00
Hide_D edbc2b88b6 버그 수정 2020-07-15 02:43:00 +09:00
Hide_D dc000cecf1 전특 대 개편 2020-07-15 02:33:21 +09:00
Hide_D 7c95a483df 기본 스탯 향상 2020-07-13 23:25:33 +09:00
Hide_D 27e5d73da1 전략별 쿨타임 적용 2020-07-13 23:21:21 +09:00
Hide_D 6306dae92d 전략 사용 방식 변경 2020-07-13 21:54:32 +09:00
Hide_D a427ddff83 수동 토너먼트 버그 수정 2020-07-07 15:24:48 +09:00
Hide_D b62ee6e820 버그 수정 2020-06-26 23:33:39 +09:00
Hide_D 3c18666080 로그인 form draw 예시 2020-06-26 23:31:45 +09:00
Hide_D 40968b301a file_cache_준비 2020-06-26 21:24:24 +09:00
Hide_D 05904d31fd webp 지원 2020-06-26 02:43:46 +09:00
Hide_D 75aeaf4ee7 후방워프 버그 수정 2020-06-26 02:30:35 +09:00
Hide_D ff4e67a9f6 중립턴, 내정워프 수정 2020-06-26 02:26:59 +09:00
Hide_D 5f672d5bd1 몰수 기준 완화 2020-06-26 00:16:56 +09:00
Hide_D 5cb39eba8b 전특 초기화에서 '쿨'을 감안함 2020-06-25 23:45:09 +09:00
Hide_D 4d8c3c75d6 새 금쌀 구매 로직 2020-06-25 23:43:35 +09:00
Hide_D 8bdd19fc06 버그 수정 2020-06-21 17:07:03 +09:00
Hide_D 0ec99d8ba1 서버 커스터마이징 가능 2020-06-21 17:03:32 +09:00
Hide_D 929d2db5a5 유저장 구출 버그 수정 예상 2020-06-20 21:43:28 +09:00
Hide_D a7ad77f433 최근 전투 페이즈 계산 버그 수정 2020-06-20 15:09:35 +09:00
Hide_D 9cd47d5deb recent_war 표기 방식 변경경 2020-06-19 20:24:50 +09:00
Hide_D 3cb5691aae 수비 기호 표시 추가 2020-06-18 01:05:34 +09:00
Hide_D dce63919fa 부대유저장발령 코드 일부 수정 2020-06-17 03:39:22 +09:00
Hide_D 1cdbedcb96 도시 치료 결과가 이상하게 뜨는 버그 수정 2020-06-16 00:26:45 +09:00
Hide_D 1586712ce5 버그 수정 2020-06-12 22:11:19 +09:00
Hide_D f059186494 구출 발령 활성화 안된 버그 수정 2020-06-12 22:08:56 +09:00
Hide_D 0af0be57b0 전방 발령 버그 수정 2020-06-12 21:16:37 +09:00
Hide_D dad2b03212 ExistsDestNation 버그 수정 2020-06-12 20:39:31 +09:00
Hide_D b6e307660f warning 수정 2020-06-12 20:28:50 +09:00
Hide_D c21c14825a 오타 수정 2020-06-11 03:28:10 +09:00
Hide_D 39f9c986e9 버그 수정 2020-06-11 03:21:26 +09:00
Hide_D 393683aebc 버그 수정 2020-06-11 03:14:12 +09:00
Hide_D a87fcb44a6 전투 시뮬레이터 장수 불러오기 완성 2020-06-11 03:13:02 +09:00
Hide_D 0a6496ddfb 관직 비우기 안되는 것 수정 2020-06-11 00:29:36 +09:00
Hide_D fa2841fac6 원조 버그 수정 2020-06-11 00:20:08 +09:00
Hide_D 861e45419b 포상 검사 로직 빠진 부분 수정 2020-06-09 20:50:57 +09:00
Hide_D 15fd943456 전쟁장 판단 기준 임시 수정, 사망 대비 장수에겐 포상안함 2020-06-09 20:32:49 +09:00
Hide_D b538bfc27e Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2020-06-09 20:30:41 +09:00
Hide_D e0f32eddc4 전쟁장 판별 코드 임시 수정 2020-06-09 20:30:34 +09:00
Hide_D 75a704c196 저격시 아이템이 무조건 소모되는 버그 수정 2020-06-09 01:45:52 +09:00
Hide_D 6565fdbe7e 무장 신산 가능 2020-06-09 01:25:35 +09:00
Hide_D 6248d72852 홀짝 버그 수정 2020-06-09 01:10:21 +09:00
Hide_D 00d1797b96 내특 동작 안하는 버그 수정 2020-06-09 01:03:58 +09:00
Hide_D 911194eba8 찐유저무쌍 비급판 2020-06-07 16:08:04 +09:00
Hide_D 0fad3ae31d 유지비를 깎고 세수를 계산하도록 수정 2020-06-06 19:21:51 +09:00
Hide_D b6988d866a 선포 동안에는 초토화 가능하도록 수정 2020-06-06 15:43:29 +09:00
Hide_D e30959a656 숙련전환 효율 향상 2020-06-06 14:33:21 +09:00
Hide_D 52eeff3466 환약 사용 여부가 안보이는 버그 수정 2020-06-06 13:45:31 +09:00
Hide_D a06ded552d 유저장은 자동 사령턴 켬끔 가능 2020-06-06 13:20:01 +09:00
Hide_D e9b8a84243 전방 발령에 공백지 배제 2020-06-06 12:55:34 +09:00
Hide_D 1fc3cfd1f2 중립 인탐 확률 감소 2020-06-06 03:07:00 +09:00
Hide_D 188b57ed7a 랜덤 임관 버그 수정 2020-06-05 18:13:21 +09:00
Hide_D c8620390ac 중립 커맨드 2020-06-05 02:25:44 +09:00
Hide_D b3f8ed2335 지도 기반 선택 버그 수정 2020-06-05 01:14:49 +09:00
Hide_D 54bf504eb4 명령 입력턴에 select2 적용 2020-06-05 01:02:33 +09:00
Hide_D c6f3bf856b select2 업그레이드 2020-06-04 23:21:47 +09:00
Hide_D 8b33a7926e 오호 장군 수정 2020-06-04 21:31:26 +09:00
Hide_D a38cb90cbf 천지비급 시나리오를 설명에 맞게 수정 2020-06-03 22:17:22 +09:00
Hide_D 1500e8e54f 서버가 닫힌 경우 리다이렉트하도록 2020-06-03 01:51:31 +09:00
Hide_D 94fd8d5e9d 세력도시 암행부 연동 버그 수정 2020-06-02 01:24:25 +09:00
Hide_D 373e0a2155 버그 수정 시도2 2020-06-02 01:06:00 +09:00
Hide_D 267298f341 사령부 공백이어도 사령턴은 보임 2020-06-02 00:24:44 +09:00
Hide_D 359d46e94d 천지비급 디버그 풀기 2020-06-02 00:08:52 +09:00
Hide_D 11f5540099 composer 반영 2020-06-01 21:14:50 +09:00
Hide_D 680e1afcfd 버그 수정 2020-06-01 02:34:56 +09:00
Hide_D e4322e60cc 환약 사용 기준 추가 2020-06-01 02:31:46 +09:00
Hide_D 82f2eecfe8 내 설정 페이지 동작 방식 일단 수정 2020-06-01 02:17:20 +09:00
Hide_D 3e3c3c559d 소모성 아이템 소비 2020-05-31 23:11:17 +09:00
Hide_D 65f5e8e964 setResultTurn 버그 수정 2020-05-31 17:21:51 +09:00
Hide_D c5fbe93890 버그 수정 2020-05-31 04:43:15 +09:00
Hide_D 307d8b6165 버그 수정 2020-05-31 04:42:11 +09:00
Hide_D bf08eb2f8b 버그 수정 2020-05-31 04:32:46 +09:00
Hide_D a569c1dfaf 버그 수정 2020-05-31 04:25:36 +09:00
Hide_D e48db0d231 장수 목록 json 버그 수정 2020-05-31 04:12:42 +09:00
Hide_D 1a5b5dbb45 격노 1회만 2020-05-31 01:47:44 +09:00
Hide_D 56f21cabe5 격노 발동은 1회만 2020-05-31 01:44:44 +09:00
Hide_D 7ac5afe05b 이벤트 특기 버그 수정 2020-05-30 22:50:48 +09:00
Hide_D b3db97f4a8 이중특기 테스트 2020-05-30 16:31:03 +09:00
Hide_D 6d1a06a9d9 긴급 쌀 시 병량패퇴를 당하지 않기 위해 강제 회피 2020-05-30 04:48:33 +09:00
Hide_D 088643df6c 워프 버그 수정 2020-05-30 04:41:47 +09:00
Hide_D fc00a0a363 의병모집, 소형b 초기 m장, 작위보상금쌀
의병모집 -> 초기 금쌀 1000
작위보상 -> 작위에 따라 금쌀*1000
소형b -> 초기 m장 10 추가
2020-05-30 04:36:42 +09:00
Hide_D 7a48fdd246 멸망시 임관 확률을 변경 가능하도록 설정 2020-05-30 03:18:23 +09:00
Hide_D 89be493882 인재탐색 변경. 영입 불가, 재야 가능 2020-05-30 03:09:48 +09:00
Hide_D 5947abf83d 대인 사살, 점령률 추가 2020-05-30 03:05:03 +09:00
Hide_D 962db6821f 대인살상률, 점령수 준비 2020-05-30 02:29:46 +09:00
Hide_D f6a3df7858 수비 켬끔 다양화 2020-05-30 02:08:16 +09:00
Hide_D 090aaed3f4 숙련 전환 효율 향상 2020-05-30 01:56:31 +09:00
Hide_D 71cb5aa9e4 성벽에 닳는 내정을 1/2 2020-05-29 19:16:24 +09:00
Hide_D 043b29ef33 격노 회피 시도 캔슬 2020-05-28 01:39:14 +09:00
Hide_D d81cf4aec3 소집해제 위치 이동 2020-05-28 01:33:27 +09:00
Hide_D 7cb46eeb82 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2020-05-26 21:44:22 +09:00
Hide_D c3b4d54414 내정 워프 버그 수정 2020-05-26 21:44:03 +09:00
Hide_D 8b9acf2d3d 실패 메시지 수정 2020-05-26 10:44:55 +09:00
Hide_D 08548181ed 첩보 가격이 저렴한 버그 수정 2020-05-26 00:47:42 +09:00
Hide_D 45f883c98b 징병창 병력 키보드 입력 버그 2020-05-25 23:28:16 +09:00
Hide_D 5f39229e47 치안강화 만땅 채우기 2020-05-24 22:52:56 +09:00
Hide_D 8c5bdc2a4b 사망시 수명 계산 버그 2020-05-24 13:41:52 +09:00
Hide_D 7b7602bce2 사령부 확실히 엔터 2020-05-23 17:21:07 +09:00
Hide_D a145792fac 헌납 비율 수정 2020-05-23 16:35:33 +09:00
Hide_D 667a550f4c 조사 수정 2020-05-23 16:30:10 +09:00
Hide_D 53e1ad8991 헌납 메시지 수정 2020-05-23 16:28:21 +09:00
Hide_D 429c949d1f AI 치안 버그 수정 2020-05-23 16:24:18 +09:00
Hide_D 1548577d65 주민선정을 매우 열심히 합니다. 2020-05-23 15:33:10 +09:00
Hide_D 82e59b297f 증축 버그 수정 2020-05-23 11:12:10 +09:00
Hide_D 1f9c994425 사령부 시간 표기 문제 2020-05-22 00:24:52 +09:00
Hide_D fc0c7a5004 호황, 풍작 색상 변경 2020-05-22 00:17:24 +09:00
Hide_D a2d0309c79 내특 중복 버그 수정 2020-05-21 12:52:00 +09:00
Hide_D 6d01fbb6e8 generalCommand 생성이 preprecessCommand보다 빠른 문제 수정 2020-05-21 12:14:46 +09:00
Hide_D be270df088 요양 입력하면 템치료 무효화 2020-05-21 02:16:20 +09:00
Hide_D 88fd94e1cc 왕조일람 국가 타입 버그 수정 2020-05-20 01:35:11 +09:00
Hide_D e460392368 인사부 임명시 색상 2020-05-20 01:31:26 +09:00
Hide_D 249cda99f4 랜덤임관에 긍정적인 메시지 추가 2020-05-20 01:26:28 +09:00
Hide_D 327fce822a Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2020-05-20 01:11:41 +09:00
Hide_D 58931354a4 NPC 포상룰 변경 2020-05-20 01:11:35 +09:00
Hide_D c8993e9832 암해부 정렬 버그 2020-05-19 16:53:20 +09:00
Hide_D 4ee2e023aa 버그 수정 2020-05-19 10:07:24 +09:00
Hide_D 22fa1b121e 수정시도2 2020-05-19 00:32:52 +09:00
Hide_D cbc6e526c3 수정시도2 2020-05-19 00:32:40 +09:00
Hide_D 96041faefd 수정시도1 2020-05-19 00:30:55 +09:00
Hide_D 894c912e19 수정시도 1 2020-05-19 00:29:24 +09:00
Hide_D 7b406a945f 버그 수정 2020-05-19 00:25:41 +09:00
Hide_D 6ff5cc90f1 버그 수정 2020-05-19 00:18:45 +09:00
Hide_D f66e56f4b5 보궁기귀 전특 중 '통장'에 타 능력치 금지 추가 2020-05-19 00:08:50 +09:00
Hide_D 8f09aab0ea NPC 자원 기준 대폭 변경 2020-05-18 23:49:13 +09:00
Hide_D b248b9ca2c 불가침 하나만 있어도 계략이 안들어가는 버그 수정 2020-05-18 23:25:53 +09:00
Hide_D 5a6a31fefa 정착장려, 주민선정 색상 문제 2020-05-18 23:24:17 +09:00
Hide_D 1e485a3883 onCalcNationalIncome 버그 2020-05-18 23:17:16 +09:00
Hide_D fed3246c84 계략 성공시 대미지 없는 문제 수정 2020-05-18 20:12:57 +09:00
Hide_D daff4a9786 징병시 부상을 무시하는 버그 수정 2020-05-18 19:35:41 +09:00
Hide_D 6e88b0c701 로그에 도시 추가 2020-05-18 14:30:39 +09:00
Hide_D 808f674173 버그 수정? 2020-05-18 09:55:00 +09:00
Hide_D ba377c9aac 등용 UI 버그 수정 2020-05-17 20:07:09 +09:00
Hide_D bb8909f552 등용 UI 버그 수정 2020-05-17 20:05:47 +09:00
Hide_D 5a4d9ffcfc 등용장 버그 수정
등용장 초반에도 보낼 수 있도록,
리스트에서 optgroup 작성 실수
2020-05-17 20:00:06 +09:00
Hide_D 5ed24a98cb npc 정책 UI 수정 2020-05-17 19:48:20 +09:00
Hide_D 6d17675ee7 npc 정책 UI
?가 아니라 본체를 선택해도 보이도록
2020-05-17 19:45:18 +09:00
Hide_D e0b8bfdeae 버그 수정 2020-05-17 18:15:02 +09:00
Hide_D 0db2009e65 NPC 생성시 스케일러 제거 2020-05-17 13:47:28 +09:00
Hide_D 5f016d74a1 버그 수정 2020-05-17 03:03:04 +09:00
Hide_D 02b9832750 npcMax 추가 감소 2020-05-16 21:12:09 +09:00
Hide_D 18a888b9d4 인탐, 의병모집 수정, npcMin, npcTotal 추가 2020-05-16 18:59:10 +09:00
Hide_D 7f20e981d2 오호장군 표기기준 버그 수정 2020-05-16 18:16:52 +09:00
Hide_D d64e08f3c4 부대장후방발령버그 2020-05-16 16:24:45 +09:00
Hide_D 8bb5324896 출병 경로 설정 메시지 버그 수정 2020-05-16 14:14:13 +09:00
Hide_D 8f2ebc6409 인재탐색 연령버그 수정 2020-05-16 12:37:13 +09:00
Hide_D 371318f62f 버그 수정 2020-05-15 21:59:10 +09:00
Hide_D 6e94403dc6 수치 버그 수정 2020-05-15 21:51:29 +09:00
Hide_D c35f6905bb 초토화 배율 변경 2020-05-15 21:50:11 +09:00
Hide_D 4eebbb3e81 초토화에 전 장수 배신 1호 추가, 반환 금액 입력 2020-05-15 21:25:01 +09:00
Hide_D 8ddfc8fb4a 한계징병 2020-05-15 12:36:01 +09:00
Hide_D 14d2661be8 npc 조작 권한 안내 2020-05-15 00:38:26 +09:00
Hide_D ec71bf29b8 애니 집결 수정 2020-05-15 00:30:14 +09:00
416 changed files with 49350 additions and 29034 deletions
+3
View File
@@ -29,12 +29,15 @@ d_shared
d_pic/*.jpg d_pic/*.jpg
d_pic/*.gif d_pic/*.gif
d_pic/*.png d_pic/*.png
d_pic/*.webp
d_pic/uploaded_image d_pic/uploaded_image
d_setting/*.php d_setting/*.php
*/d_setting/*.php */d_setting/*.php
*/d_setting/templates/*.php */d_setting/templates/*.php
*/data/file_cache
**/old/* **/old/*
test.php test.php
+2 -2
View File
@@ -51,10 +51,8 @@ return [
'hwe/b_tournament.php', 'hwe/b_tournament.php',
'hwe/b_troop.php', 'hwe/b_troop.php',
'hwe/c_auction.php', 'hwe/c_auction.php',
'hwe/c_die_immediately.php',
'hwe/c_dipcenter.php', 'hwe/c_dipcenter.php',
'hwe/c_tournament.php', 'hwe/c_tournament.php',
'hwe/c_vacation.php',
'hwe/c_vote.php', 'hwe/c_vote.php',
'hwe/func.php', 'hwe/func.php',
'hwe/func_auction.php', 'hwe/func_auction.php',
@@ -83,6 +81,7 @@ return [
'hwe/j_board_comment_add.php', 'hwe/j_board_comment_add.php',
'hwe/j_board_get_articles.php', 'hwe/j_board_get_articles.php',
'hwe/j_chief_turn.php', 'hwe/j_chief_turn.php',
'hwe/j_die_immediately.php',
'hwe/j_diplomacy_destroy_letter.php', 'hwe/j_diplomacy_destroy_letter.php',
'hwe/j_diplomacy_get_letter.php', 'hwe/j_diplomacy_get_letter.php',
'hwe/j_diplomacy_respond_letter.php', 'hwe/j_diplomacy_respond_letter.php',
@@ -115,6 +114,7 @@ return [
'hwe/j_set_general_command.php', 'hwe/j_set_general_command.php',
'hwe/j_simulate_battle.php', 'hwe/j_simulate_battle.php',
'hwe/j_troop.php', 'hwe/j_troop.php',
'hwe/j_vacation.php',
'hwe/lib.php', 'hwe/lib.php',
'hwe/process_war.php', 'hwe/process_war.php',
'hwe/select_npc.php', 'hwe/select_npc.php',
+23
View File
@@ -0,0 +1,23 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>닫혀 있습니다.</title>
<script>
setTimeout(function(){
window.location = window.location+'/../';
}, 5000);
</script>
<style>
html, body{
background-color:black;
color:yellow;
}
</style>
</head>
<body>
서버가 닫혀있습니다.<br>
잠시 뒤에 입구로 이동합니다.
</body>
</html>
+5 -5
View File
@@ -9,18 +9,18 @@
* <code>mpm_event</code> 권장 * <code>mpm_event</code> 권장
* PHP 7.3 이상 * PHP 7.3 이상
* <code>php-fpm</code> 권장 * <code>php-fpm</code> 권장
* php에서 curl, pdo-sqlite을 실행가능해야 합니다. (기본값: 지원) * php에서 curl, pdo-sqlite을 실행가능해야 합니다.
* mysqlnd가 지원되어야합니다. (기본값: 지원) * mysqli, mysqlnd
* mysqli
* gd * gd
* mbstring
* MariaDB 10.2.1 이상 * MariaDB 10.2.1 이상
* 현재 MySQL은 지원하지 않습니다. * 현재 MySQL은 지원하지 않습니다.
* <code>git</code> * <code>git</code>
* <code>curl</code> * <code>curl</code>
Linux는 Ubuntu 16.04, 18.04, Windows는 Windows 10에서 XAMPP를 사용한 환경에서 테스트되었습니다. Linux는 Ubuntu 18.04, 20.04, Windows는 Windows 10에서 XAMPP, WSL2를 사용한 환경에서 테스트되었습니다.
Docker를 이용한 설치는 계획중입니다. Docker를 이용한 설치는 테스트버전만 제공됩니다.
## Docker를 이용한 설치 ## Docker를 이용한 설치
+3 -1
View File
@@ -26,7 +26,9 @@
"ezyang/htmlpurifier": "^4.10", "ezyang/htmlpurifier": "^4.10",
"xemlock/htmlpurifier-html5": "^0.1.7", "xemlock/htmlpurifier-html5": "^0.1.7",
"catfan/medoo": "^1.5", "catfan/medoo": "^1.5",
"phan/phan": "^2.7" "phan/phan": "^2.7",
"erusev/parsedown-extra": "^0.8.1",
"nette/caching": "^3.0"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
Generated
+300 -77
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "7343763bee946f23e755edecd14d6b2c", "content-hash": "ab1175c8592ba7f7756d5f02a3aa051c",
"packages": [ "packages": [
{ {
"name": "brandonwamboldt/utilphp", "name": "brandonwamboldt/utilphp",
@@ -215,13 +215,100 @@
"Xdebug", "Xdebug",
"performance" "performance"
], ],
"funding": [ "time": "2020-03-01T12:26:26+00:00"
},
{
"name": "erusev/parsedown",
"version": "1.7.4",
"source": {
"type": "git",
"url": "https://github.com/erusev/parsedown.git",
"reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/erusev/parsedown/zipball/cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
"reference": "cb17b6477dfff935958ba01325f2e8a2bfa6dab3",
"shasum": ""
},
"require": {
"ext-mbstring": "*",
"php": ">=5.3.0"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35"
},
"type": "library",
"autoload": {
"psr-0": {
"Parsedown": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{ {
"url": "https://packagist.com", "name": "Emanuil Rusev",
"type": "custom" "email": "hello@erusev.com",
"homepage": "http://erusev.com"
} }
], ],
"time": "2020-03-01T12:26:26+00:00" "description": "Parser for Markdown.",
"homepage": "http://parsedown.org",
"keywords": [
"markdown",
"parser"
],
"time": "2019-12-30T22:54:17+00:00"
},
{
"name": "erusev/parsedown-extra",
"version": "0.8.1",
"source": {
"type": "git",
"url": "https://github.com/erusev/parsedown-extra.git",
"reference": "91ac3ff98f0cea243bdccc688df43810f044dcef"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/91ac3ff98f0cea243bdccc688df43810f044dcef",
"reference": "91ac3ff98f0cea243bdccc688df43810f044dcef",
"shasum": ""
},
"require": {
"erusev/parsedown": "^1.7.4"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35"
},
"type": "library",
"autoload": {
"psr-0": {
"ParsedownExtra": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Emanuil Rusev",
"email": "hello@erusev.com",
"homepage": "http://erusev.com"
}
],
"description": "An extension of Parsedown that adds support for Markdown Extra.",
"homepage": "https://github.com/erusev/parsedown-extra",
"keywords": [
"markdown",
"markdown extra",
"parsedown",
"parser"
],
"time": "2019-12-30T23:20:37+00:00"
}, },
{ {
"name": "ezyang/htmlpurifier", "name": "ezyang/htmlpurifier",
@@ -756,6 +843,213 @@
"description": "Map nested JSON structures onto PHP classes", "description": "Map nested JSON structures onto PHP classes",
"time": "2020-04-16T18:48:43+00:00" "time": "2020-04-16T18:48:43+00:00"
}, },
{
"name": "nette/caching",
"version": "v3.0.1",
"source": {
"type": "git",
"url": "https://github.com/nette/caching.git",
"reference": "b9ecbf920f240bd1ab14900d9a77876924ad7fb4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/caching/zipball/b9ecbf920f240bd1ab14900d9a77876924ad7fb4",
"reference": "b9ecbf920f240bd1ab14900d9a77876924ad7fb4",
"shasum": ""
},
"require": {
"nette/finder": "^2.4 || ^3.0",
"nette/utils": "^2.4 || ^3.0",
"php": ">=7.1"
},
"require-dev": {
"latte/latte": "^2.4",
"nette/di": "^v3.0",
"nette/tester": "^2.0",
"tracy/tracy": "^2.4"
},
"suggest": {
"ext-pdo_sqlite": "to use SQLiteStorage or SQLiteJournal"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
"GPL-2.0",
"GPL-3.0"
],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/contributors"
}
],
"description": "⏱ Nette Caching: library with easy-to-use API and many cache backends.",
"homepage": "https://nette.org",
"keywords": [
"cache",
"journal",
"memcached",
"nette",
"sqlite"
],
"time": "2019-11-19T18:41:40+00:00"
},
{
"name": "nette/finder",
"version": "v2.5.2",
"source": {
"type": "git",
"url": "https://github.com/nette/finder.git",
"reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/finder/zipball/4ad2c298eb8c687dd0e74ae84206a4186eeaed50",
"reference": "4ad2c298eb8c687dd0e74ae84206a4186eeaed50",
"shasum": ""
},
"require": {
"nette/utils": "^2.4 || ^3.0",
"php": ">=7.1"
},
"conflict": {
"nette/nette": "<2.2"
},
"require-dev": {
"nette/tester": "^2.0",
"phpstan/phpstan": "^0.12",
"tracy/tracy": "^2.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.5-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
"GPL-2.0",
"GPL-3.0"
],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/contributors"
}
],
"description": "🔍 Nette Finder: find files and directories with an intuitive API.",
"homepage": "https://nette.org",
"keywords": [
"filesystem",
"glob",
"iterator",
"nette"
],
"time": "2020-01-03T20:35:40+00:00"
},
{
"name": "nette/utils",
"version": "v3.1.2",
"source": {
"type": "git",
"url": "https://github.com/nette/utils.git",
"reference": "488f58378bba71767e7831c83f9e0fa808bf83b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/488f58378bba71767e7831c83f9e0fa808bf83b9",
"reference": "488f58378bba71767e7831c83f9e0fa808bf83b9",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"require-dev": {
"nette/tester": "~2.0",
"phpstan/phpstan": "^0.12",
"tracy/tracy": "^2.3"
},
"suggest": {
"ext-gd": "to use Image",
"ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()",
"ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()",
"ext-json": "to use Nette\\Utils\\Json",
"ext-mbstring": "to use Strings::lower() etc...",
"ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()",
"ext-xml": "to use Strings::length() etc. when mbstring is not available"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause",
"GPL-2.0-only",
"GPL-3.0-only"
],
"authors": [
{
"name": "David Grudl",
"homepage": "https://davidgrudl.com"
},
{
"name": "Nette Community",
"homepage": "https://nette.org/contributors"
}
],
"description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.",
"homepage": "https://nette.org",
"keywords": [
"array",
"core",
"datetime",
"images",
"json",
"nette",
"paginator",
"password",
"slugify",
"string",
"unicode",
"utf-8",
"utility",
"validation"
],
"time": "2020-05-27T09:58:51+00:00"
},
{ {
"name": "pguardiario/phpuri", "name": "pguardiario/phpuri",
"version": "1.0", "version": "1.0",
@@ -1510,20 +1804,6 @@
], ],
"description": "Symfony Console Component", "description": "Symfony Console Component",
"homepage": "https://symfony.com", "homepage": "https://symfony.com",
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-30T11:42:42+00:00" "time": "2020-03-30T11:42:42+00:00"
}, },
{ {
@@ -1648,20 +1928,6 @@
"polyfill", "polyfill",
"portable" "portable"
], ],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-02-27T09:26:54+00:00" "time": "2020-02-27T09:26:54+00:00"
}, },
{ {
@@ -1721,20 +1987,6 @@
"portable", "portable",
"shim" "shim"
], ],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-03-09T19:04:49+00:00" "time": "2020-03-09T19:04:49+00:00"
}, },
{ {
@@ -1790,20 +2042,6 @@
"portable", "portable",
"shim" "shim"
], ],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-02-27T09:26:54+00:00" "time": "2020-02-27T09:26:54+00:00"
}, },
{ {
@@ -1862,20 +2100,6 @@
"portable", "portable",
"shim" "shim"
], ],
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2020-02-27T09:26:54+00:00" "time": "2020-02-27T09:26:54+00:00"
}, },
{ {
@@ -2095,6 +2319,5 @@
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "platform-overrides": {
"php": "7.3" "php": "7.3"
}, }
"plugin-api-version": "1.1.0"
} }
Regular → Executable
BIN
View File
Binary file not shown.
+132 -73
View File
@@ -1,19 +1,34 @@
@charset "utf-8"; @charset "utf-8";
body { body {
color:white; background-color:black; font-family: '맑은 고딕'; color: white;
background-color: black;
font-family: '맑은 고딕';
} }
table { table {
border: solid 1px; border-spacing: 0px; border-collapse: separate; border-top-color: gray; border-left-color: gray; border-right-color: black; border-bottom-color: black; border: solid 1px;
border-spacing: 0px;
border-collapse: separate;
border-top-color: gray;
border-left-color: gray;
border-right-color: black;
border-bottom-color: black;
padding: 0px; padding: 0px;
font-size: 13px; font-size: 13px;
word-break: break-all; word-break: break-all;
text-align: center; text-align: center;
font-family: '맑은 고딕'; font-family: '맑은 고딕';
} }
th, td {
border: solid 1px; border-spacing: 0px; border-collapse: separate; border-top-color: gray; border-left-color: gray; border-right-color: black; border-bottom-color: black; th,
td {
border: solid 1px;
border-spacing: 0px;
border-collapse: separate;
border-top-color: gray;
border-left-color: gray;
border-right-color: black;
border-bottom-color: black;
padding: 0px; padding: 0px;
font-size: 13px; font-size: 13px;
word-break: break-all; word-break: break-all;
@@ -25,8 +40,8 @@ a.just_link {
text-decoration: none; text-decoration: none;
} }
.with_border{ .with_border {
margin:0; margin: 0;
border: solid 1px; border: solid 1px;
border-spacing: 0px; border-spacing: 0px;
border-collapse: separate; border-collapse: separate;
@@ -37,42 +52,52 @@ a.just_link {
} }
.section_title { .section_title {
height:50px; height: 50px;
line-height:50px; line-height: 50px;
font-size: 30px; font-weight: bold; font-size: 30px;
font-weight: bold;
text-align: center; text-align: center;
color:white; color: white;
padding:0; padding: 0;
} }
.legacy_layout div { .legacy_layout div {
border: solid 1px; border-spacing: 0px; border-collapse: separate; border-top-color: gray; border-left-color: gray; border-right-color: black; border-bottom-color: black; border: solid 1px;
border-spacing: 0px;
border-collapse: separate;
border-top-color: gray;
border-left-color: gray;
border-right-color: black;
border-bottom-color: black;
padding: 0px; padding: 0px;
font-size: 13px; font-size: 13px;
word-break: break-all; word-break: break-all;
text-align: center; text-align: center;
font-family: '맑은 고딕';; font-family: '맑은 고딕';
;
} }
.obj_fill{ .obj_fill {
display:block; display: block;
width:100%; width: 100%;
height:100%; height: 100%;
} }
button.with_skin { button.with_skin {
padding:0 4px; padding: 0 4px;
background-color: black; color: white; background-color: black;
color: white;
font-family: '맑은 고딕'; font-family: '맑은 고딕';
font-size: 13px; font-size: 13px;
} }
button.with_skin:disabled { button.with_skin:disabled {
background-color:#333333; background-color: #333333;
} }
input.with_skin { input.with_skin {
background-color: black; color: white; background-color: black;
color: white;
font-family: '맑은 고딕'; font-family: '맑은 고딕';
font-size: 13px; font-size: 13px;
} }
@@ -81,25 +106,41 @@ input.with_skin:disabled {
background-color: #333333; background-color: #333333;
} }
.font0 { font-size: 10px; } .font0 {
.font1 { font-size: 13px; } font-size: 10px;
.font2 { font-size: 15px; }
.font3 { font-size: 20px; }
.font4 { font-size: 30px; }
.font5 { font-size: 50px; }
caption.section_title {
caption-side:top;
} }
.font1 {
font-size: 13px;
}
.samButton{ .font2 {
float:left; font-size: 15px;
display:block; }
padding:0;
margin:0; .font3 {
font-size: 20px;
}
.font4 {
font-size: 30px;
}
.font5 {
font-size: 50px;
}
caption.section_title {
caption-side: top;
}
.samButton {
float: left;
display: block;
padding: 0;
margin: 0;
text-decoration: none; text-decoration: none;
position:relative; position: relative;
} }
a.samButton.disabled { a.samButton.disabled {
@@ -107,24 +148,23 @@ a.samButton.disabled {
cursor: default; cursor: default;
} }
.samButtonOuter{ .samButtonOuter {
display: table; display: table;
border: outset 2px white; border: outset 2px white;
box-sizing: border-box; box-sizing: border-box;
font-weight:bold; font-weight: bold;
padding: 1px 6px; padding: 1px 6px;
width:125px; width: 125px;
height:30px; height: 30px;
background-color:#000000; background-color: #000000;
color:#ffffff; color: #ffffff;
} }
.samButtonOuter:active{ .samButtonOuter:active {
border: inset 2px white; border: inset 2px white;
} }
.samButtonInner {
.samButtonInner{
display: table-cell; display: table-cell;
vertical-align: middle; vertical-align: middle;
width: 100%; width: 100%;
@@ -133,42 +173,42 @@ a.samButton.disabled {
user-select: none; user-select: none;
} }
.samToolbarButton > .samButtonOuter{ .samToolbarButton>.samButtonOuter {
width:125px; width: 125px;
height:30px; height: 30px;
background-color:#225500; background-color: #225500;
color:white; color: white;
} }
.samToolbarButton2 > .samButtonOuter{ .samToolbarButton2>.samButtonOuter {
width:125px; width: 125px;
height:30px; height: 30px;
background-color:#225500; background-color: #225500;
color:magenta; color: magenta;
} }
.samCommandButton > .samButtonOuter{ .samCommandButton>.samButtonOuter {
width:111px; width: 111px;
height:30px; height: 30px;
} }
.samCommandButton.disabled > .samButtonOuter{ .samCommandButton.disabled>.samButtonOuter {
background-color:transparent !important; background-color: transparent !important;
color:gray !important; color: gray !important;
border-color:transparent !important; border-color: transparent !important;
} }
.samCommandButton.disabled > .samButtonOuter > .samButtonInner::before{ .samCommandButton.disabled>.samButtonOuter>.samButtonInner::before {
content:'【' content: '【'
} }
.samCommandButton.disabled > .samButtonOuter > .samButtonInner::after{ .samCommandButton.disabled>.samButtonOuter>.samButtonInner::after {
content:'】' content: '】'
} }
.tooltip_copyable_info .tooltiptext{ .tooltip_copyable_info .tooltiptext {
display: inline; display: inline;
color: rgba(0,0,0,0); color: rgba(0, 0, 0, 0);
font-size: 0; font-size: 0;
} }
@@ -176,7 +216,26 @@ a.samButton.disabled {
display: none; display: none;
} }
.hidden_but_copyable{ .hidden_but_copyable {
color: rgba(0,0,0,0); color: rgba(0, 0, 0, 0);
font-size: 0; font-size: 0;
} }
.vertical_flex {
height: 100%;
display: flex;
align-content: center;
flex-direction: column;
align-items: stretch;
}
.vertical_flex .item {
display: block;
flex-grow: 1;
}
.fill_box {
display: block;
width: 100%;
height: 100%;
}
+68 -53
View File
@@ -1,141 +1,156 @@
@charset "utf-8"; @charset "utf-8";
body {
body{
line-height: 1.3; line-height: 1.3;
} }
#server_notice { #server_notice {
margin:10px 0; margin: 10px 0;
border: none; border: none;
text-align:center; text-align: center;
} }
#server_list_container{ #server_list_container {
width:800px; width: 800px;
position:absolute; position: absolute;
left:50%; left: 50%;
margin-left:-400px; margin-left: -400px;
} }
#server_list_table{ #server_list_table {
width:100%; width: 100%;
} }
#server_list tr{ #server_list tr {
height:66px; height: 66px;
} }
#server_list .server_create_and_select .general_create, .ignore_border {
#server_list .server_create_and_select .general_select { border: 0;
width: 120px; height: 33px; margin: 0;
float: left; padding: 0;
}
#server_list .general_create,
#server_list .general_login {
width: 120px; height: 66px;
float: left;
}
.ignore_border{
border:0;
margin:0;
padding:0;
} }
#user_info { #user_info {
margin-top:20px; margin-top: 20px;
width: 800px; height: 130px; width: 800px;
height: 130px;
} }
#user_info button {
#user_info button{
width: 200px; width: 200px;
height: 50px; height: 50px;
margin: 10px 50px; margin: 10px 50px;
} }
.center_ordered_items{ .center_ordered_items {
text-align:center; text-align: center;
} }
.Entrance_ServerList { .Entrance_ServerList {
width: 800px; height: 64px; width: 800px;
height: 64px;
border: none; border: none;
float: left; float: left;
} }
.Entrance_ServerListServer { .Entrance_ServerListServer {
width: 98px; height: 64px; width: 98px;
height: 64px;
float: left; float: left;
} }
.Entrance_ServerListDown { .Entrance_ServerListDown {
width: 698px; height: 64px; width: 698px;
height: 64px;
float: left; float: left;
} }
.Entrance_ServerListInfo { .Entrance_ServerListInfo {
width: 398px; height: 64px; width: 398px;
height: 64px;
float: left; float: left;
} }
.Entrance_ServerListBlock { .Entrance_ServerListBlock {
width: 298px; height: 64px; width: 298px;
height: 64px;
float: left; float: left;
line-height: 64px; line-height: 64px;
} }
.Entrance_ServerListCharacter { .Entrance_ServerListCharacter {
width: 64px; height: 64px; width: 64px;
height: 64px;
float: left; float: left;
} }
.Entrance_ServerListName { .Entrance_ServerListName {
width: 112px; height: 64px; width: 112px;
height: 64px;
float: left; float: left;
line-height: 64px; line-height: 64px;
} }
.Entrance_ServerListSelect { .Entrance_ServerListSelect {
width: 120px; height: 32px; width: 120px;
height: 32px;
float: left; float: left;
} }
#Entrance_000003 { #Entrance_000003 {
width: 798px; height: 155px; width: 798px;
height: 155px;
text-align: left; text-align: left;
} }
.Entrance_Alert { .Entrance_Alert {
color: red; font-size: 15px; font-weight: bold; color: red;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Che { .Entrance_Che {
color: white; font-size: 15px; font-weight: bold; color: white;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Kwe { .Entrance_Kwe {
color: yellow; font-size: 15px; font-weight: bold; color: yellow;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Pwe { .Entrance_Pwe {
color: orange; font-size: 15px; font-weight: bold; color: orange;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Twe { .Entrance_Twe {
color: magenta; font-size: 15px; font-weight: bold; color: magenta;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Nya { .Entrance_Nya {
color: #e67e22; font-size: 15px; font-weight: bold; color: #e67e22;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Pya { .Entrance_Pya {
color: #9b59b6; font-size: 15px; font-weight: bold; color: #9b59b6;
font-size: 15px;
font-weight: bold;
} }
.Entrance_Hwe { .Entrance_Hwe {
color: red; font-size: 15px; font-weight: bold; color: red;
font-size: 15px;
font-weight: bold;
}
.BtnPlate {
height: inherit;
} }
+75 -74
View File
@@ -1,131 +1,132 @@
body, html{ body,
html {
height: 100%; height: 100%;
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.main{ .main {
margin-top: 70px; margin-top: 70px;
} }
h1.title { h1.title {
font-size: 50px; font-size: 50px;
font-family: 'Passion One', cursive; font-family: 'Passion One', cursive;
font-weight: 400; font-weight: 400;
} }
hr{ hr {
width: 10%; width: 10%;
/*color: #fff;*/ /*color: #fff;*/
} }
.form-group{ .form-group {
margin-bottom: 15px; margin-bottom: 15px;
} }
label{ label {
margin-bottom: 15px; margin-bottom: 15px;
} }
input, input,
input::-webkit-input-placeholder { input::-webkit-input-placeholder {
font-size: 11px; font-size: 11px;
padding-top: 3px; padding-top: 3px;
} }
.main-login{ .main-login {
/*background-color: #fff;*/ /*background-color: #fff;*/
/* shadows and rounded borders */ /* shadows and rounded borders */
-moz-border-radius: 2px; -moz-border-radius: 2px;
-webkit-border-radius: 2px; -webkit-border-radius: 2px;
border-radius: 2px; border-radius: 2px;
-moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
-webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); -webkit-box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3); box-shadow: 0px 2px 2px rgba(0, 0, 0, 0.3);
} }
.main-center{ .main-center {
margin-top: 30px; margin-top: 30px;
margin: 0 auto; margin: 0 auto;
max-width: 330px; max-width: 330px;
padding: 40px 40px; padding: 40px 40px;
} }
.login_btn_group{ .login_btn_group {
margin-top: 5px; margin-top: 5px;
} }
.login-register{ .login-register {
font-size: 11px; font-size: 11px;
text-align: center; text-align: center;
} }
.col-form-label {
.col-form-label{ text-align: center;
text-align:center;
} }
.terms{ .terms {
max-height: 200px; overflow-y: auto; max-height: 200px;
overflow-y: auto;
} }
.terms pre{ .terms pre {
width:100%; width: 100%;
white-space: pre-wrap; /* Since CSS 2.1 */ white-space: pre-wrap;
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */ /* Since CSS 2.1 */
white-space: -pre-wrap; /* Opera 4-6 */ white-space: -moz-pre-wrap;
white-space: -o-pre-wrap; /* Opera 7 */ /* Mozilla, since 1999 */
word-wrap: break-word; /* Internet Explorer 5.5+ */ white-space: -pre-wrap;
/* Opera 4-6 */
white-space: -o-pre-wrap;
/* Opera 7 */
word-wrap: break-word;
/* Internet Explorer 5.5+ */
} }
.vertical-center { .vertical-center {
min-height: 100%; /* Fallback for browsers do NOT support vh unit */ min-height: 100%;
min-height: 100vh; /* These two lines are counted as one :-) */ /* Fallback for browsers do NOT support vh unit */
min-height: 100vh;
/* These two lines are counted as one :-) */
display: flex; display: flex;
align-items: center; align-items: center;
} }
.full-content { #login_card {
position:fixed; z-index: 801;
left:0;
top:0;
width:100%;
height:100%;
margin:0;
padding:0;
z-index:800;
} }
#login_card{ #btn_kakao_login {
z-index:801;
}
#btn_kakao_login{
cursor: pointer; cursor: pointer;
height:46px; height: 46px;
width:116px; width: 116px;
background-color: transparent; background-color: transparent;
color:transparent; color: transparent;
border:0; border: 0;
background-size: 100%; /* To fill the dimensions of container (button), or */ background-size: 100%;
/* To fill the dimensions of container (button), or */
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: bottom center; background-position: bottom center;
margin-top:5px; margin-top: 5px;
background-image:url('../oauth_kakao/kakao_login_join.png'); background-image: url('../oauth_kakao/kakao_login_join.png');
} }
#btn_kakao_login:hover { #btn_kakao_login:hover {
background-image:url('../oauth_kakao/kakao_login_join_ov.png'); background-image: url('../oauth_kakao/kakao_login_join_ov.png');
} }
#bottom_box{ #bottom_box .container {
position:fixed; text-align: center;
bottom:0;
width:100%;
left:0;
} }
#bottom_box .container{
text-align:center; .btn-group-xs>.btn,
.btn-xs {
padding: .25rem .4rem;
font-size: .875rem;
line-height: .5;
border-radius: .2rem;
}
#running_map {
margin-top: 20px;
} }
+2 -2
View File
@@ -1,3 +1,3 @@
/*! Select2 4.0.5 | https://github.com/select2/select2/blob/master/LICENSE.md */ /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
(function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})(); !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}();
+551 -186
View File
@@ -1,188 +1,553 @@
/* select2-bootstrap4 with Darkly */ /* select2-bootstrap4 with Darkly */
.select2-container--bootstrap4 { color: black; }
.select2-container--bootstrap4 .select2-selection { background-color: #fff; border: 1px solid #ced4da; border-radius: 0.25rem; color: #495057; font-size: 1rem; outline: 0; } .select2-container--bootstrap4 {
color: black;
.select2-container--bootstrap4 .select2-selection.form-control { border-radius: 0.25rem; } }
.select2-container--bootstrap4 .select2-search--dropdown .select2-search__field { background-color: #fff; border: 1px solid #ced4da; border-radius: 0.25rem; color: #495057; font-size: 1rem; } .select2-container--bootstrap4 .select2-selection {
background-color: #fff;
.select2-container--bootstrap4 .select2-search__field { outline: 0; } border: 1px solid #ced4da;
border-radius: 0.25rem;
.select2-container--bootstrap4 .select2-search__field::-webkit-input-placeholder { color: #6c757d; } color: #495057;
font-size: 1rem;
.select2-container--bootstrap4 .select2-search__field:-moz-placeholder { color: #6c757d; } outline: 0;
}
.select2-container--bootstrap4 .select2-search__field::-moz-placeholder { color: #6c757d; opacity: 1; }
.select2-container--bootstrap4 .select2-selection.form-control {
.select2-container--bootstrap4 .select2-search__field:-ms-input-placeholder { color: #6c757d; } border-radius: 0.25rem;
}
.select2-container--bootstrap4 .select2-results__option { padding: 0.75rem 0.375rem; font-size: 1rem; }
.select2-container--bootstrap4 .select2-search--dropdown .select2-search__field {
.select2-container--bootstrap4 .select2-results__option[role=group] { padding: 0; } background-color: #fff;
border: 1px solid #ced4da;
.select2-container--bootstrap4 .select2-results__option[aria-disabled=true] { color: #6c757d; cursor: not-allowed; } border-radius: 0.25rem;
color: #495057;
.select2-container--bootstrap4 .select2-results__option[aria-selected=true] { background-color: #f8f9fa; color: #16181b; } font-size: 1rem;
}
.select2-container--bootstrap4 .select2-results__option--highlighted[aria-selected] { background-color: #007bff; color: #fff; }
.select2-container--bootstrap4 .select2-search__field {
.select2-container--bootstrap4 .select2-results__option .select2-results__option { padding: 0.75rem 0.375rem; } outline: 0;
}
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; }
.select2-container--bootstrap4 .select2-search__field::-webkit-input-placeholder {
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option { margin-left: -0.375rem; padding-left: 0.75rem; } color: #6c757d;
}
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -0.75rem; padding-left: 1.125rem; }
.select2-container--bootstrap4 .select2-search__field:-moz-placeholder {
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -1.125rem; padding-left: 1.5rem; } color: #6c757d;
}
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -1.5rem; padding-left: 1.875rem; }
.select2-container--bootstrap4 .select2-search__field::-moz-placeholder {
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -1.875rem; padding-left: 2.25rem; } color: #6c757d;
opacity: 1;
.select2-container--bootstrap4 .select2-results__group { color: #6c757d; display: block; padding: 0.75rem 0.375rem; font-size: 75%; line-height: 1; white-space: nowrap; } }
.select2-container--bootstrap4.select2-container--focus .select2-selection, .select2-container--bootstrap4.select2-container--open .select2-selection { transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; border-color: #80bdff; } .select2-container--bootstrap4 .select2-search__field:-ms-input-placeholder {
color: #6c757d;
@media screen and (prefers-reduced-motion: reduce) { .select2-container--bootstrap4.select2-container--focus .select2-selection, .select2-container--bootstrap4.select2-container--open .select2-selection { transition: none; } } }
.select2-container--bootstrap4.select2-container--open .select2-selection .select2-selection__arrow b { border-color: transparent transparent #6c757d transparent; border-width: 0 0.25rem 0.25rem 0.25rem; } .select2-container--bootstrap4 .select2-results__option {
padding: 0.75rem 0.375rem;
.select2-container--bootstrap4.select2-container--open.select2-container--below .select2-selection { border-bottom-right-radius: 0; border-bottom-left-radius: 0; border-bottom-color: transparent; } font-size: 1rem;
}
.select2-container--bootstrap4.select2-container--open.select2-container--above .select2-selection { border-top-left-radius: 0; border-top-right-radius: 0; border-top-color: transparent; }
.select2-container--bootstrap4 .select2-results__option[role=group] {
.select2-container--bootstrap4 .select2-selection__clear { color: #6c757d; cursor: pointer; float: right; font-weight: bold; margin-right: 10px; } padding: 0;
}
.select2-container--bootstrap4 .select2-selection__clear:hover { color: #343a40; }
.select2-container--bootstrap4 .select2-results__option[aria-disabled=true] {
.select2-container--bootstrap4.select2-container--disabled .select2-selection { border-color: #ced4da; } color: #6c757d;
cursor: not-allowed;
.select2-container--bootstrap4.select2-container--disabled .select2-selection, .select2-container--bootstrap4.select2-container--disabled .select2-search__field { cursor: not-allowed; } }
.select2-container--bootstrap4.select2-container--disabled .select2-selection, .select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice { background-color: #e9ecef; } .select2-container--bootstrap4 .select2-results__option[aria-selected=true] {
background-color: #f8f9fa;
.select2-container--bootstrap4.select2-container--disabled .select2-selection__clear, .select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove { display: none; } color: #16181b;
}
.select2-container--bootstrap4 .select2-dropdown { border-color: #80bdff; border-width: 1px; overflow-x: hidden; margin-top: -1px; }
.select2-container--bootstrap4 .select2-results__option--highlighted[aria-selected] {
.select2-container--bootstrap4 .select2-dropdown--above { margin-top: 1px; } background-color: #007bff;
color: #fff;
.select2-container--bootstrap4 .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } }
.select2-container--bootstrap4 .select2-selection--single { height: calc(2.25rem + 2px); line-height: 1; padding: 0.75rem 1.125rem 0.75rem 0.375rem; } .select2-container--bootstrap4 .select2-results__option .select2-results__option {
padding: 0.75rem 0.375rem;
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow { position: absolute; bottom: 0; right: 0.375rem; top: 0; width: 0.25rem; } }
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { border-color: #6c757d transparent transparent transparent; border-style: solid; border-width: 0.25rem 0.25rem 0 0.25rem; height: 0; left: 0; margin-left: -0.25rem; margin-top: -0.125rem; position: absolute; top: 50%; width: 0; } .select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__group {
padding-left: 0;
.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered { color: #495057; padding: 0; } }
.select2-container--bootstrap4 .select2-selection--single .select2-selection__placeholder { color: #6c757d; } .select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option {
margin-left: -0.375rem;
.select2-container--bootstrap4 .select2-selection--multiple { min-height: calc(2.25rem + 2px); padding: 0; height: auto; } padding-left: 0.75rem;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; display: block; line-height: 1; list-style: none; margin: 0; overflow: hidden; padding: 0.75rem 0.375rem 0 0.75rem; width: 100%; text-overflow: ellipsis; white-space: nowrap; }
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__placeholder { color: #6c757d; float: left; margin-top: 5px; } margin-left: -0.75rem;
padding-left: 1.125rem;
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { color: #495057; background: transparent; border: 1px solid #343a40; border-radius: 0.25rem; cursor: default; float: left; margin: -0.25rem 0 0 0.1875rem; padding: 0 0.75rem; } }
.select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field { background: transparent; padding: 0 0.375rem; height: calc(2.25rem + 2px)-2; line-height: 1; margin-top: 0; min-width: 5em; } .select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1.125rem;
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove { color: #6c757d; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 0.375rem; } padding-left: 1.5rem;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove:hover { color: #343a40; }
.select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { margin-top: 0.75rem; } margin-left: -1.5rem;
padding-left: 1.875rem;
.select2-container--bootstrap4 .select2-selection--single.input-sm, .input-group-sm .select2-container--bootstrap4 .select2-selection--single, .form-group-sm .select2-container--bootstrap4 .select2-selection--single { border-radius: 0.2rem; font-size: 75%; height: calc(1.8125rem + 2px); line-height: 1; padding: 0.5rem 1rem 0.5rem 0.25rem; } }
.select2-container--bootstrap4 .select2-selection--single.input-sm .select2-selection__arrow b, .input-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b, .form-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { margin-left: -0.5rem; } .select2-container--bootstrap4 .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
margin-left: -1.875rem;
.select2-container--bootstrap4 .select2-selection--multiple.input-sm, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple { min-height: calc(1.8125rem + 2px); border-radius: 0.2rem; } padding-left: 2.25rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__rendered, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered { padding: 0.5rem 0.25rem 0 0.5rem; }
.select2-container--bootstrap4 .select2-results__group {
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__choice, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { font-size: 75%; line-height: 1; margin: 0 0 0 0.125rem; padding: 0 0.5rem; } color: #6c757d;
display: block;
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field { padding: 0 0.25rem; font-size: 75%; height: calc(1.8125rem + 2px)-2; line-height: 1; } padding: 0.75rem 0.375rem;
font-size: 75%;
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__clear, .input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear, .form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { margin-top: 0.5rem; } line-height: 1;
white-space: nowrap;
.select2-container--bootstrap4 .select2-selection--single.input-lg, .input-group-lg .select2-container--bootstrap4 .select2-selection--single, .form-group-lg .select2-container--bootstrap4 .select2-selection--single { border-radius: 0.3rem; font-size: 1.25rem; height: calc(2.875rem + 2px); line-height: 1; padding: 1rem 1.4375rem 1rem 0.5rem; } }
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow, .input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow, .form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow { width: 0.3125rem; } .select2-container--bootstrap4.select2-container--focus .select2-selection,
.select2-container--bootstrap4.select2-container--open .select2-selection {
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow b, .input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b, .form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b { border-width: 0.3125rem 0.3125rem 0 0.3125rem; margin-left: -0.3125rem; margin-left: -1rem; margin-top: -0.15625rem; } transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
border-color: #80bdff;
.select2-container--bootstrap4 .select2-selection--multiple.input-lg, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple { min-height: calc(2.875rem + 2px); border-radius: 0.3rem; } }
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__choice, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice { font-size: 1.25rem; line-height: 1; border-radius: 0.25rem; margin: 0rem 0 0 0.25rem; padding: 0 1rem; } @media screen and (prefers-reduced-motion: reduce) {
.select2-container--bootstrap4.select2-container--focus .select2-selection,
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field { padding: 0 0.5rem; font-size: 1.25rem; height: calc(2.875rem + 2px)-2; line-height: 1; } .select2-container--bootstrap4.select2-container--open .select2-selection {
transition: none;
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__clear, .input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear, .form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear { margin-top: 1rem; } }
}
.select2-container--bootstrap4 .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #6c757d transparent; border-width: 0 0.3125rem 0.3125rem 0.3125rem; }
.select2-container--bootstrap4.select2-container--open .select2-selection .select2-selection__arrow b {
.input-group-lg .select2-container--bootstrap4 .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #6c757d transparent; border-width: 0 0.3125rem 0.3125rem 0.3125rem; } border-color: transparent transparent #6c757d transparent;
border-width: 0 0.25rem 0.25rem 0.25rem;
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single { padding-left: 1.125rem; padding-right: 0.375rem; } }
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 0; padding-left: 0; text-align: right; } .select2-container--bootstrap4.select2-container--open.select2-container--below .select2-selection {
border-bottom-right-radius: 0;
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } border-bottom-left-radius: 0;
border-bottom-color: transparent;
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 0.375rem; right: auto; } }
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow b { margin-left: 0; } .select2-container--bootstrap4.select2-container--open.select2-container--above .select2-selection {
border-top-left-radius: 0;
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; } border-top-right-radius: 0;
border-top-color: transparent;
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 0; margin-right: 0.1875rem; } }
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--bootstrap4 .select2-selection__clear {
color: #6c757d;
.has-warning .select2-dropdown, .has-warning .select2-selection { border-color: #ffc107; } cursor: pointer;
float: right;
.has-warning .select2-container--focus .select2-selection, .has-warning .select2-container--open .select2-selection { border-color: #d39e00; } font-weight: bold;
margin-right: 10px;
.has-warning.select2-drop-active { border-color: #d39e00; } }
.has-warning.select2-drop-active.select2-drop.select2-drop-above { border-top-color: #d39e00; } .select2-container--bootstrap4 .select2-selection__clear:hover {
color: #343a40;
.has-error .select2-dropdown, .has-error .select2-selection { border-color: #dc3545; } }
.has-error .select2-container--focus .select2-selection, .has-error .select2-container--open .select2-selection { border-color: #bd2130; } .select2-container--bootstrap4.select2-container--disabled .select2-selection {
border-color: #ced4da;
.has-error.select2-drop-active { border-color: #bd2130; } }
.has-error.select2-drop-active.select2-drop.select2-drop-above { border-top-color: #bd2130; } .select2-container--bootstrap4.select2-container--disabled .select2-selection,
.select2-container--bootstrap4.select2-container--disabled .select2-search__field {
.has-success .select2-dropdown, .has-success .select2-selection { border-color: #28a745; } cursor: not-allowed;
}
.has-success .select2-container--focus .select2-selection, .has-success .select2-container--open .select2-selection { border-color: #1e7e34; }
.select2-container--bootstrap4.select2-container--disabled .select2-selection,
.has-success.select2-drop-active { border-color: #1e7e34; } .select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice {
background-color: #e9ecef;
.has-success.select2-drop-active.select2-drop.select2-drop-above { border-top-color: #1e7e34; } }
.input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap4 > .selection > .select2-selection, .input-group > .select2-hidden-accessible:first-child + .select2-container--bootstrap4 > .selection > .select2-selection.form-control { border-top-right-radius: 0; border-bottom-right-radius: 0; } .select2-container--bootstrap4.select2-container--disabled .select2-selection__clear,
.select2-container--bootstrap4.select2-container--disabled .select2-selection--multiple .select2-selection__choice__remove {
.input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap4:not(:last-child) > .selection > .select2-selection, .input-group > .select2-hidden-accessible:not(:first-child) + .select2-container--bootstrap4:not(:last-child) > .selection > .select2-selection.form-control { border-radius: 0; } display: none;
}
.input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap4:last-child > .selection > .select2-selection, .input-group > .select2-hidden-accessible:not(:first-child):not(:last-child) + .select2-container--bootstrap4:last-child > .selection > .select2-selection.form-control { border-top-left-radius: 0; border-bottom-left-radius: 0; }
.select2-container--bootstrap4 .select2-dropdown {
.input-group > .select2-container--bootstrap4 { display: table; table-layout: fixed; position: relative; z-index: 2; width: 100%; margin-bottom: 0; } border-color: #80bdff;
border-width: 1px;
.input-group > .select2-container--bootstrap4 > .selection > .select2-selection.form-control { float: none; } overflow-x: hidden;
margin-top: -1px;
.input-group > .select2-container--bootstrap4.select2-container--open, .input-group > .select2-container--bootstrap4.select2-container--focus { z-index: 3; } }
.input-group > .select2-container--bootstrap4, .input-group > .select2-container--bootstrap4 .input-group-btn, .input-group > .select2-container--bootstrap4 .input-group-btn .btn { vertical-align: top; } .select2-container--bootstrap4 .select2-dropdown--above {
margin-top: 1px;
.form-control.select2-hidden-accessible { position: absolute !important; width: 1px !important; } }
@media (min-width: 576px) { .form-inline .select2-container--bootstrap4 { display: inline-block; } } .select2-container--bootstrap4 .select2-results>.select2-results__options {
max-height: 200px;
overflow-y: auto;
}
.select2-container--bootstrap4 .select2-selection--single {
height: calc(2.25rem + 2px);
line-height: 1;
padding: 0.75rem 1.125rem 0.75rem 0.375rem;
}
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow {
position: absolute;
bottom: 0;
right: 0.375rem;
top: 0;
width: 0.25rem;
}
.select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
border-color: #6c757d transparent transparent transparent;
border-style: solid;
border-width: 0.25rem 0.25rem 0 0.25rem;
height: 0;
left: 0;
margin-left: -0.25rem;
margin-top: -0.125rem;
position: absolute;
top: 50%;
width: 0;
}
.select2-container--bootstrap4 .select2-selection--single .select2-selection__rendered {
color: #495057;
padding: 0;
}
.select2-container--bootstrap4 .select2-selection--single .select2-selection__placeholder {
color: #6c757d;
}
.select2-container--bootstrap4 .select2-selection--multiple {
min-height: calc(2.25rem + 2px);
padding: 0;
height: auto;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered {
box-sizing: border-box;
display: block;
line-height: 1;
list-style: none;
margin: 0;
overflow: hidden;
padding: 0.75rem 0.375rem 0 0.75rem;
width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__placeholder {
color: #6c757d;
float: left;
margin-top: 5px;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
color: #495057;
background: transparent;
border: 1px solid #343a40;
border-radius: 0.25rem;
cursor: default;
float: left;
margin: -0.25rem 0 0 0.1875rem;
padding: 0 0.75rem;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field {
background: transparent;
padding: 0 0.375rem;
height: calc(2.25rem + 2px)-2;
line-height: 1;
margin-top: 0;
min-width: 5em;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove {
color: #6c757d;
cursor: pointer;
display: inline-block;
font-weight: bold;
margin-right: 0.375rem;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #343a40;
}
.select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear {
margin-top: 0.75rem;
}
.select2-container--bootstrap4 .select2-selection--single.input-sm,
.input-group-sm .select2-container--bootstrap4 .select2-selection--single,
.form-group-sm .select2-container--bootstrap4 .select2-selection--single {
border-radius: 0.2rem;
font-size: 75%;
height: calc(1.8125rem + 2px);
line-height: 1;
padding: 0.5rem 1rem 0.5rem 0.25rem;
}
.select2-container--bootstrap4 .select2-selection--single.input-sm .select2-selection__arrow b,
.input-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b,
.form-group-sm .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
margin-left: -0.5rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-sm,
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple,
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple {
min-height: calc(1.8125rem + 2px);
border-radius: 0.2rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__rendered,
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered,
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__rendered {
padding: 0.5rem 0.25rem 0 0.5rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__choice,
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice,
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
font-size: 75%;
line-height: 1;
margin: 0 0 0 0.125rem;
padding: 0 0.5rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-search--inline .select2-search__field,
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field,
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field {
padding: 0 0.25rem;
font-size: 75%;
height: calc(1.8125rem + 2px)-2;
line-height: 1;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-sm .select2-selection__clear,
.input-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear,
.form-group-sm .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear {
margin-top: 0.5rem;
}
.select2-container--bootstrap4 .select2-selection--single.input-lg,
.input-group-lg .select2-container--bootstrap4 .select2-selection--single,
.form-group-lg .select2-container--bootstrap4 .select2-selection--single {
border-radius: 0.3rem;
font-size: 1.25rem;
height: calc(2.875rem + 2px);
line-height: 1;
padding: 1rem 1.4375rem 1rem 0.5rem;
}
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow,
.input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow,
.form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow {
width: 0.3125rem;
}
.select2-container--bootstrap4 .select2-selection--single.input-lg .select2-selection__arrow b,
.input-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b,
.form-group-lg .select2-container--bootstrap4 .select2-selection--single .select2-selection__arrow b {
border-width: 0.3125rem 0.3125rem 0 0.3125rem;
margin-left: -0.3125rem;
margin-left: -1rem;
margin-top: -0.15625rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-lg,
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple,
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple {
min-height: calc(2.875rem + 2px);
border-radius: 0.3rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__choice,
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice,
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__choice {
font-size: 1.25rem;
line-height: 1;
border-radius: 0.25rem;
margin: 0rem 0 0 0.25rem;
padding: 0 1rem;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-search--inline .select2-search__field,
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field,
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-search--inline .select2-search__field {
padding: 0 0.5rem;
font-size: 1.25rem;
height: calc(2.875rem + 2px)-2;
line-height: 1;
}
.select2-container--bootstrap4 .select2-selection--multiple.input-lg .select2-selection__clear,
.input-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear,
.form-group-lg .select2-container--bootstrap4 .select2-selection--multiple .select2-selection__clear {
margin-top: 1rem;
}
.select2-container--bootstrap4 .select2-selection.input-lg.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #6c757d transparent;
border-width: 0 0.3125rem 0.3125rem 0.3125rem;
}
.input-group-lg .select2-container--bootstrap4 .select2-selection.select2-container--open .select2-selection--single .select2-selection__arrow b {
border-color: transparent transparent #6c757d transparent;
border-width: 0 0.3125rem 0.3125rem 0.3125rem;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single {
padding-left: 1.125rem;
padding-right: 0.375rem;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__rendered {
padding-right: 0;
padding-left: 0;
text-align: right;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__clear {
float: left;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow {
left: 0.375rem;
right: auto;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--single .select2-selection__arrow b {
margin-left: 0;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice,
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 0;
margin-right: 0.1875rem;
}
.select2-container--bootstrap4[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
margin-left: 2px;
margin-right: auto;
}
.has-warning .select2-dropdown,
.has-warning .select2-selection {
border-color: #ffc107;
}
.has-warning .select2-container--focus .select2-selection,
.has-warning .select2-container--open .select2-selection {
border-color: #d39e00;
}
.has-warning.select2-drop-active {
border-color: #d39e00;
}
.has-warning.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #d39e00;
}
.has-error .select2-dropdown,
.has-error .select2-selection {
border-color: #dc3545;
}
.has-error .select2-container--focus .select2-selection,
.has-error .select2-container--open .select2-selection {
border-color: #bd2130;
}
.has-error.select2-drop-active {
border-color: #bd2130;
}
.has-error.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #bd2130;
}
.has-success .select2-dropdown,
.has-success .select2-selection {
border-color: #28a745;
}
.has-success .select2-container--focus .select2-selection,
.has-success .select2-container--open .select2-selection {
border-color: #1e7e34;
}
.has-success.select2-drop-active {
border-color: #1e7e34;
}
.has-success.select2-drop-active.select2-drop.select2-drop-above {
border-top-color: #1e7e34;
}
.input-group>.select2-hidden-accessible:first-child+.select2-container--bootstrap4>.selection>.select2-selection,
.input-group>.select2-hidden-accessible:first-child+.select2-container--bootstrap4>.selection>.select2-selection.form-control {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group>.select2-hidden-accessible:not(:first-child)+.select2-container--bootstrap4:not(:last-child)>.selection>.select2-selection,
.input-group>.select2-hidden-accessible:not(:first-child)+.select2-container--bootstrap4:not(:last-child)>.selection>.select2-selection.form-control {
border-radius: 0;
}
.input-group>.select2-hidden-accessible:not(:first-child):not(:last-child)+.select2-container--bootstrap4:last-child>.selection>.select2-selection,
.input-group>.select2-hidden-accessible:not(:first-child):not(:last-child)+.select2-container--bootstrap4:last-child>.selection>.select2-selection.form-control {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.input-group>.select2-container--bootstrap4 {
display: table;
table-layout: fixed;
position: relative;
z-index: 2;
width: 100%;
margin-bottom: 0;
}
.input-group>.select2-container--bootstrap4>.selection>.select2-selection.form-control {
float: none;
}
.input-group>.select2-container--bootstrap4.select2-container--open,
.input-group>.select2-container--bootstrap4.select2-container--focus {
z-index: 3;
}
.input-group>.select2-container--bootstrap4,
.input-group>.select2-container--bootstrap4 .input-group-btn,
.input-group>.select2-container--bootstrap4 .input-group-btn .btn {
vertical-align: top;
}
.form-control.select2-hidden-accessible {
position: absolute !important;
width: 1px !important;
}
@media (min-width: 576px) {
.form-inline .select2-container--bootstrap4 {
display: inline-block;
}
}
+8 -11
View File
@@ -118,12 +118,14 @@
.select2-hidden-accessible { .select2-hidden-accessible {
border: 0 !important; border: 0 !important;
clip: rect(0 0 0 0) !important; clip: rect(0 0 0 0) !important;
-webkit-clip-path: inset(50%) !important;
clip-path: inset(50%) !important;
height: 1px !important; height: 1px !important;
margin: -1px !important;
overflow: hidden !important; overflow: hidden !important;
padding: 0 !important; padding: 0 !important;
position: absolute !important; position: absolute !important;
width: 1px !important; } width: 1px !important;
white-space: nowrap !important; }
.select2-container--default .select2-selection--single { .select2-container--default .select2-selection--single {
background-color: #fff; background-color: #fff;
@@ -186,16 +188,13 @@
width: 100%; } width: 100%; }
.select2-container--default .select2-selection--multiple .select2-selection__rendered li { .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
list-style: none; } list-style: none; }
.select2-container--default .select2-selection--multiple .select2-selection__placeholder {
color: #999;
margin-top: 5px;
float: left; }
.select2-container--default .select2-selection--multiple .select2-selection__clear { .select2-container--default .select2-selection--multiple .select2-selection__clear {
cursor: pointer; cursor: pointer;
float: right; float: right;
font-weight: bold; font-weight: bold;
margin-top: 5px; margin-top: 5px;
margin-right: 10px; } margin-right: 10px;
padding: 1px; }
.select2-container--default .select2-selection--multiple .select2-selection__choice { .select2-container--default .select2-selection--multiple .select2-selection__choice {
background-color: #e4e4e4; background-color: #e4e4e4;
border: 1px solid #aaa; border: 1px solid #aaa;
@@ -214,7 +213,7 @@
.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
color: #333; } color: #333; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
float: right; } float: right; }
.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
@@ -420,9 +419,7 @@
color: #555; } color: #555; }
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
float: right; } float: right;
.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
margin-left: 5px; margin-left: 5px;
margin-right: auto; } margin-right: auto; }
+583 -220
View File
@@ -1,11 +1,11 @@
/*! /*!
* Select2 4.0.5 * Select2 4.0.13
* https://select2.github.io * https://select2.github.io
* *
* Released under the MIT license * Released under the MIT license
* https://github.com/select2/select2/blob/master/LICENSE.md * https://github.com/select2/select2/blob/master/LICENSE.md
*/ */
(function (factory) { ;(function (factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module. // AMD. Register as an anonymous module.
define(['jquery'], factory); define(['jquery'], factory);
@@ -574,10 +574,10 @@ S2.define('select2/utils',[
DecoratedClass.prototype = new ctr(); DecoratedClass.prototype = new ctr();
for (var m = 0; m < superMethods.length; m++) { for (var m = 0; m < superMethods.length; m++) {
var superMethod = superMethods[m]; var superMethod = superMethods[m];
DecoratedClass.prototype[superMethod] = DecoratedClass.prototype[superMethod] =
SuperClass.prototype[superMethod]; SuperClass.prototype[superMethod];
} }
var calledMethod = function (methodName) { var calledMethod = function (methodName) {
@@ -772,6 +772,70 @@ S2.define('select2/utils',[
$element.append($nodes); $element.append($nodes);
}; };
// Cache objects in Utils.__cache instead of $.data (see #4346)
Utils.__cache = {};
var id = 0;
Utils.GetUniqueElementId = function (element) {
// Get a unique element Id. If element has no id,
// creates a new unique number, stores it in the id
// attribute and returns the new id.
// If an id already exists, it simply returns it.
var select2Id = element.getAttribute('data-select2-id');
if (select2Id == null) {
// If element has id, use it.
if (element.id) {
select2Id = element.id;
element.setAttribute('data-select2-id', select2Id);
} else {
element.setAttribute('data-select2-id', ++id);
select2Id = id.toString();
}
}
return select2Id;
};
Utils.StoreData = function (element, name, value) {
// Stores an item in the cache for a specified element.
// name is the cache key.
var id = Utils.GetUniqueElementId(element);
if (!Utils.__cache[id]) {
Utils.__cache[id] = {};
}
Utils.__cache[id][name] = value;
};
Utils.GetData = function (element, name) {
// Retrieves a value from the cache by its key (name)
// name is optional. If no name specified, return
// all cache items for the specified element.
// and for a specified element.
var id = Utils.GetUniqueElementId(element);
if (name) {
if (Utils.__cache[id]) {
if (Utils.__cache[id][name] != null) {
return Utils.__cache[id][name];
}
return $(element).data(name); // Fallback to HTML5 data attribs.
}
return $(element).data(name); // Fallback to HTML5 data attribs.
} else {
return Utils.__cache[id];
}
};
Utils.RemoveData = function (element) {
// Removes all cached items for a specified element.
var id = Utils.GetUniqueElementId(element);
if (Utils.__cache[id] != null) {
delete Utils.__cache[id];
}
element.removeAttribute('data-select2-id');
};
return Utils; return Utils;
}); });
@@ -791,7 +855,7 @@ S2.define('select2/results',[
Results.prototype.render = function () { Results.prototype.render = function () {
var $results = $( var $results = $(
'<ul class="select2-results__options" role="tree"></ul>' '<ul class="select2-results__options" role="listbox"></ul>'
); );
if (this.options.get('multiple')) { if (this.options.get('multiple')) {
@@ -814,7 +878,7 @@ S2.define('select2/results',[
this.hideLoading(); this.hideLoading();
var $message = $( var $message = $(
'<li role="treeitem" aria-live="assertive"' + '<li role="alert" aria-live="assertive"' +
' class="select2-results__option"></li>' ' class="select2-results__option"></li>'
); );
@@ -907,7 +971,7 @@ S2.define('select2/results',[
$options.each(function () { $options.each(function () {
var $option = $(this); var $option = $(this);
var item = $.data(this, 'data'); var item = Utils.GetData(this, 'data');
// id needs to be converted to a string when comparing // id needs to be converted to a string when comparing
var id = '' + item.id; var id = '' + item.id;
@@ -948,11 +1012,16 @@ S2.define('select2/results',[
option.className = 'select2-results__option'; option.className = 'select2-results__option';
var attrs = { var attrs = {
'role': 'treeitem', 'role': 'option',
'aria-selected': 'false' 'aria-selected': 'false'
}; };
if (data.disabled) { var matches = window.Element.prototype.matches ||
window.Element.prototype.msMatchesSelector ||
window.Element.prototype.webkitMatchesSelector;
if ((data.element != null && matches.call(data.element, ':disabled')) ||
(data.element == null && data.disabled)) {
delete attrs['aria-selected']; delete attrs['aria-selected'];
attrs['aria-disabled'] = 'true'; attrs['aria-disabled'] = 'true';
} }
@@ -1012,7 +1081,7 @@ S2.define('select2/results',[
this.template(data, option); this.template(data, option);
} }
$.data(option, 'data', data); Utils.StoreData(option, 'data', data);
return option; return option;
}; };
@@ -1053,7 +1122,10 @@ S2.define('select2/results',[
} }
self.setClasses(); self.setClasses();
self.highlightFirstItem();
if (self.options.get('scrollAfterSelect')) {
self.highlightFirstItem();
}
}); });
container.on('unselect', function () { container.on('unselect', function () {
@@ -1062,7 +1134,10 @@ S2.define('select2/results',[
} }
self.setClasses(); self.setClasses();
self.highlightFirstItem();
if (self.options.get('scrollAfterSelect')) {
self.highlightFirstItem();
}
}); });
container.on('open', function () { container.on('open', function () {
@@ -1098,7 +1173,7 @@ S2.define('select2/results',[
return; return;
} }
var data = $highlighted.data('data'); var data = Utils.GetData($highlighted[0], 'data');
if ($highlighted.attr('aria-selected') == 'true') { if ($highlighted.attr('aria-selected') == 'true') {
self.trigger('close', {}); self.trigger('close', {});
@@ -1116,8 +1191,9 @@ S2.define('select2/results',[
var currentIndex = $options.index($highlighted); var currentIndex = $options.index($highlighted);
// If we are already at te top, don't move further // If we are already at the top, don't move further
if (currentIndex === 0) { // If no options, currentIndex will be -1
if (currentIndex <= 0) {
return; return;
} }
@@ -1210,7 +1286,7 @@ S2.define('select2/results',[
function (evt) { function (evt) {
var $this = $(this); var $this = $(this);
var data = $this.data('data'); var data = Utils.GetData(this, 'data');
if ($this.attr('aria-selected') === 'true') { if ($this.attr('aria-selected') === 'true') {
if (self.options.get('multiple')) { if (self.options.get('multiple')) {
@@ -1233,7 +1309,7 @@ S2.define('select2/results',[
this.$results.on('mouseenter', '.select2-results__option[aria-selected]', this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
function (evt) { function (evt) {
var data = $(this).data('data'); var data = Utils.GetData(this, 'data');
self.getHighlightedResults() self.getHighlightedResults()
.removeClass('select2-results__option--highlighted'); .removeClass('select2-results__option--highlighted');
@@ -1348,14 +1424,15 @@ S2.define('select2/selection/base',[
this._tabindex = 0; this._tabindex = 0;
if (this.$element.data('old-tabindex') != null) { if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
this._tabindex = this.$element.data('old-tabindex'); this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
} else if (this.$element.attr('tabindex') != null) { } else if (this.$element.attr('tabindex') != null) {
this._tabindex = this.$element.attr('tabindex'); this._tabindex = this.$element.attr('tabindex');
} }
$selection.attr('title', this.$element.attr('title')); $selection.attr('title', this.$element.attr('title'));
$selection.attr('tabindex', this._tabindex); $selection.attr('tabindex', this._tabindex);
$selection.attr('aria-disabled', 'false');
this.$selection = $selection; this.$selection = $selection;
@@ -1365,7 +1442,6 @@ S2.define('select2/selection/base',[
BaseSelection.prototype.bind = function (container, $container) { BaseSelection.prototype.bind = function (container, $container) {
var self = this; var self = this;
var id = container.id + '-container';
var resultsId = container.id + '-results'; var resultsId = container.id + '-results';
this.container = container; this.container = container;
@@ -1408,17 +1484,19 @@ S2.define('select2/selection/base',[
self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-activedescendant');
self.$selection.removeAttr('aria-owns'); self.$selection.removeAttr('aria-owns');
self.$selection.focus(); self.$selection.trigger('focus');
self._detachCloseHandler(container); self._detachCloseHandler(container);
}); });
container.on('enable', function () { container.on('enable', function () {
self.$selection.attr('tabindex', self._tabindex); self.$selection.attr('tabindex', self._tabindex);
self.$selection.attr('aria-disabled', 'false');
}); });
container.on('disable', function () { container.on('disable', function () {
self.$selection.attr('tabindex', '-1'); self.$selection.attr('tabindex', '-1');
self.$selection.attr('aria-disabled', 'true');
}); });
}; };
@@ -1441,7 +1519,6 @@ S2.define('select2/selection/base',[
}; };
BaseSelection.prototype._attachCloseHandler = function (container) { BaseSelection.prototype._attachCloseHandler = function (container) {
var self = this;
$(document.body).on('mousedown.select2.' + container.id, function (e) { $(document.body).on('mousedown.select2.' + container.id, function (e) {
var $target = $(e.target); var $target = $(e.target);
@@ -1451,13 +1528,11 @@ S2.define('select2/selection/base',[
var $all = $('.select2.select2-container--open'); var $all = $('.select2.select2-container--open');
$all.each(function () { $all.each(function () {
var $this = $(this);
if (this == $select[0]) { if (this == $select[0]) {
return; return;
} }
var $element = $this.data('element'); var $element = Utils.GetData(this, 'element');
$element.select2('close'); $element.select2('close');
}); });
@@ -1481,6 +1556,27 @@ S2.define('select2/selection/base',[
throw new Error('The `update` method must be defined in child classes.'); throw new Error('The `update` method must be defined in child classes.');
}; };
/**
* Helper method to abstract the "enabled" (not "disabled") state of this
* object.
*
* @return {true} if the instance is not disabled.
* @return {false} if the instance is disabled.
*/
BaseSelection.prototype.isEnabled = function () {
return !this.isDisabled();
};
/**
* Helper method to abstract the "disabled" state of this object.
*
* @return {true} if the disabled option is true.
* @return {false} if the disabled option is false.
*/
BaseSelection.prototype.isDisabled = function () {
return this.options.get('disabled');
};
return BaseSelection; return BaseSelection;
}); });
@@ -1518,7 +1614,10 @@ S2.define('select2/selection/single',[
var id = container.id + '-container'; var id = container.id + '-container';
this.$selection.find('.select2-selection__rendered').attr('id', id); this.$selection.find('.select2-selection__rendered')
.attr('id', id)
.attr('role', 'textbox')
.attr('aria-readonly', 'true');
this.$selection.attr('aria-labelledby', id); this.$selection.attr('aria-labelledby', id);
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
@@ -1542,17 +1641,15 @@ S2.define('select2/selection/single',[
container.on('focus', function (evt) { container.on('focus', function (evt) {
if (!container.isOpen()) { if (!container.isOpen()) {
self.$selection.focus(); self.$selection.trigger('focus');
} }
}); });
container.on('selection:update', function (params) {
self.update(params.data);
});
}; };
SingleSelection.prototype.clear = function () { SingleSelection.prototype.clear = function () {
this.$selection.find('.select2-selection__rendered').empty(); var $rendered = this.$selection.find('.select2-selection__rendered');
$rendered.empty();
$rendered.removeAttr('title'); // clear tooltip on empty
}; };
SingleSelection.prototype.display = function (data, container) { SingleSelection.prototype.display = function (data, container) {
@@ -1578,7 +1675,14 @@ S2.define('select2/selection/single',[
var formatted = this.display(selection, $rendered); var formatted = this.display(selection, $rendered);
$rendered.empty().append(formatted); $rendered.empty().append(formatted);
$rendered.prop('title', selection.title || selection.text);
var title = selection.title || selection.text;
if (title) {
$rendered.attr('title', title);
} else {
$rendered.removeAttr('title');
}
}; };
return SingleSelection; return SingleSelection;
@@ -1623,14 +1727,14 @@ S2.define('select2/selection/multiple',[
'.select2-selection__choice__remove', '.select2-selection__choice__remove',
function (evt) { function (evt) {
// Ignore the event if it is disabled // Ignore the event if it is disabled
if (self.options.get('disabled')) { if (self.isDisabled()) {
return; return;
} }
var $remove = $(this); var $remove = $(this);
var $selection = $remove.parent(); var $selection = $remove.parent();
var data = $selection.data('data'); var data = Utils.GetData($selection[0], 'data');
self.trigger('unselect', { self.trigger('unselect', {
originalEvent: evt, originalEvent: evt,
@@ -1641,7 +1745,9 @@ S2.define('select2/selection/multiple',[
}; };
MultipleSelection.prototype.clear = function () { MultipleSelection.prototype.clear = function () {
this.$selection.find('.select2-selection__rendered').empty(); var $rendered = this.$selection.find('.select2-selection__rendered');
$rendered.empty();
$rendered.removeAttr('title');
}; };
MultipleSelection.prototype.display = function (data, container) { MultipleSelection.prototype.display = function (data, container) {
@@ -1679,9 +1785,14 @@ S2.define('select2/selection/multiple',[
var formatted = this.display(selection, $selection); var formatted = this.display(selection, $selection);
$selection.append(formatted); $selection.append(formatted);
$selection.prop('title', selection.title || selection.text);
$selection.data('data', selection); var title = selection.title || selection.text;
if (title) {
$selection.attr('title', title);
}
Utils.StoreData($selection[0], 'data', selection);
$selections.push($selection); $selections.push($selection);
} }
@@ -1746,8 +1857,9 @@ S2.define('select2/selection/placeholder',[
S2.define('select2/selection/allowClear',[ S2.define('select2/selection/allowClear',[
'jquery', 'jquery',
'../keys' '../keys',
], function ($, KEYS) { '../utils'
], function ($, KEYS, Utils) {
function AllowClear () { } function AllowClear () { }
AllowClear.prototype.bind = function (decorated, container, $container) { AllowClear.prototype.bind = function (decorated, container, $container) {
@@ -1776,7 +1888,7 @@ S2.define('select2/selection/allowClear',[
AllowClear.prototype._handleClear = function (_, evt) { AllowClear.prototype._handleClear = function (_, evt) {
// Ignore the event if it is disabled // Ignore the event if it is disabled
if (this.options.get('disabled')) { if (this.isDisabled()) {
return; return;
} }
@@ -1789,10 +1901,22 @@ S2.define('select2/selection/allowClear',[
evt.stopPropagation(); evt.stopPropagation();
var data = $clear.data('data'); var data = Utils.GetData($clear[0], 'data');
var previousVal = this.$element.val();
this.$element.val(this.placeholder.id);
var unselectData = {
data: data
};
this.trigger('clear', unselectData);
if (unselectData.prevented) {
this.$element.val(previousVal);
return;
}
for (var d = 0; d < data.length; d++) { for (var d = 0; d < data.length; d++) {
var unselectData = { unselectData = {
data: data[d] data: data[d]
}; };
@@ -1802,11 +1926,12 @@ S2.define('select2/selection/allowClear',[
// If the event was prevented, don't clear it out. // If the event was prevented, don't clear it out.
if (unselectData.prevented) { if (unselectData.prevented) {
this.$element.val(previousVal);
return; return;
} }
} }
this.$element.val(this.placeholder.id).trigger('change'); this.$element.trigger('input').trigger('change');
this.trigger('toggle', {}); this.trigger('toggle', {});
}; };
@@ -1829,12 +1954,14 @@ S2.define('select2/selection/allowClear',[
return; return;
} }
var removeAll = this.options.get('translations').get('removeAllItems');
var $remove = $( var $remove = $(
'<span class="select2-selection__clear">' + '<span class="select2-selection__clear" title="' + removeAll() +'">' +
'&times;' + '&times;' +
'</span>' '</span>'
); );
$remove.data('data', data); Utils.StoreData($remove[0], 'data', data);
this.$selection.find('.select2-selection__rendered').prepend($remove); this.$selection.find('.select2-selection__rendered').prepend($remove);
}; };
@@ -1856,7 +1983,7 @@ S2.define('select2/selection/search',[
'<li class="select2-search select2-search--inline">' + '<li class="select2-search select2-search--inline">' +
'<input class="select2-search__field" type="search" tabindex="-1"' + '<input class="select2-search__field" type="search" tabindex="-1"' +
' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
' spellcheck="false" role="textbox" aria-autocomplete="list" />' + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
'</li>' '</li>'
); );
@@ -1873,14 +2000,18 @@ S2.define('select2/selection/search',[
Search.prototype.bind = function (decorated, container, $container) { Search.prototype.bind = function (decorated, container, $container) {
var self = this; var self = this;
var resultsId = container.id + '-results';
decorated.call(this, container, $container); decorated.call(this, container, $container);
container.on('open', function () { container.on('open', function () {
self.$search.attr('aria-controls', resultsId);
self.$search.trigger('focus'); self.$search.trigger('focus');
}); });
container.on('close', function () { container.on('close', function () {
self.$search.val(''); self.$search.val('');
self.$search.removeAttr('aria-controls');
self.$search.removeAttr('aria-activedescendant'); self.$search.removeAttr('aria-activedescendant');
self.$search.trigger('focus'); self.$search.trigger('focus');
}); });
@@ -1900,7 +2031,11 @@ S2.define('select2/selection/search',[
}); });
container.on('results:focus', function (params) { container.on('results:focus', function (params) {
self.$search.attr('aria-activedescendant', params.id); if (params.data._resultId) {
self.$search.attr('aria-activedescendant', params.data._resultId);
} else {
self.$search.removeAttr('aria-activedescendant');
}
}); });
this.$selection.on('focusin', '.select2-search--inline', function (evt) { this.$selection.on('focusin', '.select2-search--inline', function (evt) {
@@ -1925,7 +2060,7 @@ S2.define('select2/selection/search',[
.prev('.select2-selection__choice'); .prev('.select2-selection__choice');
if ($previousChoice.length > 0) { if ($previousChoice.length > 0) {
var item = $previousChoice.data('data'); var item = Utils.GetData($previousChoice[0], 'data');
self.searchRemoveChoice(item); self.searchRemoveChoice(item);
@@ -1934,6 +2069,12 @@ S2.define('select2/selection/search',[
} }
}); });
this.$selection.on('click', '.select2-search--inline', function (evt) {
if (self.$search.val()) {
evt.stopPropagation();
}
});
// Try to detect the IE version should the `documentMode` property that // Try to detect the IE version should the `documentMode` property that
// is stored on the document. This is only implemented in IE and is // is stored on the document. This is only implemented in IE and is
// slightly cleaner than doing a user agent check. // slightly cleaner than doing a user agent check.
@@ -2019,7 +2160,7 @@ S2.define('select2/selection/search',[
this.resizeSearch(); this.resizeSearch();
if (searchHadFocus) { if (searchHadFocus) {
this.$search.focus(); this.$search.trigger('focus');
} }
}; };
@@ -2052,7 +2193,7 @@ S2.define('select2/selection/search',[
var width = ''; var width = '';
if (this.$search.attr('placeholder') !== '') { if (this.$search.attr('placeholder') !== '') {
width = this.$selection.find('.select2-selection__rendered').innerWidth(); width = this.$selection.find('.select2-selection__rendered').width();
} else { } else {
var minimumWidth = this.$search.val().length + 1; var minimumWidth = this.$search.val().length + 1;
@@ -2076,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[
'open', 'opening', 'open', 'opening',
'close', 'closing', 'close', 'closing',
'select', 'selecting', 'select', 'selecting',
'unselect', 'unselecting' 'unselect', 'unselecting',
'clear', 'clearing'
]; ];
var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; var preventableEvents = [
'opening', 'closing', 'selecting', 'unselecting', 'clearing'
];
decorated.call(this, container, $container); decorated.call(this, container, $container);
@@ -2412,6 +2556,7 @@ S2.define('select2/diacritics',[
'\u019F': 'O', '\u019F': 'O',
'\uA74A': 'O', '\uA74A': 'O',
'\uA74C': 'O', '\uA74C': 'O',
'\u0152': 'OE',
'\u01A2': 'OI', '\u01A2': 'OI',
'\uA74E': 'OO', '\uA74E': 'OO',
'\u0222': 'OU', '\u0222': 'OU',
@@ -2821,6 +2966,7 @@ S2.define('select2/diacritics',[
'\uA74B': 'o', '\uA74B': 'o',
'\uA74D': 'o', '\uA74D': 'o',
'\u0275': 'o', '\u0275': 'o',
'\u0153': 'oe',
'\u01A3': 'oi', '\u01A3': 'oi',
'\u0223': 'ou', '\u0223': 'ou',
'\uA74F': 'oo', '\uA74F': 'oo',
@@ -2989,8 +3135,9 @@ S2.define('select2/diacritics',[
'\u03CD': '\u03C5', '\u03CD': '\u03C5',
'\u03CB': '\u03C5', '\u03CB': '\u03C5',
'\u03B0': '\u03C5', '\u03B0': '\u03C5',
'\u03C9': '\u03C9', '\u03CE': '\u03C9',
'\u03C2': '\u03C3' '\u03C2': '\u03C3',
'\u2019': '\''
}; };
return diacritics; return diacritics;
@@ -3075,7 +3222,7 @@ S2.define('select2/data/select',[
if ($(data.element).is('option')) { if ($(data.element).is('option')) {
data.element.selected = true; data.element.selected = true;
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
return; return;
} }
@@ -3096,13 +3243,13 @@ S2.define('select2/data/select',[
} }
self.$element.val(val); self.$element.val(val);
self.$element.trigger('change'); self.$element.trigger('input').trigger('change');
}); });
} else { } else {
var val = data.id; var val = data.id;
this.$element.val(val); this.$element.val(val);
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
} }
}; };
@@ -3118,7 +3265,7 @@ S2.define('select2/data/select',[
if ($(data.element).is('option')) { if ($(data.element).is('option')) {
data.element.selected = false; data.element.selected = false;
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
return; return;
} }
@@ -3136,7 +3283,7 @@ S2.define('select2/data/select',[
self.$element.val(val); self.$element.val(val);
self.$element.trigger('change'); self.$element.trigger('input').trigger('change');
}); });
}; };
@@ -3158,7 +3305,7 @@ S2.define('select2/data/select',[
// Remove anything added to child elements // Remove anything added to child elements
this.$element.find('*').each(function () { this.$element.find('*').each(function () {
// Remove any custom data set by Select2 // Remove any custom data set by Select2
$.removeData(this, 'data'); Utils.RemoveData(this);
}); });
}; };
@@ -3231,7 +3378,7 @@ S2.define('select2/data/select',[
normalizedData.element = option; normalizedData.element = option;
// Override the option's data with the combined data // Override the option's data with the combined data
$.data(option, 'data', normalizedData); Utils.StoreData(option, 'data', normalizedData);
return $option; return $option;
}; };
@@ -3239,7 +3386,7 @@ S2.define('select2/data/select',[
SelectAdapter.prototype.item = function ($option) { SelectAdapter.prototype.item = function ($option) {
var data = {}; var data = {};
data = $.data($option[0], 'data'); data = Utils.GetData($option[0], 'data');
if (data != null) { if (data != null) {
return data; return data;
@@ -3277,13 +3424,13 @@ S2.define('select2/data/select',[
data = this._normalizeItem(data); data = this._normalizeItem(data);
data.element = $option[0]; data.element = $option[0];
$.data($option[0], 'data', data); Utils.StoreData($option[0], 'data', data);
return data; return data;
}; };
SelectAdapter.prototype._normalizeItem = function (item) { SelectAdapter.prototype._normalizeItem = function (item) {
if (!$.isPlainObject(item)) { if (item !== Object(item)) {
item = { item = {
id: item, id: item,
text: item text: item
@@ -3329,15 +3476,19 @@ S2.define('select2/data/array',[
'jquery' 'jquery'
], function (SelectAdapter, Utils, $) { ], function (SelectAdapter, Utils, $) {
function ArrayAdapter ($element, options) { function ArrayAdapter ($element, options) {
var data = options.get('data') || []; this._dataToConvert = options.get('data') || [];
ArrayAdapter.__super__.constructor.call(this, $element, options); ArrayAdapter.__super__.constructor.call(this, $element, options);
this.addOptions(this.convertToOptions(data));
} }
Utils.Extend(ArrayAdapter, SelectAdapter); Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.bind = function (container, $container) {
ArrayAdapter.__super__.bind.call(this, container, $container);
this.addOptions(this.convertToOptions(this._dataToConvert));
};
ArrayAdapter.prototype.select = function (data) { ArrayAdapter.prototype.select = function (data) {
var $option = this.$element.find('option').filter(function (i, elm) { var $option = this.$element.find('option').filter(function (i, elm) {
return elm.value == data.id.toString(); return elm.value == data.id.toString();
@@ -3487,7 +3638,8 @@ S2.define('select2/data/ajax',[
}, function () { }, function () {
// Attempt to detect if a request was aborted // Attempt to detect if a request was aborted
// Only works if the transport exposes a status property // Only works if the transport exposes a status property
if ($request.status && $request.status === '0') { if ('status' in $request &&
($request.status === 0 || $request.status === '0')) {
return; return;
} }
@@ -3626,8 +3778,6 @@ S2.define('select2/data/tags',[
}; };
Tags.prototype._removeOldTags = function (_) { Tags.prototype._removeOldTags = function (_) {
var tag = this._lastTag;
var $options = this.$element.find('option[data-select2-tag]'); var $options = this.$element.find('option[data-select2-tag]');
$options.each(function () { $options.each(function () {
@@ -3702,7 +3852,7 @@ S2.define('select2/data/tokenizer',[
// Replace the search term if we have the search box // Replace the search term if we have the search box
if (this.$search.length) { if (this.$search.length) {
this.$search.val(tokenData.term); this.$search.val(tokenData.term);
this.$search.focus(); this.$search.trigger('focus');
} }
params.term = tokenData.term; params.term = tokenData.term;
@@ -3831,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[
decorated.call(this, $e, options); decorated.call(this, $e, options);
} }
MaximumSelectionLength.prototype.bind =
function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
container.on('select', function () {
self._checkIfMaximumSelected();
});
};
MaximumSelectionLength.prototype.query = MaximumSelectionLength.prototype.query =
function (decorated, params, callback) { function (decorated, params, callback) {
var self = this; var self = this;
this._checkIfMaximumSelected(function () {
decorated.call(self, params, callback);
});
};
MaximumSelectionLength.prototype._checkIfMaximumSelected =
function (_, successCallback) {
var self = this;
this.current(function (currentData) { this.current(function (currentData) {
var count = currentData != null ? currentData.length : 0; var count = currentData != null ? currentData.length : 0;
if (self.maximumSelectionLength > 0 && if (self.maximumSelectionLength > 0 &&
@@ -3847,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[
}); });
return; return;
} }
decorated.call(self, params, callback);
if (successCallback) {
successCallback();
}
}); });
}; };
@@ -3886,7 +4059,7 @@ S2.define('select2/dropdown',[
}; };
Dropdown.prototype.position = function ($dropdown, $container) { Dropdown.prototype.position = function ($dropdown, $container) {
// Should be implmented in subclasses // Should be implemented in subclasses
}; };
Dropdown.prototype.destroy = function () { Dropdown.prototype.destroy = function () {
@@ -3910,7 +4083,7 @@ S2.define('select2/dropdown/search',[
'<span class="select2-search select2-search--dropdown">' + '<span class="select2-search select2-search--dropdown">' +
'<input class="select2-search__field" type="search" tabindex="-1"' + '<input class="select2-search__field" type="search" tabindex="-1"' +
' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
' spellcheck="false" role="textbox" />' + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
'</span>' '</span>'
); );
@@ -3925,6 +4098,8 @@ S2.define('select2/dropdown/search',[
Search.prototype.bind = function (decorated, container, $container) { Search.prototype.bind = function (decorated, container, $container) {
var self = this; var self = this;
var resultsId = container.id + '-results';
decorated.call(this, container, $container); decorated.call(this, container, $container);
this.$search.on('keydown', function (evt) { this.$search.on('keydown', function (evt) {
@@ -3947,23 +4122,27 @@ S2.define('select2/dropdown/search',[
container.on('open', function () { container.on('open', function () {
self.$search.attr('tabindex', 0); self.$search.attr('tabindex', 0);
self.$search.attr('aria-controls', resultsId);
self.$search.focus(); self.$search.trigger('focus');
window.setTimeout(function () { window.setTimeout(function () {
self.$search.focus(); self.$search.trigger('focus');
}, 0); }, 0);
}); });
container.on('close', function () { container.on('close', function () {
self.$search.attr('tabindex', -1); self.$search.attr('tabindex', -1);
self.$search.removeAttr('aria-controls');
self.$search.removeAttr('aria-activedescendant');
self.$search.val(''); self.$search.val('');
self.$search.trigger('blur');
}); });
container.on('focus', function () { container.on('focus', function () {
if (!container.isOpen()) { if (!container.isOpen()) {
self.$search.focus(); self.$search.trigger('focus');
} }
}); });
@@ -3978,6 +4157,14 @@ S2.define('select2/dropdown/search',[
} }
} }
}); });
container.on('results:focus', function (params) {
if (params.data._resultId) {
self.$search.attr('aria-activedescendant', params.data._resultId);
} else {
self.$search.removeAttr('aria-activedescendant');
}
});
}; };
Search.prototype.handleSearch = function (evt) { Search.prototype.handleSearch = function (evt) {
@@ -4062,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[
if (this.showLoadingMore(data)) { if (this.showLoadingMore(data)) {
this.$results.append(this.$loadingMore); this.$results.append(this.$loadingMore);
this.loadMoreIfNeeded();
} }
}; };
@@ -4080,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[
self.loading = true; self.loading = true;
}); });
this.$results.on('scroll', function () { this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));
var isLoadMoreVisible = $.contains( };
document.documentElement,
self.$loadingMore[0]
);
if (self.loading || !isLoadMoreVisible) { InfiniteScroll.prototype.loadMoreIfNeeded = function () {
return; var isLoadMoreVisible = $.contains(
} document.documentElement,
this.$loadingMore[0]
);
var currentOffset = self.$results.offset().top + if (this.loading || !isLoadMoreVisible) {
self.$results.outerHeight(false); return;
var loadingMoreOffset = self.$loadingMore.offset().top + }
self.$loadingMore.outerHeight(false);
if (currentOffset + 50 >= loadingMoreOffset) { var currentOffset = this.$results.offset().top +
self.loadMore(); this.$results.outerHeight(false);
} var loadingMoreOffset = this.$loadingMore.offset().top +
}); this.$loadingMore.outerHeight(false);
if (currentOffset + 50 >= loadingMoreOffset) {
this.loadMore();
}
}; };
InfiniteScroll.prototype.loadMore = function () { InfiniteScroll.prototype.loadMore = function () {
@@ -4119,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[
var $option = $( var $option = $(
'<li ' + '<li ' +
'class="select2-results__option select2-results__option--load-more"' + 'class="select2-results__option select2-results__option--load-more"' +
'role="treeitem" aria-disabled="true"></li>' 'role="option" aria-disabled="true"></li>'
); );
var message = this.options.get('translations').get('loadingMore'); var message = this.options.get('translations').get('loadingMore');
@@ -4137,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[
'../utils' '../utils'
], function ($, Utils) { ], function ($, Utils) {
function AttachBody (decorated, $element, options) { function AttachBody (decorated, $element, options) {
this.$dropdownParent = options.get('dropdownParent') || $(document.body); this.$dropdownParent = $(options.get('dropdownParent') || document.body);
decorated.call(this, $element, options); decorated.call(this, $element, options);
} }
@@ -4145,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[
AttachBody.prototype.bind = function (decorated, container, $container) { AttachBody.prototype.bind = function (decorated, container, $container) {
var self = this; var self = this;
var setupResultsEvents = false;
decorated.call(this, container, $container); decorated.call(this, container, $container);
container.on('open', function () { container.on('open', function () {
self._showDropdown(); self._showDropdown();
self._attachPositioningHandler(container); self._attachPositioningHandler(container);
if (!setupResultsEvents) { // Must bind after the results handlers to ensure correct sizing
setupResultsEvents = true; self._bindContainerResultHandlers(container);
container.on('results:all', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:append', function () {
self._positionDropdown();
self._resizeDropdown();
});
}
}); });
container.on('close', function () { container.on('close', function () {
@@ -4214,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[
this.$dropdownContainer.detach(); this.$dropdownContainer.detach();
}; };
AttachBody.prototype._bindContainerResultHandlers =
function (decorated, container) {
// These should only be bound once
if (this._containerResultsHandlersBound) {
return;
}
var self = this;
container.on('results:all', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:append', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:message', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('select', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('unselect', function () {
self._positionDropdown();
self._resizeDropdown();
});
this._containerResultsHandlersBound = true;
};
AttachBody.prototype._attachPositioningHandler = AttachBody.prototype._attachPositioningHandler =
function (decorated, container) { function (decorated, container) {
var self = this; var self = this;
@@ -4224,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[
var $watchers = this.$container.parents().filter(Utils.hasScroll); var $watchers = this.$container.parents().filter(Utils.hasScroll);
$watchers.each(function () { $watchers.each(function () {
$(this).data('select2-scroll-position', { Utils.StoreData(this, 'select2-scroll-position', {
x: $(this).scrollLeft(), x: $(this).scrollLeft(),
y: $(this).scrollTop() y: $(this).scrollTop()
}); });
}); });
$watchers.on(scrollEvent, function (ev) { $watchers.on(scrollEvent, function (ev) {
var position = $(this).data('select2-scroll-position'); var position = Utils.GetData(this, 'select2-scroll-position');
$(this).scrollTop(position.y); $(this).scrollTop(position.y);
}); });
@@ -4290,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[
top: container.bottom top: container.bottom
}; };
// Determine what the parent element is to use for calciulating the offset // Determine what the parent element is to use for calculating the offset
var $offsetParent = this.$dropdownParent; var $offsetParent = this.$dropdownParent;
// For statically positoned elements, we need to get the element // For statically positioned elements, we need to get the element
// that is determining the offset // that is determining the offset
if ($offsetParent.css('position') === 'static') { if ($offsetParent.css('position') === 'static') {
$offsetParent = $offsetParent.offsetParent(); $offsetParent = $offsetParent.offsetParent();
} }
var parentOffset = $offsetParent.offset(); var parentOffset = {
top: 0,
left: 0
};
if (
$.contains(document.body, $offsetParent[0]) ||
$offsetParent[0].isConnected
) {
parentOffset = $offsetParent.offset();
}
css.top -= parentOffset.top; css.top -= parentOffset.top;
css.left -= parentOffset.left; css.left -= parentOffset.left;
@@ -4396,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[
}); });
S2.define('select2/dropdown/selectOnClose',[ S2.define('select2/dropdown/selectOnClose',[
'../utils'
], function () { ], function (Utils) {
function SelectOnClose () { } function SelectOnClose () { }
SelectOnClose.prototype.bind = function (decorated, container, $container) { SelectOnClose.prototype.bind = function (decorated, container, $container) {
@@ -4428,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[
return; return;
} }
var data = $highlightedResults.data('data'); var data = Utils.GetData($highlightedResults[0], 'data');
// Don't re-select already selected resulte // Don't re-select already selected resulte
if ( if (
@@ -4469,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[
var originalEvent = evt.originalEvent; var originalEvent = evt.originalEvent;
// Don't close if the control key is being held // Don't close if the control key is being held
if (originalEvent && originalEvent.ctrlKey) { if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
return; return;
} }
@@ -4523,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () {
}, },
searching: function () { searching: function () {
return 'Searching…'; return 'Searching…';
},
removeAllItems: function () {
return 'Remove all items';
} }
}; };
}); });
@@ -4761,66 +4989,29 @@ S2.define('select2/defaults',[
); );
} }
if (typeof options.language === 'string') { // If the defaults were not previously applied from an element, it is
// Check if the language is specified with a region // possible for the language option to have not been resolved
if (options.language.indexOf('-') > 0) { options.language = this._resolveLanguage(options.language);
// Extract the region information if it is included
var languageParts = options.language.split('-');
var baseLanguage = languageParts[0];
options.language = [options.language, baseLanguage]; // Always fall back to English since it will always be complete
} else { options.language.push('en');
options.language = [options.language];
var uniqueLanguages = [];
for (var l = 0; l < options.language.length; l++) {
var language = options.language[l];
if (uniqueLanguages.indexOf(language) === -1) {
uniqueLanguages.push(language);
} }
} }
if ($.isArray(options.language)) { options.language = uniqueLanguages;
var languages = new Translation();
options.language.push('en');
var languageNames = options.language; options.translations = this._processTranslations(
options.language,
for (var l = 0; l < languageNames.length; l++) { options.debug
var name = languageNames[l]; );
var language = {};
try {
// Try to load it with the original name
language = Translation.loadPath(name);
} catch (e) {
try {
// If we couldn't load it, check if it wasn't the full path
name = this.defaults.amdLanguageBase + name;
language = Translation.loadPath(name);
} catch (ex) {
// The translation could not be loaded at all. Sometimes this is
// because of a configuration problem, other times this can be
// because of how Select2 helps load all possible translation files.
if (options.debug && window.console && console.warn) {
console.warn(
'Select2: The language file for "' + name + '" could not be ' +
'automatically loaded. A fallback will be used instead.'
);
}
continue;
}
}
languages.extend(language);
}
options.translations = languages;
} else {
var baseTranslation = Translation.loadPath(
this.defaults.amdLanguageBase + 'en'
);
var customTranslation = new Translation(options.language);
customTranslation.extend(baseTranslation);
options.translations = customTranslation;
}
return options; return options;
}; };
@@ -4887,13 +5078,14 @@ S2.define('select2/defaults',[
debug: false, debug: false,
dropdownAutoWidth: false, dropdownAutoWidth: false,
escapeMarkup: Utils.escapeMarkup, escapeMarkup: Utils.escapeMarkup,
language: EnglishTranslation, language: {},
matcher: matcher, matcher: matcher,
minimumInputLength: 0, minimumInputLength: 0,
maximumInputLength: 0, maximumInputLength: 0,
maximumSelectionLength: 0, maximumSelectionLength: 0,
minimumResultsForSearch: 0, minimumResultsForSearch: 0,
selectOnClose: false, selectOnClose: false,
scrollAfterSelect: false,
sorter: function (data) { sorter: function (data) {
return data; return data;
}, },
@@ -4908,6 +5100,103 @@ S2.define('select2/defaults',[
}; };
}; };
Defaults.prototype.applyFromElement = function (options, $element) {
var optionLanguage = options.language;
var defaultLanguage = this.defaults.language;
var elementLanguage = $element.prop('lang');
var parentLanguage = $element.closest('[lang]').prop('lang');
var languages = Array.prototype.concat.call(
this._resolveLanguage(elementLanguage),
this._resolveLanguage(optionLanguage),
this._resolveLanguage(defaultLanguage),
this._resolveLanguage(parentLanguage)
);
options.language = languages;
return options;
};
Defaults.prototype._resolveLanguage = function (language) {
if (!language) {
return [];
}
if ($.isEmptyObject(language)) {
return [];
}
if ($.isPlainObject(language)) {
return [language];
}
var languages;
if (!$.isArray(language)) {
languages = [language];
} else {
languages = language;
}
var resolvedLanguages = [];
for (var l = 0; l < languages.length; l++) {
resolvedLanguages.push(languages[l]);
if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
// Extract the region information if it is included
var languageParts = languages[l].split('-');
var baseLanguage = languageParts[0];
resolvedLanguages.push(baseLanguage);
}
}
return resolvedLanguages;
};
Defaults.prototype._processTranslations = function (languages, debug) {
var translations = new Translation();
for (var l = 0; l < languages.length; l++) {
var languageData = new Translation();
var language = languages[l];
if (typeof language === 'string') {
try {
// Try to load it with the original name
languageData = Translation.loadPath(language);
} catch (e) {
try {
// If we couldn't load it, check if it wasn't the full path
language = this.defaults.amdLanguageBase + language;
languageData = Translation.loadPath(language);
} catch (ex) {
// The translation could not be loaded at all. Sometimes this is
// because of a configuration problem, other times this can be
// because of how Select2 helps load all possible translation files
if (debug && window.console && console.warn) {
console.warn(
'Select2: The language file for "' + language + '" could ' +
'not be automatically loaded. A fallback will be used instead.'
);
}
}
}
} else if ($.isPlainObject(language)) {
languageData = new Translation(language);
} else {
languageData = language;
}
translations.extend(languageData);
}
return translations;
};
Defaults.prototype.set = function (key, value) { Defaults.prototype.set = function (key, value) {
var camelKey = $.camelCase(key); var camelKey = $.camelCase(key);
@@ -4916,7 +5205,7 @@ S2.define('select2/defaults',[
var convertedData = Utils._convertData(data); var convertedData = Utils._convertData(data);
$.extend(this.defaults, convertedData); $.extend(true, this.defaults, convertedData);
}; };
var defaults = new Defaults(); var defaults = new Defaults();
@@ -4937,6 +5226,10 @@ S2.define('select2/options',[
this.fromElement($element); this.fromElement($element);
} }
if ($element != null) {
this.options = Defaults.applyFromElement(this.options, $element);
}
this.options = Defaults.apply(this.options); this.options = Defaults.apply(this.options);
if ($element && $element.is('input')) { if ($element && $element.is('input')) {
@@ -4960,14 +5253,6 @@ S2.define('select2/options',[
this.options.disabled = $e.prop('disabled'); this.options.disabled = $e.prop('disabled');
} }
if (this.options.language == null) {
if ($e.prop('lang')) {
this.options.language = $e.prop('lang').toLowerCase();
} else if ($e.closest('[lang]').prop('lang')) {
this.options.language = $e.closest('[lang]').prop('lang');
}
}
if (this.options.dir == null) { if (this.options.dir == null) {
if ($e.prop('dir')) { if ($e.prop('dir')) {
this.options.dir = $e.prop('dir'); this.options.dir = $e.prop('dir');
@@ -4981,7 +5266,7 @@ S2.define('select2/options',[
$e.prop('disabled', this.options.disabled); $e.prop('disabled', this.options.disabled);
$e.prop('multiple', this.options.multiple); $e.prop('multiple', this.options.multiple);
if ($e.data('select2Tags')) { if (Utils.GetData($e[0], 'select2Tags')) {
if (this.options.debug && window.console && console.warn) { if (this.options.debug && window.console && console.warn) {
console.warn( console.warn(
'Select2: The `data-select2-tags` attribute has been changed to ' + 'Select2: The `data-select2-tags` attribute has been changed to ' +
@@ -4990,11 +5275,11 @@ S2.define('select2/options',[
); );
} }
$e.data('data', $e.data('select2Tags')); Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
$e.data('tags', true); Utils.StoreData($e[0], 'tags', true);
} }
if ($e.data('ajaxUrl')) { if (Utils.GetData($e[0], 'ajaxUrl')) {
if (this.options.debug && window.console && console.warn) { if (this.options.debug && window.console && console.warn) {
console.warn( console.warn(
'Select2: The `data-ajax-url` attribute has been changed to ' + 'Select2: The `data-ajax-url` attribute has been changed to ' +
@@ -5003,21 +5288,45 @@ S2.define('select2/options',[
); );
} }
$e.attr('ajax--url', $e.data('ajaxUrl')); $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
$e.data('ajax--url', $e.data('ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
} }
var dataset = {}; var dataset = {};
function upperCaseLetter(_, letter) {
return letter.toUpperCase();
}
// Pre-load all of the attributes which are prefixed with `data-`
for (var attr = 0; attr < $e[0].attributes.length; attr++) {
var attributeName = $e[0].attributes[attr].name;
var prefix = 'data-';
if (attributeName.substr(0, prefix.length) == prefix) {
// Get the contents of the attribute after `data-`
var dataName = attributeName.substring(prefix.length);
// Get the data contents from the consistent source
// This is more than likely the jQuery data helper
var dataValue = Utils.GetData($e[0], dataName);
// camelCase the attribute name to match the spec
var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
// Store the data attribute contents into the dataset since
dataset[camelDataName] = dataValue;
}
}
// Prefer the element's `dataset` attribute if it exists // Prefer the element's `dataset` attribute if it exists
// jQuery 1.x does not correctly handle data attributes with multiple dashes // jQuery 1.x does not correctly handle data attributes with multiple dashes
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
dataset = $.extend(true, {}, $e[0].dataset, $e.data()); dataset = $.extend(true, {}, $e[0].dataset, dataset);
} else {
dataset = $e.data();
} }
var data = $.extend(true, {}, dataset); // Prefer our internal data cache if it exists
var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
data = Utils._convertData(data); data = Utils._convertData(data);
@@ -5054,8 +5363,8 @@ S2.define('select2/core',[
'./keys' './keys'
], function ($, Options, Utils, KEYS) { ], function ($, Options, Utils, KEYS) {
var Select2 = function ($element, options) { var Select2 = function ($element, options) {
if ($element.data('select2') != null) { if (Utils.GetData($element[0], 'select2') != null) {
$element.data('select2').destroy(); Utils.GetData($element[0], 'select2').destroy();
} }
this.$element = $element; this.$element = $element;
@@ -5071,7 +5380,7 @@ S2.define('select2/core',[
// Set up the tabindex // Set up the tabindex
var tabindex = $element.attr('tabindex') || 0; var tabindex = $element.attr('tabindex') || 0;
$element.data('old-tabindex', tabindex); Utils.StoreData($element[0], 'old-tabindex', tabindex);
$element.attr('tabindex', '-1'); $element.attr('tabindex', '-1');
// Set up containers and adapters // Set up containers and adapters
@@ -5132,6 +5441,9 @@ S2.define('select2/core',[
// Synchronize any monitored attributes // Synchronize any monitored attributes
this._syncAttributes(); this._syncAttributes();
Utils.StoreData($element[0], 'select2', this);
// Ensure backwards compatibility with $element.data('select2').
$element.data('select2', this); $element.data('select2', this);
}; };
@@ -5208,6 +5520,12 @@ S2.define('select2/core',[
return null; return null;
} }
if (method == 'computedstyle') {
var computedStyle = window.getComputedStyle($element[0]);
return computedStyle.width;
}
return method; return method;
}; };
@@ -5248,8 +5566,8 @@ S2.define('select2/core',[
if (observer != null) { if (observer != null) {
this._observer = new observer(function (mutations) { this._observer = new observer(function (mutations) {
$.each(mutations, self._syncA); self._syncA();
$.each(mutations, self._syncS); self._syncS(null, mutations);
}); });
this._observer.observe(this.$element[0], { this._observer.observe(this.$element[0], {
attributes: true, attributes: true,
@@ -5371,7 +5689,7 @@ S2.define('select2/core',[
if (self.isOpen()) { if (self.isOpen()) {
if (key === KEYS.ESC || key === KEYS.TAB || if (key === KEYS.ESC || key === KEYS.TAB ||
(key === KEYS.UP && evt.altKey)) { (key === KEYS.UP && evt.altKey)) {
self.close(); self.close(evt);
evt.preventDefault(); evt.preventDefault();
} else if (key === KEYS.ENTER) { } else if (key === KEYS.ENTER) {
@@ -5405,7 +5723,7 @@ S2.define('select2/core',[
Select2.prototype._syncAttributes = function () { Select2.prototype._syncAttributes = function () {
this.options.set('disabled', this.$element.prop('disabled')); this.options.set('disabled', this.$element.prop('disabled'));
if (this.options.get('disabled')) { if (this.isDisabled()) {
if (this.isOpen()) { if (this.isOpen()) {
this.close(); this.close();
} }
@@ -5416,7 +5734,7 @@ S2.define('select2/core',[
} }
}; };
Select2.prototype._syncSubtree = function (evt, mutations) { Select2.prototype._isChangeMutation = function (evt, mutations) {
var changed = false; var changed = false;
var self = this; var self = this;
@@ -5444,7 +5762,22 @@ S2.define('select2/core',[
} }
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) { } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
changed = true; changed = true;
} else if ($.isArray(mutations)) {
$.each(mutations, function(evt, mutation) {
if (self._isChangeMutation(evt, mutation)) {
// We've found a change mutation.
// Let's escape from the loop and continue
changed = true;
return false;
}
});
} }
return changed;
};
Select2.prototype._syncSubtree = function (evt, mutations) {
var changed = this._isChangeMutation(evt, mutations);
var self = this;
// Only re-pull the data if we think there is a change // Only re-pull the data if we think there is a change
if (changed) { if (changed) {
@@ -5466,7 +5799,8 @@ S2.define('select2/core',[
'open': 'opening', 'open': 'opening',
'close': 'closing', 'close': 'closing',
'select': 'selecting', 'select': 'selecting',
'unselect': 'unselecting' 'unselect': 'unselecting',
'clear': 'clearing'
}; };
if (args === undefined) { if (args === undefined) {
@@ -5494,7 +5828,7 @@ S2.define('select2/core',[
}; };
Select2.prototype.toggleDropdown = function () { Select2.prototype.toggleDropdown = function () {
if (this.options.get('disabled')) { if (this.isDisabled()) {
return; return;
} }
@@ -5510,15 +5844,40 @@ S2.define('select2/core',[
return; return;
} }
if (this.isDisabled()) {
return;
}
this.trigger('query', {}); this.trigger('query', {});
}; };
Select2.prototype.close = function () { Select2.prototype.close = function (evt) {
if (!this.isOpen()) { if (!this.isOpen()) {
return; return;
} }
this.trigger('close', {}); this.trigger('close', { originalEvent : evt });
};
/**
* Helper method to abstract the "enabled" (not "disabled") state of this
* object.
*
* @return {true} if the instance is not disabled.
* @return {false} if the instance is disabled.
*/
Select2.prototype.isEnabled = function () {
return !this.isDisabled();
};
/**
* Helper method to abstract the "disabled" state of this object.
*
* @return {true} if the disabled option is true.
* @return {false} if the disabled option is false.
*/
Select2.prototype.isDisabled = function () {
return this.options.get('disabled');
}; };
Select2.prototype.isOpen = function () { Select2.prototype.isOpen = function () {
@@ -5595,7 +5954,7 @@ S2.define('select2/core',[
}); });
} }
this.$element.val(newVal).trigger('change'); this.$element.val(newVal).trigger('input').trigger('change');
}; };
Select2.prototype.destroy = function () { Select2.prototype.destroy = function () {
@@ -5621,10 +5980,12 @@ S2.define('select2/core',[
this._syncS = null; this._syncS = null;
this.$element.off('.select2'); this.$element.off('.select2');
this.$element.attr('tabindex', this.$element.data('old-tabindex')); this.$element.attr('tabindex',
Utils.GetData(this.$element[0], 'old-tabindex'));
this.$element.removeClass('select2-hidden-accessible'); this.$element.removeClass('select2-hidden-accessible');
this.$element.attr('aria-hidden', 'false'); this.$element.attr('aria-hidden', 'false');
Utils.RemoveData(this.$element[0]);
this.$element.removeData('select2'); this.$element.removeData('select2');
this.dataAdapter.destroy(); this.dataAdapter.destroy();
@@ -5652,7 +6013,7 @@ S2.define('select2/core',[
this.$container.addClass('select2-container--' + this.options.get('theme')); this.$container.addClass('select2-container--' + this.options.get('theme'));
$container.data('element', this.$element); Utils.StoreData($container[0], 'element', this.$element);
return $container; return $container;
}; };
@@ -5862,8 +6223,9 @@ S2.define('select2/compat/initSelection',[
}); });
S2.define('select2/compat/inputData',[ S2.define('select2/compat/inputData',[
'jquery' 'jquery',
], function ($) { '../utils'
], function ($, Utils) {
function InputData (decorated, $element, options) { function InputData (decorated, $element, options) {
this._currentData = []; this._currentData = [];
this._valueSeparator = options.get('valueSeparator') || ','; this._valueSeparator = options.get('valueSeparator') || ',';
@@ -5927,13 +6289,13 @@ S2.define('select2/compat/inputData',[
}); });
this.$element.val(data.id); this.$element.val(data.id);
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
} else { } else {
var value = this.$element.val(); var value = this.$element.val();
value += this._valueSeparator + data.id; value += this._valueSeparator + data.id;
this.$element.val(value); this.$element.val(value);
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
} }
}; };
@@ -5956,7 +6318,7 @@ S2.define('select2/compat/inputData',[
} }
self.$element.val(values.join(self._valueSeparator)); self.$element.val(values.join(self._valueSeparator));
self.$element.trigger('change'); self.$element.trigger('input').trigger('change');
}); });
}; };
@@ -5980,7 +6342,7 @@ S2.define('select2/compat/inputData',[
InputData.prototype.addOptions = function (_, $options) { InputData.prototype.addOptions = function (_, $options) {
var options = $.map($options, function ($option) { var options = $.map($options, function ($option) {
return $.data($option[0], 'data'); return Utils.GetData($option[0], 'data');
}); });
this._currentData.push.apply(this._currentData, options); this._currentData.push.apply(this._currentData, options);
@@ -6383,8 +6745,9 @@ S2.define('jquery.select2',[
'jquery-mousewheel', 'jquery-mousewheel',
'./select2/core', './select2/core',
'./select2/defaults' './select2/defaults',
], function ($, _, Select2, Defaults) { './select2/utils'
], function ($, _, Select2, Defaults, Utils) {
if ($.fn.select2 == null) { if ($.fn.select2 == null) {
// All methods that should return the element // All methods that should return the element
var thisMethods = ['open', 'close', 'destroy']; var thisMethods = ['open', 'close', 'destroy'];
@@ -6405,7 +6768,7 @@ S2.define('jquery.select2',[
var args = Array.prototype.slice.call(arguments, 1); var args = Array.prototype.slice.call(arguments, 1);
this.each(function () { this.each(function () {
var instance = $(this).data('select2'); var instance = Utils.GetData(this, 'select2');
if (instance == null && window.console && console.error) { if (instance == null && window.console && console.error) {
console.error( console.error(
+2 -1
View File
File diff suppressed because one or more lines are too long
+576 -214
View File
@@ -1,11 +1,11 @@
/*! /*!
* Select2 4.0.5 * Select2 4.0.13
* https://select2.github.io * https://select2.github.io
* *
* Released under the MIT license * Released under the MIT license
* https://github.com/select2/select2/blob/master/LICENSE.md * https://github.com/select2/select2/blob/master/LICENSE.md
*/ */
(function (factory) { ;(function (factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module. // AMD. Register as an anonymous module.
define(['jquery'], factory); define(['jquery'], factory);
@@ -574,10 +574,10 @@ S2.define('select2/utils',[
DecoratedClass.prototype = new ctr(); DecoratedClass.prototype = new ctr();
for (var m = 0; m < superMethods.length; m++) { for (var m = 0; m < superMethods.length; m++) {
var superMethod = superMethods[m]; var superMethod = superMethods[m];
DecoratedClass.prototype[superMethod] = DecoratedClass.prototype[superMethod] =
SuperClass.prototype[superMethod]; SuperClass.prototype[superMethod];
} }
var calledMethod = function (methodName) { var calledMethod = function (methodName) {
@@ -772,6 +772,70 @@ S2.define('select2/utils',[
$element.append($nodes); $element.append($nodes);
}; };
// Cache objects in Utils.__cache instead of $.data (see #4346)
Utils.__cache = {};
var id = 0;
Utils.GetUniqueElementId = function (element) {
// Get a unique element Id. If element has no id,
// creates a new unique number, stores it in the id
// attribute and returns the new id.
// If an id already exists, it simply returns it.
var select2Id = element.getAttribute('data-select2-id');
if (select2Id == null) {
// If element has id, use it.
if (element.id) {
select2Id = element.id;
element.setAttribute('data-select2-id', select2Id);
} else {
element.setAttribute('data-select2-id', ++id);
select2Id = id.toString();
}
}
return select2Id;
};
Utils.StoreData = function (element, name, value) {
// Stores an item in the cache for a specified element.
// name is the cache key.
var id = Utils.GetUniqueElementId(element);
if (!Utils.__cache[id]) {
Utils.__cache[id] = {};
}
Utils.__cache[id][name] = value;
};
Utils.GetData = function (element, name) {
// Retrieves a value from the cache by its key (name)
// name is optional. If no name specified, return
// all cache items for the specified element.
// and for a specified element.
var id = Utils.GetUniqueElementId(element);
if (name) {
if (Utils.__cache[id]) {
if (Utils.__cache[id][name] != null) {
return Utils.__cache[id][name];
}
return $(element).data(name); // Fallback to HTML5 data attribs.
}
return $(element).data(name); // Fallback to HTML5 data attribs.
} else {
return Utils.__cache[id];
}
};
Utils.RemoveData = function (element) {
// Removes all cached items for a specified element.
var id = Utils.GetUniqueElementId(element);
if (Utils.__cache[id] != null) {
delete Utils.__cache[id];
}
element.removeAttribute('data-select2-id');
};
return Utils; return Utils;
}); });
@@ -791,7 +855,7 @@ S2.define('select2/results',[
Results.prototype.render = function () { Results.prototype.render = function () {
var $results = $( var $results = $(
'<ul class="select2-results__options" role="tree"></ul>' '<ul class="select2-results__options" role="listbox"></ul>'
); );
if (this.options.get('multiple')) { if (this.options.get('multiple')) {
@@ -814,7 +878,7 @@ S2.define('select2/results',[
this.hideLoading(); this.hideLoading();
var $message = $( var $message = $(
'<li role="treeitem" aria-live="assertive"' + '<li role="alert" aria-live="assertive"' +
' class="select2-results__option"></li>' ' class="select2-results__option"></li>'
); );
@@ -907,7 +971,7 @@ S2.define('select2/results',[
$options.each(function () { $options.each(function () {
var $option = $(this); var $option = $(this);
var item = $.data(this, 'data'); var item = Utils.GetData(this, 'data');
// id needs to be converted to a string when comparing // id needs to be converted to a string when comparing
var id = '' + item.id; var id = '' + item.id;
@@ -948,11 +1012,16 @@ S2.define('select2/results',[
option.className = 'select2-results__option'; option.className = 'select2-results__option';
var attrs = { var attrs = {
'role': 'treeitem', 'role': 'option',
'aria-selected': 'false' 'aria-selected': 'false'
}; };
if (data.disabled) { var matches = window.Element.prototype.matches ||
window.Element.prototype.msMatchesSelector ||
window.Element.prototype.webkitMatchesSelector;
if ((data.element != null && matches.call(data.element, ':disabled')) ||
(data.element == null && data.disabled)) {
delete attrs['aria-selected']; delete attrs['aria-selected'];
attrs['aria-disabled'] = 'true'; attrs['aria-disabled'] = 'true';
} }
@@ -1012,7 +1081,7 @@ S2.define('select2/results',[
this.template(data, option); this.template(data, option);
} }
$.data(option, 'data', data); Utils.StoreData(option, 'data', data);
return option; return option;
}; };
@@ -1053,7 +1122,10 @@ S2.define('select2/results',[
} }
self.setClasses(); self.setClasses();
self.highlightFirstItem();
if (self.options.get('scrollAfterSelect')) {
self.highlightFirstItem();
}
}); });
container.on('unselect', function () { container.on('unselect', function () {
@@ -1062,7 +1134,10 @@ S2.define('select2/results',[
} }
self.setClasses(); self.setClasses();
self.highlightFirstItem();
if (self.options.get('scrollAfterSelect')) {
self.highlightFirstItem();
}
}); });
container.on('open', function () { container.on('open', function () {
@@ -1098,7 +1173,7 @@ S2.define('select2/results',[
return; return;
} }
var data = $highlighted.data('data'); var data = Utils.GetData($highlighted[0], 'data');
if ($highlighted.attr('aria-selected') == 'true') { if ($highlighted.attr('aria-selected') == 'true') {
self.trigger('close', {}); self.trigger('close', {});
@@ -1116,8 +1191,9 @@ S2.define('select2/results',[
var currentIndex = $options.index($highlighted); var currentIndex = $options.index($highlighted);
// If we are already at te top, don't move further // If we are already at the top, don't move further
if (currentIndex === 0) { // If no options, currentIndex will be -1
if (currentIndex <= 0) {
return; return;
} }
@@ -1210,7 +1286,7 @@ S2.define('select2/results',[
function (evt) { function (evt) {
var $this = $(this); var $this = $(this);
var data = $this.data('data'); var data = Utils.GetData(this, 'data');
if ($this.attr('aria-selected') === 'true') { if ($this.attr('aria-selected') === 'true') {
if (self.options.get('multiple')) { if (self.options.get('multiple')) {
@@ -1233,7 +1309,7 @@ S2.define('select2/results',[
this.$results.on('mouseenter', '.select2-results__option[aria-selected]', this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
function (evt) { function (evt) {
var data = $(this).data('data'); var data = Utils.GetData(this, 'data');
self.getHighlightedResults() self.getHighlightedResults()
.removeClass('select2-results__option--highlighted'); .removeClass('select2-results__option--highlighted');
@@ -1348,14 +1424,15 @@ S2.define('select2/selection/base',[
this._tabindex = 0; this._tabindex = 0;
if (this.$element.data('old-tabindex') != null) { if (Utils.GetData(this.$element[0], 'old-tabindex') != null) {
this._tabindex = this.$element.data('old-tabindex'); this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex');
} else if (this.$element.attr('tabindex') != null) { } else if (this.$element.attr('tabindex') != null) {
this._tabindex = this.$element.attr('tabindex'); this._tabindex = this.$element.attr('tabindex');
} }
$selection.attr('title', this.$element.attr('title')); $selection.attr('title', this.$element.attr('title'));
$selection.attr('tabindex', this._tabindex); $selection.attr('tabindex', this._tabindex);
$selection.attr('aria-disabled', 'false');
this.$selection = $selection; this.$selection = $selection;
@@ -1365,7 +1442,6 @@ S2.define('select2/selection/base',[
BaseSelection.prototype.bind = function (container, $container) { BaseSelection.prototype.bind = function (container, $container) {
var self = this; var self = this;
var id = container.id + '-container';
var resultsId = container.id + '-results'; var resultsId = container.id + '-results';
this.container = container; this.container = container;
@@ -1408,17 +1484,19 @@ S2.define('select2/selection/base',[
self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-activedescendant');
self.$selection.removeAttr('aria-owns'); self.$selection.removeAttr('aria-owns');
self.$selection.focus(); self.$selection.trigger('focus');
self._detachCloseHandler(container); self._detachCloseHandler(container);
}); });
container.on('enable', function () { container.on('enable', function () {
self.$selection.attr('tabindex', self._tabindex); self.$selection.attr('tabindex', self._tabindex);
self.$selection.attr('aria-disabled', 'false');
}); });
container.on('disable', function () { container.on('disable', function () {
self.$selection.attr('tabindex', '-1'); self.$selection.attr('tabindex', '-1');
self.$selection.attr('aria-disabled', 'true');
}); });
}; };
@@ -1441,7 +1519,6 @@ S2.define('select2/selection/base',[
}; };
BaseSelection.prototype._attachCloseHandler = function (container) { BaseSelection.prototype._attachCloseHandler = function (container) {
var self = this;
$(document.body).on('mousedown.select2.' + container.id, function (e) { $(document.body).on('mousedown.select2.' + container.id, function (e) {
var $target = $(e.target); var $target = $(e.target);
@@ -1451,13 +1528,11 @@ S2.define('select2/selection/base',[
var $all = $('.select2.select2-container--open'); var $all = $('.select2.select2-container--open');
$all.each(function () { $all.each(function () {
var $this = $(this);
if (this == $select[0]) { if (this == $select[0]) {
return; return;
} }
var $element = $this.data('element'); var $element = Utils.GetData(this, 'element');
$element.select2('close'); $element.select2('close');
}); });
@@ -1481,6 +1556,27 @@ S2.define('select2/selection/base',[
throw new Error('The `update` method must be defined in child classes.'); throw new Error('The `update` method must be defined in child classes.');
}; };
/**
* Helper method to abstract the "enabled" (not "disabled") state of this
* object.
*
* @return {true} if the instance is not disabled.
* @return {false} if the instance is disabled.
*/
BaseSelection.prototype.isEnabled = function () {
return !this.isDisabled();
};
/**
* Helper method to abstract the "disabled" state of this object.
*
* @return {true} if the disabled option is true.
* @return {false} if the disabled option is false.
*/
BaseSelection.prototype.isDisabled = function () {
return this.options.get('disabled');
};
return BaseSelection; return BaseSelection;
}); });
@@ -1518,7 +1614,10 @@ S2.define('select2/selection/single',[
var id = container.id + '-container'; var id = container.id + '-container';
this.$selection.find('.select2-selection__rendered').attr('id', id); this.$selection.find('.select2-selection__rendered')
.attr('id', id)
.attr('role', 'textbox')
.attr('aria-readonly', 'true');
this.$selection.attr('aria-labelledby', id); this.$selection.attr('aria-labelledby', id);
this.$selection.on('mousedown', function (evt) { this.$selection.on('mousedown', function (evt) {
@@ -1542,17 +1641,15 @@ S2.define('select2/selection/single',[
container.on('focus', function (evt) { container.on('focus', function (evt) {
if (!container.isOpen()) { if (!container.isOpen()) {
self.$selection.focus(); self.$selection.trigger('focus');
} }
}); });
container.on('selection:update', function (params) {
self.update(params.data);
});
}; };
SingleSelection.prototype.clear = function () { SingleSelection.prototype.clear = function () {
this.$selection.find('.select2-selection__rendered').empty(); var $rendered = this.$selection.find('.select2-selection__rendered');
$rendered.empty();
$rendered.removeAttr('title'); // clear tooltip on empty
}; };
SingleSelection.prototype.display = function (data, container) { SingleSelection.prototype.display = function (data, container) {
@@ -1578,7 +1675,14 @@ S2.define('select2/selection/single',[
var formatted = this.display(selection, $rendered); var formatted = this.display(selection, $rendered);
$rendered.empty().append(formatted); $rendered.empty().append(formatted);
$rendered.prop('title', selection.title || selection.text);
var title = selection.title || selection.text;
if (title) {
$rendered.attr('title', title);
} else {
$rendered.removeAttr('title');
}
}; };
return SingleSelection; return SingleSelection;
@@ -1623,14 +1727,14 @@ S2.define('select2/selection/multiple',[
'.select2-selection__choice__remove', '.select2-selection__choice__remove',
function (evt) { function (evt) {
// Ignore the event if it is disabled // Ignore the event if it is disabled
if (self.options.get('disabled')) { if (self.isDisabled()) {
return; return;
} }
var $remove = $(this); var $remove = $(this);
var $selection = $remove.parent(); var $selection = $remove.parent();
var data = $selection.data('data'); var data = Utils.GetData($selection[0], 'data');
self.trigger('unselect', { self.trigger('unselect', {
originalEvent: evt, originalEvent: evt,
@@ -1641,7 +1745,9 @@ S2.define('select2/selection/multiple',[
}; };
MultipleSelection.prototype.clear = function () { MultipleSelection.prototype.clear = function () {
this.$selection.find('.select2-selection__rendered').empty(); var $rendered = this.$selection.find('.select2-selection__rendered');
$rendered.empty();
$rendered.removeAttr('title');
}; };
MultipleSelection.prototype.display = function (data, container) { MultipleSelection.prototype.display = function (data, container) {
@@ -1679,9 +1785,14 @@ S2.define('select2/selection/multiple',[
var formatted = this.display(selection, $selection); var formatted = this.display(selection, $selection);
$selection.append(formatted); $selection.append(formatted);
$selection.prop('title', selection.title || selection.text);
$selection.data('data', selection); var title = selection.title || selection.text;
if (title) {
$selection.attr('title', title);
}
Utils.StoreData($selection[0], 'data', selection);
$selections.push($selection); $selections.push($selection);
} }
@@ -1746,8 +1857,9 @@ S2.define('select2/selection/placeholder',[
S2.define('select2/selection/allowClear',[ S2.define('select2/selection/allowClear',[
'jquery', 'jquery',
'../keys' '../keys',
], function ($, KEYS) { '../utils'
], function ($, KEYS, Utils) {
function AllowClear () { } function AllowClear () { }
AllowClear.prototype.bind = function (decorated, container, $container) { AllowClear.prototype.bind = function (decorated, container, $container) {
@@ -1776,7 +1888,7 @@ S2.define('select2/selection/allowClear',[
AllowClear.prototype._handleClear = function (_, evt) { AllowClear.prototype._handleClear = function (_, evt) {
// Ignore the event if it is disabled // Ignore the event if it is disabled
if (this.options.get('disabled')) { if (this.isDisabled()) {
return; return;
} }
@@ -1789,10 +1901,22 @@ S2.define('select2/selection/allowClear',[
evt.stopPropagation(); evt.stopPropagation();
var data = $clear.data('data'); var data = Utils.GetData($clear[0], 'data');
var previousVal = this.$element.val();
this.$element.val(this.placeholder.id);
var unselectData = {
data: data
};
this.trigger('clear', unselectData);
if (unselectData.prevented) {
this.$element.val(previousVal);
return;
}
for (var d = 0; d < data.length; d++) { for (var d = 0; d < data.length; d++) {
var unselectData = { unselectData = {
data: data[d] data: data[d]
}; };
@@ -1802,11 +1926,12 @@ S2.define('select2/selection/allowClear',[
// If the event was prevented, don't clear it out. // If the event was prevented, don't clear it out.
if (unselectData.prevented) { if (unselectData.prevented) {
this.$element.val(previousVal);
return; return;
} }
} }
this.$element.val(this.placeholder.id).trigger('change'); this.$element.trigger('input').trigger('change');
this.trigger('toggle', {}); this.trigger('toggle', {});
}; };
@@ -1829,12 +1954,14 @@ S2.define('select2/selection/allowClear',[
return; return;
} }
var removeAll = this.options.get('translations').get('removeAllItems');
var $remove = $( var $remove = $(
'<span class="select2-selection__clear">' + '<span class="select2-selection__clear" title="' + removeAll() +'">' +
'&times;' + '&times;' +
'</span>' '</span>'
); );
$remove.data('data', data); Utils.StoreData($remove[0], 'data', data);
this.$selection.find('.select2-selection__rendered').prepend($remove); this.$selection.find('.select2-selection__rendered').prepend($remove);
}; };
@@ -1856,7 +1983,7 @@ S2.define('select2/selection/search',[
'<li class="select2-search select2-search--inline">' + '<li class="select2-search select2-search--inline">' +
'<input class="select2-search__field" type="search" tabindex="-1"' + '<input class="select2-search__field" type="search" tabindex="-1"' +
' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
' spellcheck="false" role="textbox" aria-autocomplete="list" />' + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
'</li>' '</li>'
); );
@@ -1873,14 +2000,18 @@ S2.define('select2/selection/search',[
Search.prototype.bind = function (decorated, container, $container) { Search.prototype.bind = function (decorated, container, $container) {
var self = this; var self = this;
var resultsId = container.id + '-results';
decorated.call(this, container, $container); decorated.call(this, container, $container);
container.on('open', function () { container.on('open', function () {
self.$search.attr('aria-controls', resultsId);
self.$search.trigger('focus'); self.$search.trigger('focus');
}); });
container.on('close', function () { container.on('close', function () {
self.$search.val(''); self.$search.val('');
self.$search.removeAttr('aria-controls');
self.$search.removeAttr('aria-activedescendant'); self.$search.removeAttr('aria-activedescendant');
self.$search.trigger('focus'); self.$search.trigger('focus');
}); });
@@ -1900,7 +2031,11 @@ S2.define('select2/selection/search',[
}); });
container.on('results:focus', function (params) { container.on('results:focus', function (params) {
self.$search.attr('aria-activedescendant', params.id); if (params.data._resultId) {
self.$search.attr('aria-activedescendant', params.data._resultId);
} else {
self.$search.removeAttr('aria-activedescendant');
}
}); });
this.$selection.on('focusin', '.select2-search--inline', function (evt) { this.$selection.on('focusin', '.select2-search--inline', function (evt) {
@@ -1925,7 +2060,7 @@ S2.define('select2/selection/search',[
.prev('.select2-selection__choice'); .prev('.select2-selection__choice');
if ($previousChoice.length > 0) { if ($previousChoice.length > 0) {
var item = $previousChoice.data('data'); var item = Utils.GetData($previousChoice[0], 'data');
self.searchRemoveChoice(item); self.searchRemoveChoice(item);
@@ -1934,6 +2069,12 @@ S2.define('select2/selection/search',[
} }
}); });
this.$selection.on('click', '.select2-search--inline', function (evt) {
if (self.$search.val()) {
evt.stopPropagation();
}
});
// Try to detect the IE version should the `documentMode` property that // Try to detect the IE version should the `documentMode` property that
// is stored on the document. This is only implemented in IE and is // is stored on the document. This is only implemented in IE and is
// slightly cleaner than doing a user agent check. // slightly cleaner than doing a user agent check.
@@ -2019,7 +2160,7 @@ S2.define('select2/selection/search',[
this.resizeSearch(); this.resizeSearch();
if (searchHadFocus) { if (searchHadFocus) {
this.$search.focus(); this.$search.trigger('focus');
} }
}; };
@@ -2052,7 +2193,7 @@ S2.define('select2/selection/search',[
var width = ''; var width = '';
if (this.$search.attr('placeholder') !== '') { if (this.$search.attr('placeholder') !== '') {
width = this.$selection.find('.select2-selection__rendered').innerWidth(); width = this.$selection.find('.select2-selection__rendered').width();
} else { } else {
var minimumWidth = this.$search.val().length + 1; var minimumWidth = this.$search.val().length + 1;
@@ -2076,10 +2217,13 @@ S2.define('select2/selection/eventRelay',[
'open', 'opening', 'open', 'opening',
'close', 'closing', 'close', 'closing',
'select', 'selecting', 'select', 'selecting',
'unselect', 'unselecting' 'unselect', 'unselecting',
'clear', 'clearing'
]; ];
var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; var preventableEvents = [
'opening', 'closing', 'selecting', 'unselecting', 'clearing'
];
decorated.call(this, container, $container); decorated.call(this, container, $container);
@@ -2412,6 +2556,7 @@ S2.define('select2/diacritics',[
'\u019F': 'O', '\u019F': 'O',
'\uA74A': 'O', '\uA74A': 'O',
'\uA74C': 'O', '\uA74C': 'O',
'\u0152': 'OE',
'\u01A2': 'OI', '\u01A2': 'OI',
'\uA74E': 'OO', '\uA74E': 'OO',
'\u0222': 'OU', '\u0222': 'OU',
@@ -2821,6 +2966,7 @@ S2.define('select2/diacritics',[
'\uA74B': 'o', '\uA74B': 'o',
'\uA74D': 'o', '\uA74D': 'o',
'\u0275': 'o', '\u0275': 'o',
'\u0153': 'oe',
'\u01A3': 'oi', '\u01A3': 'oi',
'\u0223': 'ou', '\u0223': 'ou',
'\uA74F': 'oo', '\uA74F': 'oo',
@@ -2989,8 +3135,9 @@ S2.define('select2/diacritics',[
'\u03CD': '\u03C5', '\u03CD': '\u03C5',
'\u03CB': '\u03C5', '\u03CB': '\u03C5',
'\u03B0': '\u03C5', '\u03B0': '\u03C5',
'\u03C9': '\u03C9', '\u03CE': '\u03C9',
'\u03C2': '\u03C3' '\u03C2': '\u03C3',
'\u2019': '\''
}; };
return diacritics; return diacritics;
@@ -3075,7 +3222,7 @@ S2.define('select2/data/select',[
if ($(data.element).is('option')) { if ($(data.element).is('option')) {
data.element.selected = true; data.element.selected = true;
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
return; return;
} }
@@ -3096,13 +3243,13 @@ S2.define('select2/data/select',[
} }
self.$element.val(val); self.$element.val(val);
self.$element.trigger('change'); self.$element.trigger('input').trigger('change');
}); });
} else { } else {
var val = data.id; var val = data.id;
this.$element.val(val); this.$element.val(val);
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
} }
}; };
@@ -3118,7 +3265,7 @@ S2.define('select2/data/select',[
if ($(data.element).is('option')) { if ($(data.element).is('option')) {
data.element.selected = false; data.element.selected = false;
this.$element.trigger('change'); this.$element.trigger('input').trigger('change');
return; return;
} }
@@ -3136,7 +3283,7 @@ S2.define('select2/data/select',[
self.$element.val(val); self.$element.val(val);
self.$element.trigger('change'); self.$element.trigger('input').trigger('change');
}); });
}; };
@@ -3158,7 +3305,7 @@ S2.define('select2/data/select',[
// Remove anything added to child elements // Remove anything added to child elements
this.$element.find('*').each(function () { this.$element.find('*').each(function () {
// Remove any custom data set by Select2 // Remove any custom data set by Select2
$.removeData(this, 'data'); Utils.RemoveData(this);
}); });
}; };
@@ -3231,7 +3378,7 @@ S2.define('select2/data/select',[
normalizedData.element = option; normalizedData.element = option;
// Override the option's data with the combined data // Override the option's data with the combined data
$.data(option, 'data', normalizedData); Utils.StoreData(option, 'data', normalizedData);
return $option; return $option;
}; };
@@ -3239,7 +3386,7 @@ S2.define('select2/data/select',[
SelectAdapter.prototype.item = function ($option) { SelectAdapter.prototype.item = function ($option) {
var data = {}; var data = {};
data = $.data($option[0], 'data'); data = Utils.GetData($option[0], 'data');
if (data != null) { if (data != null) {
return data; return data;
@@ -3277,13 +3424,13 @@ S2.define('select2/data/select',[
data = this._normalizeItem(data); data = this._normalizeItem(data);
data.element = $option[0]; data.element = $option[0];
$.data($option[0], 'data', data); Utils.StoreData($option[0], 'data', data);
return data; return data;
}; };
SelectAdapter.prototype._normalizeItem = function (item) { SelectAdapter.prototype._normalizeItem = function (item) {
if (!$.isPlainObject(item)) { if (item !== Object(item)) {
item = { item = {
id: item, id: item,
text: item text: item
@@ -3329,15 +3476,19 @@ S2.define('select2/data/array',[
'jquery' 'jquery'
], function (SelectAdapter, Utils, $) { ], function (SelectAdapter, Utils, $) {
function ArrayAdapter ($element, options) { function ArrayAdapter ($element, options) {
var data = options.get('data') || []; this._dataToConvert = options.get('data') || [];
ArrayAdapter.__super__.constructor.call(this, $element, options); ArrayAdapter.__super__.constructor.call(this, $element, options);
this.addOptions(this.convertToOptions(data));
} }
Utils.Extend(ArrayAdapter, SelectAdapter); Utils.Extend(ArrayAdapter, SelectAdapter);
ArrayAdapter.prototype.bind = function (container, $container) {
ArrayAdapter.__super__.bind.call(this, container, $container);
this.addOptions(this.convertToOptions(this._dataToConvert));
};
ArrayAdapter.prototype.select = function (data) { ArrayAdapter.prototype.select = function (data) {
var $option = this.$element.find('option').filter(function (i, elm) { var $option = this.$element.find('option').filter(function (i, elm) {
return elm.value == data.id.toString(); return elm.value == data.id.toString();
@@ -3487,7 +3638,8 @@ S2.define('select2/data/ajax',[
}, function () { }, function () {
// Attempt to detect if a request was aborted // Attempt to detect if a request was aborted
// Only works if the transport exposes a status property // Only works if the transport exposes a status property
if ($request.status && $request.status === '0') { if ('status' in $request &&
($request.status === 0 || $request.status === '0')) {
return; return;
} }
@@ -3626,8 +3778,6 @@ S2.define('select2/data/tags',[
}; };
Tags.prototype._removeOldTags = function (_) { Tags.prototype._removeOldTags = function (_) {
var tag = this._lastTag;
var $options = this.$element.find('option[data-select2-tag]'); var $options = this.$element.find('option[data-select2-tag]');
$options.each(function () { $options.each(function () {
@@ -3702,7 +3852,7 @@ S2.define('select2/data/tokenizer',[
// Replace the search term if we have the search box // Replace the search term if we have the search box
if (this.$search.length) { if (this.$search.length) {
this.$search.val(tokenData.term); this.$search.val(tokenData.term);
this.$search.focus(); this.$search.trigger('focus');
} }
params.term = tokenData.term; params.term = tokenData.term;
@@ -3831,10 +3981,30 @@ S2.define('select2/data/maximumSelectionLength',[
decorated.call(this, $e, options); decorated.call(this, $e, options);
} }
MaximumSelectionLength.prototype.bind =
function (decorated, container, $container) {
var self = this;
decorated.call(this, container, $container);
container.on('select', function () {
self._checkIfMaximumSelected();
});
};
MaximumSelectionLength.prototype.query = MaximumSelectionLength.prototype.query =
function (decorated, params, callback) { function (decorated, params, callback) {
var self = this; var self = this;
this._checkIfMaximumSelected(function () {
decorated.call(self, params, callback);
});
};
MaximumSelectionLength.prototype._checkIfMaximumSelected =
function (_, successCallback) {
var self = this;
this.current(function (currentData) { this.current(function (currentData) {
var count = currentData != null ? currentData.length : 0; var count = currentData != null ? currentData.length : 0;
if (self.maximumSelectionLength > 0 && if (self.maximumSelectionLength > 0 &&
@@ -3847,7 +4017,10 @@ S2.define('select2/data/maximumSelectionLength',[
}); });
return; return;
} }
decorated.call(self, params, callback);
if (successCallback) {
successCallback();
}
}); });
}; };
@@ -3886,7 +4059,7 @@ S2.define('select2/dropdown',[
}; };
Dropdown.prototype.position = function ($dropdown, $container) { Dropdown.prototype.position = function ($dropdown, $container) {
// Should be implmented in subclasses // Should be implemented in subclasses
}; };
Dropdown.prototype.destroy = function () { Dropdown.prototype.destroy = function () {
@@ -3910,7 +4083,7 @@ S2.define('select2/dropdown/search',[
'<span class="select2-search select2-search--dropdown">' + '<span class="select2-search select2-search--dropdown">' +
'<input class="select2-search__field" type="search" tabindex="-1"' + '<input class="select2-search__field" type="search" tabindex="-1"' +
' autocomplete="off" autocorrect="off" autocapitalize="none"' + ' autocomplete="off" autocorrect="off" autocapitalize="none"' +
' spellcheck="false" role="textbox" />' + ' spellcheck="false" role="searchbox" aria-autocomplete="list" />' +
'</span>' '</span>'
); );
@@ -3925,6 +4098,8 @@ S2.define('select2/dropdown/search',[
Search.prototype.bind = function (decorated, container, $container) { Search.prototype.bind = function (decorated, container, $container) {
var self = this; var self = this;
var resultsId = container.id + '-results';
decorated.call(this, container, $container); decorated.call(this, container, $container);
this.$search.on('keydown', function (evt) { this.$search.on('keydown', function (evt) {
@@ -3947,23 +4122,27 @@ S2.define('select2/dropdown/search',[
container.on('open', function () { container.on('open', function () {
self.$search.attr('tabindex', 0); self.$search.attr('tabindex', 0);
self.$search.attr('aria-controls', resultsId);
self.$search.focus(); self.$search.trigger('focus');
window.setTimeout(function () { window.setTimeout(function () {
self.$search.focus(); self.$search.trigger('focus');
}, 0); }, 0);
}); });
container.on('close', function () { container.on('close', function () {
self.$search.attr('tabindex', -1); self.$search.attr('tabindex', -1);
self.$search.removeAttr('aria-controls');
self.$search.removeAttr('aria-activedescendant');
self.$search.val(''); self.$search.val('');
self.$search.trigger('blur');
}); });
container.on('focus', function () { container.on('focus', function () {
if (!container.isOpen()) { if (!container.isOpen()) {
self.$search.focus(); self.$search.trigger('focus');
} }
}); });
@@ -3978,6 +4157,14 @@ S2.define('select2/dropdown/search',[
} }
} }
}); });
container.on('results:focus', function (params) {
if (params.data._resultId) {
self.$search.attr('aria-activedescendant', params.data._resultId);
} else {
self.$search.removeAttr('aria-activedescendant');
}
});
}; };
Search.prototype.handleSearch = function (evt) { Search.prototype.handleSearch = function (evt) {
@@ -4062,6 +4249,7 @@ S2.define('select2/dropdown/infiniteScroll',[
if (this.showLoadingMore(data)) { if (this.showLoadingMore(data)) {
this.$results.append(this.$loadingMore); this.$results.append(this.$loadingMore);
this.loadMoreIfNeeded();
} }
}; };
@@ -4080,25 +4268,27 @@ S2.define('select2/dropdown/infiniteScroll',[
self.loading = true; self.loading = true;
}); });
this.$results.on('scroll', function () { this.$results.on('scroll', this.loadMoreIfNeeded.bind(this));
var isLoadMoreVisible = $.contains( };
document.documentElement,
self.$loadingMore[0]
);
if (self.loading || !isLoadMoreVisible) { InfiniteScroll.prototype.loadMoreIfNeeded = function () {
return; var isLoadMoreVisible = $.contains(
} document.documentElement,
this.$loadingMore[0]
);
var currentOffset = self.$results.offset().top + if (this.loading || !isLoadMoreVisible) {
self.$results.outerHeight(false); return;
var loadingMoreOffset = self.$loadingMore.offset().top + }
self.$loadingMore.outerHeight(false);
if (currentOffset + 50 >= loadingMoreOffset) { var currentOffset = this.$results.offset().top +
self.loadMore(); this.$results.outerHeight(false);
} var loadingMoreOffset = this.$loadingMore.offset().top +
}); this.$loadingMore.outerHeight(false);
if (currentOffset + 50 >= loadingMoreOffset) {
this.loadMore();
}
}; };
InfiniteScroll.prototype.loadMore = function () { InfiniteScroll.prototype.loadMore = function () {
@@ -4119,7 +4309,7 @@ S2.define('select2/dropdown/infiniteScroll',[
var $option = $( var $option = $(
'<li ' + '<li ' +
'class="select2-results__option select2-results__option--load-more"' + 'class="select2-results__option select2-results__option--load-more"' +
'role="treeitem" aria-disabled="true"></li>' 'role="option" aria-disabled="true"></li>'
); );
var message = this.options.get('translations').get('loadingMore'); var message = this.options.get('translations').get('loadingMore');
@@ -4137,7 +4327,7 @@ S2.define('select2/dropdown/attachBody',[
'../utils' '../utils'
], function ($, Utils) { ], function ($, Utils) {
function AttachBody (decorated, $element, options) { function AttachBody (decorated, $element, options) {
this.$dropdownParent = options.get('dropdownParent') || $(document.body); this.$dropdownParent = $(options.get('dropdownParent') || document.body);
decorated.call(this, $element, options); decorated.call(this, $element, options);
} }
@@ -4145,27 +4335,14 @@ S2.define('select2/dropdown/attachBody',[
AttachBody.prototype.bind = function (decorated, container, $container) { AttachBody.prototype.bind = function (decorated, container, $container) {
var self = this; var self = this;
var setupResultsEvents = false;
decorated.call(this, container, $container); decorated.call(this, container, $container);
container.on('open', function () { container.on('open', function () {
self._showDropdown(); self._showDropdown();
self._attachPositioningHandler(container); self._attachPositioningHandler(container);
if (!setupResultsEvents) { // Must bind after the results handlers to ensure correct sizing
setupResultsEvents = true; self._bindContainerResultHandlers(container);
container.on('results:all', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:append', function () {
self._positionDropdown();
self._resizeDropdown();
});
}
}); });
container.on('close', function () { container.on('close', function () {
@@ -4214,6 +4391,44 @@ S2.define('select2/dropdown/attachBody',[
this.$dropdownContainer.detach(); this.$dropdownContainer.detach();
}; };
AttachBody.prototype._bindContainerResultHandlers =
function (decorated, container) {
// These should only be bound once
if (this._containerResultsHandlersBound) {
return;
}
var self = this;
container.on('results:all', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:append', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('results:message', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('select', function () {
self._positionDropdown();
self._resizeDropdown();
});
container.on('unselect', function () {
self._positionDropdown();
self._resizeDropdown();
});
this._containerResultsHandlersBound = true;
};
AttachBody.prototype._attachPositioningHandler = AttachBody.prototype._attachPositioningHandler =
function (decorated, container) { function (decorated, container) {
var self = this; var self = this;
@@ -4224,14 +4439,14 @@ S2.define('select2/dropdown/attachBody',[
var $watchers = this.$container.parents().filter(Utils.hasScroll); var $watchers = this.$container.parents().filter(Utils.hasScroll);
$watchers.each(function () { $watchers.each(function () {
$(this).data('select2-scroll-position', { Utils.StoreData(this, 'select2-scroll-position', {
x: $(this).scrollLeft(), x: $(this).scrollLeft(),
y: $(this).scrollTop() y: $(this).scrollTop()
}); });
}); });
$watchers.on(scrollEvent, function (ev) { $watchers.on(scrollEvent, function (ev) {
var position = $(this).data('select2-scroll-position'); var position = Utils.GetData(this, 'select2-scroll-position');
$(this).scrollTop(position.y); $(this).scrollTop(position.y);
}); });
@@ -4290,16 +4505,26 @@ S2.define('select2/dropdown/attachBody',[
top: container.bottom top: container.bottom
}; };
// Determine what the parent element is to use for calciulating the offset // Determine what the parent element is to use for calculating the offset
var $offsetParent = this.$dropdownParent; var $offsetParent = this.$dropdownParent;
// For statically positoned elements, we need to get the element // For statically positioned elements, we need to get the element
// that is determining the offset // that is determining the offset
if ($offsetParent.css('position') === 'static') { if ($offsetParent.css('position') === 'static') {
$offsetParent = $offsetParent.offsetParent(); $offsetParent = $offsetParent.offsetParent();
} }
var parentOffset = $offsetParent.offset(); var parentOffset = {
top: 0,
left: 0
};
if (
$.contains(document.body, $offsetParent[0]) ||
$offsetParent[0].isConnected
) {
parentOffset = $offsetParent.offset();
}
css.top -= parentOffset.top; css.top -= parentOffset.top;
css.left -= parentOffset.left; css.left -= parentOffset.left;
@@ -4396,8 +4621,8 @@ S2.define('select2/dropdown/minimumResultsForSearch',[
}); });
S2.define('select2/dropdown/selectOnClose',[ S2.define('select2/dropdown/selectOnClose',[
'../utils'
], function () { ], function (Utils) {
function SelectOnClose () { } function SelectOnClose () { }
SelectOnClose.prototype.bind = function (decorated, container, $container) { SelectOnClose.prototype.bind = function (decorated, container, $container) {
@@ -4428,7 +4653,7 @@ S2.define('select2/dropdown/selectOnClose',[
return; return;
} }
var data = $highlightedResults.data('data'); var data = Utils.GetData($highlightedResults[0], 'data');
// Don't re-select already selected resulte // Don't re-select already selected resulte
if ( if (
@@ -4469,7 +4694,7 @@ S2.define('select2/dropdown/closeOnSelect',[
var originalEvent = evt.originalEvent; var originalEvent = evt.originalEvent;
// Don't close if the control key is being held // Don't close if the control key is being held
if (originalEvent && originalEvent.ctrlKey) { if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) {
return; return;
} }
@@ -4523,6 +4748,9 @@ S2.define('select2/i18n/en',[],function () {
}, },
searching: function () { searching: function () {
return 'Searching…'; return 'Searching…';
},
removeAllItems: function () {
return 'Remove all items';
} }
}; };
}); });
@@ -4761,66 +4989,29 @@ S2.define('select2/defaults',[
); );
} }
if (typeof options.language === 'string') { // If the defaults were not previously applied from an element, it is
// Check if the language is specified with a region // possible for the language option to have not been resolved
if (options.language.indexOf('-') > 0) { options.language = this._resolveLanguage(options.language);
// Extract the region information if it is included
var languageParts = options.language.split('-');
var baseLanguage = languageParts[0];
options.language = [options.language, baseLanguage]; // Always fall back to English since it will always be complete
} else { options.language.push('en');
options.language = [options.language];
var uniqueLanguages = [];
for (var l = 0; l < options.language.length; l++) {
var language = options.language[l];
if (uniqueLanguages.indexOf(language) === -1) {
uniqueLanguages.push(language);
} }
} }
if ($.isArray(options.language)) { options.language = uniqueLanguages;
var languages = new Translation();
options.language.push('en');
var languageNames = options.language; options.translations = this._processTranslations(
options.language,
for (var l = 0; l < languageNames.length; l++) { options.debug
var name = languageNames[l]; );
var language = {};
try {
// Try to load it with the original name
language = Translation.loadPath(name);
} catch (e) {
try {
// If we couldn't load it, check if it wasn't the full path
name = this.defaults.amdLanguageBase + name;
language = Translation.loadPath(name);
} catch (ex) {
// The translation could not be loaded at all. Sometimes this is
// because of a configuration problem, other times this can be
// because of how Select2 helps load all possible translation files.
if (options.debug && window.console && console.warn) {
console.warn(
'Select2: The language file for "' + name + '" could not be ' +
'automatically loaded. A fallback will be used instead.'
);
}
continue;
}
}
languages.extend(language);
}
options.translations = languages;
} else {
var baseTranslation = Translation.loadPath(
this.defaults.amdLanguageBase + 'en'
);
var customTranslation = new Translation(options.language);
customTranslation.extend(baseTranslation);
options.translations = customTranslation;
}
return options; return options;
}; };
@@ -4887,13 +5078,14 @@ S2.define('select2/defaults',[
debug: false, debug: false,
dropdownAutoWidth: false, dropdownAutoWidth: false,
escapeMarkup: Utils.escapeMarkup, escapeMarkup: Utils.escapeMarkup,
language: EnglishTranslation, language: {},
matcher: matcher, matcher: matcher,
minimumInputLength: 0, minimumInputLength: 0,
maximumInputLength: 0, maximumInputLength: 0,
maximumSelectionLength: 0, maximumSelectionLength: 0,
minimumResultsForSearch: 0, minimumResultsForSearch: 0,
selectOnClose: false, selectOnClose: false,
scrollAfterSelect: false,
sorter: function (data) { sorter: function (data) {
return data; return data;
}, },
@@ -4908,6 +5100,103 @@ S2.define('select2/defaults',[
}; };
}; };
Defaults.prototype.applyFromElement = function (options, $element) {
var optionLanguage = options.language;
var defaultLanguage = this.defaults.language;
var elementLanguage = $element.prop('lang');
var parentLanguage = $element.closest('[lang]').prop('lang');
var languages = Array.prototype.concat.call(
this._resolveLanguage(elementLanguage),
this._resolveLanguage(optionLanguage),
this._resolveLanguage(defaultLanguage),
this._resolveLanguage(parentLanguage)
);
options.language = languages;
return options;
};
Defaults.prototype._resolveLanguage = function (language) {
if (!language) {
return [];
}
if ($.isEmptyObject(language)) {
return [];
}
if ($.isPlainObject(language)) {
return [language];
}
var languages;
if (!$.isArray(language)) {
languages = [language];
} else {
languages = language;
}
var resolvedLanguages = [];
for (var l = 0; l < languages.length; l++) {
resolvedLanguages.push(languages[l]);
if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) {
// Extract the region information if it is included
var languageParts = languages[l].split('-');
var baseLanguage = languageParts[0];
resolvedLanguages.push(baseLanguage);
}
}
return resolvedLanguages;
};
Defaults.prototype._processTranslations = function (languages, debug) {
var translations = new Translation();
for (var l = 0; l < languages.length; l++) {
var languageData = new Translation();
var language = languages[l];
if (typeof language === 'string') {
try {
// Try to load it with the original name
languageData = Translation.loadPath(language);
} catch (e) {
try {
// If we couldn't load it, check if it wasn't the full path
language = this.defaults.amdLanguageBase + language;
languageData = Translation.loadPath(language);
} catch (ex) {
// The translation could not be loaded at all. Sometimes this is
// because of a configuration problem, other times this can be
// because of how Select2 helps load all possible translation files
if (debug && window.console && console.warn) {
console.warn(
'Select2: The language file for "' + language + '" could ' +
'not be automatically loaded. A fallback will be used instead.'
);
}
}
}
} else if ($.isPlainObject(language)) {
languageData = new Translation(language);
} else {
languageData = language;
}
translations.extend(languageData);
}
return translations;
};
Defaults.prototype.set = function (key, value) { Defaults.prototype.set = function (key, value) {
var camelKey = $.camelCase(key); var camelKey = $.camelCase(key);
@@ -4916,7 +5205,7 @@ S2.define('select2/defaults',[
var convertedData = Utils._convertData(data); var convertedData = Utils._convertData(data);
$.extend(this.defaults, convertedData); $.extend(true, this.defaults, convertedData);
}; };
var defaults = new Defaults(); var defaults = new Defaults();
@@ -4937,6 +5226,10 @@ S2.define('select2/options',[
this.fromElement($element); this.fromElement($element);
} }
if ($element != null) {
this.options = Defaults.applyFromElement(this.options, $element);
}
this.options = Defaults.apply(this.options); this.options = Defaults.apply(this.options);
if ($element && $element.is('input')) { if ($element && $element.is('input')) {
@@ -4960,14 +5253,6 @@ S2.define('select2/options',[
this.options.disabled = $e.prop('disabled'); this.options.disabled = $e.prop('disabled');
} }
if (this.options.language == null) {
if ($e.prop('lang')) {
this.options.language = $e.prop('lang').toLowerCase();
} else if ($e.closest('[lang]').prop('lang')) {
this.options.language = $e.closest('[lang]').prop('lang');
}
}
if (this.options.dir == null) { if (this.options.dir == null) {
if ($e.prop('dir')) { if ($e.prop('dir')) {
this.options.dir = $e.prop('dir'); this.options.dir = $e.prop('dir');
@@ -4981,7 +5266,7 @@ S2.define('select2/options',[
$e.prop('disabled', this.options.disabled); $e.prop('disabled', this.options.disabled);
$e.prop('multiple', this.options.multiple); $e.prop('multiple', this.options.multiple);
if ($e.data('select2Tags')) { if (Utils.GetData($e[0], 'select2Tags')) {
if (this.options.debug && window.console && console.warn) { if (this.options.debug && window.console && console.warn) {
console.warn( console.warn(
'Select2: The `data-select2-tags` attribute has been changed to ' + 'Select2: The `data-select2-tags` attribute has been changed to ' +
@@ -4990,11 +5275,11 @@ S2.define('select2/options',[
); );
} }
$e.data('data', $e.data('select2Tags')); Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags'));
$e.data('tags', true); Utils.StoreData($e[0], 'tags', true);
} }
if ($e.data('ajaxUrl')) { if (Utils.GetData($e[0], 'ajaxUrl')) {
if (this.options.debug && window.console && console.warn) { if (this.options.debug && window.console && console.warn) {
console.warn( console.warn(
'Select2: The `data-ajax-url` attribute has been changed to ' + 'Select2: The `data-ajax-url` attribute has been changed to ' +
@@ -5003,21 +5288,45 @@ S2.define('select2/options',[
); );
} }
$e.attr('ajax--url', $e.data('ajaxUrl')); $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl'));
$e.data('ajax--url', $e.data('ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl'));
} }
var dataset = {}; var dataset = {};
function upperCaseLetter(_, letter) {
return letter.toUpperCase();
}
// Pre-load all of the attributes which are prefixed with `data-`
for (var attr = 0; attr < $e[0].attributes.length; attr++) {
var attributeName = $e[0].attributes[attr].name;
var prefix = 'data-';
if (attributeName.substr(0, prefix.length) == prefix) {
// Get the contents of the attribute after `data-`
var dataName = attributeName.substring(prefix.length);
// Get the data contents from the consistent source
// This is more than likely the jQuery data helper
var dataValue = Utils.GetData($e[0], dataName);
// camelCase the attribute name to match the spec
var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter);
// Store the data attribute contents into the dataset since
dataset[camelDataName] = dataValue;
}
}
// Prefer the element's `dataset` attribute if it exists // Prefer the element's `dataset` attribute if it exists
// jQuery 1.x does not correctly handle data attributes with multiple dashes // jQuery 1.x does not correctly handle data attributes with multiple dashes
if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
dataset = $.extend(true, {}, $e[0].dataset, $e.data()); dataset = $.extend(true, {}, $e[0].dataset, dataset);
} else {
dataset = $e.data();
} }
var data = $.extend(true, {}, dataset); // Prefer our internal data cache if it exists
var data = $.extend(true, {}, Utils.GetData($e[0]), dataset);
data = Utils._convertData(data); data = Utils._convertData(data);
@@ -5054,8 +5363,8 @@ S2.define('select2/core',[
'./keys' './keys'
], function ($, Options, Utils, KEYS) { ], function ($, Options, Utils, KEYS) {
var Select2 = function ($element, options) { var Select2 = function ($element, options) {
if ($element.data('select2') != null) { if (Utils.GetData($element[0], 'select2') != null) {
$element.data('select2').destroy(); Utils.GetData($element[0], 'select2').destroy();
} }
this.$element = $element; this.$element = $element;
@@ -5071,7 +5380,7 @@ S2.define('select2/core',[
// Set up the tabindex // Set up the tabindex
var tabindex = $element.attr('tabindex') || 0; var tabindex = $element.attr('tabindex') || 0;
$element.data('old-tabindex', tabindex); Utils.StoreData($element[0], 'old-tabindex', tabindex);
$element.attr('tabindex', '-1'); $element.attr('tabindex', '-1');
// Set up containers and adapters // Set up containers and adapters
@@ -5132,6 +5441,9 @@ S2.define('select2/core',[
// Synchronize any monitored attributes // Synchronize any monitored attributes
this._syncAttributes(); this._syncAttributes();
Utils.StoreData($element[0], 'select2', this);
// Ensure backwards compatibility with $element.data('select2').
$element.data('select2', this); $element.data('select2', this);
}; };
@@ -5208,6 +5520,12 @@ S2.define('select2/core',[
return null; return null;
} }
if (method == 'computedstyle') {
var computedStyle = window.getComputedStyle($element[0]);
return computedStyle.width;
}
return method; return method;
}; };
@@ -5248,8 +5566,8 @@ S2.define('select2/core',[
if (observer != null) { if (observer != null) {
this._observer = new observer(function (mutations) { this._observer = new observer(function (mutations) {
$.each(mutations, self._syncA); self._syncA();
$.each(mutations, self._syncS); self._syncS(null, mutations);
}); });
this._observer.observe(this.$element[0], { this._observer.observe(this.$element[0], {
attributes: true, attributes: true,
@@ -5371,7 +5689,7 @@ S2.define('select2/core',[
if (self.isOpen()) { if (self.isOpen()) {
if (key === KEYS.ESC || key === KEYS.TAB || if (key === KEYS.ESC || key === KEYS.TAB ||
(key === KEYS.UP && evt.altKey)) { (key === KEYS.UP && evt.altKey)) {
self.close(); self.close(evt);
evt.preventDefault(); evt.preventDefault();
} else if (key === KEYS.ENTER) { } else if (key === KEYS.ENTER) {
@@ -5405,7 +5723,7 @@ S2.define('select2/core',[
Select2.prototype._syncAttributes = function () { Select2.prototype._syncAttributes = function () {
this.options.set('disabled', this.$element.prop('disabled')); this.options.set('disabled', this.$element.prop('disabled'));
if (this.options.get('disabled')) { if (this.isDisabled()) {
if (this.isOpen()) { if (this.isOpen()) {
this.close(); this.close();
} }
@@ -5416,7 +5734,7 @@ S2.define('select2/core',[
} }
}; };
Select2.prototype._syncSubtree = function (evt, mutations) { Select2.prototype._isChangeMutation = function (evt, mutations) {
var changed = false; var changed = false;
var self = this; var self = this;
@@ -5444,7 +5762,22 @@ S2.define('select2/core',[
} }
} else if (mutations.removedNodes && mutations.removedNodes.length > 0) { } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
changed = true; changed = true;
} else if ($.isArray(mutations)) {
$.each(mutations, function(evt, mutation) {
if (self._isChangeMutation(evt, mutation)) {
// We've found a change mutation.
// Let's escape from the loop and continue
changed = true;
return false;
}
});
} }
return changed;
};
Select2.prototype._syncSubtree = function (evt, mutations) {
var changed = this._isChangeMutation(evt, mutations);
var self = this;
// Only re-pull the data if we think there is a change // Only re-pull the data if we think there is a change
if (changed) { if (changed) {
@@ -5466,7 +5799,8 @@ S2.define('select2/core',[
'open': 'opening', 'open': 'opening',
'close': 'closing', 'close': 'closing',
'select': 'selecting', 'select': 'selecting',
'unselect': 'unselecting' 'unselect': 'unselecting',
'clear': 'clearing'
}; };
if (args === undefined) { if (args === undefined) {
@@ -5494,7 +5828,7 @@ S2.define('select2/core',[
}; };
Select2.prototype.toggleDropdown = function () { Select2.prototype.toggleDropdown = function () {
if (this.options.get('disabled')) { if (this.isDisabled()) {
return; return;
} }
@@ -5510,15 +5844,40 @@ S2.define('select2/core',[
return; return;
} }
if (this.isDisabled()) {
return;
}
this.trigger('query', {}); this.trigger('query', {});
}; };
Select2.prototype.close = function () { Select2.prototype.close = function (evt) {
if (!this.isOpen()) { if (!this.isOpen()) {
return; return;
} }
this.trigger('close', {}); this.trigger('close', { originalEvent : evt });
};
/**
* Helper method to abstract the "enabled" (not "disabled") state of this
* object.
*
* @return {true} if the instance is not disabled.
* @return {false} if the instance is disabled.
*/
Select2.prototype.isEnabled = function () {
return !this.isDisabled();
};
/**
* Helper method to abstract the "disabled" state of this object.
*
* @return {true} if the disabled option is true.
* @return {false} if the disabled option is false.
*/
Select2.prototype.isDisabled = function () {
return this.options.get('disabled');
}; };
Select2.prototype.isOpen = function () { Select2.prototype.isOpen = function () {
@@ -5595,7 +5954,7 @@ S2.define('select2/core',[
}); });
} }
this.$element.val(newVal).trigger('change'); this.$element.val(newVal).trigger('input').trigger('change');
}; };
Select2.prototype.destroy = function () { Select2.prototype.destroy = function () {
@@ -5621,10 +5980,12 @@ S2.define('select2/core',[
this._syncS = null; this._syncS = null;
this.$element.off('.select2'); this.$element.off('.select2');
this.$element.attr('tabindex', this.$element.data('old-tabindex')); this.$element.attr('tabindex',
Utils.GetData(this.$element[0], 'old-tabindex'));
this.$element.removeClass('select2-hidden-accessible'); this.$element.removeClass('select2-hidden-accessible');
this.$element.attr('aria-hidden', 'false'); this.$element.attr('aria-hidden', 'false');
Utils.RemoveData(this.$element[0]);
this.$element.removeData('select2'); this.$element.removeData('select2');
this.dataAdapter.destroy(); this.dataAdapter.destroy();
@@ -5652,7 +6013,7 @@ S2.define('select2/core',[
this.$container.addClass('select2-container--' + this.options.get('theme')); this.$container.addClass('select2-container--' + this.options.get('theme'));
$container.data('element', this.$element); Utils.StoreData($container[0], 'element', this.$element);
return $container; return $container;
}; };
@@ -5672,8 +6033,9 @@ S2.define('jquery.select2',[
'jquery-mousewheel', 'jquery-mousewheel',
'./select2/core', './select2/core',
'./select2/defaults' './select2/defaults',
], function ($, _, Select2, Defaults) { './select2/utils'
], function ($, _, Select2, Defaults, Utils) {
if ($.fn.select2 == null) { if ($.fn.select2 == null) {
// All methods that should return the element // All methods that should return the element
var thisMethods = ['open', 'close', 'destroy']; var thisMethods = ['open', 'close', 'destroy'];
@@ -5694,7 +6056,7 @@ S2.define('jquery.select2',[
var args = Array.prototype.slice.call(arguments, 1); var args = Array.prototype.slice.call(arguments, 1);
this.each(function () { this.each(function () {
var instance = $(this).data('select2'); var instance = Utils.GetData(this, 'select2');
if (instance == null && window.console && console.error) { if (instance == null && window.console && console.error) {
console.error( console.error(
+1 -1
View File
File diff suppressed because one or more lines are too long
+2 -1
View File
File diff suppressed because one or more lines are too long
+9 -1
View File
@@ -204,7 +204,15 @@ $result = Util::generateFileUsingSimpleTemplate(
'sharedIconPath' => $sharedIconPath, 'sharedIconPath' => $sharedIconPath,
'gameImagePath' => $gameImagePath, 'gameImagePath' => $gameImagePath,
'imageRequestPath' => $imageRequestPath, 'imageRequestPath' => $imageRequestPath,
'imageRequestKey' => $imageRequestKey 'imageRequestKey' => $imageRequestKey,
'serverList' => [
['che', '체', 'white'],
['kwe', '퀘', 'yellow'],
['pwe', '풰', 'orange'],
['twe', '퉤', 'magenta'],
['nya', '냐', '#e67e22'],
['pya', '퍄', '#9b59b6']
]
], ],
true true
); );
+19
View File
@@ -13,6 +13,7 @@ class ServConfig
public static $gameImagePath = "_tK_gameImagePath_"; public static $gameImagePath = "_tK_gameImagePath_";
public static $imageRequestPath = "_tK_imageRequestPath_"; public static $imageRequestPath = "_tK_imageRequestPath_";
public static $imageRequestKey = '_tK_imageRequestKey_'; public static $imageRequestKey = '_tK_imageRequestKey_';
private static $serverList = null;
public static function getSharedIconPath(string $filepath = ''): string public static function getSharedIconPath(string $filepath = ''): string
{ {
@@ -42,6 +43,24 @@ class ServConfig
return static::$imageRequestPath . "?req={$req_hash}&time={$now}"; return static::$imageRequestPath . "?req={$req_hash}&time={$now}";
} }
/**
* 서버 설정 반환
*
* @return \sammo\Setting[]
*/
public static function getServerList(): array{
$servKeyList = [/*_tK_serverList_*/];
$servKeyList[] = ['hwe', '훼', 'red'];
if (self::$serverList === null) {
self::$serverList = [];
foreach($servKeyList as [$servKey, $servNick, $servColor]){
self::$serverList[$servKey] = new Setting(ROOT.'/'.$servKey, $servNick, $servColor);
}
}
return self::$serverList;
}
/** /**
* 서버 주소 반환. 서버의 경로가 하부 디렉토리인 경우에 하부 디렉토리까지 포함 * 서버 주소 반환. 서버의 경로가 하부 디렉토리인 경우에 하부 디렉토리까지 포함
+1 -1
View File
@@ -38,7 +38,7 @@ $admin = getAdmin();
</tr> </tr>
<tr> <tr>
<td width=110 align=right>시작시간변경</td> <td width=110 align=right>시작시간변경</td>
<td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=$admin['starttime']?>'><input type=submit name=btn value=변경1></td> <td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td>
<td width=110 align=right>현재도시훈사</td> <td width=110 align=right>현재도시훈사</td>
<td width=285><?=$admin['city_rate']?></td> <td width=285><?=$admin['city_rate']?></td>
</tr> </tr>
+11
View File
@@ -91,6 +91,7 @@ $types = [
} }
return $v; return $v;
}], }],
["점 령", "int", function($v){$v['value'] = $v['occupied']; return $v; }],
["사 살", "int", function($v){$v['value'] = $v['killcrew']; return $v; }], ["사 살", "int", function($v){$v['value'] = $v['killcrew']; return $v; }],
["살 상 률", "percent", function($v){ ["살 상 률", "percent", function($v){
if($v['warnum'] < 10){ if($v['warnum'] < 10){
@@ -101,6 +102,16 @@ $types = [
} }
return $v; return $v;
}], }],
["대 인 사 살", "int", function($v){$v['value'] = $v['killcrew_person']; return $v; }],
["대 인 살 상 률", "percent", function($v){
if($v['warnum'] < 10){
$v['value'] = 0;
}
else{
$v['value'] = $v['killcrew_person'] / max(1, $v['deathcrew_person']);
}
return $v;
}],
["보 병 숙 련 도", "int", function($v){$v['value'] = $v['dex1']; return $v; }], ["보 병 숙 련 도", "int", function($v){$v['value'] = $v['dex1']; return $v; }],
["궁 병 숙 련 도", "int", function($v){$v['value'] = $v['dex2']; return $v; }], ["궁 병 숙 련 도", "int", function($v){$v['value'] = $v['dex2']; return $v; }],
["기 병 숙 련 도", "int", function($v){$v['value'] = $v['dex3']; return $v; }], ["기 병 숙 련 도", "int", function($v){$v['value'] = $v['dex3']; return $v; }],
+3
View File
@@ -90,8 +90,11 @@ $types = [
'warnum'=>['전 투 횟 수', 'int'], 'warnum'=>['전 투 횟 수', 'int'],
'killnum'=>['승 리', 'int'], 'killnum'=>['승 리', 'int'],
'winrate'=>['승 률', 'percent'], 'winrate'=>['승 률', 'percent'],
'occupied'=>['점 령', 'int'],
'killcrew'=>['사 살', 'int'], 'killcrew'=>['사 살', 'int'],
'killrate'=>['살 상 률', 'percent'], 'killrate'=>['살 상 률', 'percent'],
'killcrew_person'=>['대 인 사 살', 'int'],
'killrate_person'=>['대 인 살 상 률', 'percent'],
'dex1'=>['보 병 숙 련 도', 'int'], 'dex1'=>['보 병 숙 련 도', 'int'],
'dex2'=>['궁 병 숙 련 도', 'int'], 'dex2'=>['궁 병 숙 련 도', 'int'],
'dex3'=>['기 병 숙 련 도', 'int'], 'dex3'=>['기 병 숙 련 도', 'int'],
+1 -1
View File
@@ -72,7 +72,7 @@ var maxChiefTurn = <?=GameConst::$maxChiefTurn?>;
></div ></div
><div ><div
><?=chiefCommandTable($generalObj) ><?=chiefCommandTable($generalObj)
?><input type='button' id='setCommand' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='실 행' ?><br><input type='button' id='setCommand' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='실 행'
></div ></div
></div ></div
></div ></div
+64 -11
View File
@@ -148,8 +148,30 @@ echo "
unset($city); unset($city);
// 첩보된 도시까지만 허용 // 첩보된 도시까지만 허용
if($valid == 0 && $userGrade < 5) {
$showDetailedInfo = false;
if($valid){
$showDetailedInfo = true;
}
if(!key_exists($citylist, CityConst::all())){
$citylist = $me['city']; $citylist = $me['city'];
$showDetailedInfo = true;
$valid = 1;
}
if($userGrade >= 5){
$valid = true;
}
if(!$valid) {
$ownCities = Util::convertArrayToSetLike($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i AND nation != 0', $me['nation']));
foreach(array_keys(CityConst::byID($citylist)->path) as $pathID){
if(key_exists($pathID, $ownCities)){
$showDetailedInfo = true;
break;
}
}
} }
@@ -172,11 +194,35 @@ if($city['trade'] === null) {
} }
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'], 2)[0]; $dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'], 2)[0];
$generals = $db->query( if($showDetailedInfo){
'SELECT %l from general where city=%i order by name', $generals = $db->query(
Util::formatListOfBackticks($dbColumns), 'SELECT %l from general where city=%i order by turntime',
$city['city'] Util::formatListOfBackticks($dbColumns),
); $city['city']
);
}
else{
$generals = [];
}
if($valid){
$city['trustText'] = round($city['trust'], 1);
$city['popRateText'] = round($city['pop']/$city['pop_max']*100, 2);
}
else{
$city['agri'] = '?';
$city['comm'] = '?';
$city['pop'] = '?';
$city['secu'] = '?';
$city['trustText'] = '?';
$city['popRateText'] = '?';
if($city['nation'] != 0){
$city['def'] = '?';
$city['wall'] = '?';
}
}
$generalTurnList = []; $generalTurnList = [];
@@ -257,6 +303,10 @@ foreach($generals as $general){
$crew = $general['crew']; $crew = $general['crew'];
$train = -1; $train = -1;
$atmos = -1; $atmos = -1;
if(!$valid){
$crew = -1;
}
} }
$nation = $general['nation']; $nation = $general['nation'];
@@ -331,7 +381,9 @@ foreach($generalsFormat as $general){
} }
if($general['nation'] != $myNation['nation']){ if($general['nation'] != $myNation['nation']){
$enemyCnt += 1; $enemyCnt += 1;
$enemyCrew += $general['crew']; if($general['crew'] >= 0){
$enemyCrew += $general['crew'];
}
if($general['crew'] > 0){ if($general['crew'] > 0){
$enemyArmedCnt += 1; $enemyArmedCnt += 1;
} }
@@ -402,11 +454,11 @@ foreach($generalsFormat as $general){
</tr> </tr>
<tr> <tr>
<td align=center class=bg1>민심</td> <td align=center class=bg1>민심</td>
<td align=center><?=round($city['trust'], 1)?></td> <td align=center><?=$city['trustText']?></td>
<td align=center class=bg1>시세</td> <td align=center class=bg1>시세</td>
<td align=center><?=$city['trade']?>%</td> <td align=center><?=$city['trade']?>%</td>
<td align=center class=bg1>인구</td> <td align=center class=bg1>인구</td>
<td align=center><?=round($city['pop']/$city['pop_max']*100, 2)?>%</td> <td align=center><?=$city['popRateText']?>%</td>
<td align=center class=bg1>태수</td> <td align=center class=bg1>태수</td>
<td align=center><?=$officer[4]['name']?></td> <td align=center><?=$officer[4]['name']?></td>
<td align=center class=bg1>군사</td> <td align=center class=bg1>군사</td>
@@ -430,11 +482,12 @@ foreach($generalsFormat as $general){
</tr> </tr>
<tr> <tr>
<td align=center class=bg1>장수</td> <td align=center class=bg1>장수</td>
<td colspan=11><?=join(', ', $generalsName)?></td> <td colspan=11><?=$showDetailedInfo?join(', ', $generalsName):'<span style="color:gray">알 수 없음</span>'?></td>
</tr> </tr>
</table> </table>
<br> <br>
<?php if($showDetailedInfo): ?>
<table align=center class='tb_layout bg0'> <table align=center class='tb_layout bg0'>
<thead> <thead>
<tr> <tr>
@@ -459,7 +512,7 @@ foreach($generalsFormat as $general){
?> ?>
</tbody> </tbody>
</table> </table>
<?php endif; ?>
<table align=center width=1000 class='tb_layout bg0'> <table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr> <tr><td><?=backButton()?></td></tr>
<tr><td><?=banner()?> </td></tr> <tr><td><?=banner()?> </td></tr>
+1 -1
View File
@@ -93,7 +93,7 @@ switch ($type) {
case 5: $orderSQL = "order by crew desc"; break; case 5: $orderSQL = "order by crew desc"; break;
case 6: $orderSQL = "order by killturn"; break; case 6: $orderSQL = "order by killturn"; break;
case 7: $orderSQL = "order by turntime"; break; case 7: $orderSQL = "order by turntime"; break;
case 8: $orderSQL = "order by troop_leader desc"; break; case 8: $orderSQL = "order by troop desc"; break;
} }
$generals = $db->query( $generals = $db->query(
+2 -2
View File
@@ -114,7 +114,7 @@ $level = Util::convertArrayToDict(
$tigers = $db->query('SELECT value, name $tigers = $db->query('SELECT value, name
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5', WHERE rank_data.nation_id = %i AND rank_data.type = "killnum" AND value > 0 ORDER BY value DESC LIMIT 5',
$nationID $nationID
);// 오호장군 );// 오호장군
$tigerstr = join(', ', array_map(function($arr){ $tigerstr = join(', ', array_map(function($arr){
@@ -506,7 +506,7 @@ foreach($db->query('SELECT city,name,level,region,officer_set from city where na
<?php if(key_exists($officerLevel, $cityOfficerList)): <?php if(key_exists($officerLevel, $cityOfficerList)):
$officer = $cityOfficerList[$officerLevel]; $officer = $cityOfficerList[$officerLevel];
?> ?>
<td><?=$officer['name']?>(<?=$officer['belong']?>년) 【<?=CityConst::byID($officer['city'])->name?>】</td> <td style="color:<?=isOfficerSet($city['officer_set'], $officerLevel)?'orange':'white'?>;"><?=$officer['name']?>(<?=$officer['belong']?>년) 【<?=CityConst::byID($officer['city'])->name?>】</td>
<?php else: ?> <?php else: ?>
<td>-</td> <td>-</td>
<?php endif; ?> <?php endif; ?>
+43 -90
View File
@@ -4,29 +4,9 @@ namespace sammo;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
$btn = Util::getPost('btn');
$defence_train = Util::getPost('defence_train', 'int', 2);
$tnmt = Util::getPost('tnmt', 'int', 1);
//$detachNPC = Util::getPost('detachNPC', 'bool');
$detachNPC = false;
$showDieImmediatelyBtn = false; $showDieImmediatelyBtn = false;
$availableDieImmediately = false; $availableDieImmediately = false;
if ($defence_train <= 60) {
$defence_train = 60;
}
else if($defence_train <= 80){
$defence_train = 80;
}
else{
$defence_train = 999;
}
if($tnmt < 0 || $tnmt > 1){
$tnmt = 1;
}
//로그인 검사 //로그인 검사
$session = Session::requireGameLogin()->setReadOnly(); $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
@@ -34,6 +14,7 @@ $generalID = $session->generalID;
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
increaseRefresh("내정보", 1); increaseRefresh("내정보", 1);
@@ -41,61 +22,24 @@ $me = General::createGeneralObjFromDB($generalID);
$myset = $me->getVar('myset'); $myset = $me->getVar('myset');
if ($myset > 0) { if ($myset > 0) {
$submit = 'submit'; $submit = 'button';
} else { } else {
$submit = 'hidden'; $submit = 'hidden';
} }
if (($btn == "설정저장" || $detachNPC) && $myset > 0) { $targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2);
if ($myset > 1) {
$submit = 'submit';
} else {
$submit = 'hidden';
}
if($defence_train != $me->getVar('defence_train')){
if($defence_train == 999){
$me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train);
$me->increaseVar('train', -3);
$me->increaseVar('atmos', -3);
}
else{
$me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train);
}
$myset -= 1;
}
if($me->getVar('tnmt') != $tnmt){
$me->setVar('tnmt', $tnmt);
}
if($me->getNPCType() == 1 && $detachNPC){
$turnterm = $gameStor->turnterm;
if($turnterm < 10){
$targetKillTurn = 30 / $turnterm;
}
else{
$targetKillTurn = 60 / $turnterm;
}
$me->setVar('killturn', $targetKillTurn);
}
}
$me->applyDB($db);
if($gameStor->turntime <= $gameStor->opentime){ if($gameStor->turntime <= $gameStor->opentime){
//서버 가오픈시 할 수 있는 행동 //서버 가오픈시 할 수 있는 행동
if($me->getNPCType() == 0){ if($me->getNPCType() == 0){
$showDieImmediatelyBtn = true; $showDieImmediatelyBtn = true;
if(addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2) <= TimeUtil::now()){ if($targetTime <= TimeUtil::now()){
$availableDieImmediately = true; $availableDieImmediately = true;
} }
} }
} }
$use_treatment = $me->getAuxVar('use_treatment')??10;
$use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn')??1;
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@@ -104,6 +48,9 @@ if($gameStor->turntime <= $gameStor->opentime){
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" /> <meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 내정보</title> <title><?=UniqueConst::$serverName?>: 내정보</title>
<script>
var availableDieImmediately = <?=$availableDieImmediately?'true':'false'?>;
</script>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?> <?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?> <?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?> <?=WebUtil::printJS('js/common.js')?>
@@ -111,21 +58,6 @@ if($gameStor->turntime <= $gameStor->opentime){
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?> <?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?> <?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?> <?=WebUtil::printCSS('css/common.css')?>
<script>
var availableDieImmediately = <?=$availableDieImmediately?'true':'false'?>;
jQuery(function($){
$('#die_immediately').click(function(){
if(!availableDieImmediately){
alert('삭제를 위해서는 생성 후 2턴 가량의 시간이 필요합니다.');
location.reload();
return false;
}
return confirm('정말로 삭제하시겠습니까?');
});
});
</script>
</head> </head>
<body> <body>
@@ -139,32 +71,53 @@ $('#die_immediately').click(function(){
<?php generalInfo2($me); ?> <?php generalInfo2($me); ?>
</td> </td>
<td width=50% valign=top style="padding-left:4ch;"> <td width=50% valign=top style="padding-left:4ch;">
<form name=form1 action=b_myPage.php method=post>
토너먼트 토너먼트
<input type=radio name=tnmt value=0 <?=$me->getVar('tnmt')==0?"checked":""; ?>>수동참여 <input type=radio class='tnmt' name=tnmt value=0 <?=$me->getVar('tnmt')==0?"checked":""; ?>>수동참여
<input type=radio name=tnmt value=1 <?=$me->getVar('tnmt')==1?"checked":""; ?>>자동참여 <input type=radio class='tnmt' name=tnmt value=1 <?=$me->getVar('tnmt')==1?"checked":""; ?>>자동참여
<br> <br>
<font color=orange>개막직전 남는자리가 있을경우 랜덤하게 참여합니다.</font><br><br> <span style='color:orange'>개막직전 남는자리가 있을경우 랜덤하게 참여합니다.</span><br><br>
수비
<input type=radio name=defence_train value=80 <?=$me->getVar('defence_train')==80?"checked":""; ?>>◎(훈사80) 환약 사용 <select id='use_treatment' name='use_treatment'>
<input type=radio name=defence_train value=60 <?=$me->getVar('defence_train')==60?"checked":""; ?>>○(훈사60) <option value=10 <?=($use_treatment==10)?"selected":""; ?>>경상</option>
<input type=radio name=defence_train value=999 <?=$me->getVar('defence_train')==999?"checked":""; ?>>× <option value=21 <?=($use_treatment==21)?"selected":""; ?>>중상</option>
<option value=41 <?=($use_treatment==41)?"selected":""; ?>>심각</option>
<option value=61 <?=($use_treatment==61)?"selected":""; ?>>위독</option>
<option value=100 <?=($use_treatment==100)?"selected":""; ?>>사용안함</option>
</select><br>
<span style='color:orange'>부상을 입었을 환약을 사용하는 기준입니다.</span><br><br>
<?php if(($gameStor->autorun_user['options']['chief'])??false) : ?>
자동 사령턴 허용 <select id='use_auto_nation_turn' name='use_auto_nation_turn'>
<option value=1 <?=$use_auto_nation_turn?"selected":""; ?>>허용</option>
<option value=0 <?=(!$use_auto_nation_turn)?"selected":""; ?>>허용 안함</option>
</select><br>
<span style='color:orange'>수뇌가 되었을 휴식 턴이어도 적당한 턴을 알아서 넣는 것을 허용합니다.</span><br><br>
<?php endif; ?>
수비 <select id='defence_train' name='defence_train'>
<?php foreach([90, 80, 60, 40] as $targetDefenceTrain): ?>
<option value='<?=$targetDefenceTrain?>' <?=$me->getVar('defence_train')==$targetDefenceTrain?"selected":""; ?>><?=formatDefenceTrain($targetDefenceTrain)?>(훈사<?=$targetDefenceTrain?>)</option>
<?php endforeach; ?>
<option value=999 <?=$me->getVar('defence_train')==999?"selected":""; ?>><?=formatDefenceTrain(999)?>[훈련, 사기 -3]</option>
</select>
<br><br> <br><br>
<input type=<?=$submit?> name=btn style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px; value=설정저장><br> <input type=<?=$submit?> id='set_my_setting' name=btn style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px; value=설정저장><br>
<font color=orange>설정저장은 이달중 <?=$myset?>회 남았습니다.</font><br><br> <span style='color:orange'>설정저장은 이달중 <?=$myset?>회 남았습니다.</span><br><br>
</form>
<?php if(!($gameStor->autorun_user['limit_minutes']??false)): ?> <?php if(!($gameStor->autorun_user['limit_minutes']??false)): ?>
<br> <br>
<a href="c_vacation.php"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>휴가 신청</button></a><br><br> <button type="button" id='vacation' style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>휴가 신청</button><br><br>
<?php endif; ?> <?php endif; ?>
<!--빙의 해제용 삭턴 조절<br> <!--빙의 해제용 삭턴 조절<br>
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>빙의 해체 요청</button></a>--> <a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>빙의 해체 요청</button></a>-->
<?php if($showDieImmediatelyBtn): ?> <?php if($showDieImmediatelyBtn): ?>
가오픈 기간 장수 삭제<br> 가오픈 기간 장수 삭제 (<?=substr($targetTime, 0, 19)?> 부터)<br>
<a href="c_die_immediately.php" id='die_immediately'><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>장수 삭제</button></a><br><br> <a href="c_die_immediately.php" id='die_immediately'><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>장수 삭제</button></a><br><br>
<?php endif; ?> <?php endif; ?>
<?php if($gameStor->npcmode==2 && $me->getNPCType()==0): ?>
다른 장수 선택 (<?=substr($me->getAuxVar('next_change')??TimeUtil::now(), 0, 19)?> 부터)<br>
<a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>다른 장수 선택</button></a><br><br>
<?php endif; ?>
개인용 CSS<br> 개인용 CSS<br>
<textarea id='custom_css' style='color:white;background-color:black;width:420px;height:150px;'></textarea> <textarea id='custom_css' style='color:white;background-color:black;width:420px;height:150px;'></textarea>
</td> </td>
+6 -5
View File
@@ -64,6 +64,7 @@ if ($currentNationPolicy['reqHumanWarUrgentGold'] ?? 0) {
$autoPolicyVariable['reqHumanWarUrgentGold'] = $currentNationPolicy['reqHumanWarUrgentGold']; $autoPolicyVariable['reqHumanWarUrgentGold'] = $currentNationPolicy['reqHumanWarUrgentGold'];
} }
$autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], ['values' => $autoPolicyVariable], null, $nation, $gameStor->getAll(true)); $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], ['values' => $autoPolicyVariable], null, $nation, $gameStor->getAll(true));
$zeroPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['options'], null, null, $nation, $gameStor->getAll(true));
?> ?>
@@ -117,7 +118,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
'긴급내정': '전쟁중에 민심이 70 미만이거나,<br>인구가 제자리 징병이 가능하지 않을 정도로 적을 경우,<br>일정확률로 주민선정과 정착장려를 수행합니다.<br><br>통솔이 높을 수록 수행할 확률이 높습니다.', '긴급내정': '전쟁중에 민심이 70 미만이거나,<br>인구가 제자리 징병이 가능하지 않을 정도로 적을 경우,<br>일정확률로 주민선정과 정착장려를 수행합니다.<br><br>통솔이 높을 수록 수행할 확률이 높습니다.',
'전투준비': '충분한 병력을 가지고 있지만 훈련과 사기가 부족한 경우 훈련과 사기진작을 수행합니다.', '전투준비': '충분한 병력을 가지고 있지만 훈련과 사기가 부족한 경우 훈련과 사기진작을 수행합니다.',
'전방워프': '전투장이 충분한 병력을 가지고 있다면 전방으로 이동합니다.', '전방워프': '전투장이 충분한 병력을 가지고 있다면 전방으로 이동합니다.',
'NPC헌납': '국고가 부족한데 NPC장수가 충분한 금쌀을 가지고 있다면 일부를 헌납합니다. <br>NPC내정장은 국고가 넉넉하더라도 충분한 금쌀을 가지고 있다면 일부를 헌납합니다.', 'NPC헌납': '국고가 부족한데 NPC전쟁장이 충분한 금쌀(권장량 대비 1.5배)을 가지고 있다면 일부를 헌납합니다. <br>NPC내정장은 국고가 넉넉하더라도 충분한 금쌀을 가지고 있다면 권장량만 유지하고 헌납합니다.',
'징병': '전쟁 중 병력을 소진하였다면 재 징병합니다.<br><br>기존에 사용한 병종군 중에서 사용가능한 병종을 랜덤하게 선택합니다.<br>고급 병종을 선택할 확률이 조금 더 높습니다.<br><br>NPC의 경우 도시의 인구가 충분하지 않다면 징병을 할 확률이 감소합니다.<br><br>유저장은 최대한 고급병종을 유지하며,<br>유저장 모병이 허용되는 경우 모병을 3회할 수 있다면 모병합니다.', '징병': '전쟁 중 병력을 소진하였다면 재 징병합니다.<br><br>기존에 사용한 병종군 중에서 사용가능한 병종을 랜덤하게 선택합니다.<br>고급 병종을 선택할 확률이 조금 더 높습니다.<br><br>NPC의 경우 도시의 인구가 충분하지 않다면 징병을 할 확률이 감소합니다.<br><br>유저장은 최대한 고급병종을 유지하며,<br>유저장 모병이 허용되는 경우 모병을 3회할 수 있다면 모병합니다.',
'후방워프': '전쟁 중 병력을 소진하였는데 도시의 인구가 충분하지 않다면,<br>인구가 많은 도시로 이동합니다.', '후방워프': '전쟁 중 병력을 소진하였는데 도시의 인구가 충분하지 않다면,<br>인구가 많은 도시로 이동합니다.',
'전쟁내정': '전쟁 중 수행하는 내정입니다.<br>정착장려, 기술연구의 확률이 좀 더 높고,<br>치안강화, 농지개간, 상업투자의 확률이 낮습니다.<br><br>내정이 가능하다 하더라도 전시임을 고려해,<br>30% 확률로 다른 턴을 수행합니다.', '전쟁내정': '전쟁 중 수행하는 내정입니다.<br>정착장려, 기술연구의 확률이 좀 더 높고,<br>치안강화, 농지개간, 상업투자의 확률이 낮습니다.<br><br>내정이 가능하다 하더라도 전시임을 고려해,<br>30% 확률로 다른 턴을 수행합니다.',
@@ -184,7 +185,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
</div> </div>
<div style='text-align:right;'><small class="form-text text-muted"> <div style='text-align:right;'><small class="form-text text-muted">
유저장긴급포상시 이보다 금이 적은 장수에게 포상합니다.<br> 유저장긴급포상시 이보다 금이 적은 장수에게 포상합니다.<br>
0이면 보병 6 징병(<?= number_format(GameConst::$defaultStatMax * 100) ?> * 6) 가능한 금을 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarUrgentGold) ?>입니다.</small></div> 0이면 보병 6 징병(<?= number_format(GameConst::$defaultStatMax * 100) ?> * 6) 가능한 금을 기준으로 하며, 그 수치는 현재 <?= number_format($zeroPolicy->reqHumanWarUrgentGold) ?>입니다.</small></div>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="row"> <div class="row">
@@ -193,7 +194,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
<input type="number" class="form-control" data-type="integer" id="reqHumanWarUrgentRice" min="0" value="0"> <input type="number" class="form-control" data-type="integer" id="reqHumanWarUrgentRice" min="0" value="0">
</div> </div>
</div> </div>
<div style='text-align:right;'><small class="form-text text-muted">유저장긴급포상시 이보다 쌀이 적은 장수에게 포상합니다.<br>0이면 기본 병종으로 <?= number_format(GameConst::$defaultStatMax * 100 * 6) ?>명 사살 가능한 쌀을 기준으로 하며, 그 수치는 현재 <?= number_format($autoPolicy->reqHumanWarUrgentRice) ?>입니다.</small></div> <div style='text-align:right;'><small class="form-text text-muted">유저장긴급포상시 이보다 쌀이 적은 장수에게 포상합니다.<br>0이면 기본 병종으로 <?= number_format(GameConst::$defaultStatMax * 100 * 6) ?>명 사살 가능한 쌀을 기준으로 하며, 그 수치는 현재 <?= number_format($zeroPolicy->reqHumanWarUrgentRice) ?>입니다.</small></div>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
@@ -205,7 +206,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
</div> </div>
</div> </div>
<div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 금입니다. 이보다 적으면 포상합니다. <br> <div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 금입니다. 이보다 적으면 포상합니다. <br>
0이면 유저전투장 긴급포상 금의 3배를 기준으로 하며, 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandGold) ?>입니다.</small></div> 0이면 유저전투장 긴급포상 금의 2배를 기준으로 하며, 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandGold) ?>입니다.</small></div>
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="row"> <div class="row">
@@ -215,7 +216,7 @@ $autoPolicy = new AutorunNationPolicy($general, ($gameStor->autorun_user)['optio
</div> </div>
</div> </div>
<div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 쌀입니다. 이보다 적으면 포상합니다. <br> <div style='text-align:right;'><small class="form-text text-muted">유저전투장에게 주는 쌀입니다. 이보다 적으면 포상합니다. <br>
0이면 유저전투장 긴급포상 쌀의 3배를 기준으로 하며, 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandRice) ?>입니다.</small></div> 0이면 유저전투장 긴급포상 쌀의 2배를 기준으로 하며, 수치는 현재 <?= number_format($autoPolicy->reqHumanWarRecommandRice) ?>입니다.</small></div>
</div> </div>
</div> </div>
<div class="form-group row"> <div class="form-group row">
+4
View File
@@ -77,6 +77,7 @@ $cssList = $commandObj->getCSSFiles();
<meta name="viewport" content="width=1024" /> <meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?> <?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?> <?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/select2/select2.full.min.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?> <?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?> <?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('d_shared/base_map.js')?> <?=WebUtil::printJS('d_shared/base_map.js')?>
@@ -95,10 +96,13 @@ foreach($jsList as $js){
} }
?> ?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?> <?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../e_lib/select2/select2.min.css')?>
<?=WebUtil::printCSS('../e_lib/select2/select2-bootstrap4.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?> <?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?> <?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/main.css')?> <?=WebUtil::printCSS('css/main.css')?>
<?=WebUtil::printCSS('css/map.css')?> <?=WebUtil::printCSS('css/map.css')?>
<?=WebUtil::printCSS('css/processing.css')?>
<?php <?php
foreach($cssList as $css){ foreach($cssList as $css){
print(WebUtil::printCSS($css)); print(WebUtil::printCSS($css));
+76 -5
View File
@@ -8,7 +8,34 @@ $session = Session::requireLogin()->setReadOnly();
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->getValue('startyear'); $gameStor->cacheValues(['startyear', 'year']);
$startYear = $gameStor->startyear;
$year = $gameStor->year;
$me = $db->queryFirstRow('SELECT no, nation, city FROM general WHERE owner =%i', Session::getUserID());
if($me){
$generalID = $me['no'];
$nationID = $me['nation'];
$city = $db->queryFirstRow('SELECT city, level, def, wall FROM city WHERE city = %i', $me['city']);
}
else{
$generalID = 0;
$nationID = 0;
$city = [
'city'=>0,
'level'=>5,
'def'=>1000,
'wall'=>1000,
];
}
if($nationID){
$nation = $db->queryFirstRow('SELECT level, type, tech, capital FROM nation WHERE nation = %i', $nationID);
}
else{
$nation = null;
}
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
@@ -30,6 +57,8 @@ $startYear = $gameStor->getValue('startyear');
<?=WebUtil::printJS('js/common.js')?> <?=WebUtil::printJS('js/common.js')?>
<script> <script>
var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>'; var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
var city = <?=Json::encode($city)?>;
var nation = <?=Json::encode($nation)?>;
</script> </script>
<?=WebUtil::printJS('js/battle_simulator.js')?> <?=WebUtil::printJS('js/battle_simulator.js')?>
</head> </head>
@@ -47,7 +76,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<div class="input-group-append"> <div class="input-group-append">
<span class="input-group-text"> 시작</span> <span class="input-group-text"> 시작</span>
</div> </div>
<input type="number" class="form-control" id="year" value="<?=$startYear+3?>" min="<?=$startYear?>"> <input type="number" class="form-control" id="year" value="<?=$year?>" min="<?=$startYear?>">
<div class="input-group-append"> <div class="input-group-append">
<span class="input-group-text"></span> <span class="input-group-text"></span>
</div> </div>
@@ -131,7 +160,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y <input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y
</label> </label>
<label class="btn btn-secondary active"> <label class="btn btn-secondary active">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="2" autocomplete="off" checked>N <input type="radio" name="is_attacker_capital" class="form_is_capital" value="0" autocomplete="off">N
</label> </label>
</div> </div>
@@ -145,6 +174,9 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<div class="card-header"> <div class="card-header">
<div class="float-sm-left" style="line-height:25px;">출병자 설정</div> <div class="float-sm-left" style="line-height:25px;">출병자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar"> <div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-success btn-general-import-server">서버에서 가져오기</button>
</div>
<div class="btn-group btn-group-sm mr-2" role="group"> <div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-info btn-general-save">저장</button> <button type="button" class="btn btn-info btn-general-save">저장</button>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" /> <input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
@@ -203,7 +235,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y <input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y
</label> </label>
<label class="btn btn-secondary active"> <label class="btn btn-secondary active">
<input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off" checked>N <input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off">N
</label> </label>
</div> </div>
</div> </div>
@@ -236,6 +268,9 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<div class="card-header"> <div class="card-header">
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div> <div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar"> <div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-success btn-general-import-server">서버에서 가져오기</button>
</div>
<div class="btn-group btn-group-sm mr-2" role="group"> <div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-info btn-general-save">저장</button> <button type="button" class="btn btn-info btn-general-save">저장</button>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" /> <input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
@@ -404,7 +439,7 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
<div class="input-group mb-1"> <div class="input-group mb-3">
<div class="input-group-prepend"> <div class="input-group-prepend">
<span class="input-group-text">귀병숙련</span> <span class="input-group-text">귀병숙련</span>
</div> </div>
@@ -425,11 +460,27 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
<span class="input-group-text">수비여부</span> <span class="input-group-text">수비여부</span>
</div> </div>
<select class="custom-select form_defence_train only_defender"> <select class="custom-select form_defence_train only_defender">
<option value="90">훈사 90</option>
<option value="80">훈사 80</option> <option value="80">훈사 80</option>
<option value="60">훈사 60</option> <option value="60">훈사 60</option>
<option value="40">훈사 40</option>
<option value="999">안함</option> <option value="999">안함</option>
</select> </select>
</div> </div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">전투 </span>
</div>
<input type="number" class="form-control form_warnum" value="0" step="1">
<div class="input-group-prepend">
<span class="input-group-text">승리 </span>
</div>
<input type="number" class="form-control form_killnum" value="0" step="1">
<div class="input-group-prepend">
<span class="input-group-text">사살 </span>
</div>
<input type="number" class="form-control form_killcrew" value="0" step="1">
</div>
</div> </div>
</div> </div>
@@ -477,5 +528,25 @@ var defaultSpecialDomestic = '<?=GameConst::$defaultSpecialDomestic?>';
</div> </div>
</div> </div>
</div> </div>
<div id="importModal" class="modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">장수 목록</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<select id="modalSelector"></select>
<p>타국 장수를 선택한 경우 숙련과 아이템은 0으로 초기화됩니다.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" id='importFromDB'>가져오기</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">닫기</button>
</div>
</div>
</div>
</div>
</body> </body>
</html> </html>
+1 -1
View File
@@ -49,6 +49,7 @@ if($btn == '참가') {
$general['gold'] -= $admin['develcost']; $general['gold'] -= $admin['develcost'];
$freeSlot = [ $freeSlot = [
0=>8,
1=>8, 1=>8,
2=>8, 2=>8,
3=>8, 3=>8,
@@ -56,7 +57,6 @@ if($btn == '참가') {
5=>8, 5=>8,
6=>8, 6=>8,
7=>8, 7=>8,
8=>8,
]; ];
foreach($db->query('SELECT count(*) as cnt, grp FROM tournament WHERE grp < 10 GROUP BY grp') as $grpInfo){ foreach($db->query('SELECT count(*) as cnt, grp FROM tournament WHERE grp < 10 GROUP BY grp') as $grpInfo){
if($grpInfo['cnt'] == 8){ if($grpInfo['cnt'] == 8){
+154 -134
View File
@@ -1,40 +1,56 @@
@charset "UTF-8"; @charset "UTF-8";
/* font-boostring Block */ /* font-boostring Block */
html * {max-height:1000000px;}
html * {
html, body{ max-height: 1000000px;
background-color:black;
color:white;
line-height:1.3;
font-family:'맑은 고딕';
font-size:13px;
} }
table { font-family:'맑은 고딕'; } html,
font { font-family:'맑은 고딕'; } body {
input { font-family:'맑은 고딕'; font-size:13px; } background-color: black;
select { font-family:'굴림'; line-height:100%; } color: white;
line-height: 1.3;
.center{ font-family: '맑은 고딕';
text-align:center; font-size: 13px;
} }
table.mimic_flex{ table {
font-family: '맑은 고딕';
}
font {
font-family: '맑은 고딕';
}
input {
font-family: '맑은 고딕';
font-size: 13px;
}
select {
font-family: '굴림';
line-height: 100%;
}
.center {
text-align: center;
}
table.mimic_flex {
border-collapse: collapse; border-collapse: collapse;
border:none; border: none;
padding:0; padding: 0;
} }
.mimic_flex td, .mimic_flex th { .mimic_flex td,
border:none !important; .mimic_flex th {
border: none !important;
padding: 0px; padding: 0px;
word-break: break-all; word-break: break-all;
} }
table.tb_layout {
table.tb_layout {
border-collapse: collapse; border-collapse: collapse;
padding: 0px; padding: 0px;
font-size: 13px; font-size: 13px;
@@ -42,159 +58,161 @@ table.tb_layout {
font-family: '맑은 고딕'; font-family: '맑은 고딕';
} }
.tb_layout td, .tb_layout th { .tb_layout td,
border:solid 1px gray; .tb_layout th {
border: solid 1px gray;
padding: 0px; padding: 0px;
word-break: break-all; word-break: break-all;
font-family: '맑은 고딕';; font-family: '맑은 고딕';
;
} }
div.bar_out{ div.bar_out {
position:relative; position: relative;
border-top:solid 1px #888888; border-top: solid 1px #888888;
border-bottom:solid 1px #333333; border-bottom: solid 1px #333333;
padding:0; padding: 0;
margin:0; margin: 0;
width:100%; width: 100%;
overflow: hidden; overflow: hidden;
} }
div.bar_out div{ div.bar_out div {
position:absolute; position: absolute;
left:0; left: 0;
top:0; top: 0;
height:100%; height: 100%;
} }
div.bar_out div.bar_in{ div.bar_out div.bar_in {
width:100%; width: 100%;
} }
/* */ /* */
.ev_warning{ .ev_warning {
color:orangered; color: orangered;
} }
.ev_notice{ .ev_notice {
color:orangered; color: orangered;
} }
.ev_succes{ .ev_succes {
color:lightgreen; color: lightgreen;
} }
.ev_sell{ .ev_sell {
color:orange; color: orange;
} }
.ev_failed{ .ev_failed {
color:orangered; color: orangered;
} }
.ev_highlight{ .ev_highlight {
color:orangered; color: orangered;
} }
/* TODO: 색상값이 아니라 의미에 따라 클래스 지정 */ /* TODO: 색상값이 아니라 의미에 따라 클래스 지정 */
.o_bullet::before{ .o_bullet::before {
color:cyan; color: cyan;
content:"●"; content: "●";
} }
.o_diamond::before{ .o_diamond::before {
color:orangered; color: orangered;
content:"◆"; content: "◆";
} }
.small_war_log{ .small_war_log {
display:inline-block; display: inline-block;
} }
.small_war_log .war_type_attack{ .small_war_log .war_type_attack {
color:cyan; color: cyan;
} }
.small_war_log .war_type_defense{ .small_war_log .war_type_defense {
color:magenta; color: magenta;
} }
.small_war_log .war_type_siege{ .small_war_log .war_type_siege {
color:white; color: white;
} }
.small_war_log .name_plate {
.small_war_log .name_plate{
font-size: 0.75em; font-size: 0.75em;
} }
.small_war_log .name_plate_cover{ .small_war_log .name_plate_cover {
color:yellow; color: yellow;
} }
.small_war_log .crew_plate{ .small_war_log .crew_plate {
color:orangered; color: orangered;
font-size:90%; font-size: 90%;
} }
.t_date{ .t_date {
font-size: 0.75em; font-size: 0.75em;
} }
.t_red{ .t_red {
color:red; color: red;
} }
.t_blue{ .t_blue {
color:blue; color: blue;
} }
.t_green{ .t_green {
color:green; color: green;
} }
.t_magenta{ .t_magenta {
color:magenta; color: magenta;
} }
.t_cyan{ .t_cyan {
color:cyan; color: cyan;
} }
.t_limegreen{ .t_limegreen {
color:limegreen; color: limegreen;
} }
.t_skyblue{ .t_skyblue {
color:skyblue; color: skyblue;
} }
.t_orangered{ .t_orangered {
color:orangered; color: orangered;
} }
.t_yellow{ .t_yellow {
color:yellow; color: yellow;
} }
.t_white{ .t_white {
color:white; color: white;
} }
.float_left{ .float_left {
float:left; float: left;
} }
.tooltip{ .tooltip {
font-size:12px; font-size: 12px;
font-family: '맑은 고딕'; font-family: '맑은 고딕';
} }
.tooltip_copyable_info .tooltiptext{ .tooltip_copyable_info .tooltiptext {
display: inline; display: inline;
color: rgba(0,0,0,0); color: rgba(0, 0, 0, 0);
font-size: 0; font-size: 0;
} }
@@ -202,67 +220,69 @@ div.bar_out div.bar_in{
display: none; display: none;
} }
.hidden_but_copyable{ .hidden_but_copyable {
color: rgba(0,0,0,0); color: rgba(0, 0, 0, 0);
font-size: 0; font-size: 0;
} }
.btn-group-xs > .btn, .btn-xs { .btn-group-xs>.btn,
padding : .25rem .4rem; .btn-xs {
font-size : .875rem; padding: .25rem .4rem;
line-height : .5; font-size: .875rem;
border-radius : .2rem; line-height: .5;
border-radius: .2rem;
} }
.edit_form.viewer{ .edit_form.viewer {
max-height:200px; max-height: 200px;
overflow-y:auto; overflow-y: auto;
} }
.trumbowyg-box{ .trumbowyg-box {
margin:0; margin: 0;
border-left:none; border-left: none;
border-right:none; border-right: none;
} }
.edit_form.trumbowyg-editor{ .edit_form.trumbowyg-editor {
margin:0; margin: 0;
padding:0; padding: 0;
} }
.commandBasic{ .commandBasic {
background-color:black; background-color: black;
color:white; color: white;
} }
.compensatePositive{ .compensatePositive {
color:skyblue; color: skyblue;
} }
.compensateNegative{ .compensateNegative {
color:orange; color: orange;
} }
.compensateNeutral{ .compensateNeutral {
color:white; color: white;
} }
.commandBasic.commandImpossible{ .commandBasic.commandImpossible {
background-color:red; background-color: red;
color:white; color: white;
} }
.select2-selection--single.simple-select2-align-center .select2-selection__rendered { .select2-selection--single.simple-select2-align-center .select2-selection__rendered {
text-align: center; text-align: center;
} }
.select2-dropdown.simple-select2-align-center li.select2-results__option{ .select2-dropdown.simple-select2-align-center li.select2-results__option {
text-align: center; text-align: center;
} }
.select2-container--bootstrap4 .select2-selection--single.text-secondary .select2-selection__rendered{ .select2-container--bootstrap4 .select2-selection--single.text-secondary .select2-selection__rendered {
color:white; color: white;
} }
.select2-container--bootstrap4 .text-secondary .select2-results__option[aria-selected=false]{ .select2-container--bootstrap4 .text-secondary .select2-results__option[aria-selected=false] {
color:white; color: white;
} }
+11
View File
@@ -0,0 +1,11 @@
#amount {
width: 100px;
}
#colorType {
width: 150px;
}
.no-padding .select2-results__option {
padding: 0;
}
+64
View File
@@ -0,0 +1,64 @@
@charset "UTF-8";
.container {
width: 1000px;
margin: 0 auto;
}
.card_holder {
text-align: center;
}
.general_card {
width: 125px;
display: inline-block;
}
.general_card h4 {
margin: 0;
}
.general_card p {
margin: 0;
}
.general_card .select_btn {
width: 100%;
}
.general_card label {
display: block;
padding-left: 15px;
text-indent: -15px;
}
.general_card input {
width: 13px;
height: 13px;
padding: 0;
margin: 0;
vertical-align: bottom;
position: relative;
top: -1px;
*overflow: hidden;
}
#outdate_token {
color: red;
display: none;
}
#left_pad button {
display: none;
}
.custom_picture {
display: none;
}
.custom_personality {
display: none;
}
.custom_stat {
display: none;
}
+35 -3
View File
@@ -185,7 +185,8 @@ function myNationInfo(General $generalObj)
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['startyear', 'year']); $admin = $gameStor->getValues(['startyear', 'year', 'month']);
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
$nationID = $generalObj->getNationID(); $nationID = $generalObj->getNationID();
$nation = $db->queryFirstRow('SELECT * FROM nation WHERE nation = %i', $nationID)??getNationStaticInfo(0); $nation = $db->queryFirstRow('SELECT * FROM nation WHERE nation = %i', $nationID)??getNationStaticInfo(0);
@@ -200,6 +201,17 @@ function myNationInfo(General $generalObj)
$level12Name = key_exists(12, $topChiefs)?getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']):'-'; $level12Name = key_exists(12, $topChiefs)?getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']):'-';
$level11Name = key_exists(11, $topChiefs)?getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']):'-'; $level11Name = key_exists(11, $topChiefs)?getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']):'-';
$impossibleStrategicCommandLists = [];
$strategicCommandLists = GameConst::$availableChiefCommand['전략'];
$yearMonth = Util::joinYearMonth($admin['year'], $admin['month']);
foreach($strategicCommandLists as $command){
$cmd = buildNationCommandClass($command, $generalObj, $admin, new LastTurn());
$nextAvailableTurn = $cmd->getNextAvailableTurn();
if($nextAvailableTurn > $yearMonth){
$impossibleStrategicCommandLists[] = [$cmd->getName(), $nextAvailableTurn - $yearMonth];
}
}
echo "<table width=498 class='tb_layout bg2 nation_info'> echo "<table width=498 class='tb_layout bg2 nation_info'>
<tr> <tr>
<td colspan=4 "; <td colspan=4 ";
@@ -282,10 +294,23 @@ function myNationInfo(General $generalObj)
} else { } else {
if ($nation['strategic_cmd_limit'] != 0) { if ($nation['strategic_cmd_limit'] != 0) {
$nation['strategic_cmd_limit'] = "<font color=red>{$nation['strategic_cmd_limit']}턴</font>"; $nation['strategic_cmd_limit'] = "<font color=red>{$nation['strategic_cmd_limit']}턴</font>";
} else { } else if($impossibleStrategicCommandLists) {
$nation['strategic_cmd_limit'] = "<font color=yellow>가 능</font>";
} else{
$nation['strategic_cmd_limit'] = "<font color=limegreen>가 능</font>"; $nation['strategic_cmd_limit'] = "<font color=limegreen>가 능</font>";
} }
if($impossibleStrategicCommandLists){
$text = [];
foreach($impossibleStrategicCommandLists as [$cmdName, $remainTurn]){
$text[] = "{$cmdName}: {$remainTurn}턴 뒤";
}
$nation['strategic_cmd_limit'] = $templates->render('tooltip', [
'text'=>'<span style="text-decoration:underline dashed;">'.$nation['strategic_cmd_limit'].'</span>',
'info'=>'<span class="text-left d-inline-block">'.join('<br>', $text).'</span>',
]);
}
if ($nation['surlimit'] != 0) { if ($nation['surlimit'] != 0) {
$nation['surlimit'] = "<font color=red>{$nation['surlimit']}턴</font>"; $nation['surlimit'] = "<font color=red>{$nation['surlimit']}턴</font>";
} else { } else {
@@ -1241,7 +1266,7 @@ function addAge()
$generalID = $general['no']; $generalID = $general['no'];
$special = SpecialityHelper::pickSpecialDomestic( $special = SpecialityHelper::pickSpecialDomestic(
$general, $general,
(Json::decode($general['aux'])['prev_types_special2'])??[] (Json::decode($general['aux'])['prev_types_special'])??[]
); );
$specialClass = buildGeneralSpecialDomesticClass($special); $specialClass = buildGeneralSpecialDomesticClass($special);
$specialText = $specialClass->getName(); $specialText = $specialClass->getName();
@@ -1336,8 +1361,11 @@ function CheckHall($no)
["warnum", 'rank'], ["warnum", 'rank'],
["killnum", 'rank'], ["killnum", 'rank'],
["winrate", 'calc'], ["winrate", 'calc'],
["occupied", 'rank'],
["killcrew", 'rank'], ["killcrew", 'rank'],
["killrate", 'calc'], ["killrate", 'calc'],
["killcrew_person", 'rank'],
["killrate_person", 'calc'],
["dex1", 'natural'], ["dex1", 'natural'],
["dex2", 'natural'], ["dex2", 'natural'],
["dex3", 'natural'], ["dex3", 'natural'],
@@ -1380,6 +1408,9 @@ function CheckHall($no)
$kill = $generalObj->getRankVar('killcrew'); $kill = $generalObj->getRankVar('killcrew');
$death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1); $death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1);
$killPerson = $generalObj->getRankVar('killcrew_person');
$deathPerson = Util::valueFit($generalObj->getRankVar('deathcrew_person'), 1);
$tt = Util::valueFit($ttw + $ttd + $ttl, 1); $tt = Util::valueFit($ttw + $ttd + $ttl, 1);
$tl = Util::valueFit($tlw + $tld + $tll, 1); $tl = Util::valueFit($tlw + $tld + $tll, 1);
$ts = Util::valueFit($tsw + $tsd + $tsl, 1); $ts = Util::valueFit($tsw + $tsd + $tsl, 1);
@@ -1393,6 +1424,7 @@ function CheckHall($no)
$calcVar['betrate'] = $betWinGold / $betGold; $calcVar['betrate'] = $betWinGold / $betGold;
$calcVar['winrate'] = $win / $war; $calcVar['winrate'] = $win / $war;
$calcVar['killrate'] = $kill / $death; $calcVar['killrate'] = $kill / $death;
$calcVar['killrate_person'] = $killPerson / $deathPerson;
if ($generalObj instanceof DummyGeneral) { if ($generalObj instanceof DummyGeneral) {
return; return;
+5 -5
View File
@@ -232,7 +232,7 @@ function checkCommandArg(?array $arg):?string{
} }
$defaultCheck = [ $defaultCheck = [
/*'string'=>[ /*'string'=>[
'nationName', 'optionText', 'itemType', 'nationType' 'nationName', 'optionText', 'itemType', 'nationType', 'commandType',
],*/ ],*/
'integer'=>[ 'integer'=>[
'crewType', 'destGeneralID', 'destCityID', 'destNationID', 'crewType', 'destGeneralID', 'destCityID', 'destNationID',
@@ -284,14 +284,14 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
$turnList[$turnIdx] = true; $turnList[$turnIdx] = true;
} }
else if($turnIdx == -1){ else if($turnIdx == -1){
//홀수 //홀수, 0부터 맞다.
foreach(Util::range(1, GameConst::$maxTurn, 2) as $subIdx){ foreach(Util::range(0, GameConst::$maxTurn, 2) as $subIdx){
$turnList[$subIdx] = true; $turnList[$subIdx] = true;
} }
} }
else if($turnIdx == -2){ else if($turnIdx == -2){
//짝수 //짝수, 1부터 맞다.
foreach(Util::range(0, GameConst::$maxTurn, 2) as $subIdx){ foreach(Util::range(1, GameConst::$maxTurn, 2) as $subIdx){
$turnList[$subIdx] = true; $turnList[$subIdx] = true;
} }
} }
+24
View File
@@ -378,6 +378,30 @@ function buildWarUnitTriggerClass(?string $type, WarUnit $unit, ?array $args = n
return $class->newInstanceArgs(array_merge([$unit], $args)); return $class->newInstanceArgs(array_merge([$unit], $args));
} }
function getGeneralPoolClass(string $type){
static $basePath = __NAMESPACE__.'\\GeneralPool\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 GeneralPool이 아님");
}
/**
* @param \MeekroDB $db
* @param int $owner
* @param int $pickCnt
* @param null|string $prefix
* @return AbsGeneralPool[]
*/
function pickGeneralFromPool(\MeekroDB $db, int $owner, int $pickCnt, ?string $prefix=null):array{
/** @var AbsGeneralPool */
$class = getGeneralPoolClass(GameConst::$targetGeneralPool);
return $class::pickGeneralFromPool($db, $owner, $pickCnt, $prefix);
}
function countPureGeneralFromRawList(?array $rawGeneralList=null):int{ function countPureGeneralFromRawList(?array $rawGeneralList=null):int{
if(!$rawGeneralList){ if(!$rawGeneralList){
return 0; return 0;
+16 -22
View File
@@ -516,6 +516,7 @@ function checkWander()
$logger = $wanderer->getLogger(); $logger = $wanderer->getLogger();
$logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN); $logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN);
$wanderCmd->run(); $wanderCmd->run();
$wanderCmd->setNextAvailable();
} }
} }
@@ -565,7 +566,9 @@ function updateNationState()
$nation['level'] = $nationlevel; $nation['level'] = $nationlevel;
$updateVals = [ $updateVals = [
'level' => $nationlevel 'level' => $nationlevel,
'gold'=>$db->sqleval('gold + %i', $nationlevel*1000),
'rice'=>$db->sqleval('rice + %i', $nationlevel*1000),
]; ];
switch ($nationlevel) { switch ($nationlevel) {
@@ -677,38 +680,30 @@ function updateNationState()
while ($assemblerCnt < $maxAssemblerCnt) { while ($assemblerCnt < $maxAssemblerCnt) {
$lastAssemblerID += 1; $lastAssemblerID += 1;
$npcObj = new Scenario\NPC( $npcObj = new Scenario\GeneralBuilder(
999,
sprintf('부대장%4d', $lastAssemblerID), sprintf('부대장%4d', $lastAssemblerID),
0,
null, null,
$nation['nation'], $nation['nation']
null,
10,
10,
10,
1,
$admin['year'] - 15,
$admin['year'] + 15,
'은둔',
'척사'
); );
$npcObj->killturn = 70; $npcObj->setAffinity(999)->setStat(10, 10, 10)
$npcObj->gold = 0; ->setSpecialSingle('척사')->setEgo('che_은둔')
$npcObj->rice = 0; ->setKillturn(70)->setGoldRice(0, 0)
$npcObj->npc = 5; ->setNPCType(5)->fillRemainSpecAsZero($admin);
$npcObj->build($admin); $npcObj->build($admin);
$npcID = $npcObj->generalID; $npcID = $npcObj->getGeneralID();
$db->insert('troop', [ $db->insert('troop', [
'troop_leader' => $npcID, 'troop_leader' => $npcID,
'name' => $npcObj->realName, 'name' => $npcObj->getGeneralName(),
'nation' => $nation['nation'], 'nation' => $nation['nation'],
]); ]);
$db->update('general', [ $db->update('general', [
'troop' => $npcID 'troop' => $npcID
], 'no=%i', $npcID); ], 'no=%i', $npcID);
//TODO: 5턴간 집합턴 입력 $cmd = buildGeneralCommandClass('che_집합', General::createGeneralObjFromDB($npcID), $admin);
_setGeneralCommand($cmd, iterator_to_array(Util::range(GameConst::$maxTurn)));
$assemblerCnt += 1; $assemblerCnt += 1;
$gameStor->assembler_id = $lastAssemblerID; $gameStor->assembler_id = $lastAssemblerID;
} }
@@ -1008,7 +1003,7 @@ function checkEmperior()
$tigers = $db->query( $tigers = $db->query(
'SELECT value, name 'SELECT value, name
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5', WHERE rank_data.nation_id = %i AND rank_data.type = "killnum" AND value > 0 ORDER BY value DESC LIMIT 5',
$nationID $nationID
); // 오호장군 ); // 오호장군
@@ -1037,7 +1032,6 @@ function checkEmperior()
} }
$gen = join(', ', array_column($rawGeneral, 'name')); $gen = join(', ', array_column($rawGeneral, 'name'));
$nation['type'] = getNationType($nation['type']);
$stat = $db->queryFirstRow('SELECT max(nation_count) as nc, max(gen_count) as gc FROM statistic'); $stat = $db->queryFirstRow('SELECT max(nation_count) as nc, max(gen_count) as gc FROM statistic');
$genCnt = $db->queryFirstField('SELECT count(*) FROM general'); $genCnt = $db->queryFirstField('SELECT count(*) FROM general');
+20 -4
View File
@@ -39,10 +39,26 @@ function bar($per, $h=7) {
} }
function optionsForCities() { function optionsForCities(callable $infoCall=null) {
return join('', array_map(function($city){
return "<option value='{$city->id}'>{$city->name}</option>"; if(!$infoCall){
}, CityConst::all())); return join('', array_map(function($city){
return "<option value='{$city->id}'>{$city->name}</option>";
}, CityConst::all()));
}
$infoList = [];
$noInfoList = [];
foreach(CityConst::all() as $city){
$info = $infoCall($city);
if(!$info){
$noInfoList[] = "<option value='{$city->id}'>{$city->name}</option>";
continue;
}
$infoList[] = "<option value='{$city->id}'>{$city->name} ({$info})</option>";
}
return join('', array_merge($infoList, $noInfoList));
} }
function Submit($url, $msg="", $msg2="") { function Submit($url, $msg="", $msg2="") {
+5 -1
View File
@@ -217,10 +217,14 @@ function formatDefenceTrain(int $value): string
{ {
if ($value === 999) { if ($value === 999) {
return "×"; return "×";
} else if ($value >= 90){
return "";
} else if ($value >= 80) { } else if ($value >= 80) {
return ""; return "";
} else { } else if ($value >= 60) {
return ""; return "";
} else{
return "";
} }
} }
+23 -17
View File
@@ -78,6 +78,7 @@ function processGoldIncome() {
// 실지급률 // 실지급률
$ratio = $realoutcome / $originoutcome; $ratio = $realoutcome / $originoutcome;
} }
$nation['gold'] = Util::valueFit($nation['gold'], GameConst::$basegold);
$adminLog[] = StringUtil::padStringAlignRight((string)$nation['name'],12," ") $adminLog[] = StringUtil::padStringAlignRight((string)$nation['name'],12," ")
." // 세금 : ".StringUtil::padStringAlignRight((string)$income,6," ") ." // 세금 : ".StringUtil::padStringAlignRight((string)$income,6," ")
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ") ." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
@@ -87,6 +88,8 @@ function processGoldIncome() {
$incomeText = number_format($income); $incomeText = number_format($income);
$incomeLog = "이번 수입은 금 <C>$incomeText</>입니다."; $incomeLog = "이번 수입은 금 <C>$incomeText</>입니다.";
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->prev_income_gold = $income;
$db->update('nation', [ $db->update('nation', [
'gold'=>$nation['gold'] 'gold'=>$nation['gold']
@@ -353,6 +356,7 @@ function processRiceIncome() {
// 실지급률 // 실지급률
$ratio = $realoutcome / $originoutcome; $ratio = $realoutcome / $originoutcome;
} }
$nation['rice'] = Util::valueFit($nation['rice'], GameConst::$baserice);
$adminLog[] = StringUtil::padStringAlignRight($nation['name'],12," ") $adminLog[] = StringUtil::padStringAlignRight($nation['name'],12," ")
." // 세곡 : ".StringUtil::padStringAlignRight((string)$income,6," ") ." // 세곡 : ".StringUtil::padStringAlignRight((string)$income,6," ")
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ") ." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
@@ -362,6 +366,8 @@ function processRiceIncome() {
$incomeText = number_format($income); $incomeText = number_format($income);
$incomeLog = "이번 수입은 쌀 <C>$incomeText</>입니다."; $incomeLog = "이번 수입은 쌀 <C>$incomeText</>입니다.";
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->prev_income_rice = $income;
$db->update('nation', [ $db->update('nation', [
'rice'=>$nation['rice'] 'rice'=>$nation['rice']
@@ -528,36 +534,36 @@ function disaster() {
$targetCityNames = "<G><b>".join(' ', Util::squeezeFromArray($targetCityList, 'name'))."</b></>"; $targetCityNames = "<G><b>".join(' ', Util::squeezeFromArray($targetCityList, 'name'))."</b></>";
$disasterTextList = [ $disasterTextList = [
1 => [ 1 => [
['재난', 4, '역병이 발생하여 도시가 황폐해지고 있습니다.'], ['<M><b>【재난】</b></>', 4, '역병이 발생하여 도시가 황폐해지고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'], ['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 3, '추위가 풀리지 않아 얼어죽는 백성들이 늘어나고 있습니다.'], ['<M><b>【재난】</b></>', 3, '추위가 풀리지 않아 얼어죽는 백성들이 늘어나고 있습니다.'],
['재난', 9, '황건적이 출현해 도시를 습격하고 있습니다.'], ['<M><b>【재난】</b></>', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
], ],
4 => [ 4 => [
['재난', 7, '홍수로 인해 피해가 급증하고 있습니다.'], ['<M><b>【재난】</b></>', 7, '홍수로 인해 피해가 급증하고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'], ['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 6, '태풍으로 인해 피해가 속출하고 있습니다.'], ['<M><b>【재난】</b></>', 6, '태풍으로 인해 피해가 속출하고 있습니다.'],
], ],
7 => [ 7 => [
['재난', 8, '메뚜기 떼가 발생하여 도시가 황폐해지고 있습니다.'], ['<M><b>【재난】</b></>', 8, '메뚜기 떼가 발생하여 도시가 황폐해지고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'], ['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 8, '흉년이 들어 굶어죽는 백성들이 늘어나고 있습니다.'], ['<M><b>【재난】</b></>', 8, '흉년이 들어 굶어죽는 백성들이 늘어나고 있습니다.'],
], ],
10 => [ 10 => [
['재난', 3, '혹한으로 도시가 황폐해지고 있습니다.'], ['<M><b>【재난】</b></>', 3, '혹한으로 도시가 황폐해지고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'], ['<M><b>【재난】</b></>', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 3, '눈이 많이 쌓여 도시가 황폐해지고 있습니다.'], ['<M><b>【재난】</b></>', 3, '눈이 많이 쌓여 도시가 황폐해지고 있습니다.'],
['재난', 9, '황건적이 출현해 도시를 습격하고 있습니다.'], ['<M><b>【재난】</b></>', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
] ]
]; ];
$boomingTextList = [ $boomingTextList = [
1 => null, 1 => null,
4 => [ 4 => [
['호황', 2, '호황으로 도시가 번창하고 있습니다.'], ['<C><b>【호황】</b></>', 2, '호황으로 도시가 번창하고 있습니다.'],
], ],
7 => [ 7 => [
['풍작', 1, '풍작으로 도시가 번창하고 있습니다.'], ['<C><b>【풍작】</b></>', 1, '풍작으로 도시가 번창하고 있습니다.'],
], ],
10 => null 10 => null
]; ];
@@ -566,7 +572,7 @@ function disaster() {
$logger = new ActionLogger(0, 0, $year, $month, false); $logger = new ActionLogger(0, 0, $year, $month, false);
$logger->pushGlobalHistoryLog("<M><b>【{$logTitle}】</b></>{$targetCityNames}{$logBody}"); $logger->pushGlobalHistoryLog("{$logTitle}{$targetCityNames}{$logBody}");
$logger->flush(); $logger->flush();
if (!$isGood) { if (!$isGood) {
+1 -1
View File
@@ -523,7 +523,7 @@ function selection($tnmt_type, $tnmt, $phase) {
if($phase < 31) { if($phase < 31) {
$gameStor->phase+=1; $gameStor->phase+=1;
} else { } else {
$gameStor->tournamemt = 4; $gameStor->tournament = 4;
$gameStor->phase=0; $gameStor->phase=0;
} }
} }
+7 -5
View File
@@ -61,7 +61,7 @@ $scenario = $gameStor->scenario_text;
$nationID = $generalObj->getNationID(); $nationID = $generalObj->getNationID();
if($nationID){ if($nationID){
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env'); $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->cacheValues(['notice', 'online_genenerals']); $nationStor->cacheAll();
} }
$valid = 0; $valid = 0;
@@ -79,9 +79,11 @@ if ($gameStor->fiction == 0) {
} }
if ($gameStor->npcmode == 0) { if ($gameStor->npcmode == 0) {
$npcmode = "불가능"; $npcmode = "불가능";
} else { } else if($gameStor->npcmode == 1){
$npcmode = "가능"; $npcmode = "가능";
$valid = 1; $valid = 1;
} else {
$npcmode = "선택 생성";
} }
$color = "cyan"; $color = "cyan";
$mapTheme = $gameStor->map_theme; $mapTheme = $gameStor->map_theme;
@@ -134,7 +136,7 @@ $(function(){
<body class="img_back"> <body class="img_back">
<div id="container"> <div id="container">
<div><?=allButton($gameStor->npcmode!=0)?></div> <div><?=allButton($gameStor->npcmode==1)?></div>
<table class="tb_layout bg0" style="width:1000px;"> <table class="tb_layout bg0" style="width:1000px;">
<tr height=50> <tr height=50>
<td colspan=5 id="server_title" align=center><font size=4>삼국지 모의전투 HiDCHe <?=$serverName.$serverCnt?>기 (<font color=cyan><?=$scenario?></font>)</font></td> <td colspan=5 id="server_title" align=center><font size=4>삼국지 모의전투 HiDCHe <?=$serverName.$serverCnt?>기 (<font color=cyan><?=$scenario?></font>)</font></td>
@@ -341,7 +343,7 @@ else if($session->userGrade == 4){
<button id="msg_submit">서신전달&amp;갱신</button><br> <button id="msg_submit">서신전달&amp;갱신</button><br>
내용 없이 '서신전달&amp;갱신' 누르면 메세지창이 갱신됩니다. 내용 없이 '서신전달&amp;갱신' 누르면 메세지창이 갱신됩니다.
</div> </div>
<div><?=allButton($gameStor->npcmode!=0)?></div> <div><?=allButton($gameStor->npcmode==1)?></div>
<div id="message_board"><div style="left:0;" class="board_side bg0"> <div id="message_board"><div style="left:0;" class="board_side bg0">
<div class="board_header bg0" id='public_talk_position'>전체 메시지(최고99자)</div> <div class="board_header bg0" id='public_talk_position'>전체 메시지(최고99자)</div>
<section class="public_message"> <section class="public_message">
@@ -361,7 +363,7 @@ else if($session->userGrade == 4){
<button type="button" class="load_old_message btn btn-secondary btn-block" data-msg_type="diplomacy">이전 메시지 불러오기</button> <button type="button" class="load_old_message btn btn-secondary btn-block" data-msg_type="diplomacy">이전 메시지 불러오기</button>
</section> </section>
</div></div> </div></div>
<div style="clear:left;"><?=allButton($gameStor->npcmode!=0)?><?=banner()?></div> <div style="clear:left;"><?=allButton($gameStor->npcmode==1)?><?=banner()?></div>
</div> </div>
<?php <?php
if ($con == 1) { if ($con == 1) {
+18 -1
View File
@@ -102,7 +102,7 @@ if($session->userGrade < 5 && !$allowReset){
</div> </div>
<div class="form-group row"> <div class="form-group row">
<label for="confirm_password" class="col-sm-3 col-form-label">시나리오 선택</label> <label for="scenario_sel" class="col-sm-3 col-form-label">시나리오 선택</label>
<div class="col-sm-9"> <div class="col-sm-9">
<select class="form-control" name="scenario" size="1" id="scenario_sel"> <select class="form-control" name="scenario" size="1" id="scenario_sel">
</select> </select>
@@ -138,6 +138,20 @@ if($session->userGrade < 5 && !$allowReset){
</div> </div>
</div> </div>
<div class="form-group row">
<label for="block_general_create" class="col-sm-3 col-form-label">장수 임의 생성</label>
<div class="col-sm-9">
<div id="block_general_create" class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="radio" name="block_general_create" value="0" checked>가능
</label>
<label class="btn btn-secondary active">
<input type="radio" name="block_general_create" value="1">불가
</label>
</div>
</div>
</div>
<div class="form-group row"> <div class="form-group row">
<label for="npcmode" class="col-sm-3 col-form-label">NPC 빙의</label> <label for="npcmode" class="col-sm-3 col-form-label">NPC 빙의</label>
<div class="col-sm-9"> <div class="col-sm-9">
@@ -148,6 +162,9 @@ if($session->userGrade < 5 && !$allowReset){
<label class="btn btn-secondary active"> <label class="btn btn-secondary active">
<input type="radio" name="npcmode" value="0" checked>불가 <input type="radio" name="npcmode" value="0" checked>불가
</label> </label>
<label class="btn btn-secondary">
<input type="radio" name="npcmode" value="2">선택 생성 가능
</label>
</div> </div>
</div> </div>
</div> </div>
+5 -4
View File
@@ -52,7 +52,7 @@ else if(
$now->getTimestamp() - $lastTurn->getTimestamp() > $reservedDate->getTimestamp() - $now->getTimestamp() $now->getTimestamp() - $lastTurn->getTimestamp() > $reservedDate->getTimestamp() - $now->getTimestamp()
){ ){
//정지 상태 & 중간 넘음 //정지 상태 & 중간 넘음
AppConf::getList()[DB::prefix()]->closeServer(); ServConfig::getServerList()[DB::prefix()]->closeServer();
$status = 'closed'; $status = 'closed';
} }
else if( else if(
@@ -60,12 +60,12 @@ else if(
$now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2 $now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2
){ ){
//천통 & 비정지 상태 & 2/3 넘음 //천통 & 비정지 상태 & 2/3 넘음
AppConf::getList()[DB::prefix()]->closeServer(); ServConfig::getServerList()[DB::prefix()]->closeServer();
$status = 'closed'; $status = 'closed';
} }
else if($reservedDate->getTimestamp() - $now->getTimestamp() <= 60*10){ else if($reservedDate->getTimestamp() - $now->getTimestamp() <= 60*10){
//어쨌든 간에 10분 남았다면. //어쨌든 간에 10분 남았다면.
AppConf::getList()[DB::prefix()]->closeServer(); ServConfig::getServerList()[DB::prefix()]->closeServer();
$status = 'closed'; $status = 'closed';
} }
@@ -85,6 +85,7 @@ $result = ResetHelper::buildScenario(
$options['scenario'], $options['scenario'],
$options['fiction'], $options['fiction'],
$options['extend'], $options['extend'],
$options['block_general_create'],
$options['npcmode'], $options['npcmode'],
$options['show_img_level'], $options['show_img_level'],
$options['tournament_trig'], $options['tournament_trig'],
@@ -96,6 +97,6 @@ $result = ResetHelper::buildScenario(
$result['affected']=1; $result['affected']=1;
$prefix = DB::prefix(); $prefix = DB::prefix();
AppConf::getList()[$prefix]->openServer(); ServConfig::getServerList()[$prefix]->openServer();
Json::die($result); Json::die($result);
@@ -4,6 +4,9 @@ namespace sammo;
include "lib.php"; include "lib.php";
include "func.php"; include "func.php";
WebUtil::requireAJAX();
$availableDieImmediately = false; $availableDieImmediately = false;
//로그인 검사 //로그인 검사
@@ -16,25 +19,31 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$general = $db->queryFirstRow('SELECT no,name,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID); $general = $db->queryFirstRow('SELECT no,name,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
if(!$general){ if(!$general){
header('location:b_myPage.php'); Json::die([
die(); 'result'=>false,
'reason'=>'장수가 없습니다.'
]);
} }
increaseRefresh("장수 삭제", 1); increaseRefresh("장수 삭제", 1);
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']); $gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
if($gameStor->turntime <= $gameStor->opentime){ if($gameStor->turntime > $gameStor->opentime){
//서버 가오픈시 할 수 있는 행동 Json::die([
if(addTurn($general['lastrefresh'], $gameStor->turnterm, 2) <= TimeUtil::now()){ 'result'=>false,
$availableDieImmediately = true; 'reason'=>'이미 서버가 시작되었습니다.'
} ]);
} }
if(!$availableDieImmediately){
header('location:b_myPage.php');
die();
}
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, 2);
if($targetTime > TimeUtil::now()){
$targetTimeShort = substr($targetTime, 0, 19);
Json::die([
'result'=>false,
'reason'=>"아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다."
]);
}
$generalObj = General::createGeneralObjFromDB($general['no']); $generalObj = General::createGeneralObjFromDB($general['no']);
@@ -46,4 +55,7 @@ $josaYi = JosaUtil::pick($generalName, '이');
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>"); $generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
$session->logoutGame(); $session->logoutGame();
header('location:..'); Json::die([
'result'=>true,
'reason'=>'success'
]);
+87
View File
@@ -0,0 +1,87 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$destGeneralID = Util::getPost('destGeneralID', 'int', 0);
if(!$destGeneralID || $destGeneralID <= 0){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 장수 코드입니다'
]);
}
$session = Session::requireGameLogin([])->setReadOnly();
$db = DB::db();
increaseRefresh("시뮬레이터 추출", 1);
$userID = Session::getUserID();
$me = $db->queryFirstRow('SELECT no,nation from general where owner=%i', $userID);
$nationID = $me['nation'];
$reqColumns = [
'nation',
'name', 'officer_level', 'explevel', 'injury',
'leadership', 'horse', 'strength', 'weapon', 'intel', 'book', 'item',
'rice', 'personal', 'special2',
'crew', 'crewtype',
'atmos', 'train', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'defence_train',
];
$reqRankColumns = [
'warnum', 'killnum', 'killcrew'
];
$dummyItems = [
'officer_level'=>1,
'horse'=>'None',
'weapon'=>'None',
'book'=>'None',
'item'=>'None',
'crew'=>0,
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE,
'rice'=>10000,
'train'=>GameConst::$maxTrainByCommand,
'atmos'=>GameConst::$maxTrainByCommand,
'dex1'=>0,
'dex2'=>0,
'dex3'=>0,
'dex4'=>0,
'dex5'=>0,
'defence_train'=>80,
'warnum'=>0,
'killnum'=>0,
'killcrew'=>0,
];
$rawDestGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no=%i', Util::formatListOfBackticks($reqColumns), $destGeneralID);
if($nationID == 0 || $rawDestGeneral['nation'] != $nationID){
foreach($dummyItems as $key=>$val){
$rawDestGeneral[$key] = $val;
}
}
else{
$rawRankValue = $db->queryAllLists('SELECT `type`, `value` FROM rank_data WHERE general_id = %i AND `type` IN %ls', $destGeneralID, $reqRankColumns);
foreach($rawRankValue as [$rankType, $rankValue]){
$rawDestGeneral[$rankType] = $rankValue;
}
}
foreach(['dex1', 'dex2', 'dex3', 'dex4', 'dex5'] as $dexKey){
$dex = $rawDestGeneral[$dexKey];
$rawDestGeneral[$dexKey] = getDexLevelList()[getDexLevel($dex)][0];
}
Json::die([
'result'=>true,
'reason'=>'success',
'general'=>$rawDestGeneral,
]);
+7
View File
@@ -70,6 +70,13 @@ foreach(
$nationTurnBrief = []; $nationTurnBrief = [];
foreach($nationTurnList as $officer_level=>$turnBrief){ foreach($nationTurnList as $officer_level=>$turnBrief){
if(!key_exists($officer_level, $generals)){ if(!key_exists($officer_level, $generals)){
$nationTurnBrief[$officer_level] = [
'name'=>null,
'turnTime'=>null,
'officerLevelText'=>getOfficerLevelText($officer_level, $nationLevel),
'npcType'=>null,
'turn'=>$turnBrief
];
continue; continue;
} }
$general = $generals[$officer_level]; $general = $generals[$officer_level];
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin([]);
$generalID = Session::getGeneralID();
$db = DB::db();
$rawList = Util::convertArrayToDict($db->query('SELECT no, name, npc, nation FROM general'), 'no');
$nationID = $rawList[$generalID]['nation'];
$result = [
'result'=>true,
'reason'=>'success',
'nationID'=>$nationID,
'generalID'=>$generalID,
'column'=>['no', 'name', 'npc']
];
$resultItem = [];
foreach(Util::arrayGroupBy($rawList, 'nation') as $subNationID=>$generals){
$subNation = [];
foreach($generals as $general){
$subNation[] = [$general['no'], $general['name'], $general['npc']];
}
$resultItem[$subNationID] = $subNation;
}
$result['list'] = $resultItem;
$result['nation'] = Util::convertArrayToDict($db->query('SELECT nation, name, color FROM nation'), 'nation');
Json::die($result);
+1 -1
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사 //로그인 검사
$session = Session::requireLogin(); $session = Session::requireLogin([]);
$userID = Session::getUserID(); $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
+94 -76
View File
@@ -1,4 +1,5 @@
<?php <?php
namespace sammo; namespace sammo;
//통합 세력장수&암행부 viewer //통합 세력장수&암행부 viewer
@@ -11,145 +12,162 @@ $session = Session::requireGameLogin([])->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
$db = DB::db(); $db = DB::db();
$reqType = Util::getPost('req', 'int', 1); $reqType = Util::getReq('req', 'int', 1);
$reqForce = Util::getPost('force', 'bool', false); $reqForce = Util::getReq('force', 'bool', false);
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("세력장수", 1); increaseRefresh("세력장수", 1);
$me = $db->queryFirstRow('SELECT con, turntime, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $userID); $me = $db->queryFirstRow('SELECT con, turntime, belong, nation, officer_level, permission, penalty FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']); $con = checkLimit($me['con']);
if ($con >= 2) { if ($con >= 2) {
Json::die([ Json::die([
'result'=>false, 'result' => false,
'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.' 'reason' => '접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
]); ]);
} }
$nationID = $me['nation']; $nationID = $me['nation'];
$permission = checkSecretPermission($me, true); $permission = checkSecretPermission($me, true);
if($reqForce && $reqType > $permission){ if ($reqForce && $reqType > $permission) {
Json::die([ Json::die([
'result'=>false, 'result' => false,
'reason'=>'권한이 부족합니다.' 'reason' => '권한이 부족합니다.'
]); ]);
} }
$permission = min($reqType, $permission); $permission = min($reqType, $permission);
$nationArr = getNationStaticInfo($nationID); $nationArr = getNationStaticInfo($nationID);
$viewColumns = [ $viewColumns = [
'no'=>1, 'no' => 0,
'name'=>1, 'name' => 0,
'owner_name'=>9, 'owner_name' => 9,
'nation'=>1, 'nation' => 0,
'city'=>1, 'city' => 1,
'officer_level'=>9, 'officer_level' => 2,
'npc'=>1, 'officer_city' => 2,
'defence_train'=>2, 'npc' => 0,
'troop'=>2, 'defence_train' => 2,
'injury'=>1, 'troop' => 2,
'leadership'=>1, 'injury' => 0,
'strength'=>1, 'leadership' => 0,
'intel'=>1, 'strength' => 0,
'experience'=>1, 'intel' => 0,
'explevel'=>1, 'experience' => 1,
'dedication'=>1, 'explevel' => 0,
'dedlevel'=>1, 'dedication' => 1,
'gold'=>1, 'dedlevel' => 0,
'rice'=>1, 'gold' => 0,
'crewtype'=>2, 'rice' => 0,
'crew'=>2, 'crewtype' => 2,
'train'=>2, 'crew' => 2,
'atmos'=>2, 'train' => 2,
'killturn'=>1, 'atmos' => 2,
'turntime'=>2, 'killturn' => 0,
'picture'=>1, 'turntime' => 2,
'imgsvr'=>1, 'picture' => 0,
'age'=>1, 'imgsvr' => 0,
'special'=>1, 'age' => 0,
'special2'=>1, 'special' => 0,
'personal'=>1, 'special2' => 0,
'horse'=>3, 'personal' => 0,
'weapon'=>3, 'belong' => 0,
'book'=>3, 'horse' => 2,
'item'=>3, 'weapon' => 2,
'connect'=>1 'book' => 2,
'item' => 2,
'connect' => 0
]; ];
$customViewColumns = [ $customViewColumns = [
'officerLevel'=>1, 'officerLevel' => 0,
'officerLevelText'=>1, 'officerLevelText' => 0,
'lbonus'=>1, 'lbonus' => 0,
'ownerName'=>1, 'ownerName' => 0,
'honorText'=>1, 'honorText' => 0
'expLevelText'=>1,
]; ];
function getOfficerLevel($rawGeneral)
{
global $permission;
$level = $rawGeneral['officer_level'];
if ($level >= 5) {
return $level;
}
if ($permission > 1) {
return $level;
}
return 1;
}
$specialViewFilter = [ $specialViewFilter = [
'officerLevel'=>function($rawGeneral){ 'officerLevel' => function ($rawGeneral){
return $rawGeneral['officer_level']; return getOfficerLevel($rawGeneral);
}, },
'special'=>function($rawGeneral){ 'special' => function ($rawGeneral) {
return getGeneralSpecialDomesticName($rawGeneral['special']); return getGeneralSpecialDomesticName($rawGeneral['special']);
}, },
'special2'=>function($rawGeneral){ 'special2' => function ($rawGeneral) {
return getGeneralSpecialWarName($rawGeneral['special2']); return getGeneralSpecialWarName($rawGeneral['special2']);
}, },
'personal'=>function($rawGeneral){ 'personal' => function ($rawGeneral) {
return getGenChar($rawGeneral['personal']); return getGenChar($rawGeneral['personal']);
}, },
'lbonus'=>function($rawGeneral)use($nationArr){ 'lbonus' => function ($rawGeneral) use ($nationArr) {
return calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']); return calcLeadershipBonus($rawGeneral['officer_level'], $nationArr['level']);
}, },
'ownerName'=>function($rawGeneral){ 'ownerName' => function ($rawGeneral) {
if($rawGeneral['npc']!=1){ if ($rawGeneral['npc'] != 1) {
return null; return null;
} }
return $rawGeneral['owner_name']; return $rawGeneral['owner_name'];
}, },
'officerLevelText'=>function($rawGeneral)use($nationArr){ 'officerLevelText' => function ($rawGeneral) use ($nationArr) {
return getOfficerLevelText($rawGeneral['officer_level'], $nationArr['level']); $level = getOfficerLevel($rawGeneral);
return getOfficerLevelText($level, $nationArr['level']);
}, },
'honorText'=>function($rawGeneral){ 'honorText' => function ($rawGeneral) {
return getHonor($rawGeneral['experience']); return getHonor($rawGeneral['experience']);
}, },
'dedLevelText'=>function($rawGeneral){ 'dedLevelText' => function ($rawGeneral) {
return getDedLevelText($rawGeneral['dedLevel']); return getDedLevelText($rawGeneral['dedLevel']);
}, },
'turntime'=>function($rawGeneral){ 'turntime' => function ($rawGeneral) {
//'0000-00-00 11:23'; //'0000-00-00 11:23';
return substr($rawGeneral['turntime'], 11, 5); return substr($rawGeneral['turntime'], 11, 5);
} }
]; ];
$queryColumns = General::mergeQueryColumn(array_keys($viewColumns), 1); [$queryColumns, $rankColumns] = General::mergeQueryColumn(array_keys($viewColumns), 1);
$rawGeneralList = Util::convertArrayToDict($db->queryAllLists('SELECT %lb from general WHERE nation = %i', $queryColumns, $nationID), 'no'); $rawGeneralList = Util::convertArrayToDict($db->query('SELECT %l from general WHERE nation = %i', Util::formatListOfBackticks($queryColumns), $nationID), 'no');
$resultColumns = []; $resultColumns = [];
foreach($viewColumns as $column=>$reqPermission){ foreach ($viewColumns as $column => $reqPermission) {
if($reqPermission > $permission){ if ($reqPermission > $permission) {
continue; continue;
} }
$resultColumns[] = $column; $resultColumns[] = $column;
} }
foreach($customViewColumns as $column=>$reqPermission){ foreach ($customViewColumns as $column => $reqPermission) {
if($reqPermission > $permission){ if ($reqPermission > $permission) {
continue; continue;
} }
$resultColumns[] = $column; $resultColumns[] = $column;
} }
foreach($rawGeneralList as $rawGeneral){ foreach ($rawGeneralList as $rawGeneral) {
//General 생성? //General 생성?
$item = []; $item = [];
foreach($resultColumns as $column){ foreach ($resultColumns as $column) {
$value = $rawGeneral[$column]; if (key_exists($column, $specialViewFilter)) {
if(key_exists($column, $specialViewFilter)){
$value = $specialViewFilter[$column]($rawGeneral); $value = $specialViewFilter[$column]($rawGeneral);
} }
else{
$value = $rawGeneral[$column];
}
$item[] = $value; $item[] = $value;
} }
@@ -157,9 +175,9 @@ foreach($rawGeneralList as $rawGeneral){
} }
$result = [ $result = [
'result'=>true, 'result' => true,
'column'=>$resultColumns, 'column' => $resultColumns,
'list'=>$generalList, 'list' => $generalList,
]; ];
Json::die($result); Json::die($result);
+1 -1
View File
@@ -37,7 +37,7 @@ list(
$npcmode $npcmode
) = $gameStor->getValuesAsArray(['maxgeneral', 'turnterm', 'npcmode']); ) = $gameStor->getValuesAsArray(['maxgeneral', 'turnterm', 'npcmode']);
if(!$npcmode){ if($npcmode!=1){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'빙의 가능한 서버가 아닙니다' 'reason'=>'빙의 가능한 서버가 아닙니다'
+90
View File
@@ -0,0 +1,90 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
function sortTokens(&$tokens){
usort($tokens, function($lhs, $rhs){
return array_sum($lhs['dex'])<=>array_sum($rhs['dex']);
});
}
function putInfoText(&$info){
if(key_exists('specialDomestic', $info)){
$class = buildGeneralSpecialDomesticClass($info['specialDomestic']);
$info['specialDomesticName'] = $class->getName();
$info['specialDomesticInfo'] = $class->getInfo();
}
if(key_exists('specialWar', $info)){
$class = buildGeneralSpecialDomesticClass($info['specialWar']);
$info['specialWarName'] = $class->getName();
$info['specialWarInfo'] = $class->getInfo();
}
}
$session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID();
$oNow = new \DateTimeImmutable();
$now = $oNow->format('Y-m-d H:i:s');
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$npcmode = $gameStor->getValue('npcmode');
if($npcmode!=2){
Json::die([
'result'=>false,
'reason'=>'선택 가능한 서버가 아닙니다'
]);
}
$rawGeneral = $db->queryFirstRow('SELECT no, aux FROM general WHERE `owner` = %i', $userID);
if($rawGeneral){
$generalAux = Json::decode($rawGeneral['aux']);
if(key_exists('next_change', $generalAux)&& $generalAux['next_change'] > $now){
Json::die([
'result'=>false,
'reason'=>'아직 다시 고를 수 없습니다'
]);
}
}
$tokens = $db->query('SELECT unique_name, reserved_until, info FROM `select_pool` WHERE `owner`=%i AND `reserved_until`>=%s', $userID, $now);
if($tokens){
$pick = [];
$valid_until = null;
$specialInfo = [];
foreach($tokens as $token){
$valid_until = $token['reserved_until'];
$info = Json::decode($token['info']);
putInfoText($info);
$info['uniqueName'] = $token['unique_name'];
$pick[] = $info;
}
sortTokens($pick);//좀 무식하지만..
Json::die([
'result'=>true,
'pick'=>$pick,
'validUntil'=>$valid_until
]);
}
$pick = [];
$valid_until = null;
foreach(pickGeneralFromPool($db, $userID, 14) as $pickObj){
$valid_until = $pickObj->getValidUntil();
$info = $pickObj->getInfo();
putInfoText($info);
$pick[] = $info;
}
sortTokens($pick);//좀 무식하지만..
Json::die([
'result'=>true,
'pick'=>$pick,
'validUntil'=>$valid_until
]);
+7 -1
View File
@@ -57,6 +57,7 @@ $v->rule('required', [
'scenario', 'scenario',
'fiction', 'fiction',
'extend', 'extend',
'block_general_create',
'join_mode', 'join_mode',
'npcmode', 'npcmode',
'show_img_level', 'show_img_level',
@@ -67,6 +68,7 @@ $v->rule('required', [
'scenario', 'scenario',
'fiction', 'fiction',
'extend', 'extend',
'block_general_create',
'npcmode', 'npcmode',
'show_img_level', 'show_img_level',
'tournament_trig', 'tournament_trig',
@@ -109,11 +111,13 @@ $scenario = (int)$_POST['scenario'];
$fiction = (int)$_POST['fiction']; $fiction = (int)$_POST['fiction'];
$extend = (int)$_POST['extend']; $extend = (int)$_POST['extend'];
$npcmode = (int)$_POST['npcmode']; $npcmode = (int)$_POST['npcmode'];
$block_general_create = (bool)$_POST['block_general_create'];
$show_img_level = (int)$_POST['show_img_level']; $show_img_level = (int)$_POST['show_img_level'];
$tournament_trig = (int)$_POST['tournament_trig']; $tournament_trig = (int)$_POST['tournament_trig'];
$join_mode = $_POST['join_mode']; $join_mode = $_POST['join_mode'];
$autorun_user_minutes = (int)$_POST['autorun_user_minutes']; $autorun_user_minutes = (int)$_POST['autorun_user_minutes'];
$autorun_user_options = []; $autorun_user_options = [];
foreach(Util::getPost('autorun_user', 'array_string', []) as $autorun_option){ foreach(Util::getPost('autorun_user', 'array_string', []) as $autorun_option){
$autorun_user_options[$autorun_option] = 1; $autorun_user_options[$autorun_option] = 1;
} }
@@ -165,6 +169,7 @@ if($reserve_open){
'scenarioName'=>$scenarioObj->getTitle(), 'scenarioName'=>$scenarioObj->getTitle(),
'fiction'=>$fiction, 'fiction'=>$fiction,
'extend'=>$extend, 'extend'=>$extend,
'block_general_create'=>$block_general_create,
'npcmode'=>$npcmode, 'npcmode'=>$npcmode,
'show_img_level'=>$show_img_level, 'show_img_level'=>$show_img_level,
'tournament_trig'=>$tournament_trig, 'tournament_trig'=>$tournament_trig,
@@ -187,7 +192,7 @@ if($reserve_open){
'options'=>Json::encode($reserveInfo), 'options'=>Json::encode($reserveInfo),
'date'=>$open_date 'date'=>$open_date
]); ]);
AppConf::getList()[DB::prefix()]->closeServer(); ServConfig::getServerList()[DB::prefix()]->closeServer();
Json::die([ Json::die([
'result'=>true, 'result'=>true,
'reason'=>'예약' 'reason'=>'예약'
@@ -200,6 +205,7 @@ Json::die(ResetHelper::buildScenario(
$scenario, $scenario,
$fiction, $fiction,
$extend, $extend,
$block_general_create,
$npcmode, $npcmode,
$show_img_level, $show_img_level,
$tournament_trig, $tournament_trig,
+1 -1
View File
@@ -95,7 +95,7 @@ if($result !== true){
ResetHelper::clearDB(); ResetHelper::clearDB();
AppConf::getList()[$prefix]->closeServer(); ServConfig::getServerList()[$prefix]->closeServer();
Json::die([ Json::die([
'result'=>true, 'result'=>true,
+83
View File
@@ -0,0 +1,83 @@
<?php
namespace sammo;
use Nette\Caching\Cache;
include "lib.php";
include "func.php";
if(!class_exists('\\sammo\\UniqueConst')){
Json::die([
'result'=>false,
'reason'=>'서버 초기화되지 않음'
]);
}
if(!prepareDir('data/file_cache')){
Json::die([
'result'=>false,
'reason'=>'cache 불가'
]);
}
$storage = new \Nette\Caching\Storages\FileStorage('data/file_cache');
$cache = new Cache($storage);
$serverID = UniqueConst::$serverID;
$mapInfo = $cache->load("recent_map");
//로그인 검사
$now = time();
if($mapInfo && ($now - $mapInfo['timestamp'] < 600)){
$mapEtag = $mapInfo['etag'];
$mapModified = $mapInfo['timestamp'];
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $mapModified)." GMT");
header("Etag: $mapEtag");
if (
strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']??'2000-01-01') === $mapModified ||
trim($_SERVER['HTTP_IF_NONE_MATCH']??'') === $mapEtag
) {
header("HTTP/1.1 304 Not Modified");
die();
}
Json::die($mapInfo['data'], 0);
}
$defaultPost = [
'year' => null,
'month' => null,
'aux' => null,
'neutralView' => true,
'showMe' => false,
];
$history = formatHistoryToHTML(getGlobalHistoryLogRecent(10));
$rawMap = getWorldMap([
'year' => null,
'month' => null,
'aux' => null,
'neutralView' => true,
'showMe' => false,
]);
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$mapTheme = $gameStor->map_theme ?? 'che';
$rawMap['history'] = $history;
$rawMap['theme'] = $mapTheme;
$etag = hash('sha256', $serverID.$now);
$map = [
'etag'=>$etag,
'timestamp'=>$now,
'data'=>$rawMap,
];
$cache->save("recent_map", $map);
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $now)." GMT");
header("Etag: $etag");
Json::die($map['data'], 0);
+1
View File
@@ -40,6 +40,7 @@ if($action === '추방' && $destGeneralID==0){
if($destGeneralID==0){ if($destGeneralID==0){
$general = new DummyGeneral(true); $general = new DummyGeneral(true);
$general->setVar('nation', $nationID);
} }
else{ else{
$general = General::createGeneralObjFromDB($destGeneralID, [ $general = General::createGeneralObjFromDB($destGeneralID, [
+1 -1
View File
@@ -59,7 +59,7 @@ list(
$npcmode $npcmode
) = $gameStor->getValuesAsArray(['year', 'month', 'maxgeneral', 'npcmode']); ) = $gameStor->getValuesAsArray(['year', 'month', 'maxgeneral', 'npcmode']);
if(!$npcmode){ if($npcmode!=1){
Json::die([ Json::die([
'result'=>false, 'result'=>false,
'reason'=>'빙의 가능한 서버가 아닙니다' 'reason'=>'빙의 가능한 서버가 아닙니다'
+167
View File
@@ -0,0 +1,167 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$pick = Util::getPost('pick');
$leadership = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$strength = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$intel = Util::getPost('leadership', 'int', GameConst::$defaultStatMin);
$personal = Util::getPost('personal', 'string', null);
$use_own_picture = Util::getPost('use_own_picture', 'bool', false);
if(!$pick){
Json::die([
'result'=>false,
'reason'=>'장수를 선택하지 않았습니다'
]);
}
$session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$rootDB = RootDB::db();
$oNow = new \DateTimeImmutable();
$now = $oNow->format('Y-m-d H:i:s');
$hasGeneralID = $db->queryFirstField('SELECT no FROM general WHERE owner = %i', $userID);
if($hasGeneralID){
Json::die([
'result'=>false,
'reason'=>'이미 장수를 생성했습니다.'
]);
}
$env = $gameStor->getValues(['startyear', 'year', 'month', 'maxgeneral', 'npcmode', 'show_img_level', 'icon_path', 'turnterm', 'turntime']);
$env['fiction'] = false;
$npcmode = $env['npcmode'];
$maxgeneral = $env['maxgeneral'];
if($npcmode!=2){
Json::die([
'result'=>false,
'reason'=>'선택 가능한 서버가 아닙니다'
]);
}
$selectInfo = $db->queryFirstField('SELECT info FROM select_pool WHERE `owner` = %i AND `reserved_until`>=%s AND `unique_name`=%s', $userID, $now, $pick);
if(!$selectInfo){
Json::die([
'result'=>false,
'reason'=>'유효한 장수 목록이 없습니다.'
]);
}
$selectInfo = Json::decode($selectInfo);
$ownerInfo = RootDB::db()->queryFirstRow('SELECT `name`,`picture`,`imgsvr` FROM member WHERE `NO`=%i',$userID);
if(!$ownerInfo){
Json::die([
'result'=>false,
'reason'=>'멤버 정보를 가져오지 못했습니다.'
]);
}
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
if ($gencount >= $maxgeneral) {
Json::die([
'result'=>false,
'reason'=>'더 이상 등록 할 수 없습니다.'
]);
}
$poolClass = getGeneralPoolClass(GameConst::$targetGeneralPool);
/** @var AbsGeneralPool */
$pickedGeneral = new $poolClass($db, $selectInfo, $now);
$builder = $pickedGeneral->getGeneralBuilder();
foreach(GameConst::$generalPoolAllowOption as $allowOption){
if($allowOption == 'stat'){
$leadership = Util::valueFit($leadership, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
$strength = Util::valueFit($strength, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
$intel = Util::valueFit($intel, GameConst::$defaultStatMin, GameConst::$defaultStatMax);
if($leadership + $strength + $intel > GameConst::$defaultStatTotal){
Json::die([
'result'=>false,
'reason'=>'스탯의 총 합이 올바르지 않습니다.'
]);
}
$builder->setStat($leadership, $strength, $intel);
}
else if($allowOption == 'picture' && $use_own_picture){
$builder->setPicture($ownerInfo['imgsvr'], $ownerInfo['picture']);
}
else if($allowOption == 'ego'){
if(!$personal || $personal == 'Random'){
$personal = Util::choiceRandom(GameConst::$availablePersonality);
}
if(!array_search($personal, GameConst::$availablePersonality)){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 성격입니다.'
]);
}
$builder->setEgo($personal);
}
}
$builder->setOwner($userID);
$builder->setKillturn(5);
$builder->setNPCType(0);
$builder->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $env['turnterm']));
$builder->fillRemainSpecAsZero($env);
$builder->build($env);
$generalID = $builder->getGeneralID();
if(!$generalID){
Json::die([
'result'=>false,
'reason'=>'장수 등록에 실패했습니다.'
]);
}
$pickedGeneral->occupyGeneralName();
$db->update('select_pool',[
'owner'=>null,
'reserved_until'=>null,
], '(owner=%i or reserved_until < %s) AND general_id is NULL', $userID, $now);
$userNick = $ownerInfo['name'];
$josaYi = JosaUtil::pick($userNick, '이');
$generalName = $builder->getGeneralName();
$josaRo = JosaUtil::pick($generalName, '로');
$cityName = CityConst::byID($builder->getCityID())->name;
$logger = new ActionLogger($generalID, 0, $env['year'], $env['month']);
$logger->pushGeneralHistoryLog("<Y>{$generalName}</>, <G>{$cityName}</>에서 등장");
$logger->pushGlobalActionLog("<G><b>{$cityName}</b></>에서 <Y>{$userNick}</>{$josaYi} <Y>{$generalName}</>{$josaRo} 등장합니다.");
$logger->flush();
pushAdminLog(["가입 : {$userID} // {$session->userName} // {$pick} // ".getenv("REMOTE_ADDR")]);
$rootDB->insert('member_log', [
'member_no' => $userID,
'date'=>TimeUtil::now(),
'action_type'=>'make_general',
'action'=>Json::encode([
'server'=>DB::prefix(),
'type'=>'select',
'generalID'=>$generalID,
'generalName'=>$generalName
])
]);
Json::die([
'result'=>true,
'reason'=>'success'
]);
+6 -5
View File
@@ -43,7 +43,7 @@ $session = Session::requireLogin([
'game'=>null, 'game'=>null,
'me'=>null 'me'=>null
])->setReadOnly(); ])->setReadOnly();
$userID = Session::getUserID(); $userID = $session->userID;
if(!class_exists('\\sammo\\DB')){ if(!class_exists('\\sammo\\DB')){
Json::die([ Json::die([
@@ -91,7 +91,8 @@ if(file_exists(__DIR__.'/.htaccess')){
'scenarioName'=>$options['scenarioName'], 'scenarioName'=>$options['scenarioName'],
'turnterm'=>$options['turnterm'], 'turnterm'=>$options['turnterm'],
'fictionMode'=>($options['fiction']?'가상':'사실'), 'fictionMode'=>($options['fiction']?'가상':'사실'),
'npcMode'=>($options['npcmode']?'가능':'불가'), 'block_general_create'=>(!!$options['block_general_create']),
'npcMode'=>([0=>'불가',1=>'가능',2=>'선택 생성'][$options['npcmode']]),
'openDatetime'=>$reserved['date'], 'openDatetime'=>$reserved['date'],
'starttime'=>$options['starttime'], 'starttime'=>$options['starttime'],
'gameConf'=>$options['gameConf'], 'gameConf'=>$options['gameConf'],
@@ -104,7 +105,7 @@ if(file_exists(__DIR__.'/.htaccess')){
//TODO: 천통시에도 예약 오픈 알림이 필요..? //TODO: 천통시에도 예약 오픈 알림이 필요..?
$admin = $gameStor->getValues(['isunited', 'npcmode', 'year', 'month', 'scenario', 'scenario_text', 'maxgeneral', 'turnterm', 'opentime', 'turntime', 'join_mode', 'fiction', 'autorun_user']); $admin = $gameStor->getValues(['isunited', 'npcmode', 'year', 'month', 'scenario', 'scenario_text', 'maxgeneral', 'turnterm', 'opentime', 'turntime', 'join_mode', 'fiction', 'block_general_create', 'autorun_user']);
$admin['maxUserCnt'] = $admin['maxgeneral']; $admin['maxUserCnt'] = $admin['maxgeneral'];
$admin['npcMode'] = $admin['npcmode']; $admin['npcMode'] = $admin['npcmode'];
$admin['turnTerm'] = $admin['turnterm']; $admin['turnTerm'] = $admin['turnterm'];
@@ -124,8 +125,8 @@ $admin['scenario'] = $admin['scenario_text'];
$admin['userCnt'] = $genCnt; $admin['userCnt'] = $genCnt;
$admin['npcCnt'] = $npcCnt; $admin['npcCnt'] = $npcCnt;
$admin['nationCnt'] = $nationCnt; $admin['nationCnt'] = $nationCnt;
$admin['block_general_create'] = !!$admin['block_general_create'];
$admin['npcMode'] = $admin['npcMode']?'가능':'불가'; $admin['npcMode'] = [0=>'불가',1=>'가능',2=>'선택 생성'][$admin['npcMode']];
$admin['fictionMode'] = $admin['fiction']?'가상':'사실'; $admin['fictionMode'] = $admin['fiction']?'가상':'사실';
$otherTextInfo = []; $otherTextInfo = [];
+2
View File
@@ -8,6 +8,8 @@ WebUtil::requireAJAX();
$session = Session::requireGameLogin([])->setReadOnly(); $session = Session::requireGameLogin([])->setReadOnly();
increaseRefresh("사령턴 입력", 0);
$generalID = $session->generalID; $generalID = $session->generalID;
+2
View File
@@ -8,6 +8,8 @@ WebUtil::requireAJAX();
$session = Session::requireGameLogin([])->setReadOnly(); $session = Session::requireGameLogin([])->setReadOnly();
increaseRefresh("턴 입력", 0);
$generalID = $session->generalID; $generalID = $session->generalID;
$action = Util::getPost('action', 'string'); $action = Util::getPost('action', 'string');
+82
View File
@@ -0,0 +1,82 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$session = Session::requireGameLogin([])->setReadOnly();
$userID = Session::getUserID();
$generalID = $session->generalID;
increaseRefresh("내정보 수정", 0);
$action = Util::getPost('action');
$tnmt = Util::getPost('tnmt', 'int', 1);
$defence_train = Util::getPost('defence_train', 'int', 80);
$use_treatment = Util::getPost('use_treatment', 'int', 10);
$use_auto_nation_turn = Util::getPost('use_auto_nation_turn', 'int', 1);
//$detachNPC = Util::getPost('detachNPC', 'bool');
$detachNPC = false;
if ($defence_train <= 40) {
$defence_train = 40;
}
if($defence_train <= 90){
$defence_train = Util::round($defence_train, -1);
}
else{
$defence_train = 999;
}
if($tnmt < 0 || $tnmt > 1){
$tnmt = 1;
}
$db = DB::db();
$me = General::createGeneralObjFromDB($generalID);
if($defence_train != $me->getVar('defence_train')){
if($defence_train == 999){
$me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train);
$me->increaseVarWithLimit('train', -3, 20);
$me->increaseVarWithLimit('atmos', -3, 20);
}
else{
$me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train);
}
}
$me->setAuxVar('use_treatment', Util::valueFit($use_treatment, 10, 100));
if($use_auto_nation_turn != $me->getAuxVar('use_auto_nation_turn')){
$me->setAuxVar('use_auto_nation_turn', $use_auto_nation_turn);
}
if($me->getVar('tnmt') != $tnmt){
$me->setVar('tnmt', $tnmt);
}
if($me->getNPCType() == 1 && $detachNPC){
$turnterm = $gameStor->turnterm;
if($turnterm < 10){
$targetKillTurn = 30 / $turnterm;
}
else{
$targetKillTurn = 60 / $turnterm;
}
$me->setVar('killturn', $targetKillTurn);
}
$me->applyDB($db);
Json::die([
'result'=>true,
'reason'=>'success'
]);
+2 -6
View File
@@ -10,6 +10,7 @@ $session = Session::requireGameLogin([])->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
$generalID = $session->generalID; $generalID = $session->generalID;
increaseRefresh("NPC 정책 수정", 0);
$type = Util::getPost('type', 'string'); $type = Util::getPost('type', 'string');
$data = Util::getPost('data', 'string'); $data = Util::getPost('data', 'string');
@@ -47,12 +48,7 @@ if (!$nationID) {
'reason'=>'국가에 소속되어있지 않습니다.', 'reason'=>'국가에 소속되어있지 않습니다.',
]); ]);
} }
if ($me['officer_level'] < 5) {
Json::die([
'result'=>false,
'reason'=>'수뇌가 아닙니다.',
]);
}
$permission = checkSecretPermission($me); $permission = checkSecretPermission($me);
if ($permission < 3) { if ($permission < 3) {
Json::die([ Json::die([
+20 -4
View File
@@ -9,6 +9,8 @@ WebUtil::requireAJAX();
$session = Session::requireLogin([])->setReadOnly(); $session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID(); $userID = Session::getUserID();
increaseRefresh("시뮬레이터", 0);
$query = Util::getPost('query'); $query = Util::getPost('query');
if($query === null){ if($query === null){
Json::die([ Json::die([
@@ -85,12 +87,13 @@ $generalCheck = [
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train', 'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item', 'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
'recent_war' 'recent_war', 'warnum', 'killnum', 'killcrew',
], ],
'integer'=>[ 'integer'=>[
'no', 'nation', 'crew', 'crewtype', 'atmos', 'train', 'no', 'nation', 'crew', 'crewtype', 'atmos', 'train',
'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp', 'intel', 'intel_exp', 'strength', 'strength_exp', 'injury', 'leadership', 'leadership_exp',
'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5', 'explevel', 'experience', 'dedication', 'officer_level', 'officer_city', 'gold', 'rice', 'dex1', 'dex2', 'dex3', 'dex4', 'dex5',
'warnum', 'killnum', 'killcrew',
], ],
'min'=>[ 'min'=>[
['no', 1], ['no', 1],
@@ -107,6 +110,9 @@ $generalCheck = [
['dex3', 0], ['dex3', 0],
['dex4', 0], ['dex4', 0],
['dex5', 0], ['dex5', 0],
['warnum', 0],
['killnum', 0],
['killcrew', 0],
], ],
'between'=>[ 'between'=>[
['train', [40, GameConst::$maxTrainByWar]], ['train', [40, GameConst::$maxTrainByWar]],
@@ -146,7 +152,8 @@ foreach($rawDefenderList as $idx=>$rawDefenderGeneral){
'reason'=>"[수비자{$idx}]".$v->errorStr() 'reason'=>"[수비자{$idx}]".$v->errorStr()
]); ]);
} }
$defenderList[] = new General($rawDefenderGeneral, null, $rawDefenderCity, $rawAttackerNation, $year, $month, true);
$defenderList[] = new General($rawDefenderGeneral, extractRankVar($rawDefenderGeneral), $rawDefenderCity, $rawAttackerNation, $year, $month, true);
} }
@@ -271,6 +278,15 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->startyear; $startYear = $gameStor->startyear;
$cityRate = Util::round(($year - $startYear) / 1.5) + 60; $cityRate = Util::round(($year - $startYear) / 1.5) + 60;
function extractRankVar(array $rawVal):array{
$rankVars = [];
foreach($rawVal as $rawKey=>$rawVal){
if(key_exists($rawKey, General::RANK_COLUMN)){
$rankVars[$rawKey] = $rawVal;
}
}
return $rankVars;
}
function simulateBattle( function simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation, $rawAttacker, $rawAttackerCity, $rawAttackerNation,
@@ -278,7 +294,7 @@ function simulateBattle(
$startYear, $year, $month, $cityRate $startYear, $year, $month, $cityRate
){ ){
$attacker = new WarUnitGeneral( $attacker = new WarUnitGeneral(
new General($rawAttacker, null, $rawAttackerCity, $rawAttackerNation, $year, $month), new General($rawAttacker, extractRankVar($rawAttacker), $rawAttackerCity, $rawAttackerNation, $year, $month),
$rawAttackerNation, $rawAttackerNation,
true true
); );
@@ -310,7 +326,7 @@ function simulateBattle(
return null; return null;
} }
$defenderObj = new General($iterDefender->current(), null, $rawDefenderCity, $rawDefenderNation, $year, $month); $defenderObj = new General($iterDefender->current(), extractRankVar($iterDefender->current()), $rawDefenderCity, $rawDefenderNation, $year, $month);
if(extractBattleOrder($defenderObj) <= 0){ if(extractBattleOrder($defenderObj) <= 0){
return null; return null;
} }
+2
View File
@@ -15,6 +15,8 @@ $troop = Util::getPost('troop', 'int');
$session = Session::requireGameLogin([])->setReadOnly(); $session = Session::requireGameLogin([])->setReadOnly();
$userID = $session::getUserID(); $userID = $session::getUserID();
increaseRefresh("부대명령", 0);
$db = DB::db(); $db = DB::db();
$me = $db->queryFirstRow('SELECT `no`, name, nation, troop FROM general WHERE `owner`=%i', $userID); $me = $db->queryFirstRow('SELECT `no`, name, nation, troop FROM general WHERE `owner`=%i', $userID);
+150
View File
@@ -0,0 +1,150 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$pick = Util::getPost('pick');
if(!$pick){
Json::die([
'result'=>false,
'reason'=>'장수를 선택하지 않았습니다'
]);
}
$session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$rootDB = RootDB::db();
$oNow = new \DateTimeImmutable();
$now = $oNow->format('Y-m-d H:i:s');
$generalID = $db->queryFirstField('SELECT no FROM general WHERE owner = %i', $userID);
if(!$generalID){
Json::die([
'result'=>false,
'reason'=>'장수가 생성하지 않았습니다. 이미 사망하지 않았는지 확인해보세요.'
]);
}
list(
$year,
$month,
$maxgeneral,
$npcmode,
$turnterm
) = $gameStor->getValuesAsArray(['year', 'month', 'maxgeneral', 'npcmode', 'turnterm']);
if($npcmode!=2){
Json::die([
'result'=>false,
'reason'=>'선택 가능한 서버가 아닙니다'
]);
}
$info = $db->queryFirstField('SELECT info FROM select_pool WHERE `owner` = %i AND `reserved_until`>=%s AND `unique_name`=%s', $userID, $now, $pick);
if(!$info){
Json::die([
'result'=>false,
'reason'=>'유효한 장수 목록이 없습니다.'
]);
}
$ownerInfo = RootDB::db()->queryFirstRow('SELECT `name`,`picture`,`imgsvr` FROM member WHERE `NO`=%i',$userID);
if(!$ownerInfo){
Json::die([
'result'=>false,
'reason'=>'멤버 정보를 가져오지 못했습니다.'
]);
}
$info = Json::decode($info);
$generalObj = General::createGeneralObjFromDB($generalID);
$oldGeneralName = $generalObj->getName();
$db->update('select_pool', [
'general_id'=>-$generalID,
'owner'=>null,
'reserved_until'=>null
], 'unique_name=%s AND `reserved_until` IS NOT NULL AND owner = %i', $info['uniqueName'], $userID);
if($db->affectedRows()==0){
Json::die([
'result'=>false,
'reason'=>'동시성 제어에 문제가 발생했습니다. 버그 제보를 부탁드립니다.'
]);
}
$db->update('select_pool', [
'general_id'=>null,
'owner'=>null,
'reserved_until'=>null,
], 'unique_name != %s AND general_id = %i', $info['uniqueName'], $generalID);
$db->update('select_pool', [
'general_id'=>$generalID,
], 'general_id=%i', -$generalID);
if($db->affectedRows()==0){
Json::die([
'result'=>false,
'reason'=>'장수 선택 과정에 문제가 발생했습니다.. 버그 제보를 부탁드립니다.'
]);
}
$db->update('select_pool',[
'owner'=>null,
'reserved_until'=>null,
], '(owner=%i or reserved_until < %s) AND general_id is NULL', $userID, $now);
if(key_exists('leadership', $info)){
$generalObj->updateVar('leadership', $info['leadership']);
$generalObj->updateVar('strength', $info['strength']);
$generalObj->updateVar('intel', $info['intel']);
}
if(key_exists('picture', $info)){
$generalObj->updateVar('imgsvr', $info['imgsvr']);
$generalObj->updateVar('picture', $info['picture']);
}
if(key_exists('generalName', $info)){
$generalObj->updateVar('name', $info['generalName']);
}
if(key_exists('dex', $info)){
$generalObj->updateVar('dex1', $info['dex'][0]);
$generalObj->updateVar('dex2', $info['dex'][1]);
$generalObj->updateVar('dex3', $info['dex'][2]);
$generalObj->updateVar('dex4', $info['dex'][3]);
$generalObj->updateVar('dex5', $info['dex'][4]);
}
if(key_exists('ego', $info)){
$generalObj->updateVar('personal', $info['ego']);
}
if(key_exists('specialDomestic', $info)){
$generalObj->updateVar('special', $info['specialDomestic']);
}
if(key_exists('specialWar', $info)){
$generalObj->updateVar('special2', $info['specialWar']);
}
$generalObj->setAuxVar('next_change', TimeUtil::nowAddMinutes(12 * $turnterm));
$userNick = $ownerInfo['name'];
$josaYi = JosaUtil::pick($userNick, '이');
$generalName = $info['generalName'];
$josaRo = JosaUtil::pick($generalName, '로');
$logger = $generalObj->getLogger();
$logger->pushGeneralHistoryLog("장수를 <Y>{$oldGeneralName}</>에서 <Y>{$generalName}</>{$josaRo} 변경");
$logger->pushGlobalActionLog("<Y>{$userNick}</>{$josaYi} 장수를 <Y>{$oldGeneralName}</>에서 <Y>{$generalName}</>{$josaRo} 변경합니다.");
$generalObj->applyDB($db);
Json::die([
'result'=>true,
'reason'=>'success'
]);
+8 -2
View File
@@ -13,7 +13,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$autorun_user = $gameStor->autorun_user; $autorun_user = $gameStor->autorun_user;
if($autorun_user['limit_minutes']??false){ if($autorun_user['limit_minutes']??false){
//자동 턴인 경우에는 휴가 불가 //자동 턴인 경우에는 휴가 불가
header('location:b_myPage.php', true, 303); Json::die([
'result'=>false,
'reason'=>'자동 턴인 경우에는 휴가 명령이 불가능합니다.'
]);
} }
$killturn = $gameStor->killturn; $killturn = $gameStor->killturn;
@@ -23,5 +26,8 @@ $db->update('general', [
], 'owner=%i', $userID); ], 'owner=%i', $userID);
header('location:b_myPage.php', true, 303); Json::die([
'result'=>true,
'reason'=>'success'
]);
+6 -2
View File
@@ -24,7 +24,12 @@ if (!$member) {
$db = DB::db(); $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['block_general_create','show_img_level','maxgeneral']);
if($admin['block_general_create']){
MessageBox("잘못된 접근입니다!!!");
echo "<script>history.go(-1);</script>";
exit(1);
}
?> ?>
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
@@ -66,7 +71,6 @@ echo Json::encode((object)$charInfoText);
<tr><td align=center><?=info(0)?></td></tr> <tr><td align=center><?=info(0)?></td></tr>
</table> </table>
<?php <?php
$admin = $gameStor->getValues(['show_img_level','maxgeneral']);
$gencount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc<2'); $gencount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc<2');
+1 -1
View File
@@ -169,7 +169,7 @@ if ($genius) {
'dex5'=>0 'dex5'=>0
]); ]);
} else { } else {
$specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/4 - $relYear / 2), 3) + $age; $specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/6 - $relYear / 2), 3) + $age;
$special2 = GameConst::$defaultSpecialWar; $special2 = GameConst::$defaultSpecialWar;
} }
//내특 //내특
+361 -229
View File
@@ -1,4 +1,4 @@
jQuery(function($){ jQuery(function($) {
var $generalForm = $('.form_sample .general_detail'); var $generalForm = $('.form_sample .general_detail');
@@ -9,9 +9,28 @@ jQuery(function($){
var $attackerCard = $('.attacker_form'); var $attackerCard = $('.attacker_form');
var initBasicEvent = function(){ var initBasicEvent = function() {
$('.form_injury').change(function(){ if (window.nation) {
$('.form_city_level').val(window.city.level);
$('.form_def').val(parseInt(window.city.def));
$('.form_wall').val(parseInt(window.city.wall));
$('.form_nation_type').val(window.nation.type);
$('.form_nation_level').val(window.nation.level);
$('.form_tech').val(parseInt(window.nation.tech / 1000));
if (window.nation.capital == window.city.city) {
$('.attacker_nation .form_is_capital:first').click();
$('.defender_nation .form_is_capital:first').click();
} else {
$('.attacker_nation .form_is_capital:last').click();
$('.defender_nation .form_is_capital:last').click();
}
} else {
$('.attacker_nation .form_is_capital:last').click();
$('.defender_nation .form_is_capital:last').click();
}
$('.form_injury').change(function() {
var $this = $(this); var $this = $(this);
var $general = getGeneralDetail($this); var $general = getGeneralDetail($this);
var $helptext = $general.find('.injury_helptext'); var $helptext = $general.find('.injury_helptext');
@@ -20,51 +39,48 @@ jQuery(function($){
//FIXME: PHP 코드와 항상 일치하도록 변경 //FIXME: PHP 코드와 항상 일치하도록 변경
var text = '건강'; var text = '건강';
var color = 'white'; var color = 'white';
if(injury > 60){ if (injury > 60) {
text = '위독'; text = '위독';
color = 'red'; color = 'red';
} } else if (injury > 40) {
else if(injury > 40){
text = '심각'; text = '심각';
color = 'magenta'; color = 'magenta';
} } else if (injury > 20) {
else if(injury > 20){
text = '중상'; text = '중상';
color = 'orange'; color = 'orange';
} } else if (injury > 0) {
else if(injury > 0){
text = '경상'; text = '경상';
color = 'yellow'; color = 'yellow';
} }
$helptext.html(text).css('color', color); $helptext.html(text).css('color', color);
}); });
$('.export_general').click(function(){ $('.export_general').click(function() {
var $btn = $(this); var $btn = $(this);
var $general = getGeneralDetail($btn); var $general = getGeneralDetail($btn);
var values = exportGeneralInfo($general); var values = exportGeneralInfo($general);
console.log(values); console.log(values);
}); });
$('.delete-defender').click(function(){ $('.delete-defender').click(function() {
var $card = getGeneralFrame($(this)); var $card = getGeneralFrame($(this));
deleteDefender($card); deleteDefender($card);
}); });
$('.copy-defender').click(function(){ $('.copy-defender').click(function() {
var $card = getGeneralFrame($(this)); var $card = getGeneralFrame($(this));
copyDefender($card); copyDefender($card);
}); });
$('.add-defender').click(function(){ $('.add-defender').click(function() {
addDefender(); addDefender();
}); });
$('.btn-general-load').click(function(){ $('.btn-general-load').click(function() {
var $file = $(this).prev(); var $file = $(this).prev();
$file[0].click(); $file[0].click();
}) })
$('.form_load_general_file').on('change', function(e){ $('.form_load_general_file').on('change', function(e) {
e.preventDefault(); e.preventDefault();
var $this = $(this); var $this = $(this);
var $card = getGeneralFrame($this); var $card = getGeneralFrame($this);
@@ -75,26 +91,35 @@ jQuery(function($){
return false; return false;
}); });
$('.btn-general-save').click(function(){ $('.btn-general-import-server').click(function() {
var $this = $(this);
var $card = getGeneralFrame($this);
var $modal = $('#importModal');
$modal.data('target', $card);
$modal.modal('show');
});
$('.btn-general-save').click(function() {
var $this = $(this); var $this = $(this);
var $general = getGeneralDetail($this); var $general = getGeneralDetail($this);
var generalData = exportGeneralInfo($general); var generalData = exportGeneralInfo($general);
var filename = "general_{0}.json".format(generalData.name); var filename = "general_{0}.json".format(generalData.name);
var saveData = JSON.stringify({ var saveData = JSON.stringify({
objType:'general', objType: 'general',
data:generalData data: generalData
}, null, 4); }, null, 4);
download(saveData, filename, 'application/json'); download(saveData, filename, 'application/json');
}); });
$('.btn-battle-load').click(function(){ $('.btn-battle-load').click(function() {
var $file = $(this).prev(); var $file = $(this).prev();
$file[0].click(); $file[0].click();
}) })
$('.form_load_battle_file').on('change', function(e){ $('.form_load_battle_file').on('change', function(e) {
e.preventDefault(); e.preventDefault();
var $this = $(this); var $this = $(this);
var files = e.target.files; var files = e.target.files;
@@ -103,12 +128,12 @@ jQuery(function($){
return false; return false;
}); });
$('.btn-battle-save').click(function(){ $('.btn-battle-save').click(function() {
var battleData = exportAllData(); var battleData = exportAllData();
var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss')); var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
var saveData = JSON.stringify({ var saveData = JSON.stringify({
objType:'battle', objType: 'battle',
data:battleData data: battleData
}, null, 4); }, null, 4);
download(saveData, filename, 'application/json'); download(saveData, filename, 'application/json');
@@ -119,7 +144,7 @@ jQuery(function($){
e.stopPropagation() e.stopPropagation()
e.preventDefault() e.preventDefault()
}) })
$generals.bind('drop', function(e){ $generals.bind('drop', function(e) {
e.preventDefault(); e.preventDefault();
var $this = $(this); var $this = $(this);
var $card = getGeneralFrame($this); var $card = getGeneralFrame($this);
@@ -135,7 +160,7 @@ jQuery(function($){
e.stopPropagation() e.stopPropagation()
e.preventDefault() e.preventDefault()
}) })
$battlePad.bind('drop', function(e){ $battlePad.bind('drop', function(e) {
e.preventDefault(); e.preventDefault();
var files = e.originalEvent.dataTransfer.files; var files = e.originalEvent.dataTransfer.files;
@@ -145,8 +170,8 @@ jQuery(function($){
}); });
} }
var importGeneralInfo = function($general, data){ var importGeneralInfo = function($general, data) {
var setVal = function(query, val){ var setVal = function(query, val) {
$general.find(query).val(val).change(); $general.find(query).val(val).change();
} }
@@ -154,7 +179,6 @@ jQuery(function($){
setVal('.form_officer_level', data.officer_level); setVal('.form_officer_level', data.officer_level);
setVal('.form_exp_level', data.explevel); setVal('.form_exp_level', data.explevel);
setVal('.form_injury', data.injury);
setVal('.form_leadership', data.leadership); setVal('.form_leadership', data.leadership);
setVal('.form_general_horse', data.horse); setVal('.form_general_horse', data.horse);
@@ -183,93 +207,103 @@ jQuery(function($){
setVal('.form_dex5', data.dex5); setVal('.form_dex5', data.dex5);
setVal('.form_defence_train', data.defence_train); setVal('.form_defence_train', data.defence_train);
if(!setGeneralNo($general, data.no)){ setVal('.form_warnum', data.warnum);
setVal('.form_killnum', data.killnum);
setVal('.form_killcrew', data.killcrew);
if (!setGeneralNo($general, data.no)) {
setGeneralNo($general, generateNewGeneralNo()); setGeneralNo($general, generateNewGeneralNo());
} }
} }
var exportGeneralInfo = function($general){ var exportGeneralInfo = function($general) {
var getInt = function(query){ var getInt = function(query) {
return parseInt($general.find(query).val()); return parseInt($general.find(query).val());
} }
var getVal = function(query){ var getVal = function(query) {
return $general.find(query).val(); return $general.find(query).val();
} }
return { return {
no:getGeneralNo($general), no: getGeneralNo($general),
name:getVal('.form_general_name'), name: getVal('.form_general_name'),
officer_level:getInt('.form_officer_level'), officer_level: getInt('.form_officer_level'),
explevel:getInt('.form_exp_level'), explevel: getInt('.form_exp_level'),
leadership:getInt('.form_leadership'), leadership: getInt('.form_leadership'),
horse:getVal('.form_general_horse'), horse: getVal('.form_general_horse'),
strength:getInt('.form_strength'), strength: getInt('.form_strength'),
weapon:getVal('.form_general_weap'), weapon: getVal('.form_general_weap'),
intel:getInt('.form_intel'), intel: getInt('.form_intel'),
book:getVal('.form_general_book'), book: getVal('.form_general_book'),
item:getVal('.form_general_item'), item: getVal('.form_general_item'),
injury:getInt('.form_injury'), injury: getInt('.form_injury'),
rice:getInt('.form_rice'), rice: getInt('.form_rice'),
personal:getVal('.form_general_character'), personal: getVal('.form_general_character'),
special2:getVal('.form_general_special_war'), special2: getVal('.form_general_special_war'),
crew:getInt('.form_crew'), crew: getInt('.form_crew'),
crewtype:getInt('.form_crewtype'), crewtype: getInt('.form_crewtype'),
atmos:getInt('.form_atmos'), atmos: getInt('.form_atmos'),
train:getInt('.form_train'), train: getInt('.form_train'),
dex1: getInt('.form_dex1'),
dex2: getInt('.form_dex2'),
dex3: getInt('.form_dex3'),
dex4: getInt('.form_dex4'),
dex5: getInt('.form_dex5'),
defence_train: getInt('.form_defence_train'),
warnum: getInt('.form_warnum'),
killnum: getInt('.form_killnum'),
killcrew: getInt('.form_killcrew'),
dex1:getInt('.form_dex1'),
dex2:getInt('.form_dex2'),
dex3:getInt('.form_dex3'),
dex4:getInt('.form_dex4'),
dex5:getInt('.form_dex5'),
defence_train:getInt('.form_defence_train'),
}; };
} }
var importBattleInfoByFile = function(files){ var importBattleInfoByFile = function(files) {
if(files === null){ if (files === null) {
alert('파일 에러!'); alert('파일 에러!');
return false; return false;
} }
if(files.length < 1){ if (files.length < 1) {
alert("파일 에러!"); alert("파일 에러!");
return false; return false;
} }
var file = files[0]; var file = files[0];
if(file.size > 1024*1024){ if (file.size > 1024 * 1024) {
alert('파일이 너무 큽니다!'); alert('파일이 너무 큽니다!');
return false; return false;
} }
if(file.type === ''){ if (file.type === '') {
alert('폴더를 업로드할 수 없습니다!'); alert('폴더를 업로드할 수 없습니다!');
return false; return false;
} }
var reader = new FileReader(); var reader = new FileReader();
reader.onload = function(){ reader.onload = function() {
var battleData = {}; var battleData = {};
try { try {
battleData = JSON.parse(reader.result); battleData = JSON.parse(reader.result);
} catch(e) { } catch (e) {
alert('올바르지 않은 파일 형식입니다'); alert('올바르지 않은 파일 형식입니다');
return false; return false;
} }
if(!('objType' in battleData)){ if (!('objType' in battleData)) {
alert('파일 형식을 확인할 수 없습니다'); alert('파일 형식을 확인할 수 없습니다');
return false; return false;
} }
if(battleData.objType != 'battle'){ if (battleData.objType != 'battle') {
alert('전투 데이터가 아닙니다'); alert('전투 데이터가 아닙니다');
return false; return false;
} }
@@ -281,8 +315,7 @@ jQuery(function($){
try { try {
reader.readAsText(file); reader.readAsText(file);
} } catch (e) {
catch(e) {
alert('파일을 읽는데 실패했습니다.'); alert('파일을 읽는데 실패했습니다.');
return false; return false;
} }
@@ -290,52 +323,52 @@ jQuery(function($){
return true; return true;
} }
var importGeneralInfoByFile = function(files, $card){ var importGeneralInfoByFile = function(files, $card) {
if($card === undefined){ if ($card === undefined) {
$card = addDefender(); $card = addDefender();
} }
if(files === null){ if (files === null) {
alert('파일 에러!'); alert('파일 에러!');
return false; return false;
} }
if(files.length < 1){ if (files.length < 1) {
alert("파일 에러!"); alert("파일 에러!");
return false; return false;
} }
var file = files[0]; var file = files[0];
if(file.size > 1024*1024){ if (file.size > 1024 * 1024) {
alert('파일이 너무 큽니다!'); alert('파일이 너무 큽니다!');
return false; return false;
} }
if(file.type === ''){ if (file.type === '') {
alert('폴더를 업로드할 수 없습니다!'); alert('폴더를 업로드할 수 없습니다!');
return false; return false;
} }
var reader = new FileReader(); var reader = new FileReader();
reader.onload = function(){ reader.onload = function() {
var generalData = {}; var generalData = {};
try { try {
generalData = JSON.parse(reader.result); generalData = JSON.parse(reader.result);
} catch(e) { } catch (e) {
alert('올바르지 않은 파일 형식입니다'); alert('올바르지 않은 파일 형식입니다');
return false; return false;
} }
if(!('objType' in generalData)){ if (!('objType' in generalData)) {
alert('파일 형식을 확인할 수 없습니다'); alert('파일 형식을 확인할 수 없습니다');
return false; return false;
} }
if(generalData.objType == 'battle'){ if (generalData.objType == 'battle') {
importBattleInfo(generalData.data); importBattleInfo(generalData.data);
return true; return true;
} }
if(generalData.objType != 'general'){ if (generalData.objType != 'general') {
alert('장수 데이터가 아닙니다'); alert('장수 데이터가 아닙니다');
return false; return false;
} }
@@ -349,8 +382,7 @@ jQuery(function($){
try { try {
reader.readAsText(file); reader.readAsText(file);
} } catch (e) {
catch(e) {
alert('파일을 읽는데 실패했습니다.'); alert('파일을 읽는데 실패했습니다.');
return false; return false;
} }
@@ -358,49 +390,49 @@ jQuery(function($){
return true; return true;
} }
var extendGeneralInfoForDB = function(generalData){ var extendGeneralInfoForDB = function(generalData) {
var dbVal = { var dbVal = {
nation: (generalData.no)<=1 ? 1 : 2, nation: (generalData.no) <= 1 ? 1 : 2,
city: (generalData.no)<=1 ? 1 : 3, city: (generalData.no) <= 1 ? 1 : 3,
turntime:'2018-08-26 12:00', turntime: '2018-08-26 12:00',
special:defaultSpecialDomestic, special: defaultSpecialDomestic,
leadership_exp:0, leadership_exp: 0,
strength_exp:0, strength_exp: 0,
intel_exp:0, intel_exp: 0,
gold:10000, gold: 10000,
dedication:0, dedication: 0,
recent_war:'2018-08-26 12:00', recent_war: '2018-08-26 12:00',
experience:Math.pow(generalData.explevel, 2), experience: Math.pow(generalData.explevel, 2),
}; };
return $.extend({}, generalData, dbVal); return $.extend({}, generalData, dbVal);
} }
var getGeneralFrame = function($btn){ var getGeneralFrame = function($btn) {
var $card = $btn.closest('.general_form'); var $card = $btn.closest('.general_form');
return $card; return $card;
} }
var getGeneralDetail = function($btn){ var getGeneralDetail = function($btn) {
var $card = getGeneralFrame($btn); var $card = getGeneralFrame($btn);
var $general = $card.find('.general_detail'); var $general = $card.find('.general_detail');
return $general; return $general;
} }
var getGeneralNo = function($btn){ var getGeneralNo = function($btn) {
return parseInt(getGeneralFrame($btn).data('general_no')); return parseInt(getGeneralFrame($btn).data('general_no'));
} }
var setGeneralNo = function($btn, value){ var setGeneralNo = function($btn, value) {
if(value == 1){ if (value == 1) {
//1번은 무조건 공격자임 //1번은 무조건 공격자임
return false; return false;
} }
if(value in defenderNoList){ if (value in defenderNoList) {
return false; return false;
} }
var $card = getGeneralFrame($btn); var $card = getGeneralFrame($btn);
@@ -409,35 +441,34 @@ jQuery(function($){
return true; return true;
} }
var generateNewGeneralNo = function(){ var generateNewGeneralNo = function() {
while(true){ while (true) {
var newGeneralNo = parseInt(Math.random()*(1<<24))+2; var newGeneralNo = parseInt(Math.random() * (1 << 24)) + 2;
if(newGeneralNo in defenderNoList){ if (newGeneralNo in defenderNoList) {
continue; continue;
} }
return newGeneralNo; return newGeneralNo;
} }
} }
var deleteGeneralNo = function($btn){ var deleteGeneralNo = function($btn) {
var $card = getGeneralFrame($btn); var $card = getGeneralFrame($btn);
$card.removeData('general_no'); $card.removeData('general_no');
var generalNo = getGeneralNo($card); var generalNo = getGeneralNo($card);
delete defenderNoList[generalNo]; delete defenderNoList[generalNo];
} }
var addDefender = function($cardAfter){ var addDefender = function($cardAfter) {
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>'); var $newCard = $('<div class="card mb-2 defender_form general_form"></div>');
if($cardAfter === undefined){ if ($cardAfter === undefined) {
$defenderColumn.append($newCard); $defenderColumn.append($newCard);
} } else {
else{
$cardAfter.after($newCard); $cardAfter.after($newCard);
} }
$newCard.append($defenderHeaderForm.clone(true,true)); $newCard.append($defenderHeaderForm.clone(true, true));
$newCard.append($generalForm.clone(true,true)); $newCard.append($generalForm.clone(true, true));
$newGeneral = getGeneralDetail($newCard); $newGeneral = getGeneralDetail($newCard);
setGeneralNo($newCard, generateNewGeneralNo()); setGeneralNo($newCard, generateNewGeneralNo());
@@ -445,12 +476,12 @@ jQuery(function($){
return $newCard; return $newCard;
} }
var deleteDefender = function($card){ var deleteDefender = function($card) {
deleteGeneralNo($card); deleteGeneralNo($card);
$card.detach(); $card.detach();
} }
var copyDefender = function($card){ var copyDefender = function($card) {
var $general = getGeneralDetail($card); var $general = getGeneralDetail($card);
var generalData = exportGeneralInfo($general); var generalData = exportGeneralInfo($general);
@@ -458,7 +489,7 @@ jQuery(function($){
importGeneralInfo(getGeneralDetail($newObj), generalData); importGeneralInfo(getGeneralDetail($newObj), generalData);
} }
var importBattleInfo = function(battleData){ var importBattleInfo = function(battleData) {
$('.form_load_battle_file').val(''); $('.form_load_battle_file').val('');
console.log(battleData); console.log(battleData);
@@ -481,12 +512,11 @@ jQuery(function($){
$('.delete-defender').click(); $('.delete-defender').click();
$attackerNation.find('.form_nation_type').val(attackerNation.type); $attackerNation.find('.form_nation_type').val(attackerNation.type);
$attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech/1000)); $attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech / 1000));
$attackerNation.find('.form_nation_level').val(attackerNation.level); $attackerNation.find('.form_nation_level').val(attackerNation.level);
if(attackerNation.capital == 1){ if (attackerNation.capital == 1) {
$attackerNation.find('.form_is_capital:first').click(); $attackerNation.find('.form_is_capital:first').click();
} } else {
else{
$attackerNation.find('.form_is_capital:last').click(); $attackerNation.find('.form_is_capital:last').click();
} }
$attackerNation.find('.form_city_level').val(attackerCity.level); $attackerNation.find('.form_city_level').val(attackerCity.level);
@@ -494,56 +524,55 @@ jQuery(function($){
importGeneralInfo($('.attacker_form'), attackerGeneral); importGeneralInfo($('.attacker_form'), attackerGeneral);
$defenderNation.find('.form_nation_type').val(defenderNation.type); $defenderNation.find('.form_nation_type').val(defenderNation.type);
$defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech/1000)); $defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech / 1000));
$defenderNation.find('.form_nation_level').val(defenderNation.level); $defenderNation.find('.form_nation_level').val(defenderNation.level);
if(defenderNation.capital == 1){ if (defenderNation.capital == 1) {
$defenderNation.find('.form_is_capital:first').click(); $defenderNation.find('.form_is_capital:first').click();
} } else {
else{
$defenderNation.find('.form_is_capital:last').click(); $defenderNation.find('.form_is_capital:last').click();
} }
$defenderNation.find('.form_city_level').val(defenderCity.level); $defenderNation.find('.form_city_level').val(defenderCity.level);
$('#city_def').val(defenderCity.def); $('#city_def').val(defenderCity.def);
$('#city_wall').val(defenderCity.wall); $('#city_wall').val(defenderCity.wall);
$.each(defenderGenerals, function(idx, defenderGeneral){ $.each(defenderGenerals, function(idx, defenderGeneral) {
var $card = addDefender(); var $card = addDefender();
importGeneralInfo($card, defenderGeneral); importGeneralInfo($card, defenderGeneral);
}); });
} }
var exportAllData = function(){ var exportAllData = function() {
var $attackerNation = $('.attacker_nation'); var $attackerNation = $('.attacker_nation');
var $defenderNation = $('.defender_nation'); var $defenderNation = $('.defender_nation');
var attackerGeneral = exportGeneralInfo($('.attacker_form')); var attackerGeneral = exportGeneralInfo($('.attacker_form'));
var attackerCity = { var attackerCity = {
level:parseInt($attackerNation.find('.form_city_level').val()), level: parseInt($attackerNation.find('.form_city_level').val()),
}; };
var attackerNation = { var attackerNation = {
type:$attackerNation.find('.form_nation_type').val(), type: $attackerNation.find('.form_nation_type').val(),
tech:parseInt($attackerNation.find('.form_tech').val()) * 1000, tech: parseInt($attackerNation.find('.form_tech').val()) * 1000,
level:parseInt($attackerNation.find('.form_nation_level').val()), level: parseInt($attackerNation.find('.form_nation_level').val()),
capital:$attackerNation.find('.form_is_capital:checked').val()=='1'?1:2, capital: $attackerNation.find('.form_is_capital:checked').val() == '1' ? 1 : 2,
} }
var defenderGenerals = $('.defender_form').map(function(){ var defenderGenerals = $('.defender_form').map(function() {
return exportGeneralInfo($(this)); return exportGeneralInfo($(this));
}).toArray(); }).toArray();
var defenderCity = { var defenderCity = {
def: parseInt($('#city_def').val()), def: parseInt($('#city_def').val()),
wall: parseInt($('#city_wall').val()), wall: parseInt($('#city_wall').val()),
level:parseInt($defenderNation.find('.form_city_level').val()), level: parseInt($defenderNation.find('.form_city_level').val()),
}; };
var defenderNation = { var defenderNation = {
type:$defenderNation.find('.form_nation_type').val(), type: $defenderNation.find('.form_nation_type').val(),
tech:parseInt($defenderNation.find('.form_tech').val()) * 1000, tech: parseInt($defenderNation.find('.form_tech').val()) * 1000,
level:parseInt($defenderNation.find('.form_nation_level').val()), level: parseInt($defenderNation.find('.form_nation_level').val()),
capital:$defenderNation.find('.form_is_capital:checked').val()=='1'?3:4, capital: $defenderNation.find('.form_is_capital:checked').val() == '1' ? 3 : 4,
} }
var year = parseInt($('#year').val()); var year = parseInt($('#year').val());
@@ -551,59 +580,59 @@ jQuery(function($){
var repeatCnt = parseInt($('#repeat_cnt').val()); var repeatCnt = parseInt($('#repeat_cnt').val());
return { return {
attackerGeneral:attackerGeneral, attackerGeneral: attackerGeneral,
attackerCity:attackerCity, attackerCity: attackerCity,
attackerNation:attackerNation, attackerNation: attackerNation,
defenderGenerals:defenderGenerals, defenderGenerals: defenderGenerals,
defenderCity:defenderCity, defenderCity: defenderCity,
defenderNation:defenderNation, defenderNation: defenderNation,
year:year, year: year,
month:month, month: month,
repeatCnt:repeatCnt, repeatCnt: repeatCnt,
}; };
} }
var extendAllDataForDB = function(allData){ var extendAllDataForDB = function(allData) {
var defaultNation = { var defaultNation = {
nation:0, nation: 0,
name:'재야', name: '재야',
capital:0, capital: 0,
level:0, level: 0,
gold:0, gold: 0,
rice:2000, rice: 2000,
type:'None', type: 'None',
tech:0, tech: 0,
gennum:200, gennum: 200,
}; };
var defaultCity = { var defaultCity = {
nation:0, nation: 0,
supply:1, supply: 1,
name:'도시', name: '도시',
pop:500000, pop: 500000,
agri:10000, agri: 10000,
comm:10000, comm: 10000,
secu:10000, secu: 10000,
def:1000, def: 1000,
wall:1000, wall: 1000,
trust:100, trust: 100,
pop_max:600000, pop_max: 600000,
agri_max:12000, agri_max: 12000,
comm_max:12000, comm_max: 12000,
secu_max:10000, secu_max: 10000,
def_max:12000, def_max: 12000,
wall_max:12000, wall_max: 12000,
dead:0, dead: 0,
state:0, state: 0,
conflict:'{}', conflict: '{}',
}; };
var attackerNation = $.extend({}, defaultNation, allData.attackerNation); var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
@@ -615,10 +644,9 @@ jQuery(function($){
attackerCity.city = 1; attackerCity.city = 1;
var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral); var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
if(2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4){ if (2 <= attackerGeneral.officer_level && attackerGeneral.officer_level <= 4) {
attackerGeneral.officer_city = 1; attackerGeneral.officer_city = 1;
} } else {
else{
attackerGeneral.officer_city = 0; attackerGeneral.officer_city = 0;
} }
@@ -629,16 +657,15 @@ jQuery(function($){
var defenderCity = $.extend({}, defaultCity, allData.defenderCity); var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
defenderCity.nation = 2; defenderCity.nation = 2;
defenderCity.city = 3; defenderCity.city = 3;
defenderCity.wall_max = defenderCity.wall/5*6; defenderCity.wall_max = parseInt(defenderCity.wall / 5 * 6);
defenderCity.def_max = defenderCity.def/5*6; defenderCity.def_max = parseInt(defenderCity.def / 5 * 6);
var defenderGenerals = []; var defenderGenerals = [];
$.each(allData.defenderGenerals, function(){ $.each(allData.defenderGenerals, function() {
var defenderGeneral = extendGeneralInfoForDB(this); var defenderGeneral = extendGeneralInfoForDB(this);
if(2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4){ if (2 <= defenderGeneral.officer_level && defenderGeneral.officer_level <= 4) {
defenderGeneral.officer_city = 3; defenderGeneral.officer_city = 3;
} } else {
else{
defenderGeneral.officer_city = 0; defenderGeneral.officer_city = 0;
} }
@@ -647,58 +674,55 @@ jQuery(function($){
return $.extend({}, allData, { return $.extend({}, allData, {
attackerGeneral:attackerGeneral, attackerGeneral: attackerGeneral,
attackerCity:attackerCity, attackerCity: attackerCity,
attackerNation:attackerNation, attackerNation: attackerNation,
defenderGenerals:defenderGenerals, defenderGenerals: defenderGenerals,
defenderCity:defenderCity, defenderCity: defenderCity,
defenderNation:defenderNation, defenderNation: defenderNation,
}); });
} }
var parseSkillCount = function(skills){ var parseSkillCount = function(skills) {
var result = []; var result = [];
$.each(skills, function(key, value){ $.each(skills, function(key, value) {
result.push("{0}({1}회)".format(key, toPretty(value))); result.push("{0}({1}회)".format(key, toPretty(value)));
}) })
if(result.length == 0){ if (result.length == 0) {
return '-'; return '-';
} }
return result.join(', '); return result.join(', ');
} }
var toPretty = function(number){ var toPretty = function(number) {
if(isInt(number)){ if (isInt(number)) {
number = parseInt(number); number = parseInt(number);
} } else {
else{
number = parseFloat(number).toFixed(2); number = parseFloat(number).toFixed(2);
} }
return numberWithCommas(number); return numberWithCommas(number);
} }
var showBattleResult = function(result){ var showBattleResult = function(result) {
$('#result_datetime').html(result.datetime); $('#result_datetime').html(result.datetime);
$('#result_warcnt').html(toPretty(result.avgWar)); $('#result_warcnt').html(toPretty(result.avgWar));
$('#result_phase').html(toPretty(result.phase)); $('#result_phase').html(toPretty(result.phase));
$('#result_killed').html(toPretty(result.killed)); $('#result_killed').html(toPretty(result.killed));
if(result.minKilled != result.maxKilled){ if (result.minKilled != result.maxKilled) {
$('#result_maxKilled').html(toPretty(result.maxKilled)); $('#result_maxKilled').html(toPretty(result.maxKilled));
$('#result_minKilled').html(toPretty(result.minKilled)); $('#result_minKilled').html(toPretty(result.minKilled));
$('#result_varKilled').show(); $('#result_varKilled').show();
} } else {
else{
$('#result_varKilled').hide(); $('#result_varKilled').hide();
} }
$('#result_dead').html(toPretty(result.dead)); $('#result_dead').html(toPretty(result.dead));
if(result.minDead != result.maxDead){ if (result.minDead != result.maxDead) {
$('#result_maxDead').html(toPretty(result.maxDead)); $('#result_maxDead').html(toPretty(result.maxDead));
$('#result_minDead').html(toPretty(result.minDead)); $('#result_minDead').html(toPretty(result.minDead));
$('#result_varDead').show(); $('#result_varDead').show();
} } else {
else{
$('#result_varDead').hide(); $('#result_varDead').hide();
} }
@@ -710,7 +734,7 @@ jQuery(function($){
var $summary = $('#battle_result_summary'); var $summary = $('#battle_result_summary');
$.each(result.defendersSkills, function(idx, defenderSkills){ $.each(result.defendersSkills, function(idx, defenderSkills) {
console.log(defenderSkills); console.log(defenderSkills);
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1)); var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
$result.find('td').html(parseSkillCount(defenderSkills)); $result.find('td').html(parseSkillCount(defenderSkills));
@@ -722,35 +746,35 @@ jQuery(function($){
} }
var beginBattle = function(){ var beginBattle = function() {
var data = extendAllDataForDB(exportAllData()); var data = extendAllDataForDB(exportAllData());
console.log(data); console.log(data);
$.ajax({ $.ajax({
type:'post', type: 'post',
url:'j_simulate_battle.php', url: 'j_simulate_battle.php',
dataType:'json', dataType: 'json',
data:{ data: {
action:'battle', action: 'battle',
query:JSON.stringify(data), query: JSON.stringify(data),
} }
}).then(function(result){ }).then(function(result) {
console.log(result); console.log(result);
if(!result.result){ if (!result.result) {
alert(result.reason); alert(result.reason);
return; return;
} }
showBattleResult(result); showBattleResult(result);
}, function(result){ }, function(result) {
alert('전투 개시 실패!'); alert('전투 개시 실패!');
}); });
} }
var reorderDefender = function(defenderOrder){ var reorderDefender = function(defenderOrder) {
$.each(defenderOrder, function(idx, generalNo){ $.each(defenderOrder, function(idx, generalNo) {
if(!(generalNo in defenderNoList)){ if (!(generalNo in defenderNoList)) {
//음..? //음..?
alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo)); alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
return true; return true;
@@ -762,39 +786,147 @@ jQuery(function($){
}) })
} }
var requestReorderDefender = function(){ var requestReorderDefender = function() {
var data = extendAllDataForDB(exportAllData()); var data = extendAllDataForDB(exportAllData());
console.log(data); console.log(data);
$.ajax({ $.ajax({
type:'post', type: 'post',
url:'j_simulate_battle.php', url: 'j_simulate_battle.php',
dataType:'json', dataType: 'json',
data:{ data: {
action:'reorder', action: 'reorder',
query:JSON.stringify(data), query: JSON.stringify(data),
} }
}).then(function(result){ }).then(function(result) {
console.log(result); console.log(result);
if(!result.result){ if (!result.result) {
alert(result.reason); alert(result.reason);
return; return;
} }
reorderDefender(result.order); reorderDefender(result.order);
}, function(result){ }, function(result) {
alert('재정렬 실패!'); alert('재정렬 실패!');
}); });
} }
var initGeneralList = false;
$('#importFromDB').click(function() {
var generalID = $('#modalSelector').val();
console.log(generalID);
$.post({
url: 'j_export_simulator_object.php',
dataType: 'json',
data: {
destGeneralID: generalID
}
}).then(function(data) {
if (!data.result) {
alert(data.reason);
return false;
}
var $modal = $('#importModal');
var $card = $modal.data('target');
importGeneralInfo($card, data.general);
$modal.modal('hide');
}, errUnknown);
});
$('#importModal').on('show.bs.modal', function(e) {
if (!initGeneralList) {
var $list = $('#modalSelector');
var addNation = function(generalList, nationName, color) {
generalList.sort(function(lhs, rhs) {
if (lhs.npc != rhs.npc) {
return lhs.npc - rhs.npc;
}
if (lhs.name < rhs.name) {
return -1;
}
if (lhs.name > rhs.name) {
return 1;
}
return 0;
})
var $optGroup = $('<optgroup label="{0}"></optgroup>'.format(nationName));
$optGroup.css('background-color', color);
$optGroup.css('color', isBrightColor(color) ? 'black' : 'white');
$.each(generalList, function(idx, general) {
$item = $('<option value="{0}">{1}</option>'.format(general.no, general.name));
if (general.npc) {
$item.css('color', getNpcColor(general.npc));
} else {
$item.css('color', 'white');
}
$item.css('background-color', 'black');
$optGroup.append($item);
});
$list.append($optGroup);
}
$.post({
url: 'j_get_basic_general_list.php',
dataType: 'json',
data: {
req: 2,
}
}).then(function(data) {
if (!data.result) {
alert(data.reason);
$('#importModal').modal('hide');
return false;
}
var nations = data.nation;
var myNationID = data.nationID;
$list.empty();
//자국 먼저
if (0 in data.list) {
nations[0] = {
nation: 0,
name: '재야',
color: '#000000'
};
}
addNation(combineArray(data.list[myNationID], data.column), nations[myNationID].name, nations[myNationID].color);
for (var nationID in data.list) {
if (nationID == myNationID) {
continue;
}
addNation(combineArray(data.list[nationID], data.column), nations[nationID].name, nations[nationID].color);
}
initGeneralList = true;
}, errUnknown);
}
});
initBasicEvent(); initBasicEvent();
$attackerCard.append($generalForm.clone(true,true)); $attackerCard.append($generalForm.clone(true, true));
addDefender(); addDefender();
$('.btn-begin_battle').click(function(){ $('.btn-begin_battle').click(function() {
beginBattle(); beginBattle();
}); });
$('.btn-reorder_defender').click(function(){ $('.btn-reorder_defender').click(function() {
requestReorderDefender(); requestReorderDefender();
}) })
}); });
+66 -72
View File
@@ -1,26 +1,26 @@
function changePermission(isAmbassador, rawGeneralList){ function changePermission(isAmbassador, rawGeneralList) {
console.log(isAmbassador); console.log(isAmbassador);
console.log(rawGeneralList); console.log(rawGeneralList);
var generalList = []; var generalList = [];
$.each(rawGeneralList, function(idx, value){ $.each(rawGeneralList, function(idx, value) {
generalList.push(parseInt(value.id)); generalList.push(parseInt(value.id));
}) })
$.post({ $.post({
url:'j_general_set_permission.php', url: 'j_general_set_permission.php',
dataType:'json', dataType: 'json',
data:{ data: {
isAmbassador:isAmbassador, isAmbassador: isAmbassador,
genlist:generalList genlist: generalList
}, },
}).then(function(data){ }).then(function(data) {
if(!data){ if (!data) {
alert('변경하지 못했습니다.'); alert('변경하지 못했습니다.');
return false; return false;
} }
if(!data.result){ if (!data.result) {
alert('변경하지 못했습니다. : '+data.reason); alert('변경하지 못했습니다. : ' + data.reason);
return false; return false;
} }
alert('변경했습니다.'); alert('변경했습니다.');
@@ -28,19 +28,19 @@ function changePermission(isAmbassador, rawGeneralList){
}, errUnknown); }, errUnknown);
} }
$(function(){ $(function() {
$('#selectAmbassador').select2({ $('#selectAmbassador').select2({
theme: 'bootstrap4', theme: 'bootstrap4',
placeholder: "", placeholder: "",
allowClear: true, allowClear: true,
language: "ko", language: "ko",
width:300, width: 300,
maximumSelectionLength: 2, maximumSelectionLength: 2,
containerCss: { containerCss: {
display: "inline-block !important;", display: "inline-block !important;",
color: 'white !important' color: 'white !important'
}, },
data:candidateAmbassadors, data: candidateAmbassadors,
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', //containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
}); });
@@ -50,19 +50,19 @@ $(function(){
placeholder: "", placeholder: "",
allowClear: true, allowClear: true,
language: "ko", language: "ko",
width:300, width: 300,
maximumSelectionLength: 2, maximumSelectionLength: 2,
containerCss: { containerCss: {
display: "inline-block !important;", display: "inline-block !important;",
color: 'white !important' color: 'white !important'
}, },
data:candidateAuditors, data: candidateAuditors,
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary', //containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary', dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
}); });
$('#changeAmbassador').click(function(){ $('#changeAmbassador').click(function() {
if(!confirm('외교권자를 변경할까요?')){ if (!confirm('외교권자를 변경할까요?')) {
return false; return false;
} }
@@ -70,8 +70,8 @@ $(function(){
return false; return false;
}); });
$('#changeAuditor').click(function(){ $('#changeAuditor').click(function() {
if(!confirm('조언자를 변경할까요?')){ if (!confirm('조언자를 변경할까요?')) {
return false; return false;
} }
@@ -79,31 +79,31 @@ $(function(){
return false; return false;
}); });
$('#btn_kick').click(function(){ $('#btn_kick').click(function() {
var $kickSelect = $('#genlist_kick option:selected'); var $kickSelect = $('#genlist_kick option:selected');
var generalID = $kickSelect.val(); var generalID = $kickSelect.val();
if(!generalID){ if (!generalID) {
alert('장수를 선택해주세요'); alert('장수를 선택해주세요');
return false; return false;
} }
var generalName = $kickSelect.data('name'); var generalName = $kickSelect.data('name');
if(!confirm('{0}를 추방하시겠습니까?'.format(generalName))){ if (!confirm('{0}를 추방하시겠습니까?'.format(generalName))) {
return false; return false;
} }
$.post({ $.post({
url:'j_myBossInfo.php', url: 'j_myBossInfo.php',
dataType:'json', dataType: 'json',
data:{ data: {
action:'추방', action: '추방',
destGeneralID:generalID destGeneralID: generalID
}, },
}).then(function(data){ }).then(function(data) {
if(!data){ if (!data) {
alert('추방하지 못했습니다.'); alert('추방하지 못했습니다.');
return false; return false;
} }
if(!data.result){ if (!data.result) {
alert('추방하지 못했습니다. : '+data.reason); alert('추방하지 못했습니다. : ' + data.reason);
return false; return false;
} }
alert('{0}를 추방했습니다.'.format(generalName)); alert('{0}를 추방했습니다.'.format(generalName));
@@ -112,7 +112,7 @@ $(function(){
return false; return false;
}); });
$('.btn_appoint').click(function(){ $('.btn_appoint').click(function() {
var $btn = $(this); var $btn = $(this);
var officerLevel = $btn.data('officer_level'); var officerLevel = $btn.data('officer_level');
var officerLevelText = $btn.data('officer_level_text'); var officerLevelText = $btn.data('officer_level_text');
@@ -121,76 +121,70 @@ $(function(){
var $generalSelect = $('#genlist_{0} option:selected'.format(officerLevel)); var $generalSelect = $('#genlist_{0} option:selected'.format(officerLevel));
var $citySelect = $('#citylist_{0} option:selected'.format(officerLevel)); var $citySelect = $('#citylist_{0} option:selected'.format(officerLevel));
var generalID = $generalSelect.val(); var generalID = parseInt($generalSelect.val());
var generalName = $generalSelect.data('name'); var generalName = $generalSelect.data('name');
var generalOfficerLevel = $generalSelect.data('officer_level'); var generalOfficerLevel = $generalSelect.data('officer_level');
if(officerLevel >= 5){ if (officerLevel >= 5) {
if(generalID == 0){ if (generalID == 0) {
if(!confirm('{0}직을 비우시겠습니까?'.format(officerLevelText))){ if (!confirm('{0}직을 비우시겠습니까?'.format(officerLevelText))) {
return false;
}
} else if (generalOfficerLevel >= 5) {
if (!confirm('이미 수뇌인 {0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))) {
return false;
}
} else {
if (!confirm('{0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))) {
return false; return false;
} }
} }
else if(generalOfficerLevel >= 5){ } else {
if(!confirm('이미 수뇌인 {0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))){
return false;
}
}
else{
if(!confirm('{0}을(를) {1}직에 임명하시겠습니까?'.format(generalName, officerLevelText))){
return false;
}
}
}
else{
cityID = $citySelect.val(); cityID = $citySelect.val();
if(!cityID){ if (!cityID) {
alert('도시를 선택해주세요'); alert('도시를 선택해주세요');
return false; return false;
} }
cityName = $citySelect.find('option:selected .name_field').text(); cityName = $citySelect.find('option:selected .name_field').text();
if(generalID == 0){ if (generalID == 0) {
if(!confirm('{0} {1}직을 비우시겠습니까?'.format(cityName, officerLevelText))){ if (!confirm('{0} {1}직을 비우시겠습니까?'.format(cityName, officerLevelText))) {
return false; return false;
} }
} } else if (generalOfficerLevel >= 5) {
else if(generalOfficerLevel >= 5){ if (!confirm('수뇌인 {0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))) {
if(!confirm('수뇌인 {0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))){
return false; return false;
} }
} } else {
else{ if (!confirm('{0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))) {
if(!confirm('{0}을(를) {1} {2}직에 임명하시겠습니까?'.format(generalName, cityName, officerLevelText))){
return false; return false;
} }
} }
} }
$.post({ $.post({
url:'j_myBossInfo.php', url: 'j_myBossInfo.php',
dataType:'json', dataType: 'json',
data:{ data: {
action:'임명', action: '임명',
destGeneralID:generalID, destGeneralID: generalID,
destCityID:cityID, destCityID: cityID,
officerLevel:officerLevel officerLevel: officerLevel
}, },
}).then(function(data){ }).then(function(data) {
if(!data){ if (!data) {
alert('임명하지 못했습니다.'); alert('임명하지 못했습니다.');
return false; return false;
} }
if(!data.result){ if (!data.result) {
alert('임명하지 못했습니다. : '+data.reason); alert('임명하지 못했습니다. : ' + data.reason);
return false; return false;
} }
if(generalID){ if (generalID) {
alert('{0}을(를) 임명했습니다.'.format(generalName)); alert('{0}을(를) 임명했습니다.'.format(generalName));
} } else {
else{
alert('관직을 비웠습니다.'); alert('관직을 비웠습니다.');
} }
+29 -9
View File
@@ -65,18 +65,35 @@ function reloadTable(){
filledChiefList[chiefIdx] = true; filledChiefList[chiefIdx] = true;
var plateObj = chiefTableObj[chiefIdx]; var plateObj = chiefTableObj[chiefIdx];
var $name = $('<span>{0}</span>'.format(chiefInfo.name)); if(chiefInfo.name){
var nameColor = getNpcColor(chiefInfo.npcType); var $name = $('<span>{0}</span>'.format(chiefInfo.name));
if(nameColor){ var nameColor = getNpcColor(chiefInfo.npcType);
$name.css('color',nameColor); if(nameColor){
$name.css('color',nameColor);
}
plateObj.name.html($name);
}
else{
plateObj.name.html('');
} }
plateObj.officerLevelText.text(chiefInfo.officerLevelText);
plateObj.name.html($name);
var turnTimeObj = moment(chiefInfo.turnTime); plateObj.officerLevelText.text(chiefInfo.officerLevelText);
if(chiefInfo.turnTime){
var turnTimeObj = moment(chiefInfo.turnTime);
}
else{
var turnTimeObj = null;
}
var turnList = plateObj.turn; var turnList = plateObj.turn;
$.each(chiefInfo.turn, function(turnIdx, turnText){ $.each(chiefInfo.turn, function(turnIdx, turnText){
turnList[turnIdx].turnTime.text(turnTimeObj.format('hh:mm')); if(turnTimeObj){
turnList[turnIdx].turnTime.text(turnTimeObj.format('HH:mm'));
}
else{
turnList[turnIdx].turnTime.text('');
}
turnList[turnIdx].turnText.html(turnText).css('font-size', '13px'); turnList[turnIdx].turnText.html(turnText).css('font-size', '13px');
var oWidth = turnList[turnIdx].turnPad.innerWidth(); var oWidth = turnList[turnIdx].turnPad.innerWidth();
var iWidth = turnList[turnIdx].turnText.outerWidth(); var iWidth = turnList[turnIdx].turnText.outerWidth();
@@ -84,7 +101,10 @@ function reloadTable(){
var newFontSize = 13 * oWidth / iWidth * 0.9; var newFontSize = 13 * oWidth / iWidth * 0.9;
turnList[turnIdx].turnText.css('font-size', '{0}px'.format(newFontSize)); turnList[turnIdx].turnText.css('font-size', '{0}px'.format(newFontSize));
} }
turnTimeObj = turnTimeObj.add(turnTerm, 'minute'); if(turnTimeObj){
turnTimeObj = turnTimeObj.add(turnTerm, 'minute');
}
}); });
}); });
+167 -99
View File
@@ -3,8 +3,8 @@
* @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery * @see https://stackoverflow.com/questions/24816/escaping-html-strings-with-jquery
* @param {string} string escape하고자 하는 문자열 * @param {string} string escape하고자 하는 문자열
* @returns {string} * @returns {string}
*/ */
var escapeHtml = (function (string) { var escapeHtml = (function(string) {
var entityMap = { var entityMap = {
'&': '&amp;', '&': '&amp;',
'<': '&lt;', '<': '&lt;',
@@ -32,58 +32,70 @@ function isInt(n) {
return +n === n && !(n % 1); return +n === n && !(n % 1);
} }
;(function(ns){ ;
(function(ns) {
//https://gist.github.com/demouth/3217440 //https://gist.github.com/demouth/3217440
/** /**
* mb_strwidth * mb_strwidth
* @param String * @param String
* @return int * @return int
* @see http://php.net/manual/ja/function.mb-strwidth.php * @see http://php.net/manual/ja/function.mb-strwidth.php
*/ */
var mb_strwidth = function(str){ var mb_strwidth = function(str) {
var i=0,l=str.length,c='',length=0; var i = 0,
for(;i<l;i++){ l = str.length,
c=str.charCodeAt(i); c = '',
if(0x0000<=c&&c<=0x0019){ length = 0;
length += 0; for (; i < l; i++) {
}else if(0x0020<=c&&c<=0x1FFF){ c = str.charCodeAt(i);
length += 1; if (0x0000 <= c && c <= 0x0019) {
}else if(0x2000<=c&&c<=0xFF60){ length += 0;
length += 2; } else if (0x0020 <= c && c <= 0x1FFF) {
}else if(0xFF61<=c&&c<=0xFF9F){ length += 1;
length += 1; } else if (0x2000 <= c && c <= 0xFF60) {
}else if(0xFFA0<=c){ length += 2;
length += 2; } else if (0xFF61 <= c && c <= 0xFF9F) {
} length += 1;
} } else if (0xFFA0 <= c) {
return length; length += 2;
}; }
}
return length;
};
/** /**
* mb_strimwidth * mb_strimwidth
* @param String * @param String
* @param int * @param int
* @param int * @param int
* @param String * @param String
* @return String * @return String
* @see http://www.php.net/manual/ja/function.mb-strimwidth.php * @see http://www.php.net/manual/ja/function.mb-strimwidth.php
*/ */
var mb_strimwidth = function(str,start,width,trimmarker){ var mb_strimwidth = function(str, start, width, trimmarker) {
if(typeof trimmarker === 'undefined') trimmarker=''; if (typeof trimmarker === 'undefined') trimmarker = '';
var trimmakerWidth = mb_strwidth(trimmarker),i=start,l=str.length,trimmedLength=0,trimmedStr=''; var trimmakerWidth = mb_strwidth(trimmarker),
for(;i<l;i++){ i = start,
var charCode=str.charCodeAt(i),c=str.charAt(i),charWidth=mb_strwidth(c),next=str.charAt(i+1),nextWidth=mb_strwidth(next); l = str.length,
trimmedLength += charWidth; trimmedLength = 0,
trimmedStr += c; trimmedStr = '';
if(trimmedLength+trimmakerWidth+nextWidth>width){ for (; i < l; i++) {
trimmedStr += trimmarker; var charCode = str.charCodeAt(i),
break; c = str.charAt(i),
} charWidth = mb_strwidth(c),
} next = str.charAt(i + 1),
return trimmedStr; nextWidth = mb_strwidth(next);
}; trimmedLength += charWidth;
ns.mb_strwidth = mb_strwidth; trimmedStr += c;
ns.mb_strimwidth = mb_strimwidth; if (trimmedLength + trimmakerWidth + nextWidth > width) {
trimmedStr += trimmarker;
break;
}
}
return trimmedStr;
};
ns.mb_strwidth = mb_strwidth;
ns.mb_strimwidth = mb_strimwidth;
})(window); })(window);
/** /**
@@ -93,7 +105,7 @@ function isInt(n) {
*/ */
function convertDictById(arr) { function convertDictById(arr) {
var result = {}; var result = {};
arr.forEach(function (v, i) { arr.forEach(function(v, i) {
result[v.id] = v; result[v.id] = v;
}); });
return result; return result;
@@ -106,7 +118,7 @@ function convertDictById(arr) {
*/ */
function convertSet(arr) { function convertSet(arr) {
var result = {}; var result = {};
arr.forEach(function (v) { arr.forEach(function(v) {
result[v] = true; result[v] = true;
}); });
return result; return result;
@@ -115,7 +127,7 @@ function convertSet(arr) {
/** /**
* {0}, {1}, {2}형태로 포맷해주는 함수 * {0}, {1}, {2}형태로 포맷해주는 함수
*/ */
String.prototype.format = function() { String.prototype.format = function() {
var args = arguments; var args = arguments;
return this.replace(/{(\d+)}/g, function(match, number) { return this.replace(/{(\d+)}/g, function(match, number) {
@@ -134,12 +146,11 @@ function hexToRgb(hex) {
} }
function isBrightColor(color){ function isBrightColor(color) {
color = hexToRgb(color); color = hexToRgb(color);
if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){ if ((color.r * 0.299 + color.g * 0.587 + color.b * 0.114) > 140) {
return true; return true;
} } else {
else{
return false; return false;
} }
} }
@@ -177,7 +188,7 @@ function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
} }
function linkifyStrWithOpt(text){ function linkifyStrWithOpt(text) {
return linkifyStr(text, {}); return linkifyStr(text, {});
} }
@@ -188,14 +199,14 @@ function linkifyStrWithOpt(text){
* @param {object} options * @param {object} options
* @returns {string} * @returns {string}
*/ */
var TemplateEngine = function (html, options) { var TemplateEngine = function(html, options) {
var re = /<%(.+?)%>/g, var re = /<%(.+?)%>/g,
reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g, reExp = /(^( )?(var|if|for|else|switch|case|break|{|}|;))(.*)?/g,
code = 'with(obj) { var r=[];\n', code = 'with(obj) { var r=[];\n',
cursor = 0, cursor = 0,
result, result,
match; match;
var add = function (line, js) { var add = function(line, js) {
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') :
(code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : ''); (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
return add; return add;
@@ -208,82 +219,97 @@ var TemplateEngine = function (html, options) {
} }
add(html.substr(cursor, html.length - cursor)); add(html.substr(cursor, html.length - cursor));
code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' '); code = (code + 'return r.join(""); }').replace(/[\r\t\n]/g, ' ');
try { result = new Function('obj', code).apply(options, [options]); } try { result = new Function('obj', code).apply(options, [options]); } catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
catch (err) { console.error("'" + err.message + "'", " in \n\nCode:\n", code, "\n"); }
return result; return result;
} }
function getIconPath(imgsvr, picture){ function getIconPath(imgsvr, picture) {
// ../d_shared/common_path.js 필요 // ../d_shared/common_path.js 필요
if(!imgsvr){ if (!imgsvr) {
return pathConfig.sharedIcon+'/'+picture; return pathConfig.sharedIcon + '/' + picture;
} } else {
else{ return pathConfig.root + '/d_pic/' + picture;
return pathConfig.root+'/d_pic/'+picture;
} }
} }
function activeFlip($obj){ function activeFlip($obj) {
var $result; var $result;
if($obj === undefined){ if ($obj === undefined) {
$result = $('img[data-flip]'); $result = $('img[data-flip]');
} } else {
else{
$result = $obj.find('img[data-flip]'); $result = $obj.find('img[data-flip]');
} }
$result.each(function(){ $result.each(function() {
activeFlipItem($(this)); activeFlipItem($(this));
}); });
} }
function activeFlipItem($img){ function combineObject(item, columnList) {
var newItem = {};
for (var columnIdx in columnList) {
var columnName = columnList[columnIdx];
newItem[columnName] = item[columnIdx];
}
return newItem;
}
function combineArray(array, columnList) {
var result = [];
for (var key in array) {
var item = array[key];
result[key] = combineObject(item, columnList);
}
return result;
}
function activeFlipItem($img) {
var imageList = []; var imageList = [];
imageList.push($img.attr('src')); imageList.push($img.attr('src'));
$.each($img.data('flip').split(','), function(idx, value){ $.each($img.data('flip').split(','), function(idx, value) {
var value = $.trim(value); var value = $.trim(value);
if(!value){ if (!value) {
return true; return true;
} }
imageList.push(value); imageList.push(value);
}); });
if(imageList.length <= 1){ if (imageList.length <= 1) {
return; return;
} }
$img.data('computed_flip_array', imageList); $img.data('computed_flip_array', imageList);
$img.data('computed_flip_idx', 0); $img.data('computed_flip_idx', 0);
$img.click(function(){ $img.click(function() {
var arr = $img.data('computed_flip_array'); var arr = $img.data('computed_flip_array');
var idx = $img.data('computed_flip_idx'); var idx = $img.data('computed_flip_idx');
idx = (idx + 1)%(arr.length); idx = (idx + 1) % (arr.length);
$img.attr('src', arr[idx]); $img.attr('src', arr[idx]);
$img.data('computed_flip_idx', idx); $img.data('computed_flip_idx', idx);
}); });
$img.css('cursor','pointer'); $img.css('cursor', 'pointer');
} }
jQuery(function($){ jQuery(function($) {
$('.obj_tooltip').mouseover(function(){ $('.obj_tooltip').mouseover(function() {
var $objTooltip = $(this); var $objTooltip = $(this);
if($objTooltip.data('setObjTooltip')){ if ($objTooltip.data('setObjTooltip')) {
return true; return true;
} }
var tooltipClassText = $objTooltip.data('tooltip-class'); var tooltipClassText = $objTooltip.data('tooltip-class');
if(!tooltipClassText){ if (!tooltipClassText) {
tooltipClassText = ''; tooltipClassText = '';
} }
var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>' var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
.format(tooltipClassText); .format(tooltipClassText);
$objTooltip.tooltip({ $objTooltip.tooltip({
title:function(){ title: function() {
return $.trim($(this).find('.tooltiptext').html()); return $.trim($(this).find('.tooltiptext').html());
}, },
template:template, template: template,
html:true html: true
}).tooltip('show'); }).tooltip('show');
$objTooltip.data('setObjTooltip', true); $objTooltip.data('setObjTooltip', true);
@@ -297,7 +323,7 @@ jQuery(function($){
activeFlip(); activeFlip();
var customCSS = localStorage.getItem('sam_customCSS'); var customCSS = localStorage.getItem('sam_customCSS');
if(customCSS){ if (customCSS) {
var $style = $('<style type="text/css"></style>'); var $style = $('<style type="text/css"></style>');
$style.text(customCSS); $style.text(customCSS);
$style.appendTo($('head')); $style.appendTo($('head'));
@@ -307,11 +333,11 @@ jQuery(function($){
}); });
function errUnknown(){ function errUnknown() {
alert('작업을 실패했습니다.'); alert('작업을 실패했습니다.');
} }
function errUnknownToast(){ function errUnknownToast() {
$.toast({ $.toast({
title: '에러!', title: '에러!',
content: '작업을 실패했습니다.', content: '작업을 실패했습니다.',
@@ -320,8 +346,8 @@ function errUnknownToast(){
}); });
} }
function quickReject(errMsg){ function quickReject(errMsg) {
if(errMsg === undefined){ if (errMsg === undefined) {
errMsg = '작업을 실패했습니다.'; errMsg = '작업을 실패했습니다.';
} }
var deferred = $.Deferred(); var deferred = $.Deferred();
@@ -329,8 +355,8 @@ function quickReject(errMsg){
return deferred.promise(); return deferred.promise();
} }
function nl2br(text){ function nl2br(text) {
return text.replace(/\n/g,"<br>"); return text.replace(/\n/g, "<br>");
} }
/* /*
function br2nl (text) { function br2nl (text) {
@@ -338,12 +364,54 @@ function br2nl (text) {
} }
*/ */
function getNpcColor(npcType){ function getNpcColor(npcType) {
if(npcType >= 2){ if (npcType >= 2) {
return 'cyan'; return 'cyan';
} }
if(npcType == 1){ if (npcType == 1) {
return 'skyblue'; return 'skyblue';
} }
return null; return null;
} }
function initTooltip($obj) {
if ($obj === undefined) {
$obj = $('.obj_tooltip');
} else if (!$obj.hasClass('obj_tooltip')) {
$obj = $obj.find('.obj_tooltip');
}
console.log($obj);
$obj.each(function() {
$target = $(this);
if ($target.data('installHandler')) {
return true;
}
$target.data('installHandler', true);
$target.mouseover(function() {
var $objTooltip = $(this);
if ($objTooltip.data('setObjTooltip')) {
return true;
}
var tooltipClassText = $objTooltip.data('tooltip-class');
if (!tooltipClassText) {
tooltipClassText = '';
}
var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
.format(tooltipClassText);
$objTooltip.tooltip({
title: function() {
return $.trim($(this).find('.tooltiptext').html());
},
template: template,
html: true
}).tooltip('show');
$objTooltip.data('setObjTooltip', true);
});
});
}
+9 -9
View File
@@ -1,15 +1,15 @@
$(function(){ $(function() {
var $target = $("#destCityID"); var $target = $("#destCityID");
reloadWorldMap({ reloadWorldMap({
isDetailMap:false, isDetailMap: false,
clickableAll:true, clickableAll: true,
neutralView:true, neutralView: true,
useCachedMap:true, useCachedMap: true,
selectCallback:function(city){ selectCallback: function(city) {
var currVal = $target.val(); var currVal = $target.val();
$target.val(city.id); $target.val(city.id).trigger("change");
if($target.val() === null){ if ($target.val() === null) {
$target.val(currVal); $target.val(currVal).trigger("change");
} }
return false; return false;
} }
+9 -9
View File
@@ -1,15 +1,15 @@
$(function(){ $(function() {
var $target = $("#destNationID"); var $target = $("#destNationID");
reloadWorldMap({ reloadWorldMap({
isDetailMap:false, isDetailMap: false,
clickableAll:true, clickableAll: true,
neutralView:true, neutralView: true,
useCachedMap:true, useCachedMap: true,
selectCallback:function(city){ selectCallback: function(city) {
var currVal = $target.val(); var currVal = $target.val();
$target.val(city.nationId); $target.val(city.nationId).trigger("change");
if($target.val() === null){ if ($target.val() === null) {
$target.val(currVal); $target.val(currVal).trigger("change");
} }
return false; return false;
} }
+3 -3
View File
@@ -580,13 +580,13 @@ $(function() {
$this.data('username',name); $this.data('username',name);
if(cityList[cityName].$태수.text() == name){ if(cityList[cityName].$태수.text() == name){
cityList[cityName].$태수.css('color','lightgreen'); cityList[cityName].$태수.html('<span style="color:lightgreen">{0}</span>'.format(name));
} }
if(cityList[cityName].$군사.text() == name){ if(cityList[cityName].$군사.text() == name){
cityList[cityName].$군사.css('color','lightgreen'); cityList[cityName].$군사.html('<span style="color:lightgreen">{0}</span>'.format(name));
} }
if(cityList[cityName].$종사.text() == name){ if(cityList[cityName].$종사.text() == name){
cityList[cityName].$종사.css('color','lightgreen'); cityList[cityName].$종사.html('<span style="color:lightgreen">{0}</span>'.format(name));
} }
userList[name]={ userList[name]={
+69 -71
View File
@@ -1,4 +1,3 @@
/* /*
function showCityGeneral(cityIdx){ function showCityGeneral(cityIdx){
@@ -21,13 +20,13 @@ function loadScenarioPreview(scenarioIdx){
function loadScenarios(){ function loadScenarios() {
$.ajax({ $.ajax({
method:'post', method: 'post',
url:'j_load_scenarios.php', url: 'j_load_scenarios.php',
dataType:'json' dataType: 'json'
}).then(function(result){ }).then(function(result) {
if(!result.result){ if (!result.result) {
var deferred = $.Deferred(); var deferred = $.Deferred();
deferred.reject('fail'); deferred.reject('fail');
return deferred.promise(); return deferred.promise();
@@ -37,18 +36,18 @@ function loadScenarios(){
var list = {}; var list = {};
$.each(result.scenario, function(idx, value){ $.each(result.scenario, function(idx, value) {
var title = value.title || "-"; var title = value.title || "-";
var pat = /【(.*?)[0-9\-_\.a-zA-Z]*】/; var pat = /【(.*?)[0-9\-_\.a-zA-Z]*】/;
var category = pat.exec(title); var category = pat.exec(title);
category = category?category[1]:'-'; category = category ? category[1] : '-';
value.title = title; value.title = title;
value.category = category; value.category = category;
value.idx = idx; value.idx = idx;
value.year = value.year || 180; value.year = value.year || 180;
if(!(category in list)){ if (!(category in list)) {
list[category] = {}; list[category] = {};
} }
@@ -56,12 +55,12 @@ function loadScenarios(){
}); });
var $select = $('#scenario_sel'); var $select = $('#scenario_sel');
$.each(list, function(category, items){ $.each(list, function(category, items) {
var $optgroup = $('<optgroup>').attr('label', category); var $optgroup = $('<optgroup>').attr('label', category);
$.each(items, function(idx, scenario){ $.each(items, function(idx, scenario) {
var $option = $('<option>') var $option = $('<option>')
.data('scenario',scenario) .data('scenario', scenario)
.val(idx) .val(idx)
.html(scenario.title); .html(scenario.title);
$optgroup.append($option); $optgroup.append($option);
@@ -75,7 +74,7 @@ function loadScenarios(){
}); });
} }
function scenarioPreview(){ function scenarioPreview() {
var $select = $(this); var $select = $(this);
var $option = $select.find('option:selected'); var $option = $select.find('option:selected');
@@ -89,124 +88,123 @@ function scenarioPreview(){
$year.html('{0}년'.format(scenario.year)); $year.html('{0}년'.format(scenario.year));
$npc.html('{0}명'.format(scenario.npc_cnt)); $npc.html('{0}명'.format(scenario.npc_cnt));
if(scenario.npcEx_cnt == 0){ if (scenario.npcEx_cnt == 0) {
$npcEx.html(''); $npcEx.html('');
} } else {
else{
$npcEx.html('+{0}명'.format(scenario.npcEx_cnt)); $npcEx.html('+{0}명'.format(scenario.npcEx_cnt));
} }
$nation.html(''); $nation.html('');
$.each(scenario.nation, function(idx, nation){ $.each(scenario.nation, function(idx, nation) {
$nation.append('<span style="color:{0}">{1}</span> {2}명. {3}<br>'.format( $nation.append('<span style="color:{0}">{1}</span> {2}명. {3}<br>'.format(
nation.color, nation.name, nation.generals, nation.cities.join(', ') nation.color, nation.name, nation.generals, nation.cities.join(', ')
)); ));
}); });
} }
function formSetup(){ function formSetup() {
$.validator.addMethod("autorun_user", function(value,element){ $.validator.addMethod("autorun_user", function(value, element) {
var parent = $(element).parent('.input-group'); var parent = $(element).parent('.input-group');
var checkCnt = parent.find('input:checked').length; var checkCnt = parent.find('input:checked').length;
if(value <= 0){ if (value <= 0) {
if(checkCnt > 0){ if (checkCnt > 0) {
return false; return false;
} }
return true; return true;
} }
if(checkCnt == 0){ if (checkCnt == 0) {
return false; return false;
} }
return true; return true;
}, "유효 시간과 옵션은 동시에 설정해야합니다."); }, "유효 시간과 옵션은 동시에 설정해야합니다.");
$('#game_form').validate({ $('#game_form').validate({
rules:{ rules: {
turnterm:"required", turnterm: "required",
sync:"required", sync: "required",
scenario:"required", scenario: "required",
fiction:"required", fiction: "required",
extend:"required", extend: "required",
npcmode:"required", npcmode: "required",
show_img_level:"required", show_img_level: "required",
tournament_trig:"required", tournament_trig: "required",
join_mode:'required', join_mode: 'required',
autorun_user_minutes:{required: true, autorun_user: true, min:0} autorun_user_minutes: { required: true, autorun_user: true, min: 0 }
}, },
errorElement: "div", errorElement: "div",
errorPlacement: function ( error, element ) { errorPlacement: function(error, element) {
// Add the `help-block` class to the error element // Add the `help-block` class to the error element
error.addClass( "invalid-feedback" ); error.addClass("invalid-feedback");
if ( element.prop( "type" ) === "checkbox" ) { if (element.prop("type") === "checkbox") {
error.insertAfter( element.parent( "label" ) ); error.insertAfter(element.parent("label"));
} else { } else {
error.insertAfter( element ); error.insertAfter(element);
} }
}, },
highlight: function ( element, errorClass, validClass ) { highlight: function(element, errorClass, validClass) {
$( element ).addClass( "is-invalid" ).removeClass( "is-valid" ); $(element).addClass("is-invalid").removeClass("is-valid");
}, },
unhighlight: function (element, errorClass, validClass) { unhighlight: function(element, errorClass, validClass) {
$( element ).addClass( "is-valid" ).removeClass( "is-invalid" ); $(element).addClass("is-valid").removeClass("is-invalid");
} }
}); });
$('#game_form').submit(function(e){ $('#game_form').submit(function(e) {
e.preventDefault(); e.preventDefault();
if(!$("#game_form").valid()){ if (!$("#game_form").valid()) {
return; return;
} }
var autorun_user_minutes = parseInt($('#autorun_user_minutes').val()); var autorun_user_minutes = parseInt($('#autorun_user_minutes').val());
var autorun_user = []; var autorun_user = [];
if(autorun_user_minutes > 0){ if (autorun_user_minutes > 0) {
$('.autorun_user_chk:checked').each(function(){ $('.autorun_user_chk:checked').each(function() {
autorun_user.push($(this).data('key')); autorun_user.push($(this).data('key'));
}); });
} }
$.ajax({ $.ajax({
cache:false, cache: false,
type:'post', type: 'post',
url:'j_install.php', url: 'j_install.php',
dataType:'json', dataType: 'json',
data:{ data: {
turnterm:$('#turnterm input:radio:checked').val(), turnterm: $('#turnterm input:radio:checked').val(),
sync:$('#sync input:radio:checked').val(), sync: $('#sync input:radio:checked').val(),
scenario:$('#scenario_sel').val(), scenario: $('#scenario_sel').val(),
fiction:$('#fiction input:radio:checked').val(), fiction: $('#fiction input:radio:checked').val(),
extend:$('#extend input:radio:checked').val(), extend: $('#extend input:radio:checked').val(),
npcmode:$('#npcmode input:radio:checked').val(), block_general_create: $('#block_general_create input:radio:checked').val(),
show_img_level:$('#show_img_level input:radio:checked').val(), npcmode: $('#npcmode input:radio:checked').val(),
tournament_trig:$('#tournament_trig input:radio:checked').val(), show_img_level: $('#show_img_level input:radio:checked').val(),
reserve_open:$('#reserve_open').val(), tournament_trig: $('#tournament_trig input:radio:checked').val(),
pre_reserve_open:$('#pre_reserve_open').val(), reserve_open: $('#reserve_open').val(),
join_mode:$('#join_mode input:radio:checked').val(), pre_reserve_open: $('#pre_reserve_open').val(),
autorun_user_minutes:autorun_user_minutes, join_mode: $('#join_mode input:radio:checked').val(),
autorun_user:autorun_user autorun_user_minutes: autorun_user_minutes,
autorun_user: autorun_user
} }
}).then(function(result){ }).then(function(result) {
var deferred = $.Deferred(); var deferred = $.Deferred();
if(!result.result){ if (!result.result) {
alert(result.reason); alert(result.reason);
deferred.reject('fail'); deferred.reject('fail');
} } else {
else{
alert('게임이 리셋되었습니다.'); alert('게임이 리셋되었습니다.');
deferred.resolve(); deferred.resolve();
} }
return deferred.promise(); return deferred.promise();
}).then(function(){ }).then(function() {
location.href = '..'; location.href = '..';
}); });
}); });
} }
$(function(){ $(function() {
loadScenarios(); loadScenarios();
$('#scenario_sel').change(scenarioPreview); $('#scenario_sel').change(scenarioPreview);
formSetup(); formSetup();
+218 -186
View File
@@ -1,8 +1,7 @@
function is_touch_device() { function is_touch_device() {
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' '); var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
var mq = function(query) { var mq = function(query) {
return window.matchMedia(query).matches; return window.matchMedia(query).matches;
} }
if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) { if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) {
@@ -14,32 +13,39 @@ function is_touch_device() {
// https://git.io/vznFH // https://git.io/vznFH
var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join(''); var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
return mq(query); return mq(query);
} }
function reloadWorldMap(option){ function reloadWorldMap(option, drawTarget) {
var $world_map = $('.world_map'); if (drawTarget === undefined || drawTarget === null) {
drawTarget = '.world_map'
}
var $world_map = $(drawTarget);
if($world_map.length == 0){ if ($world_map.length == 0) {
return; return;
} }
var defaultOption = { var defaultOption = {
isDetailMap:true, //복잡 지도, 단순 지도 isDetailMap: true, //복잡 지도, 단순 지도
clickableAll:false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도. clickableAll: false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도.
selectCallback:null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행. selectCallback: null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행.
hrefTemplate:'#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨 hrefTemplate: '#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨
useCachedMap:false, //맵 캐시를 사용 useCachedMap: false, //맵 캐시를 사용
//아래부터는 post query에 들어갈 녀석 //아래부터는 post query에 들어갈 녀석
year:null, //year값, 연감등에 사용 year: null, //year값, 연감등에 사용
month:null, //month값, 연감등에 사용 month: null, //month값, 연감등에 사용
aux:null, //기타 넣고 싶은 값을 입력 aux: null, //기타 넣고 싶은 값을 입력
neutralView:false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정 neutralView: false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정
showMe:true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개 showMe: true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개
targetJson:'j_map.php',
targetJson: 'j_map.php',
reqType: 'post',
dynamicMapTheme: false,
callback: null,
//기타 보조 값 //기타 보조 값
startYear:null, startYear: null,
}; };
option = $.extend(defaultOption, option); option = $.extend(defaultOption, option);
@@ -56,23 +62,23 @@ function reloadWorldMap(option){
var storedStartYear = 'sam.{0}.startYear'.format(serverNick); var storedStartYear = 'sam.{0}.startYear'.format(serverNick);
//OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity //OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity
function checkReturnObject(obj){ function checkReturnObject(obj) {
if(!obj.result){ if (!obj.result) {
var obj = $.Deferred(); var obj = $.Deferred();
obj.reject('fail'); obj.reject('fail');
return obj.promise(); return obj.promise();
} }
if(!$.isNumeric(obj.startYear) if (!$.isNumeric(obj.startYear) ||
||!$.isNumeric(obj.year) !$.isNumeric(obj.year) ||
||!$.isNumeric(obj.month) !$.isNumeric(obj.month)
){ ) {
var obj = $.Deferred(); var obj = $.Deferred();
obj.reject('fail'); obj.reject('fail');
return obj.promise(); return obj.promise();
} }
if(useCachedMap){ if (useCachedMap) {
localStorage.setItem(storedOldMapKey, JSON.stringify([serverID, obj])); localStorage.setItem(storedOldMapKey, JSON.stringify([serverID, obj]));
localStorage.setItem(storedStartYear, JSON.stringify(obj.startYear)); localStorage.setItem(storedStartYear, JSON.stringify(obj.startYear));
} }
@@ -82,26 +88,40 @@ function reloadWorldMap(option){
return obj; return obj;
} }
function setMapBackground(obj){
function setMapBackground(obj) {
function setTheme() {
var oldTheme = $world_map.data('currentTheme');
var newTheme = obj.theme;
if (oldTheme === newTheme) {
return;
}
if (oldTheme) {
$world_map.removeClass('map_theme_' + oldTheme);
}
$world_map.addClass('map_theme_' + newTheme);
$world_map.data('currentTheme', newTheme);
}
if (option.dynamicMapTheme) {
setTheme();
}
var startYear = obj.startYear; var startYear = obj.startYear;
var year = obj.year; var year = obj.year;
var month = obj.month; var month = obj.month;
if(isDetailMap){ if (isDetailMap) {
$world_map.addClass('map_detail').removeClass('map_basic'); $world_map.addClass('map_detail').removeClass('map_basic');
} } else {
else{
$world_map.addClass('map_basic').removeClass('map_detail'); $world_map.addClass('map_basic').removeClass('map_detail');
} }
var $map_title = $('.map_title_text'); var $map_title = $('.map_title_text');
if(year < startYear + 1){ if (year < startYear + 1) {
$map_title.css('color', 'magenta'); $map_title.css('color', 'magenta');
} } else if (year < startYear + 2) {
else if(year < startYear + 2){
$map_title.css('color', 'orange'); $map_title.css('color', 'orange');
} } else if (year < startYear + 3) {
else if(year < startYear + 3){
$map_title.css('color', 'yellow'); $map_title.css('color', 'yellow');
} }
@@ -109,17 +129,17 @@ function reloadWorldMap(option){
$map_title_tooltip.empty(); $map_title_tooltip.empty();
var tooltipTexts = []; var tooltipTexts = [];
if(year < startYear + 3){ if (year < startYear + 3) {
var startYearText = []; var startYearText = [];
var remainYear = startYear + 3 - year; var remainYear = startYear + 3 - year;
var remainMonth = 12 - month + 1; var remainMonth = 12 - month + 1;
if(remainMonth > 0){ if (remainMonth > 0) {
remainYear -= 1; remainYear -= 1;
} }
if(remainYear){ if (remainYear) {
startYearText.push('{0}년'.format(remainYear)); startYearText.push('{0}년'.format(remainYear));
} }
if(remainMonth){ if (remainMonth) {
startYearText.push('{0}개월'.format(remainMonth)); startYearText.push('{0}개월'.format(remainMonth));
} }
@@ -129,20 +149,17 @@ function reloadWorldMap(option){
var currentTechLimit = Math.floor(Math.max(0, year - startYear) / 5) + 1; var currentTechLimit = Math.floor(Math.max(0, year - startYear) / 5) + 1;
var nextTechLimitYear = currentTechLimit * 5 + startYear; var nextTechLimitYear = currentTechLimit * 5 + startYear;
tooltipTexts.push('기술등급 제한 : {0}등급 ({1}년 해제)'.format(currentTechLimit, nextTechLimitYear, currentTechLimit+1)); tooltipTexts.push('기술등급 제한 : {0}등급 ({1}년 해제)'.format(currentTechLimit, nextTechLimitYear, currentTechLimit + 1));
$map_title_tooltip.html(tooltipTexts.join('<br>')); $map_title_tooltip.html(tooltipTexts.join('<br>'));
$world_map.removeClass('map_string map_summer map_fall map_winter'); $world_map.removeClass('map_string map_summer map_fall map_winter');
if(month <= 3){ if (month <= 3) {
$world_map.addClass('map_spring'); $world_map.addClass('map_spring');
} } else if (month <= 6) {
else if(month <= 6){
$world_map.addClass('map_summer'); $world_map.addClass('map_summer');
} } else if (month <= 9) {
else if(month <= 9){
$world_map.addClass('map_fall'); $world_map.addClass('map_fall');
} } else {
else{
$world_map.addClass('map_winter'); $world_map.addClass('map_winter');
} }
@@ -151,26 +168,26 @@ function reloadWorldMap(option){
return obj; return obj;
} }
function convertCityObjs(obj){ function convertCityObjs(obj) {
//원본 Obj는 굉장히 간소하게 온다, Object 형태로 변환해서 사용한다. //원본 Obj는 굉장히 간소하게 온다, Object 형태로 변환해서 사용한다.
function toCityObj(arr){ function toCityObj(arr) {
return { return {
id:arr[0], id: arr[0],
level:arr[1], level: arr[1],
state:arr[2], state: arr[2],
nationId:(arr[3]>0)?arr[3]:null, nationId: (arr[3] > 0) ? arr[3] : null,
region:arr[4], region: arr[4],
supply:(arr[5]!=0) supply: (arr[5] != 0)
}; };
} }
function toNationObj(arr){ function toNationObj(arr) {
return { return {
id:arr[0], id: arr[0],
name:arr[1], name: arr[1],
color:arr[2], color: arr[2],
capital:arr[3] capital: arr[3]
}; };
} }
@@ -179,15 +196,15 @@ function reloadWorldMap(option){
nationList = convertDictById(nationList); //array of object -> dict nationList = convertDictById(nationList); //array of object -> dict
var spyList = obj.spyList; var spyList = obj.spyList;
var shownByGeneralList = convertSet(obj.shownByGeneralList);//Array -> Set var shownByGeneralList = convertSet(obj.shownByGeneralList); //Array -> Set
var myCity = obj.myCity; var myCity = obj.myCity;
var myNation = obj.myNation; var myNation = obj.myNation;
function mergePositionInfo(city){ function mergePositionInfo(city) {
var id = city.id; var id = city.id;
if(!(id in cityPosition)){ if (!(id in cityPosition)) {
return city; return city;
} }
var xy_val = cityPosition[id]; var xy_val = cityPosition[id];
@@ -197,11 +214,11 @@ function reloadWorldMap(option){
return city; return city;
} }
function mergeNationInfo(city){ function mergeNationInfo(city) {
//nationId 값으로 isCapital, color, nation을 통합 //nationId 값으로 isCapital, color, nation을 통합
var nationId = city.nationId; var nationId = city.nationId;
if(nationId === null || !(nationId in nationList)){ if (nationId === null || !(nationId in nationList)) {
city.nationId = null; city.nationId = null;
city.nation = null; city.nation = null;
city.color = null; city.color = null;
@@ -217,24 +234,24 @@ function reloadWorldMap(option){
return city; return city;
} }
function mergeClickable(city){ function mergeClickable(city) {
//clickable = (remainSpy << 3) | (ourCity << 2) | (shownByGeneral << 1) | clickableAll //clickable = (defaultCity << 4 ) | (remainSpy << 3) | (ourCity << 2) | (shownByGeneral << 1) | clickableAll
var id = city.id; var id = city.id;
var nationId = city.nationId; var nationId = city.nationId;
var clickable = 0; var clickable = 16;
if(id in spyList){ if (id in spyList) {
clickable |= spyList[id] << 3; clickable |= spyList[id] << 3;
} }
if(myNation !== null && nationId == myNation){ if (myNation !== null && nationId == myNation) {
clickable |= 4; clickable |= 4;
} }
if(shownByGeneralList.hasOwnProperty(id)){ if (shownByGeneralList.hasOwnProperty(id)) {
clickable |= 2; clickable |= 2;
} }
if(myCity !== null && id == myCity){ if (myCity !== null && id == myCity) {
clickable |= 2; clickable |= 2;
} }
if(clickableAll){ if (clickableAll) {
clickable |= 1; clickable |= 1;
} }
@@ -250,35 +267,35 @@ function reloadWorldMap(option){
.map(formatCityInfo); .map(formatCityInfo);
return { return {
'cityList' : cityList, 'cityList': cityList,
'myCity' : myCity 'myCity': myCity
}; };
} }
function drawDetailWorldMap(obj){ function drawDetailWorldMap(obj) {
var $map_body = $('.world_map .map_body'); var $map_body = $(drawTarget + ' .map_body');
var cityList = obj.cityList; var cityList = obj.cityList;
var myCity = obj.myCity; var myCity = obj.myCity;
cityList.forEach(function(city){ cityList.forEach(function(city) {
var id = city.id; var id = city.id;
$('.city_base_{0}'.format(id)).detach(); $('.city_base_{0}'.format(id)).detach();
//이전 도시는 지운다. //이전 도시는 지운다.
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id)); var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
$cityObj.addClass('city_level_{0}'.format(city.level)); $cityObj.addClass('city_level_{0}'.format(city.level));
$cityObj.data('obj', city).css({'left':city.x-20,'top':city.y-15}); $cityObj.data('obj', city).css({ 'left': city.x - 20, 'top': city.y - 15 });
if('color' in city && city.color !== null){ if ('color' in city && city.color !== null) {
var $bgObj = $('<div class="city_bg"></div>'); var $bgObj = $('<div class="city_bg"></div>');
$cityObj.append($bgObj); $cityObj.append($bgObj);
$bgObj.css({'background-image':'url({0}/b{1}.png)'.format(pathConfig.gameImage, convColorValue(city.color))}); $bgObj.css({ 'background-image': 'url({0}/b{1}.png)'.format(pathConfig.gameImage, convColorValue(city.color)) });
} }
var $linkObj = $('<a class="city_link"></a>'); var $linkObj = $('<a class="city_link"></a>');
$linkObj.data({'text':city.text,'nation':city.nation,'id':city.id}); $linkObj.data({ 'text': city.text, 'nation': city.nation, 'id': city.id });
$cityObj.append($linkObj); $cityObj.append($linkObj);
var $imgObj = $('<div class="city_img"><img src="{0}/cast_{1}.gif"><div class="city_filler"></div></div>'.format(pathConfig.gameImage, city.level)); var $imgObj = $('<div class="city_img"><img src="{0}/cast_{1}.gif"><div class="city_filler"></div></div>'.format(pathConfig.gameImage, city.level));
@@ -286,15 +303,15 @@ function reloadWorldMap(option){
if(city.state > 0){ if (city.state > 0) {
var $stateObj = $('<div class="city_state"><img src="{0}/event{1}.gif"></div>'.format(pathConfig.gameImage, city.state)); var $stateObj = $('<div class="city_state"><img src="{0}/event{1}.gif"></div>'.format(pathConfig.gameImage, city.state));
$linkObj.append($stateObj); $linkObj.append($stateObj);
} }
if(city.nationId && city.nationId > 0){ if (city.nationId && city.nationId > 0) {
var flagType = city.supply?'f':'d'; var flagType = city.supply ? 'f' : 'd';
var $flagObj = $('<div class="city_flag"><img src="{0}/{1}{2}.gif"></div>'.format(pathConfig.gameImage, flagType, convColorValue(city.color))); var $flagObj = $('<div class="city_flag"><img src="{0}/{1}{2}.gif"></div>'.format(pathConfig.gameImage, flagType, convColorValue(city.color)));
if(city.isCapital){ if (city.isCapital) {
var $capitalObj = $('<div class="city_capital"><img src="{0}/event51.gif"></div>'.format(pathConfig.gameImage)); var $capitalObj = $('<div class="city_capital"><img src="{0}/event51.gif"></div>'.format(pathConfig.gameImage));
$flagObj.append($capitalObj); $flagObj.append($capitalObj);
} }
@@ -315,41 +332,39 @@ function reloadWorldMap(option){
return obj; return obj;
} }
function drawBasicWorldMap(obj){ function drawBasicWorldMap(obj) {
var $map_body = $('.world_map .map_body'); var $map_body = $(drawTarget + ' .map_body');
var cityList = obj.cityList; var cityList = obj.cityList;
var myCity = obj.myCity; var myCity = obj.myCity;
cityList.forEach(function(city){ cityList.forEach(function(city) {
var id = city.id; var id = city.id;
$('.city_base_{0}'.format(id)).detach(); $('.city_base_{0}'.format(id)).detach();
//이전 도시는 지운다. //이전 도시는 지운다.
var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id)); var $cityObj = $('<div class="city_base city_base_{0}"></div>'.format(id));
$cityObj.addClass('city_level_{0}'.format(city.level)); $cityObj.addClass('city_level_{0}'.format(city.level));
$cityObj.data('obj', city).css({'left':city.x-20,'top':city.y-15}); $cityObj.data('obj', city).css({ 'left': city.x - 20, 'top': city.y - 15 });
var $linkObj = $('<a class="city_link"></a>'); var $linkObj = $('<a class="city_link"></a>');
$linkObj.data({'text':city.text,'nation':city.nation,'id':city.id}); $linkObj.data({ 'text': city.text, 'nation': city.nation, 'id': city.id });
$cityObj.append($linkObj); $cityObj.append($linkObj);
var $imgObj = $('<div class="city_img"><div class="city_filler"></div></div>'); var $imgObj = $('<div class="city_img"><div class="city_filler"></div></div>');
if('color' in city && city.color !== null){ if ('color' in city && city.color !== null) {
$imgObj.css({'background-color':city.color}); $imgObj.css({ 'background-color': city.color });
} }
$linkObj.append($imgObj); $linkObj.append($imgObj);
if(city.state > 0){ if (city.state > 0) {
var state_text = 'wrong'; var state_text = 'wrong';
if(city.state < 10){ if (city.state < 10) {
state_text = 'good'; state_text = 'good';
} } else if (city.state < 40) {
else if(city.state < 40){
state_text = 'bad'; state_text = 'bad';
} } else if (city.state < 50) {
else if(city.state < 50){
state_text = 'war'; state_text = 'war';
} }
@@ -358,7 +373,7 @@ function reloadWorldMap(option){
} }
//단순 표기에서는 깃발 여부가 없음 //단순 표기에서는 깃발 여부가 없음
if(city.isCapital){ if (city.isCapital) {
var $capitalObj = $('<div class="city_capital"></div>'); var $capitalObj = $('<div class="city_capital"></div>');
$imgObj.append($capitalObj); $imgObj.append($capitalObj);
} }
@@ -374,32 +389,30 @@ function reloadWorldMap(option){
return obj; return obj;
} }
function setMouseWork(obj){ function setMouseWork(obj) {
var $tooltip = $('.world_map .city_tooltip'); var $tooltip = $(drawTarget + ' .city_tooltip');
var $tooltip_city = $tooltip.find('.city_name'); var $tooltip_city = $tooltip.find('.city_name');
var $tooltip_nation = $tooltip.find('.nation_name'); var $tooltip_nation = $tooltip.find('.nation_name');
var $objs = $('.world_map .city_link'); var $objs = $(drawTarget + ' .city_link');
var $map_body = $('.world_map .map_body'); var $map_body = $(drawTarget + ' .map_body');
//터치스크린 탭 //터치스크린 탭
if(!option.neutralView && is_touch_device()){ if (!option.neutralView && is_touch_device()) {
$objs.on('touchstart', function(e){ $objs.on('touchstart', function(e) {
if(window.sam_toggleSingleTap){ if (window.sam_toggleSingleTap) {
return true; return true;
} }
var $this = $(this); var $this = $(this);
var touchMode = $this.data('touchMode'); var touchMode = $this.data('touchMode');
if($tooltip_city.data('target') != $this.data('id')){ if ($tooltip_city.data('target') != $this.data('id')) {
$this.data('touchMode', 1); $this.data('touchMode', 1);
} } else if (touchMode === undefined) {
else if(touchMode === undefined){
$this.data('touchMode', 1); $this.data('touchMode', 1);
} } else {
else{
$this.data('touchMode', touchMode + 1); $this.data('touchMode', touchMode + 1);
} }
$map_body.data('touchMode', 1); $map_body.data('touchMode', 1);
@@ -409,8 +422,8 @@ function reloadWorldMap(option){
}); });
$objs.on('touchend', function(e){ $objs.on('touchend', function(e) {
if(window.sam_toggleSingleTap){ if (window.sam_toggleSingleTap) {
return true; return true;
} }
var $this = $(this); var $this = $(this);
@@ -418,17 +431,25 @@ function reloadWorldMap(option){
$tooltip_city.html($this.data('text')); $tooltip_city.html($this.data('text'));
var nation_text = $this.data('nation'); var nation_text = $this.data('nation');
if(nation_text){ if (nation_text) {
$tooltip_nation.html(nation_text).show(); $tooltip_nation.html(nation_text).show();
} } else {
else{
$tooltip_nation.html('').hide(); $tooltip_nation.html('').hide();
} }
$tooltip.css({'top': position.top + 25, 'left': position.left + 35}).show(); var left = position.left;
var top = position.top;
var scale = $map_body.data('scale');
if (scale) {
left /= scale;
top /= scale;
}
$tooltip.css({ 'top': top + 25, 'left': left + 35 }).show();
var touchMode = $this.data('touchMode'); var touchMode = $this.data('touchMode');
if(touchMode <= 1){ if (touchMode <= 1) {
return false; return false;
} }
@@ -436,8 +457,8 @@ function reloadWorldMap(option){
$this.data('touchMode', 0); $this.data('touchMode', 0);
}); });
$map_body.on('touchend',function(e){ $map_body.on('touchend', function(e) {
if(window.sam_toggleSingleTap){ if (window.sam_toggleSingleTap) {
return true; return true;
} }
//위의 touchend bind에 해당하지 않는 경우 -> 빈 지도 터치 //위의 touchend bind에 해당하지 않는 경우 -> 빈 지도 터치
@@ -448,20 +469,26 @@ function reloadWorldMap(option){
//Mouse over 모드 작동 //Mouse over 모드 작동
$map_body.on('mousemove', function(e){ $map_body.on('mousemove', function(e) {
if($(this).data('touchMode')){ if ($(this).data('touchMode')) {
return true; return true;
} }
var parentOffset = $map_body.offset(); var rect = this.getBoundingClientRect();
var relX = e.pageX - parentOffset.left; var left = (e.clientX - rect.left - this.clientLeft + this.scrollLeft);
var relY = e.pageY - parentOffset.top; var top = (e.clientY - rect.top - this.clientTop + this.scrollTop);
$tooltip.css({'top': relY + 10, 'left': relX + 10}); var scale = $map_body.data('scale');
if (scale) {
left /= scale;
top /= scale;
}
$tooltip.css({ 'top': top + 10, 'left': left + 10 });
}); });
$objs.on('mouseenter', function(e){ $objs.on('mouseenter', function(e) {
if($map_body.data('touchMode')){ if ($map_body.data('touchMode')) {
return true; return true;
} }
@@ -470,28 +497,27 @@ function reloadWorldMap(option){
$tooltip_city.data('target', $this.data('id')); $tooltip_city.data('target', $this.data('id'));
$tooltip_city.html($this.data('text')); $tooltip_city.html($this.data('text'));
var nation_text = $this.data('nation'); var nation_text = $this.data('nation');
if(nation_text){ if (nation_text) {
$tooltip_nation.html(nation_text).show(); $tooltip_nation.html(nation_text).show();
} } else {
else{
$tooltip_nation.html('').hide(); $tooltip_nation.html('').hide();
} }
$tooltip.show(); $tooltip.show();
}); });
$objs.on('mouseleave', function(event){ $objs.on('mouseleave', function(event) {
$tooltip.hide(); $tooltip.hide();
}); });
$objs.on('click', function(e){ $objs.on('click', function(e) {
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다. //xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
var touchMode = $(this).data('touchMode'); var touchMode = $(this).data('touchMode');
if(touchMode === undefined){ if (touchMode === undefined) {
return; return;
} }
if(touchMode === 1){ if (touchMode === 1) {
return false; return false;
} }
}); });
@@ -500,17 +526,17 @@ function reloadWorldMap(option){
return obj; return obj;
} }
function setCityClickable(obj){ function setCityClickable(obj) {
obj.cityList.forEach(function(city){ obj.cityList.forEach(function(city) {
var $cityLink = $world_map.find('.city_base_{0} .city_link'.format(city.id)); var $cityLink = $world_map.find('.city_base_{0} .city_link'.format(city.id));
if('clickable' in city && city.clickable > 0){ if ('clickable' in city && city.clickable > 0) {
$cityLink.attr('href',hrefTemplate.format(city.id)); $cityLink.attr('href', hrefTemplate.format(city.id));
} }
if(selectCallback){ if (selectCallback) {
$cityLink.click(function(){ $cityLink.click(function() {
return selectCallback(city); return selectCallback(city);
}); });
} }
@@ -519,127 +545,133 @@ function reloadWorldMap(option){
return obj; return obj;
} }
function saveCityInfo(obj){ function saveCityInfo(obj) {
$world_map.data('cityInfo', obj); $world_map.data('cityInfo', obj);
return obj; return obj;
} }
var $hideCityNameBtn = $world_map.find('.map_toggle_cityname'); var $hideCityNameBtn = $world_map.find('.map_toggle_cityname');
if(localStorage.getItem('sam.hideMapCityName') == 'yes'){ if (localStorage.getItem('sam.hideMapCityName') == 'yes') {
$world_map.addClass('hide_cityname'); $world_map.addClass('hide_cityname');
$hideCityNameBtn.addClass('active').attr('aria-pressed', 'true'); $hideCityNameBtn.addClass('active').attr('aria-pressed', 'true');
} }
$hideCityNameBtn.click(function(){ $hideCityNameBtn.click(function() {
//이전 상태 확인 //이전 상태 확인
var state = !$hideCityNameBtn.hasClass('active'); var state = !$hideCityNameBtn.hasClass('active');
if(state){ if (state) {
$world_map.addClass('hide_cityname'); $world_map.addClass('hide_cityname');
localStorage.setItem('sam.hideMapCityName', 'yes'); localStorage.setItem('sam.hideMapCityName', 'yes');
} } else {
else{
$world_map.removeClass('hide_cityname'); $world_map.removeClass('hide_cityname');
localStorage.setItem('sam.hideMapCityName', 'no'); localStorage.setItem('sam.hideMapCityName', 'no');
} }
}); });
var $toggleSingleTapBtn = $world_map.find('.map_toggle_single_tap'); var $toggleSingleTapBtn = $world_map.find('.map_toggle_single_tap');
if(localStorage.getItem('sam.toggleSingleTap') == 'yes'){ if (localStorage.getItem('sam.toggleSingleTap') == 'yes') {
window.sam_toggleSingleTap = true; window.sam_toggleSingleTap = true;
$toggleSingleTapBtn.addClass('active').attr('aria-pressed', 'true'); $toggleSingleTapBtn.addClass('active').attr('aria-pressed', 'true');
} } else {
else{
window.sam_toggleSingleTap = false; window.sam_toggleSingleTap = false;
} }
var $map_body = $('.world_map .map_body'); var $map_body = $(drawTarget + ' .map_body');
$toggleSingleTapBtn.click(function(){ $toggleSingleTapBtn.click(function() {
//이전 상태 확인 //이전 상태 확인
var state = !$toggleSingleTapBtn.hasClass('active'); var state = !$toggleSingleTapBtn.hasClass('active');
if(state){ if (state) {
$map_body.removeData('touchMode'); $map_body.removeData('touchMode');
localStorage.setItem('sam.toggleSingleTap', 'yes'); localStorage.setItem('sam.toggleSingleTap', 'yes');
window.sam_toggleSingleTap = true; window.sam_toggleSingleTap = true;
} } else {
else{
localStorage.setItem('sam.toggleSingleTap', 'no'); localStorage.setItem('sam.toggleSingleTap', 'no');
window.sam_toggleSingleTap = false; window.sam_toggleSingleTap = false;
} }
}); });
if(isDetailMap){ if (isDetailMap) {
$world_map.addClass('map_detail'); $world_map.addClass('map_detail');
} } else {
else{
$world_map.removeClass('map_datail'); $world_map.removeClass('map_datail');
} }
//deferred mode of jQuery. != promise-then. //deferred mode of jQuery. != promise-then.
var deferred = $.ajax({ var deferred = $.ajax({
url: option.targetJson, url: option.targetJson,
type: 'post', type: option.reqType,
dataType:'json', dataType: 'json',
ifModified: true,
data: { data: {
data: JSON.stringify({ data: JSON.stringify({
neutralView:option.neutralView, neutralView: option.neutralView,
year:option.year, year: option.year,
month:option.month, month: option.month,
showMe:option.showMe, showMe: option.showMe,
aux:option.aux aux: option.aux
}) })
} }
}); });
var rawObject = null;
deferred deferred
.then(function(data) {
rawObject = data;
return data;
})
.then(checkReturnObject) .then(checkReturnObject)
.then(setMapBackground) .then(setMapBackground)
.then(convertCityObjs) .then(convertCityObjs)
.then(isDetailMap?drawDetailWorldMap:drawBasicWorldMap) .then(isDetailMap ? drawDetailWorldMap : drawBasicWorldMap)
.then(setMouseWork) .then(setMouseWork)
.then(setCityClickable) .then(setCityClickable)
.then(saveCityInfo); .then(saveCityInfo)
.then(function(data) {
if (option.callback) {
option.callback(data, rawObject);
}
if($world_map.hasClass('draw_required')){ });
if(useCachedMap){
if ($world_map.hasClass('draw_required')) {
if (useCachedMap) {
//일단 불러옴 //일단 불러옴
do{ do {
var storedMap = localStorage.getItem(storedOldMapKey); var storedMap = localStorage.getItem(storedOldMapKey);
if(!storedMap){ if (!storedMap) {
break; break;
} }
storedMap = JSON.parse(storedMap); storedMap = JSON.parse(storedMap);
var storedServerID = storedMap[0]; var storedServerID = storedMap[0];
if(storedServerID != serverID){ if (storedServerID != serverID) {
break; break;
} }
storedMap = storedMap[1]; storedMap = storedMap[1];
storedMap = setMapBackground(storedMap); storedMap = setMapBackground(storedMap);
storedMap = convertCityObjs(storedMap); storedMap = convertCityObjs(storedMap);
if(isDetailMap){ if (isDetailMap) {
storedMap = drawDetailWorldMap(storedMap); storedMap = drawDetailWorldMap(storedMap);
} } else {
else{
storedMap = drawBasicWorldMap(storedMap); storedMap = drawBasicWorldMap(storedMap);
} }
storedMap = setMouseWork(storedMap); storedMap = setMouseWork(storedMap);
storedMap = setCityClickable(storedMap); storedMap = setCityClickable(storedMap);
storedMap = saveCityInfo(storedMap); storedMap = saveCityInfo(storedMap);
}while(false); } while (false);
} } else if (option.year && option.month) {
else if(option.year && option.month){
var startYear = localStorage.getItem(storedStartYear); var startYear = localStorage.getItem(storedStartYear);
if(startYear){ if (startYear) {
startYear = JSON.parse(startYear); startYear = JSON.parse(startYear);
} } else {
else{
startYear = option.year; startYear = option.year;
} }
var tmp = { var tmp = {
year : option.year, year: option.year,
month : option.month, month: option.month,
startYear : startYear startYear: startYear
}; };
setMapBackground(tmp); setMapBackground(tmp);
} }
@@ -647,8 +679,8 @@ function reloadWorldMap(option){
} }
} }
$(function(){ $(function() {
if(is_touch_device()){ if (is_touch_device()) {
$('.map_body .map_toggle_single_tap').show(); $('.map_body .map_toggle_single_tap').show();
} }
}) })
+139 -57
View File
@@ -1,85 +1,167 @@
jQuery(function($){ jQuery(function($) {
var initCustomCSSForm = function(){ var initCustomCSSForm = function() {
var lastTimeOut = null; var lastTimeOut = null;
var $obj = $('#custom_css'); var $obj = $('#custom_css');
var key = 'sam_customCSS'; var key = 'sam_customCSS';
var text = localStorage.getItem(key); var text = localStorage.getItem(key);
if(text){ if (text) {
$obj.val(text); $obj.val(text);
console.log(text); console.log(text);
} }
if($obj.on('change keyup paste', function(){ if ($obj.on('change keyup paste', function() {
var newText = $obj.val(); var newText = $obj.val();
if(text == newText){ if (text == newText) {
return; return;
} }
if(lastTimeOut){ if (lastTimeOut) {
clearTimeout(lastTimeOut); clearTimeout(lastTimeOut);
} }
$obj.css('background-color', '#222222'); $obj.css('background-color', '#222222');
lastTimeOut = setTimeout(function(){ lastTimeOut = setTimeout(function() {
text = $obj.val(); text = $obj.val();
localStorage.setItem(key, text); localStorage.setItem(key, text);
$obj.css('background-color', 'black'); $obj.css('background-color', 'black');
}, 500); }, 500);
})); }));
} }
$('.load_old_log').click(function(){ $('.load_old_log').click(function() {
var $thisBtn = $(this); var $thisBtn = $(this);
var logType = $thisBtn.data('log_type'); var logType = $thisBtn.data('log_type');
var $last = $('.log_{0}:last'.format(logType)); var $last = $('.log_{0}:last'.format(logType));
var reqTo = null; var reqTo = null;
if($last.length){ if ($last.length) {
reqTo = $last.data('seq'); reqTo = $last.data('seq');
} }
$.post({ $.post({
url:'j_general_log_old.php', url: 'j_general_log_old.php',
dataType:'json', dataType: 'json',
data:{ data: {
to:reqTo, to: reqTo,
type:logType type: logType
} }
}).then(function(data){ }).then(function(data) {
if(!data){ if (!data) {
return quickReject('로그를 받아오지 못했습니다.'); return quickReject('로그를 받아오지 못했습니다.');
} }
if(!data.result){ if (!data.result) {
return quickReject('로그를 받아오지 못했습니다. : '+data.reason); return quickReject('로그를 받아오지 못했습니다. : ' + data.reason);
}
var keys = Object.keys(data.log);
if(keys.length > 1 && keys[0] < keys[1]){
keys.reverse();
}
if(keys == 0){
$thisBtn.hide();
return;
}
var html = [];
$.each(keys, function(_, key){
if($('#log_{0}_{1}'.format(logType, key)).length){
return true;
} }
var item = data.log[key];
html.push("<div class='log_{0}' id='log_{0}_{1}' data-seq='{1}'>{2}</div>".format(logType, key, item));
});
$('#{0}Plate'.format(logType)).append(html); var keys = Object.keys(data.log);
}, errUnknown) if (keys.length > 1 && keys[0] < keys[1]) {
.fail(function(reason){ keys.reverse();
alert(reason); }
location.reload();
}); if (keys == 0) {
$thisBtn.hide();
return;
}
var html = [];
$.each(keys, function(_, key) {
if ($('#log_{0}_{1}'.format(logType, key)).length) {
return true;
}
var item = data.log[key];
html.push("<div class='log_{0}' id='log_{0}_{1}' data-seq='{1}'>{2}</div>".format(logType, key, item));
});
$('#{0}Plate'.format(logType)).append(html);
}, errUnknown)
.fail(function(reason) {
alert(reason);
location.reload();
});
}) })
initCustomCSSForm(); initCustomCSSForm();
$('#die_immediately').click(function() {
if (!confirm('정말로 삭제하시겠습니까?')) {
return false;
}
$.post({
url: 'j_die_immediately.php',
dataType: 'json',
}).then(function(data) {
if (!data) {
return quickReject('실패했습니다.');
}
if (!data.result) {
return quickReject(data.reason);
}
location.replace('..');
}, errUnknown)
.fail(function(reason) {
alert(reason);
location.reload();
});
return false;
return false;
});
$('#vacation').click(function() {
if (!confirm('휴가 기능을 신청할까요?')) {
return false;
}
$.post({
url: 'j_vacation.php',
dataType: 'json',
}).then(function(data) {
if (!data) {
return quickReject('실패했습니다.');
}
if (!data.result) {
return quickReject(data.reason);
}
location.reload();
}, errUnknown)
.fail(function(reason) {
alert(reason);
location.reload();
});
return false;
return false;
});
$('#set_my_setting').click(function() {
$.post({
url: 'j_set_my_setting.php',
dataType: 'json',
data: {
tnmt: $('.tnmt:checked').val(),
defence_train: $('#defence_train').val(),
use_treatment: $('#use_treatment').val(),
use_auto_nation_turn: $('#use_auto_nation_turn').val(),
}
}).then(function(data) {
if (!data) {
return quickReject('실패했습니다.');
}
if (!data.result) {
return quickReject(data.reason);
}
location.reload();
}, errUnknown)
.fail(function(reason) {
alert(reason);
location.reload();
});
return false;
return false;
});
}); });
+40 -3
View File
@@ -33,6 +33,35 @@ jQuery(function ($) {
var $disabled = $(itemFrameDisabled.format('&lt;비활성화 항목들&gt;')).addClass('filtered'); var $disabled = $(itemFrameDisabled.format('&lt;비활성화 항목들&gt;')).addClass('filtered');
$disabledList.append($disabled); $disabledList.append($disabled);
var lastInfoObj = null;
var lastInfoData = null;
var onChoose = function(evt){
//$(evt.item).find('.help-message').popopver('disable');
if(lastInfoObj){
lastInfoObj.popover('hide');
}
}
var onUnchoose = function(evt){
var $item = $(evt.item);//.find('.help-message').popopver('enable');
var $helpMessage = $item.find('.help-message');
if(!$helpMessage.length){
return;
}
if(lastInfoData != $item.data('value')){
$helpMessage.popover('show')
lastInfoData = $item.data('value');
lastInfoObj = $helpMessage;
}
else{
$helpMessage.popover('hide');
lastInfoData = null;
lastInfoObj = null;
}
}
$.each(availablePriority, function (key, val) { $.each(availablePriority, function (key, val) {
if (val in usedKey) { if (val in usedKey) {
return true; return true;
@@ -45,12 +74,16 @@ jQuery(function ($) {
$disabledList.sortable({ $disabledList.sortable({
group: priorityKey, group: priorityKey,
filter: '.filtered', filter: '.filtered',
onChoose,onChoose,
onUnchoose:onUnchoose,
animation: 150 animation: 150
}); });
$enabledList.sortable({ $enabledList.sortable({
group: priorityKey, group: priorityKey,
filter: '.filtered', filter: '.filtered',
onChoose,onChoose,
onUnchoose:onUnchoose,
animation: 150 animation: 150
}); });
@@ -59,14 +92,18 @@ jQuery(function ($) {
if(!(itemValue in btnHelpMessage)){ if(!(itemValue in btnHelpMessage)){
return true; return true;
} }
var helpText = btnHelpMessage[itemValue]; var helpText = btnHelpMessage[itemValue];
$item.find('.help-message').popover({ var $helpMessage = $item.find('.help-message');
$helpMessage.popover({
content:helpText, content:helpText,
placement:'right', placement:'top',
html:true, html:true,
trigger:'hover' trigger:'hover'
}); });
$item.mouseleave(function(){
$helpMessage.popover('hide');
});
}); });
} }
+213 -70
View File
@@ -1,102 +1,245 @@
function reserveTurn(turnList, command, arg){ function reserveTurn(turnList, command, arg) {
var target; var target;
if(isChiefTurn){ if (isChiefTurn) {
target = 'j_set_chief_command.php'; target = 'j_set_chief_command.php';
} } else {
else{
target = 'j_set_general_command.php'; target = 'j_set_general_command.php';
} }
$.post({ $.post({
url:target, url: target,
dataType:'json', dataType: 'json',
data:{ data: {
action:command, action: command,
turnList:turnList, turnList: turnList,
arg:JSON.stringify(arg) arg: JSON.stringify(arg)
} }
}).then(function(data){ }).then(function(data) {
if(!data.result){ if (!data.result) {
alert(data.reason); alert(data.reason);
return; return;
} }
if(!isChiefTurn){ if (!isChiefTurn) {
window.location.href = './'; window.location.href = './';
} } else {
else{
window.location.href = 'b_chiefcenter.php'; window.location.href = 'b_chiefcenter.php';
} }
}, errUnknown); }, errUnknown);
} }
jQuery(function($){ jQuery(function($) {
window.submitAction = function(){ window.submitAction = function() {
//checkCommandArg 참고 //checkCommandArg 참고
var availableArgumentList = { var availableArgumentList = {
'string':[ 'string': [
'nationName', 'optionText', 'itemType', 'nationType', 'itemCode', 'nationName', 'optionText', 'itemType', 'nationType', 'itemCode', 'commandType',
], ],
'int':[ 'int': [
'crewType', 'destGeneralID', 'destCityID', 'destNationID', 'crewType', 'destGeneralID', 'destCityID', 'destNationID',
'amount', 'colorType', 'amount', 'colorType',
'year', 'month', 'year', 'month',
'srcArmType', 'destArmType', //숙련전환 전용 'srcArmType', 'destArmType', //숙련전환 전용
], ],
'boolean':[ 'boolean': [
'isGold', 'buyRice', 'isGold', 'buyRice',
], ],
'integerArray':[ 'integerArray': [
'destNationIDList', 'destGeneralIDList', 'amountList' 'destNationIDList', 'destGeneralIDList', 'amountList'
] ]
} }
var handlerList = { var handlerList = {
'string':function($obj){ 'string': function($obj) {
return $.trim($obj.eq(0).val()); return $.trim($obj.eq(0).val());
}, },
'int':function($obj){ 'int': function($obj) {
return parseInt($obj.eq(0).val()); return parseInt($obj.eq(0).val());
}, },
'boolean':function($obj){ 'boolean': function($obj) {
switch ($obj.eq(0).val().toLowerCase()) { switch ($obj.eq(0).val().toLowerCase()) {
case "true": case "yes": case "1": case "true":
return true; case "yes":
case "false": case "no": case "0": case "1":
return false; return true;
default: case "false":
throw new Error ("Boolean.parse: Cannot convert string to boolean."); case "no":
case "0":
return false;
default:
throw new Error("Boolean.parse: Cannot convert string to boolean.");
}
},
'integerArray': function($obj) {
var result = [];
$obj.each(function() {
result.push(parseInt($(this).val()));
});
return result;
} }
}, }
'integerArray':function($obj){
return $obj.map(function(){ var argument = {};
return parseInt($(this).val()); for (var typeName in availableArgumentList) {
availableArgumentList[typeName].forEach(function(argName) {
var $obj = $('#' + argName);
if ($obj.length == 0) {
$obj = $('.' + argName);
if ($obj.length == 0) {
return;
}
}
argument[argName] = handlerList[typeName]($obj);
}); });
} }
}
var argument = {}; console.log(argument);
for (var typeName in availableArgumentList) { reserveTurn(turnList, command, argument);
availableArgumentList[typeName].forEach(function(argName){ };
var $obj = $('#'+argName);
if($obj.length == 0){ $('#commonSubmit').click(submitAction);
$obj = $('.'+argName);
if($obj.length == 0){ var $colorType = $('#colorType');
return; if ($colorType.length) {
$colorType.select2({
theme: 'bootstrap4',
placeholder: "색상을 선택해 주세요.",
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
templateSelection: function(item) {
if (item.disabled) {
return item.text;
} }
} var bgcolor = item.element.dataset.color;
var fgcolor = item.element.dataset.fontColor;
argument[argName] = handlerList[typeName]($obj); return $("<span><span style='background-color:{0};color:{1};'> </span>&nbsp;{2}</span>".format(
bgcolor, fgcolor, item.text
));
},
templateResult: function(item) {
if (item.disabled) {
return item.text;
}
var bgcolor = item.element.dataset.color;
var fgcolor = item.element.dataset.fontColor;
return $("<div style='padding: 0.75rem 0.375rem; background-color:{0};color:{1};'>{2}</div>".format(
bgcolor, fgcolor, item.text
));
},
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'no-padding simple-select2-align-center bg-secondary text-secondary',
}); });
} }
console.log(argument); var $nationType = $('#nationType');
reserveTurn(turnList, command, argument); if ($nationType.length) {
}; $nationType.select2({
theme: 'bootstrap4',
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
}
$('#commonSubmit').click(submitAction); var $destCityID = $('#destCityID');
if ($destCityID.length) {
$destCityID.select2({
theme: 'bootstrap4',
placeholder: "도시를 선택해 주세요.",
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
}
var $destNationID = $('#destNationID');
if ($destNationID.length) {
$destNationID.select2({
theme: 'bootstrap4',
placeholder: "국가를 선택해 주세요.",
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
}
var $destGeneralID = $('#destGeneralID');
if ($destGeneralID.length) {
$destGeneralID.select2({
theme: 'bootstrap4',
placeholder: "장수를 선택해 주세요.",
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
}
var $isGold = $('#isGold');
if ($isGold.length) {
$isGold.select2({
theme: 'bootstrap4',
placeholder: "분량을 지정해 주세요.",
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
minimumResultsForSearch: -1,
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
}
var $amount = $('#amount:not([type=hidden])');
if ($amount.length) {
$amount.select2({
theme: 'bootstrap4',
placeholder: "분량을 지정해 주세요.",
allowClear: false,
language: "ko",
containerCss: {
display: "inline-block !important",
color: 'white !important',
},
tags: true,
sorter: function(items) {
items.sort(function(lhs, rhs) {
return parseInt(lhs.id) - parseInt(rhs.id);
})
return items;
},
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'select2-only-number simple-select2-align-center bg-secondary text-secondary',
})
}
$(document).on('keypress', '.select2-only-number .select2-search__field', function() {
$(this).val($(this).val().replace(/[^\d].+/, ""));
if ((event.which < 48 || event.which > 57)) {
event.preventDefault();
}
});
}); });
+1 -1
View File
@@ -23,7 +23,7 @@ $(function(){
var crewtype = parseInt($parent.data('crewtype')); var crewtype = parseInt($parent.data('crewtype'));
calc(crewtype); calc(crewtype);
$formCrewtype.val(crewtype); $formCrewtype.val(crewtype);
$formAmount.val($this.val()); $formAmount.val($this.val()*100);
if(e.which === 13){ if(e.which === 13){
submitAction(); submitAction();
+210
View File
@@ -0,0 +1,210 @@
var templateGeneralCard = '<div class="general_card">\
<h4 class="bg1 with_border"><%generalName%></h4>\
<h4><img src="<%iconPath%>" height=64 width=64></h4><p>\
<%if(leadership){%>\
<%leadership%> / <%strength%> / <%intel%><br>\
<%}%>\
<%if(personalText){%><%personalText%><br><%}%>\
<%if(specialDomesticText||specialWarText){%>\
<%specialDomesticText%> / <%specialWarText%><br>\
<%}%>\
<%if(dex){%><br>\
보병: <%parseInt(dex[0]/1000)%>K<br>\
궁병: <%parseInt(dex[1]/1000)%>K<br>\
기병: <%parseInt(dex[2]/1000)%>K<br>\
귀병: <%parseInt(dex[3]/1000)%>K<br>\
차병: <%parseInt(dex[4]/1000)%>K<br>\
<%}%>\
</p>\
<button type="subject" class="with_skin with_border select_btn" data-name="<%generalName%>" value="<%uniqueName%>" name="pick">선택하기</button>\
</div>';
var templateSpecial =
'<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\
<span class="tooltiptext">\
<%info%>\
</span>\
</span>\
';
function pickGeneral() {
$btn = $(this);
if (hasGeneralID) {
if (!confirm('이 장수를 선택할까요? : {0}'.format($btn.data('name')))) {
return false;
}
$.post({
url: 'j_update_picked_general.php',
dataType: 'json',
data: {
pick: $btn.val()
}
}).then(function(result) {
if (!result.result) {
alert(result.reason);
location.refresh();
}
alert('선택한 장수로 변경했습니다.');
location.href = './';
});
return false;
}
currentGeneralInfo = cards[$btn.val()];
var $card = $btn.closest('.general_card');
var $leftPad = $('#left_pad');
$leftPad.empty();
$card.clone().appendTo($leftPad);
initTooltip($leftPad);
return false;
}
function buildGeneral() {
if (!currentGeneralInfo) {
alert('장수를 선택해주세요!');
return false;
}
if (!confirm('이 장수로 생성할까요?')) {
return false;
}
$.post({
url: 'j_select_picked_general.php',
dataType: 'json',
data: {
pick: currentGeneralInfo.uniqueName,
use_own_picture: $('#use_own_picture').is(':checked'),
leadership: parseInt($('#leadership').val()),
strength: parseInt($('#leadership').val()),
intel: parseInt($('#leadership').val()),
personal: $('#selChar').val()
}
}).then(function(result) {
if (!result.result) {
alert(result.reason);
location.refresh();
}
alert('선택한 장수로 생성했습니다.');
location.href = './';
});
return false;
}
function updateOutdateTimer() {
var $validUntilText = $('#valid_until_text');
var now = Date.now();
var validUntil = $validUntilText.data('until');
if (validUntil <= 0) {
return;
} else if (validUntil < now) {
$validUntilText.data('until', 0);
$('#valid_until').hide();
$('#outdate_token').show();
return;
} else if (validUntil - now <= 30000) {
$validUntilText.css('color', "rgb(255, {0}, {0})".format(255 * (validUntil - now) / 30000));
}
setTimeout(updateOutdateTimer, 1000);
}
function printGenerals(value) {
$('.card_holder').empty();
$('#valid_until').show();
$('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color', 'white');
$('#outdate_token').hide();
var pick = $.map(value.pick, function(value, key) {
return value;
});
var emptyCard = {
'leadership': null,
'strength': null,
'intel': null,
'personalText': null,
'specialDomesticText': null,
'specialWarText': null,
'dex': null
};
$.each(pick, function(idx, cardData) {
cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture);
if (cardData.specialDomestic !== undefined) {
cardData.specialDomesticText = TemplateEngine(templateSpecial, {
text: cardData.specialDomesticName,
info: cardData.specialDomesticInfo
});
cardData.specialWarText = '-';
}
if (cardData.specialWar !== undefined) {
cardData.specialWarText = TemplateEngine(templateSpecial, {
text: cardData.specialWarName,
info: cardData.specialWarInfo
});
if (cardData.specialDomesticText === undefined) {
cardData.specialDomesticText = '-';
}
}
//FIXME: ego로 적었던것 같음!
if (cardData.personal in characterInfo) {
cardData.personalText = TemplateEngine(templateSpecial, {
text: characterInfo[cardData.personal].name,
info: characterInfo[cardData.personal].info
});
} else {
cardData.personalText = cardData.personal;
}
cards[cardData.uniqueName] = cardData;
var $card = $(TemplateEngine(templateGeneralCard, $.extend({}, emptyCard, cardData)));
$('.card_holder').append($card);
$card.find('.select_btn').click(pickGeneral);
$card.find('.obj_tooltip').tooltip({
title: function() {
return $.trim($(this).find('.tooltiptext').html());
},
html: true
});
});
updateOutdateTimer();
}
$(function($) {
$.post('j_get_select_pool.php').then(function(value) {
if (!value.result) {
alert(value.reason);
return;
}
console.log(value);
printGenerals(value);
});
if (hasGeneralID) {
$('#create_plate').hide();
}
$('#build_general').on('click', buildGeneral);
$.each(validCustomOption, function(idx, value) {
if (value == 'picture') {
$('.custom_picture').show();
} else if (value == 'ego') {
$('.custom_personality').show();
} else if (value == 'stat') {
$('.custom_stat').show();
}
});
});
+138 -145
View File
@@ -1,5 +1,5 @@
var templateGeneralCard = var templateGeneralCard =
'<div class="general_card">\ '<div class="general_card">\
<h4 class="bg1 with_border"><%name%></h4>\ <h4 class="bg1 with_border"><%name%></h4>\
<h4><img src="<%iconPath%>" height=64 width=64></h4>\ <h4><img src="<%iconPath%>" height=64 width=64></h4>\
<p><%leadership%> / <%strength%> / <%intel%><br>\ <p><%leadership%> / <%strength%> / <%intel%><br>\
@@ -11,7 +11,7 @@ var templateGeneralCard =
</div>'; </div>';
var templateSpecial = var templateSpecial =
'<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\ '<span class="obj_tooltip" data-toggle="tooltip" data-placement="top"><%text%>\
<span class="tooltiptext">\ <span class="tooltiptext">\
<%info%>\ <%info%>\
</span>\ </span>\
@@ -19,7 +19,7 @@ var templateSpecial =
'; ';
var templateGeneralRow = var templateGeneralRow =
'<tr>\ '<tr>\
<td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\ <td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\
<td style="<%userCSS%>"><%name%><%nameAux%></td>\ <td style="<%userCSS%>"><%name%><%nameAux%></td>\
<td><%age%></td>\ <td><%age%></td>\
@@ -37,7 +37,7 @@ var templateGeneralRow =
<td><%killturn%></td>\ <td><%killturn%></td>\
</tr>'; </tr>';
function pickGeneral(){ function pickGeneral() {
$btn = $(this); $btn = $(this);
if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) { if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) {
@@ -45,13 +45,13 @@ function pickGeneral(){
} }
$.post({ $.post({
url:'j_select_npc.php', url: 'j_select_npc.php',
dataType:'json', dataType: 'json',
data:{ data: {
pick:$btn.val() pick: $btn.val()
} }
}).then(function(result){ }).then(function(result) {
if(!result.result){ if (!result.result) {
alert(result.reason); alert(result.reason);
location.refresh(); location.refresh();
} }
@@ -62,32 +62,30 @@ function pickGeneral(){
return false; return false;
} }
function updateOutdateTimer(){ function updateOutdateTimer() {
var $validUntilText = $('#valid_until_text'); var $validUntilText = $('#valid_until_text');
var now = Date.now(); var now = Date.now();
var validUntil = $validUntilText.data('until'); var validUntil = $validUntilText.data('until');
if(validUntil <= 0){ if (validUntil <= 0) {
return; return;
} } else if (validUntil < now) {
else if(validUntil < now){ $validUntilText.data('until', 0);
$validUntilText.data('until',0);
$('#valid_until').hide(); $('#valid_until').hide();
$('#outdate_token').show(); $('#outdate_token').show();
return; return;
} } else if (validUntil - now <= 30000) {
else if(validUntil - now <= 30000){ $validUntilText.css('color', "rgb(255, {0}, {0})".format(255 * (validUntil - now) / 30000));
$validUntilText.css('color', "rgb(255, {0}, {0})".format(255*(validUntil - now)/30000));
} }
setTimeout(updateOutdateTimer, 1000); setTimeout(updateOutdateTimer, 1000);
} }
function updatePickMoreTimer(){ function updatePickMoreTimer() {
var $btn = $('#btn_pick_more'); var $btn = $('#btn_pick_more');
var now = Date.now(); var now = Date.now();
var remain = ($btn.data('available') - now) / 1000; var remain = ($btn.data('available') - now) / 1000;
if(remain <= 0){ if (remain <= 0) {
$btn.prop('disabled', false) $btn.prop('disabled', false)
$btn.html('다른 장수 보기'); $btn.html('다른 장수 보기');
return; return;
@@ -98,53 +96,50 @@ function updatePickMoreTimer(){
setTimeout(updatePickMoreTimer, 250); setTimeout(updatePickMoreTimer, 250);
} }
function printGenerals(value){ function printGenerals(value) {
$('.card_holder').empty(); $('.card_holder').empty();
$('#valid_until').show(); $('#valid_until').show();
$('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color','white'); $('#valid_until_text').html(value.validUntil).data('until', (new Date(value.validUntil)).getTime()).css('color', 'white');
$('#outdate_token').hide(); $('#outdate_token').hide();
var time = Date.now() + value.pickMoreSeconds*1000; var time = Date.now() + value.pickMoreSeconds * 1000;
$('#btn_pick_more').data('available', time).prop('disabled',true); $('#btn_pick_more').data('available', time).prop('disabled', true);
var pick = $.map(value.pick, function(value, key) { var pick = $.map(value.pick, function(value, key) {
return value; return value;
}); });
pick.sort(function(lhs, rhs){ pick.sort(function(lhs, rhs) {
var lsum = lhs.leadership+lhs.strength+lhs.intel; var lsum = lhs.leadership + lhs.strength + lhs.intel;
var rsum = rhs.leadership+rhs.strength+rhs.intel; var rsum = rhs.leadership + rhs.strength + rhs.intel;
return lsum - rsum; return lsum - rsum;
}); });
$.each(pick, function(idx, cardData){ $.each(pick, function(idx, cardData) {
cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture); cardData.iconPath = getIconPath(cardData.imgsvr, cardData.picture);
if(cardData.special in specialInfo){ if (cardData.special in specialInfo) {
cardData.specialText = TemplateEngine(templateSpecial, { cardData.specialText = TemplateEngine(templateSpecial, {
text:cardData.special, text: cardData.special,
info:specialInfo[cardData.special] info: specialInfo[cardData.special]
}); });
} } else {
else{
cardData.specialText = cardData.special; cardData.specialText = cardData.special;
} }
if(cardData.special2 in specialInfo){ if (cardData.special2 in specialInfo) {
cardData.special2Text = TemplateEngine(templateSpecial, { cardData.special2Text = TemplateEngine(templateSpecial, {
text:cardData.special2, text: cardData.special2,
info:specialInfo[cardData.special2] info: specialInfo[cardData.special2]
}); });
} } else {
else{
cardData.special2Text = cardData.special2; cardData.special2Text = cardData.special2;
} }
if(cardData.personal in characterInfo){ if (cardData.personal in characterInfo) {
cardData.personalText = TemplateEngine(templateSpecial, { cardData.personalText = TemplateEngine(templateSpecial, {
text:cardData.personal, text: cardData.personal,
info:characterInfo[cardData.personal] info: characterInfo[cardData.personal]
}); });
} } else {
else{
cardData.personalText = cardData.personal; cardData.personalText = cardData.personal;
} }
@@ -154,10 +149,10 @@ function printGenerals(value){
$('.card_holder').append($card); $('.card_holder').append($card);
$card.find('.select_btn').click(pickGeneral); $card.find('.select_btn').click(pickGeneral);
$card.find('.obj_tooltip').tooltip({ $card.find('.obj_tooltip').tooltip({
title:function(){ title: function() {
return $.trim($(this).find('.tooltiptext').html()); return $.trim($(this).find('.tooltiptext').html());
}, },
html:true html: true
}); });
}); });
@@ -165,59 +160,57 @@ function printGenerals(value){
updateOutdateTimer(); updateOutdateTimer();
} }
function printGeneralList(value){ function printGeneralList(value) {
var tokenList = value.token; var tokenList = value.token;
var generalList = $.map(value.list, function(general){ var generalList = $.map(value.list, function(general) {
general = { general = {
no:general[0], no: general[0],
picture:general[1], picture: general[1],
imgsvr:general[2], imgsvr: general[2],
npc:general[3], npc: general[3],
age:general[4], age: general[4],
nation:general[5], nation: general[5],
special:general[6], special: general[6],
special2:general[7], special2: general[7],
personal:general[8], personal: general[8],
name:general[9], name: general[9],
ownerName:general[10], ownerName: general[10],
injury:general[11], injury: general[11],
leadership:general[12], leadership: general[12],
lbonus:general[13], lbonus: general[13],
strength:general[14], strength: general[14],
intel:general[15], intel: general[15],
explevel:general[16], explevel: general[16],
experience:general[17], experience: general[17],
dedication:general[18], dedication: general[18],
officerLevel:general[19], officerLevel: general[19],
killturn:general[20], killturn: general[20],
connect:general[21], connect: general[21],
reserved:0 reserved: 0
}; };
if(general.npc < 2){ if (general.npc < 2) {
general.reserved = 2; general.reserved = 2;
} }
if(general.no in tokenList){ if (general.no in tokenList) {
general.reserved = 1; general.reserved = 1;
} }
general.userCSS = ""; general.userCSS = "";
general.nameAux = ""; general.nameAux = "";
if(general.reserved == 1){ if (general.reserved == 1) {
general.userCSS = 'color:violet'; general.userCSS = 'color:violet';
} } else if (general.npc >= 2) {
else if(general.npc >= 2){
general.userCSS = 'color:cyan'; general.userCSS = 'color:cyan';
} } else if (general.npc == 1) {
else if(general.npc == 1){
general.userCSS = 'color:skyblue'; general.userCSS = 'color:skyblue';
} }
if(general.ownerName){ if (general.ownerName) {
general.nameAux += '<br><small>({0})</small>'.format(general.ownerName); general.nameAux += '<br><small>({0})</small>'.format(general.ownerName);
} }
if(general.reserved == 1){ if (general.reserved == 1) {
general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]); general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]);
} }
@@ -226,41 +219,41 @@ function printGeneralList(value){
general.iconPath = getIconPath(general.imgsvr, general.picture); general.iconPath = getIconPath(general.imgsvr, general.picture);
general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, { general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, {
text:general.special, text: general.special,
info:specialInfo[general.special] info: specialInfo[general.special]
}); });
general.speicalWarWithTooltip = TemplateEngine(templateSpecial, { general.speicalWarWithTooltip = TemplateEngine(templateSpecial, {
text:general.special2, text: general.special2,
info:specialInfo[general.special2] info: specialInfo[general.special2]
}); });
general.personalWithTooltip = TemplateEngine(templateSpecial, { general.personalWithTooltip = TemplateEngine(templateSpecial, {
text:general.personal, text: general.personal,
info:characterInfo[general.personal] info: characterInfo[general.personal]
}); });
return general; return general;
}); });
generalList.sort(function(lhs, rhs){ generalList.sort(function(lhs, rhs) {
if(lhs.reserved > rhs.reserved){ if (lhs.reserved > rhs.reserved) {
return -1; return -1;
} }
if(lhs.reserved < rhs.reserved){ if (lhs.reserved < rhs.reserved) {
return 1; return 1;
} }
if(lhs.total != rhs.total){ if (lhs.total != rhs.total) {
return rhs.total - lhs.total; return rhs.total - lhs.total;
} }
if(lhs.leadership != rhs.leadership){ if (lhs.leadership != rhs.leadership) {
return rhs.leadership - lhs.total; return rhs.leadership - lhs.total;
} }
if(lhs.name < rhs.name){ if (lhs.name < rhs.name) {
return -1; return -1;
} }
if(lhs.name > rhs.name){ if (lhs.name > rhs.name) {
return 1; return 1;
} }
return 0; return 0;
@@ -270,9 +263,9 @@ function printGeneralList(value){
_printGeneralList(true); _printGeneralList(true);
} }
function _printGeneralList(clear){ function _printGeneralList(clear) {
var $generalTable = $('#general_list'); var $generalTable = $('#general_list');
if(clear){ if (clear) {
$generalTable.empty(); $generalTable.empty();
$generalTable.data('lastIdx', 0); $generalTable.data('lastIdx', 0);
$('#row_print_more').show(); $('#row_print_more').show();
@@ -284,77 +277,77 @@ function _printGeneralList(clear){
var idxTo = Math.min(idxFrom + 50, generalList.length); var idxTo = Math.min(idxFrom + 50, generalList.length);
$generalTable.data('lastIdx', idxTo); $generalTable.data('lastIdx', idxTo);
for(var idx = idxFrom; idx < idxFrom + 50; idx++){ for (var idx = idxFrom; idx < idxFrom + 50; idx++) {
var general = generalList[idx]; var general = generalList[idx];
$generalTable.append(TemplateEngine(templateGeneralRow, general)); $generalTable.append(TemplateEngine(templateGeneralRow, general));
} }
if(idxTo == generalList.length){ if (idxTo == generalList.length) {
$('#row_print_more').hide(); $('#row_print_more').hide();
} }
$generalTable.find('.obj_tooltip').tooltip({ $generalTable.find('.obj_tooltip').tooltip({
title:function(){ title: function() {
return $.trim($(this).find('.tooltiptext').html()); return $.trim($(this).find('.tooltiptext').html());
}, },
html:true html: true
}); });
$('#tb_general_list').show(); $('#tb_general_list').show();
} }
$(function($){ $(function($) {
window.generalList = []; window.generalList = [];
$.post('j_get_select_npc_token.php').then(function(value){ $.post('j_get_select_npc_token.php').then(function(value) {
if(!value.result){ if (!value.result) {
alert(value.reason); alert(value.reason);
return; return;
} }
console.log(value); console.log(value);
printGenerals(value); printGenerals(value);
});
$('#btn_pick_more').click(function(){
var generals = $.map($('.keep_select:checked'), function(value){
return $(value).val();
}); });
console.log(generals);
$.post({ $('#btn_pick_more').click(function() {
url:'j_get_select_npc_token.php', var generals = $.map($('.keep_select:checked'), function(value) {
dataType:'json', return $(value).val();
data:{ });
refresh:true, console.log(generals);
keep:generals $.post({
} url: 'j_get_select_npc_token.php',
}).then(function(result){ dataType: 'json',
if(!result.result){ data: {
alert(result.reason); refresh: true,
location.refresh(); keep: generals
} }
console.log(result); }).then(function(result) {
printGenerals(result); if (!result.result) {
alert(result.reason);
location.refresh();
}
console.log(result);
printGenerals(result);
});
}); });
});
$('#btn_load_general_list').click(function(){ $('#btn_load_general_list').click(function() {
$.post({ $.post({
url:'j_get_general_list.php', url: 'j_get_general_list.php',
dataType:'json', dataType: 'json',
data:{ data: {
with_token:true with_token: true
} }
}).then(function(result){ }).then(function(result) {
if(!result.result){ if (!result.result) {
alert(result.reason); alert(result.reason);
return false; return false;
} }
printGeneralList(result); printGeneralList(result);
});
}); });
});
$('#btn_print_more').click(function(){ $('#btn_print_more').click(function() {
_printGeneralList(); _printGeneralList();
}) })
}); });
+17
View File
@@ -55,3 +55,20 @@ function LogText($prefix, $variable)
$text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable)); $text = sprintf('%s : %s'."\r\n", $prefix, TVarDumper::dump($variable));
file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND); file_put_contents(ROOT.'/d_log/'.UniqueConst::$serverName.'_dbg_logs.txt', $text, FILE_APPEND);
} }
function prepareDir(string $dirPath, bool $forceCreate=true):bool{
if(file_exists($dirPath)){
if(is_dir($dirPath)){
return true;
}
if(!$forceCreate){
throw new \RuntimeException('이미 파일이 있습니다');
}
if(!unlink($dirPath)){
return false;
}
return mkdir($dirPath);
}
return mkdir($dirPath, 0777, true);
}
+7 -3
View File
@@ -558,13 +558,17 @@ function ConquerCity(array $admin, General $general, array $city) {
} }
} }
//NPC인 경우 10% 확률로 임관(엔장, 인재, 의병) //NPC인 경우 일정 확률로 임관(엔장, 인재, 의병)
$npcType = $oldGeneral->getNPCType(); $npcType = $oldGeneral->getNPCType();
if($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && Util::randBool(0.1)) { if($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && Util::randBool(GameConst::$joinRuinedNPCProp)) {
$cmd = buildGeneralCommandClass('che_임관', $oldGeneral, $admin, [ $cmd = buildGeneralCommandClass('che_임관', $oldGeneral, $admin, [
'destNationID'=>$attackerNationID 'destNationID'=>$attackerNationID
]); ]);
_setGeneralCommand($cmd, [0]); $joinTurn = Util::randRangeInt(0, 12);
if($joinTurn){
_setGeneralCommand(buildGeneralCommandClass('che_견문', $oldGeneral, $admin), iterator_to_array(Util::range($joinTurn)));
}
_setGeneralCommand($cmd, [$joinTurn]);
} }
} }
+4
View File
@@ -0,0 +1,4 @@
<?php
require('../vendor/autoload.php');
//ParsedownExtra;
+72
View File
@@ -0,0 +1,72 @@
<?php
namespace sammo;
use sammo\AbsGeneralPool;
use sammo\GameConst;
use sammo\Json;
use sammo\Util;
abstract class AbsFromUserPool extends AbsGeneralPool{
public function occupyGeneralName(): bool
{
$generalID = $this->getGeneralBuilder()->getGeneralID();
if($generalID === null){
throw new \RuntimeException('build되지 않음');
}
$db= $this->db;
$db->update('select_pool', [
'general_id'=>$generalID,
'owner'=>null,
'reserved_until'=>null,
], 'unique_name = %s AND owner IS NOT NULL', $this->uniqueName);
return $db->affectedRows()!=0;
}
static public function pickGeneralFromPool(\MeekroDB $db, int $owner, int $pickCnt, ?string $prefix=null):array{
$oNow = new \DateTimeImmutable();
$now = $oNow->format('Y-m-d H:i:s');
$db->update('select_pool', [
'reserved_until'=>null,
'owner'=>null,
],'reserved_until < %s AND general_id IS NULL', $now);
$pool = [];
foreach($db->query('SELECT id, unique_name, info FROM select_pool WHERE reserved_until IS NULL AND general_id IS NULL', $pickCnt) as $cand){
$cand['info'] = Json::decode($cand['info']);
$dexTotal = array_sum($cand['info']['dex']);
$pool[] = [$cand, $dexTotal];
}
if(count($pool) < $pickCnt){
throw new \RuntimeException('pool 부족');
}
$gameStor = KVStorage::getStorage($db, 'game_env');
$result = [];
$validUntil = TimeUtil::nowAddMinutes(2 * $gameStor->turnterm);
while(count($result) < $pickCnt){
$cand = Util::choiceRandomUsingWeightPair($pool);
$poolID = $cand['id'];
if(key_exists($poolID, $result)){
continue;
}
$candInfo = $cand['info'];
$candInfo['uniqueName'] = $cand['unique_name'];
//하나씩 한다.
$db->update('select_pool', [
'owner'=>$owner,
'reserved_until'=>$validUntil,
], 'id = %i AND reserved_until IS NULL AND owner IS NULL and general_id IS NULL', $poolID);
if($db->affectedRows()==0){
continue;
}
$result[$poolID] = new static($db, $candInfo, $validUntil);
}
return array_values($result);
}
}
+111
View File
@@ -0,0 +1,111 @@
<?php
namespace sammo;
use MeekroDB;
use sammo\GameConst;
use sammo\Scenario\GeneralBuilder;
use sammo\Util;
abstract class AbsGeneralPool{
protected $builder;
protected $info;
protected $db=null;
protected $uniqueName;
protected $generalName;
protected $validUntil;
/*
* info = [
* uniqueName
* generalName
* imgsvr
* picture
*
* leadership
* strength
* intel
*
* experience
* dedication
*
* dex[5]
*
* specialDomestic
* specialWar
*/
public function __construct(\MeekroDB $db, array $info, string $validUntil)
{
$this->db = $db;
$this->info = $info;
$this->uniqueName = $info['uniqueName'];
$this->generalName = $info['generalName'];
$this->builder = new GeneralBuilder(
$info['generalName'],
$info['imgsvr'],
$info['picture'],
0
);
$this->validUntil = $validUntil;
$builder = $this->builder;
if(key_exists('leadership', $info)){
$builder->setStat($info['leadership'], $info['strength'], $info['intel']);
}
if(key_exists('experience', $info)){
$builder->setExpDed($info['experience'], $info['dedication']);
}
if(key_exists('dex', $info)){
$builder->setDex($info['dex'][0], $info['dex'][1], $info['dex'][2], $info['dex'][3], $info['dex'][4]);
}
if(key_exists('specialDomestic', $info) || key_exists('specialWar', $info)){
$builder->setSpecial($info['specialDomestic']??GameConst::$defaultSpecialDomestic, $info['specialWar']??GameConst::$defaultSpecialWar);
}
}
public function getUniqueName():string{
return $this->uniqueName;
}
public function getInfo():array{
return $this->info;
}
static protected function checkDuplicatedCnt(\MeekroDB $db, string $name):int{
$duplicateCnt = 0;
foreach(GeneralBuilder::$prefixList as $npcPrefix){
$testName = "{$npcPrefix}{$name}";
$duplicateCnt += $db->queryFirstField('SELECT count(no) FROM general WHERE name LIKE %s', $testName.'%');
}
return $duplicateCnt;
}
public function getGeneralBuilder():GeneralBuilder{
if(!$this->generalName){
throw new \RuntimeException('generalName not picked');
}
return $this->builder;
}
public function getValidUntil():string{
return $this->validUntil;
}
/**
* @param \MeekroDB $db
* @param int $owner
* @param int $pickCnt
* @param null|string $prefix
* @return AbsGeneralPool[]
*/
static abstract public function pickGeneralFromPool(\MeekroDB $db, int $owner, int $pickCnt, ?string $prefix=null):array;
abstract public function occupyGeneralName():bool;
abstract public static function getPoolName():string;
abstract public static function initPool(\MeekroDB $db);
}
+11 -1
View File
@@ -8,7 +8,7 @@ class che_계략_삼략 extends \sammo\BaseItem{
protected $id = 22; protected $id = 22;
protected $rawName = '삼략'; protected $rawName = '삼략';
protected $name = '삼략(계략)'; protected $name = '삼략(계략)';
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'; protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p<br>[전투] 계략 시도 확률 +10%p, 계략 성공 확률 +10%p';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -19,4 +19,14 @@ class che_계략_삼략 extends \sammo\BaseItem{
return $value; return $value;
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warMagicTrialProb'){
return $value + 0.1;
}
if($statName === 'warMagicSuccessProb'){
return $value + 0.1;
}
return $value;
}
} }
+11 -1
View File
@@ -8,7 +8,7 @@ class che_계략_육도 extends \sammo\BaseItem{
protected $id = 21; protected $id = 21;
protected $rawName = '육도'; protected $rawName = '육도';
protected $name = '육도(계략)'; protected $name = '육도(계략)';
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'; protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p<br>[전투] 계략 시도 확률 +10%p, 계략 성공 확률 +10%p';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;
@@ -19,4 +19,14 @@ class che_계략_육도 extends \sammo\BaseItem{
return $value; return $value;
} }
public function onCalcStat(General $general, string $statName, $value, $aux=null){
if($statName === 'warMagicTrialProb'){
return $value + 0.1;
}
if($statName === 'warMagicSuccessProb'){
return $value + 0.1;
}
return $value;
}
} }
+2 -2
View File
@@ -8,7 +8,7 @@ class che_계략_이추 extends \sammo\BaseItem{
protected $id = 5; protected $id = 5;
protected $rawName = '이추'; protected $rawName = '이추';
protected $name = '이추(계략)'; protected $name = '이추(계략)';
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p'; protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p';
protected $cost = 1000; protected $cost = 1000;
protected $consumable = true; protected $consumable = true;
protected $buyable = true; protected $buyable = true;
@@ -16,7 +16,7 @@ class che_계략_이추 extends \sammo\BaseItem{
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{ public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
if($turnType == '계략'){ if($turnType == '계략'){
if($varType == 'success') return $value + 0.1; if($varType == 'success') return $value + 0.2;
} }
return $value; return $value;
+2 -2
View File
@@ -8,7 +8,7 @@ class che_계략_향낭 extends \sammo\BaseItem{
protected $id = 5; protected $id = 5;
protected $rawName = '항냥'; protected $rawName = '항냥';
protected $name = '항냥(계략)'; protected $name = '항냥(계략)';
protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'; protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +50%p';
protected $cost = 3000; protected $cost = 3000;
protected $consumable = true; protected $consumable = true;
protected $buyable = true; protected $buyable = true;
@@ -16,7 +16,7 @@ class che_계략_향낭 extends \sammo\BaseItem{
public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{ public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{
if($turnType == '계략'){ if($turnType == '계략'){
if($varType == 'success') return $value + 0.2; if($varType == 'success') return $value + 0.5;
} }
return $value; return $value;
@@ -0,0 +1,29 @@
<?php
namespace sammo\ActionItem;
use \sammo\iAction;
use \sammo\General;
use \sammo\SpecialityHelper;
use \sammo\WarUnit;
use sammo\WarUnitTriggerCaller;
use \sammo\BaseWarUnitTrigger;
use \sammo\WarUnitTrigger\WarActivateSkills;
use \sammo\WarUnitTrigger\che_반계시도;
use \sammo\WarUnitTrigger\che_반계발동;
class che_반계_백우선 extends \sammo\BaseItem{
protected $id = 45;
protected $rawName = '백우선';
protected $name = '백우선(반계)';
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림';
protected $cost = 200;
protected $consumable = false;
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller(
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '계략약화'),
new che_반계시도($unit),
new che_반계발동($unit)
);
}
}
@@ -0,0 +1,29 @@
<?php
namespace sammo\ActionItem;
use \sammo\iAction;
use \sammo\General;
use \sammo\SpecialityHelper;
use \sammo\WarUnit;
use sammo\WarUnitTriggerCaller;
use \sammo\BaseWarUnitTrigger;
use \sammo\WarUnitTrigger\WarActivateSkills;
use \sammo\WarUnitTrigger\che_반계시도;
use \sammo\WarUnitTrigger\che_반계발동;
class che_반계_파초선 extends \sammo\BaseItem{
protected $id = 45;
protected $rawName = '파초선';
protected $name = '파초선(반계)';
protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림';
protected $cost = 200;
protected $consumable = false;
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller(
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '계략약화'),
new che_반계시도($unit),
new che_반계발동($unit)
);
}
}
@@ -0,0 +1,34 @@
<?php
namespace sammo\ActionItem;
use \sammo\iAction;
use \sammo\General;
use \sammo\GeneralTrigger;
use \sammo\GeneralTriggerCaller;
use \sammo\WarUnit;
use sammo\WarUnitTriggerCaller;
use sammo\BaseWarUnitTrigger;
use sammo\WarUnitTrigger\che_부상무효;
use sammo\WarUnitTrigger\WarActivateSkills;
class che_부적_태현청생부 extends \sammo\BaseItem{
protected $id = 9;
protected $rawName = '태현청생부';
protected $name = '태현청생부(부적)';
protected $info = '[전투] 저격 불가, 부상 없음';
protected $cost = 200;
protected $consumable = false;
public function getBattleInitSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller(
new che_부상무효($unit, BaseWarUnitTrigger::TYPE_NONE),
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '저격불가')
);
}
public function getBattlePhaseSkillTriggerList(WarUnit $unit):?WarUnitTriggerCaller{
return new WarUnitTriggerCaller(
new WarActivateSkills($unit, BaseWarUnitTrigger::TYPE_NONE, false, '저격불가')
);
}
}
@@ -0,0 +1,35 @@
<?php
namespace sammo\ActionItem;
use \sammo\iAction;
use \sammo\General;
use \sammo\GeneralTrigger;
use \sammo\GeneralTriggerCaller;
use \sammo\BaseWarUnitTrigger;
use \sammo\WarUnitTriggerCaller;
use sammo\WarUnitTrigger\che_전투치료발동;
use sammo\WarUnitTrigger\che_전투치료시도;
class che_의술_상한잡병론 extends \sammo\BaseItem{
protected $id = 24;
protected $rawName = '상한잡병론';
protected $name = '상한잡병론(의술)';
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 40% 확률로 치료 발동(아군 피해 1/3 감소, 부상 회복)';
protected $cost = 200;
protected $consumable = false;
public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{
return new GeneralTriggerCaller(
new GeneralTrigger\che_도시치료($general)
);
}
public function getBattlePhaseSkillTriggerList(\sammo\WarUnit $unit): ?WarUnitTriggerCaller
{
return new WarUnitTriggerCaller(
new che_전투치료시도($unit, BaseWarUnitTrigger::TYPE_ITEM),
new che_전투치료발동($unit, BaseWarUnitTrigger::TYPE_ITEM)
);
}
}
@@ -14,7 +14,7 @@ class che_의술_청낭서 extends \sammo\BaseItem{
protected $id = 23; protected $id = 23;
protected $rawName = '청낭서'; protected $rawName = '청낭서';
protected $name = '청낭서(의술)'; protected $name = '청낭서(의술)';
protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'; protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 40% 확률로 치료 발동(아군 피해 1/3 감소, 부상 회복)';
protected $cost = 200; protected $cost = 200;
protected $consumable = false; protected $consumable = false;

Some files were not shown because too many files have changed in this diff Show More