Compare commits

..
2350 Commits
Author SHA1 Message Date
Hide_D ac6e1d2525 fix: 1개 선택 베팅 보상 예측값이 잘못 설정된 버그 2022-02-24 00:22:27 +09:00
Hide_D 610b74d3a5 game: 표준 공백지 시나리오에 천통 베팅 추가 2022-02-24 00:15:36 +09:00
Hide_D 7f295aaacf fix: 탑 바 메뉴에서 세력도 제거. 세력도 페이지 제거 2022-02-23 23:55:18 +09:00
Hide_D a47669ff75 feat: 연감에 기존 세력도 기능 통합 2022-02-23 23:46:40 +09:00
Hide_D 9f84eb8d4d game,feat: 소비형 아이템 효율 상승, 환약 3회용으로 변경 2022-02-23 01:41:24 +09:00
Hide_D 5f36143b44 game: 숙련도로 얻는 유산 포인트 감소 2022-02-23 00:21:02 +09:00
Hide_D 2d491dd393 fix: 2회 이상 연속 전투에 성벽 전투가 포함된 경우 대인 사살이 계산되지 않는 버그 2022-02-22 23:55:13 +09:00
Hide_D 63845afdc3 fix: 재난 시 전체 이벤트 처리를 위해 column 추가 2022-02-22 15:39:43 +09:00
Hide_D 3cfcfff786 fix: 방어 대상에 crewtype 포함 2022-02-22 14:41:37 +09:00
Hide_D 9f801df5dc game: 평시 유니크 획득 확률 변경 2022-02-22 00:43:22 +09:00
Hide_D 21b8c6ea8f game: 작위 보상에서 아이템이 없는 사람이 받을 확률 대폭 증가 2022-02-22 00:28:35 +09:00
Hide_D 0807f9912c game: 반계도구 제거, 도구 밸런스 조정 2022-02-22 00:14:20 +09:00
Hide_D 90a71ba75d fix: 아이템 판매시 에러 방지 2022-02-20 15:31:52 +09:00
Hide_D 2e26244992 fix: 전투력보정에 unit이 제공되지 않음 2022-02-20 15:13:39 +09:00
Hide_D 8f1e713451 fix: 이벤트로 모든 장수의 지출이 0인 경우 대비 2022-02-20 14:57:56 +09:00
Hide_D b7b5c7b0da game: 아이템을 실제로 사용할 수 있도록 등록 2022-02-20 14:51:04 +09:00
Hide_D cb42813597 fix: 오타 수정 2022-02-20 05:11:26 +09:00
Hide_D 91c46f465b feat,game: 장비매매시 반응하는 트리거 추가, 판매시 국고에 추가되는 유니크 추가 2022-02-20 04:34:10 +09:00
Hide_D 435044dddd feat: 임의 커맨드용 트리거 추가 2022-02-20 04:30:05 +09:00
Hide_D cccf9968e7 game: 의술 유니크 추가 2022-02-20 04:10:34 +09:00
Hide_D f1e4185193 game: 비전투 커맨드 효율 유니크 추가 2022-02-20 04:02:35 +09:00
Hide_D dc538af7ba game,feat: 추가 숙련 trigger추가, 숙련 유니크 추가 2022-02-20 04:01:55 +09:00
Hide_D 574ca07afe game,feat: 조달 효율 변경 trigger 추가, 조달 유니크 추가 2022-02-20 04:01:03 +09:00
Hide_D f18b2ed1a5 fix: 능력치 유니크 오타 수정 2022-02-20 03:38:50 +09:00
Hide_D bc568e2083 game: 전투 특기 반영 유니크 도구 추가 2022-02-20 03:37:15 +09:00
Hide_D bffdf9d190 game: 1회저지, 회피저지 유니크 추가 2022-02-20 03:17:35 +09:00
Hide_D e7af4563a2 feat,game: 반계불가 처리 추가, 반계불가 유니크 추가 2022-02-20 03:16:46 +09:00
Hide_D 5fc5adb14d feat,game: 전투 중 약탈 추가, 약탈 유니크 추가 2022-02-20 03:13:03 +09:00
Hide_D f3ccf5e633 game: 경과 시간에 따라 변하는 유니크 추가 2022-02-20 03:12:17 +09:00
Hide_D 46cacc4a7d game,feat: 계략 커맨드 방어 유니크
- 계략 방어 확률에 보정 trigger 추가
2022-02-20 03:11:02 +09:00
Hide_D ac8edcee32 game: 회피 유니크 조절 2022-02-20 03:09:59 +09:00
Hide_D 919c44c727 game,feat: 전투력보정 관련 유니크 도구 추가
- 직접 전투력보정을 위한 WarUnitTrigger 추가
2022-02-20 03:08:24 +09:00
Hide_D 95921ae727 game: 사기, 훈련 유니크 수치 변경 2022-02-20 03:04:45 +09:00
Hide_D 134f043e9c refac: 아이템에 미사용 $id 값 제거 2022-02-19 23:54:03 +09:00
Hide_D a7a14a66a6 game: 벽력거를 진짜 무상성 병종으로 2022-02-19 17:55:29 +09:00
Hide_D 148d92164a refac: 장수 생성시 임관권유문 문구 변경
- coreui/vue 의존성 제거
2022-02-18 21:15:06 +09:00
Hide_D 5ea1b0bce4 refac: toast 출력을 bootstrap-vue-3 내부 toast로 변경
- component로 src 내부 ts/vue 사용 시도 중
2022-02-18 20:54:26 +09:00
Hide_D 65aefadcdc dep: package updates 2022-02-18 13:39:46 +09:00
Hide_D 1bc324fb9f fix: turnExecutionHelper env 관련 수정 2022-02-18 11:27:29 +09:00
Hide_D 28953ae1d9 fix: 토너먼트 참가 시점에서 생존여부 확인 2022-02-18 10:55:25 +09:00
Hide_D 3760e244a9 scenario: 천지비급에 '견고' 추가 2022-02-16 22:55:47 +09:00
Hide_D e86d755b69 scenario: 천지비급에서는 183년 이전에 항상 상인 2022-02-16 22:52:01 +09:00
Hide_D 6f560a1b34 버그 수정 2022-02-14 00:26:42 +09:00
Hide_D 6fe573ef7b fix: 토너먼트 실행 주기에서 초기화시 '수동'뜨는 문제 2022-02-08 20:39:49 +09:00
Hide_D 2a7baf020f misc: 연도 갱신 2022-02-06 12:08:58 +09:00
Hide_D 2e1815783a fix: 커맨드 세부 선택시 스탯 표기 오류 수정
- 통/무/지 순이어야함
2022-02-06 12:06:14 +09:00
Hide_DandGitea bab86c9f0b feat: 변경된 베팅 방식에 따라 결과 표기 2022-02-05 07:43:28 +00:00
Hide_DandGitea 2716e9af39 refac: 베팅 코드를 모듈로 2022-02-05 07:43:28 +00:00
Hide_DandGitea 9a303c4510 fix: n차 혼합 베팅 보상 수령이 하나만 되는 버그 수정 2022-02-05 07:43:28 +00:00
Hide_DandGitea e547971a6f feat: 베팅시 유산포인트 로그에 추가 2022-02-05 07:43:28 +00:00
Hide_DandGitea e9108ead86 feat: 베팅 보상 등록 2022-02-05 07:43:28 +00:00
Hide_DandGitea 6bbcb25138 feat(WIP): 베팅 보상 누락 수정 2022-02-05 07:43:28 +00:00
Hide_DandGitea 98462ca34d feat(WIP): 보상을 위한 Betting 모듈 추가 2022-02-05 07:43:28 +00:00
Hide_DandGitea 7939dd0b44 feat: 메인 페이지에 토너먼트 개최기간 표기 2022-02-05 07:43:27 +00:00
Hide_DandGitea 3d966ec076 fix: 베팅시 추가 포인트 부여 불가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 6afedb35df Revert "fix: 베팅시 추가 포인트 부여 불가"
This reverts commit 6fb4a1b274.
2022-02-05 07:43:27 +00:00
Hide_DandGitea cdac63e05a fix: 베팅시 추가 포인트 부여 불가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 8040cc28c4 fix: 베팅 순서 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 264db40bdc fix: 베팅 관련 사소한 버그 수정
- 베팅이 없을 경우
- 베팅 동시 신청
2022-02-05 07:43:27 +00:00
Hide_DandGitea 2da1957c28 feat: 국가 베팅 ui 2022-02-05 07:43:27 +00:00
Hide_DandGitea 2297fa9c13 fix: NPCControl volar error 2022-02-05 07:43:27 +00:00
Hide_DandGitea 8175e76a77 build: warning 기준 변경
- 5MB, 3MB.......
2022-02-05 07:43:27 +00:00
Hide_DandGitea 2709dde8fa fix: template 2022-02-05 07:43:27 +00:00
Hide_DandGitea 7c518efba8 fix: volar error 수정
- getNPCColor 반환형
2022-02-05 07:43:27 +00:00
Hide_DandGitea b5fa2aef91 game: npc 색상 분리 2022-02-05 07:43:27 +00:00
Hide_DandGitea d2f6c34e85 fix: 베팅 시 key 정렬을 숫자 정렬로 2022-02-05 07:43:27 +00:00
Hide_DandGitea cd1ccfadaf fix: 세력일람 분석에서 자동수행턴을 반영하지 않는 버그 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 8ff6bff252 game: 장수 생성시 종능이 부족하면 경고 2022-02-05 07:43:27 +00:00
Hide_DandGitea 52f6cb2f30 fix: 피장파장 시, 턴이 60턴이 늘어나는 것이 아니라 60턴이 되는 버그 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea e7af718a0f feat(WIP): 국가 베팅 '기능만' 구현 2022-02-05 07:43:27 +00:00
Hide_DandGitea d211c92bf8 fix: type react가 volar에서 문제를 일으킴 2022-02-05 07:43:27 +00:00
Hide_DandGitea 4acc988cfe feat(WIP): 베팅 개시 타입 변경
-candidate를 미리 추가.
-이를 통해 betting을 중립적으로 운용 가능
2022-02-05 07:43:27 +00:00
Hide_DandGitea 270f236f95 feat(WIP): OpenNationBetting에 보너스 상금 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 2da12bb71f fix: 이벤트 조건 오류 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea b479add03d misc: OpenNationBetting TODO 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea ca9db6dc18 Feat(WIP): OpenNationBetting Action 추가
- 시나리오 event에 추가
2022-02-05 07:43:27 +00:00
Hide_DandGitea 12c7c7b4ed feat(WIP): 이벤트 시나리오에서 불가능한 커맨드 지정 2022-02-05 07:43:27 +00:00
Hide_DandGitea e12c0e51c8 fix: 시나리오 모드에서 시작시점과 봉급월이 겹치는 경우 멈추는 문제 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 6683c70195 fix: N장만 건국한 경우에 CreateManyNPC가 동작하지 않는 버그 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea aef1cbd201 fix: 봉급 계산에서 부대장 처리를 하지 않은 문제 수정
- 전체 지출 계산에만 실수 발생
2022-02-05 07:43:27 +00:00
Hide_DandGitea 06786aff28 feat(WIP): 이벤트 시나리오 준비 2022-02-05 07:43:27 +00:00
Hide_DandGitea 55439c268f feat: Event/Condition/RemainNation 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 3e4cf764c8 feat: 시나리오 event 포맷에서 target, priority 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 4e359f5eb9 feat: 도시 점령, 국가 멸망 시 트리거 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 2ff3746df2 feat: event 테이블 준비 2022-02-05 07:43:27 +00:00
Hide_DandGitea 62982d7ffb feat(WIP): 베팅 상세 정보 반환 2022-02-05 07:43:27 +00:00
Hide_DandGitea ec49cdb6ad feat: Global/GetNationList 추가
- 세력일람의 데이터와 원칙적으로 동일
2022-02-05 07:43:27 +00:00
Hide_DandGitea 4b64827f20 feat(WIP): 베팅 관련 작업중 2022-02-05 07:43:27 +00:00
Hide_DandGitea 944c4cb564 dep: DTO 2022-02-05 07:43:27 +00:00
Hide_DandGitea db19655b60 feat: ng_betting 테이블 추가 2022-02-05 07:43:27 +00:00
Hide_D 1975f11338 fix: 이전 로그 키 정렬 기준이 int가 아니라 string인 버그 수정 2022-02-04 12:55:37 +09:00
Hide_D 59515d5276 game: 이민족 발동 관련 변경
- 이민족 멸망 후 타국가 임관
- 이민족 발동 시 명성을 평균치로
2022-01-21 01:00:31 +09:00
Hide_D fea9529bc8 fix: 내무부, 기밀 제한이 잘못된 버그 수정 2022-01-07 19:40:35 +09:00
Hide_D 1f6259c157 game: 기병 공성 능력 약화, 수비시 공방 각각 5% 손해 2022-01-05 01:00:13 +09:00
Hide_D 8908e12c59 game: 유산으로 입찰된 유니크는 랜덤 유니크로 얻을 수 없음 2022-01-04 23:53:57 +09:00
Hide_D a7d6bc2c5c fix: 자동 사령턴 미 활성화 시 내정보&설정 에러 2022-01-04 06:32:45 +09:00
Hide_D 97fd807c2c fix: 단궁, 맥궁 증가 사기 표기량 수정 2022-01-03 22:45:27 +09:00
Hide_D b31f7d64ec game: 이중 격노가 발동하지 않도록 수정 2022-01-03 22:38:42 +09:00
Hide_D bdd574161e fix: 마지막 국가는 임관 불가능한 것처럼 나오는 버그 수정 2022-01-02 23:01:46 +09:00
Hide_D e23e36cbfa fix: 임관 제어 코드에서 () 누락 2022-01-02 22:50:42 +09:00
Hide_D fb796e21e4 fix: starts_with에 사소한 오류가 있어보임
- 이유는 잘 모르겠지만 starts_with($this->destNation['name'], 'ⓤ')
2022-01-02 22:46:32 +09:00
Hide_D dd46c02f09 feat: 게시판 500px 모드 2022-01-02 00:58:34 +09:00
Hide_D d1835c71b7 game: U국의 유저장간 거리를 4->3로 변경 2022-01-01 23:30:33 +09:00
Hide_D 55332864ad game: 토너먼트 자동 채우기 난이도 수정 2022-01-01 01:22:23 +09:00
Hide_D 96a8ef3bcc fix: 전금 증가 횟수 누락 2021-12-31 23:24:15 +09:00
Hide_D 79cfbfe83b fix: 전쟁 금지 설정 누락 부분 수정 2021-12-31 23:22:20 +09:00
Hide_D e7fa95ce8f fix: front에서 둔전 수입 계산 수정 2021-12-31 23:07:42 +09:00
Hide_D a819dde71c fix: 세수 표기를 잘못 반영하는 버그 수정 2021-12-31 23:05:22 +09:00
Hide_D 281cfd366b build: d_setting json ignore 2021-12-31 17:58:36 +09:00
Hide_D f1ba7e76f3 fix-build: install.php 초기 경로 관련 문제 수정 2021-12-31 17:55:29 +09:00
Hide_D 2da72d9b1a build: postcss 설정
- discard-dedupe
- autoprefixer
2021-12-31 17:33:15 +09:00
Hide_D 4cdc18fe7e misc: 사소하게 수정 2021-12-31 04:41:08 +09:00
Hide_D 4400116bdd feat: 내무부 변경 2021-12-31 04:12:37 +09:00
Hide_D 086d6d1ab5 misc: toast 내부 정리 2021-12-31 02:25:43 +09:00
Hide_D 02e86fd2e9 feat: toast내부 div 객체가 무한히 쌓이지 않도록 2021-12-31 02:22:42 +09:00
Hide_D 7310aa6971 feat(WIP): 내무부 국방/임관권유문 에디터 완료. 2021-12-30 22:50:33 +09:00
Hide_D 4927a26c92 misc: makeAPIPath 흔적 2021-12-29 05:50:21 +09:00
Hide_D ee6bec2e0d feat: APIPathGen 추상화 2021-12-29 05:46:35 +09:00
Hide_D def230bf30 feat: ts APICall을 강제화.
- 오버 엔지니어링의 정석
2021-12-29 03:55:40 +09:00
Hide_D 0a4d568b06 feat(WIP): 내무부 2021-12-28 04:29:13 +09:00
Hide_D 69f8e1f1bd feat: APIPathGen 도우미 2021-12-28 04:28:26 +09:00
Hide_D 6f2cb4e05e misc: 미사용 파일 제거 2021-12-27 21:54:23 +09:00
Hide_D db1fbb700c feat: 턴 선택기에서 '턴' 부분 선택 시 커맨드로 선택 2021-12-26 23:57:20 +09:00
Hide_D 842a37eb7b fix: 턴 선택기 홀짝 색 선택 오류 수정 2021-12-26 23:43:01 +09:00
Hide_D 76ff38ed10 feat: 사령부 턴 선택기 추가, 턴 해제 옵션 추가 2021-12-26 23:37:53 +09:00
Hide_D db6b2be101 feat: 턴 선택기에서 '드래그' 선택 지원 2021-12-26 23:22:43 +09:00
Hide_D a998500839 feat: DragSelect 추가
- Vue2 버전을 Vue3로 이식
2021-12-26 22:32:04 +09:00
Hide_D dd5e686d03 game: 유니크 명마, 명검, 서적 갯수 2배
- 말 유니크로 백상, 오환마, 흉노마, 의남백마, 옥추마, 화종마, 옥란백용구 추가
  - 백상, 옥란백용구는 특수효과 부여
2021-12-26 20:44:32 +09:00
Hide_D c9f28e27d2 feat: 소모 군량 보정을 위한 trigger 추가 2021-12-26 20:06:39 +09:00
Hide_D 1bbeb4f50d fix: 급습에서 대상국에 메시지가 뜨지 않음 2021-12-26 18:46:50 +09:00
Hide_D 410f6b261e fix: processing $destNation 구분 버그 2021-12-26 04:19:26 +09:00
Hide_D 7b21b60c11 fix: api 호출 순서가 거꾸로 2021-12-26 03:47:16 +09:00
Hide_D e5d8b71d0a Merge branch 'devel' into ng_depCenter 2021-12-26 03:33:57 +09:00
Hide_D d96099b9d3 fix: toast가 가려지는 부분이 있는 문제 수정 2021-12-26 03:31:32 +09:00
Hide_D ffe9fc9349 misc: 시간-턴 순서 변경. 일관성 약간 향상 2021-12-26 02:36:05 +09:00
Hide_D b7415ba521 dep: 패키지 업데이트 2021-12-26 02:01:58 +09:00
Hide_D 38e689ebb2 feat: api.php를 sammoAPI()로 통일 2021-12-26 01:58:26 +09:00
Hide_D 09caaee58d misc: 홀짝 색을 어둡게 2021-12-26 00:32:09 +09:00
Hide_D e8f8fc501d fix: 홀짝 색 일치...
- nth-child는 그 뜻이 아니다!
2021-12-26 00:06:43 +09:00
Hide_D e6038b854e misc: 턴 선택기에 색 표기 2021-12-26 00:00:56 +09:00
Hide_D dad01b45e4 fix: ui 요소 안정화
- 사령부
- 커맨드 되돌아가기
2021-12-25 23:08:53 +09:00
Hide_D 356250ba8c fix: 사령부에 500px 전환 코드 추가 2021-12-25 22:55:16 +09:00
Hide_D d1f7c13488 fix: 사령부 오른쪽 여백으로 스크롤 2021-12-25 22:49:26 +09:00
Hide_D 6f614eddd3 fix: 사령부가 덜 찬 상황에서 표기되지 않는 버그 수정 2021-12-25 22:30:23 +09:00
Hide_D 5142c94f84 feat: chiefCenter 500px 재구현
- API: 사령턴 관련
- TopBackBar에 갱신 추가
2021-12-25 21:51:47 +09:00
Hide_D c961096b70 Merge branch 'g38_ui' into devel 2021-12-23 17:19:57 +09:00
Hide_D c6050c6d21 fix: 발령시 스탯 표기 2021-12-23 17:19:00 +09:00
Hide_D 8bbc6ae02d Merge branch 'g38_ui' into devel 2021-12-23 03:17:38 +09:00
Hide_D 0adaf7d6c4 fix: 되돌아가기 위치 문제 수정 2021-12-23 03:16:24 +09:00
Hide_D 452c340112 Merge branch 'g38_ui' into devel 2021-12-23 03:06:57 +09:00
Hide_D ffabe96b15 feat: processing 검색 켬/끔 추가 2021-12-23 03:03:43 +09:00
Hide_D 3fc1183be6 feat: processing 체계를 일괄 변경 2021-12-23 01:34:45 +09:00
Hide_D de85ac9237 feat(WIP): 장비매매
- 초성 검색을 일원화
2021-12-23 00:48:53 +09:00
Hide_D 86dd573e2f feat(WIP): processing 숙련전환, 불가침제의 2021-12-22 21:15:26 +09:00
Hide_D b0c7d60d5a feat(WIP): 증여,헌납,백성동원,수몰,천도,초토화,허보 2021-12-22 02:23:06 +09:00
Hide_D 507fa102b9 refac(WIP): 파일 위치 변경 2021-12-22 02:06:40 +09:00
Hide_D 95f079474e feat(WIP): processing 물자원조
- nations, nationList를 nationList로 통합
2021-12-22 01:01:06 +09:00
Hide_D f951f313d2 feat(WIP): processing 계략 세부
- 기타 파일 잔여 코드 제거
2021-12-22 00:24:51 +09:00
Hide_D 50e11f22a1 feat(WIP): processing 선양, 장수대상임관 2021-12-22 00:10:02 +09:00
Hide_D 6dac344a35 feat(WIP): processing 임관
- 구 css 코드 남은것 해결
2021-12-21 23:19:07 +09:00
Hide_D caf51fdc06 misc: topBar 가로선 제거 2021-12-21 22:06:24 +09:00
Hide_D 7d84d383d6 misc: 징병창 선택 병종 보기 옵션 수정 2021-12-21 22:05:04 +09:00
Hide_D 80d7ad8789 fix: 국가 선택 버그 수정, 몰수 type warning 제거 2021-12-21 21:55:05 +09:00
Hide_D be5dc42eb1 misc: 지도 내 소재 도시 표기 방식 변경 2021-12-21 21:52:34 +09:00
Hide_D c8961f60fa misc: 기본 커맨드 검색모드 끔 2021-12-21 21:06:15 +09:00
Hide_D c757687eba feat: 선전포고 구현 2021-12-21 03:45:33 +09:00
Hide_D dd6d59cf97 feat(WIP): 징병, 모병 페이지 모바일 변경 2021-12-21 03:29:35 +09:00
Hide_D 909f4ec2b7 fix: 선택 할 수 없는 병종 보기 버튼 에러 2021-12-21 03:09:52 +09:00
Hide_D 4bf06d9ee5 feat: process 징병 페이지 2021-12-21 03:04:44 +09:00
Hide_D 587f9fc1ec misc: 500px 모드를 일관되게 적용.
- media-1000px, media-500px 추가
2021-12-21 00:30:29 +09:00
Hide_D 841e5c5395 misc: 동떨어진 파일 제거 2021-12-20 22:36:53 +09:00
Hide_D c383a5cc22 dep: e_lib 디렉토리 정리
- select2 하나 남음
2021-12-20 02:43:22 +09:00
Hide_D 003ea3baa7 dep: quill 제거 2021-12-20 02:26:49 +09:00
Hide_D 0fa98340c1 build: devtool 결과 최적화 2021-12-20 01:59:29 +09:00
Hide_D 64e36f038e feat(WIP): process 등용 등
- ColorSelect 색을 가득 채움,
- ColorSelect 결과값을 둥글게
- procGeneralList의 column 가변형 정의
- 등용 brief 조사 처리 버그 수정
2021-12-20 01:08:08 +09:00
Hide_D 78d95048d5 feat(WIP): processing 건국, 다른 메뉴 UI 통일
- lazy loading은 의미가 없으므로 롤백
2021-12-19 22:50:15 +09:00
Hide_D c47f8dbba3 misc: 외부 UI 안정화.
- 세부메뉴 버튼 변경
- 메인 하단바 여백
2021-12-19 22:43:03 +09:00
Hide_D 2dc206ff56 fix: 추방을 연속으로 실행하면 gennum이 과도하게 깎임 2021-12-19 19:26:43 +09:00
Hide_D 72f7811f3d feat(WIP): processing에서 vue 객체 통합, lazy loading 2021-12-19 17:22:54 +09:00
Hide_D c8146814df misc: 내 도시 위치를 '신경쓰이게' 표시 2021-12-19 04:55:28 +09:00
Hide_D a01e5df650 feat(WIP): processing, 몰수
- 초성에서 Windows 겹받침, Mac 된소리 자음(automata 초성)
- 장수 선택에에서 검은색 테마
- 양 선택기에 숫자 추가
2021-12-19 04:28:44 +09:00
Hide_D 9bd151cdc2 feat(WIP): process 국가선택 추가 2021-12-18 23:14:04 +09:00
Hide_D e2ed918437 feat(WIP): process 국기변경 2021-12-18 19:09:02 +09:00
Hide_D bc658433e2 Merge branch 'devel' into g38_ui 2021-12-18 18:03:06 +09:00
Hide_D db1dd6f3df feat: getRankVar에 RankVar가 없을 경우 기본값 지정 가능
- 토너먼트 값 회수
2021-12-18 17:58:20 +09:00
Hide_D edca481362 feat: typescript JosaUtil 2021-12-18 17:33:54 +09:00
Hide_D bc1ca6274d feat(WIP): processing, 출병 추가
- 장수 선택기 추가
- v-model 안 쓰는 바보짓 수정
- proc 전역 변수를 procRes로 묶음
2021-12-18 16:00:53 +09:00
Hide_D 2335dc7566 fix: MapLeagcyTemplate warning 제거 2021-12-18 14:16:51 +09:00
Hide_D 94ab040693 feat(WIP): processing 출병 2021-12-18 05:08:53 +09:00
Hide_D b4b4678e26 feat(WIP): processing 작업 2021-12-18 05:02:47 +09:00
Hide_D 6c93d2fd85 feat(WIP): processing을 vue로 전환 2021-12-18 04:36:06 +09:00
Hide_D 4ca33cb007 fix: 전투 시뮬레이터 UI 깨짐 수정 2021-12-16 03:34:34 +09:00
Hide_D 96515fd16c fix: 내정보/설정에 툴팁이 해제되어있음 2021-12-16 03:23:36 +09:00
Hide_D d736e2d947 refacor: customCSS 코드 분리 2021-12-16 03:23:11 +09:00
Hide_D 7631d99ce6 game: 척사 강화. 15%p -> 20%p 2021-12-16 03:12:37 +09:00
Hide_D 6ddeed82c0 fix: 500px/1000px 모드 2차 수정 2021-12-16 02:36:50 +09:00
Hide_D ffc8242aae fix: 500px/1000px 모드 설정 2021-12-16 02:32:33 +09:00
Hide_D 2767bf70d9 feat: 내 정보/설정 페이지 반응형, 500px/1000px 설정 2021-12-16 02:26:07 +09:00
Hide_D fa7c7794d0 feat: 상/하단 돌아가기 버튼을 bootstrap으로 변경 2021-12-16 01:56:44 +09:00
Hide_D 015e9e54dc feat: 임시 500px/1000px 모드 추가 2021-12-16 01:53:23 +09:00
Hide_D 7dc9863b49 fix: 지도 옵션 버튼의 초기화 이벤트 시점이 다른 점 수정
- 항상 통제 가능한 localStorage 기준으로 변경
2021-12-16 01:24:41 +09:00
Hide_D f13960a56a game: 토너먼터 자동 참가 시, 능력치에 기반 2021-12-16 01:05:59 +09:00
Hide_D ba6370d206 fix: AI 전쟁 상태 정의를 다시. 2021-12-16 01:02:41 +09:00
Hide_D 32fd8c481a fix: 토너먼트 warning 제거 2021-12-15 22:27:37 +09:00
Hide_D e9264e6f13 scenario: 애니집결 업데이트 2021-12-15 20:10:04 +09:00
Hide_D 93e6a056d4 game: 저격 버프, 견고 효과 중 저격,필살 너프
- 저격 성공시 증가하는 사기량 증가
  - 전특만, 몇몇 유니크 제외
- 저격이 성벽에도 발동
  - 사기 상승만 추가, 성벽 너프 없음
- 견고 효과 변경
  - 필살 무효 -> 필살 확률 20% 감소
  - 저격 무효 -> 저격은 받지만 부상 무효
2021-12-15 16:34:07 +09:00
Hide_D 3610f2cbd4 fix: 기본 DummyGeneral에 NPC 타입 3번 부여 2021-12-15 12:01:50 +09:00
Hide_D 0c51544e2e fix: 베팅 결과에서 실제 장수가 아닌 총합(0번)을 가져오는 버그 수정 2021-12-15 12:00:54 +09:00
Hide_D 8f1f477054 fix: mergeQueryColumn의 기본 값에 npc 추가 2021-12-15 11:57:45 +09:00
Hide_D 0b72925f09 fix: 토너먼트 값에서 npc를 안받아옴 2021-12-15 09:09:35 +09:00
Hide_D 9fb477facc game: NPC국이 접경이 사라져도 5개월가량은 기다림 2021-12-15 03:34:49 +09:00
Hide_D 3c474e5551 game: 반환은 4개월 이전에도 이루어지도록 수정 2021-12-15 03:19:02 +09:00
Hide_D 9217f0aaf5 game: 시작한지 4개월째부터 유산으로 유니그 획득 가능 2021-12-15 03:13:24 +09:00
Hide_D dddf4ccf6e build: webpack 캐시를 버전이 바뀌어도 계속 사용하도록 설정 2021-12-15 02:28:47 +09:00
Hide_D 4de010cb1e fix: 빙의 장수의 유산 포인트 적용 문제 수정
- 빙의장의 유산 포인트가 천통시엔 미적용.
- NPC 시절 베팅 결과가 반영되는 오류
  - 베팅횟수+0, 베팅성공+1, 베팅금액+ 문제
2021-12-15 02:15:38 +09:00
Hide_D d2ed7a4a80 Merge pull request 'feat: webpack 빌드 통일, TipTap 에디터 적용' (#201) from unifyBuildPath into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/201
2021-12-14 02:24:17 +09:00
Hide_D 311d5c42a8 fix: 메인페이지, 임관권유 페이지에 적용 2021-12-14 02:05:59 +09:00
Hide_D 3c6a884663 feat: TipTap 이미지 적용 2021-12-14 02:03:05 +09:00
Hide_D 1bfd0018b1 feat(WIP): tiptap 에디터 기능 구현 2021-12-13 21:45:49 +09:00
Hide_D 2c3a9b93c7 feat(WIP): 새 에디터 2021-12-13 03:24:14 +09:00
Hide_D 0961220fdd feat: 국방, 임관메시지 에디터에 TipTap 적용 2021-12-13 02:03:54 +09:00
Hide_D c8b2f28c7c build: esbuild-loader에서 es2021 2021-12-12 21:55:20 +09:00
Hide_D 3f7cc163ec refac: vue 파일 구조 변경 2021-12-12 21:48:48 +09:00
Hide_D 8ede84c176 build(WIP): printDist를 모든 코드에 적용
- 현재 summernote 미작동
2021-12-12 19:26:27 +09:00
Hide_D 6a7f62f2c2 build(WIP): php단에서 변경된 dist_js에 맞게 js,css 로드
- fix: webpack 출력물 문제
- webpack splitChunks 파일 통일
2021-12-12 16:33:20 +09:00
Hide_D 0b82024caa fix: 에러 없이 emit 된 경우에만 빌드 완료 표지 출력 2021-12-12 15:28:52 +09:00
Hide_D fd057ebb05 build(WIP): 빌드 결과물을 서버 주소에 관계없이 통일 2021-12-12 13:52:55 +09:00
Hide_D 47e6958446 feat: 글꼴 속성 시험 적용 2021-12-12 12:53:50 +09:00
Hide_D 690fe46931 fix: 추가 수정 2021-12-11 23:22:12 +09:00
Hide_D 10ec7b55d0 fix: 등용 수락이 불가능한 버그 수정 2021-12-11 23:20:32 +09:00
Hide_D 5079db5ceb fix: showErrorLog 페이지 디스플레이 수정 2021-12-11 23:10:34 +09:00
Hide_D dd4f664724 fix: 유산 포인트 반영시 ownerID가 아니라 generalID 를 사용하는 버그 2021-12-11 22:56:08 +09:00
Hide_D 932e8ca093 fix: 상단 버튼 안되는 버그 수정 2021-12-11 14:05:06 +09:00
Hide_D 193e6eb9ca fix: 메인페이지 갱신 버튼이 일부만 동작하는 버그 2021-12-11 13:52:00 +09:00
Hide_D e28b878a68 fix: 베팅에 사용할 값을 가져오지 못하는 버그 수정 2021-12-11 13:19:46 +09:00
Hide_D 4d6f64cf96 build: 약간 변경 2021-12-11 12:44:51 +09:00
Hide_D 6441fc09e4 misc: scss 파일 정리 2021-12-11 12:12:16 +09:00
Hide_D d8c54b4632 fix: main 페이지가 vue로 통합되었으므로 printCSS 변경 2021-12-11 11:55:17 +09:00
Hide_D a8f2c9787d misc: main의 외부 초기화 코드를 내부로 이동 2021-12-11 11:52:02 +09:00
Hide_D dfb10c1b44 fix: initTooltip과 bootstrap-vue-3 충돌 문제 해결
- 기타 data-bs 안붙은거 마저 수정
2021-12-11 11:37:41 +09:00
Hide_D 95bd5b539f fix(WIP): bootstrap4 잔여 코드 수정 중
- 이상하게도 ingame에서 bootstrap이 충돌 중
2021-12-11 04:45:39 +09:00
Hide_D c811a56557 fix: 비급 위압이 갱신된 위압을 따르지 않음 2021-12-11 03:31:09 +09:00
Hide_D 5892ddcad8 misc: 줄어튼 선택기에 맞게 갱신버튼 이동 2021-12-11 03:30:01 +09:00
Hide_D 111a81766e misc: bootstrap4 toast 사용코드 제거 2021-12-11 03:21:47 +09:00
Hide_D 5819045a01 misc: 여백을 위해 ReservedCommand 16->15 2021-12-11 02:57:32 +09:00
Hide_D b8f19e11ff Merge pull request 'refactor: bootstrap4 => bootstrap5' (#200) from no_bootstrap4 into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/200
2021-12-11 02:53:55 +09:00
Hide_D d3c73579d9 refactor: goodbye bootstrap4 2021-12-11 02:50:24 +09:00
Hide_D 5f001ee091 fix: bootstrap5 modal 2021-12-11 00:30:01 +09:00
Hide_D 741c67c7cb fix: bootstrap5 modal 2021-12-11 00:28:59 +09:00
Hide_D 9456406009 fix: login에서 modal을 Bootstrap5 Modal로 2021-12-11 00:20:11 +09:00
Hide_D 8464f96e40 refactor: common_ts 분리 후 일괄 로드 2021-12-11 00:07:59 +09:00
Hide_D 3c23e0fb93 fix: webpack image.ext revert 2021-12-10 23:33:39 +09:00
Hide_D 18807a642a fix: 앞선 refactor에서 경로 문제 수정 2021-12-10 23:12:35 +09:00
Hide_D 975f77e907 refactor: 상대경로를 @ 시작 절대경로로 2021-12-10 22:34:14 +09:00
Hide_D bd42042a61 refactor(WIP): scss, ts 공통 파일 묶기 2021-12-10 21:45:02 +09:00
Hide_D 9134a7d9f6 fix: lint error fix 2021-12-10 02:55:53 +09:00
Hide_D 53d65c31db dep: update packages 2021-12-10 02:53:12 +09:00
Hide_D 612f15ebad feat(WIP): gateway bootstrap 호출 제거 진행
- 메인페이지 미동작
2021-12-10 02:47:10 +09:00
Hide_D 33378c96ec dep: 이전 버전들과의 호환성을 위해 bootstrap5 명명 유지 2021-12-10 02:28:13 +09:00
Hide_D 703e2f51be feat(WIP): bootstrap 5 tooltip 적용
- bootstrap4 용의 popper.js 제거
- jquery기반 bootstrap tooltip 제거
2021-12-10 02:26:08 +09:00
Hide_D 7d8fa7f1c4 dep(WIP): bootstrap4 1차 제거 2021-12-10 02:02:38 +09:00
Hide_D 62089ef2c2 fix: 수비자 숙련 변경 2021-12-09 23:58:57 +09:00
Hide_D 1d946aa525 game: 수비자의 상대 병종을 0에서 0.1로 변경, 공격자 대비로는 10% 2021-12-09 01:59:04 +09:00
Hide_D 19b62a632b game: 궁병 회피 살짝 너프 2021-12-09 01:32:17 +09:00
Hide_D cbd5b7fc5e game: 백이병 추가
- 성도 특수 병종
- 숨겨진 상성 수치
2021-12-09 01:00:27 +09:00
Hide_D 58673fb385 feat: (예약)plock을 세부 구분할 예정 2021-12-09 00:51:10 +09:00
Hide_D 26ea6a6c69 fix: KVStorage의 기본 상태가 turnOnCache가 아니었던 점 수정 2021-12-09 00:36:15 +09:00
Hide_D 1727d34853 game: 빙의장도 유산 획득이 가능하도록 수정
- 유산 실 반영 시점을 은퇴, 천통 시점으로 변경
2021-12-09 00:26:47 +09:00
Hide_D fc3b854add fix: 빙의가 불가능한 버그 수정 2021-12-09 00:01:20 +09:00
Hide_D dba8e5d699 feat: 턴 선택기 실행 후 초기화시, 이전 턴 기억 2021-12-08 21:22:52 +09:00
Hide_D f3df6f7202 feat: 검색 모드 켬/끔 추가 2021-12-08 21:01:16 +09:00
Hide_D 3cbf1eba30 fix: AI 유저장 포상 버그 수정 2021-12-08 01:54:00 +09:00
Hide_D 4623cfbe06 fix: webp가 업로드 가능하나, 메시지 표기가 누락된 버그 수정 2021-12-08 01:38:23 +09:00
Hide_D d4d8e0045b misc: 턴 선택기에 기본턴 선택. 다른 턴 선택시 무효화. 2021-12-08 01:36:59 +09:00
Hide_D ea4f1643d4 misc: 하단 바 세부 항목 크기 확대 2021-12-08 01:31:34 +09:00
Hide_D 5a2ea3496e misc: 턴 입력이 아무것도 없으면 1턴 2021-12-08 01:23:58 +09:00
Hide_D 6dd77dd632 misc: 하단 바, type2 버튼에 밑줄 2021-12-08 01:19:29 +09:00
Hide_D d4279b0cb7 misc: 턴선택이 없을 경우 안내 2021-12-08 01:12:03 +09:00
Hide_D 601222a60d misc: 턴선택기 기본값을 무효화. 2021-12-08 01:11:14 +09:00
Hide_D 9c541735b7 fix: initial-scale=1 제거 2021-12-08 01:06:56 +09:00
Hide_D 858f7139ff fix: 구 sidebar 코드 제거 2021-12-08 01:01:25 +09:00
Hide_D a326ad3c66 fix: 풀모드 메시지함 grid 깨짐 수정 2021-12-08 00:55:54 +09:00
Hide_D 33751a06fe feat: 스마트폰용 하단 바 구현, 버튼 템플릿 변경 2021-12-08 00:24:40 +09:00
Hide_D 8cbe92ca46 fix: anchor 이동에서 #을 남기지 않도록 2021-12-07 02:27:42 +09:00
Hide_D 5587a358ce feat: 초성 검색에서 '알파벳' 대신 검색 추가 2021-12-07 02:03:10 +09:00
Hide_D 40b52dd517 fix: auto500px 가로모드 미설정 버그 수정 2021-12-07 01:54:22 +09:00
Hide_D 5424869d8e Revert "misc: auto500px 필요없음."
This reverts commit 2b5f38ca52.
2021-12-07 01:44:36 +09:00
Hide_D 68a2534d1b misc: auto500px 필요없음. 2021-12-07 01:38:26 +09:00
Hide_D 1699190334 misc: 스마트폰 모드에서 '명령으로' 추가 2021-12-07 01:22:09 +09:00
Hide_D d86d96acc1 misc: 초기 스마트폰 크기 관련 수정 2021-12-07 01:19:38 +09:00
Hide_D f70dbf9cf3 fix: 12px -> 12.5px 2021-12-07 01:01:39 +09:00
Hide_D 33a1681536 fix: font 정렬, 전체선택->턴 선택 2021-12-07 00:51:20 +09:00
Hide_D fcb8da95ca misc: 기본 글꼴 크기를13px -> 14px 2021-12-07 00:37:23 +09:00
Hide_D e8148ab4dc misc,dep: 기본 글꼴을 Pretendard로 일괄 적용용 2021-12-07 00:27:50 +09:00
Hide_D c14f06615e fix: 하단 버튼이 container 밖으로 벗어나는 문제 수정 2021-12-05 23:58:06 +09:00
Hide_D 1c0b28eacd game: 랜덤 임관 밸런스 수정 2021-12-05 23:47:56 +09:00
Hide_D d317a84b09 feat: 턴 선택기에 복합 커맨드 선택 적용 (#199)
- vue-multiselect 기반
- 초성 검색
- 이득, 불리 표기
- 불가 표기
- 선택후 단축 표기

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/199
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-12-05 23:02:27 +09:00
Hide_D 3972cf0194 fix: summernote 최신 버전에서 jQuery require 우회 2021-12-05 03:32:48 +09:00
Hide_D 6d408ac2b1 dep: vue-select 4.0 추가가 2021-12-04 14:11:37 +09:00
Hide_D 8338f8aaa0 misc: 턴선택기에서 모두 선택, 당기기, 미루기 위치 조절절 2021-12-04 13:49:59 +09:00
Hide_D fbd0561420 refac: 500px 모드 변환기 분리 2021-12-04 11:42:26 +09:00
Hide_D de854cc02c misc: 턴선택기 실행버튼 크기 50% 증가 2021-12-04 11:12:42 +09:00
Hide_D 822e161e2e misc: 500px 레이아웃 순서 변경 2021-12-04 02:11:59 +09:00
Hide_D b60bf9fdf9 fix: float-tabs가 sticky보다 아래에 오는 버그 수정 2021-12-04 01:13:50 +09:00
Hide_D 14b0a043d4 feat: 500px 모드에서, 메시지 입력기가 메시지창을 쫓아감 2021-12-04 01:07:05 +09:00
Hide_D a2f5d66597 misc: 500px 레이아웃 구성 변경 2021-12-04 00:42:51 +09:00
Hide_D c02bc26799 misc: 갱신/로비로 버튼 위치 이동 2021-12-04 00:10:41 +09:00
Hide_D 932afec74a fix: buttonPlate에 gap 추가 2021-12-03 23:44:55 +09:00
Hide_D 3da67e7d97 fix: 사령부 ajax 모드 2021-12-03 16:03:02 +09:00
Hide_D 0c95b958aa feat: 메인페이지 화면비 자동 조정 2021-12-03 16:00:38 +09:00
Hide_D 8895ac329a fix: 메인 화면 오동작 요소 수정
- 설문조사 항목 표기
- 설문조사 항목 marquee로 틀어짐(제거)
- 1000xp 모드에서 도시 툴팁 가려지는 문제 수정정
2021-12-03 15:26:45 +09:00
Hide_D cf0416e976 fix: nation color-code #330000 2021-12-03 02:18:13 +09:00
Hide_D f8f3e4d9e8 feat: 500px 모드 나머지 최적화 2021-12-03 02:07:34 +09:00
Hide_D d6bee9aa6d fix: 메인 페이지, 장수 동향, 개인 기록, 중원 정세 띠 2021-12-03 00:18:18 +09:00
Hide_D 2d5e99a0d6 feat: 500xp 모드에서 오른쪽 고속 이동 툴바 2021-12-03 00:14:22 +09:00
Hide_D 97b71347a6 fix: 500px 모드를 확실하게 명시 2021-12-02 22:01:29 +09:00
Hide_D 10e3a0814f misc: 메시지 받아오는 갯수 감소 2021-12-02 21:41:33 +09:00
Hide_D f909df204a fix: .toolbarButton2 2021-11-30 02:00:35 +09:00
Hide_D 661e6cc5da misc: ReservedCommand 색을 약간 수정
- 딱히 어룰린다는 느낌은 여전히 없다.
2021-11-30 01:58:42 +09:00
Hide_D b2b911ec81 fix: 메인페이지 '이전 메시지 불러오기'를 전체 너비로 2021-11-30 01:44:02 +09:00
Hide_D f238077944 fix: 메인 페이지 시나리오 표기, 줄 바꿈 2021-11-30 01:40:49 +09:00
Hide_D 3c930dacb8 feat: 나머지 메인 버튼도 lumen 버튼으로 통일 2021-11-30 01:38:07 +09:00
Hide_D 6dcb46c0b8 feat: commandButton을 lumen 버튼으로 2021-11-30 01:09:37 +09:00
Hide_D 27c7a5a3ad feat: 국가별 색 버튼을 lumen button profile에 맞춰 작성 2021-11-30 00:54:08 +09:00
Hide_D 846bdfdc88 feat(in-progress): 턴선택기 연월에 select, 강조 표기 2021-11-29 01:19:25 +09:00
Hide_D a2026cb3fd feat(in-progress): 턴 선택기에서 select와 toggle 분리 2021-11-29 01:17:36 +09:00
Hide_D 06fa539293 feat(in-progress): 커맨드 목록 UI/UX 정리 2021-11-29 01:00:52 +09:00
Hide_D 752f69d3ef misc: common.css를 bootstrap5를 포함한 css로 변경 2021-11-28 23:09:37 +09:00
Hide_D 897997b8ac feat: 메인화면의 도시정보를 500px, 700px 가변 2021-11-28 22:22:52 +09:00
Hide_D 526fa11c20 fix: 500px 지도모드에서 tooltip 위치 조정 2021-11-28 19:24:31 +09:00
Hide_D 8eda98ff4c feat(in-progress): 메인메뉴 지도를 500px 모드에 맞게 수정 2021-11-28 18:54:37 +09:00
Hide_D 99d7a26b98 dep: bootstrap5 custom 조합 darkly + lumen 2021-11-28 18:03:18 +09:00
Hide_D 0aaadf9536 feat: 턴 선택기를 vue 기반으로 변경 2021-11-28 01:57:46 +09:00
Hide_D 9adcbecce4 feat(in-progress): 턴 조작기를 vue로 분리 2021-11-27 15:40:31 +09:00
Hide_D 6605a84f2c dep: bootstrap 2021-11-27 15:40:00 +09:00
Hide_D 6c9510d8f4 fix(in-progress): viewport width를 500으로 진행하기로 2021-11-27 02:15:39 +09:00
Hide_D 03a62dc23f fix(in-progress): viewport width를 360px 폰에서 맞게 수정 2021-11-27 02:10:08 +09:00
Hide_D 93efacbef5 feat(in-progress): 메인페이지 기본 반응형 전환.
- full, half 모드
2021-11-27 01:53:00 +09:00
Hide_D b6b28de8e2 feat(in-progress): 메인 페이지에서 table 제거 2021-11-26 21:40:55 +09:00
Hide_D faaed40b39 fix: 비쟁장에 쟁장 공식이 섞여서, 최소 포상 금쌀이 꼬이는 문제 수정 2021-11-26 19:53:12 +09:00
Hide_D 6b035f64d2 fix: branch 못 알아낸 건 unknown으로 하기 2021-11-26 19:11:50 +09:00
Hide_D 9f049dcb18 fix: branch 가져오는 표기법 다시 수정 2021-11-26 19:05:59 +09:00
Hide_D 0141449e4f fix: git ignore 빠진부분 수정정 2021-11-26 19:03:34 +09:00
Hide_D 4ce49f259d fix: origin branch를 제대로 파싱하지 못하는 버그 수정 2021-11-26 18:56:04 +09:00
Hide_D 0f35569e05 fix: 삭제된 기능인 '폐쇄중 로그인'을 UI에서도 제거 2021-11-26 18:48:00 +09:00
Hide_D 1c4dabed72 feat: 버전 표기에 branch명 같이 표기 2021-11-26 18:44:18 +09:00
Hide_D 38114c0639 game: 수비자 피살 숙련도 0, 사살 숙련도 0.9->0.8 2021-11-26 17:42:50 +09:00
Hide_D 527c8370f1 fix: 권한 없는 유저가 수락 버튼을 누를 시, 아예 메시지가 사라지는 버그 수정 2021-11-20 14:00:01 +09:00
Hide_D 6a9a57e2bc fix: '최소 전투 가능 병력 수'를 매우 높여 출병 금지가 가능한 문제 수정 2021-11-20 00:37:07 +09:00
Hide_D 7b6f1b510e feat: 전쟁 금지/허가 여부 횟수 제한 부활 2021-11-19 23:43:00 +09:00
Hide_D 94bc7547d6 game: 출병은 일반내정보다 먼저여야함 2021-11-19 23:10:32 +09:00
Hide_D 5a4552aaff fix: 방어력 증가 세팅이 잘못됨. 2021-11-17 23:08:57 +09:00
Hide_D 06e314d301 game: 보병 수비시 방어력 5% 증가 2021-11-17 23:00:40 +09:00
Hide_D 8bead301ef game: NPC 베팅 판돈 스케일 증가가 2021-11-16 23:45:33 +09:00
Hide_D 6282445f7d feat: 토너먼트 베팅에서 모든 NPC가 10원씩 베팅함
- 추가로 베팅 공지
2021-11-16 23:12:32 +09:00
Hide_D bf244533f7 game: 국력, 랜임 계산식에서 유저장 전투력 계수를 NPC의 1.5로 설정 2021-11-16 22:40:47 +09:00
Hide_D 5ebfaf24ee feat: 토너먼트 비중을 강제로 조정 2021-11-16 22:18:29 +09:00
Hide_D 0c0283dc02 feat: '능동 행동 수' 유산 포인트 추가
- 거병, 건국, 방량, 선양, 모반
- 임관, 랜덤임관, 장수대상임관, 등용수락, 하야
- 출병(500명 이상, 훈사 7070 초과)
- 인재탐색 성공(난도에 따라 추가 보정)
- 첩보(예외, 0.5)
- 증축, 감축, 국기변경, 국호변경, 천도성공
2021-11-16 21:38:55 +09:00
Hide_D 375b08be87 feat: NPC정책 최대 포상량 지정 2021-11-16 20:45:16 +09:00
Hide_D cbc8f94b0a game: 국고가 2000 밑으로 가더라도 무조건 물자조달만 하지는 않게 수정정 2021-11-16 20:01:50 +09:00
Hide_D bdac8d163d game: 전특 요구 포인트 감소, 버프 요구 포인트 감소 2021-11-16 19:37:16 +09:00
Hide_D 1f61f37841 fix: 토큰 갱신 시 UserID가 잘못된 버그 수정정 2021-11-14 22:55:37 +09:00
Hide_D 51d523ae72 game: 국력 계산식에 랜덤임관 계산식 일부를 반영 2021-11-14 18:45:28 +09:00
Hide_D 3f9e4962e6 fix: 서버 정지로 의심되는 opcache_reset 해제
- 현재 validate timestamp를 켜서 사용하도록 유도
2021-11-14 13:31:30 +09:00
Hide_D f8fc4fe56b misc: 미활용 함수/상수 제거 2021-11-14 13:20:19 +09:00
Hide_D fb64b7e412 feat: NPC 거병, 이동 로직 대폭 개선
- 근처에 세울 도시를 보고 거병
- 원하는 도시를 정하고 그 도시를 향해 이동
2021-11-14 05:06:39 +09:00
Hide_D 3209cfbc45 fix: warning 제거거 2021-11-14 04:15:04 +09:00
Hide_D 8a99476136 game: 랜덤임관 평가 기준 변경
- 전투 기준을 총 전투 대신 대인 전투로
- 내정 능력에 무력, 지력 비율 반영영
2021-11-14 02:51:40 +09:00
Hide_D eb80f8d111 feat: 자율행동 표기를 휴식(자율행동)으로 변경 2021-11-14 02:47:53 +09:00
Hide_D afde3ce54d game: 랜덤임관 가중치 변경 2021-11-14 02:39:09 +09:00
Hide_D c4b61fec17 game: 작위 보상에도 최대 보유 유니크 수 적용 2021-11-14 00:50:09 +09:00
Hide_D 0b74abf300 game: 랜덤임관 로직에 전투력과 내정능력을 적극적으로 반영영 2021-11-14 00:46:46 +09:00
Hide_D e6c3c9f1d4 fix: 자율턴에서 '월' 표기 빠짐 2021-11-13 16:48:49 +09:00
Hide_D 4e7560b4ed feat: 자율행동 휴식을 명시적으로 자율행동으로 표기 2021-11-13 16:37:47 +09:00
Hide_D 542491b278 feat: 자율턴 한계 표기 2021-11-13 16:33:11 +09:00
Hide_D d36439355d fix: 자율행동턴 시간 제한이 동작하지 않던 버그 수정 2021-11-13 16:05:03 +09:00
Hide_D 4a80815b39 game: 기간별 최대 유니크 획득 수 변경경 2021-11-13 02:25:52 +09:00
Hide_D 6dc57f2566 fix: 자동로그인 과정 버그 수정정 2021-11-11 00:37:29 +09:00
Hide_D 07e8511ce1 game: snipe_combat 제거거 2021-11-08 23:31:56 +09:00
Hide_D 8e927831f5 fix: dummySession 인자 수정정 2021-11-08 23:27:37 +09:00
Hide_D 2c533d2ab3 dep: package update 2021-11-08 16:10:01 +09:00
Hide_D 38208750e7 game: 수비자는 전멸 시 증가하는 사기량을 50%만 적용 2021-11-08 15:20:23 +09:00
Hide_D df14d7c306 game: 반계 효과 유니크 시도 확률 반감 2021-11-08 15:16:15 +09:00
Hide_D b3612db7d2 game: 피장파장 턴을 60턴 기준으로 변경(72턴 동일) 2021-11-08 15:11:24 +09:00
Hide_D 8d90da659e game: 피장파장 딜레이를 최소 72턴으로로 2021-11-08 15:10:45 +09:00
Hide_D f8ddbc0622 game: 종횡가 전략 딜레이를 1/2에서 3/4으로로 2021-11-08 15:08:21 +09:00
Hide_D 673b7054aa 자동 로그인 (#196)
자동 로그인 구현

- login_token 테이블
- reqNonce -> loginByToken
- sha512(token + nonce)

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/196
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-11-08 04:23:07 +09:00
Hide_D 1472cbf257 game: 장비매매 시 도구 유니크 덮어지지 않게 2021-10-29 02:21:53 +09:00
Hide_D d806935c58 fix: 작위 보상이 군주인 경우 반영이 안되는 버그 수정 2021-10-27 02:04:10 +09:00
Hide_D 6b56eb79e1 fix: 403 페이지 redirect 버그 수정 2021-10-27 01:29:19 +09:00
Hide_D d2aea16744 balance: 초기 +5%, -2% 추가가 2021-10-16 21:50:41 +09:00
Hide_D bb800f032e balance: 쌍무쌍 적용 불가, 무쌍 중반 이후 대폭 너프프 2021-10-16 21:22:28 +09:00
Hide_D 64b9f9443e fix: 랜덤 임관 비중 계산식에서 u장 포함 2021-10-14 02:01:12 +09:00
Hide_D fd2d3a0e06 fix: 창 닫기가 필요한 창은 window.open으로 열어야함 2021-10-14 01:12:21 +09:00
Hide_D 08d678bdb8 fix: CreateManyNPC에서 npcCount가 0이면 fillCnt가 무시 2021-10-14 00:37:08 +09:00
Hide_D 418007e572 balance: 초반 NPC 생성 시 모든 국가를 채울 수 있을 정도로는 제공 2021-10-14 00:36:06 +09:00
Hide_D 4a1bccdf75 balance: 탈취량을 도시 내정치에 기반하도록 변경 2021-10-14 00:16:44 +09:00
Hide_D 00c0b59e9d balance: 랜임 시 의병장, 집합장 카운트는 제외 2021-10-13 02:05:04 +09:00
Hide_D ac82c8ff0b fix(misc): 상대가 치료시 '붉게' 표기 2021-10-13 02:01:41 +09:00
Hide_D f4bef8a090 fix: 인탐, 의병에서 숙련도가 지정되지 않는 버그 수정 2021-10-13 01:56:06 +09:00
Hide_D d8a1055bff fix: DummyGeneral에 유산 관련 포인트 함수가 누락된 부분 수정 2021-10-12 02:25:24 +09:00
Hide_D d672ce4d80 fix: set_error_handler를 못잡는 문제 해결
기타 소소한 버그
- 피장파장 입력시 warning을 계속 일으키는 버그(동작 문제는 없음)
- 토너먼트에서 승리,패배,무승부 외에 MustNotBeReachedException이 throw되지 않음(동작 문제는 없음)
2021-10-12 01:43:54 +09:00
Hide_D 43ec361d03 dep: update phan 2021-10-12 01:36:02 +09:00
Hide_D c3c99c5f76 fix: 공격자 전투력 판정 문제 수정 2021-10-12 01:31:16 +09:00
Hide_D eb1e1421ab fix(misc): phan 2021-10-12 01:30:37 +09:00
Hide_D e8a1d87919 Merge pull request 'balance: 무쌍 너프, NPC 출병 금지 불가' (#195) from balance_210923 into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/195
2021-10-10 13:30:01 +09:00
Hide_D 921ba6811d balance: 무쌍 너프, NPC 출병 금지 불가 2021-09-23 03:59:08 +09:00
Hide_D 906dd241b4 fix: RootDB template 2021-09-23 03:08:49 +09:00
Hide_D 3f0cd2ad64 fix: illuminate 2021-09-21 03:13:07 +09:00
Hide_D 41420d1954 Illuminate: ready. (critical)
- DB에서 illuminate를 가져올 수 있도록 설정
- 업그레이듵 불가, RootDB, DB를 직접 수정해야함
2021-09-21 03:06:42 +09:00
Hide_D 6e5a72b170 fix: 자동 사령턴 조정이 되지 않는 버그 2021-09-19 15:44:49 +09:00
Hide_D 4b19e6aec8 fix: 명예의 전당 검색 2021-09-19 13:38:40 +09:00
Hide_D 58572cbc36 scenario: 쿠키런 킹덤 임시 구현 2021-09-19 03:03:05 +09:00
Hide_D 096d5766bf conf: vue-style-loader에 esbuild-loader적용 2021-09-18 04:53:26 +09:00
Hide_D f5c5b56492 dep: babel-loader + ts-loader => esbuild-loader 2021-09-18 04:31:31 +09:00
Hide_D 69c69d63e6 dep: package upgrade 2021-09-18 03:52:27 +09:00
Hide_D 3fd8b21867 misc: lint warning, 불필요 파일 정리 2021-09-18 03:49:04 +09:00
Hide_D 8660e8cd85 fix: NPC포상 설정 메시지 수정 2021-09-18 03:42:20 +09:00
Hide_D 8458f725f2 fix: 사망 시 유산 포인트 관련 환불/초기화가 없는 문제 2021-09-18 03:36:08 +09:00
Hide_D 366678c965 fix: 장수 생성창 보이기/숨기기, 턴 시간 고정 표기 수정 2021-09-18 02:49:47 +09:00
Hide_D 336b5668db fix & inheritAction: 랜덤 유니크 습득시 환불 가능하게 수정 2021-09-18 00:15:00 +09:00
Hide_D 55886269ea inheritAction: 설문조사에서는 특정 유니크 구입 기능 해제 2021-09-18 00:06:20 +09:00
Hide_D 0b3698595b fix: hash -> gitHash 2021-09-17 23:40:47 +09:00
Hide_D 05e43a39db fix: 턴 초기화, 전특 초기화 표기 방식 변경 2021-09-17 23:37:53 +09:00
Hide_D 5737ad3db2 fix: 턴 초기화, 특기 초기화 포인트 안내가 1스텝 늦음 2021-09-17 23:34:33 +09:00
Hide_D 4ac174eb9a fix: 반계시도에는 구분 코드가 동작하지 않았음 2021-09-17 23:17:13 +09:00
Hide_D 895eec10b4 fix: 비급 반계가 전특 반계와 같이 동작하지 않는 버그 수정 2021-09-17 23:07:45 +09:00
Hide_D e0d891e89a fix: 재야일 때에는 임관 년도 증가하지 않도록 2021-09-17 03:14:14 +09:00
Hide_D adf7734b85 fix: 생성하자마자 임관 1년차로 나오는 문제 수정 2021-09-17 03:12:38 +09:00
Hide_D 5362be9c21 inheritPoint: 로그 기록 2021-09-17 02:39:11 +09:00
Hide_D 847ece52f2 fix: summernote.css 2021-09-16 22:39:19 +09:00
Hide_D 851c59d22c fix: 유저전투장 긴급포상 쌀 2021-09-16 22:37:31 +09:00
Hide_D 0669534bba fix: 궁 유니크 저격 계수 2021-09-16 22:24:29 +09:00
Hide_D 05db47e62a fix: 설문조사에서 환불 불가능한 문제 수정 2021-09-16 22:06:57 +09:00
Hide_D 4a0e608d1c fix: itemTrials 삭제 후 통째로 array가 비면 array도 마저 삭제 2021-09-16 22:00:35 +09:00
Hide_D 45fe73af86 fix: eventColumn에 aux 추가 2021-09-16 21:47:32 +09:00
Hide_D 4d9fcd657f fix: vote에서 aux 2021-09-16 21:43:37 +09:00
Hide_D a057deb0fe fix: 유니크를 얻는 턴이 아니더라도 환불은 하도록 수정 2021-09-16 21:38:43 +09:00
Hide_D 4766210a7d 랜임 실패시 실행 턴. 요양 -> 인탐 2021-09-16 21:24:52 +09:00
Hide_D fd26aae6d3 schema 변경 2021-09-16 04:13:34 +09:00
Hide_DandGitea c5c092cc8e Join: 양식 일부 수정 2021-09-15 19:06:15 +00:00
Hide_DandGitea 58c0a21d90 fix: 턴 시간 변경 코드 2021-09-15 19:06:15 +00:00
Hide_DandGitea 8dc567f966 fix: LazyVarUpdate unset 2021-09-15 19:06:15 +00:00
Hide_DandGitea 942b2752f5 fix: previous inheritPoint 지정값 버그 2021-09-15 19:06:15 +00:00
Hide_DandGitea b9259353f4 misc: layout 2021-09-15 19:06:15 +00:00
Hide_DandGitea 86c614dd40 inheritAction: UI 1차 완성 2021-09-15 19:06:15 +00:00
Hide_DandGitea 1a010a16a9 miisc: 간격 조절 2021-09-15 19:06:15 +00:00
Hide_DandGitea d5b5726b1e InheritAction: UI 턴 초기화, 전투 특기 초기화, 랜덤 유니크
- 턴 초기화에 버그가 있는듯?
2021-09-15 19:06:15 +00:00
Hide_DandGitea d06f3b6bdf inheritStore: 버프/디버프 구매 UI 2021-09-15 19:06:15 +00:00
Hide_DandGitea 97a28f716c inheritAction: 특정 전특 획득 2021-09-15 19:06:15 +00:00
Hide_DandGitea f54bdfcea0 Inherit: Action 완료? 2021-09-15 19:06:15 +00:00
Hide_DandGitea 5958c4b0ba InheritAction: 유니크 입찰, 랜덤 아이템 2021-09-15 19:06:15 +00:00
Hide_DandGitea 7c3db881c7 dep: bootstrap-vue-3 추가
- 아직 없는 기능이 많으므로 단순 출력은 CoreUI Vue 동시 활용
- 불편..
2021-09-15 19:06:15 +00:00
Hide_DandGitea 51ee2e1b2c misc: License 2021-09-15 19:06:15 +00:00
Hide_DandGitea baa813004b fix: 메인페이지 지도를 반응형으로 2021-09-15 19:06:15 +00:00
Hide_DandGitea 86b5269d3d inheritPoint: 가입폼
- 기본 동작
- 턴시간에는 버그 있음
2021-09-15 19:06:15 +00:00
Hide_DandGitea 860e6dacac vue: join 생성 완료 메시지 2021-09-15 19:06:15 +00:00
Hide_DandGitea 22025bd89e vue: join 2021-09-15 19:06:15 +00:00
Hide_DandGitea ed9301455d fix: inheritSkill 연산을 위해 aux 필요 2021-09-15 19:06:15 +00:00
Hide_DandGitea 35df84e059 fix: maxPhase 연산에서는 oppose가 없음 2021-09-15 19:06:15 +00:00
Hide_DandGitea 62deebf310 fix: inheritUnique 처리 수정 2021-09-15 19:06:15 +00:00
Hide_DandGitea 7ed4bd5c01 build: join 페이지 준비 2021-09-15 19:06:15 +00:00
Hide_DandGitea c8eb9332b4 misc: 오타 수정 2021-09-15 19:06:15 +00:00
Hide_DandGitea 1df55f9168 api: gateway, ingame 모두 가능하도록 변경 2021-09-15 19:06:15 +00:00
Hide_DandGitea b726c6aa96 유산 포인트로 랜덤 유니크 획득 2021-09-15 19:06:15 +00:00
Hide_DandGitea 0a71962652 balance: 아이템 습득 확률 조정
- 아이템을 소유할 수록, 획득 확률이 기존보다 훨씬 더 낮아진다.
2021-09-15 19:06:15 +00:00
Hide_DandGitea 160946ef74 feat: 아이템 유산포인트로 입찰한 경우 최종적으로 얻는 기능 추가 2021-09-15 19:06:15 +00:00
Hide_DandGitea 1dc67317dc balance: 유니크 아이템을 얻을 수 있는 커맨드 증가
- 강행, 거병, 견문, 군량매매, 귀환, 등용, 물자조달, 이동, 장비매매, 증여, 헌납
2021-09-15 19:06:15 +00:00
Hide_DandGitea 08f4a2e8bf feat: TriggerInheritBuff 구현 2021-09-15 19:06:15 +00:00
Hide_DandGitea 11ffdaa8f7 feat: '계략약화' 특성을 onCalcOpposeStat으로 이동 2021-09-15 19:06:15 +00:00
Hide_DandGitea 0f853303a4 feat: 전투 상대방의 특정 수치를 접근할 수 있는 callback류 생성 2021-09-15 19:06:15 +00:00
Hide_DandGitea d225eb9b16 inheritBuff 준비 2021-09-15 19:06:15 +00:00
Hide_D d926e4b8bc api: 규격 정의 2021-09-12 04:59:34 +09:00
Hide_D 3e2df1d4d8 api: join 2021-09-12 03:22:11 +09:00
Hide_D d670dbf081 feat: 장수 생성 시 유산 포인트에 따라 생성해주는 기능 추가 2021-09-12 02:59:49 +09:00
Hide_D f510a312e3 fix: 은퇴용 유산 포인트 코드가 항상 적용되는 문제 수정 2021-09-12 02:07:29 +09:00
Hide_D 19c44e3d31 fix: 수뇌가 소재 도시에 도시 관련 사령턴(백동 등) 실행시 발생하는 버그 수정
- 백동 + 성수 등등
2021-09-11 19:35:30 +09:00
Hide_D d0848aee67 fix: 가오픈 정보 안나오는 버그 수정 2021-09-10 22:49:30 +09:00
Hide_D f4b4b6811c fix: bootstrap4 package order 문제
- vue3 + bootstrap5 적용 전까진 고통 받아야...
- 당분간 Popper, jQuery가 제대로 export 되었는지 확인 필요
2021-09-10 22:26:14 +09:00
Hide_D fecb3f1f7b fix: gateway tooltip 2021-09-10 21:38:32 +09:00
Hide_D 4c924c0763 fix: 내 정보 로그 추가 불러오기 안되는 문제 수정 2021-09-10 21:05:26 +09:00
Hide_D f1e8d70554 fix: browser support 범위 추가 2021-09-10 18:43:29 +09:00
Hide_D 7d11bc152e fix: 오타 수정 2021-09-09 01:27:29 +09:00
Hide_D fdf0a3135a Merge pull request '스크립트 기반을 WebPack + Babel + TypeScript + Vue3으로 변경' (#191) from ts_convert into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/191
2021-09-09 01:00:42 +09:00
Hide_D 3a1a455c48 [empty] this is a empty commit 2021-09-09 00:59:10 +09:00
Hide_D 3a786e835b Squashed commit of the following:
commit 3ef363a01e
Author: hide_d <hided62@gmail.com>
Date:   Mon Sep 6 02:30:00 2021 +0900

    fix: 은퇴 시 숙련 포인트를 지나치게 많이 받는 문제 수정

commit 9e68bc90c2
Author: hide_d <hided62@gmail.com>
Date:   Mon Sep 6 02:17:56 2021 +0900

    재야에서 도시보기 warning

commit d2590607c2
Author: hide_d <hided62@gmail.com>
Date:   Sun Sep 5 23:05:06 2021 +0900

    fix: div 0

commit 2bce6e4f02
Author: hide_d <hided62@gmail.com>
Date:   Sun Sep 5 23:02:52 2021 +0900

    warning 메시지 수정

commit e64812da72
Author: hide_d <hided62@gmail.com>
Date:   Sat Sep 4 03:42:09 2021 +0900

    fix: m장, 의병장 숙련이 설정되지 않는 버그 수정

commit 7cd40fca03
Author: hide_d <hided62@gmail.com>
Date:   Sat Aug 21 16:04:03 2021 +0900

    fix: 모병/징병에서 조건 검사부 통솔 계산값

commit d1568a3b2c
Author: hide_d <hided62@gmail.com>
Date:   Sat Aug 21 02:50:54 2021 +0900

    허보에 수몰이 같이 들어간 버그 수정

commit e7dcc84afc
Author: hide_d <hided62@gmail.com>
Date:   Thu Aug 19 14:51:50 2021 +0900

    REAMDME.md 버전 수정

commit 8eaa940d4e
Author: hide_d <hided62@gmail.com>
Date:   Wed Aug 18 20:40:37 2021 +0900

    Revert "fix: 7.2에서 오동작 버그 수정"

    This reverts commit 9997675b1d.

commit 9997675b1d
Author: hide_d <hided62@gmail.com>
Date:   Wed Aug 18 20:32:47 2021 +0900

    fix: 7.2에서 오동작 버그 수정

commit 9ef566f11f
Author: hide_d <hided62@gmail.com>
Date:   Wed Aug 18 20:26:31 2021 +0900

    fix: 아이템중 WarActivateSkill 관련 중첩 해제 버그 수정
2021-09-09 00:53:35 +09:00
Hide_D c70181132f build: 서버별 build가 다를 가능성 고려 2021-09-09 00:32:42 +09:00
Hide_D 538615a1f5 fix: tryNpmInstall 이후 genJS까지 실행해야 안전 2021-09-09 00:17:27 +09:00
Hide_D aa20a60a1c fix: recent_map 에러 2021-09-08 23:55:37 +09:00
Hide_D 69fa1dac6c install: php 단에서 npm 설치 환경 구성 2021-09-08 23:50:38 +09:00
Hide_D 3ab349af6e dep: build script 변경 2021-09-08 22:39:14 +09:00
Hide_D 97ac7deb2f misc: npc_control 기존 파일 제거 2021-09-08 21:06:21 +09:00
Hide_D 3230cafb9f 요구사항에 nodejs 요구 추가 2021-09-08 20:41:55 +09:00
Hide_D 394284d8de vue: NPCControl
- 외향  모사(딱히 의미는 없으나..)
- 약간 반응형
2021-09-08 20:39:04 +09:00
Hide_D 6323b174c6 webpack: 최적화 옵션 변경 2021-09-08 03:29:43 +09:00
Hide_D 3d3e0e5139 vue: NPCControl
- 일단 모든 기능 작동
2021-09-08 03:04:40 +09:00
Hide_D ffc7d4bacc vue: NPCControl(WIP) 메인 기능 동작 2021-09-08 02:48:46 +09:00
Hide_D 598236a1d2 vue: NPCControl(WIP) 2021-09-07 03:03:25 +09:00
Hide_D 69207519bd vue-component: NumberInputWithInfo 2021-09-07 00:29:38 +09:00
Hide_D 022eb1012f ts: numberWithCommas 분리 2021-09-07 00:16:28 +09:00
Hide_D 0a9c59f91e fix: 은퇴 시 숙련 포인트를 지나치게 많이 받는 문제 수정 2021-09-06 02:30:00 +09:00
Hide_D 7ebb22b892 재야에서 도시보기 warning 2021-09-06 02:17:56 +09:00
Hide_D 3dc7fc6f14 vue: NPCControl(WIP) 2021-09-06 02:12:28 +09:00
Hide_D 90dea7517b fix: div 0 2021-09-05 23:05:06 +09:00
Hide_D eae48f9564 warning 메시지 수정 2021-09-05 23:02:52 +09:00
Hide_D dd7afba5f5 delete-old: board 2021-09-05 21:27:41 +09:00
Hide_D 73357b6777 CssMinimizer 적용 2021-09-05 18:20:39 +09:00
Hide_D 53df6bbcc6 vue: board 2021-09-05 17:52:39 +09:00
Hide_D 9871559227 vue: Board(WIP) 2021-09-05 03:59:00 +09:00
Hide_D 9cbead1ddc defer 대응 2021-09-05 03:32:57 +09:00
Hide_D 6402028c17 fix: m장, 의병장 숙련이 설정되지 않는 버그 수정 2021-09-04 03:42:09 +09:00
Hide_D 76bd65cf53 vue: inheritPoint 샘플 작성 2021-09-04 00:06:54 +09:00
Hide_D 6e4113de11 vue: inheritPoint(WIP) 2021-09-03 02:42:50 +09:00
Hide_D 12f37f76c7 dep: ready for vue3 2021-09-02 23:03:19 +09:00
Hide_D acd77b2c0a web_pack_config 2021-09-02 01:51:37 +09:00
Hide_D f4fb4ec00d misc: move gateway path 2021-09-02 00:46:33 +09:00
Hide_D 46ae4669ea misc: msg template 통합 2021-08-31 02:35:50 +09:00
Hide_D 67b2dbfe98 js2ts: kingdomList 2021-08-31 02:27:00 +09:00
Hide_D 4f3b39fbfa js2ts: seleect_general_from_pool 2021-08-31 01:03:22 +09:00
Hide_D a28fc52309 js2ts: join 2021-08-30 02:11:07 +09:00
Hide_D d5f0d60794 js2ts: history 2021-08-30 02:02:53 +09:00
Hide_D 72e65587df js2ts: processing - plugin 구조 마저 변경 2021-08-30 01:47:42 +09:00
Hide_D b4d4d90784 js2ts: hallOfFame 2021-08-30 01:43:01 +09:00
Hide_D 3f81fb759d misc: 기존파일 제거 2021-08-30 01:38:24 +09:00
Hide_D d995b39e02 js2ts: currentCity 2021-08-30 01:30:56 +09:00
Hide_D 3bd09a1aa4 core: getJSFiles -> getJSPlugins
- 각각 js를 불러오기보다.. 초기화 함수를 직접 호출
- lazy loading은 어차피 나중에 새로 만들거니까 안 함.
2021-08-30 01:14:20 +09:00
Hide_D a6ff951c98 js2ts: diplomacy
- select2 관련 문제 해결?
2021-08-30 00:27:04 +09:00
Hide_D 604b1557e8 legacy: #bg0, #bg1, #bg2 제거 2021-08-29 02:16:12 +09:00
Hide_D 279bd5c71a misc: Pooper export, summernote lang 2021-08-29 02:05:16 +09:00
Hide_D 97dfb02ab6 js2ts: dipcenter(WIP)
- summernote 이식
- summernote/imageFip plugin 이식
2021-08-29 01:39:03 +09:00
Hide_D 32c7b02303 misc: 미사용 파일 제거 2021-08-28 23:40:37 +09:00
Hide_D e135835e61 jquery-redirect 제거 2021-08-28 23:34:11 +09:00
Hide_D 7ed9a8075c js2ts: main(WIP)
- jquery-redirect 제거
- linkifyStr import
2021-08-28 23:14:07 +09:00
Hide_D ead8110fb4 watch에 dev 모드 추가 2021-08-28 23:13:22 +09:00
Hide_D 586b1b6c15 dep: js package version up
- typscript
- sass
- typescript-eslint
- vue
- core-js
2021-08-28 19:03:28 +09:00
Hide_D e1727c8d80 fix: admin_member path 2021-08-28 18:56:50 +09:00
Hide_D 7bd8a7ff35 fix: msg 기본 동작 2021-08-28 17:25:33 +09:00
Hide_D de48651ae7 feat: exportWindow
- global을 지저분하게 하지 않고, window에 출력만 해줌
2021-08-28 17:20:44 +09:00
Hide_D 9902e07be0 js2ts: msg(WIP) 2021-08-28 06:26:25 +09:00
Hide_D 5e4b38895e js2ts: msg(WIP) 2021-08-28 06:23:25 +09:00
Hide_D 38bbbf261a js2ts: msg(WIP) 2021-08-28 06:22:30 +09:00
Hide_D def0a52578 String format 확장 제거 2021-08-27 03:53:15 +09:00
Hide_D 4f1f87bda0 fix: extExpandCity (format func) 2021-08-27 03:41:32 +09:00
Hide_D 15f9faa2fa js2ts: extExpandCity
- 이부분은 완벽히 새로만들어야 하므로 유지
2021-08-27 03:39:59 +09:00
Hide_D 7257491d8b js2ts: myCityInfo(wip) 2021-08-27 03:36:35 +09:00
Hide_D c19b2a9ebe luxon -> date-fns 2021-08-26 22:50:02 +09:00
Hide_D 54e7fd0293 misc: type module 지정 2021-08-26 21:50:06 +09:00
Hide_D 21f3a2082b misc: delete old gateway install.js 2021-08-26 21:20:47 +09:00
Hide_D f647eb5a7b js2ts: gateway install 2021-08-26 21:20:08 +09:00
Hide_D d7b1db0081 feat: jqValidateForm에 Values Type 지정 2021-08-26 21:10:02 +09:00
Hide_D 11511316d1 js2ts: index(login)
- fix-workaround: popper 로드
2021-08-26 18:11:51 +09:00
Hide_D 95a93c2c44 misc: 사용하지 않은 deprecated 함수 마저 제거 2021-08-26 04:00:52 +09:00
Hide_D 815ce10c25 misc: 개발용 코드 삭제 2021-08-26 03:39:33 +09:00
Hide_D 5f13bfe8a1 js2ts: join user 2021-08-26 03:35:49 +09:00
Hide_D 5cd494c00a js2ts: admin_userlist 2021-08-26 02:28:18 +09:00
Hide_D 5a0a8bedc1 refac: escapeHtml, nl2br, TemplateEngine 분리 2021-08-26 01:37:46 +09:00
Hide_D 3b9884160b js2ts: entrance, webpack(entrance/dist_js) 2021-08-26 01:25:58 +09:00
Hide_D 5b2b01328a webpack: dynamic js build on update 2021-08-25 03:35:51 +09:00
Hide_D e5b51dcd16 genJS 2021-08-25 02:55:11 +09:00
Hide_D 4d8b816acf target별 JS 생성 2021-08-25 02:44:46 +09:00
Hide_D fa109c1b0b feat: VersionGit hash 추가. dynamic추가. 버전 변수 방식 변경 2021-08-25 02:12:35 +09:00
Hide_D b987fce627 feat: VersionGit에 'hash' 추가.(WIP) 2021-08-25 02:05:27 +09:00
Hide_D b072cc3266 gitignore 준비 2021-08-25 01:22:03 +09:00
Hide_D 366b40ea90 build: boosInfo, myPage, convertFormData 2021-08-22 20:13:08 +09:00
Hide_D 3d3daa205d js2ts: bossInfo, myPage
- convertFormData에서 null -> ''
2021-08-22 15:45:10 +09:00
Hide_D 665ebbd11a js2ts: bossInfo 2021-08-22 14:49:03 +09:00
Hide_D 52a5a7697d fix: 리셋 옵션에서 '기본사령턴' 2021-08-22 02:48:14 +09:00
Hide_D 97a38d516a dep: package 2021-08-22 02:40:27 +09:00
Hide_D e89475bf52 dep: webpack cache
- 개발용
2021-08-22 02:31:10 +09:00
Hide_D 90a78b05ce dep: overwrite
- TODO: 서버에서 npm run build를 자동으로 해야함
2021-08-22 02:11:33 +09:00
Hide_D 8c6eff15f0 dep: missing select2 2021-08-22 02:06:50 +09:00
Hide_D 824c58b391 build: board 2021-08-21 21:41:43 +09:00
Hide_D b97500430c js2ts: board 2021-08-21 21:41:32 +09:00
Hide_D bacafc67c9 build: util.ts 분리 2021-08-21 20:45:24 +09:00
Hide_D f23ebcdc2d js2ts: util.ts 분리 2021-08-21 20:45:10 +09:00
Hide_D edbe8e3561 build: betting 2021-08-21 20:38:24 +09:00
Hide_D 05d1e33b30 js2ts: betting 2021-08-21 20:38:15 +09:00
Hide_D 96b60ce0f5 fix: 모병/징병에서 조건 검사부 통솔 계산값 2021-08-21 16:04:03 +09:00
Hide_D 6174bc7ffd build: select_npc 2021-08-21 05:16:07 +09:00
Hide_D 3bd022e03a js2ts: select_npc 2021-08-21 05:15:58 +09:00
Hide_D b0cc5b0b60 build: processing 2021-08-21 04:40:55 +09:00
Hide_D 5493f70458 js2ts: processing
- select2 version dependency 문제로 import는 유지
2021-08-21 04:40:40 +09:00
Hide_D 323b3d9d16 허보에 수몰이 같이 들어간 버그 수정 2021-08-21 02:50:54 +09:00
Hide_D 1b0742ad2a build: processing plugin 2021-08-21 00:30:05 +09:00
Hide_D 2eb7217f49 js2ts: processing plugin 정리 2021-08-21 00:29:50 +09:00
Hide_D b6f5a286b0 build: recent_map 2021-08-20 04:59:13 +09:00
Hide_D 66c496fb10 gateway: 입구의 지도를 iframe으로 변경 2021-08-20 04:58:45 +09:00
Hide_D 56ca588c1e gateway: 입구의 지도를 iframe으로 변경 2021-08-20 04:58:05 +09:00
Hide_D e2b09caff3 build: processing parts 2021-08-20 03:24:14 +09:00
Hide_D a5b4a4c59f js2ts: processing parts(WIP) 2021-08-20 03:24:03 +09:00
Hide_D a70312a90a build: battle_simulator 2021-08-20 02:55:07 +09:00
Hide_D 6c6a3238cb js2ts: battle_simulator 2021-08-20 02:54:57 +09:00
Hide_D 9af10d4bcb misc: showErrorLog
현재 에러로그에는 javascript가 필요하지 않음
2021-08-20 01:40:03 +09:00
Hide_D f6e1b4611e build: install & jqValidateForm 2021-08-20 01:31:32 +09:00
Hide_D 7bc762d357 js2ts-fix: install 2021-08-20 01:31:18 +09:00
Hide_D 8edf1da92b fix: jqValidateForm에서 복합 타입(radio, checkbox) 처리 오류 수정 2021-08-20 01:30:34 +09:00
Hide_D a18baf2ffe REAMDME.md 버전 수정 2021-08-19 14:51:50 +09:00
Hide_D 2d41bf8f2f Revert "fix: 7.2에서 오동작 버그 수정"
This reverts commit 9997675b1d.
2021-08-18 20:40:37 +09:00
Hide_D 334778bdae fix: 7.2에서 오동작 버그 수정 2021-08-18 20:32:47 +09:00
Hide_D 1b46a06eee fix: 아이템중 WarActivateSkill 관련 중첩 해제 버그 수정 2021-08-18 20:26:31 +09:00
Hide_D 1e860e9443 js2ts & wip: install
- jqValidateForm에 전/후처리 추가
2021-08-18 02:59:58 +09:00
Hide_D 0b973672d2 build-misc: BundleAnalyzerPlugin 2021-08-17 02:56:11 +09:00
Hide_D 868ed85c7f build: user_info 2021-08-17 02:25:15 +09:00
Hide_D 6f2a24ec66 js2ts: user_info
- moment js 사용 대상 제거
- sha512 추가
- 비어있는 func.js 제거
2021-08-17 02:25:04 +09:00
Hide_D e5d5899a15 build: entrance 2021-08-17 01:05:54 +09:00
Hide_D 243473a97d js2ts: entrance
- j_server_get_status 반환형 수정
- getDateTimeNow 추가
- common에서 TemplateEngine 코드 버그 수정
2021-08-17 01:05:41 +09:00
Hide_D 28d71b8ce2 js2ts: install_db.php
- jqValidateForm 구현
  - async-validator + 수작업
- common.js 없이 ventor -> 타겟 ts 직접
2021-08-16 23:50:12 +09:00
Hide_D 1acbf90261 gateway printJS 변경 2021-08-16 23:46:53 +09:00
Hide_D 94229f84a3 fix-dep: 로그인 대문 dependency문제로 지도 안나오는 문제 해결 2021-08-16 16:09:54 +09:00
Hide_D cead74238a build: map 2021-08-16 03:29:54 +09:00
Hide_D 73c60ea94c js2ts: map 2021-08-16 03:29:44 +09:00
Hide_D 73638da4db misc: 미사용 파일 삭제 2021-08-16 01:11:38 +09:00
Hide_D bc218b73e1 js2ts: chiefCenter
- common: unwrap_any
- jQuery export 수정
- axios로 변경
- moment -> luxon
2021-08-16 01:06:17 +09:00
Hide_D aac6632f4b js2ts: vendor, evergreen browsers
- IE11 제외(webpack)
- vendor에 bootstrap, jquery 번들
- common.js에서 번들된 jquery, bootstrap 초기화
- 기본 printJS 코드를 common_path, vendors, common으로 고정
2021-08-15 22:55:08 +09:00
Hide_D fdba3fdc74 js2ts: ext.plugin_troop
- async await 대응
- axios 준비
- troop.css
2021-08-15 21:04:06 +09:00
Hide_D 21bb61ec82 js2ts: common 분리, troop.js 2021-08-15 20:19:47 +09:00
Hide_D ce1203d64d js->ts: common.js 2021-08-15 19:59:34 +09:00
Hide_D 56daf15c8e webpack: scss, vue (#189)
WebPack에 scss와 vue를 사용할 수 있도록 세팅.

현재는 php서버와 코드가 강하게 엮여있기 때문에 vue-cli 대신 수동으로 webpack에 등록.

파일 번들링 경로는 다음과 같음

- scss + style -> css
- ts -> js

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/189
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-08-14 05:47:16 +09:00
Hide_D 96faa924d8 Merge pull request 'PHP8 버전 대응, 버그 수정' (#188) from php8 into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/188
2021-08-13 00:00:32 +09:00
Hide_D ee8854451c fix: phan 지시에 따라 일부 버그 수정
- null && key_exists 버그
- or assign이 integer 대상이므로 직접 연산
- false 대신 0 입력한 곳 수정
- 자체 Deprecate 처리한 함수 회피
- 초기화되지 않은 [] 확인하여 처리
- sleep은 정수만 받으므로 usleep으로 변경
- 선언하지 않고 그냥 사용하던 member 변수 선언
- boolean operation 순서 틀린 부분 수정
2021-08-12 23:58:20 +09:00
Hide_D 0975e925a9 use class, function 커맨드를 php8에서 사용할 수 있도록 수정
- \ 토큰 해석 문제
- VSCode 자동 완성 문제로 use function \sammo\{ 를 모두 해제
2021-08-12 22:35:42 +09:00
Hide_D 83d6a2169b 유산 포인트 시스템, 추가 기수 대비 (#187)
- 유산 포인트
  - 기수 뒤로도 누적되는 포인트
  - 생존, 최대 임관년 수, 최대 연속 내정 성공, 병종 상성 우위 횟수, 전투 횟수, 계략 성공 횟수, 천통 기여(규모 상승, 천통 수뇌, 천통 군주), 숙련도, 토너먼트, 베팅 당첨
  - 유산 관리 페이지 제공

- 태수국
  - 181년 1월에 자동 생성되는 u장수국
  - 시간이 지나면 사실상 자동 소멸
  - 유저국과는 4칸 거리, 서로는 2칸 거리
  - 이 시스템으로 인해 m장 거병 차단

- NPC 원조시 불가침
  - 1년 세수만큼 받은 경우 24개월 불가침 제안
  - 최소 6개월
  - 불가침을 받지 않고 추가 원조한 경우 계속해서 기간 상승
  - 단, 불가침 수락 전에 선포를 할 수 있음

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/187
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-08-11 21:57:52 +09:00
Hide_D 21e7a4d966 Dep: update
주로 PHAN
2021-08-06 22:39:09 +09:00
Hide_D 404cd24855 작위보상 비중 수정 2021-05-02 02:00:16 +09:00
Hide_D b4ad72ee67 환약을 유니크로 습득하는 버그 수정 2021-05-01 23:48:01 +09:00
Hide_D bea628b619 환약을 습득하게 되는 버그 수정 2021-05-01 23:46:33 +09:00
Hide_D 3637e54982 유니크 onCalcStat 버그 수정 2021-05-01 23:38:06 +09:00
Hide_D e0d1a0a612 아이템 효과 텍스트 수정 2021-04-30 22:36:24 +09:00
Hide_D 3040996671 무쌍 누락분 수정 2021-04-30 16:35:34 +09:00
Hide_D dd830e7500 TypeCode 추가 2021-04-29 22:38:46 +09:00
Hide_D d2dfe2c418 전투 수비 파트 약 상향 2021-04-29 21:10:47 +09:00
Hide_D 139fb6b6e0 국가 규모 승급시 아이템 습득 방식 변경 2021-04-29 20:31:32 +09:00
Hide_D c4f6976c42 유니크 아이템에 효과 추가 2021-04-29 19:50:12 +09:00
Hide_D ab428fc104 유니크 기본 획득 확률 변경 2021-04-29 18:49:19 +09:00
Hide_D aa97f78acd 무쌍 초반 버프, 후반 너프 2021-04-29 18:47:55 +09:00
Hide_D dbce900aeb 유니크 중복 획득 가능 2021-04-29 18:44:09 +09:00
Hide_D 30b382e2e7 초반 등록 NPC 30명 2021-04-29 18:30:46 +09:00
Hide_D 433c4abb86 fix: 이민족 종료 시점 2021-04-11 23:17:47 +09:00
Hide_D 64404e4092 fix: 이민족 종료조건 추가 2021-04-11 21:22:06 +09:00
Hide_D 08d483af8a fix: 후방 워프 인구 충분 판단 기준 수정 2021-04-10 16:01:21 +09:00
Hide_D fa19c17941 fix: AI 발령 턴 오류 수정 2021-04-10 15:39:03 +09:00
Hide_D c896a999ad fix: 전방 도시가 '관'처럼 인구가 적은 경우 후방 워프하지 않는 버그 수정
feat: 후방 발령 관련 로직도 후방 워프와 유사하게 재 적용
2021-04-10 11:51:10 +09:00
Hide_D f9bca935ac fix: 장수수 카운트에 "의병장"을 포함하여 계산하는 버그 수정 2021-04-02 14:39:57 +09:00
Hide_D 7abf274d89 이민족 난이도 기본 수치 변경 2021-03-29 22:45:43 +09:00
Hide_D e2ad417306 feat: 이민족 등장 2021-03-28 16:31:01 +09:00
Hide_D 2ea9655f6b fix: 이민족 2021-03-28 05:57:53 +09:00
Hide_D f450d5d9de fix: 수비자 도시 버그
fix: RaiseInvader 버그 수정 중
2021-03-28 04:12:10 +09:00
Hide_D f8f4b73a09 feat: RaiserInvader 초기 구현 2021-03-28 03:13:03 +09:00
Hide_D 926d96732d fix: 가상 역사 모드에서 후계자 지정이 사실 모드 설정을 따라가는 버그 수정 2021-03-23 13:24:34 +09:00
Hide_D 167113d6a3 fix: 빙의 해제시 owner 값 버그 수정 2021-03-23 13:19:40 +09:00
Hide_D 911cb614a5 fix: RegNPC 버그 수정, event handler 규격 버그 수정 2021-03-19 18:09:53 +09:00
Hide_D 7a939b7024 fix: RegNPC 버그 수정 2021-03-19 17:44:34 +09:00
Hide_D 6e57a60997 RegNPC 버그 수정 2021-03-19 17:36:13 +09:00
Hide_D 9f1151e699 fix: can부대구출발령 없음 2021-03-19 17:22:48 +09:00
Hide_D 3fbe1fb63d 디버그2 2021-02-28 01:39:47 +09:00
Hide_D d4906eec5a 디버그 코드 추가 2021-02-28 01:33:58 +09:00
Hide_D ebe0663e74 에러 로그용 추가 2021-02-28 01:05:27 +09:00
Hide_D 04c89b9711 긴급 호출 대비 2021-02-21 00:40:49 +09:00
Hide_D 4f2bc874e5 initFull을 할 필요가 없었던 것! 2021-02-10 21:24:04 +09:00
Hide_D 316ac5c3c8 불가침인데도 선포 가능한 버그 수정 2021-01-12 17:14:36 +09:00
Hide_D 7882aa667e 관리자 도구 수정 2021-01-07 22:22:04 +09:00
Hide_D 8b8d5eecbf 모반시도 버그 수정 2021-01-07 01:12:06 +09:00
Hide_D 65b76643ee feat: 빙의일람에 장수 선택 내역
fix: 장수 선택 내역에서 owner_name 미반영 버그 수정
fix: 온라인 장수에서 npc가 뜨는 버그 수정
2021-01-03 18:31:18 +09:00
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
Hide_D b1b06d9c82 베팅장 수리 2020-05-15 00:23:10 +09:00
Hide_D 6feec9bdbd 헌납 버그 수정 2020-05-14 23:54:02 +09:00
Hide_D d00f4f281c 거래장 버그 수정 2020-05-14 23:47:08 +09:00
Hide_D 15e3ec5263 유니크템 습득 확률 버그 2020-05-14 22:05:47 +09:00
Hide_D d6ddd91fda NPC 정책 설명 추가, 부대구조 추가, 포상/몰수량 조절 2020-05-14 02:04:28 +09:00
Hide_D de79e25510 조언자 포함 2020-05-13 02:28:35 +09:00
Hide_D 08f6b4deed 외교권자만 수정 가능하도록 변경 2020-05-13 02:28:14 +09:00
Hide_D 5cd115b54f 긴천시 쌀이 250만 생기니 500으로 증량 2020-05-13 02:22:58 +09:00
Hide_D 44b6f5890c 버그 수정 2020-05-13 02:13:58 +09:00
Hide_D 5dd5933390 코드 버그 수정 2020-05-13 02:11:25 +09:00
Hide_D d55d3f2fe1 정책 반영 2020-05-13 01:56:08 +09:00
Hide_D 2e9b87f0bc 입력창 준비 2020-05-13 00:45:38 +09:00
Hide_D 800c85dd03 npc_control form 2020-05-12 03:20:20 +09:00
Hide_D 5414f7161f 첩보 버그 수정 2020-05-11 02:23:27 +09:00
Hide_D 98b5825475 응답시 새로고침, 등용수락 안되는 버그 수정 2020-05-11 02:14:33 +09:00
Hide_D bda21c421f 등용장 버그 2020-05-11 01:53:15 +09:00
Hide_D ee27b06822 이동시 사기 하락 2020-05-11 01:38:47 +09:00
Hide_D 7504d62ab1 버그 수정 2020-05-11 01:37:37 +09:00
Hide_D f66b5c91fc 출병 에러 로그 수정 2020-05-11 01:24:34 +09:00
Hide_D bf838cd561 출병 어택땅시 아국 때리는 버그 수정 2020-05-11 01:21:46 +09:00
Hide_D eeb92f5915 금쌀 구매 관련 임시 수정 2020-05-11 01:16:27 +09:00
Hide_D 4524fab6b9 이전 로그 보기 추가 2020-05-11 01:05:55 +09:00
Hide_D d1a9b40ed5 테스트용 치트템 추가 2020-05-10 22:24:20 +09:00
Hide_D 96523408bd history 간소화 2020-05-10 15:06:51 +09:00
Hide_D b5646e0988 보상 기준 변경, 버그 수정 2020-05-10 04:50:10 +09:00
Hide_D 645c5cc6c1 인탐 확률 2020-05-10 04:29:14 +09:00
Hide_D 7323983d11 발령을 위해 수정 2020-05-10 04:18:12 +09:00
Hide_D 8650c9e4b9 $connect 잘 가 2020-05-10 03:39:02 +09:00
Hide_D 7cfdb403b3 같은 장수 같은 관직 임명시 버그 2020-05-10 03:26:25 +09:00
Hide_D af30c69560 약간의 쿼리 최적화 2020-05-10 02:18:44 +09:00
Hide_D b49ecb5802 점령->멸망 순서 정정 2020-05-10 02:15:56 +09:00
Hide_D 9f0dd8358f 중원 정보 재작성 2020-05-10 02:12:25 +09:00
Hide_D 1fff99b5f2 $connect 박멸중. 2020-05-10 01:15:25 +09:00
Hide_D f3ef65ad70 접속자수 계산 코드 수정 2020-05-09 23:46:43 +09:00
Hide_D da9d59443b getVar('npc') -> getNPCType() 2020-05-09 23:18:47 +09:00
Hide_D 2e7a5c6244 장수 수 적용 관련 변경 2020-05-09 23:09:36 +09:00
Hide_D 0b6f04ed26 소소한 설문 결과 수정 2020-05-09 17:55:07 +09:00
Hide_D 4856f6c477 토너먼트 우승 처리 버그 수정 2020-05-09 17:52:06 +09:00
Hide_D 0a0b499716 핵심 디버그 코드 제외 제거 2020-05-09 17:47:51 +09:00
Hide_D 954888a879 pushGlobalHistory 해제 2020-05-09 17:41:24 +09:00
Hide_D f00a01c123 내무부 국력순 정렬 2020-05-09 17:22:35 +09:00
Hide_D 0efb3a6f30 포상 기준 변경 2020-05-09 17:16:21 +09:00
Hide_D d3a9a7b54c 버그 수정 2020-05-09 17:00:36 +09:00
Hide_D 4bbf40c5b8 디버그 코드 추가 2020-05-09 16:50:53 +09:00
Hide_D 01ab59774b 징병 버그 1차 수정 2020-05-09 15:54:02 +09:00
Hide_D 5a6f84d5d2 m장 의병장 스탯 버그 수정 2020-05-09 15:34:32 +09:00
Hide_D eea5135316 관직 임명을 3,6,9,12에 하도록 변경 2020-05-09 15:16:27 +09:00
Hide_D 9f303966eb 자가 발령 포상 몰수 2020-05-09 15:14:24 +09:00
Hide_D a31b5ea29d 특기 초기화 추가 2020-05-09 13:14:11 +09:00
Hide_D b6a6ee31ed 설문조사시 아이템을 안 가진것으로 판정하는 버그 수정 2020-05-09 12:20:52 +09:00
Hide_D 9aa7556e5b 버그 수정 2020-05-08 22:09:56 +09:00
Hide_D 12cc54b0ea 버그 수정 2020-05-08 22:03:12 +09:00
Hide_D f8c4eae715 따라 임관 추가 2020-05-08 21:49:05 +09:00
Hide_D f8d8d2122e 버그 수정 2020-05-08 21:18:58 +09:00
Hide_D 157c8e92d5 즉시 사망 안되는 문제 해결 2020-05-08 21:14:33 +09:00
Hide_D bece81b10e TriggerCaller버그 수정 2020-05-08 20:52:16 +09:00
Hide_D 99755e98ee betray가 없는 버그 수정 2020-05-08 20:18:54 +09:00
Hide_D 541de612b2 예약턴 바로 받아오도록 수정 2020-05-08 20:14:20 +09:00
Hide_D c46d9fd04a 턴 실행 순서 조정 2020-05-08 03:31:17 +09:00
Hide_D a49695ace7 자가 치료 문제 2020-05-08 03:17:30 +09:00
Hide_D b562d45531 버그 수정 2020-05-08 03:13:20 +09:00
Hide_D e9f8db58c0 백동 재수정 2020-05-08 03:11:37 +09:00
Hide_D ed3313b2bc 백동 버그 수정 2020-05-08 03:09:20 +09:00
Hide_D 7bb6a9615c 일부 수치 변경 2020-05-08 03:03:16 +09:00
Hide_D e7333508c4 관직 코드 버그 수정 2020-05-08 01:52:24 +09:00
Hide_D 6e6feb6dc1 장수, 도시가 없을 경우 문제 수정 2020-05-08 01:22:27 +09:00
Hide_D cb37e3e993 장수 출력 일부 수정 2020-05-08 01:14:15 +09:00
Hide_D 13f457eba3 연감 저장방식 수정 2020-05-08 01:09:39 +09:00
Hide_D e7f8900286 통합, 항복 제거 2020-05-07 23:48:08 +09:00
Hide_D 7199a770c0 버그 수정 2020-05-07 23:38:26 +09:00
Hide_D e560bbdeb4 천도시 인구의 비중을 조금 더 높게 2020-05-07 00:59:28 +09:00
Hide_D 6479d39f93 버그 수정 2020-05-07 00:48:13 +09:00
Hide_D 9fc9790e93 버그 수정 2020-05-07 00:43:32 +09:00
Hide_D 5a50476e9d 버그 수정 2020-05-07 00:39:25 +09:00
Hide_D b8a8776c2e run_daemon 버그 수정 2020-05-06 22:58:58 +09:00
Hide_D f155a341cb 버그 수정 2020-05-06 20:58:08 +09:00
Hide_D 253e48694a 버그 수정, 반복 도구 강화 2020-05-06 20:56:13 +09:00
Hide_D 30a090004b 버그 수정 2020-05-06 20:08:00 +09:00
Hide_D fb77443b99 버그 수정 2020-05-06 09:10:24 +09:00
Hide_D 06d88883d8 버그 수정 2020-05-06 09:08:26 +09:00
Hide_D 337c9d3241 버그 수정 2020-05-06 09:06:47 +09:00
Hide_D 1d6378c1fc 버그 수정 2020-05-06 09:01:40 +09:00
Hide_D f13cfd190e 접속장수 수 위치 이동 2020-05-06 02:25:58 +09:00
Hide_D a2823b3c29 버그 수정 2020-05-06 02:13:40 +09:00
Hide_D 169edd4f9c nation_env 수정, $connect 일부 제거 2020-05-06 01:53:00 +09:00
Hide_D d0fa094d04 국방,임관권유문을 KVStorage로 분리 2020-05-05 19:55:59 +09:00
Hide_D 6ac12d42fe json_valid 설정. officer 설정 방식 변경 2020-05-05 19:17:27 +09:00
Hide_D a378ac8738 국기 변경 수정, 아이템 보상 추가 2020-05-05 17:24:03 +09:00
Hide_D 8b8f749006 neutralize 일부 롤백
과거의 나는 다 계획이 있었구나.
2020-05-05 03:57:00 +09:00
Hide_D b004a0609b 국호변경, 국기변경, string neutralize 2020-05-05 03:44:00 +09:00
Hide_D 82d4efcbc2 버그 수정 2020-05-05 00:41:16 +09:00
Hide_D 2476726a6a 빠진 코드 추가 2020-05-05 00:19:13 +09:00
Hide_D 19a84d0cc8 getReq변경, ajax인 경우 ajax요청 2020-05-05 00:19:01 +09:00
Hide_D a688b6fdce 건국시 국가색 2020-05-04 21:02:46 +09:00
Hide_D 73e5f5d6ad testPermissionToReserve 수정 2020-05-04 20:52:33 +09:00
Hide_D 014fb9408e MinCondition 조건 약화 2020-05-04 20:37:23 +09:00
Hide_D 91f2be6759 버그 수정 2020-05-04 20:01:23 +09:00
Hide_D 76ac6cf5b5 커맨드 유효성을 2개에서 3개구성으로 변경 2020-05-04 19:51:11 +09:00
Hide_D dbba6fa942 랜임모드시 임관출력 버그 수정 2020-05-04 07:26:53 +09:00
Hide_D d0771e3392 초토화 스택 버그 2020-05-04 06:25:28 +09:00
Hide_D 6c8eca2f57 버그 수정 2020-05-04 06:24:01 +09:00
Hide_D 3aa9d8ae56 버그 수정 2020-05-04 06:22:34 +09:00
Hide_D 42e1764c44 버그 수정 2020-05-04 06:18:20 +09:00
Hide_D 5abe9bd6d5 초토화 버그 수정 2020-05-04 06:17:13 +09:00
Hide_D d5492eee93 초토화 추가 2020-05-04 06:13:15 +09:00
Hide_D a26a59b193 턴 계산 수정 2020-05-04 02:48:09 +09:00
Hide_D 3d2dbe9199 루드라사움 2020-05-04 02:04:34 +09:00
Hide_D 73749b8d22 update server 반영 2020-05-04 01:42:20 +09:00
Hide_D 50c30b7cd0 전략 구현 2020-05-03 17:30:43 +09:00
Hide_D 44305b9abf 숙련전환 추가 2020-05-03 04:09:44 +09:00
Hide_D c98d8fd199 토너먼트 버그 수정 2020-05-03 03:36:21 +09:00
Hide_D 4adc0b7c24 불가침파기제의 추가 2020-05-03 01:33:52 +09:00
Hide_D 1427ac632f 불가침, 종전 메시지 2020-05-03 00:31:04 +09:00
Hide_D 5e4ae07575 버그 수정 2020-05-02 17:52:08 +09:00
Hide_D 9c7fddfb0d 명전 살상률 수정 2020-05-02 17:29:20 +09:00
Hide_D 8ebe81b89f 토너먼트 나눗셈 버그 수정 2020-05-02 16:20:36 +09:00
Hide_D 016ca770f5 phan 처리 2020-05-02 12:01:54 +09:00
Hide_D c8948953c9 버그 수정 2020-05-02 02:25:45 +09:00
Hide_D 85ebd30c9c 장수 등록 수정 2020-05-02 02:15:59 +09:00
Hide_D 5ea6c4c449 색상 2020-05-02 02:14:48 +09:00
Hide_D bfa31d1c79 강조 수정 2020-05-02 02:13:18 +09:00
Hide_D d4f7ce7560 표시 2020-05-02 02:12:23 +09:00
Hide_D 0ef223d80e raise event 등록 CreateManyNPC 추가 2020-05-02 02:09:21 +09:00
Hide_D eb232f7bb1 버그 수정 2020-05-02 01:16:09 +09:00
Hide_D ce4f44a951 버그 수정 2020-05-02 01:15:52 +09:00
Hide_D f70cfb5d48 버그 수정 2020-05-02 01:09:41 +09:00
Hide_D 7e39be6d20 토너먼트 무명장수 코드 수정 2020-05-02 00:36:14 +09:00
Hide_D 979afdbf7b 토너먼트 롤백 2020-05-01 23:41:41 +09:00
Hide_D e662b5ed23 버그 수정 2020-05-01 21:59:53 +09:00
Hide_D fea7dcb4aa 지급률 수정 2020-05-01 18:26:49 +09:00
Hide_D 2220920afe 코드 수정 2020-05-01 18:24:05 +09:00
Hide_D 180b3c7c5d phan 1차 2020-05-01 17:33:14 +09:00
Hide_D beb7553629 메시지 컬러 수정 2020-05-01 16:09:03 +09:00
Hide_D 75934fc5ae 선양 버그 수정.. 2020-05-01 16:02:36 +09:00
Hide_D 0882e06adc 버그 수정 2020-05-01 15:28:00 +09:00
Hide_D 96bd755660 선양 코드 수정 2020-05-01 15:27:42 +09:00
Hide_D 51c96b4d04 phan 설치 2020-05-01 15:26:54 +09:00
Hide_D a529eba693 버그 수정 2020-05-01 03:36:17 +09:00
Hide_D a00b5a71fc None 처리 2020-05-01 03:27:43 +09:00
Hide_D 7f35dda305 징병 버그 다시 수정 ㅜㅜ 2020-04-30 19:58:17 +09:00
Hide_D fccebb059b 징병 입력 버그 수정 2020-04-30 19:56:38 +09:00
Hide_D cf1dc17298 버그 수정 2020-04-30 19:29:39 +09:00
Hide_D b24eabc82a 저격 설명 수정 2020-04-30 17:08:55 +09:00
Hide_D f3a26116b2 전멸시마다 저격 가능 2020-04-30 17:08:34 +09:00
Hide_D 884c1ea82c 버그 수정 2020-04-30 16:47:11 +09:00
Hide_D c65737f554 저격 버그 수정 2020-04-30 16:02:46 +09:00
Hide_D b77a11bfc2 부대후방발령 버그 수정 2020-04-30 13:44:42 +09:00
Hide_D 58fd8e3c7f 부대유저장 후방발령 버그 2020-04-30 13:40:55 +09:00
Hide_D a8cc2fc671 병종 이미지경로 변경 2020-04-30 06:31:12 +09:00
Hide_D d19ebb6b13 내정을 조금 더 고려함 2020-04-30 05:58:44 +09:00
Hide_D fad02e8736 디버그 코드 제거 2020-04-30 05:42:11 +09:00
Hide_D 11c928bf30 AI 천도 안하는 버그 수정 2020-04-30 05:41:42 +09:00
Hide_D b4262eb34b 저격 버그 수정, 필살 강화 2020-04-30 05:07:52 +09:00
Hide_D 76c4a8a966 살상률 표기 버그 수정 2020-04-30 04:34:51 +09:00
Hide_D 0a212af11e 견고 버그 수정, 저격 상향 2020-04-30 04:32:35 +09:00
Hide_D efffb46281 증축,감축,천도 버그 2020-04-30 04:03:43 +09:00
Hide_D e2ec3ef532 천도 버그 수정 2020-04-30 03:16:16 +09:00
Hide_D d3c4dd59d2 징병 로직 일부 수정 2020-04-29 00:28:27 +09:00
Hide_D dcebb79590 출병 기준 수정 2020-04-28 04:02:14 +09:00
Hide_D 0f0b989963 랜덤 성격 불가 수정 2020-04-28 02:18:02 +09:00
Hide_D 4815f6c79a 방랑군 warning 2020-04-28 02:14:10 +09:00
Hide_D 409063a339 디버그 로그 제거 2020-04-28 02:11:25 +09:00
Hide_D c831d539b6 숙련 버그 수정 2020-04-28 02:02:28 +09:00
Hide_D 7aa826fc80 버그 수정 2020-04-28 01:50:25 +09:00
Hide_D d603557c35 버그 수정 2020-04-28 01:37:52 +09:00
Hide_D c267a5c7e0 버그 수정 2020-04-28 01:09:07 +09:00
Hide_D 46764ff9aa 버그 수정 2020-04-27 14:22:07 +09:00
Hide_D f7a041d9fc 버그 수정 2020-04-27 14:12:51 +09:00
Hide_D 751336e5d1 버그 테스트 2020-04-27 14:09:23 +09:00
Hide_D b2403aedac 선정 열심히 2020-04-27 13:03:12 +09:00
Hide_D d5f9e923c4 기술연구 우선순위 낮춤 2020-04-27 12:54:16 +09:00
Hide_D c3c2022029 내정 시도율 변경 2020-04-27 03:09:05 +09:00
Hide_D fb08e86a4c 재야 부대장 사망 2020-04-27 02:53:13 +09:00
Hide_D 6f4c32c04c 디버그 코드 임시 제거 2020-04-27 02:42:10 +09:00
Hide_D 7c74a40baf 수치 수정 2020-04-27 02:39:26 +09:00
Hide_D 8bf60bb793 버그 수정 2020-04-27 02:37:11 +09:00
Hide_D 005aa959c5 부대장 동작 관련 수정 2020-04-27 02:30:52 +09:00
Hide_D d9818f6960 버그 수정 2020-04-27 02:21:11 +09:00
Hide_D f90ac9dea4 버그 수정 2020-04-27 02:18:42 +09:00
Hide_D e0036ca32b 버그 수정 2020-04-27 02:07:34 +09:00
Hide_D ad8acaf296 버그 수정 2020-04-27 00:30:48 +09:00
Hide_D 34a863a6ea 스킬 안 쓰는 버그 해결 2020-04-26 23:52:17 +09:00
Hide_D 724c7388af 특기 획득 구조 변경 2020-04-26 22:31:49 +09:00
Hide_D 2bb6ef8efb 관직 임명 보정 2020-04-26 04:48:31 +09:00
Hide_D baf4d3aa98 버그 수정 2020-04-26 04:08:47 +09:00
Hide_D f4ca4431da 버그 수정 2020-04-26 04:02:16 +09:00
Hide_D 19446a666e 버그 수정 2020-04-26 04:00:06 +09:00
Hide_D b48b09249e 버그 수정 2020-04-26 03:45:19 +09:00
Hide_D be282db1c2 버그 수정 2020-04-26 03:36:40 +09:00
Hide_D 667cf4062f 버그 수정 2020-04-26 03:23:32 +09:00
Hide_D ba442b1457 선전포고 최종 수정 2020-04-26 00:15:30 +09:00
Hide_D a07622d084 reqGold 수정 2020-04-25 23:57:31 +09:00
Hide_D 8855c92e73 수정 2020-04-25 23:54:40 +09:00
Hide_D 6a67a6a66b 디버그 수정2 2020-04-25 23:53:19 +09:00
Hide_D 6822c8137b 디버그 코드 2020-04-25 23:51:10 +09:00
Hide_D 76505aa4de 버그 수정 2020-04-25 23:39:42 +09:00
Hide_D 40fee137d4 의병모집 버그 수정 2020-04-25 23:22:51 +09:00
Hide_D 1f3259e907 의병 버그? 2020-04-25 23:18:32 +09:00
Hide_D 33b0c19d43 선포 확률 추가 수정 2020-04-25 23:15:26 +09:00
Hide_D 1de59279a6 선포 기준 변경2 2020-04-25 22:56:13 +09:00
Hide_D 184a43ccf5 선포 기준 변경 2020-04-25 22:37:51 +09:00
Hide_D efcb71e866 버그 수정 2020-04-25 21:45:41 +09:00
Hide_D 7bc720be77 버그 수정 2020-04-25 20:59:13 +09:00
Hide_D 9ecf6d3735 버그 수정 2020-04-25 20:47:11 +09:00
Hide_D ba968d6ff7 내정장 포상금 설정 2020-04-25 07:35:04 +09:00
Hide_D 5cd86a2766 선전포고 대상이 이상한 버그 수정 2020-04-25 07:02:13 +09:00
Hide_D 11325e6f07 지급률, 선포기준 수정 2020-04-25 06:43:45 +09:00
Hide_D 5b2b7dc03e 일부 설정값 수정 2020-04-25 06:30:01 +09:00
Hide_D 324a67c7da 버그 수정 2020-04-25 06:10:57 +09:00
Hide_D 6b54797aec 군량매매 버그 수정 2020-04-25 05:28:43 +09:00
Hide_D 4e7529ae44 버그 수정 2020-04-25 05:09:00 +09:00
Hide_D 086e61bb19 버그 수정 2020-04-25 04:55:59 +09:00
Hide_D c6eeeda1c3 버그 수정 2020-04-25 04:47:58 +09:00
Hide_D 6d642c8098 버그 수정 2020-04-25 04:33:53 +09:00
Hide_D 40c89a479f 버그 수정 2020-04-24 03:01:26 +09:00
Hide_D f43c811477 버그 수정 2020-04-24 02:56:09 +09:00
Hide_D 0a3277c6e7 버그 수정 2020-04-24 02:24:15 +09:00
Hide_D 667a8fea31 버그 수정 2020-04-24 02:04:41 +09:00
Hide_D 089bb027ae 버그 수정 2020-04-24 01:51:15 +09:00
Hide_D 6667d85623 버그 수정 2020-04-24 01:32:58 +09:00
Hide_D 2513465c6b 버그 수정 2020-04-24 01:28:41 +09:00
Hide_D 831266fe3c 버그 수정 2020-04-24 01:19:02 +09:00
Hide_D bea5cd1f52 버그 수정 2020-04-24 01:09:49 +09:00
Hide_D 961414559f 버그 수정 2020-04-24 00:44:31 +09:00
Hide_D ffa37160a5 버그 수정 2020-04-23 01:11:40 +09:00
Hide_D d856d12126 디버그 코드 제거 2020-04-23 00:44:57 +09:00
Hide_D 1dc16932b6 버그 수정 2020-04-23 00:36:45 +09:00
Hide_D db603c5ebd 버그 수정 2020-04-23 00:11:39 +09:00
Hide_D f837b71423 버그 수정 2020-04-22 23:55:13 +09:00
Hide_D a5b7259577 버그 수정 2020-04-22 23:36:21 +09:00
Hide_D 3f6eeb2a30 버그 수정 2020-04-22 23:35:06 +09:00
Hide_D f8434d7fe2 버그 수정 2020-04-22 23:26:28 +09:00
Hide_D b5cc8ad820 버그 수정 2020-04-22 23:22:39 +09:00
Hide_D 20c2d96dee 버그 수정 2020-04-22 23:18:50 +09:00
Hide_D c08a669aff 버그 수정 2020-04-22 03:18:01 +09:00
Hide_D c4fe77a5ba 버그 수정 2020-04-22 03:05:05 +09:00
Hide_D 6d6326e415 버그 수정 2020-04-22 02:31:53 +09:00
Hide_D 21a956eca8 버그 수정 2020-04-22 02:01:16 +09:00
Hide_D da1273c135 버그 수정 2020-04-21 02:06:03 +09:00
Hide_D aaf7870d88 range 버그 수정 2020-04-21 01:21:10 +09:00
Hide_D 03dffe1181 버그 수정 2020-04-21 01:19:24 +09:00
Hide_D 146010f3f5 명장일람 버그 수정 2020-04-20 23:04:03 +09:00
Hide_D 6526653540 디버그 코드 추가, 버그 수정 2020-04-20 03:08:08 +09:00
Hide_D 7b46a1b9ff 버그 수정 2020-04-20 00:47:35 +09:00
Hide_D 0608f9b3c7 버그 수정 2020-04-19 18:48:56 +09:00
Hide_D e63b46b004 버그 수정 2020-04-19 06:18:35 +09:00
Hide_D 17d9853e90 버그 수정 2020-04-19 05:38:25 +09:00
Hide_D 4d02639985 버그 수정 2020-04-18 22:49:50 +09:00
Hide_D 9677a55a5a db table 구조 일부 수정 2020-04-18 14:52:16 +09:00
Hide_D 87056a4052 history 관련 처리 변경 2020-04-18 14:36:05 +09:00
Hide_D aba9ee7b33 history column을 테이블로 분리 2020-04-18 14:07:07 +09:00
Hide_D ad2baeda2f 오타 수정 2020-04-18 03:59:16 +09:00
Hide_D eab8a3b94e city의 officer를 general로 이동 2020-04-18 03:57:58 +09:00
Hide_D 5d23032500 $_POST 삭제 2020-04-17 01:30:05 +09:00
Hide_D 5a2b6db3bb 투표 코드 수정 2020-04-17 01:23:52 +09:00
Hide_D 546c6a3227 인사부 일부 코드 수정 2020-04-17 01:15:19 +09:00
Hide_D 674018d2fc 통합 세력장수,암행부 query 2020-04-16 02:37:36 +09:00
Hide_D 39b65284bd experience, dedication 변경
expereince, dedication 변경을 add 함수로 변경
경험치,계급 변경을 '즉시' 하도록 변경(남은 부분 있음)
관직 임명을 c에서 j로 변경
2020-04-15 05:34:27 +09:00
Hide_D c0fee32c4c name2 -> owner_name (or orderName) 2020-04-15 02:44:06 +09:00
Hide_D 8428649377 부대 버그 2020-04-15 02:14:49 +09:00
Hide_D 430c792a9b 부대 편성 버그 수정 2020-04-15 02:13:58 +09:00
Hide_D 1e029ee517 부대 코드 변경 2020-04-15 02:13:16 +09:00
Hide_D dfbc837371 버그 수정 2020-04-14 02:38:39 +09:00
Hide_D 3e1bb44284 커맨드 활성화 2020-04-14 02:38:05 +09:00
Hide_D aacb6adb26 증축, 천도, 감축 2020-04-14 02:36:20 +09:00
Hide_D 95ac7454ae Merge branch 'ng_turn' of ssh://storage.hided.net:2525/devsam/core into ng_turn 2020-04-14 01:49:46 +09:00
Hide_D 85389c4a60 천도 추가 2020-04-14 01:49:40 +09:00
Hide_D 913289e0ef AI 구현 2020-04-13 02:45:24 +09:00
Hide_D 84efd5bfdf AI 구현중 2020-04-12 02:46:51 +09:00
Hide_D 33014dbd7d AI 구현중 2020-04-10 03:19:56 +09:00
Hide_D d0e20eb8d3 AI 커맨드 구현중 2020-04-09 03:13:14 +09:00
Hide_D a386999567 Util::range 추가 2020-04-09 02:07:50 +09:00
Hide_D 8519481f96 AI 구현중 2020-04-08 03:30:40 +09:00
Hide_D 97fdc095a5 AI턴 추가 구현 2020-04-07 02:55:59 +09:00
Hide_D 915243ee4a NPC 자동 턴 추가 구현 2020-04-06 03:01:20 +09:00
Hide_D 727e447899 AI 작업중 2020-04-04 04:52:18 +09:00
Hide_D e6ea5824f0 병종 코드, 숙련 코드 재설정
병종 상성 지정시 병종 단위가 아니라 병종 코드 자체로 지정 가능
2020-04-03 23:54:26 +09:00
Hide_D 8eee11cee9 Merge branch 'ng_turn' of ssh://storage.hided.net:2525/devsam/core into ng_turn 2020-04-01 20:24:51 +09:00
Hide_D 7aca3049d1 join 버그 수정? 2020-04-01 20:24:43 +09:00
Hide_D 03b8d0c388 AI 천도 알고리즘 2020-04-01 03:30:10 +09:00
Hide_D aa7d01f3d6 AI 뼈대 다시 잡는중 2020-03-31 02:50:07 +09:00
Hide_D b397c41c9e 신규 AI 구현 준비 2020-03-31 02:05:04 +09:00
Hide_D 0561cc3320 토너먼트값, 전투, 계략값을 분리 2020-03-29 05:03:49 +09:00
Hide_D 6f47e92050 버그 수정 2020-03-28 19:56:11 +09:00
Hide_D 9a67ac7509 __dir__ -> __DIR__ 2020-03-28 19:48:09 +09:00
Hide_D d922993eaf VAL2를 VAL_max로 변경 2020-03-28 19:43:40 +09:00
Hide_D 9fa2225283 Array type arg js 처리 2020-03-25 02:56:45 +09:00
Hide_D 35eadad96b 금액 단위를 GameConst로 이동, 원조 추가
arg 목록으로 amountList 추가
2020-03-25 02:54:33 +09:00
Hide_D 081416475e dev에서 쉽게 확인가능한 코드 이전 2020-03-23 02:11:00 +09:00
Hide_D 12492c842c MyISAM to Aria 2020-03-23 00:24:17 +09:00
Hide_D 68e01c1e73 dev 코드와 일치 2020-03-22 23:30:11 +09:00
Hide_D bdcc79ce34 dev와 composer 버전 일치 2020-03-22 23:22:50 +09:00
Hide_D 869ad39ddc 의병모집 버그 수정 2020-03-22 04:20:21 +09:00
Hide_D 30e1e35090 의병모집 구현 2020-03-22 04:16:42 +09:00
Hide_D 6c185ffd09 전략 DetailTitle/ isReservable 완화 2020-03-22 03:17:05 +09:00
Hide_D a9435f8f32 사령턴 커맨드 버그 수정 2020-03-22 02:47:44 +09:00
Hide_D 9ea8d3ec97 피장파장 추가 2020-03-22 02:34:04 +09:00
Hide_D d918234bb8 버그 수정, 허보 구현 2020-03-21 20:17:39 +09:00
Hide_D afbbbaa855 백성동원, 버그 수정 2020-03-21 19:13:13 +09:00
Hide_D a844ef31a2 오타 수정 2020-03-21 17:36:53 +09:00
Hide_D b469ce0504 수몰 구현, createGeneralObjFromDB 최적화 2020-03-21 17:36:36 +09:00
Hide_D ed2bc8c390 등용수락에서 destNationID 빠진것 추가 2020-03-13 01:45:42 +09:00
Hide_D cb246e859e 등용 수락 변경, Aux 처리 추가
nations->aux.joinedNations
dummyGeneral에 exp,ded 추가
scheme에서 nations 제거
2020-03-13 01:44:18 +09:00
Hide_D 3d6b99c004 필사즉생 디버그 수정 2020-03-12 22:02:50 +09:00
Hide_D 842942c0fe 필사즉생 구현 2020-03-12 21:57:57 +09:00
Hide_D 71c4a84833 불가침 메시지를 좀더 명확히 2020-03-12 15:59:36 +09:00
Hide_D d1bc434ced 불가침 외교 커맨드 부활. 버그 수정 2020-03-12 15:58:14 +09:00
Hide_D 59f7448aa7 Constraint 변경 내용 버그 수정 2020-03-11 22:17:26 +09:00
Hide_D 4408692565 Contraint Reason 추가 2020-03-11 21:49:41 +09:00
Hide_D 2e8607b811 지도 선택 살짝 수정 2020-03-11 21:38:49 +09:00
Hide_D 2f2890e582 선전포고에 지도 추가 2020-03-11 18:10:41 +09:00
Hide_D e2b39be3ff 선전포고 구현 2020-03-11 17:08:55 +09:00
Hide_D 7ada07a99a 버그 수정
랜덤임관, 모반시도
2020-03-08 22:55:10 +09:00
Hide_D 6b16573f6b 커맨드 brief 수정, 내무부 버그 수정 2020-03-08 20:01:49 +09:00
Hide_D 1de49fe998 증여 버그 수정, 출병을 현 코드에 맞게 수정 2020-03-08 19:30:49 +09:00
Hide_D 7109e66ad8 사령부 밀기 당기기 추가, 기존 코드 삭제 2020-03-08 13:26:56 +09:00
Hide_D d21c2f67ba 버그 수정, 커맨드 사이즈 자동 반영 2020-03-08 13:18:54 +09:00
Hide_D 0d39add09c 아이템 구매 버그 수정, 아이템 호칭문제 수정 2020-03-08 12:03:23 +09:00
Hide_D 5e1f7ea571 버그 수정 2020-03-08 09:57:32 +09:00
Hide_D 35c71bd21b arg 경고 회피, 사령부 버그 수정, 턴반복 추가 2020-03-07 23:12:59 +09:00
Hide_D e6a39f246d 발령,몰수,포상 활성화, 사령턴 턴 입력 활성화 2020-03-07 19:52:33 +09:00
Hide_D 65cd8af9e1 버그 수정, 사령부 UI 복구 2020-03-07 18:04:23 +09:00
Hide_D e916f2fc40 버그 수정.. 2020-03-06 20:01:11 +09:00
Hide_D 13da80ee85 버그 수정 2020-03-05 23:53:59 +09:00
Hide_D 4f4045363b 징병 폼 완료 2020-03-05 21:53:37 +09:00
Hide_D 9600e18c92 징병 구현중 2019-11-27 13:54:19 +09:00
Hide_D d5aefccadc 버그 수정2 2019-10-10 02:42:49 +09:00
Hide_D 9e64b268cf 버그 수정 2019-10-10 02:39:25 +09:00
Hide_D 0893bf6473 func_time_event 재작성, 수입관련 코드 수정 2019-10-10 02:36:42 +09:00
Hide_D 21f8b814e0 버그 수정. getStatValue 성능 향상 2019-10-09 15:57:18 +09:00
Hide_D 10fd22ba81 코드 일부 수정 2019-10-09 14:43:26 +09:00
Hide_D a3fef6c62f round 문제 수정 2019-10-09 12:36:06 +09:00
Hide_D d750167a00 버그 수정 2019-10-09 12:12:23 +09:00
Hide_D 241bf62fdc isConsumableNow 버그 수정 2019-10-09 11:38:28 +09:00
Hide_D bc5574615d 아이템 관련 버그 수정 2019-10-09 11:34:56 +09:00
Hide_D 48cac053fd 버그 수정 2019-10-09 03:19:50 +09:00
Hide_D 25837f6393 버그 수정 2019-10-08 02:29:07 +09:00
Hide_D b281362c98 구 코드 삭제 2019-10-07 02:06:02 +09:00
Hide_D e5050bb6c8 장수 커맨드 설명 추가 2019-10-07 00:38:52 +09:00
Hide_D 2d0c3ef881 소비 금액 반올림 2019-10-07 00:17:17 +09:00
Hide_D ee029aac10 커맨드 상세 입력 페이지 초기 구현 2019-10-07 00:09:13 +09:00
Hide_D da205c09f9 기본 커맨드 입력 가능하도록 구현 2019-10-06 22:39:13 +09:00
Hide_D 07317b86a2 오타 수정 2019-10-06 19:26:41 +09:00
Hide_D 79e2543266 NPC 수뇌 임명 버그 수정 2019-10-06 19:26:08 +09:00
Hide_D 303cbcd188 디버깅용 변경 2019-10-06 19:06:49 +09:00
Hide_D a47905541c 턴 표기 '드디어' 추가 2019-10-06 19:01:46 +09:00
Hide_D 4e988db50f 버그 수정 2019-10-06 16:14:41 +09:00
Hide_D 9dc3d83a77 세력 일람 쿼리 최적화 2019-10-06 16:05:20 +09:00
Hide_D 934c1b0cfe 버그 수정... 2019-10-06 14:49:41 +09:00
Hide_D 70181d95c7 전투 버그 수정 중 2019-10-06 02:49:54 +09:00
Hide_D 8a210103c0 장수 정보 버그 수정 2019-10-06 02:02:31 +09:00
Hide_D df96381759 기존 파일 제거 2019-10-06 01:46:38 +09:00
Hide_D 2006845ff7 턴 버그 수정, 아이템 관련 구 코드 수정 2019-10-06 01:45:50 +09:00
Hide_D 44f0e78086 turntime 관련 조정중 2019-10-05 10:52:31 +09:00
Hide_D 824956a34d 버그 수정 2019-10-05 03:11:44 +09:00
Hide_D 1e7e01b6b0 gen123 => officer432 2019-10-05 02:45:20 +09:00
Hide_D cd25aaaca6 버그 수정 2019-10-05 01:19:58 +09:00
Hide_D d481047eb4 iAction,name,info, buildiActionCache, mode, myInfo 2019-10-05 01:17:43 +09:00
Hide_D 1699ac6e08 일부 버그 수정 old 파일 삭제 2019-10-04 23:03:19 +09:00
Hide_D 79b7188578 weap -> weapon 2019-10-04 18:15:12 +09:00
Hide_D 843f469914 leader->leadership, power->strength 2019-10-04 18:07:42 +09:00
Hide_D 71254e86f4 버그 수정 2019-10-04 16:33:00 +09:00
Hide_D 07328847f4 아이템 속성이 동적으로 변경되어 static 제거 2019-10-04 14:30:45 +09:00
Hide_D 9181cbfee5 lbonus를TriggerGeneralLevel, calcLeadershipBonus로통합 2019-10-04 13:02:16 +09:00
Hide_D 4aef22aac8 stat 관련 데이터 수정 2019-10-04 12:50:48 +09:00
Hide_D 512266abf4 season merge 2019-10-04 11:44:03 +09:00
Hide_D ef64f180a2 season 반영 안된것 마저 추가 2019-10-04 11:39:08 +09:00
Hide_D 9e45800367 94f3906949...06f86c6c27 반영, 시즌 값, 부대정보, 왕조일람 2019-07-20 15:48:30 +09:00
Hide_D f027f7f225 훈련, 사기템 효과 두배 2019-07-20 15:32:01 +09:00
Hide_D 6f7ac86e7f c0a30a2640...ff00990520 까지 반영 2019-07-20 15:29:47 +09:00
Hide_D 93d298ef75 장수 생성 시 본닉 항상 추가. 사망시 본닉 출력 2019-07-20 15:22:51 +09:00
Hide_D 121a892c9a 버그 수정 2019-06-17 03:13:05 +09:00
Hide_D 9222e2bbdd 장비매매버그 수정 2019-06-17 03:11:33 +09:00
Hide_D fe78d82ace 장비매매버그 수정 2019-06-17 03:10:41 +09:00
Hide_D 77e98d9942 커맨드 선택 form 구현 중 2019-06-17 03:08:05 +09:00
Hide_D 2b1efae238 아이템 관련 속성 일부 변경, 유니크 획득 코드를 수정 2019-06-17 02:47:00 +09:00
Hide_D d70740b38c 이동 초기 구현 2019-06-16 21:41:31 +09:00
Hide_D 3ebb30795c 버그 수정, 턴 입력 form 준비 2019-06-16 21:07:08 +09:00
Hide_D 5d42730e9a js, css 출력을 위한 코드 추가 2019-06-16 17:07:43 +09:00
Hide_D 923777899e 도시 목록 임시 구현 2019-06-16 03:47:58 +09:00
Hide_D 05b9187a3b 스1 시나리오 업데이트 2019-06-14 23:56:06 +09:00
Hide_D 1198baba67 버그 수정 2019-06-13 02:43:25 +09:00
Hide_D d4b7cdc97c 아이템 int->string 반영 2019-06-10 02:20:48 +09:00
Hide_D bb7e93ac2d 쌀 거래만 가능하므로 아이템 거래는 삭제 2019-06-09 22:56:51 +09:00
Hide_D 59c0c6cfb8 아이템 코드를 String으로 바꾸었으므로 연동 대상 또한 변경 2019-06-09 22:50:39 +09:00
Hide_D 8699a43a22 버그 수정 2019-06-08 04:56:32 +09:00
Hide_D 5529651f91 TriggerCaller에 약간의 유연성 추가 2019-06-08 03:04:31 +09:00
Hide_D a6f225ae9d 구 코드 수정 2019-06-08 03:03:11 +09:00
Hide_D fceda31c11 전특 구현 완료 2019-06-08 02:56:15 +09:00
Hide_D e5a5281e10 BaseWarUnitTrigger, TriggerCaller 구조 변경, 클래스 반영 2019-06-06 22:32:35 +09:00
Hide_D ede1d89569 회피시도 추가, spl_object_hash를 spl_object_id로 변경 2019-06-06 03:34:47 +09:00
Hide_D 44b9ba96c3 전투 이벤트 갱신 2019-06-05 01:36:57 +09:00
Hide_D 7fd8bfbe4e 전투 스킬 세팅 중 2019-05-31 02:28:08 +09:00
Hide_D 17654633dc 서적 등록 2019-05-15 03:04:34 +09:00
Hide_D 8fd0a54018 명마, 무기 타입 변경 2019-05-15 03:00:00 +09:00
Hide_D efe8a476da 명마 등록 2019-05-15 02:29:21 +09:00
Hide_D ac0f6c6b6c 아이템에 consumable 개념 추가, GameConstBase에 아이템 준비 2019-05-13 03:17:48 +09:00
Hide_D 8c163515db 아이템 전량 구현, 말, 무기, 책 준비 2019-05-13 02:44:01 +09:00
Hide_D 7ce1e64ee8 WarUnitTrigger 개편, 병종 Trigger 개념 추가, 저지, 성벽부상무효 2019-05-13 00:49:44 +09:00
Hide_D b6e667a291 저격 다시 세팅, 아이템 namespace 버그 수정, 전투치료(의술) 구현 2019-05-12 21:03:21 +09:00
Hide_D 5c7522fd1f 가오픈 merge 2019-05-10 01:29:01 +09:00
Hide_D 85e9223603 서버의 오픈 시간을 기록했으므로 변경 2019-05-09 02:00:25 +09:00
Hide_D 943e2be676 커맨드 창에서 가오픈 때문에 턴이 이상하게 보이는 버그 수정 2019-05-09 01:59:06 +09:00
Hide_D 2f09df7521 가오픈 일자 표시 2019-05-09 01:34:06 +09:00
Hide_D 445e445e49 예약턴 초기 릴리즈 2019-05-09 01:28:49 +09:00
Hide_D a3925de127 턴 시간 동작 안내 2019-05-05 20:14:53 +09:00
Hide_D f20e4bd572 동작 시간 베이스로 변경 2019-05-05 20:13:48 +09:00
Hide_D 816c2ac1c4 devel merge 2019-05-05 17:58:27 +09:00
Hide_D e731371ab1 빙의 선택 시 성격과 국가 표기 2019-05-04 20:41:27 +09:00
Hide_D 5559693cb3 entrance 띄어쓰기 장수 전콘 문제 수정 2019-05-04 20:28:41 +09:00
Hide_D ca33c3b259 빙의에 약간의 편의성 추가 2019-05-04 20:09:52 +09:00
Hide_D a78fa98b3d 장수 목록에 pagenation 추가 2019-05-04 20:01:17 +09:00
Hide_D 956dc82555 장수 빙의에 장수 리스트 띄움 2019-05-04 19:46:55 +09:00
Hide_D d30a824481 디버그 코드 제거 2019-05-04 18:37:41 +09:00
Hide_D a643182eee 장수 일람 시간 문제 수정 2019-05-04 18:33:48 +09:00
Hide_D e1dbc46d8d 장수일람 API 생성 2019-05-04 18:33:09 +09:00
Hide_D e33d8776bc 서버 루트 js include 순서 변경 2019-05-04 17:08:36 +09:00
Hide_D f6d16883de 서버 기간 표기 수정 2019-05-04 17:05:48 +09:00
Hide_D 51bdd3bbfd 서버가 열린 경우 서버가 열린 기간을 표기하도록 수정 2019-05-04 17:03:03 +09:00
Hide_D 8f9ae78b8c 서버 리셋 권한자는 서버 시작, 또는 천통시 닫을 수 있음 2019-05-04 16:38:44 +09:00
Hide_D 584b7b8e45 영릉 장사 구지도 복구 2019-05-04 16:18:53 +09:00
Hide_D f74e903f1f 병종 전콘 문제 수정 2019-05-02 01:20:45 +09:00
Hide_D 4cedf112f5 sidebar 다시 제거 2019-05-02 00:53:09 +09:00
Hide_D d607a8da0f chess 맵 테스트로 추가, 전차전 php 코드 버그 수정 2019-05-02 00:50:40 +09:00
Hide_D 84a12e28df 지도 등을 추가할 경우 css, js를 새로 설정하는 기능 추가 2019-05-02 00:50:24 +09:00
Hide_D 54aa47d1a8 충차전 기본 코드 추가 2019-05-01 14:55:42 +09:00
Hide_D faaee4b945 충차전 코드 준비 2019-05-01 14:41:06 +09:00
Hide_D 0b46303f9f 시간이 지날 수록 접경 수도 농상, 성수의 디버프가 생김 2019-05-01 03:08:46 +09:00
Hide_D b98668bc60 부대장 삭턴 계산 방식 일부 변경 2019-05-01 02:57:48 +09:00
Hide_D 947e8e9512 코드 버그 수정 2019-05-01 02:47:27 +09:00
Hide_D 681918cb63 유니크 획득시 골고루 획득하도록 변경 2019-05-01 02:42:23 +09:00
Hide_D d0fae44430 도시 목록에도 전콘을 띄워줌 2019-05-01 02:33:49 +09:00
Hide_D 3e752461e8 스마트폰이더라도 neutralView(도시선택모드)에서는 두번선택 해제 2019-05-01 02:21:06 +09:00
Hide_D 1a9e6f3b1a m장 의병장 초 강화! 2019-05-01 02:06:51 +09:00
Hide_D 580275a8cf 로그인 버그 수정 2019-05-01 01:52:50 +09:00
Hide_D ee74771f16 부대장 이름을 정렬하기에 편리하도록 수정 2019-05-01 01:51:49 +09:00
Hide_D 81fa97d3ee 에러 로그 강화 2019-04-30 23:20:39 +09:00
Hide_D 00a6e9798f 수극을 통한 저격 예시 2019-04-29 02:04:45 +09:00
Hide_D 17a59cbdd5 병종이 행동에 전투에 event로 개입 가능하도록 수정 중 2019-04-29 01:01:47 +09:00
Hide_D d4c9a0a47a processWar 입출력 부근을 General Object로 변경 2019-04-29 00:13:25 +09:00
Hide_D 6423c22cf8 부대 번호를 부대장 ID로 변경 2019-04-28 20:50:25 +09:00
Hide_D e21fbaff83 WarUnit의 일부 요소를 General과 ActionSpecialWar 등으로 분리 2019-04-28 05:43:59 +09:00
Hide_D 99e6a2676b 버그 수정, 구조 변경 2019-04-28 03:49:03 +09:00
Hide_D ab47f40ee1 버그 수정 2019-04-28 02:54:01 +09:00
Hide_D a7f000e51e 버그 수정 2019-04-28 02:17:20 +09:00
Hide_D 0d9eabcaa0 버그 수정 2019-04-28 01:54:44 +09:00
Hide_D b1c63d7f5e 일부 수정. 버그 수정. 2019-04-28 00:18:36 +09:00
Hide_D 820c72820d 버그 수정 2019-04-24 02:47:50 +09:00
Hide_D 300065504b 버그 수정 2019-04-24 02:36:50 +09:00
Hide_D 8aa846b349 버그 수정 2019-04-24 01:17:21 +09:00
Hide_D ae8b94b2d7 redirect 변경 2019-04-23 12:03:36 +09:00
Hide_D 7670d55f3c 갱신 되돌림.. 2019-04-23 11:05:09 +09:00
Hide_D 528ab4e203 갱신방식 변경 2019-04-23 11:01:42 +09:00
Hide_D cf1dc90137 갱신 버튼 변경 2019-04-23 10:59:03 +09:00
Hide_D dd81dcc9c6 버그 수정 2019-04-21 22:29:08 +09:00
Hide_D a31c949734 db schema에 not null. 2019-04-21 22:17:23 +09:00
Hide_D 3536d5c413 err_log 강화 2019-04-21 22:15:41 +09:00
Hide_D 0e50216cee 버그 수정 2019-04-21 21:15:53 +09:00
Hide_D 16fed754a9 버그 수정 2019-04-21 16:57:05 +09:00
Hide_D c7748934b8 버그 수정 2019-04-21 16:27:57 +09:00
Hide_D d46b3154cc 버그 수정 2019-04-21 16:06:27 +09:00
Hide_D f8bcfba90e 버그 수정 2019-04-21 15:41:02 +09:00
Hide_D 45a4ca5298 부대장 숫자를 '능동적'으로 재 계산 2019-04-21 15:32:36 +09:00
Hide_D 88e3a9852b 버그 수정 2019-04-21 12:52:57 +09:00
Hide_D cf1f023379 버그 수정 2019-04-21 12:11:01 +09:00
Hide_D b4b6f5a1f7 버그 수정 2019-04-21 11:43:23 +09:00
Hide_D a21eef6e84 버그 수정 2019-04-21 04:53:14 +09:00
Hide_D 3beca8bba5 TimeUtil 버그 수정 2019-04-21 03:31:23 +09:00
Hide_D b5d66dba8a 버그 수정 2019-04-21 03:05:53 +09:00
Hide_D 24d01a2156 버그 수정 2019-04-21 03:04:08 +09:00
Hide_D 45d848cbb9 버그 수정 2019-04-21 02:55:32 +09:00
Hide_D e2f649dd35 버그 수정 2019-04-21 02:53:27 +09:00
Hide_D 183bffbc0e devel 반영 2019-04-21 02:42:43 +09:00
Hide_D a874415859 count를 써야할 자리에 MYDB_num_rows를 쓰는 코드 수정, 일부 정리 2019-04-21 02:34:22 +09:00
Hide_D 93b33ba383 천통시 최소 명전 등록 가능 연도를 GameConst로 2019-04-21 02:30:12 +09:00
Hide_D 26420719f3 $connect 쓰는 부분 일부 제거 2019-04-21 01:54:22 +09:00
Hide_D dc6a35d656 에러 반환 타입 수정 2019-04-21 01:47:01 +09:00
Hide_D 51da0bd7b7 버그 수정 2019-04-21 01:38:17 +09:00
Hide_D 1afb2c6883 오타 수정 2019-04-20 02:54:24 +09:00
Hide_D f78fcc2b71 여백 주기 2019-04-11 19:53:27 +09:00
Hide_D fb2d30f2c9 서버별 아이콘 적용 가능 2019-04-11 19:50:59 +09:00
Hide_D 8781e7c6ad tooltip 처리 방식을 지연 처리로 변경 2019-04-10 23:27:53 +09:00
Hide_D c34317b1e5 년, 월로 넘치더라도 그냥 자름 2019-04-08 01:56:57 +09:00
Hide_D b09730b422 스타크래프트 1 프로게이대전 추가 2019-04-08 01:51:38 +09:00
Hide_D 0f1725a7ab 인탐 조건에서 방랑군은 다시 불가능하게. 2019-04-08 01:45:05 +09:00
Hide_D b12e0358d6 방랑군이거나, 국가의 인구가 다 차더라도 인구 탐색 가능 2019-04-08 01:43:01 +09:00
Hide_D 7ef841746a 장수수 > 10, 집합장 제외 장수수 < 10일 때, 기술이 과도하게 오르는버그 수정 2019-04-08 01:33:49 +09:00
Hide_D 2b52b2379e 새 숙련도 공식 반영, 제곱식 기반에서 세제곱식 기반으로 2019-04-08 01:21:06 +09:00
Hide_D 8dd5965c44 진유저무쌍 릴리즈 2019-04-07 23:55:44 +09:00
Hide_D bc59521cc8 Merge commit 'f6eae2274f6d56403c0644829042ce4d72b80ec9' into ng_turn 2019-04-07 23:45:17 +09:00
Hide_D 815822ef40 v0.10.1까지 merge 마저 반영 2019-04-07 23:36:09 +09:00
Hide_D 9e6d33cc1a v0.10.1까지 merge 2019-04-07 23:35:54 +09:00
Hide_D 44df85f2bd [881bf08aee]v.0.10.0 커밋까지 반영 2019-04-07 23:23:46 +09:00
Hide_D 2c15c7087e devel 코드 merge 2019-04-07 22:58:44 +09:00
Hide_D 6b281628ed [f8bb7aaf30]ng_diplomacy 적용 2019-04-07 22:52:50 +09:00
Hide_D 9f74db0aff Merge commit 'b6f76562e2c6999af16502d802bd523a8484e167' into ng_turn 2019-04-07 22:44:43 +09:00
Hide_D 83ea5c7fa3 중첩된 내용 merge 2019-04-07 22:42:39 +09:00
Hide_D bf6fe3482b 이전 외교 메시지를 불러 올 수 있음 2019-04-07 22:31:08 +09:00
Hide_D f4d6803720 외교권자에게는 메시지를 보낼 수 없음 2019-04-07 22:30:00 +09:00
Hide_D 23c2a16286 1차 버그 수정 2019-04-07 22:29:46 +09:00
Hide_D afc301fad2 DB 스키마 변경 2019-04-07 22:29:29 +09:00
Hide_D 1c0a50e48f 중간반영 2019-04-07 22:28:57 +09:00
Hide_D 02e119d0da 외교부 틀 작성 2019-04-07 22:27:49 +09:00
Hide_D 06fcc383ce 국메 처리 방식을 변경. 국가간 메시지는 외교권자만 가능 2019-04-07 22:27:14 +09:00
Hide_D 408b1f76e4 외교메시지 수신 기준 변경중 2019-04-07 22:26:50 +09:00
Hide_D 3a879a37e2 [5f0258022a]기존 회의실, 기밀실 코드 삭제 2019-04-07 22:20:25 +09:00
Hide_D 9e1bb50d78 외교서신 응답 2019-04-07 22:17:46 +09:00
Hide_D 25dcf426b1 파일 명을 namespace를 고려하여 수정 2019-04-07 22:17:33 +09:00
Hide_D 7b7baaea62 외교 서신 추가 기능 2019-04-07 22:17:13 +09:00
Hide_D 36d83804d0 게시물 코드 2019-04-07 22:16:43 +09:00
Hide_D 7c46d2e27f 게시판 글, 댓글 작성 초안 2019-04-07 22:16:19 +09:00
Hide_D d4acad33ea [b422cac734]권한 세팅 2019-04-07 22:15:53 +09:00
Hide_D 91cc1159bc 왕 무장 관직 순서 변경 2019-04-07 22:08:19 +09:00
Hide_D 21b7068c90 무관 최종 관직을 실제 삼국지 관직 순서에 맞게 변경 2019-04-07 22:05:33 +09:00
Hide_D 682d2bf922 [8d6c4ed713]시중->종사 2019-04-07 21:34:36 +09:00
Hide_D 3ff6788405 [1ddce7ac2e]게시물 구조 설정 2019-04-07 21:33:09 +09:00
Hide_D e59a8606ab tui-editor와 새 게시판 준비 2019-04-07 21:31:28 +09:00
Hide_D 157285ddb6 permission, penalty 대응 준비 2019-04-07 21:31:03 +09:00
Hide_D f49c3e0ff7 [18d11b2c6a]장수 schema 수정 2019-04-07 21:30:24 +09:00
Hide_D 345877b9fd [00bbf4eae2]버튼 이동 코드 정리 2019-04-07 21:28:45 +09:00
Hide_D 37e4105585 [3cf9d39cf2]DB 스키마 정리, diplomacy 테이블 정리, 코드 정리 2019-04-07 21:27:08 +09:00
Hide_D 4a05b59b4b 병합 충돌 오타 수정 2019-04-07 21:12:20 +09:00
Hide_D 57322d75d7 [8ee2def02a]국법 기능 제거. 외교부를 위한 자리 추가 2019-04-07 21:11:46 +09:00
Hide_D 4ccc2c1f71 DB 스키마 준비 2019-04-07 21:08:38 +09:00
Hide_D 652b32619d [51e9de0e79]DB 스키마 준비 2019-04-07 21:08:28 +09:00
Hide_D 57b3611965 걸그룹 전콘 문제 일부 수정 2019-04-07 21:06:47 +09:00
Hide_D afbf9e619a 걸그룹 대전 0.5 반영 2019-04-07 21:06:23 +09:00
Hide_D 060b1da388 [ca6e97be65]지급율 -> 지급률 2019-04-07 21:04:08 +09:00
Hide_D 38024b6be4 외교 메시지는 삭제 할 수 없도록 2019-04-07 21:03:01 +09:00
Hide_D 6aede6e48b 국메 삭제 가능 2019-04-07 21:02:45 +09:00
Hide_D b27adfbe27 디버그 코드 제거 2019-04-07 21:02:18 +09:00
Hide_D b28e3b2a00 메시지 삭제 기능 추가 2019-04-07 21:01:38 +09:00
Hide_D ffe4374519 메시지 타이밍 정책 일부 수정 2019-04-07 21:01:17 +09:00
Hide_D 793df087ae 페이지당 갱신 시간을 10초에서 5초로 변경 2019-04-07 20:58:19 +09:00
Hide_D 85eadd5856 메시지를 띄울 때 flex 적용 2019-04-07 20:57:48 +09:00
Hide_D 359efe0036 로그아웃 되었을 경우 무한히 호출하는 버그 수정 2019-04-07 20:56:56 +09:00
Hide_D 3186691b7b 이전 메시지 가져오기 기능 추가 2019-04-07 20:56:19 +09:00
Hide_D 044c795f38 부상으로 인한 전투 우선순위 감소를 완화 2019-04-07 20:55:31 +09:00
Hide_D f7128449ca 등갑, 맹수 너프 2019-04-07 20:54:27 +09:00
Hide_D 3d0c5165b7 자객병의 기동을 8로 상향 2019-04-07 20:54:00 +09:00
Hide_D fc6cda86df selector에 검은색 추가 2019-04-07 20:53:35 +09:00
Hide_D 59877e181e 도시 목록에 select2를 시험 적용 2019-04-07 20:52:41 +09:00
Hide_D 506b1a17d1 암행부의 장수수에서 '부대장'이 제외됩니다. 2019-04-07 20:42:15 +09:00
Hide_D 214c2ba0ad 임관턴이 어찌저찌 어거지로 동작하던 버그 수정 2019-04-07 20:40:30 +09:00
Hide_D 387312bc87 랜덤임관 인자 버그 수정 2019-04-07 20:36:49 +09:00
Hide_D 3d3da04e58 [4103831401,+]부대장은 기술연구, 전투시 기술,전략턴에 영향을 주지 않도록 변경 2019-04-07 20:33:47 +09:00
Hide_D 7ec0cbb43c 통합, 합병시 부대장까지 같이 포함되는 문제 수정 2019-04-07 19:58:38 +09:00
Hide_D 1cd834579c select2 설치 2019-04-07 19:56:52 +09:00
Hide_D a11005c14b [eaa9e6d840]불필요한 가로바 길이 줄임 2019-04-07 19:55:54 +09:00
Hide_D ea1480e286 [e5da1905c6]추방시 명성 안깎이는 버그 수정 2019-04-07 19:53:30 +09:00
Hide_D f1dd328c38 [864b94f62a]반계 상향 2019-04-07 19:51:19 +09:00
Hide_D 44295de206 [cac19cad4d]수비 우선 순위를 부상여부, 수뇌여부, 훈사 여부를 반영하도록 변경 2019-04-07 19:48:51 +09:00
Hide_D b273082492 세력 장수 쿼리 버그 수정 2019-04-07 17:15:16 +09:00
Hide_D da088d88ba 세력장수 본닉 2019-04-06 14:46:07 +09:00
Hide_D fd13570074 천통시 장수 일람 2019-04-06 14:25:12 +09:00
Hide_D b5630a9dae 오타(?) 수정 2019-03-26 15:47:17 +09:00
Hide_D 0e2cab6409 명전 재 갱신 코드 추가 2019-03-26 15:44:04 +09:00
Hide_D 38dc587318 명전 등록시 문자 문제 수정 2019-03-26 15:36:38 +09:00
Hide_D 6fbddcb7c2 cache control 수정 2019-03-22 09:30:24 +09:00
Hide_D df1df2964d session_cache_limiter 삭제. no-cache가 기본값임 2019-03-22 09:26:52 +09:00
Hide_D 9b9c2546c8 확률 추가 수정 2019-03-15 15:15:00 +09:00
Hide_D 6ce0e72b33 인탐 확률 핫픽스 2019-03-15 15:00:12 +09:00
Hide_D a7784d7870 지연 threshold 증가 2019-03-10 17:20:44 +09:00
Hide_D 306ca3e04f 점령 시 도시 관직 초기화. 코드 정리 2019-03-10 17:19:35 +09:00
Hide_D 82988b0e08 장사-영릉이 이어진걸로 나오는 일반지도 버그 수정 2019-03-10 14:19:29 +09:00
Hide_D 8b27d0e249 불가침 서신 거부 불가능한 버그 수정 2019-03-10 00:47:13 +09:00
Hide_D bfae547240 은퇴 연령 값을 GameConst로 이동 2019-03-09 17:08:11 +09:00
Hide_D 0abd026f78 인탐, 의병에서 발생할 수 있는 숙련 예외 케이스 제거 2019-03-09 16:50:31 +09:00
Hide_D 3362a76de7 값 실수 수정 2019-03-09 16:41:41 +09:00
Hide_D 355b6c2e7d 인탐 확률 추가 수정 2019-03-09 16:23:47 +09:00
Hide_D 4e3c643e43 시나리오 최대 장수값 조절 2019-03-09 13:45:29 +09:00
Hide_D 760cb97db4 인탐 가속 조건 강화 2019-03-09 06:12:26 +09:00
Hide_D 0be6f7f57e 오타 수정 2019-03-09 03:43:15 +09:00
Hide_D d31223fa0c 커맨드 attr 수정 2019-03-09 02:30:12 +09:00
Hide_D 86ee9befc1 커맨드 버그 수정? 2019-03-09 02:26:50 +09:00
Hide_D d5689b061f 의병 고용으로는 무지장이 안나옴 2019-03-09 01:59:41 +09:00
Hide_D a3c4da4455 의병고용 버그 수정 2019-03-09 01:57:51 +09:00
Hide_D ee9f97f917 m장 합산 능력치 버그 수정 2019-03-09 01:05:47 +09:00
Hide_D 270c7377de 사령턴 실행후 재 로드시 수비 켬끔 리셋 관련 버그 수정 2019-03-09 00:59:16 +09:00
Hide_D 9044b57306 영입 금지시에는 인탐 확률 보정 없음 2019-03-09 00:41:38 +09:00
Hide_D 9ad815a44a Revert "커밋 취소"
This reverts commit 0843da7a7c.
2019-03-09 00:40:16 +09:00
Hide_D b7e432228b 커밋 취소 2019-03-09 00:39:13 +09:00
Hide_D 78da30f2ad m장이 아주 적을땐 잘 뽑히도록 2019-03-09 00:33:14 +09:00
Hide_D aeea53017f 인탐 장수 비율 4:4:2로 변경. 인탐장 숙련도 평준화. 인탐 확률 상승. 발견 추가. 2019-03-09 00:15:51 +09:00
Hide_D f21ebfc366 관리자 턴 당김 버그 수정 2019-03-09 00:00:00 +09:00
Hide_D 2549aa5809 의병, 인탐장도 적은 비중으로 장수 카운트에 추가 2019-03-08 22:20:45 +09:00
Hide_D b733b70ad8 황제가 있을 경우 황제. 없으면 이전 천통 군주의 명으로 토너먼트 개최 2019-03-06 01:44:24 +09:00
Hide_D f9f59bd7c2 토너먼트 변경이 변경 횟수를 깎지 않음. 수비 끔 시 훈사 3 감소 2019-03-06 01:09:34 +09:00
Hide_D 58933a6bcd 인자 버그 수정 2019-03-06 00:40:56 +09:00
Hide_D 45d7a29a95 수비 순서에 훈사 영향을 더 강하게 주도록 변경 2019-03-06 00:38:35 +09:00
Hide_D e9d1fdb4ee 두번 탭 해 도시 이동 기능 재 부활, 옵션 설정 가능 2019-03-05 23:06:34 +09:00
Hide_D 2785ca9f31 천통 시에는 계략 명장이 보임 2019-03-05 02:32:42 +09:00
Hide_D 12912a62aa 아이템에 장수명을 띄우는것은 비합리적으로 보임 2019-03-05 02:29:10 +09:00
Hide_D 2c2b078514 명장일람에서 계략 시도 장수 본닉이 뜨는 문제 수정 2019-03-05 02:27:22 +09:00
Hide_D 110294103f 천통 후에는 명장 일람에 장수 본닉이 뜨도록 2019-03-05 02:23:28 +09:00
Hide_D a9f3b839ec 명전에서 장수의 본닉이 뜨도록 2019-03-05 02:11:52 +09:00
Hide_D 6bd677ad6f 은퇴 후 명전 등록 시 '이전 값보다 높아진 경우'에만 경신하도록 수정 2019-03-05 01:45:03 +09:00
Hide_D 7d1c5f3510 집합장이 군주인 경우 아무에게나 선양 2019-03-05 01:20:27 +09:00
Hide_D a49508fd20 외교권자 등에서 인사부 연동이 안되는 버그 해결 2019-02-27 23:33:18 +09:00
Hide_D 5870213ff0 권한 관련 버그 수정 2019-02-27 23:23:53 +09:00
Hide_D 65c3d7f925 선양 버그 수정 2019-02-25 21:27:17 +09:00
Hide_D 33f4fd8fee 외교권자 버그 수정 2019-02-25 21:25:29 +09:00
Hide_D 9bdc34dc42 버그 수정 2019-02-24 19:41:00 +09:00
Hide_D ff654df997 본인 국가 아닌 곳에 임명 가능한 버그 수정 2019-02-24 01:12:59 +09:00
Hide_D b7758da2f3 회의실 기밀실 '타이틀'이 거꾸로 표기되는 버그 수정 2019-02-24 00:56:25 +09:00
Hide_D 747089f1a8 게시판 위아래 가운데 정렬.. 2019-02-24 00:55:13 +09:00
Hide_D 9ee3021b76 NPC 군주는 유저장 수뇌에게 외교권자 권한 부여 2019-02-24 00:52:42 +09:00
Hide_D 0c60ea66e3 자국 내 외교권자에게는 메시지 보낼 수 있도록 수정 2019-02-24 00:42:34 +09:00
Hide_D c3bb312b5f 선양시 외교권자 지정 코드 수정 2019-02-24 00:37:01 +09:00
Hide_D 7447a42d40 외교 서신 수락시, 국메, 외교 둘다 뜨도록 수정 2019-02-24 00:32:22 +09:00
Hide_D 3e9cc367af 게시판 이름 ㅇ 2019-02-24 00:23:45 +09:00
Hide_D 4c1790014f 메시지 변경 2019-02-20 01:40:56 +09:00
Hide_D 03fc7a579a 비재야망명 버그 수정 2019-02-17 23:57:26 +09:00
Hide_D a53db257cf 외교부 버그 수정 2019-02-14 21:28:15 +09:00
Hide_D b093cab493 한칸 띄움 2019-02-03 02:18:07 +09:00
Hide_D 9b484dc819 간이 툴바 생성 2019-02-03 01:54:58 +09:00
Hide_D 5ab26a9f8c 메시지 자동 링크 2019-02-03 00:28:29 +09:00
Hide_D b800a63bd2 고대무장 신대륙국가 추가 2019-01-31 02:24:18 +09:00
Hide_D 43a5e47fb3 애니집결 5차 반영 2019-01-31 02:14:10 +09:00
Hide_D 319545106e 외교부 버튼 조건 변경 2019-01-30 02:54:38 +09:00
Hide_D 39b261b8a0 버그 수정 2019-01-30 00:04:33 +09:00
Hide_D c9e61d1098 버그 수정 2019-01-30 00:03:36 +09:00
Hide_D 0bffdaa5fc 외교 메시지 과거 권한 문제 수정 2019-01-30 00:02:28 +09:00
Hide_D 9228510834 댓글 입력도 투명하게 2019-01-29 23:46:47 +09:00
Hide_D 0b002a8946 댓글 엔터시 입력 2019-01-29 23:43:37 +09:00
Hide_D ad43ddabe6 Merge branch 'ng_diplomacy' of ssh://storage.hided.net:2525/devsam/core into ng_diplomacy 2019-01-29 23:40:35 +09:00
Hide_D 24c022a329 회의실 기밀실 템플릿 2019-01-29 23:40:28 +09:00
Hide_D 0e48cee0d6 하야 임관시 권한 초기화 2019-01-29 17:12:04 +09:00
Hide_D 4ad1794d95 버그 수정 2019-01-29 02:57:24 +09:00
Hide_D 46cf25b585 승인시 이전 내용 중첩 2019-01-29 02:53:39 +09:00
Hide_D b3d78fc30f 파기 요청 추가 2019-01-29 02:48:41 +09:00
Hide_D 556bc06da4 시중->종사, 감찰부 권한 정리 2019-01-28 20:33:44 +09:00
Hide_D 7e8f9c463b 공개, 비밀 문구 변경 2019-01-26 06:58:12 +09:00
Hide_D 568c7779b6 템플릿 미완 부분 수정 2019-01-26 06:56:19 +09:00
Hide_D 0a0d237f4d 대체된 메시지 보기 가능 2019-01-26 06:44:34 +09:00
Hide_D c243ccbdce 틀 일부 수정 2019-01-26 06:36:48 +09:00
Hide_D 64b79d6af5 외교부 추가 2019-01-26 06:30:29 +09:00
Hide_D 016c0f3743 외교 메시지 필터링에 invalid 옵션 추가 2019-01-26 04:03:15 +09:00
Hide_D fd1599e0a7 외교 메시지 전송시 알림 2019-01-26 03:50:08 +09:00
Hide_D 7408aa6b72 조언자 인원수로 보여줌 2019-01-26 03:40:01 +09:00
Hide_D e6b2107fa9 외교부 틀 작성중. 재야의 외교 메시지는 항상 보이도록 2019-01-26 03:31:04 +09:00
Hide_D 9aff52eaad 권한 문제 수정 2019-01-25 23:29:35 +09:00
Hide_D bf5bda0f85 내무부 권한 수정 2019-01-25 22:35:49 +09:00
Hide_D ffbf2d0a93 국적 변경시 permission 초기화 2019-01-25 20:30:02 +09:00
Hide_D 82f59ef5a2 게시물 순서 변경 2019-01-25 20:17:36 +09:00
Hide_D c2c40abbb4 외교권자 기밀실 버튼 활성화 2019-01-25 19:49:29 +09:00
Hide_D bb54d732d0 수락 불가능한 문제 해결 2019-01-25 19:46:32 +09:00
Hide_D eee4e0c676 없는것보단 나은 회의실 css 2019-01-25 19:40:13 +09:00
Hide_D d9457ae017 내무부 비고란 제거 2019-01-25 19:34:36 +09:00
Hide_D bbc0b18b19 외교 메시지 삭제 조건 완화 2019-01-25 19:32:13 +09:00
Hide_D da7651311e 메시지 삭제가 안되던 버그 수정 2019-01-25 19:30:33 +09:00
Hide_D 72846f0817 인사부 수정 2019-01-25 19:22:30 +09:00
Hide_D 05ef3387ab 외교권자 임명 대기중 2019-01-25 03:16:34 +09:00
Hide_D eed44e5737 외교권자 목록 출력 2019-01-25 02:18:20 +09:00
Hide_D 27c7a85a21 게시판 기능만 동작 2019-01-25 02:11:54 +09:00
Hide_D 4f6dd046ec 게시판이 '동작만 함' 2019-01-25 01:51:26 +09:00
Hide_D 89fad9ada7 이전 외교 메시지를 불러 올 수 있음 2019-01-25 01:39:45 +09:00
Hide_D bc31b49b99 외교권자에게는 메시지를 보낼 수 없음 2019-01-25 01:28:06 +09:00
Hide_D 09444e3624 1차 버그 수정 2019-01-25 01:02:13 +09:00
Hide_D 7586243a95 DB 스키마 변경 2019-01-25 00:13:04 +09:00
Hide_D 1e1c7801e1 중간반영 2019-01-24 03:34:03 +09:00
Hide_D a363f6ef5f 외교부 틀 작성 2019-01-23 03:11:07 +09:00
Hide_D 334e1fd2da 국메 처리 방식을 변경. 국가간 메시지는 외교권자만 가능 2019-01-23 02:36:03 +09:00
Hide_D 2e8e29e93c 외교메시지 수신 기준 변경중 2019-01-23 01:37:40 +09:00
Hide_D 5e5a1a3668 기존 회의실, 기밀실 코드 삭제 2019-01-22 03:17:44 +09:00
Hide_D b93b464ebf 외교서신 응답 2019-01-22 02:47:27 +09:00
Hide_D 842ba46a95 파일 명을 namespace를 고려하여 수정 2019-01-21 02:25:54 +09:00
Hide_D 03b27d8e8f 외교 서신 추가 기능 2019-01-21 02:23:23 +09:00
Hide_D c11b41c6ba 게시물 코드 2019-01-21 02:00:48 +09:00
Hide_D 018cc526ee 게시판 글, 댓글 작성 초안 2019-01-21 01:45:32 +09:00
Hide_D edf4508e6b 권한 세팅 2019-01-18 03:01:02 +09:00
Hide_D d26a1f0312 왕 무장 관직 순서 변경 2019-01-17 23:01:05 +09:00
Hide_D 2984f6a453 무관 최종 관직을 실제 삼국지 관직 순서에 맞게 변경 2019-01-17 22:59:54 +09:00
Hide_D a00058d959 시중->종사 2019-01-17 22:44:18 +09:00
Hide_D 8e56a457f1 게시물 구조 설정 2019-01-17 03:12:26 +09:00
Hide_D 74d5f021cd tui-editor와 새 게시판 준비 2019-01-17 02:54:58 +09:00
Hide_D a37715315d permission, penalty 대응 준비 2019-01-16 02:47:48 +09:00
Hide_D d9c9977610 장수 schema 수정 2019-01-16 02:26:28 +09:00
Hide_D c2f0cbb10a 버튼 이동 코드 정리 2019-01-16 02:18:42 +09:00
Hide_D a34d00d822 DB 스키마 정리, diplomacy 테이블 정리, 코드 정리 2019-01-16 01:59:07 +09:00
Hide_D 9924ec6963 국법 기능 제거. 외교부를 위한 자리 추가 2019-01-12 18:53:01 +09:00
Hide_D 9036201887 DB 스키마 준비 2019-01-12 07:21:34 +09:00
Hide_D b2435d2430 걸그룹 전콘 문제 일부 수정 2018-12-08 20:55:48 +09:00
Hide_D afd6148770 걸그룹 대전 0.5 반영 2018-12-02 22:28:10 +09:00
Hide_D b70b58a35a 지급율 -> 지급률 2018-12-01 23:37:40 +09:00
Hide_D df963c2780 외교 메시지는 삭제 할 수 없도록 2018-12-01 18:36:43 +09:00
Hide_D 1b732c76e6 국메 삭제 가능 2018-11-30 21:49:19 +09:00
Hide_D f9489b0173 디버그 코드 제거 2018-11-30 21:44:59 +09:00
Hide_D 18942c55ae 메시지 삭제 기능 추가 2018-11-30 21:29:31 +09:00
Hide_D bf34b2f1ca 메시지 타이밍 정책 일부 수정 2018-11-30 19:03:26 +09:00
Hide_D a717a021c2 페이지당 갱신 시간을 10초에서 5초로 변경 2018-11-30 02:05:33 +09:00
Hide_D dcf718d592 메시지를 띄울 때 flex 적용 2018-11-30 01:51:24 +09:00
Hide_D f5eeb2b839 로그아웃 되었을 경우 무한히 호출하는 버그 수정 2018-11-30 01:24:45 +09:00
Hide_D bc435adc11 이전 메시지 가져오기 기능 추가 2018-11-30 01:18:07 +09:00
Hide_D aeb8e82cbd 부상으로 인한 전투 우선순위 감소를 완화 2018-11-28 23:43:42 +09:00
Hide_D 5cb2ed3ccd 등갑, 맹수 너프 2018-11-28 01:24:29 +09:00
Hide_D 93b1864d1b 자객병의 기동을 8로 상향 2018-11-28 01:20:32 +09:00
Hide_D a6efffda45 selector에 검은색 추가 2018-11-28 01:14:43 +09:00
Hide_D c89d6f1a58 도시 목록에 select2를 시험 적용 2018-11-28 01:02:56 +09:00
Hide_D d4f16abfac 암행부의 장수수에서 '부대장'이 제외됩니다. 2018-11-28 00:29:53 +09:00
Hide_D 8529f3f355 임관턴이 어찌저찌 어거지로 동작하던 버그 수정 2018-11-28 00:26:29 +09:00
Hide_D 2eb136827d 랜덤 임관을 더 고르게 합니다. 2018-11-28 00:18:09 +09:00
Hide_D 9594e6eb32 부대장은 기술연구, 전투시 기술 상승에 영향을 주지 않도록 변경 2018-11-28 00:16:34 +09:00
Hide_D 9e8111994a 통합, 합병시 부대장까지 같이 포함되는 문제 수정 2018-11-28 00:14:36 +09:00
Hide_D af0c2b7129 select2 설치 2018-11-27 23:52:12 +09:00
Hide_D 96b73a0cef 도시 목록 등 불필요한 가로바 길이 줄임 2018-11-26 22:29:11 +09:00
Hide_D 6c290ee2d3 추방시 명성 안깎이는 버그 수정, 첫 하야시 패널티 없음 2018-11-26 18:12:21 +09:00
Hide_D ca53e3de3a 반계 상향 2018-11-26 18:08:57 +09:00
Hide_D 6ea3ec700a 수비 우선 순위를 부상여부, 수뇌여부, 훈사 여부를 반영하도록 변경 2018-11-26 15:17:51 +09:00
Hide_D fe3355e08e gitignore 변경 2018-11-26 15:08:33 +09:00
Hide_D 42f08f5027 첫 화면 띄우기 성공 2018-11-26 04:05:34 +09:00
Hide_D 7a1c8882e6 general_turn, nation_turn 대응 2018-11-26 01:32:42 +09:00
Hide_D 2c193e7e48 버그 1차 수정 2018-11-26 00:03:11 +09:00
Hide_D 9714c1c9f6 git ignore 변경, 소소한 버그 수정 2018-11-25 21:01:39 +09:00
Hide_D c8f72b5f14 j_set_general_command, j_set_nation_command 구현 2018-11-25 20:35:29 +09:00
Hide_D be0439f771 이전 디렉토리를 이동하도록 변경 2018-11-25 00:58:17 +09:00
Hide_D 43da95b4a5 디버그 코드 제거 2018-11-25 00:51:59 +09:00
Hide_D 3d93a63caa php의 rename을 OS의 mv로 변경 2018-11-25 00:50:41 +09:00
Hide_D 9550607da3 디버그 모드 2018-11-25 00:39:49 +09:00
Hide_D d5d9798913 rename 재수정 2018-11-25 00:37:24 +09:00
Hide_D 6cfe08235f base을 filename으로 수정 시도 2018-11-25 00:35:11 +09:00
Hide_D 49eb850ff1 파일명 에러 수정 2018-11-25 00:29:26 +09:00
Hide_D 5a558583d2 폴더명 실수.. 2018-11-24 23:46:04 +09:00
Hide_D 1e5f0d0555 이전 디렉토리를 이동하도록 변경 2018-11-24 23:44:33 +09:00
Hide_D e2b0b03c96 button에 type="button" 지정 2018-11-24 22:38:09 +09:00
Hide_D b9fb9f1b34 사령턴 반환값 수정 2018-11-24 22:29:50 +09:00
Hide_D 52fd932fd8 사령부 UI 간결화, (구현은 아직), 일부 변수명 변경 2018-11-24 22:22:27 +09:00
Hide_D b0cc200df7 data-reqArg 추가 2018-11-23 03:13:03 +09:00
Hide_D 05b32db37d 커맨드 출력 준비 2018-11-23 03:12:08 +09:00
Hide_D 41f7192532 기본 커맨드 지정 2018-11-23 02:23:19 +09:00
Hide_D fa420303dc $reqArg 지정 2018-11-23 02:07:44 +09:00
Hide_D b7fd539755 불가침 제의 구현 2018-11-22 02:48:42 +09:00
Hide_D cfb8b03446 diplomacy_ticket 테이블 추가 2018-11-22 02:26:07 +09:00
Hide_D 712601041d 구 불가침 코드 삭제 2018-11-22 02:15:24 +09:00
Hide_D 36093eccaf 선전포고 추가, DisallowDiplomacyStatus 구현 변경 2018-11-22 02:13:23 +09:00
Hide_D 58eb6d4210 sabotagelimit을 strategic_cmd_limit로 변경 2018-11-18 03:57:22 +09:00
Hide_D 2166429cbf 발령 구현 2018-11-18 03:57:09 +09:00
Hide_D 236ab10b11 단련 버그 수정 2018-11-17 21:17:39 +09:00
Hide_D 99142fdde3 몰수, 포상 구현, 증여 헌납 버그 수정 2018-11-17 15:40:34 +09:00
Hide_D ca6755d8b5 func_process_chief 백업 2018-11-17 02:17:09 +09:00
Hide_D 92ad333863 선동, 탈취, 파괴 구현 2018-11-17 01:57:21 +09:00
Hide_D 4c48272b4c 화계 구현 2018-11-17 01:44:54 +09:00
Hide_D ab5bd1db69 item의 static 변경 2018-11-17 01:33:17 +09:00
Hide_D 5d1cd10f5d sabotage 백업 2018-11-17 00:24:36 +09:00
Hide_D ef784be082 func_process_personnel.php 삭제 2018-11-17 00:24:12 +09:00
Hide_D 855c41a0e9 방랑 구현 2018-11-17 00:22:53 +09:00
Hide_D 6ef9667f72 Constraint 수정 2018-11-16 23:35:43 +09:00
Hide_D 068d384e7a 모반 구현 2018-11-15 03:42:55 +09:00
Hide_D c3699a8595 ConstraintHelper 추가 2018-11-15 03:33:44 +09:00
Hide_D 2cb7513355 국방 표기 방식 변경 2018-11-15 01:23:32 +09:00
Hide_D c58caeda4c 국방 표기 방식 변경 2018-11-13 19:55:40 +09:00
Hide_D 26fc56f2b8 extractMissingPostToGlobals(); 제거 2018-11-13 02:11:00 +09:00
Hide_D c44ae2f00c extractMissingPostToGlobals(); 제거 2018-11-13 02:10:17 +09:00
Hide_D a00b62ffcc 글 넘치는 것 해결 2018-11-11 23:52:54 +09:00
Hide_D 6a9e7aa89d msg overflow 적용 2018-11-11 23:32:19 +09:00
Hide_D 6206b38a78 해산 수정 2018-11-11 23:30:39 +09:00
Hide_D 1767bfa70d nextRuler 재구현 2018-11-11 21:29:06 +09:00
Hide_D b1d6611923 해산 구현 2018-11-11 20:46:12 +09:00
Hide_D a6a713f40e 랜임 코드 수정 2018-11-11 20:28:05 +09:00
Hide_D e76ad04207 선형 랜덤에서 값이 음수가 들어가는 경우 보정 2018-11-11 19:53:49 +09:00
Hide_D a231adbfdd 랜덤 임관시 제곱근에서 선형으로 변경 2018-11-11 19:44:14 +09:00
Hide_D 88f97ecb4e defulatGold, defaultRice 개념 지정 2018-11-11 19:38:43 +09:00
Hide_D 68a471b859 선양 추가 2018-11-09 00:14:26 +09:00
Hide_D 9393324e1f 인증 토큰 '초기화' 문구를 '연장'으로 변경 2018-11-08 16:01:01 +09:00
Hide_D 944931f7d1 거병 추가 2018-11-06 02:50:25 +09:00
Hide_D 5a56be8a75 하야 메시지 출력 수정 2018-11-06 01:34:40 +09:00
Hide_D fe7aebae05 건국 구현 2018-10-31 02:39:40 +09:00
Hide_D b6c3b0cdc3 방랑군이 아니어도 건국 가능한 버그 수정 2018-10-29 03:15:45 +09:00
Hide_D fd734fadbc 건국 조건 설정 2018-10-29 03:14:03 +09:00
Hide_D a3dc250698 글자 너비를 반각 18자까지 확장 2018-10-29 02:39:23 +09:00
Hide_D 3f2d36284f 랜임 코드 마저 반영 2018-10-28 03:35:32 +09:00
Hide_D 60d5184a7b 랜덤 임관 깃수용 코드 이식 2018-10-28 03:32:03 +09:00
Hide_D da612bdc7b 오타 수정 2018-10-28 03:15:07 +09:00
Hide_D 628a085ba8 ReqEnvValue 추가 2018-10-28 03:14:03 +09:00
Hide_D 5ae91ac620 견문 무력 버그 수정 2018-10-25 01:26:59 +09:00
Hide_D 70265c55ef 3인 임관 실패시 견문 2018-10-25 01:21:52 +09:00
Hide_D 7c3b5fc31e 견문 시 무력이 떨어지지 않도록 변경 2018-10-25 01:17:04 +09:00
Hide_D a9a830caa2 기타 설정 추가 2018-10-24 03:27:22 +09:00
Hide_D b49ff3d4ed 예약 안되는 버그 수정 2018-10-24 03:22:41 +09:00
Hide_D 42310fa170 랜임 개월 수 버그 수정 2018-10-24 01:17:03 +09:00
Hide_D bfff1d9e2f 랜임 모드 버그 수정 2018-10-24 00:54:18 +09:00
Hide_D 2c98777b9f 등용장 무효화 2018-10-23 23:33:12 +09:00
Hide_D 4a91260a31 오타 수정 설명 수정 2018-10-23 16:38:25 +09:00
Hide_D 076971bcae 오타 수정 2018-10-23 16:35:28 +09:00
Hide_D 01fcc9bcab 랜덤 임관 모드 추가 2018-10-23 15:05:19 +09:00
Hide_D f56f201bad 건국 코드 준비 2018-10-22 02:30:44 +09:00
Hide_D 45e579f0ef 하야 추가 2018-10-21 22:35:02 +09:00
Hide_D 39db811361 인재탐색 추가. gencount, npc_id 관련 수정 2018-10-21 21:53:34 +09:00
Hide_D ff87555eba 임관 추가. 유니크 복권 추첨을 General 클래스 용으로 변경 2018-10-21 15:20:27 +09:00
Hide_D 6c5c2d40bc argTest를 로직 순서에 맞게 변경 2018-10-21 14:28:29 +09:00
Hide_D c08459e370 등용 추가 2018-10-21 03:02:22 +09:00
Hide_D 42418394ed 군량매매 구현 2018-10-21 02:36:05 +09:00
Hide_D 64fd0e2f28 아이템 구현. 장비매매 추가 2018-10-21 01:55:09 +09:00
Hide_D 2de061203b 징병 모병 추가, iAction 구조 일부 변경 2018-10-20 23:31:32 +09:00
Hide_D cee0d3f03e 일부 DB 값 관련 정보 변경. update 쿼리, insert into 쿼리 일부 변경 2018-10-20 17:41:48 +09:00
Hide_D aa19ae129b 전투태세, 첩보 추가, 기존 코드 일부 정리 2018-10-20 16:45:57 +09:00
Hide_D aecbf8ccb3 견문 추가 2018-10-20 03:24:34 +09:00
Hide_D 7e5c19f507 증여 추가 2018-10-20 02:11:23 +09:00
Hide_D b178ecd494 요양 헌납 추가 2018-10-19 02:47:07 +09:00
Hide_D 05d5039fab 출병 커맨드 구현 2018-10-17 17:42:47 +09:00
Hide_D 1004e5a8bd generalSource 폐기 2018-10-17 16:01:38 +09:00
Hide_D dbcfe6fc6e createGeneralObjFromDB 추가 2018-10-17 15:34:32 +09:00
Hide_D 56698aefe6 집합, 귀환 추가 2018-10-17 02:38:51 +09:00
Hide_D cbd2e136ed 강행, 단련 추가 2018-10-17 02:01:00 +09:00
Hide_D 9846d7f8e4 이동 구현. BaseCommand에 GeneralSource 연결. 2018-10-16 02:29:33 +09:00
Hide_D d16c86a4d7 소집해제 추가. 커맨드 버그 수정 2018-10-16 01:01:50 +09:00
Hide_D 292e642d16 func_process에서 훈련, 사기 삭제 2018-10-16 00:55:44 +09:00
Hide_D 90736b52be 물자조달 턴 추가 기타 커맨드 버그 수정 2018-10-16 00:53:19 +09:00
Hide_D 928e8a200b 사기진작 추가 2018-10-15 02:09:19 +09:00
Hide_D 2ee06eab2d 훈련 턴 추가 2018-10-15 02:05:39 +09:00
Hide_D 01913983ea 턴에 canDisplay() 추가 2018-10-15 01:28:03 +09:00
Hide_D 0aa2f2c44d NPC능동 추가 2018-10-15 01:23:44 +09:00
Hide_D f66d655782 func_npc.php 삭제 2018-10-15 00:51:50 +09:00
Hide_D 4094a08198 NPC 사령턴 일부 수정 2018-10-15 00:14:44 +09:00
Hide_D 05389da412 NPC 새로짜던 사령턴 파기 2018-10-15 00:11:26 +09:00
Hide_D e38258b04b 장수 이전턴 코딩 2018-10-15 00:11:01 +09:00
Hide_D 0cd0e2f730 NPC 수뇌턴 정비 2018-10-13 01:44:20 +09:00
Hide_D d2c7483db1 NPC 일반장 턴 완성 2018-10-12 00:57:21 +09:00
Hide_D d388c52ccd 전투 턴 관련 등록 2018-10-11 23:22:44 +09:00
Hide_D 4a2954d3a4 NPC 행동 재 작성중 2018-10-11 01:07:37 +09:00
Hide_D 804b9a1d71 접경 방식 수정. 상업 투자의 접경식도 같이 수정 2018-10-11 00:33:06 +09:00
Hide_D 1067efbbee 접경 코드를 1(곧 접경), 2(공백지[출병가능]), 3(적 도시[출병가능]) 으로 구분 2018-10-11 00:28:11 +09:00
Hide_D d41ecbeed6 NPC 군주 거병시 이동 로직 수정 2018-10-10 22:24:13 +09:00
Hide_D f93148b7d7 NPC 군주턴 까지 완료 2018-10-08 03:36:43 +09:00
Hide_D 348877c7cd NPC 부대장 수치 버그 수정 2018-10-07 21:46:28 +09:00
Hide_D fb7c2573bf 부대장 수치 버그 수정 2018-10-07 21:43:21 +09:00
Hide_D e4fcc77b0a 능력치 변경시 색상 변경 2018-10-07 19:23:26 +09:00
Hide_D 5c9b79729f AI에서 '내정풀' 인식 2018-10-06 04:18:08 +09:00
Hide_D 00d4541537 NPC 행동 코드 재 구현중 2018-10-06 04:08:53 +09:00
Hide_D 1660e563ab buildGeneralCommandClass류 구현 2018-10-06 04:08:43 +09:00
Hide_D b94081c45b npc 처리용 새 클래스 준비중 2018-10-06 01:52:14 +09:00
Hide_D f7b59f0140 커맨드 관련 구 코드 이전 2018-10-06 00:13:13 +09:00
Hide_D 22aecbe4ba turn0 사용하는 부분 리팩토링 2018-10-06 00:12:16 +09:00
Hide_D be98db9023 Merge branch 'devel' into ng_turn 2018-10-05 21:50:54 +09:00
Hide_D 828e095e64 getGeneralTurnBrief 연동 코드 수정 2018-10-05 21:49:53 +09:00
Hide_D 8e1e21b960 general에 getID 추가 2018-10-05 21:04:43 +09:00
Hide_D 303d8815e3 중간 작업(getGeneralTurnBrief, turn0, npc_turn 작업 남음) 2018-10-04 02:37:54 +09:00
Hide_D ba574dda62 유틸리티 함수 추가 2018-10-04 02:07:31 +09:00
Hide_D bf630b5f7d 턴 요약 위해 getBrief 추가 2018-10-04 01:57:56 +09:00
Hide_D 9b4bf148cc general.turn0 기반 코드 일부를 general_turn 기반으로 변경 2018-10-04 01:18:23 +09:00
Hide_D f5212b4aa1 processCommand 함수 삭제 2018-10-04 01:12:38 +09:00
Hide_D eea4cdf379 스키마 수정 2018-10-04 01:10:31 +09:00
Hide_D e909b48fea 유틸리티 함수들 일부 수정. 랜덤값 뽑기 함수 하나 더 추가 2018-10-04 01:08:56 +09:00
Hide_D 258aabbdde sql 선언 수정 2018-10-04 00:20:30 +09:00
sars 478f26e75a camelCase대신 underscore_case 사용 2018-10-04 00:16:08 +09:00
sars 57cc558b9b 장수 동향, 개인 기록, 중원 정세 id 등록 2018-10-04 00:07:46 +09:00
Hide_D 29984d4b09 지난 턴 관리 부분 이상한 부분 수정 2018-10-03 22:41:49 +09:00
Hide_D e1a266e5d8 '지난 턴'을 관리하는 기능 추가 2018-10-03 22:38:05 +09:00
Hide_D a33a7317cc 턴 커맨드에 getPreReqTurn, getPostReqTurn 추가 2018-10-03 17:45:47 +09:00
Hide_D 1d0bcd857e LastTurn 관리용 객체 추가 2018-10-03 17:27:04 +09:00
Hide_D 040da2429f lock 버그 수정 2018-10-03 16:21:00 +09:00
Hide_D 978a395421 lock 버그 수정 2018-10-03 16:20:47 +09:00
Hide_D 63e5625d62 사령턴 수행용 '지난턴' 추가 2018-10-02 03:06:17 +09:00
Hide_D 38bbae13b9 버그 수정. 커맨드. 사령턴 실행. 2018-10-02 02:27:42 +09:00
Hide_D e975a8106f 코드 정리. 버그 수정. 접경 디버프 반영 2018-10-02 02:27:29 +09:00
Hide_D 6a49887ad7 preprocessCommand 정리 2018-10-02 00:15:15 +09:00
Hide_D 5565ec2ddb 우선 순위를 오름차순으로 변경 2018-10-02 00:11:27 +09:00
Hide_D 20b1f8eff8 전투 우선순위에 '유니크 아이템'의 효과가 과도하게 측정되는 버그 수정 2018-10-01 23:10:47 +09:00
Hide_D 34fd000df9 전투 우선순위에 '유니크 아이템'의 효과가 과도하게 측정되는 버그 수정 2018-10-01 23:10:27 +09:00
Hide_D 1132177e2d 의술의 도시 치료 커맨드 추가 2018-10-01 03:35:07 +09:00
Hide_D 5be39c04ef ?> 제거 2018-10-01 03:03:30 +09:00
Hide_D 0ee4593608 Trigger 추가 수정 2018-10-01 03:02:03 +09:00
Hide_D f301344587 trigger 구성을 올바르게 수정 2018-10-01 02:52:27 +09:00
Hide_D d2c5c856ab Trigger, Action 역할 재정의 2018-10-01 02:02:30 +09:00
Hide_D 5f8e4ae10c 기본 커맨드를 새 turn 테이블 기준으로 변경 2018-09-30 03:17:55 +09:00
Hide_D 4ff30b1a9d command로 새 table용 장수, 수뇌 턴 당기기,밀기 추가 2018-09-30 03:07:24 +09:00
Hide_D a0b215dab6 Command 구조 일부 수정 2018-09-30 03:04:20 +09:00
Hide_D 144e82d7e2 updateTurntime을 TurnExecutionHelper로 이동 2018-09-30 02:05:55 +09:00
Hide_D 79252ba3b0 사망, 환생을 General 클래스로 이동 2018-09-30 02:05:37 +09:00
Hide_D c5286093f9 사망 메시지를 별도로 분리 2018-09-30 02:05:12 +09:00
Hide_D 5ad194bd45 코드 병합 2018-09-29 22:37:30 +09:00
Hide_D 501113da44 gitignore 조정 2018-09-29 22:29:02 +09:00
Hide_D f0a7990404 계략 기본 성공률을 '보급'과 거꾸로 적용한 버그 수정 2018-09-27 17:00:56 +09:00
Hide_D 27f53ff4a6 임관 코드 최종 수정 2018-09-27 16:36:55 +09:00
Hide_D 9ec5dfc8b1 사실 모드 임관 수정 2018-09-27 16:29:49 +09:00
Hide_D e4c1e414c8 사실 모드 랜임 코드 버그 수정 2018-09-27 16:27:38 +09:00
Hide_D a391650472 인증 코드 자리 수 하나 감소 2018-09-25 10:45:21 +09:00
Hide_D 3cfde2b40d 주자사, 공, 황제일 때 장수 수가 내부적으로 1 차이나게 적용되는 버그 수정 2018-09-25 10:12:42 +09:00
Hide_D 8bf1ed33dc 전환 시 '빈칸' 보정, 설명 추가 2018-09-24 04:23:47 +09:00
Hide_D 422b3be0c5 flip image 추가 2018-09-24 04:17:54 +09:00
Hide_D c34e44c4ec data-flip을 허용하고, summernote에 img 태그에 data-flip을 추가하도록 2018-09-24 03:58:40 +09:00
Hide_D a2b20eca67 장수 생성시 초기 스탯으로 '임의 버튼을 클릭'하도록 지정 2018-09-24 02:16:42 +09:00
Hide_D d41c316bfb 설치 설명에서 MariaDB만 지원한다고 변경 2018-09-23 17:31:40 +09:00
Hide_D ca1d8aab84 WebUtil.php에서 drawMenu fallback 추가. 설치시 '활성화되지 않은' KakaoKey.php 파일 추가 2018-09-23 17:31:30 +09:00
Hide_D 32e3dcff7c 이미지 업로드 기능 추가 2018-09-22 03:05:58 +09:00
Hide_D 9a23470622 초반 제한 기간 텍스트 수정 2018-09-21 02:08:51 +09:00
Hide_D c37a186802 툴팁 class 수정. 지도의 년월에 올리면 초반 제한, 기술 제한 툴팁 2018-09-21 02:06:45 +09:00
Hide_D 84c17e3b22 왕조 일람 버그 수정 2018-09-20 02:26:20 +09:00
Hide_D 64e0fca124 전쟁 기한 공식을 스택형으로 변경 2018-09-20 01:15:50 +09:00
Hide_D 5c6537fd7a 멸망 시 접경 재설정 코드 버그 수정 2018-09-20 01:02:29 +09:00
Hide_D 764a82df00 버그 수정 2018-09-20 00:43:36 +09:00
Hide_D e904911fd9 후발 주자에게, 명성, 전특, 내특에 대해 일정 부분 보상 제공 2018-09-20 00:35:38 +09:00
Hide_D a7494f72f6 NPC 부대장에게 포상하지 않도록 수정 2018-09-19 23:56:33 +09:00
Hide_D b6b53b028d 부대탄 유저장도 발령하지 않도록 수정 2018-09-19 23:37:36 +09:00
Hide_D 1743ce714a 전투 코드를 모두 generator 기반으로 변경 2018-09-19 23:29:36 +09:00
Hide_D 656f0c5d11 부대장 주는 횟수 변경 2018-09-19 22:57:06 +09:00
Hide_D d80aebe1f4 집합장 때문에 총 기술치가 깎이는 버그 수정 2018-09-19 22:55:48 +09:00
Hide_D ad48bc1962 접경 내정 상승량 감소는 '수도가 아닐때' 적용 2018-09-19 03:01:38 +09:00
Hide_D d72fbb7098 부대장에게는 금쌀이 제공되지 않도록 수정 2018-09-19 02:21:38 +09:00
Hide_D 95d5eaa09b 주석 수정 2018-09-19 02:13:44 +09:00
Hide_D b997a6159e 치안에 따른 재난 확률 변경 2018-09-19 02:09:08 +09:00
Hide_D 1cd8b7a450 전쟁 중 접경에서는 농상성수 가 제대로 안 오르도록 2018-09-19 02:00:29 +09:00
Hide_D c5a8eb4261 접경지 처리시, 공백지 접경인지 적군 접경인지 구분 2018-09-19 01:49:46 +09:00
Hide_D 8891c29cbd 트래픽이 0인 경우 버그 수정 2018-09-19 01:46:15 +09:00
Hide_D 2facdfa1dd 루드라사움에서도 보병의 성벽 대미지 증가 2018-09-19 01:33:33 +09:00
Hide_D 65c9fa0c21 보병의 성벽 상대 전투력 20% 증가 2018-09-19 01:32:04 +09:00
Hide_D e53c85dbaf 돌격에 저지 불가 제거 2018-09-19 01:16:50 +09:00
Hide_D 3a231e8e61 저지 숙련 증가 2018-09-19 01:00:25 +09:00
Hide_D 4dc7776387 차병은 성벽 전투시 부상을 입지 않음 2018-09-19 00:39:15 +09:00
Hide_D 5ca043e0f1 견고 설명 수정 2018-09-19 00:29:24 +09:00
Hide_D 9ef052c814 견고 추가 상향 2018-09-19 00:28:09 +09:00
Hide_D 6d1690beaa 소울소드 리마스터 시나리오 업데이트 2018-09-18 23:19:30 +09:00
Hide_D 171656e5be 버그 수정 ㅜ 2018-09-18 03:30:40 +09:00
Hide_D 385e7f4871 천통했을 때에는 벌점이 늘어나지 않도록 수정 2018-09-18 03:26:12 +09:00
Hide_D 89c5485784 NPC 안생기는 버그 수정 2018-09-18 03:22:55 +09:00
Hide_D 02d191ec28 변수 대소문자 버그 수정 2018-09-18 03:17:20 +09:00
Hide_D 47c3090f3a NPC 생성 루프 수정 2018-09-18 03:15:40 +09:00
Hide_D 476dac1ac1 주목, 왕이되면 NPC 부대장 하나 더 추가 2018-09-18 02:56:35 +09:00
Hide_D 8ca0d0ced4 메시지 전송 시 장수명 순서대로 정렬 2018-09-18 02:31:41 +09:00
Hide_D ab197489d7 집합장 NPC 삭턴이 실행되지 않는 문제 수정 2018-09-18 02:25:03 +09:00
Hide_D 99736d187b 통합 제의 임시 삭제 2018-09-18 02:15:48 +09:00
Hide_D 197c09bd0d 집합장 턴을 그나마 확인할 수 있도록 삭턴 조정 2018-09-18 02:02:26 +09:00
Hide_D 6cc634ba1f 집합장은 턴이 항상 풀로 차도록.. 2018-09-18 02:01:55 +09:00
Hide_D 4c89ad91d2 부대장 시작 도시를 랜덤으로 2018-09-18 01:56:32 +09:00
Hide_D d66233bce0 NPC 부대장 버그 수정 2018-09-18 01:51:28 +09:00
Hide_D b485e6927e 부대장 번호 버그 수정 2018-09-18 01:47:48 +09:00
Hide_D 74b9e8bd7b 집합장 명칭을 부대장으로 변경 2018-09-18 01:46:37 +09:00
Hide_D 545742ecc0 부대 탄 사람은 발령 로직에서 최대한 배제 2018-09-18 01:27:30 +09:00
Hide_D d9f1f65352 NPC 부대 생성 버그 수정 2018-09-18 01:18:03 +09:00
Hide_D 0904d17a5f 집합장 등장 수식 수정 2018-09-18 00:36:05 +09:00
Hide_D 87171b4246 집합장 테스트 2018-09-18 00:29:44 +09:00
Hide_D 78f8b56203 reset_token에서 불필요한 명령 제거 2018-09-17 23:06:24 +09:00
Hide_D b79045eddb 전투 특기 클래스 추가, 2018-09-17 03:31:36 +09:00
Hide_D 6eb67b1a3c 일단 push 2018-09-17 02:57:44 +09:00
Hide_D 777ec39bd9 턴 수행 constraint를 상세하게 분리, argTest 추가. 턴 커맨드 실행용 클래스, ajax 파일 준비 2018-09-16 22:16:08 +09:00
Hide_D 9dcafaaa38 reset_token에서 불필요한 명령 제거 2018-09-16 17:58:56 +09:00
Hide_D 097e2fb653 턴 표기 방식 대폭 변경 2018-09-16 04:54:17 +09:00
Hide_D e7aa97634b 동결, 지연인 경우에 한해 커맨드 창의 월 표시가 다르게 되던 문제 수정.
addTurn, subTurn, cutTurn 등에서 밀리초 표기 개선
2018-09-16 04:52:13 +09:00
Hide_D 447b9f265f Auction에서 구형 Ymd his 변경 2018-09-16 04:41:00 +09:00
Hide_D 029a6f03b7 서버의 분턴 변경시 '정확히' 현재 턴에 비례해서 변경되도록 변경 2018-09-16 04:38:06 +09:00
Hide_D ae4a349d79 랜덤 턴에서 '소수점'을 다룸 2018-09-16 04:18:22 +09:00
Hide_D 35728c7911 TimeUtil 리팩토링 2018-09-16 04:14:22 +09:00
Hide_D 469330f270 TimeUtil을 소수점 시간을 고려할 수 있도록 수정 2018-09-16 03:54:24 +09:00
Hide_D 03f9c56928 정장, 선정 커맨드 문제로 명성,계급 반영 위치 이동 2018-09-15 03:49:08 +09:00
Hide_D ed2a2a8975 기술연구의 calcBaseScore는 상업 투자 것을 가져오기로 2018-09-15 03:44:10 +09:00
Hide_D b5380f183c 내정 커맨드 버그 수정, 정착장려, 주민선정 추가, RemainCityTrust 추가, succ -> success 2018-09-15 03:42:09 +09:00
Hide_D f5bcaba352 phan 타겟 버전 변경 2018-09-15 02:52:40 +09:00
Hide_D 5a70b23db9 필요없어진 gennum2 삭제. gennum 재연산 2018-09-15 02:51:33 +09:00
Hide_D fc3487e545 사용되지 않는 chemi 제거 2018-09-15 02:43:24 +09:00
Hide_D a4863dc8d7 totaltech, tech를 float tech로 일원화, NPC가 기술레벨 10을 넘으면 기연 안하는 버그 수정 2018-09-15 02:37:11 +09:00
Hide_D af12a08e25 기술연구 추가 2018-09-15 01:53:17 +09:00
Hide_D 312dc294b3 내정턴 성공 확률 계산을 실패->성공->일반에서 성공->실패->일반으로 변경 2018-09-15 01:33:44 +09:00
Hide_D d958dd5ee4 func_process 이전 코드 분리 2018-09-15 00:59:51 +09:00
Hide_D 1ddc49b17b 기본 내정턴을 클래스 기반으로 가능하도록 수정 2018-09-15 00:57:58 +09:00
Hide_D 322541b16f 농상치성수 내정 코드 구현 2018-09-15 00:40:24 +09:00
Hide_D 00cb10f029 BaseCommand에 '대상이 지정되지 않아' 대략적으로 가능성을 추측해야하는 경우 추가 2018-09-15 00:39:03 +09:00
Hide_D ed24a721ed General의 통합 interface 간소화 2018-09-15 00:38:28 +09:00
Hide_D 9fc10e0f65 농지 개간, 상업 투자를 외부 커맨드로 연결 2018-09-14 02:35:27 +09:00
Hide_D ab212e0565 모 징병 코드의 uniqueItem을 uniqueItemEx로 변경 2018-09-14 02:28:05 +09:00
Hide_D eac0049577 농지개간, 상업투자 구현, General 클래스로 checkStatChange 이동, uniqueItemEx 추가(및 재구현) 2018-09-14 02:26:41 +09:00
Hide_D 9d1d51d0d7 119 코드에서 $connect 제거 2018-09-14 00:58:55 +09:00
Hide_D 4fd3c4ada6 상업투자 구현 중 2018-09-13 03:02:51 +09:00
Hide_D dd73d8fc69 General에 iActionTrigger 활성화 2018-09-13 02:38:27 +09:00
Hide_D b89d37c8c5 getPersonalityClass 추가 2018-09-13 02:21:42 +09:00
Hide_D bc4983c771 전략 관련 보정 함수 명 변경 2018-09-13 02:10:37 +09:00
Hide_D e6c186b31b 은둔 보정 수정 2018-09-13 01:52:36 +09:00
Hide_D b106fa55d3 상업투자 구현 중 2018-09-13 01:43:44 +09:00
Hide_D 981e42c5a9 trigger 타입에서 $tunType을 한글로 변경. 성격 추가. 계략 성공 확률을 onCalcDomestic으로 통합. 2018-09-13 01:43:32 +09:00
Hide_D c160c5a555 천통시 모든 국가 등재 장수의 이름이 9글자 인 경우 발생하는 버그 수정 2018-09-12 01:46:16 +09:00
Hide_D 31c7bf5348 메뉴 아이템 길이 버그 2018-09-12 01:16:17 +09:00
Hide_D 89bf457878 Merge branch 'devel' into ng_turn 2018-09-12 00:54:48 +09:00
Hide_D 6eadf718fc meta keyword 추가 2018-09-12 00:35:50 +09:00
Hide_D effced24d1 sitemap을 위하여 메뉴를 php에서 직접 출력하도록 변경 2018-09-12 00:12:32 +09:00
Hide_D 09f399db9a robots.txt 재등록 2018-09-11 23:50:29 +09:00
Hide_D 2b73f6faea 로봇에 대문자 들어가서 삭제 2018-09-11 23:50:16 +09:00
Hide_D 943662605e Robots.txt 설명 추가 2018-09-11 23:48:02 +09:00
Hide_D 9a04962bd6 대문에 meta 태그 추가 2018-09-11 23:03:10 +09:00
Hide_D 91a36eb9a0 머지 2018-09-11 21:40:07 +09:00
Hide_D c371f6bbb5 refresh_token 변수가 잘못된 것 수정 2018-09-11 11:13:37 +09:00
Hide_D 8324e2e454 access token 체크용 디버그 2018-09-11 11:08:37 +09:00
Hide_D 30307c1b56 로그인 인증 버그 체크 2018-09-11 10:55:53 +09:00
Hide_D f139d0d2a8 로그인 인증 디버깅용 코드 추가 2018-09-10 23:12:27 +09:00
Hide_D 33843764a7 로그인 토큰을 제대로 못 받은 경우 추가 2018-09-10 23:07:44 +09:00
Hide_D aca7d7c571 createOTP 반환형 버그 2018-09-10 01:49:11 +09:00
Hide_D bff72f609c 세션 로그인시 oauth token 값이 제대로 저장 안되는 버그 수정 2018-09-10 01:09:55 +09:00
Hide_D adb03b7420 인증시 로그아웃이 바로 풀리는 버그 수정 2018-09-10 00:38:06 +09:00
Hide_D 2094e18b60 IE에서 인증이 이상한 문제 해결 2018-09-10 00:35:59 +09:00
Hide_D 541d8ddd40 토큰 시간 초과시 즉시 로그아웃 되도록 변경 2018-09-10 00:22:57 +09:00
Hide_D f996172218 Merge branch 'kakao_login' into devel 2018-09-09 23:58:51 +09:00
Hide_D f9ffc1c1f3 oauth 인증중 token_valid_until만 table column으로 분리 2018-09-09 23:57:26 +09:00
Hide_D 05085ad504 5일이 지난후 로그인 토큰을 미리 초기화 가능하도록 수정 2018-09-09 23:18:23 +09:00
Hide_D 64aecaf28b 메인 페이지에 '비밀번호 초기화' 추가 2018-09-09 21:53:00 +09:00
Hide_D 7b3ef45300 카카오 로그인 작업 개선 2018-09-09 21:16:44 +09:00
Hide_D bd25de930b 카카오 로그인용 디버깅 코드 제거 2018-09-09 20:22:34 +09:00
Hide_D 15d43c9653 카카오 로그인 초기 구현 2018-09-09 20:19:00 +09:00
Hide_D 5b7eba61cc 반계에 '동그라미' 오타 제거 2018-09-09 15:54:17 +09:00
Hide_D 2445c79805 성벽 상대로 '혼란' 계략을 사용하지 않는 버그 수정 2018-09-08 12:33:41 +09:00
Hide_D 63be2dee47 운영자 찬스 수정 2018-09-07 02:06:13 +09:00
Hide_D 5bfef1be32 운영자 찬스2 2018-09-07 02:04:50 +09:00
Hide_D 8253526f23 운영자 찬스 2018-09-07 02:03:37 +09:00
Hide_D db19548e2c 불가능한 커맨드일 때 '불가' 표기 추가 2018-09-07 00:45:38 +09:00
Hide_D 10af31f042 customCSS를 조금 더 안전하게 적용 2018-09-06 23:38:47 +09:00
Hide_D e7c6e17590 왕조 일람의 '현재'에 대한 자세히 보기를 삭제 2018-09-05 23:39:16 +09:00
Hide_D a3d0ceb6a5 내정턴 준비 2018-09-05 01:28:58 +09:00
Hide_D a277ac182b 통합 안되는 버그 수정 2018-09-04 15:48:18 +09:00
Hide_D 0eee613a95 외교 커맨드 수정 2018-09-04 01:39:58 +09:00
Hide_D b76fa38e09 외교 커맨드 수식 오류 수정 2018-09-04 01:33:21 +09:00
Hide_D 7679c11b5b 외교 커맨드 수식 오류 수정 2018-09-04 01:30:06 +09:00
Hide_D e7ae2ab441 내특을 int에서 string으로 변경 2018-09-03 02:07:41 +09:00
Hide_D c0f5c8a358 내 정보에서 수비, 토너먼트가 즉시 반영되지 않는 버그 수정 2018-09-03 01:09:03 +09:00
Hide_D dd5feb0e2c 내 정보에서 수비, 토너먼트가 즉시 반영되지 않는 버그 수정 2018-09-03 01:08:42 +09:00
Hide_D b95d05c134 내특을 iActionTrigger로 구현 2018-09-03 01:03:51 +09:00
Hide_D 87bdd0016e onCalcDomesticTurnScore 구조 변경 2018-09-02 23:11:07 +09:00
Hide_D b9befa4e63 국가 성향 증가/감소 기본 구현 완료 2018-09-02 23:02:12 +09:00
Hide_D d9ed00ddee 치안, 수성, 민심까지 반영 완료 2018-09-02 22:50:25 +09:00
Hide_D 4c2b484c2b 계략 확률, 전략턴, 기술 반영 2018-09-02 22:19:38 +09:00
Hide_D ff31e41fec 금수입, 살수입 반영 2018-09-02 22:04:08 +09:00
Hide_D 34204f6183 onCalcDomesticTurnScore 변경 TriggerNationType에서 숫자 id 제거 2018-09-02 21:57:44 +09:00
Hide_D 6fc8763895 국가 성향 converter를 TriggerNationType으로 통합 2018-09-02 21:37:23 +09:00
Hide_D 71dd82afe8 메인 페이지 width 일부 수정 2018-09-02 21:00:05 +09:00
Hide_D ea5425a528 commandlist 가로로 짤리는 몇몇 유저용 수정 2018-09-02 20:55:47 +09:00
Hide_D 1a0914196f getNationTypeList 변경 2018-09-02 20:54:32 +09:00
Hide_D 9dd1adacd2 nation type을 char로 변경하고 해당하는 iActionTrigger 추가 2018-09-02 19:52:04 +09:00
Hide_D 93c5268fbc ActionTrigger 초안 추가 2018-09-02 19:51:48 +09:00
Hide_D 98edc89fa0 LazyVarUpdater를 활용하는 General 클래스 추가 2018-09-02 19:51:17 +09:00
Hide_D 3aad412102 명성에 따른 보정치 함수 추가 2018-09-02 19:50:50 +09:00
Hide_D a2ee9524fb updateVar 정리 2018-09-02 19:50:31 +09:00
Hide_D 78955a1540 범용성을 목적으로 LazyVarUpdater를 분리 2018-09-02 17:25:04 +09:00
Hide_D f412b7e734 구버전 전투 코드 삭제 2018-09-02 17:18:05 +09:00
Hide_D b13f3004e2 잘못된 rate->trust 변경 복구 2018-09-02 16:05:44 +09:00
Hide_D a093b0f8e8 도시의 민심을 int에서 float으로 변경하고 명칭을 rate에서 trust로 변경 2018-09-02 16:03:04 +09:00
Hide_D d4ba13eee3 부대 탈퇴시 확인 창이 정상적으로 뜨지 않는 버그 수정 2018-09-02 14:19:17 +09:00
Hide_D 34a84c6548 contraint 일괄 체크 함수 추가 2018-09-02 14:18:59 +09:00
Hide_D 6c52c1177b 부대 탈퇴시 확인 창이 정상적으로 뜨지 않는 버그 수정 2018-09-02 14:18:44 +09:00
Hide_D f9bc312f91 도시명 표기시 ==== 기호 제거 2018-09-02 14:15:24 +09:00
Hide_D 7283153f44 contraint 추가 2018-09-02 13:46:57 +09:00
Hide_D df6b2bd0e8 초기 constraint 지정 2018-09-02 13:17:26 +09:00
Hide_D 16831880dd 이전 시간대에 대해 리셋 가능하지 않도록 변경 2018-08-31 20:36:59 +09:00
Hide_D f79fc98ba6 customCSS 추가
장수 아이콘에 generalIcon 클래스 추가
2018-08-31 20:25:10 +09:00
Hide_D 0483c75dd7 전투 시뮬레이터에서 대미지 범위 표기 2018-08-31 19:32:56 +09:00
Hide_D 3a4dcacd56 글꼴 크기 범위 추가 2018-08-30 22:06:37 +09:00
Hide_D 5f6f09674e Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-08-30 22:02:58 +09:00
Hide_D c785027c5c 에디터 변경 2018-08-30 22:02:51 +09:00
Hide_D d2659cea5f 원조시 특정 경우에 쌀 소모를 줄일 수 있는 버그 수정 2018-08-30 11:51:02 +09:00
Hide_D a9b966b159 증축 시 쌀 2000이 아닌 0 기준으로 계산하는 버그 수정 2018-08-30 11:49:37 +09:00
Hide_D f2c23e21c5 천도 시 쌀이 2000 미만이어도 가능한 버그 수정 2018-08-30 11:49:06 +09:00
Hide_D 53b973e2d3 장수 일람 연동 코드 버그 수정 2018-08-30 09:08:19 +09:00
Hide_D b7a570cba2 폰트 크기 변경에 대해서 즉시 반영이 되지 않는 버그 수정 2018-08-30 03:04:05 +09:00
Hide_D c77b79f0d2 글꼴 크기 커스터마이징 완료 2018-08-30 02:41:58 +09:00
Hide_D ef6678d8b0 에디터 글꼴 크기 커스터마이징 2018-08-30 02:12:48 +09:00
Hide_D 21609fa9c4 GUI 에디터 추가 옵션 2018-08-30 01:56:47 +09:00
Hide_D accc083702 gui 에디터 추가 2018-08-30 01:25:45 +09:00
Hide_D 9e677f3871 스탯 분류 방식 변경 2018-08-29 20:36:43 +09:00
Hide_D 55290eac30 네임스페이스 버그 해결 2018-08-29 15:04:44 +09:00
Hide_D d480502d33 NPC 네임스페이스 버그 해결 2018-08-29 15:03:43 +09:00
Hide_D c1cda16be0 성벽 공격 로그 수정 2018-08-28 21:56:33 +09:00
Hide_D 8ca9df9f34 '성인이 되어 등장' 시 전콘이 안뜨는 문제 해결 2018-08-28 20:36:46 +09:00
Hide_D 406b67b081 애니 집결 시나리오 변경 2018-08-28 20:29:42 +09:00
Hide_D 2c9fecf3ef 의병 고용, 인재 탐색시 기본 변종에 0 코드가 없는 경우 수정 2018-08-28 20:17:43 +09:00
Hide_D 6bc78b67bd 튜토리얼 버튼을 전투 시뮬레이터로 변경 2018-08-28 20:13:54 +09:00
Hide_D 5bbc46e070 구버전 시뮬레이터 삭제 2018-08-28 13:22:17 +09:00
Hide_D 6a9ceda361 국가에는 escape가 되어있으므로 메시지 템플릿에 2중 escape는 필요하지 않음 2018-08-28 01:49:25 +09:00
Hide_D ab2d5fd58f 이미지 출력시 주소에 빈칸이 있는 경우 안보이는 문제 해결 2018-08-27 23:39:58 +09:00
Hide_DandGogs 7018413777 Merge branch 'devel' of cappu/core into devel 2018-08-27 23:31:51 +09:00
cappu 77385616a4 테스트 겸 스탯업데이트 2018-08-27 23:17:31 +09:00
Hide_D c809f27bf5 전투 시뮬레이터를 포함한 코드 적용 2018-08-27 21:11:05 +09:00
Hide_D 493e778124 계략수비 시 전특 징병의 통솔이 반영되지 않는 버그 수정 2018-08-27 17:46:43 +09:00
Hide_D 7373af50b9 계략시 '징병' 전특의 통솔 상승을 받지 못하는 버그 수정 2018-08-27 17:43:53 +09:00
Hide_D 309f053510 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:39:05 +09:00
Hide_D d976cf8a27 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:38:08 +09:00
Hide_D 5d60a62a38 단어 수정 2018-08-27 13:53:07 +09:00
Hide_D a3f7dbccea 시뮬레이터 UI 일부 수정 2018-08-27 13:52:51 +09:00
Hide_D 0c4cce3339 시뮬레이터 숙련도 반영 안되는 버그 수정 2018-08-27 13:47:51 +09:00
Hide_D 58ccbc4d3d 불러오기시 json을 확장자로 지정 2018-08-27 03:13:34 +09:00
Hide_D c6cabc2087 전투 시뮬레이터 모두 저장/모두 불러오기 구현 2018-08-27 03:08:35 +09:00
Hide_D ef1f2722fc 전투 시뮬레이터 기본 기능 구현 완료 2018-08-27 02:21:45 +09:00
Hide_D 6b4a7ee03b 전투 시뮬레이션 구현 (동작) 2018-08-27 01:23:45 +09:00
Hide_D 7745a2051d 수비시 국가 성향이 공격국으로 지정되는 버그 수정 2018-08-27 00:18:50 +09:00
Hide_D eabd5e9acc 전투 시뮬레이터 구현 2018-08-27 00:18:19 +09:00
Hide_D d7dcbf98ff 전투 순서 버그 수정 2018-08-26 23:29:15 +09:00
Hide_D ff4c73f3d3 전투 종료시 로그 순서 변경 2018-08-26 23:25:47 +09:00
Hide_D dbf044b418 Revert "전투 종료 시 뜨는 로그 순서 변경"
This reverts commit 568e1b2923.
2018-08-26 23:23:06 +09:00
Hide_D 7a514e2492 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:19:21 +09:00
Hide_D a73e533287 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 23:19:09 +09:00
Hide_D 0f175ac4c6 수비 순서대로 정렬 버튼 활성화 2018-08-26 23:16:42 +09:00
Hide_D be15f1c698 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:11:19 +09:00
Hide_D a315da6041 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 22:59:14 +09:00
Hide_D 3f43f218ac 시뮬레이터 전투 준비 2018-08-26 22:32:37 +09:00
Hide_D 5c8ad646af ajax 쿼리 validation 종료 2018-08-26 22:31:14 +09:00
Hide_D 77f5fddd90 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:59 +09:00
Hide_D eab8b1ede5 전투 시뮬레이터 구현 중 2018-08-26 20:29:42 +09:00
Hide_D 2ab0896523 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:32 +09:00
Hide_D 639fe920df 전투 시뮬레이터 추가 구현 2018-08-26 20:01:08 +09:00
Hide_D 7577c84eca 국가 성향 버그 수정 2018-08-26 18:25:14 +09:00
Hide_D 22c4ec2d4a 국가 성향 출력 버그 수정 2018-08-26 18:24:35 +09:00
Hide_D 8ac85881a9 국가 성향이 제대로 등록되지 않는 버그 수정. 시뮬레이터 구현 2018-08-26 18:19:27 +09:00
Hide_D 724804efc6 전투 시뮬레이터 로컬 기능 구현 2018-08-26 17:20:47 +09:00
Hide_D ca57ef17fc 전투 시뮬레이터 추가 구현 2018-08-26 04:54:43 +09:00
Hide_D 480f015fb0 전투 시뮬레이터 구현 중 2018-08-25 11:27:29 +09:00
Hide_D d90e087f20 전투 시뮬레이터 추가 구현 2018-08-25 11:25:34 +09:00
Hide_D 3916cc0562 전투 시뮬레이터 UI 추가 구현 2018-08-25 11:15:33 +09:00
Hide_D cb54e56417 전투 시뮬레이터 작업 중 2018-08-24 03:46:21 +09:00
Hide_D 6aa606f2fa 전투 시뮬레이터 틀 작성 중 2018-08-24 01:09:17 +09:00
Hide_D 53d13a11ce 장수 생성시 능력치 덧셈이 이상한 버그 수정 2018-08-23 20:26:23 +09:00
Hide_D 9ba2b4142d 계략 시 수비 장수를 무시하는 버그 수정 2018-08-23 19:26:15 +09:00
Hide_D f5161a5b99 Merge branch 'devel' into battle_simulator 2018-08-23 18:45:32 +09:00
Hide_D f9d5d190d5 유니크 훈련,사기 템에서 훈련, 사기가 영구적으로 오르는 버그 수정 2018-08-23 16:21:18 +09:00
Hide_D eead9639a2 도시 점령시, 승수, 사기가 추가로 오르는 버그 수정 2018-08-23 16:10:49 +09:00
Hide_D 5044d5d3b4 파일 준비 2018-08-23 16:07:11 +09:00
Hide_D 44eed2c1df 탈취 확률 버그 수정 2018-08-23 01:53:00 +09:00
Hide_D e83b182e4d NPC가 기본 병종만 뽑는 버그 수정 2018-08-23 01:46:45 +09:00
Hide_D 888a76eda0 장수 생성 시 종능 부족하면 경고창 띄움 2018-08-23 01:07:25 +09:00
Hide_D 668364e583 수뇌이면 감찰부 상세 로그 표기 2018-08-22 15:27:44 +09:00
Hide_D 35c7a2d1b6 계략 로그에서 장수 부상 수치도 강조 2018-08-22 15:23:46 +09:00
Hide_D 79803178cd 민심 깎이는 로그에 반올림 적용 2018-08-22 15:22:20 +09:00
Hide_D 419ee8d8ff 전투 계략 실패 색상 버그 수정 2018-08-22 15:12:08 +09:00
Hide_D 328b3c9409 계략에 로그 추가 2018-08-22 15:11:29 +09:00
Hide_D f097508e87 탈취 버그 수정 2018-08-22 14:52:09 +09:00
Hide_D e6791ee8ec 탈취 성공시 일부는 장수가 소유 2018-08-22 14:49:15 +09:00
Hide_D cfbeba3de1 계략이 항상 성공하는 버그 수정 2018-08-22 14:43:01 +09:00
Hide_D bbc7f5a734 탈취 버그 수정 2018-08-22 14:37:48 +09:00
Hide_D e8726f03f3 탈취 버그 수정 2018-08-22 14:36:52 +09:00
Hide_D de95c6d698 계략 버그 수정 2018-08-22 14:31:37 +09:00
Hide_D 86b57447d8 계략시 소모성 아이템이 소모되지 않는 버그 수정 2018-08-22 14:29:27 +09:00
Hide_D c9d1efc6e7 계략 버그 수정 2018-08-22 14:21:53 +09:00
Hide_D dd1eeaddfa 계략 버그 수정 2018-08-22 14:20:49 +09:00
Hide_D 7f098db3de 계략 버그 수정 2018-08-22 14:18:30 +09:00
Hide_D 6468cbbfbd 계략 시전 버그 수정 2018-08-22 14:16:56 +09:00
Hide_D a30d61e842 계략 커맨드 리팩터링 2018-08-22 14:09:24 +09:00
Hide_D e0029fdc87 전투 중 사기 증가가 제대로 반영되지 않는 버그 수정 2018-08-22 02:44:59 +09:00
Hide_D 712e2c32a0 병력의 소집해제가 0분 0초가 아닌 '본인의 턴 실행 직전'에 실행되도록 변경 2018-08-22 02:18:55 +09:00
Hide_D f28e15b567 보급 끊긴 곳에 대한 계략 동작 변경 2018-08-22 02:05:24 +09:00
Hide_D 128e33661f 무한 발동 가능한 사령턴 커맨드의 명성,계급치 증가 삭제 2018-08-22 01:51:11 +09:00
sars 3916561c62 Revert "Revert "사스 권한 테스트겸, camelCase 적용""
This reverts commit 415791dddd.
2018-08-21 18:07:56 +09:00
sars 00638d074a Revert "사스 권한 테스트겸, camelCase 적용"
This reverts commit a5be15e453.
2018-08-21 18:07:05 +09:00
sars ca51b2d83a 사스 권한 테스트겸, camelCase 적용 2018-08-21 18:03:55 +09:00
Hide_D 1a879f97a2 기술 제한이 항상 걸리는 버그 수정 2018-08-21 18:02:02 +09:00
Hide_D 89d18cb7c5 성벽 전투시 떨어지는 내정 수치 수정 2018-08-21 16:41:31 +09:00
Hide_D 4e14249707 성벽 공격시 떨어지는 내정수치 수정 2018-08-21 16:35:37 +09:00
Hide_D 41f2c08da8 올바르지 않은 성격일 경우 기본 값 설정 2018-08-21 15:43:59 +09:00
Hide_D 4fca7bcfcf 저지 증가 숙련 변경 2018-08-21 14:59:58 +09:00
Hide_D 232725329a 툴팁 변경. 저지시 숙련 추가 2018-08-21 14:58:48 +09:00
Hide_D 88247851f4 징병 전특은 순수 통솔에서 15% 보정 2018-08-21 12:23:19 +09:00
Hide_D 6efaec6642 보병 상대 회피율 변경 2018-08-21 11:54:01 +09:00
Hide_D b9e31e39e2 보병은 상대의 회피를 5%p 감소 2018-08-21 11:51:09 +09:00
Hide_D e2cd8ed391 견고시 계략 성공 확률 변경 2018-08-21 11:07:28 +09:00
Hide_D 8a1641fbfa 견고 방식 변경 2018-08-21 11:04:27 +09:00
Hide_D 936f069ac3 수극 사용시 부상 정도 약화 2018-08-21 10:47:47 +09:00
Hide_D 89faad730e 전투 로그 중 회피에 오타 수정 2018-08-21 09:29:28 +09:00
Hide_D 798ab3e183 암행부 병종 표기 버그 수정 2018-08-21 02:24:58 +09:00
Hide_D 5508aa4533 전투 엔진 버그 4차 수정 2018-08-21 02:22:29 +09:00
Hide_D 81b7ebbab6 전투 엔진 버그 3차 수정 2018-08-21 02:01:56 +09:00
Hide_D 2d06e33e10 운영자가 '지도'에서 도시를 클릭할 수 있도록 변경 2018-08-21 01:32:00 +09:00
Hide_D d8cc820572 전투 엔진 버그 2차 수정 2018-08-21 01:22:18 +09:00
Hide_D d0ca46cfde 전투 엔진 버그 1차 수정 2018-08-21 00:53:00 +09:00
Hide_D 513124161e 전투 종료 코드 구현(마무리?) 2018-08-20 23:57:36 +09:00
Hide_D 7cfd8c7f79 전투 종료 코드 구현(마무리?) 2018-08-20 22:26:34 +09:00
Hide_D c32ce5e795 전투 종료 코드 구현 2018-08-20 22:20:59 +09:00
Hide_D d9c1530651 일부 게임 유틸리티 함수 간소화 2018-08-20 20:21:26 +09:00
Hide_D 305eb071a9 전투 종료 코드 구현 2018-08-20 17:24:16 +09:00
Hide_D 10dab69c63 전투 구현 반영 2018-08-20 03:48:54 +09:00
Hide_D 60ed594996 전투 구현 반영 2018-08-20 03:46:59 +09:00
Hide_D e60ddb3ee1 전투 구현 반영 2018-08-20 03:14:56 +09:00
Hide_D 26b0992285 전투 구현 반영 2018-08-19 03:47:28 +09:00
Hide_D 63f3ac807c 전투 구현 반영 2018-08-19 03:45:43 +09:00
Hide_D ed1c33eac0 전투 구현 반영 2018-08-19 03:30:47 +09:00
Hide_D e7b7fd0bcc 치료가 '필살', '회피'와 중복 가능. 전특과 의술 아이템의 치료 효과 증폭 2018-08-19 03:00:08 +09:00
Hide_D 79d2b04721 전투 구현 반영 2018-08-19 02:57:25 +09:00
Hide_D 5a8ab2d29c 전투 구현 반영 2018-08-19 02:33:42 +09:00
Hide_D ed527ac394 전투 코드 반영 2018-08-18 23:18:40 +09:00
Hide_D bf09f48196 전투 구현 반영 2018-08-18 22:21:25 +09:00
Hide_D 2a5af15aef 전투 코드 반영 2018-08-18 21:24:02 +09:00
Hide_D 1f8fe35e25 성벽 전투시 깎이는 성벽이 기존 대비 1/2 2018-08-18 20:46:30 +09:00
Hide_D 5979273a64 코드 중간 반영 2018-08-18 20:45:59 +09:00
Hide_D ef8c9e3968 전투 엔진 중간 반영 2018-08-18 19:04:13 +09:00
Hide_D baa9fdb660 유틸리티 함수 추가 2018-08-18 16:59:34 +09:00
Hide_D 35a860bb38 충차 성벽 보정 버그 수정 2018-08-18 15:18:40 +09:00
Hide_D 286939dc2c CriticalScore2, getCrew 이동 2018-08-18 14:02:53 +09:00
Hide_D dd5b1dbdd8 전투 추가 구현 2018-08-18 10:53:04 +09:00
Hide_D fb8d3a038d 새 전투 엔진 중간 반영 2018-08-18 02:26:27 +09:00
Hide_D ea5a25a671 전투 파일 추가 작성중
전투 코드 추가 준비

추가 구현
2018-08-14 23:11:03 +09:00
Hide_D d21fc4ab1d 새 전투 엔진 준비 2018-08-12 22:23:53 +09:00
Hide_D 3ae3974866 수극 사용 로그 버그 수정 2018-08-12 13:25:24 +09:00
Hide_D 71ffc3087e 전투 공식 핫픽스 2018-08-11 08:49:23 +09:00
Hide_D 8f406489d4 전콘 용량을 30KB로 증가 2018-08-10 19:58:31 +09:00
Hide_D a08d270968 루드라사움 지도 업데이트 2018-08-10 02:22:31 +09:00
Hide_D 48f13e4b82 루드라사움 스탯 수정 2018-08-08 03:47:04 +09:00
Hide_D 51060f0e4b 루드라사움 지도 업데이트 2018-08-08 03:36:00 +09:00
Hide_D c583109046 루드라사움 패치 2018-08-08 03:21:42 +09:00
Hide_D cf05b693f1 엑셀 파일에 빙의 불가 장수 목록 개념 추가 2018-08-08 02:48:17 +09:00
Hide_D d248c1ab0d 빙의가 불가능한 general_neutral 항목 추가 2018-08-08 02:45:41 +09:00
Hide_D 34623fca94 이민족 코드를 5에서 9로 이동. 그에따른 추가 코드 변경 2018-08-08 02:31:49 +09:00
Hide_D 975bdd5897 토너먼트 중복 참가 방지. 자동 참가시 돈을 받지 않음 2018-08-08 01:54:57 +09:00
Hide_D 1b3380c2ca 성벽을 때렸을 때 차숙이 오르지 않는 버그 해결 2018-08-07 04:00:31 +09:00
Hide_D bb707b4a03 명성 / 계급 계산식을 for loop 없앰 2018-08-06 01:23:39 +09:00
Hide_D acb3b6ac85 물자 조달로 올라가는 명성, 계급의 양을 다른 내정과 비슷하게 변경 2018-08-06 00:46:22 +09:00
Hide_D 80f6985f5f 지도 툴팁 line break 없앰 2018-07-30 03:23:01 +09:00
Hide_D 5e3a9c0579 지도 툴팁 너비 수정 2018-07-30 02:13:46 +09:00
Hide_D b30d62d483 루도라사움 지도 위치 수정 2018-07-30 02:11:51 +09:00
Hide_D 0ea1fdbd19 지도 출력 변경 2018-07-30 02:07:02 +09:00
Hide_D f068586f74 지도를 변경 가능하도록 업데이트 2018-07-30 02:00:53 +09:00
Hide_D 463f462e24 j_map_history에서 year가 0인 경우 2018-07-30 01:47:33 +09:00
Hide_D e0c4e3c58e 장수 생성시 기본 타입 2018-07-30 01:42:42 +09:00
Hide_D 5aa3ef38ba 연감용 루드라사움 지도 추가 2018-07-30 01:34:39 +09:00
Hide_D 827277f6a3 버그 수정 2018-07-30 01:26:12 +09:00
Hide_D 46389341db 루드라사움을 위한 시스템 보정 2018-07-30 00:37:39 +09:00
Hide_D a58f05a295 에러메시지를 VSCode에서 바로 이동하기 쉽도록 변경 2018-07-29 23:43:36 +09:00
Hide_D c0b0a0fe92 루드라사움 지도 연결 수정 2018-07-29 23:41:35 +09:00
Hide_D e9f471dd6f Neo 루드라사움 준비 2018-07-29 23:26:19 +09:00
Hide_D 7917c5dddb 부대편성 버그 수정 2018-07-29 16:20:43 +09:00
Hide_D de4541a3d9 부대 편성 일부 수정 2018-07-29 13:57:10 +09:00
Hide_D 77a496baa7 암행부 추가 확장 2018-07-28 02:38:19 +09:00
Hide_D 86e863de09 암행부 너비 추가 수정 2018-07-28 02:33:42 +09:00
Hide_D c2cfd217c2 암행부 턴 표기 수정 2018-07-28 02:02:50 +09:00
Hide_D f2366a61b0 IE11 모병창 UI 버그 수정 2018-07-28 01:58:35 +09:00
Hide_D 9959393dee IE 메인페이지 깨짐 일부 수정 2018-07-28 01:38:53 +09:00
Hide_D 16facf98f1 submit_btn 버그 수정 2018-07-28 01:32:00 +09:00
Hide_D bc8ce8832a 모/징병 페이지 변경 2018-07-28 01:24:23 +09:00
Hide_D 20bcf960ef 로그인 페이지를 모바일에서도 조금 더 잘보이게 변경 2018-07-27 18:56:01 +09:00
Hide_D 5cecd3e995 로그인 페이지가 약관 등에 가리지 않도록 변경 2018-07-27 18:47:48 +09:00
Hide_D d7ead25ea4 1턴에 어쩌다 휴식턴이 입력되는 버그 수정 2018-07-27 18:14:16 +09:00
Hide_D 75c0c375d1 장수 호칭 변경 2018-07-27 03:03:25 +09:00
Hide_D 5db4913292 세력일람 장수 표기순 변경 2018-07-27 02:39:26 +09:00
Hide_D a6a53b1d0d Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-27 02:34:02 +09:00
Hide_D 81a0c0e120 세력일람 업데이트 2018-07-27 02:33:56 +09:00
Hide_D 0dae71a644 회피 디버그 수정 2018-07-26 17:13:27 +09:00
Hide_D f8eedaa3ea 전투 디버그 2018-07-26 15:40:46 +09:00
Hide_D ce2d97a7e7 전투 회피 코드 디버깅 적용 2018-07-26 15:39:34 +09:00
Hide_D 2cb570eaca foreach reference loop 버그 2018-07-26 00:12:12 +09:00
Hide_D c8c4352957 기존 도시/암행부 스크립트 통합. 2018-07-25 23:58:58 +09:00
Hide_D a311db4555 서버 관리 창에 에러 로그 보기 버튼 추가 2018-07-23 23:44:48 +09:00
Hide_D 05c515b2da j_map_history에서 fallback arg 제거 2018-07-23 23:30:53 +09:00
Hide_D c1acf2b0fe Trace의 모든 내용이 나오도록 수정 2018-07-23 23:26:32 +09:00
Hide_D 803a2407eb 에러 로그 보기 기능 추가 2018-07-23 23:19:39 +09:00
Hide_D a87945d1fb 에러 로그 업데이트 2018-07-23 22:54:06 +09:00
Hide_D 30793e68df 에러 로그용 클래스 설정 2018-07-23 22:50:22 +09:00
Hide_D 9c666bf7a9 FileDB 클래스 추가 2018-07-23 22:37:30 +09:00
Hide_D eff1dd7c34 라이브러리 업데이트 catfan/medoo 추가 2018-07-23 21:27:26 +09:00
Hide_D e79a33ebb0 NPC 군주의 호전성 추가(?) 2018-07-23 02:56:33 +09:00
Hide_D cb0adfdeaf npc attackable 보완 2018-07-23 02:50:58 +09:00
Hide_D 6b135c343c NPC의 선포 대상을 '국력'이 낮은 국가에 더 잘 하도록 변경 2018-07-23 01:49:43 +09:00
Hide_D 6c92db524b 선포 코드를 조금더 직관적으로 수정 2018-07-23 01:28:34 +09:00
Hide_D b8dfd1c041 징,모병시 민심이 떨어지지 않는 버그 수정 2018-07-22 15:39:53 +09:00
Hide_D 54d6347c1d 사령부 휴식 커맨드가 제대로 안보이는 문제 해결 2018-07-22 15:10:37 +09:00
Hide_D 4ea6e90600 연감에 serverID가 잘못된 경우 해결 2018-07-22 03:37:14 +09:00
Hide_D 4c7628a247 부대편성의 '집합' 확인 코드가 하드코딩인 부분 수정 2018-07-22 03:28:10 +09:00
revofpla 6c7334155a 필살확률 무조건 최소 50%인 버그 픽스 2018-07-21 13:49:15 +09:00
revofpla 480e3ea974 체섭 버그로 인한 핫픽스 1차
- 징병 숙련 100배 문제
 - 모병 비용 2배로 계산 안되는 문제
2018-07-21 13:12:52 +09:00
Hide_D 1f639a5bc6 애니집결 시나리오 번호 변경 2018-07-20 19:53:21 +09:00
Hide_D ccf3b07c3a 애니집결 업데이트 2018-07-20 19:51:11 +09:00
Hide_D d8508f2b72 충차가 1등급 되기만 하면 쓸 수 있던 버그 수정 2018-07-20 10:44:14 +09:00
Hide_D 5e13961ec8 protected인 자료에 접근해서 발생하는 문제 수정 2018-07-20 10:05:08 +09:00
Hide_D 80b1139371 버튼 너비 수정 2018-07-20 09:12:37 +09:00
Hide_D 635b41765c 계정 관리 창 살짝 넓힘 2018-07-20 09:08:04 +09:00
Hide_D 4b03686aa2 숙련 단련 버그 수정 2018-07-20 09:01:50 +09:00
Hide_D bfb0d8d639 message 템플릿 버그 수정 2018-07-20 00:06:03 +09:00
Hide_D 93d4a0211d 등용장의 경우에도 누를수 없는 경우 수정 2018-07-19 23:59:27 +09:00
Hide_D cd31bc69ef 추방 버그 수정 2018-07-19 23:13:05 +09:00
Hide_D 4a7b84d6de 외교 서신 레벨 지정 2018-07-19 22:19:26 +09:00
Hide_D 3142714c11 리셋 첫 해에는 추방해도 제약 없음 2018-07-19 21:25:00 +09:00
Hide_D 7ea10416a9 임관 권유 메시지 창 2018-07-19 21:03:42 +09:00
Hide_D 3e427db0f1 relativeYear에 음수 불가 2018-07-19 20:53:46 +09:00
Hide_D 9f7b18d294 시작 시 develcost가 0인 버그 해결 2018-07-19 20:50:29 +09:00
Hide_D 9af0e351b8 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-19 20:06:51 +09:00
Hide_D 5c6aa2340d 공백지 시나리오에 특기 연령 문제 해결 2018-07-19 20:06:39 +09:00
Hide_D 4424ec48cf 전투시 병종 명 버그 수정 2018-07-19 10:59:01 +09:00
Hide_D 61be34581e 반복 버튼 키움 2018-07-19 02:33:59 +09:00
Hide_D 731978356d Credit 양식 추가 2018-07-19 02:29:03 +09:00
Hide_D d5223ad1ab 리셋 시 사령부 Command encode가 제대로 이뤄지지 않았던 버그 수정 2018-07-19 01:42:16 +09:00
Hide_D 7cfdfab198 연감에서도 비교적 빠르게 동작하도록 설정 2018-07-19 01:31:13 +09:00
Hide_D eb70e51ac1 실시간 맵은 캐싱하도록 처리 2018-07-19 01:21:00 +09:00
Hide_D 1d48e7c7ae 영웅 난무 220 제목 변경 2018-07-19 00:51:47 +09:00
Hide_D d6fc9fc8c3 지도가 들어간 곳에 부트스트랩 추가 2018-07-19 00:46:15 +09:00
Hide_D 8ada0976fe 연감에 부트스트랩 없는 문제 해결 2018-07-19 00:44:01 +09:00
Hide_D 389ff5e9a4 지도에 도시명 켬끔 추가 2018-07-19 00:39:05 +09:00
Hide_D 5179e0228c 최대 스탯 표기 변경 2018-07-18 23:44:41 +09:00
Hide_D 2268526314 내 정보 페이지 툴팁 안나오는 문제 2018-07-18 23:14:52 +09:00
Hide_D db4bc0eafe 도시 좌표 업데이트 2018-07-18 23:11:02 +09:00
Hide_D 6edaf79df1 출력 병종 에러 2018-07-18 22:26:15 +09:00
Hide_D 79cead3b59 도시 css contain 2018-07-18 22:24:22 +09:00
Hide_D db1b12b85c 훈련에서 사기 하락 문구 삭제 2018-07-18 16:54:25 +09:00
Hide_D 9360b7675a 천인 강림 극 소형맵 2018-07-18 14:23:12 +09:00
Hide_D 9c82fd17fe 훈련시 사기 감소하지 않음 2018-07-18 11:18:33 +09:00
Hide_D 3a4665e473 맵 업데이트 2018-07-18 10:46:33 +09:00
Hide_D b34f4648ee 호로->사수, 몇몇 소성들 다시 진,수로 롤백 2018-07-18 10:41:06 +09:00
Hide_D 0de786d2ea 쿼리 받아오는 것 수정 2018-07-18 09:28:53 +09:00
Hide_D ec7aafa1ff history 받아오는 버그 수정 2018-07-18 09:28:10 +09:00
Hide_D 30c219716d 오타 수정 2018-07-18 09:08:20 +09:00
Hide_D 5dd47cb89b 오타수정 2018-07-18 09:05:36 +09:00
Hide_D abe856bd3f 버그 수정. 오타 수정 2018-07-18 08:24:09 +09:00
Hide_D 6ecb009466 오타 수정 2018-07-18 04:51:19 +09:00
Hide_D 3b4b2383a8 $me 버그 2018-07-18 04:50:17 +09:00
Hide_D 4ddd46c4a2 모병코드 2018-07-18 04:49:30 +09:00
Hide_D 69ec2469b4 쌀 검사 코드 2018-07-18 04:47:28 +09:00
Hide_D 5789af801a 징모병창 코스트 2018-07-18 04:44:12 +09:00
Hide_D 7171b6302b formattext 2018-07-18 04:41:08 +09:00
Hide_D 51d4818b1e gameStor 값 버그 2018-07-18 04:40:18 +09:00
Hide_D 1c2875e7fc 모병창 수정 2018-07-18 04:37:00 +09:00
Hide_D 5048a88310 징병창 우선 부활 2018-07-18 04:30:54 +09:00
Hide_D aef37f4362 징모병창 변수명 에러 2018-07-18 04:18:15 +09:00
Hide_D d04641041b 아이템 return 값 수정 2018-07-18 04:15:28 +09:00
Hide_D 67b2ccea86 급한대로 도시명 띄움 2018-07-18 04:10:07 +09:00
Hide_D 5ff9ca3c99 miniche가 최신 버전이 아닌 버그 수정 2018-07-18 03:44:32 +09:00
Hide_D fe55df8b2f 버그 체크 2018-07-18 03:41:45 +09:00
Hide_D 457f605898 버그 수정 2018-07-18 03:32:47 +09:00
Hide_D 0f2625133f 미니체 basemap 2018-07-18 03:05:36 +09:00
Hide_D fa34dbdf6f 초기 버그 수정 2018-07-18 03:04:59 +09:00
Hide_D 050913b0b4 영난 1c 2018-07-18 02:58:56 +09:00
Hide_D a47e47d42c 도시 정보 업데이트 2018-07-18 02:57:08 +09:00
Hide_D 43d994b59a credit 링크 추가 2018-07-18 02:31:15 +09:00
Hide_D e8204d46ce 커스텀 맵 준비 2018-07-18 00:25:51 +09:00
Hide_D fece659cfb 변수명 통일 2018-07-16 02:56:52 +09:00
Hide_D 695265b299 병종 코드를 GameUnitConst, GameUnitDetail에 기반하도록 변경 2018-07-16 02:54:47 +09:00
Hide_D b652ed0b33 병종 테이블에 상성 값 확장 2018-07-16 01:43:11 +09:00
Hide_D 9a641552e4 전투 코드 반영 중 2018-07-15 01:46:29 +09:00
Hide_D 3d18aeb5bc 징병, 모병 form 수정 2018-07-15 01:01:36 +09:00
Hide_D b545afce50 모병, 징병 코드 재 구현. 능력치 상승/감소 코드 재구현 2018-07-14 22:41:10 +09:00
Hide_D 8fca98c0c9 ActionLogger rollback 추가 2018-07-14 18:23:31 +09:00
Hide_D 0a98c71dfe 현재까지 작업물 보강, 모.징병 페이지 개선 중 2018-07-14 18:17:37 +09:00
Hide_D ed75f39094 ActionLogger 보강 2018-07-14 18:17:18 +09:00
Hide_D 456245f23a ActionLogger 추가 2018-07-14 17:53:08 +09:00
Hide_D b4529c9338 병종값 변경 2018-07-13 00:41:56 +09:00
Hide_D 0ca7a8ab8a 병종 테이블에 '병종 타입' 지정, 턴 커맨드를 json array로 변경 2018-07-13 00:12:12 +09:00
Hide_D 02f2209e8f GameConst에 mapName과 unitSet추가 2018-07-12 01:59:32 +09:00
Hide_D fb72d02912 d_setting 디렉도리 보관 방식 변경 2018-07-12 01:56:46 +09:00
Hide_D 665fb25fc1 기본 파일 추가 2018-07-12 01:02:28 +09:00
Hide_D 742c3c7156 맵 규격 재 정의 2018-07-12 01:00:24 +09:00
Hide_D 637dbbba0d 새 지도 준비를 위해 커밋 2018-07-12 00:20:43 +09:00
Hide_D f2a3bc4626 메시지함 높이 고정을 최소 높이로 변경 2018-07-11 23:49:57 +09:00
Hide_D e8ffa44544 메시지함 사라지는 버그 수정? 2018-07-11 23:04:38 +09:00
Hide_D bc09287666 도움 주신 분 임시 삭제. 나중에 Credit으로 되살리기로 2018-07-11 22:37:36 +09:00
Hide_D 392d9055fe td tr 되돌려놓음 2018-07-11 22:18:08 +09:00
Hide_D 0ee833d7ae list 일부 수정. tfoot 안에 tr td없는거 수정 2018-07-11 22:17:03 +09:00
Hide_D 3074bc00d7 지도 표기에서 box 표기 문제로 일부 수정 2018-07-11 22:04:20 +09:00
Hide_D cb6fb590c4 귀병, 환술 설명 수정 2018-07-11 21:53:13 +09:00
Hide_D a7270b2cd2 장수 성격, 아이템 설명 툴팁 추가 2018-07-11 21:50:01 +09:00
Hide_D 0d925af065 tooltip html trim 추가 2018-07-11 20:52:46 +09:00
Hide_D 7c7991e8ae 특기 없을 때 텍스트 수정 2018-07-11 20:51:13 +09:00
Hide_D 54461b6ea4 특기가 없는 경우에도 tooltip 띄우도록 2018-07-11 17:03:47 +09:00
Hide_D 6a17497fbd 빙의 시에도 전특 표기 2018-07-11 03:27:27 +09:00
Hide_D 84f18aa4b6 특기 전 페이지에 반영 2018-07-11 03:03:52 +09:00
Hide_D 73ab38563f 특기 마우스 오버 1차 적용 2018-07-11 02:47:31 +09:00
Hide_D 1f2b40e4d4 message form box sizing 변경. 메인 페이지에 bootstrap css 적용 2018-07-11 01:31:59 +09:00
Hide_D 1d920c5935 darkly 적용 2018-07-11 01:19:24 +09:00
Hide_D 037a1e9c0c 툴팁 준비 2018-07-11 01:15:22 +09:00
Hide_D 87e324d4d9 bootstrap 최신 버전으로 2018-07-11 01:15:02 +09:00
Hide_D d1e9b489e3 공성 전특 버그 수정. 전특 설명을 위한 텍스트 추가 2018-07-11 00:53:10 +09:00
Hide_D 34f1d538d1 세력도시에서 n장, m장 임명이 불가능한 버그 수정 2018-07-07 05:13:22 +09:00
Hide_D fb8d2a2e01 구버전 첩보 마이그레이션시 지도 표기 버그 수정 2018-07-07 04:58:19 +09:00
Hide_D 837db5183e 첩보를 join '|' 에서 json dict로 변경 2018-07-07 04:39:44 +09:00
Hide_D a556877a17 현재 진행중인 깃수인 경우 장수가 안 죽었으면 안나타나는 문제 해결 2018-07-05 00:24:03 +09:00
Hide_D bcbd6dc4db 왕조일람 버그 수정 2018-07-05 00:12:34 +09:00
Hide_D 41f7ad8d75 왕조 일람에 아무것도 없을 때 '현재'가 안보이는 문제 해결 2018-07-05 00:10:33 +09:00
Hide_D 258d4b28da 왕조 일람에 현재 국가 표시 2018-07-05 00:05:48 +09:00
Hide_D 31e900c422 메시지 버그 수정 2018-07-03 22:09:07 +09:00
Hide_D 7b1a76871a parseJsonPost 기반 동작 포기 2018-07-03 21:35:17 +09:00
Hide_D c6f3e7672f 국가 정보 빈칸 2018-07-03 20:48:34 +09:00
Hide_D 540c31903c 월마다 최대 국력, 최대 병력, 최대 도시 수를 계산하는 코드 추가. ng_old_nations에도 반영 2018-07-03 20:43:14 +09:00
Hide_D 3e5262d7a3 nation 테이블에 aux 추가 2018-07-03 20:09:36 +09:00
Hide_D 2b36ffef45 왕조일람 임시 갱신 2018-07-03 06:59:27 +09:00
Hide_D 4c25d2275c 버튼 대체 css 추가. form 일부 제거 2018-07-03 02:55:45 +09:00
Hide_D 6c66fcdfc3 명예의 전당 시나리오명 제대로 표기 안되는 문제 해결 2018-07-02 19:45:41 +09:00
Hide_D aaa972d767 명예의 전당 배경색 오류 수정 2018-07-02 19:15:43 +09:00
Hide_D 45c8538426 빙의 해제시 닉네임 초기화 2018-07-02 03:23:20 +09:00
Hide_D 95702724a9 베팅수익률 오타 2018-07-01 15:34:20 +09:00
Hide_D 98c4d3853c 명장 일람 레퍼런스 값 미표기 문제 해결 2018-07-01 15:30:15 +09:00
Hide_D 7c91143f39 명장일람에서 제약 조건 수정 2018-07-01 15:27:41 +09:00
Hide_D 56e6f57568 회원 가입시 링크 변경 2018-07-01 03:58:47 +09:00
Hide_D ccab456679 세력도시 스크립트 동작 안하는 문제 해결 2018-07-01 01:35:47 +09:00
Hide_D 5af000ca43 html 5 비표준 스크립트 제거 2018-07-01 01:28:35 +09:00
Hide_D 354c8f04ae IE=edge 대소문자 주의 2018-06-30 01:52:07 +09:00
Hide_D 3fbd336b45 Revert "컬러 프로필 적용"
This reverts commit 4f279c49c8.
2018-06-30 01:32:46 +09:00
Hide_D 3c0b86a322 컬러 프로필 적용 2018-06-30 01:26:23 +09:00
Hide_D fca4b69d5a 범장 -> 만능장 2018-06-30 01:18:52 +09:00
Hide_D ce62072761 확장 스크립트를 위해 태그 일부 정리 2018-06-30 00:28:45 +09:00
Hide_D 93dd7a8478 extractMissingPostToGlobals 호환을 위해 server_id 인자명 변경 2018-06-29 16:23:48 +09:00
Hide_D 02fb84a312 font boosting 약화 2018-06-29 14:46:06 +09:00
Hide_D f3e68989e5 뷰포트 추가 지정 2018-06-29 14:41:09 +09:00
Hide_D 468050a9ce 뷰포트 크기 변경 2018-06-29 14:37:30 +09:00
Hide_D f37a602da3 모든 웹 페이지에 viewport 지정 2018-06-29 14:32:59 +09:00
Hide_D 2979691d7e 기본 폰트 크기 지정 2018-06-29 14:20:20 +09:00
Hide_D 72920a0432 unset대신 []로 초기화 2018-06-29 09:35:24 +09:00
Hide_D e81075ef04 history 함수 인자 제한 완화 2018-06-29 09:28:58 +09:00
Hide_D df1a99d877 기본 폰트 지정 2018-06-29 09:16:40 +09:00
Hide_D 10e825dc9f 예약 테이블 점검. 스키마 수정 2018-06-29 01:50:28 +09:00
Hide_D 07ba7933fb 토너먼트 inf 버그 수정 2018-06-29 01:25:43 +09:00
Hide_D 3059eac0fd jquery 버전 업데이트 2018-06-29 01:22:03 +09:00
Hide_D aa33aa6d4f Json 에러시 에러 표기하도록 2018-06-29 00:30:05 +09:00
Hide_D 0a1cdeeaa3 세력일람 코드 변경 2018-06-28 14:16:38 +09:00
Hide_D e4bef47b7e 세력일람 연동 2018-06-28 14:14:56 +09:00
Hide_D f551f994b5 세력도시 코드 일단 통합 2018-06-28 13:57:21 +09:00
Hide_D 4b7a3af691 IE에서 카카오 2018-06-28 13:39:58 +09:00
Hide_D 6f88a80118 randBool이 아니라 randF 써서 생기는 버그 수정 2018-06-28 01:57:41 +09:00
Hide_D e03715ee46 천통 안되는 버그 수정 2018-06-28 00:28:00 +09:00
Hide_D aafe6d8863 천통시 저장되는 데이터 변경 2018-06-27 03:43:01 +09:00
Hide_D 47005483cd 버그 수정 2018-06-27 03:05:39 +09:00
Hide_D 378075955a 서버 오픈시 천통국 체크가 이상한 버그 수정 2018-06-27 03:04:54 +09:00
Hide_D 2059797904 사망, 천통시 장수를 ng_old_generals에 보관 2018-06-27 02:53:58 +09:00
Hide_D 8c711242a9 왕조 일람에 연감을 볼 수 있도록 통합 2018-06-27 02:12:59 +09:00
Hide_D 481894c89b 모든 국가 멸망 케이스에 ng_old_nations 백업 추가 2018-06-27 01:55:28 +09:00
Hide_D ba53275322 천통시 깃수 자동 표기 2018-06-27 01:49:46 +09:00
Hide_D cfe2b4c1bd 사소한 코드 수정 2018-06-27 01:34:11 +09:00
Hide_D 60e83f8324 오타 수정 2018-06-27 01:26:02 +09:00
Hide_D ceac040d82 명전에 0 이하는 안받도록 변경 2018-06-27 01:25:50 +09:00
Hide_D 89d400c81a 연감 월 표기 버그 수정 2018-06-27 01:22:16 +09:00
Hide_D 4cf7bca399 왕조 일람에서 서버 정보와 국가 정보를 보관하도록 변경 2018-06-27 01:14:34 +09:00
Hide_D 761441622e 왕조일람 '전체보기' 기능 살림 2018-06-26 23:05:04 +09:00
Hide_D 1b814abf0b 천통 시 왕조 일람용 테이블에 server_id 기록. 연감에 server_id로 이전 연감 조회기능 추가 2018-06-26 23:01:43 +09:00
Hide_D 62a2147e33 천통국 정상 추가 2018-06-26 22:45:47 +09:00
Hide_D 246dff9c87 명장일람 버그? 2018-06-26 16:27:51 +09:00
Hide_D 50494beb27 명장 일람 보정 시도 2018-06-26 16:21:47 +09:00
Hide_D ce3b3ebfd8 명장 일람, 설전 승률 % 표기 오류 2018-06-26 16:18:58 +09:00
Hide_D 213090c32e 오타 수정 2018-06-26 09:45:15 +09:00
Hide_D adb8668197 크롬과 파이어폭스에 최적화 2018-06-26 09:44:26 +09:00
Hide_D 0023677003 임관 권유문 길이 제한 2018-06-26 04:13:41 +09:00
Hide_D 0b19a37ad4 초반 3년 수뇌 임명 방식 변경 2018-06-26 03:52:17 +09:00
Hide_D 9f34ae5d28 천통시 재야 장수도 저장 2018-06-26 03:33:56 +09:00
Hide_D 6f07b5cf08 ng_games에 시나리오명 남도록 수정 2018-06-26 03:20:57 +09:00
Hide_D 0f39431157 chmod 재설정 2018-06-26 03:19:47 +09:00
Hide_D bc1a470e64 디렉토리 권한 문제 해결 2018-06-26 03:15:38 +09:00
Hide_D 09e24f5684 ng_games 누락분 추가 2018-06-26 03:10:50 +09:00
Hide_D 2f27ea4c8a schema 값 꼬이는 문제 해결 2018-06-26 03:06:34 +09:00
Hide_D d09aba70b7 천통시에도 ng_old_nations에 데이터가 저장되도록 변경 2018-06-26 03:00:02 +09:00
Hide_D 69b0a80684 명장 일람, 명예의 전당 최종 개선 2018-06-26 02:36:20 +09:00
Hide_D 48f0c56a9e 국가 멸망시 국가 정보 백업 2018-06-26 00:47:54 +09:00
Hide_D 83833a3693 등용장 및 메시지 일괄 전송 TODO 해결 2018-06-26 00:45:31 +09:00
Hide_D 18429d52d4 명장 일람, 명예의 전당 코드 재구현. 연감 등에 이전 국가 기록 남기도록 설정 2018-06-26 00:32:43 +09:00
Hide_D 58cc90083b 서버 별명에 연월일 추가 2018-06-25 16:08:19 +09:00
Hide_D 2772161144 왕조 일람 테이블 구조 변경. 2018-06-25 01:53:16 +09:00
Hide_D 0e95259b14 게임 오픈 시 logs에 서브 디렉토리를 사용하도록 변경 2018-06-25 01:45:23 +09:00
Hide_D 3d9f38f1e3 건국 등 문자열 입력 변경 2018-06-25 00:46:07 +09:00
Hide_D ba3accd834 스페이스 바 등 몇몇 문자열 가능하게 처리 & 문자열 보정 2018-06-24 04:44:34 +09:00
Hide_D 0786e40ebd 국방 표기 변경 2018-06-24 04:18:54 +09:00
Hide_D 8a56393159 임관 권유 메시지를 템플릿으로 이동 2018-06-24 04:12:19 +09:00
Hide_D 5ca8a6ecfa purifier 1차 적용 2018-06-24 03:47:44 +09:00
Hide_D 5c82edc4be html purifier 보강 2018-06-24 02:56:38 +09:00
Hide_D 093c04bc24 포상 계수 조절 2018-06-23 23:49:22 +09:00
Hide_D 131dd46a38 무지장의 경우에는 쌀 적게 주도록 수정 2018-06-23 22:58:11 +09:00
Hide_D 6b1b4fdfbb 베팅 표기 오류 변경 2018-06-23 22:55:59 +09:00
Hide_D e4ad779b37 npc 발령 로직 변경. 유저 무지장 포상 로직 변경 2018-06-23 22:52:43 +09:00
Hide_D 65d817624e 인사부 조건 검사 순서 변경 2018-06-23 14:36:05 +09:00
Hide_D 66501189c4 적극적 금쌀 교환 2018-06-23 14:22:41 +09:00
Hide_D 4303898bb8 금쌀 계수 조정 2018-06-23 14:10:52 +09:00
Hide_D 7d76a9d3ed 인사부 임명 해제 불가 버그 수정 2018-06-23 13:28:36 +09:00
Hide_D 1cc42f341b 내정, 전투 기준 일부 변경 2018-06-23 13:08:16 +09:00
Hide_D 0b41ee0a29 내정 발령시 내정 찬곳으로는 안함 2018-06-23 12:57:11 +09:00
Hide_D 66b6c4d04f query 간소화 2018-06-23 05:37:34 +09:00
Hide_D 6502843d6c 포상 전략 변경 2018-06-23 05:22:49 +09:00
Hide_D 5ecfe72e19 발령 전략 변경 2018-06-23 05:06:10 +09:00
Hide_D f28cdefffe npc 발령 전략 변경 2018-06-23 05:00:57 +09:00
Hide_D 40494f2cf1 전방 설정을 5개월 내로 변경 2018-06-23 04:51:07 +09:00
Hide_D f2664c112b NPC 사령턴 로직 새로 작성 2018-06-23 04:45:27 +09:00
Hide_D 41d91df355 상인 거래시 110% 가 잘 적용되도록 변경. 삭제된 거상 문구 수정 2018-06-23 02:23:06 +09:00
Hide_D 965671dd93 key,value pair를 보존한 섞기 추가 2018-06-23 02:22:49 +09:00
Hide_D c8d08e4b2c 저격 특기, 활 유니크, 수극 확률이 각각 적용되도록 수정 2018-06-23 02:22:32 +09:00
Hide_D 2897a9b484 환상향 시나리오 전콘 방식 재 적용 2018-06-21 20:16:01 +09:00
Hide_D d190e59d83 장수 등록시 최저 스탯이 10으로 표시되는 버그 수정 2018-06-21 02:55:52 +09:00
Hide_D 0bb25e8773 천인 강림 개선 2018-06-21 02:47:29 +09:00
Hide_D 37e1903cb1 HTML Purifier 추가 2018-06-21 02:27:02 +09:00
Hide_D b402846d43 PHP 7.2 버전용으로 올림! 2018-06-21 02:17:31 +09:00
Hide_D c1a6dd385a 설문 제목이 제대로 표시되지 않는 버그 수정 2018-06-19 02:42:55 +09:00
Hide_D ccbef236d3 업데이트 기능 추가 2018-06-19 02:11:17 +09:00
Hide_D d7b9e8b2e0 투표 동작 방식 변경 2018-06-19 01:49:16 +09:00
Hide_D deaf77d3d0 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-06-19 01:42:46 +09:00
Hide_D 5c738f97ed 투표 권한 추가 2018-06-19 01:42:40 +09:00
Hide_D c9f7f7ab08 공지 수정 불가능한 버그 수정 2018-06-18 10:11:56 +09:00
Hide_D 746977d5d0 서버 열단, 리셋 부분 권한 추가 2018-06-18 03:21:52 +09:00
Hide_D acb09bfe71 시나리오 생성시 잘못된 도시를 입력한 경우에도 정상 빌드되도록 수정 2018-06-18 02:23:30 +09:00
Hide_D e2a1203b43 시나리오 두개 수정 2018-06-18 02:01:45 +09:00
Hide_D 124036cea6 npc 생성시 전콘이 있는지 확인하는 코드 추가. 걸그룹 대전 변경 2018-06-16 11:01:12 +09:00
Hide_D 2ac1d82826 buildScoutMessage에서 null 반환 가능하던 문제 수정 2018-06-16 00:42:48 +09:00
Hide_D fa4e0c1948 이미지 주소 기반 자동 NPC 전콘 설정 기능 추가. 루드라사움 추가 2018-06-15 03:32:37 +09:00
Hide_D 735427ead0 기본 iconPath 설정 2018-06-15 02:18:44 +09:00
Hide_D 4fa99a7e1b 변환 코드를 v3에 맞게 변경 2018-06-15 02:17:07 +09:00
Hide_D 2f963a205a 등용장 안 받아지는 버그 수정 2018-06-14 02:41:36 +09:00
Hide_D 1f03f7e7c3 빙의 모드에서 장수 칸 여유있게 2018-06-14 02:00:09 +09:00
Hide_D 31689fb6ba processCommand에 affinity 없는 버그 수정, 등용장 못받는 버그 수정 2018-06-14 01:57:28 +09:00
Hide_D cf7ebbd314 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-06-14 01:49:22 +09:00
Hide_D 40a953aed5 storage의 isunited 변수 문제 2018-06-14 01:49:15 +09:00
revofpla c4d999ada7 가상시나리오 16(애니집결) 추가 2018-06-13 17:46:34 +09:00
Hide_D fff6b4e155 개전시 조사 버그 2018-06-13 10:20:48 +09:00
Hide_D 380e08d89f 랜임시 장수수를 셀 때 유저장, 빙의장, n장만 카운트하도록 변경 2018-06-13 04:17:18 +09:00
Hide_D 96c8199092 거병 확률 최종 수정 2018-06-13 03:50:51 +09:00
Hide_D 54870cf067 거병 확률 재 수정 2018-06-13 03:29:09 +09:00
Hide_D 8654447aac 추방 기준을 3년 이내로 재 변경 2018-06-13 03:28:11 +09:00
Hide_D 28a690cbba 추방 후 임관 확률 재 조정 2018-06-13 03:27:08 +09:00
Hide_D 52d1a48c0b 거병 확률 변경. NPC 임관 확률 추가 변경 2018-06-13 03:21:55 +09:00
Hide_D f45333db5e 임관 속도 조정 2018-06-13 03:06:30 +09:00
Hide_D c920e45934 임관 시도 확률 변경, NPC 랜임시 부상 패널티 약화 2018-06-13 02:51:39 +09:00
Hide_D dd86ef4591 걸그룹 시나리오 수정, NPC 임관 확률 대폭 감소 2018-06-13 02:45:00 +09:00
Hide_D b9fb00f042 npc 거병 확률 수정 2018-06-13 02:29:37 +09:00
Hide_D 355d9fd995 거병 확률 계수 변경 2018-06-13 02:24:52 +09:00
Hide_D b68c13c4f2 임관시 $general['nations'] 를 Json Array로 변경 2018-06-13 02:21:31 +09:00
Hide_D f2803291ab 일부 브라우저에서 명령창 줄 넘어감 방지 2018-06-13 00:53:31 +09:00
Hide_D 54df034c77 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-06-12 22:28:10 +09:00
Hide_D 7317b8bc18 JosaUtil 응급 대응 2018-06-12 13:05:22 +09:00
3889 changed files with 560903 additions and 21556 deletions
+8 -5
View File
@@ -5,6 +5,8 @@
!.vscode/extensions.json
/node_modules
package-lock.json
# 체섭 ignore
*.log
@@ -17,7 +19,10 @@ sess_*
*/logs/*/*.txt
*/logs/preserved
err.txt
che/.htaccess
kwe/.htaccess
pwe/.htaccess
twe/.htaccess
hwe/.htaccess
d_shared
@@ -54,13 +59,11 @@ test.*
/pya
/twe
/hwe/data
/vendor
phpinfo.php
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
*.sqlite3
ingame/js/*
ingame/css/*
gateway/js/*
gateway/css/*
gateway/css/*
-12
View File
@@ -1,12 +0,0 @@
{
"extension": ["ts"],
"spec": "hwe/test-ts/**/*.test.ts",
"require": [
"ts-node/register",
"tsconfig-paths/register"
],
"node-option": [
"experimental-specifier-resolution=node",
"loader=ts-node/esm"
]
}
+2 -2
View File
@@ -13,7 +13,7 @@
"/nya":true,
"/pya":true,
"/twe":true,
},
"search.exclude": {
"e_lib/*":true,
@@ -28,5 +28,5 @@
"cSpell.words": [
"josa",
"sammo"
]
],
}
+4 -4
View File
@@ -26,20 +26,20 @@ Docker를 이용한 설치도 제공하고 있습니다.
## Docker를 이용한 설치
https://storage.hided.net/gitea/devsam/docker 를 참고해 주세요.
https://storage.hided.net/gogs/devsam/docker 를 참고해 주세요.
## 수동 설치
본 게임은 <code>git</code>을 이용한 업그레이드 시스템을 구현하였으므로, <code>git</code>이 필요합니다.
또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>)에게 디렉토리 권한이 주어져야합니다.
또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>, <code>apache</code>)에게 디렉토리 권한이 주어져야합니다.
### 다운로드
웹 데몬 user가 <code>www-data</code>인 경우 다음과 같이 입력하여 최신 배포버전과 이미지 파일을 얻을 수 있습니다.
```
sudo -u www-data git clone https://storage.hided.net/gitea/devsam/core.git
sudo -u www-data git clone https://storage.hided.net/gitea/devsam/image.git
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/core.git
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/image.git
```
> 이미지는 hook/git_hook.php을 통해 동기화되며, 서버 설치 과정에 이미지 갱신 키를 지정하는 것으로 '훼' 서버 업데이트 시 동기화됩니다. 이미지 서버가 게임 서버와 별개여도 동작하나, php와 git을 지원해야합니다.
+1 -1
View File
@@ -9,4 +9,4 @@ if (!class_exists('\\sammo\\RootDB')) {
Json::dieWithReason('No DB');
}
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
APIHelper::launch(dirname(__FILE__));
+4 -5
View File
@@ -35,22 +35,21 @@
"autoload": {
"psr-4": {
"sammo\\": [
"d_setting",
"src/sammo"
],
"kakao\\": [
"d_setting",
"src/kakao"
]
},
"classmap": [
"d_setting/"
],
"exclude-from-classmap": [
"**/*.orig.php"
],
"files":[
"f_config/config.php"
]
},
"require-dev": {
"phpunit/phpunit": "^9.5"
}
}
Generated
+2 -1799
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "2b7ec5f1a1a908310f3d032f294eacec",
"content-hash": "1983b89436fd8017db508592ddf542e4",
"packages": [
{
"name": "brandonwamboldt/utilphp",
@@ -4228,1804 +4228,7 @@
"time": "2019-08-07T17:19:21+00:00"
}
],
"packages-dev": [
{
"name": "doctrine/instantiator",
"version": "1.4.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
"reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"doctrine/coding-standard": "^8.0",
"ext-pdo": "*",
"ext-phar": "*",
"phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
"phpstan/phpstan": "^0.12",
"phpstan/phpstan-phpunit": "^0.12",
"phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Marco Pivetta",
"email": "ocramius@gmail.com",
"homepage": "https://ocramius.github.io/"
}
],
"description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
"homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
"constructor",
"instantiate"
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
"source": "https://github.com/doctrine/instantiator/tree/1.4.0"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
"type": "tidelift"
}
],
"time": "2020-11-10T18:47:58+00:00"
},
{
"name": "myclabs/deep-copy",
"version": "1.10.2",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
"reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"replace": {
"myclabs/deep-copy": "self.version"
},
"require-dev": {
"doctrine/collections": "^1.0",
"doctrine/common": "^2.6",
"phpunit/phpunit": "^7.1"
},
"type": "library",
"autoload": {
"files": [
"src/DeepCopy/deep_copy.php"
],
"psr-4": {
"DeepCopy\\": "src/DeepCopy/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"description": "Create deep copies (clones) of your objects",
"keywords": [
"clone",
"copy",
"duplicate",
"object",
"object graph"
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
"source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
},
"funding": [
{
"url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
"type": "tidelift"
}
],
"time": "2020-11-13T09:40:50+00:00"
},
{
"name": "nikic/php-parser",
"version": "v4.13.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077",
"reference": "210577fe3cf7badcc5814d99455df46564f3c077",
"shasum": ""
},
"require": {
"ext-tokenizer": "*",
"php": ">=7.0"
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
"phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
},
"bin": [
"bin/php-parse"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.9-dev"
}
},
"autoload": {
"psr-4": {
"PhpParser\\": "lib/PhpParser"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Nikita Popov"
}
],
"description": "A PHP parser written in PHP",
"keywords": [
"parser",
"php"
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
"source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2"
},
"time": "2021-11-30T19:35:32+00:00"
},
{
"name": "phar-io/manifest",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/phar-io/manifest.git",
"reference": "97803eca37d319dfa7826cc2437fc020857acb53"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
"reference": "97803eca37d319dfa7826cc2437fc020857acb53",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-phar": "*",
"ext-xmlwriter": "*",
"phar-io/version": "^3.0.1",
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0.x-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
"support": {
"issues": "https://github.com/phar-io/manifest/issues",
"source": "https://github.com/phar-io/manifest/tree/2.0.3"
},
"time": "2021-07-20T11:28:43+00:00"
},
{
"name": "phar-io/version",
"version": "3.2.1",
"source": {
"type": "git",
"url": "https://github.com/phar-io/version.git",
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
},
{
"name": "Sebastian Heuer",
"email": "sebastian@phpeople.de",
"role": "Developer"
},
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "Developer"
}
],
"description": "Library for handling version information and constraints",
"support": {
"issues": "https://github.com/phar-io/version/issues",
"source": "https://github.com/phar-io/version/tree/3.2.1"
},
"time": "2022-02-21T01:04:05+00:00"
},
{
"name": "phpspec/prophecy",
"version": "v1.15.0",
"source": {
"type": "git",
"url": "https://github.com/phpspec/prophecy.git",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.2",
"php": "^7.2 || ~8.0, <8.2",
"phpdocumentor/reflection-docblock": "^5.2",
"sebastian/comparator": "^3.0 || ^4.0",
"sebastian/recursion-context": "^3.0 || ^4.0"
},
"require-dev": {
"phpspec/phpspec": "^6.0 || ^7.0",
"phpunit/phpunit": "^8.0 || ^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.x-dev"
}
},
"autoload": {
"psr-4": {
"Prophecy\\": "src/Prophecy"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com",
"homepage": "http://everzet.com"
},
{
"name": "Marcello Duarte",
"email": "marcello.duarte@gmail.com"
}
],
"description": "Highly opinionated mocking framework for PHP 5.3+",
"homepage": "https://github.com/phpspec/prophecy",
"keywords": [
"Double",
"Dummy",
"fake",
"mock",
"spy",
"stub"
],
"support": {
"issues": "https://github.com/phpspec/prophecy/issues",
"source": "https://github.com/phpspec/prophecy/tree/v1.15.0"
},
"time": "2021-12-08T12:19:24+00:00"
},
{
"name": "phpunit/php-code-coverage",
"version": "9.2.14",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f4d60b6afe5546421462b76cd4e633ebc364ab4",
"reference": "9f4d60b6afe5546421462b76cd4e633ebc364ab4",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
"nikic/php-parser": "^4.13.0",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
"sebastian/code-unit-reverse-lookup": "^2.0.2",
"sebastian/complexity": "^2.0",
"sebastian/environment": "^5.1.2",
"sebastian/lines-of-code": "^1.0.3",
"sebastian/version": "^3.0.1",
"theseer/tokenizer": "^1.2.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcov": "*",
"ext-xdebug": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.2-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
"homepage": "https://github.com/sebastianbergmann/php-code-coverage",
"keywords": [
"coverage",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.14"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-28T12:38:02+00:00"
},
{
"name": "phpunit/php-file-iterator",
"version": "3.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
"reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "FilterIterator implementation that filters files based on a list of suffixes.",
"homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
"keywords": [
"filesystem",
"iterator"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
"source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-12-02T12:48:52+00:00"
},
{
"name": "phpunit/php-invoker",
"version": "3.1.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"ext-pcntl": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-pcntl": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Invoke callables with a timeout",
"homepage": "https://github.com/sebastianbergmann/php-invoker/",
"keywords": [
"process"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-invoker/issues",
"source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:58:55+00:00"
},
{
"name": "phpunit/php-text-template",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Simple template engine.",
"homepage": "https://github.com/sebastianbergmann/php-text-template/",
"keywords": [
"template"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
"source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T05:33:50+00:00"
},
{
"name": "phpunit/php-timer",
"version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Utility class for timing",
"homepage": "https://github.com/sebastianbergmann/php-timer/",
"keywords": [
"timer"
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
"source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:16:10+00:00"
},
{
"name": "phpunit/phpunit",
"version": "9.5.16",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
"reference": "5ff8c545a50226c569310a35f4fa89d79f1ddfdc",
"shasum": ""
},
"require": {
"doctrine/instantiator": "^1.3.1",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
"myclabs/deep-copy": "^1.10.1",
"phar-io/manifest": "^2.0.3",
"phar-io/version": "^3.0.2",
"php": ">=7.3",
"phpspec/prophecy": "^1.12.1",
"phpunit/php-code-coverage": "^9.2.13",
"phpunit/php-file-iterator": "^3.0.5",
"phpunit/php-invoker": "^3.1.1",
"phpunit/php-text-template": "^2.0.3",
"phpunit/php-timer": "^5.0.2",
"sebastian/cli-parser": "^1.0.1",
"sebastian/code-unit": "^1.0.6",
"sebastian/comparator": "^4.0.5",
"sebastian/diff": "^4.0.3",
"sebastian/environment": "^5.1.3",
"sebastian/exporter": "^4.0.3",
"sebastian/global-state": "^5.0.1",
"sebastian/object-enumerator": "^4.0.3",
"sebastian/resource-operations": "^3.0.3",
"sebastian/type": "^2.3.4",
"sebastian/version": "^3.0.2"
},
"require-dev": {
"ext-pdo": "*",
"phpspec/prophecy-phpunit": "^2.0.1"
},
"suggest": {
"ext-soap": "*",
"ext-xdebug": "*"
},
"bin": [
"phpunit"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "9.5-dev"
}
},
"autoload": {
"files": [
"src/Framework/Assert/Functions.php"
],
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "The PHP Unit Testing framework.",
"homepage": "https://phpunit.de/",
"keywords": [
"phpunit",
"testing",
"xunit"
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
"source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.16"
},
"funding": [
{
"url": "https://phpunit.de/sponsors.html",
"type": "custom"
},
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-23T17:10:58+00:00"
},
{
"name": "sebastian/cli-parser",
"version": "1.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for parsing CLI options",
"homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
"issues": "https://github.com/sebastianbergmann/cli-parser/issues",
"source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:08:49+00:00"
},
{
"name": "sebastian/code-unit",
"version": "1.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
"reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the PHP code units",
"homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit/issues",
"source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:08:54+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
"version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Looks up which function or method a line of code belongs to",
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
"source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:30:19+00:00"
},
{
"name": "sebastian/comparator",
"version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
"reference": "55f4261989e546dc112258c7a75935a81a7ce382",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/diff": "^4.0",
"sebastian/exporter": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@2bepublished.at"
}
],
"description": "Provides the functionality to compare PHP values for equality",
"homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
"equality"
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
"source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:49:45+00:00"
},
{
"name": "sebastian/complexity",
"version": "2.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
"reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.7",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for calculating the complexity of PHP code units",
"homepage": "https://github.com/sebastianbergmann/complexity",
"support": {
"issues": "https://github.com/sebastianbergmann/complexity/issues",
"source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T15:52:27+00:00"
},
{
"name": "sebastian/diff",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Kore Nordmann",
"email": "mail@kore-nordmann.de"
}
],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
"diff",
"udiff",
"unidiff",
"unified diff"
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
"source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:10:38+00:00"
},
{
"name": "sebastian/environment",
"version": "5.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
"reference": "388b6ced16caa751030f6a69e588299fa09200ac"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
"reference": "388b6ced16caa751030f6a69e588299fa09200ac",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.1-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
"homepage": "http://www.github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
"hhvm"
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
"source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T05:52:38+00:00"
},
{
"name": "sebastian/exporter",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-mbstring": "*",
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
},
{
"name": "Bernhard Schussek",
"email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
"homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
"source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-11-11T14:18:36+00:00"
},
{
"name": "sebastian/global-state",
"version": "5.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-dom": "*",
"phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-uopz": "*"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "5.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Snapshotting of global state",
"homepage": "http://www.github.com/sebastianbergmann/global-state",
"keywords": [
"global state"
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
"source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2022-02-14T08:28:10+00:00"
},
{
"name": "sebastian/lines-of-code",
"version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
"shasum": ""
},
"require": {
"nikic/php-parser": "^4.6",
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library for counting the lines of code in PHP source code",
"homepage": "https://github.com/sebastianbergmann/lines-of-code",
"support": {
"issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
"source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-11-28T06:42:11+00:00"
},
{
"name": "sebastian/object-enumerator",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
"reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
"php": ">=7.3",
"sebastian/object-reflector": "^2.0",
"sebastian/recursion-context": "^4.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Traverses array structures and object graphs to enumerate all referenced objects",
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
"source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:12:34+00:00"
},
{
"name": "sebastian/object-reflector",
"version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Allows reflection of object attributes, including inherited and non-public ones",
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
"source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:14:26+00:00"
},
{
"name": "sebastian/recursion-context",
"version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
"reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
},
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
}
],
"description": "Provides functionality to recursively process PHP variables",
"homepage": "http://www.github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
"source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-10-26T13:17:30+00:00"
},
{
"name": "sebastian/resource-operations",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
}
],
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
"issues": "https://github.com/sebastianbergmann/resource-operations/issues",
"source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:45:17+00:00"
},
{
"name": "sebastian/type",
"version": "2.3.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914",
"reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"require-dev": {
"phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.3-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Collection of value objects that represent the types of the PHP type system",
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
"source": "https://github.com/sebastianbergmann/type/tree/2.3.4"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2021-06-15T12:49:02+00:00"
},
{
"name": "sebastian/version",
"version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
"reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
"reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
"php": ">=7.3"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de",
"role": "lead"
}
],
"description": "Library that helps with managing the version number of Git-hosted PHP projects",
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
"source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
"funding": [
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
}
],
"time": "2020-09-28T06:39:44+00:00"
},
{
"name": "theseer/tokenizer",
"version": "1.2.1",
"source": {
"type": "git",
"url": "https://github.com/theseer/tokenizer.git",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
"reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-tokenizer": "*",
"ext-xmlwriter": "*",
"php": "^7.2 || ^8.0"
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
],
"authors": [
{
"name": "Arne Blankerts",
"email": "arne@blankerts.de",
"role": "Developer"
}
],
"description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
"support": {
"issues": "https://github.com/theseer/tokenizer/issues",
"source": "https://github.com/theseer/tokenizer/tree/1.2.1"
},
"funding": [
{
"url": "https://github.com/theseer",
"type": "github"
}
],
"time": "2021-07-28T10:34:58+00:00"
}
],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
"stability-flags": [],
Regular → Executable
BIN
View File
Binary file not shown.
-5
View File
@@ -2,11 +2,6 @@
namespace sammo;
if(!file_exists(__DIR__ . '/../vendor/autoload.php')){
http_response_code(503);
die('not_ready');
}
require(__DIR__ . '/../vendor/autoload.php');
if (!class_exists('\\sammo\\RootDB')) {
+1 -1
View File
@@ -118,7 +118,7 @@ $nations = $history['nations'];
var lastMonth = <?= $e_month ?>;
var selectYear = <?= $year ?>;
var selectMonth = <?= $month ?>;
var nations = <?= $nations ? JSON::encode($history['nations']) : '{}' ?>;
var nations = <?= $nations ? $history['nations'] : '{}' ?>;
</script>
</head>
+1 -1
View File
@@ -5,4 +5,4 @@ namespace sammo;
include "lib.php";
include "func.php";
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
APIHelper::launch(dirname(__FILE__));
+2 -4
View File
@@ -47,7 +47,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
], 'owner=%i', $userID);
}
$plock = boolval($db->queryFirstField('SELECT plock FROM plock LIMIT 1'));
$plock = $db->queryFirstField('SELECT plock FROM plock LIMIT 1');
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -130,8 +130,6 @@ if (!$otherTextInfo) {
'commandList' => getCommandTable($generalObj),
'serverNow' => TimeUtil::now(false),
'baseColor2' => GameConst::$basecolor2,
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
]) ?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
</head>
@@ -179,7 +177,7 @@ if (!$otherTextInfo) {
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-md-2">
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
<div style="display:inline-block;"><?= !$plock ? ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
</div>
<div class="s-border-t py-2 col col-6 col-md-2">
<?php if ($auctionCount > 0) : ?>
+1 -1
View File
@@ -241,7 +241,7 @@ function do추방(General $general, int $myOfficerLevel):?string{
}
$general->setVar('troop', 0);
if($general->getNPCType() >= 2 && Util::randBool(GameConst::$npcBanMessageProb)) {
if($general->getNPCType() >= 2 && ($env['scenario'] < 100 || Util::randBool(0.01))) {
$str = Util::choiceRandom([
'날 버리다니... 곧 전장에서 복수해주겠다...',
+2 -6
View File
@@ -44,13 +44,9 @@ class che_보물_도기 extends \sammo\BaseItem
['쌀', 'rice']
]);
$nationId = $general->getVar('nation');
if ($nationId != 0) {
$db->update('nation', [
$db->update('nation', [
$resKey => $db->sqleval('%b + %i', $resKey, $score)
], 'nation=%i', $nationId);
}
]);
$score = Util::round($score);
$scoreText = number_format($score, 0);
+1 -1
View File
@@ -168,7 +168,7 @@ class che_몰수 extends Command\NationCommand
);
$amountText = number_format($amount, 0);
if ($destGeneral->getNPCType() >= 2 && Util::randBool(GameConst::$npcSeizureMessageProb)) {
if ($destGeneral->getNPCType() >= 2 && Util::randBool(0.01)) {
$npcTexts = [
'몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까...',
'사유재산까지 몰수해가면서 이 나라가 잘 될거라 믿습니까? 정말 이해할 수가 없군요...',
@@ -102,7 +102,7 @@ class che_물자원조 extends Command\NationCommand
$limit = $this->nation['level'] * GameConst::$coefAidAmount;
if ($goldAmount > $limit || $riceAmount > $limit) {
$this->fullConditionConstraints = [ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')];
$this->fullConditionConstraints[ConstraintHelper::AlwaysFail('작위 제한량 이상은 보낼 수 없습니다.')];
return;
}
+1 -1
View File
@@ -69,7 +69,7 @@ class che_천도 extends Command\NationCommand
[$reqGold, $reqRice] = $this->getCost();
if ($this->getDistance() === null) {
$this->fullConditionConstraints = [ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')];
$this->fullConditionConstraints[ConstraintHelper::AlwaysFail('천도 대상으로 도달할 방법이 없습니다.')];
return;
}
-4
View File
@@ -394,8 +394,4 @@ class GameConstBase
'임', '정', '제', '조', '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해',
'혁', '현', '화', '환', '회', '횡', '후', '훈', '휴', '흠', '흥'
];
public static $npcBanMessageProb = 0.01;
public static $npcSeizureMessageProb = 0.01;
public static $npcMessageFreqByDay = 4;
}
+7 -7
View File
@@ -311,16 +311,16 @@ class GameUnitConstBase{
[
1500, self::T_SIEGE, '정란',
100, 100, 6, 0, 0, 14, 5,
100, 100, 6, 0, 0, 15, 5,
0, null, null, 3,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['높은 구조물 위에서 공격합니다.'],
['che_성벽부상무효'], null
],
[
1501, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 18, 5,
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
@@ -329,16 +329,16 @@ class GameUnitConstBase{
],
[
1502, self::T_SIEGE, '벽력거',
200, 100, 6, 10, 0, 18, 5,
200, 100, 6, 10, 0, 25, 5,
3000, ['업'], null, 0,
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8, 1106=>1.112],
[self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833, 1106=>0.909],
[self::T_FOOTMAN=>1.25, self::T_ARCHER=>1.25, self::T_CAVALRY=>1.25, self::T_WIZARD=>1.25, self::T_CASTLE=>1.8],
[self::T_FOOTMAN=>0.833, self::T_ARCHER=>0.833, self::T_CAVALRY=>0.833, self::T_WIZARD=>0.833],
['상대에게 돌덩이를 날립니다.'],
['che_성벽부상무효'], null
],
[
1503, self::T_SIEGE, '목우',
50, 200, 5, 0, 0, 18, 5,
50, 200, 5, 0, 0, 30, 5,
3000, ['성도'], null, 0,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
+2 -3
View File
@@ -2004,7 +2004,6 @@ class GeneralAI
//수도와 연결된 도시 탐색
while (!$queue->isEmpty()) {
/** @var int */
$cityID = $queue->dequeue();
foreach (array_keys(CityConst::byID($cityID)->path) as $nextCityID) {
@@ -3644,9 +3643,9 @@ class GeneralAI
$npcType = $general->getNPCType();
$nationID = $general->getNationID();
//특별 메세지 있는 경우 출력
//특별 메세지 있는 경우 출력 하루 4번
$term = $this->env['turnterm'];
if ($general->getVar('npcmsg') && Util::randBool(GameConst::$npcMessageFreqByDay * $term / (60 * 24))) {
if ($general->getVar('npcmsg') && Util::randBool($term / (6 * 60))) {
$src = new MessageTarget(
$general->getID(),
$general->getVar('name'),
+1 -2
View File
@@ -4,8 +4,7 @@
"history":[
],
"const": {
"joinRuinedNPCProp":0,
"npcBanMessageProb":1
"joinRuinedNPCProp":0
},
"events":[
[
+1 -2
View File
@@ -7,8 +7,7 @@
"history":[
],
"const": {
"joinRuinedNPCProp":0,
"npcBanMessageProb":1
"joinRuinedNPCProp":0
},
"events":[
[
+1 -2
View File
@@ -11,8 +11,7 @@
"expandCityDevelIncreaseAmount": 1350,
"expandCityWallIncreaseAmount": 1600,
"defaultMaxGeneral":300,
"joinRuinedNPCProp":0,
"npcBanMessageProb":1
"joinRuinedNPCProp":0
},
"events":[
[
-677
View File
@@ -1,677 +0,0 @@
{
"title": "【가상모드24】 유저무쌍 멀티 유니버스!",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드24】</b>유저무쌍 멀티 유니버스!</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>졸장과 명장, 충신과 간신, 무장과 지장, 모든 것이 뒤바뀐 세계"
],
"stat": {
"total": 310,
"min": 40,
"max": 140
},
"iconPath": ".",
"fiction": 1,
"nation":[
],
"const": {
"npcBanMessageProb":0,
"npcSeizureMessageProb":0,
"npcMessageFreqByDay":8
},
"diplomacy":[],
"general":[
[0, "아회남", null, 0, null, 75, 46, 84, 0, 160, 300, null, null],
[0, "이적", null, 0, null, 90, 86, 42, 0, 160, 300, null, null],
[0, "윤상", null, 0, null, 89, 86, 48, 0, 160, 300, null, null],
[0, "윤묵", null, 0, null, 84, 85, 54, 0, 160, 300, null, null],
[0, "우금", null, 0, null, 55, 48, 78, 0, 160, 300, null, null],
[0, "위관", null, 0, null, 71, 84, 41, 0, 160, 300, null, null],
[0, "원윤", null, 0, null, 88, 86, 41, 0, 160, 300, null, null],
[0, "원희", null, 0, null, 74, 87, 47, 0, 160, 300, null, null],
[0, "염행", null, 0, null, 62, 40, 82, 0, 160, 300, null, null],
[0, "염유", null, 0, null, 79, 80, 49, 0, 160, 300, null, null],
[0, "원술", null, 0, null, 80, 85, 45, 0, 160, 300, null, null],
[0, "원상", null, 0, null, 87, 45, 88, 0, 160, 300, null, null],
[0, "원소", null, 0, null, 50, 58, 39, 0, 160, 300, null, null],
[0, "염상", null, 0, null, 80, 83, 39, 0, 160, 300, null, null],
[0, "원담", null, 0, null, 80, 42, 88, 0, 160, 300, null, null],
[0, "염포", null, 0, null, 80, 85, 38, 0, 160, 300, null, null],
[0, "왕위", null, 0, null, 80, 60, 82, 0, 160, 300, null, null],
[0, "왕윤", null, 0, null, 87, 88, 52, 0, 160, 300, null, null],
[0, "왕항", null, 0, null, 64, 87, 56, 0, 160, 300, null, null],
[0, "왕찬", null, 0, null, 85, 87, 41, 0, 160, 300, null, null],
[0, "왕수", null, 0, null, 86, 83, 43, 0, 160, 300, null, null],
[0, "왕숙", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "왕준", null, 0, null, 55, 76, 46, 0, 160, 300, null, null],
[0, "왕쌍", null, 0, null, 73, 42, 81, 0, 160, 300, null, null],
[0, "왕창", null, 0, null, 76, 83, 51, 0, 160, 300, null, null],
[0, "왕평", null, 0, null, 52, 39, 69, 0, 160, 300, null, null],
[0, "왕보", null, 0, null, 78, 89, 41, 0, 160, 300, null, null],
[0, "왕문", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
[0, "왕릉", null, 0, null, 66, 80, 49, 0, 160, 300, null, null],
[0, "왕루", null, 0, null, 90, 77, 41, 0, 160, 300, null, null],
[0, "왕랑", null, 0, null, 87, 75, 49, 0, 160, 300, null, null],
[0, "온회", null, 0, null, 78, 74, 56, 0, 160, 300, null, null],
[0, "하안", null, 0, null, 85, 70, 58, 0, 160, 300, null, null],
[0, "괴월", null, 0, null, 79, 72, 45, 0, 160, 300, null, null],
[0, "괴량", null, 0, null, 72, 77, 42, 0, 160, 300, null, null],
[0, "가화", null, 0, null, 81, 55, 89, 0, 160, 300, null, null],
[0, "가규", null, 0, null, 62, 79, 46, 0, 160, 300, null, null],
[0, "하의", null, 0, null, 84, 51, 84, 0, 160, 300, null, null],
[0, "화흠", null, 0, null, 89, 87, 42, 0, 160, 300, null, null],
[0, "가후", null, 0, null, 82, 96, 31, 0, 160, 300, null, null],
[0, "곽가", null, 0, null, 90, 95, 43, 0, 160, 300, null, null],
[0, "악환", null, 0, null, 75, 40, 88, 0, 160, 300, null, null],
[0, "곽사", null, 0, null, 76, 54, 87, 0, 160, 300, null, null],
[0, "악취", null, 0, null, 87, 44, 79, 0, 160, 300, null, null],
[0, "곽준", null, 0, null, 67, 88, 57, 0, 160, 300, null, null],
[0, "학소", null, 0, null, 52, 57, 7, 0, 160, 300, null, null],
[0, "악진", null, 0, null, 60, 35, 74, 0, 160, 300, null, null],
[0, "곽도", null, 0, null, 78, 90, 38, 0, 160, 300, null, null],
[0, "학맹", null, 0, null, 78, 43, 87, 0, 160, 300, null, null],
[0, "곽유지", null, 0, null, 82, 81, 41, 0, 160, 300, null, null],
[0, "곽익", null, 0, null, 67, 71, 11, 0, 160, 300, null, null],
[0, "곽회", null, 0, null, 50, 74, 45, 0, 160, 300, null, null],
[0, "하후위", null, 0, null, 69, 47, 81, 0, 160, 300, null, null],
[0, "하후연", null, 0, null, 45, 28, 58, 0, 160, 300, null, null],
[0, "하후은", null, 0, null, 87, 52, 87, 0, 160, 300, null, null],
[0, "하후화", null, 0, null, 90, 86, 51, 0, 160, 300, null, null],
[0, "하후혜", null, 0, null, 90, 88, 48, 0, 160, 300, null, null],
[0, "하후현", null, 0, null, 86, 90, 44, 0, 160, 300, null, null],
[0, "하후상", null, 0, null, 61, 65, 35, 0, 160, 300, null, null],
[0, "하후덕", null, 0, null, 71, 57, 90, 0, 160, 300, null, null],
[0, "하후돈", null, 0, null, 49, 18, 32, 0, 160, 300, null, null, "부모님께 받은 신체 쫀맛탱!"],
[0, "하후패", null, 0, null, 61, 35, 77, 0, 160, 300, null, null],
[0, "하후무", null, 0, null, 98, 100, 73, 0, 160, 300, null, null, "나와 싸워 이길 자 누구인가!"],
[0, "가충", null, 0, null, 86, 89, 41, 0, 160, 300, null, null],
[0, "하진", null, 0, null, 89, 90, 45, 0, 160, 300, null, null, "돼지 잡던 내가 대장군?"],
[0, "화웅", null, 0, null, 62, 30, 75, 0, 160, 300, null, null],
[0, "한윤", null, 0, null, 84, 81, 35, 0, 160, 300, null, null],
[0, "관우", null, 0, null, 44, 21, 44, 0, 160, 300, null, null, "차가 식기 전에 목을 베이고 오겠소!"],
[0, "환계", null, 0, null, 85, 84, 52, 0, 160, 300, null, null],
[0, "관해", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "관구검", null, 0, null, 56, 44, 78, 0, 160, 300, null, null],
[0, "한현", null, 0, null, 96, 51, 97, 0, 160, 300, null, null],
[0, "한호", null, 0, null, 67, 80, 46, 0, 160, 300, null, null],
[0, "관흥", null, 0, null, 64, 46, 78, 0, 160, 300, null, null],
[0, "관색", null, 0, null, 66, 47, 84, 0, 160, 300, null, null],
[0, "한수", null, 0, null, 62, 82, 51, 0, 160, 300, null, null],
[0, "한숭", null, 0, null, 85, 85, 59, 0, 160, 300, null, null],
[0, "관정", null, 0, null, 84, 88, 57, 0, 160, 300, null, null],
[0, "한섬", null, 0, null, 71, 44, 94, 0, 160, 300, null, null],
[0, "감택", null, 0, null, 84, 70, 37, 0, 160, 300, null, null],
[0, "한충", null, 0, null, 76, 53, 82, 0, 160, 300, null, null],
[0, "한당", null, 0, null, 64, 45, 79, 0, 160, 300, null, null],
[0, "한덕", null, 0, null, 77, 54, 85, 0, 160, 300, null, null],
[0, "감녕", null, 0, null, 48, 45, 56, 0, 160, 300, null, null],
[0, "한복", null, 0, null, 82, 87, 83, 0, 160, 300, null, null],
[0, "관평", null, 0, null, 62, 38, 80, 0, 160, 300, null, null],
[0, "간옹", null, 0, null, 93, 91, 45, 0, 160, 300, null, null, "삼대장 간손미에서 간을 맡고 있습니다"],
[0, "안량", null, 0, null, 52, 44, 57, 0, 160, 300, null, null],
[0, "위연", null, 0, null, 49, 30, 60, 0, 160, 300, null, null],
[0, "국의", null, 0, null, 56, 52, 79, 0, 160, 300, null, null],
[0, "희지재", null, 0, null, 77, 85, 49, 0, 160, 300, null, null],
[0, "위속", null, 0, null, 73, 52, 89, 0, 160, 300, null, null],
[0, "위유", null, 0, null, 89, 89, 56, 0, 160, 300, null, null],
[0, "우금2", null, 0, null, 68, 51, 82, 0, 160, 300, null, null],
[0, "우보", null, 0, null, 82, 60, 89, 0, 160, 300, null, null],
[0, "강유", null, 0, null, 48, 58, 27, 0, 160, 300, null, null, "제갈량 너무 멍청하네 진짜"],
[0, "공지", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
[0, "교유", null, 0, null, 76, 51, 82, 0, 160, 300, null, null],
[0, "공도", null, 0, null, 81, 50, 87, 0, 160, 300, null, null],
[0, "허공", null, 0, null, 86, 44, 76, 0, 160, 300, null, null],
[0, "허정", null, 0, null, 87, 79, 42, 0, 160, 300, null, null],
[0, "허저", null, 0, null, 86, 23, 96, 0, 160, 300, null, null, "조조군의 지혜주머니 호치님이시다"],
[0, "허유", null, 0, null, 74, 89, 40, 0, 160, 300, null, null],
[0, "기령", null, 0, null, 55, 46, 69, 0, 160, 300, null, null],
[0, "김의", null, 0, null, 88, 82, 45, 0, 160, 300, null, null],
[0, "김배삼결", null, 0, null, 76, 44, 81, 0, 160, 300, null, null],
[0, "김선", null, 0, null, 88, 52, 91, 0, 160, 300, null, null],
[0, "우번", null, 0, null, 84, 87, 33, 0, 160, 300, null, null],
[0, "형도영", null, 0, null, 71, 41, 79, 0, 160, 300, null, null],
[0, "엄안", null, 0, null, 58, 37, 68, 0, 160, 300, null, null],
[0, "엄망", null, 0, null, 72, 49, 90, 0, 160, 300, null, null],
[0, "엄준", null, 0, null, 86, 78, 39, 0, 160, 300, null, null],
[0, "엄정", null, 0, null, 90, 85, 31, 0, 160, 300, null, null],
[0, "엄백호", null, 0, null, 96, 69, 99, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕이다!"],
[0, "엄여", null, 0, null, 90, 52, 96, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕 동생이다!"],
[0, "오의", null, 0, null, 61, 47, 87, 0, 160, 300, null, null],
[0, "황개", null, 0, null, 60, 43, 76, 0, 160, 300, null, null, "주유 이 미친 놈아!"],
[0, "고간", null, 0, null, 66, 64, 82, 0, 160, 300, null, null],
[0, "황권", null, 0, null, 65, 66, 32, 0, 160, 300, null, null],
[0, "고유", null, 0, null, 83, 87, 49, 0, 160, 300, null, null],
[0, "고순", null, 0, null, 53, 31, 60, 0, 160, 300, null, null, "함진영 그거 망한 지 오래됐음"],
[0, "고상", null, 0, null, 72, 52, 87, 0, 160, 300, null, null],
[0, "고승", null, 0, null, 73, 57, 88, 0, 160, 300, null, null],
[0, "후성", null, 0, null, 66, 55, 56, 0, 160, 300, null, null],
[0, "후선", null, 0, null, 77, 44, 86, 0, 160, 300, null, null],
[0, "황조", null, 0, null, 59, 51, 82, 0, 160, 300, null, null],
[0, "공손월", null, 0, null, 66, 48, 93, 0, 160, 300, null, null],
[0, "공손연", null, 0, null, 75, 40, 91, 0, 160, 300, null, null],
[0, "공손공", null, 0, null, 89, 83, 41, 0, 160, 300, null, null],
[0, "공손강", null, 0, null, 68, 44, 84, 0, 160, 300, null, null],
[0, "공손찬", null, 0, null, 54, 38, 68, 0, 160, 300, null, null, "백마 어떻게 타요?"],
[0, "공손속", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "공손도", null, 0, null, 73, 49, 81, 0, 160, 300, null, null],
[0, "공손범", null, 0, null, 67, 41, 89, 0, 160, 300, null, null],
[0, "황충", null, 0, null, 52, 34, 65, 0, 160, 300, null, null],
[0, "고정", null, 0, null, 85, 57, 87, 0, 160, 300, null, null],
[0, "고패", null, 0, null, 74, 70, 31, 0, 160, 300, null, null],
[0, "황보숭", null, 0, null, 49, 29, 28, 0, 160, 300, null, null],
[0, "공융", null, 0, null, 91, 86, 37, 0, 160, 300, null, null],
[0, "고람", null, 0, null, 64, 38, 60, 0, 160, 300, null, null],
[0, "오경", null, 0, null, 71, 43, 75, 0, 160, 300, null, null],
[0, "호거아", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "호진", null, 0, null, 75, 46, 88, 0, 160, 300, null, null],
[0, "올돌골", null, 0, null, 96, 54, 99, 0, 160, 300, null, null, "남만이 낳은 천재 올돌골님이시다"],
[0, "호반", null, 0, null, 85, 41, 81, 0, 160, 300, null, null],
[0, "오반", null, 0, null, 66, 49, 90, 0, 160, 300, null, null],
[0, "고옹", null, 0, null, 88, 82, 49, 0, 160, 300, null, null],
[0, "오란", null, 0, null, 72, 50, 85, 0, 160, 300, null, null],
[0, "채화", null, 0, null, 91, 41, 87, 0, 160, 300, null, null],
[0, "채중", null, 0, null, 90, 46, 88, 0, 160, 300, null, null],
[0, "채모", null, 0, null, 70, 45, 63, 0, 160, 300, null, null],
[0, "착융", null, 0, null, 83, 51, 86, 0, 160, 300, null, null],
[0, "사마의", null, 0, null, 41, 47, 42, 0, 160, 300, null, null, "조조 걔 별 거 아님"],
[0, "사마염", null, 0, null, 71, 81, 43, 0, 160, 300, null, null],
[0, "사마사", null, 0, null, 56, 76, 41, 0, 160, 300, null, null, "위나라 조진 썰 푼다"],
[0, "사마소", null, 0, null, 55, 83, 42, 0, 160, 300, null, null],
[0, "사마부", null, 0, null, 70, 83, 43, 0, 160, 300, null, null],
[0, "사마랑", null, 0, null, 80, 39, 68, 0, 160, 300, null, null],
[0, "사마가", null, 0, null, 74, 26, 85, 0, 160, 300, null, null],
[0, "주흔", null, 0, null, 75, 89, 47, 0, 160, 300, null, null],
[0, "주앙", null, 0, null, 66, 55, 82, 0, 160, 300, null, null],
[0, "주지", null, 0, null, 67, 45, 89, 0, 160, 300, null, null],
[0, "주창", null, 0, null, 72, 43, 68, 0, 160, 300, null, null],
[0, "주태", null, 0, null, 56, 30, 52, 0, 160, 300, null, null],
[0, "주방", null, 0, null, 88, 66, 40, 0, 160, 300, null, null],
[0, "주유", null, 0, null, 43, 22, 43, 0, 160, 300, null, null, "동남풍이 부는구나. 황개 몸에 불을 질러라."],
[0, "주환", null, 0, null, 53, 36, 55, 0, 160, 300, null, null],
[0, "주거", null, 0, null, 63, 83, 58, 0, 160, 300, null, null],
[0, "축융", null, 0, null, 98, 65, 95, 0, 160, 300, null, null],
[0, "주준", null, 0, null, 51, 83, 54, 0, 160, 300, null, null],
[0, "주연", null, 0, null, 54, 55, 83, 0, 160, 300, null, null],
[0, "주치", null, 0, null, 69, 56, 68, 0, 160, 300, null, null],
[0, "주포", null, 0, null, 72, 57, 86, 0, 160, 300, null, null],
[0, "주령", null, 0, null, 62, 47, 87, 0, 160, 300, null, null],
[0, "순욱", null, 0, null, 62, 72, 33, 0, 160, 300, null, null],
[0, "순우경", null, 0, null, 62, 74, 41, 0, 160, 300, null, null],
[0, "순심", null, 0, null, 85, 86, 22, 0, 160, 300, null, null],
[0, "순유", null, 0, null, 60, 75, 35, 0, 160, 300, null, null],
[0, "장완", null, 0, null, 62, 76, 31, 0, 160, 300, null, null],
[0, "종회", null, 0, null, 52, 78, 47, 0, 160, 300, null, null],
[0, "장간", null, 0, null, 81, 84, 64, 0, 160, 300, null, null],
[0, "장의거", null, 0, null, 69, 91, 71, 0, 160, 300, null, null],
[0, "장흠", null, 0, null, 62, 45, 86, 0, 160, 300, null, null],
[0, "장제3", null, 0, null, 78, 90, 45, 0, 160, 300, null, null],
[0, "초주", null, 0, null, 84, 87, 23, 0, 160, 300, null, null],
[0, "초촉", null, 0, null, 75, 64, 31, 0, 160, 300, null, null],
[0, "향총", null, 0, null, 64, 84, 53, 0, 160, 300, null, null],
[0, "종요", null, 0, null, 61, 86, 40, 0, 160, 300, null, null],
[0, "향랑", null, 0, null, 82, 82, 46, 0, 160, 300, null, null],
[0, "서영", null, 0, null, 48, 50, 78, 0, 160, 300, null, null],
[0, "제갈각", null, 0, null, 68, 83, 40, 0, 160, 300, null, null],
[0, "제갈근", null, 0, null, 65, 26, 35, 0, 160, 300, null, null],
[0, "제갈균", null, 0, null, 81, 55, 88, 0, 160, 300, null, null],
[0, "제갈탄", null, 0, null, 68, 86, 44, 0, 160, 300, null, null],
[0, "제갈량", null, 0, null, 42, 14, 22, 0, 160, 300, null, null, "헤헤헤…제갈량 바보 아니다. 엄마가 바보 아니라 그랬다."],
[0, "서황", null, 0, null, 45, 26, 46, 0, 160, 300, null, null],
[0, "서서", null, 0, null, 46, 26, 21, 0, 160, 300, null, null, "제갈량 어디 가서 나랑 동문이라고 하지마라"],
[0, "서성", null, 0, null, 54, 59, 59, 0, 160, 300, null, null],
[0, "서막", null, 0, null, 85, 80, 32, 0, 160, 300, null, null],
[0, "신의", null, 0, null, 85, 50, 81, 0, 160, 300, null, null],
[0, "신탐", null, 0, null, 84, 58, 86, 0, 160, 300, null, null],
[0, "심배", null, 0, null, 60, 60, 56, 0, 160, 300, null, null],
[0, "신비", null, 0, null, 88, 76, 51, 0, 160, 300, null, null, "뭘 봐? 인체 신비해지고 싶냐"],
[0, "신평", null, 0, null, 71, 45, 63, 0, 160, 300, null, null],
[0, "진복", null, 0, null, 89, 83, 47, 0, 160, 300, null, null],
[0, "진랑", null, 0, null, 82, 60, 85, 0, 160, 300, null, null],
[0, "휴고", null, 0, null, 77, 59, 82, 0, 160, 300, null, null],
[0, "추단", null, 0, null, 79, 46, 76, 0, 160, 300, null, null],
[0, "성의", null, 0, null, 66, 58, 87, 0, 160, 300, null, null],
[0, "성공영", null, 0, null, 67, 38, 60, 0, 160, 300, null, null],
[0, "설종", null, 0, null, 76, 74, 57, 0, 160, 300, null, null],
[0, "단경", null, 0, null, 69, 52, 87, 0, 160, 300, null, null],
[0, "전종", null, 0, null, 72, 85, 55, 0, 160, 300, null, null],
[0, "조예", null, 0, null, 88, 88, 48, 0, 160, 300, null, null],
[0, "조휴", null, 0, null, 56, 52, 72, 0, 160, 300, null, null],
[0, "송헌", null, 0, null, 72, 53, 84, 0, 160, 300, null, null],
[0, "조앙", null, 0, null, 62, 40, 71, 0, 160, 300, null, null],
[0, "조홍", null, 0, null, 60, 55, 85, 0, 160, 300, null, null],
[0, "조순", null, 0, null, 55, 37, 77, 0, 160, 300, null, null],
[0, "조창", null, 0, null, 54, 39, 81, 0, 160, 300, null, null],
[0, "조식", null, 0, null, 85, 93, 14, 0, 160, 300, null, null],
[0, "조진", null, 0, null, 52, 56, 44, 0, 160, 300, null, null],
[0, "조인", null, 0, null, 46, 40, 60, 0, 160, 300, null, null],
[0, "조성", null, 0, null, 86, 66, 37, 0, 160, 300, null, null],
[0, "조조", null, 0, null, 40, 17, 13, 0, 160, 300, null, null, "미망인이 뭐예요?"],
[0, "조충", null, 0, null, 87, 82, 36, 0, 160, 300, null, null],
[0, "장패", null, 0, null, 62, 44, 87, 0, 160, 300, null, null],
[0, "조비", null, 0, null, 65, 36, 53, 0, 160, 300, null, null],
[0, "조표", null, 0, null, 86, 51, 83, 0, 160, 300, null, null],
[0, "저수", null, 0, null, 54, 31, 45, 0, 160, 300, null, null],
[0, "소비", null, 0, null, 71, 85, 44, 0, 160, 300, null, null],
[0, "조무", null, 0, null, 70, 49, 71, 0, 160, 300, null, null],
[0, "손환", null, 0, null, 58, 64, 34, 0, 160, 300, null, null],
[0, "손견", null, 0, null, 46, 45, 22, 0, 160, 300, null, null, "강동의 고양이 손견이 간다"],
[0, "손건", null, 0, null, 96, 93, 51, 0, 160, 300, null, null, "삼대장 간손미에서 손을 맡고 있습니다"],
[0, "손권", null, 0, null, 54, 49, 29, 0, 160, 300, null, null],
[0, "손교", null, 0, null, 63, 58, 88, 0, 160, 300, null, null],
[0, "손책", null, 0, null, 47, 26, 36, 0, 160, 300, null, null],
[0, "손소", null, 0, null, 58, 61, 32, 0, 160, 300, null, null],
[0, "손정", null, 0, null, 74, 77, 37, 0, 160, 300, null, null],
[0, "손중", null, 0, null, 78, 49, 80, 0, 160, 300, null, null],
[0, "손등", null, 0, null, 78, 33, 61, 0, 160, 300, null, null],
[0, "손유", null, 0, null, 63, 50, 39, 0, 160, 300, null, null],
[0, "손익", null, 0, null, 73, 57, 37, 0, 160, 300, null, null],
[0, "손례", null, 0, null, 62, 39, 81, 0, 160, 300, null, null],
[0, "태사자", null, 0, null, 46, 22, 47, 0, 160, 300, null, null],
[0, "대래동주", null, 0, null, 89, 57, 87, 0, 160, 300, null, null],
[0, "대릉", null, 0, null, 70, 55, 81, 0, 160, 300, null, null],
[0, "타사대왕", null, 0, null, 78, 27, 70, 0, 160, 300, null, null],
[0, "담웅", null, 0, null, 82, 57, 96, 0, 160, 300, null, null],
[0, "장윤", null, 0, null, 68, 56, 94, 0, 160, 300, null, null],
[0, "조운", null, 0, null, 42, 22, 13, 0, 160, 300, null, null, "아두야 나 좀 살려줘"],
[0, "장위", null, 0, null, 66, 54, 95, 0, 160, 300, null, null],
[0, "장영", null, 0, null, 65, 56, 69, 0, 160, 300, null, null],
[0, "장연", null, 0, null, 64, 49, 83, 0, 160, 300, null, null],
[0, "장횡", null, 0, null, 81, 30, 70, 0, 160, 300, null, null],
[0, "장온", null, 0, null, 88, 79, 48, 0, 160, 300, null, null],
[0, "장개", null, 0, null, 96, 54, 82, 0, 160, 300, null, null],
[0, "장각", null, 0, null, 53, 30, 50, 0, 160, 300, null, null],
[0, "장기", null, 0, null, 66, 72, 54, 0, 160, 300, null, null],
[0, "장의", null, 0, null, 61, 85, 55, 0, 160, 300, null, null],
[0, "장훈", null, 0, null, 68, 62, 93, 0, 160, 300, null, null],
[0, "장굉", null, 0, null, 86, 88, 24, 0, 160, 300, null, null],
[0, "장합", null, 0, null, 48, 22, 41, 0, 160, 300, null, null],
[0, "조홍2", null, 0, null, 74, 68, 22, 0, 160, 300, null, null],
[0, "장제2", null, 0, null, 70, 74, 34, 0, 160, 300, null, null],
[0, "장수", null, 0, null, 60, 57, 89, 0, 160, 300, null, null],
[0, "장소", null, 0, null, 59, 87, 43, 0, 160, 300, null, null],
[0, "장송", null, 0, null, 80, 64, 45, 0, 160, 300, null, null],
[0, "장임", null, 0, null, 55, 46, 76, 0, 160, 300, null, null],
[0, "장제", null, 0, null, 73, 37, 60, 0, 160, 300, null, null],
[0, "장막", null, 0, null, 88, 87, 59, 0, 160, 300, null, null],
[0, "조범", null, 0, null, 92, 90, 58, 0, 160, 300, null, null],
[0, "장비", null, 0, null, 43, 2, 36, 0, 160, 300, null, null, "덤비지 마….제발"],
[0, "장포", null, 0, null, 62, 46, 82, 0, 160, 300, null, null],
[0, "장보", null, 0, null, 57, 80, 49, 0, 160, 300, null, null],
[0, "장만성", null, 0, null, 65, 49, 85, 0, 160, 300, null, null],
[0, "장양", null, 0, null, 68, 50, 80, 0, 160, 300, null, null],
[0, "장익", null, 0, null, 65, 85, 44, 0, 160, 300, null, null],
[0, "장료", null, 0, null, 44, 26, 46, 0, 160, 300, null, null],
[0, "장량", null, 0, null, 62, 50, 81, 0, 160, 300, null, null],
[0, "조루", null, 0, null, 70, 91, 62, 0, 160, 300, null, null],
[0, "장로", null, 0, null, 75, 98, 49, 0, 160, 300, null, null],
[0, "진횡", null, 0, null, 76, 57, 84, 0, 160, 300, null, null],
[0, "진응", null, 0, null, 78, 58, 91, 0, 160, 300, null, null],
[0, "진기", null, 0, null, 82, 65, 92, 0, 160, 300, null, null],
[0, "진궁", null, 0, null, 56, 85, 40, 0, 160, 300, null, null],
[0, "진교", null, 0, null, 79, 83, 53, 0, 160, 300, null, null],
[0, "진군", null, 0, null, 88, 13, 65, 0, 160, 300, null, null],
[0, "진규", null, 0, null, 80, 76, 38, 0, 160, 300, null, null],
[0, "진식", null, 0, null, 70, 59, 85, 0, 160, 300, null, null],
[0, "진진", null, 0, null, 92, 90, 51, 0, 160, 300, null, null],
[0, "진태", null, 0, null, 54, 72, 41, 0, 160, 300, null, null],
[0, "진등", null, 0, null, 61, 81, 49, 0, 160, 300, null, null],
[0, "진도", null, 0, null, 58, 52, 82, 0, 160, 300, null, null],
[0, "진무", null, 0, null, 64, 43, 97, 0, 160, 300, null, null],
[0, "진란", null, 0, null, 74, 51, 80, 0, 160, 300, null, null],
[0, "진림", null, 0, null, 95, 11, 65, 0, 160, 300, null, null],
[0, "정욱", null, 0, null, 64, 91, 36, 0, 160, 300, null, null],
[0, "정원지", null, 0, null, 71, 56, 83, 0, 160, 300, null, null],
[0, "정은", null, 0, null, 71, 57, 80, 0, 160, 300, null, null],
[0, "정원", null, 0, null, 70, 54, 85, 0, 160, 300, null, null],
[0, "정보", null, 0, null, 56, 11, 46, 0, 160, 300, null, null],
[0, "정봉", null, 0, null, 59, 38, 71, 0, 160, 300, null, null],
[0, "전위", null, 0, null, 41, 22, 48, 0, 160, 300, null, null, "적이 열 보 안으로 들어오거든 나부터 튄다"],
[0, "전해", null, 0, null, 72, 55, 85, 0, 160, 300, null, null],
[0, "전주", null, 0, null, 74, 89, 57, 0, 160, 300, null, null],
[0, "전풍", null, 0, null, 58, 67, 24, 0, 160, 300, null, null, "아 원소 저거 진짜 사람 아니네"],
[0, "전예", null, 0, null, 47, 55, 24, 0, 160, 300, null, null],
[0, "동윤", null, 0, null, 90, 82, 51, 0, 160, 300, null, null],
[0, "동화", null, 0, null, 83, 86, 45, 0, 160, 300, null, null],
[0, "등애", null, 0, null, 48, 47, 26, 0, 160, 300, null, null, "이 산이 아닌개벼…"],
[0, "도겸", null, 0, null, 89, 83, 56, 0, 160, 300, null, null],
[0, "등현", null, 0, null, 79, 67, 35, 0, 160, 300, null, null],
[0, "등지", null, 0, null, 67, 68, 49, 0, 160, 300, null, null],
[0, "동습", null, 0, null, 68, 45, 80, 0, 160, 300, null, null],
[0, "동승", null, 0, null, 84, 87, 55, 0, 160, 300, null, null],
[0, "동소", null, 0, null, 86, 85, 40, 0, 160, 300, null, null],
[0, "동탁", null, 0, null, 49, 43, 73, 0, 160, 300, null, null],
[0, "동도나", null, 0, null, 72, 57, 89, 0, 160, 300, null, null],
[0, "동민", null, 0, null, 89, 51, 87, 0, 160, 300, null, null],
[0, "등무", null, 0, null, 79, 55, 91, 0, 160, 300, null, null],
[0, "두기", null, 0, null, 66, 17, 62, 0, 160, 300, null, null],
[0, "두예", null, 0, null, 44, 71, 35, 0, 160, 300, null, null],
[0, "배원소", null, 0, null, 90, 45, 85, 0, 160, 300, null, null],
[0, "마완", null, 0, null, 69, 56, 84, 0, 160, 300, null, null],
[0, "마휴", null, 0, null, 72, 57, 90, 0, 160, 300, null, null],
[0, "파재", null, 0, null, 66, 56, 85, 0, 160, 300, null, null],
[0, "마준", null, 0, null, 82, 88, 39, 0, 160, 300, null, null],
[0, "마속", null, 0, null, 69, 51, 26, 0, 160, 300, null, null],
[0, "마대", null, 0, null, 61, 45, 78, 0, 160, 300, null, null],
[0, "마충", null, 0, null, 62, 48, 88, 0, 160, 300, null, null],
[0, "마초", null, 0, null, 54, 33, 46, 0, 160, 300, null, null, "서량의 븅마초 나가신다"],
[0, "마철", null, 0, null, 70, 48, 77, 0, 160, 300, null, null],
[0, "마등", null, 0, null, 55, 30, 58, 0, 160, 300, null, null],
[0, "마량", null, 0, null, 87, 17, 55, 0, 160, 300, null, null],
[0, "반준", null, 0, null, 79, 91, 48, 0, 160, 300, null, null],
[0, "반장", null, 0, null, 64, 50, 81, 0, 160, 300, null, null],
[0, "번조", null, 0, null, 74, 57, 88, 0, 160, 300, null, null],
[0, "번능", null, 0, null, 71, 19, 84, 0, 160, 300, null, null],
[0, "반봉", null, 0, null, 84, 53, 86, 0, 160, 300, null, null],
[0, "비의", null, 0, null, 58, 84, 42, 0, 160, 300, null, null],
[0, "비연", null, 0, null, 80, 62, 89, 0, 160, 300, null, null],
[0, "비시", null, 0, null, 82, 42, 75, 0, 160, 300, null, null],
[0, "미축", null, 0, null, 90, 91, 52, 0, 160, 300, null, null, "돈도 많고 싸움도 잘하는 간손미 에이스 미축입니다"],
[0, "미방", null, 0, null, 86, 50, 88, 0, 160, 300, null, null],
[0, "비요", null, 0, null, 70, 88, 57, 0, 160, 300, null, null],
[0, "무안국", null, 0, null, 70, 51, 86, 0, 160, 300, null, null],
[0, "풍습", null, 0, null, 68, 59, 90, 0, 160, 300, null, null],
[0, "부사인", null, 0, null, 94, 47, 83, 0, 160, 300, null, null],
[0, "부첨", null, 0, null, 67, 45, 78, 0, 160, 300, null, null],
[0, "부손", null, 0, null, 87, 90, 40, 0, 160, 300, null, null],
[0, "문앙", null, 0, null, 64, 34, 75, 0, 160, 300, null, null],
[0, "문흠", null, 0, null, 66, 61, 26, 0, 160, 300, null, null],
[0, "문추", null, 0, null, 53, 26, 51, 0, 160, 300, null, null],
[0, "문빙", null, 0, null, 52, 35, 55, 0, 160, 300, null, null],
[0, "변희", null, 0, null, 84, 50, 78, 0, 160, 300, null, null],
[0, "망아장", null, 0, null, 90, 51, 87, 0, 160, 300, null, null],
[0, "봉기", null, 0, null, 84, 90, 46, 0, 160, 300, null, null],
[0, "방희", null, 0, null, 80, 82, 41, 0, 160, 300, null, null],
[0, "법정", null, 0, null, 58, 46, 11, 0, 160, 300, null, null],
[0, "방통", null, 0, null, 51, 43, 22, 0, 160, 300, null, null],
[0, "방덕", null, 0, null, 51, 26, 40, 0, 160, 300, null, null],
[0, "포륭", null, 0, null, 82, 54, 91, 0, 160, 300, null, null],
[0, "목순", null, 0, null, 88, 33, 88, 0, 160, 300, null, null],
[0, "목록대왕", null, 0, null, 93, 59, 99, 0, 160, 300, null, null, "코끼리만 있으면 너도 한 방 나도 한 방"],
[0, "보즐", null, 0, null, 57, 19, 59, 0, 160, 300, null, null],
[0, "만총", null, 0, null, 52, 16, 53, 0, 160, 300, null, null],
[0, "모개", null, 0, null, 77, 81, 20, 0, 160, 300, null, null],
[0, "맹획", null, 0, null, 59, 12, 88, 0, 160, 300, null, null],
[0, "맹체", null, 0, null, 65, 85, 55, 0, 160, 300, null, null],
[0, "맹우", null, 0, null, 90, 9, 90, 0, 160, 300, null, null],
[0, "유섭", null, 0, null, 78, 51, 96, 0, 160, 300, null, null],
[0, "양부", null, 0, null, 78, 86, 52, 0, 160, 300, null, null],
[0, "옹개", null, 0, null, 67, 55, 83, 0, 160, 300, null, null],
[0, "양의", null, 0, null, 72, 20, 58, 0, 160, 300, null, null],
[0, "양호", null, 0, null, 46, 51, 28, 0, 160, 300, null, null],
[0, "양홍", null, 0, null, 92, 87, 13, 0, 160, 300, null, null],
[0, "양앙", null, 0, null, 72, 58, 92, 0, 160, 300, null, null],
[0, "양추", null, 0, null, 88, 55, 90, 0, 160, 300, null, null],
[0, "양수", null, 0, null, 92, 91, 1, 0, 160, 300, null, null],
[0, "양추2", null, 0, null, 73, 56, 96, 0, 160, 300, null, null],
[0, "양송", null, 0, null, 100, 65, 98, 0, 160, 300, null, null, "군신 악의만이 나와 비견될만 하다"],
[0, "양임", null, 0, null, 70, 42, 84, 0, 160, 300, null, null],
[0, "양조", null, 0, null, 87, 79, 34, 0, 160, 300, null, null],
[0, "양백", null, 0, null, 90, 81, 31, 0, 160, 300, null, null],
[0, "양부2", null, 0, null, 73, 90, 47, 0, 160, 300, null, null],
[0, "양봉", null, 0, null, 74, 75, 39, 0, 160, 300, null, null],
[0, "양봉2", null, 0, null, 86, 28, 87, 0, 160, 300, null, null],
[0, "뇌동", null, 0, null, 71, 52, 89, 0, 160, 300, null, null],
[0, "뇌박", null, 0, null, 78, 60, 84, 0, 160, 300, null, null],
[0, "이이", null, 0, null, 77, 22, 81, 0, 160, 300, null, null],
[0, "이회", null, 0, null, 61, 82, 51, 0, 160, 300, null, null],
[0, "이각", null, 0, null, 71, 58, 86, 0, 160, 300, null, null],
[0, "육항", null, 0, null, 46, 61, 27, 0, 160, 300, null, null],
[0, "육적", null, 0, null, 60, 61, 28, 0, 160, 300, null, null],
[0, "육손", null, 0, null, 45, 69, 34, 0, 160, 300, null, null],
[0, "이엄", null, 0, null, 57, 46, 77, 0, 160, 300, null, null],
[0, "이유", null, 0, null, 69, 84, 37, 0, 160, 300, null, null],
[0, "이숙", null, 0, null, 87, 41, 89, 0, 160, 300, null, null],
[0, "이통", null, 0, null, 67, 49, 78, 0, 160, 300, null, null],
[0, "이전", null, 0, null, 62, 40, 61, 0, 160, 300, null, null],
[0, "이풍", null, 0, null, 71, 56, 90, 0, 160, 300, null, null],
[0, "유언", null, 0, null, 79, 82, 50, 0, 160, 300, null, null],
[0, "유괴", null, 0, null, 69, 57, 88, 0, 160, 300, null, null],
[0, "유기", null, 0, null, 88, 88, 37, 0, 160, 300, null, null],
[0, "유우", null, 0, null, 78, 87, 55, 0, 160, 300, null, null],
[0, "유훈", null, 0, null, 90, 37, 82, 0, 160, 300, null, null],
[0, "유현", null, 0, null, 86, 44, 89, 0, 160, 300, null, null],
[0, "유순", null, 0, null, 77, 34, 92, 0, 160, 300, null, null],
[0, "유장", null, 0, null, 99, 90, 47, 0, 160, 300, null, null],
[0, "유심", null, 0, null, 80, 82, 56, 0, 160, 300, null, null],
[0, "유선", null, 0, null, 97, 65, 96, 0, 160, 300, null, null, "촉은 제갈량이 다 말아먹었다"],
[0, "유종", null, 0, null, 86, 88, 35, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 85, 87, 34, 0, 160, 300, null, null],
[0, "유파", null, 0, null, 81, 38, 85, 0, 160, 300, null, null],
[0, "유반", null, 0, null, 71, 54, 93, 0, 160, 300, null, null],
[0, "유비", null, 0, null, 52, 18, 23, 0, 160, 300, null, null, "돗자리 좀 사주세요"],
[0, "유표", null, 0, null, 82, 81, 28, 0, 160, 300, null, null],
[0, "유복", null, 0, null, 76, 81, 56, 0, 160, 300, null, null],
[0, "유벽", null, 0, null, 70, 58, 93, 0, 160, 300, null, null],
[0, "유봉", null, 0, null, 65, 51, 32, 0, 160, 300, null, null],
[0, "유엽", null, 0, null, 84, 65, 38, 0, 160, 300, null, null],
[0, "유요", null, 0, null, 78, 63, 24, 0, 160, 300, null, null],
[0, "여위황", null, 0, null, 82, 57, 86, 0, 160, 300, null, null],
[0, "요화", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
[0, "양흥", null, 0, null, 79, 45, 81, 0, 160, 300, null, null],
[0, "양습", null, 0, null, 67, 80, 56, 0, 160, 300, null, null],
[0, "양서", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "능조", null, 0, null, 65, 29, 38, 0, 160, 300, null, null],
[0, "능통", null, 0, null, 57, 11, 40, 0, 160, 300, null, null],
[0, "여개", null, 0, null, 87, 80, 53, 0, 160, 300, null, null],
[0, "여건", null, 0, null, 83, 40, 78, 0, 160, 300, null, null],
[0, "여광", null, 0, null, 84, 41, 87, 0, 160, 300, null, null],
[0, "여상", null, 0, null, 86, 39, 88, 0, 160, 300, null, null],
[0, "여대", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
[0, "여범", null, 0, null, 67, 86, 55, 0, 160, 300, null, null],
[0, "여포", null, 0, null, 51, 10, 100, 0, 160, 300, null, null, "이기기 위한 전략만 내어드리겠습니다."],
[0, "여몽", null, 0, null, 49, 31, 10, 0, 160, 300, null, null],
[0, "윤직", null, 0, null, 88, 88, 47, 0, 160, 300, null, null],
[0, "냉포", null, 0, null, 69, 48, 79, 0, 160, 300, null, null],
[0, "누규", null, 0, null, 88, 87, 43, 0, 160, 300, null, null],
[0, "노숙", null, 0, null, 51, 64, 17, 0, 160, 300, null, null],
[0, "노식", null, 0, null, 54, 77, 48, 0, 160, 300, null, null],
[0, "범강", null, 0, null, 89, 89, 34, 0, 160, 300, null, null],
[0, "장달", null, 0, null, 87, 84, 46, 0, 160, 300, null, null],
[0, "규람", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
[0, "대원", null, 0, null, 82, 88, 42, 0, 160, 300, null, null],
[0, "왕기", null, 0, null, 59, 76, 44, 0, 160, 300, null, null],
[0, "왕상", null, 0, null, 87, 89, 52, 0, 160, 300, null, null],
[0, "왕돈", null, 0, null, 80, 54, 94, 0, 160, 300, null, null],
[0, "악침", null, 0, null, 67, 55, 97, 0, 160, 300, null, null],
[0, "하제", null, 0, null, 57, 79, 48, 0, 160, 300, null, null],
[0, "환범", null, 0, null, 81, 89, 42, 0, 160, 300, null, null],
[0, "견초", null, 0, null, 68, 51, 83, 0, 160, 300, null, null],
[0, "고당륭", null, 0, null, 90, 90, 44, 0, 160, 300, null, null],
[0, "오찬", null, 0, null, 72, 91, 42, 0, 160, 300, null, null],
[0, "호질", null, 0, null, 67, 88, 56, 0, 160, 300, null, null],
[0, "오질", null, 0, null, 90, 89, 22, 0, 160, 300, null, null],
[0, "호준", null, 0, null, 61, 54, 85, 0, 160, 300, null, null],
[0, "고담", null, 0, null, 87, 87, 33, 0, 160, 300, null, null],
[0, "최림", null, 0, null, 84, 85, 14, 0, 160, 300, null, null],
[0, "사마망", null, 0, null, 62, 82, 47, 0, 160, 300, null, null],
[0, "주이", null, 0, null, 70, 57, 88, 0, 160, 300, null, null],
[0, "전단", null, 0, null, 73, 76, 71, 0, 160, 300, null, null],
[0, "조우", null, 0, null, 89, 83, 23, 0, 160, 300, null, null],
[0, "조상", null, 0, null, 81, 87, 40, 0, 160, 300, null, null],
[0, "조방", null, 0, null, 90, 86, 43, 0, 160, 300, null, null],
[0, "태사향", null, 0, null, 83, 52, 82, 0, 160, 300, null, null],
[0, "장휴", null, 0, null, 77, 43, 66, 0, 160, 300, null, null],
[0, "장호", null, 0, null, 65, 56, 89, 0, 160, 300, null, null],
[0, "조광", null, 0, null, 73, 59, 87, 0, 160, 300, null, null],
[0, "장집", null, 0, null, 64, 81, 50, 0, 160, 300, null, null],
[0, "장승", null, 0, null, 63, 85, 55, 0, 160, 300, null, null],
[0, "장소2", null, 0, null, 87, 84, 19, 0, 160, 300, null, null],
[0, "조통", null, 0, null, 72, 53, 81, 0, 160, 300, null, null],
[0, "진표", null, 0, null, 74, 88, 56, 0, 160, 300, null, null],
[0, "정무", null, 0, null, 84, 85, 45, 0, 160, 300, null, null],
[0, "정봉2", null, 0, null, 74, 22, 74, 0, 160, 300, null, null],
[0, "전만", null, 0, null, 89, 11, 67, 0, 160, 300, null, null],
[0, "마균", null, 0, null, 88, 83, 29, 0, 160, 300, null, null],
[0, "방회", null, 0, null, 71, 55, 86, 0, 160, 300, null, null],
[0, "낙통", null, 0, null, 64, 82, 55, 0, 160, 300, null, null],
[0, "육개", null, 0, null, 75, 79, 51, 0, 160, 300, null, null],
[0, "유찬", null, 0, null, 62, 59, 81, 0, 160, 300, null, null],
[0, "유소", null, 0, null, 72, 87, 56, 0, 160, 300, null, null],
[0, "요립", null, 0, null, 88, 85, 24, 0, 160, 300, null, null],
[0, "여거", null, 0, null, 62, 89, 49, 0, 160, 300, null, null],
[0, "제갈첨", null, 0, null, 70, 83, 54, 0, 160, 300, null, null],
[0, "손휴", null, 0, null, 83, 90, 52, 0, 160, 300, null, null],
[0, "극정", null, 0, null, 90, 77, 32, 0, 160, 300, null, null],
[0, "호분", null, 0, null, 69, 54, 80, 0, 160, 300, null, null],
[0, "손량", null, 0, null, 88, 84, 30, 0, 160, 300, null, null],
[0, "마막", null, 0, null, 96, 98, 71, 0, 160, 300, null, null],
[0, "손호", null, 0, null, 89, 43, 41, 0, 160, 300, null, null],
[0, "조모", null, 0, null, 86, 39, 81, 0, 160, 300, null, null],
[0, "조환", null, 0, null, 90, 42, 80, 0, 160, 300, null, null],
[0, "사마유", null, 0, null, 69, 86, 55, 0, 160, 300, null, null],
[0, "제갈상", null, 0, null, 76, 51, 78, 0, 160, 300, null, null],
[0, "손화", null, 0, null, 87, 71, 22, 0, 160, 300, null, null],
[0, "염우", null, 0, null, 88, 49, 89, 0, 160, 300, null, null],
[0, "왕경", null, 0, null, 73, 81, 59, 0, 160, 300, null, null],
[0, "왕혼", null, 0, null, 66, 59, 80, 0, 160, 300, null, null],
[0, "곽혁", null, 0, null, 87, 81, 30, 0, 160, 300, null, null],
[0, "가범", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
[0, "서질", null, 0, null, 72, 47, 86, 0, 160, 300, null, null],
[0, "손준", null, 0, null, 76, 40, 82, 0, 160, 300, null, null],
[0, "손침", null, 0, null, 82, 85, 45, 0, 160, 300, null, null],
[0, "우사", null, 0, null, 79, 86, 56, 0, 160, 300, null, null],
[0, "진건", null, 0, null, 68, 49, 88, 0, 160, 300, null, null],
[0, "동궐", null, 0, null, 75, 81, 44, 0, 160, 300, null, null],
[0, "당자", null, 0, null, 79, 49, 89, 0, 160, 300, null, null],
[0, "등충", null, 0, null, 64, 40, 81, 0, 160, 300, null, null],
[0, "황숭", null, 0, null, 73, 70, 38, 0, 160, 300, null, null],
[0, "화핵", null, 0, null, 80, 76, 29, 0, 160, 300, null, null],
[0, "허의", null, 0, null, 89, 46, 85, 0, 160, 300, null, null],
[0, "송겸", null, 0, null, 74, 42, 87, 0, 160, 300, null, null],
[0, "호제", null, 0, null, 83, 81, 52, 0, 160, 300, null, null],
[0, "나헌", null, 0, null, 54, 78, 38, 0, 160, 300, null, null],
[0, "노숙2", null, 0, null, 67, 87, 46, 0, 160, 300, null, null],
[0, "구성", null, 0, null, 77, 40, 82, 0, 160, 300, null, null],
[0, "어부라", null, 0, null, 78, 42, 86, 0, 160, 300, null, null],
[0, "아하소과", null, 0, null, 89, 54, 90, 0, 160, 300, null, null],
[0, "가비능", null, 0, null, 63, 41, 88, 0, 160, 300, null, null],
[0, "구력거", null, 0, null, 60, 42, 80, 0, 160, 300, null, null],
[0, "강단", null, 0, null, 75, 47, 82, 0, 160, 300, null, null],
[0, "황란", null, 0, null, 77, 45, 76, 0, 160, 300, null, null],
[0, "호주천", null, 0, null, 70, 49, 81, 0, 160, 300, null, null],
[0, "종리목", null, 0, null, 56, 79, 38, 0, 160, 300, null, null],
[0, "제갈교", null, 0, null, 78, 83, 45, 0, 160, 300, null, null],
[0, "답돈", null, 0, null, 56, 48, 79, 0, 160, 300, null, null],
[0, "반임", null, 0, null, 74, 41, 82, 0, 160, 300, null, null],
[0, "보도근", null, 0, null, 76, 57, 80, 0, 160, 300, null, null],
[0, "미당대왕", null, 0, null, 81, 51, 89, 0, 160, 300, null, null],
[0, "유표2", null, 0, null, 67, 56, 82, 0, 160, 300, null, null],
[0, "루반", null, 0, null, 75, 44, 81, 0, 160, 300, null, null],
[0, "손관", null, 0, null, 68, 42, 89, 0, 160, 300, null, null],
[0, "곽석", null, 0, null, 81, 49, 86, 0, 160, 300, null, null],
[0, "주조", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "장거", null, 0, null, 61, 45, 84, 0, 160, 300, null, null],
[0, "장순", null, 0, null, 67, 49, 80, 0, 160, 300, null, null],
[0, "철리길", null, 0, null, 63, 50, 88, 0, 160, 300, null, null],
[0, "주삭", null, 0, null, 90, 52, 90, 0, 160, 300, null, null],
[0, "황월영", null, 0, null, 94, 97, 58, 0, 160, 300, null, null, "어쩌다 저런 걸 남편이라고…."],
[0, "채염", null, 0, null, 98, 99, 49, 0, 160, 300, null, null],
[0, "소교", null, 0, null, 97, 95, 52, 0, 160, 300, null, null, "주유 너무 무능하다."],
[0, "신헌영", null, 0, null, 85, 95, 60, 0, 160, 300, null, null],
[0, "손상향", null, 0, null, 98, 58, 92, 0, 160, 300, null, null],
[0, "대교", null, 0, null, 98, 90, 52, 0, 160, 300, null, null, "손책 너무 무능하다."],
[0, "초선", null, 0, null, 99, 98, 59, 0, 160, 300, null, null, "동탁 이리와봐 한대만 맞자"],
[0, "교모", null, 0, null, 86, 90, 31, 0, 160, 300, null, null],
[0, "관구수", null, 0, null, 82, 28, 91, 0, 160, 300, null, null],
[0, "관구전", null, 0, null, 77, 88, 51, 0, 160, 300, null, null],
[0, "원유", null, 0, null, 84, 80, 47, 0, 160, 300, null, null],
[0, "왕광", null, 0, null, 75, 86, 49, 0, 160, 300, null, null],
[0, "신창", null, 0, null, 85, 84, 48, 0, 160, 300, null, null],
[0, "사마주", null, 0, null, 79, 86, 49, 0, 160, 300, null, null],
[0, "양제", null, 0, null, 73, 82, 29, 0, 160, 300, null, null],
[0, "성만", null, 0, null, 79, 42, 90, 0, 160, 300, null, null],
[0, "오연", null, 0, null, 74, 47, 88, 0, 160, 300, null, null],
[0, "맹충", null, 0, null, 90, 72, 38, 0, 160, 300, null, null],
[0, "잠혼", null, 0, null, 100, 99, 58, 0, 160, 300, null, null, "이 몸이 만부부당이라 불리는 맹장 잠혼이다."],
[0, "사정", null, 0, null, 76, 44, 86, 0, 160, 300, null, null],
[0, "심영", null, 0, null, 70, 43, 85, 0, 160, 300, null, null],
[0, "도준", null, 0, null, 75, 44, 83, 0, 160, 300, null, null],
[0, "만욱", null, 0, null, 89, 85, 45, 0, 160, 300, null, null],
[0, "오언", null, 0, null, 64, 49, 81, 0, 160, 300, null, null],
[0, "위막", null, 0, null, 86, 58, 81, 0, 160, 300, null, null],
[0, "시삭", null, 0, null, 88, 55, 83, 0, 160, 300, null, null],
[0, "전속", null, 0, null, 90, 40, 85, 0, 160, 300, null, null],
[0, "장화", null, 0, null, 84, 83, 32, 0, 160, 300, null, null],
[0, "오거", null, 0, null, 90, 19, 91, 0, 160, 300, null, null],
[0, "추정", null, 0, null, 70, 84, 24, 0, 160, 300, null, null],
[0, "장특", null, 0, null, 67, 86, 45, 0, 160, 300, null, null],
[0, "곽마", null, 0, null, 72, 49, 83, 0, 160, 300, null, null],
[0, "석포", null, 0, null, 71, 49, 81, 0, 160, 300, null, null],
[0, "견홍", null, 0, null, 70, 56, 87, 0, 160, 300, null, null],
[0, "한거자", null, 0, null, 89, 81, 29, 0, 160, 300, null, null],
[0, "휴원진", null, 0, null, 88, 22, 85, 0, 160, 300, null, null],
[0, "곽원", null, 0, null, 74, 84, 47, 0, 160, 300, null, null],
[0, "계옹", null, 0, null, 77, 87, 28, 0, 160, 300, null, null],
[0, "이부", null, 0, null, 89, 84, 46, 0, 160, 300, null, null],
[0, "왕업", null, 0, null, 87, 84, 45, 0, 160, 300, null, null],
[0, "좌혁", null, 0, null, 78, 44, 89, 0, 160, 300, null, null],
[0, "화타", null, 0, null, 83, 96, 37, 0, 160, 300, null, null, "가시는 길 한 방에 편안하게"],
[0, "사마휘", null, 0, null, 85, 84, 28, 0, 160, 300, null, null, "공명과 방통은 아무 짝에도 쓸모가 없습니다"],
[0, "우길", null, 0, null, 87, 85, 30, 0, 160, 300, null, null],
[0, "헌제", null, 0, null, 88, 92, 52, 0, 160, 300, null, null, "한 황실의 미래는 내 알바 아니다"],
[0, "백기", null, 0, null, 40, 42, 61, 0, 160, 300, null, null],
[0, "한신", null, 0, null, 40, 56, 35, 0, 160, 300, null, null],
[0, "악비", null, 0, null, 41, 48, 20, 0, 160, 300, null, null],
[0, "항적", null, 0, null, 41, 18, 35, 0, 160, 300, null, null],
[0, "악의", null, 0, null, 42, 27, 13, 0, 160, 300, null, null],
[0, "영정", null, 0, null, 43, 25, 48, 0, 160, 300, null, null],
[0, "강상", null, 0, null, 46, 40, 54, 0, 160, 300, null, null],
[0, "전단2", null, 0, null, 44, 55, 25, 0, 160, 300, null, null],
[0, "이목", null, 0, null, 44, 13, 42, 0, 160, 300, null, null],
[0, "염파", null, 0, null, 43, 9, 44, 0, 160, 300, null, null],
[0, "왕전", null, 0, null, 46, 37, 16, 0, 160, 300, null, null],
[0, "오기", null, 0, null, 46, 74, 25, 0, 160, 300, null, null],
[0, "곽거병", null, 0, null, 47, 16, 87, 0, 160, 300, null, null],
[0, "영포", null, 0, null, 58, 22, 49, 0, 160, 300, null, null],
[0, "이신", null, 0, null, 59, 37, 57, 0, 160, 300, null, null],
[0, "몽념", null, 0, null, 53, 34, 25, 0, 160, 300, null, null],
[0, "전기", null, 0, null, 60, 62, 36, 0, 160, 300, null, null],
[0, "극신", null, 0, null, 64, 27, 88, 0, 160, 300, null, null],
[0, "항연", null, 0, null, 51, 38, 22, 0, 160, 300, null, null],
[0, "인상여", null, 0, null, 71, 14, 44, 0, 160, 300, null, null],
[0, "장자방", null, 0, null, 68, 43, 27, 0, 160, 300, null, null],
[0, "관이오", null, 0, null, 55, 76, 41, 0, 160, 300, null, null],
[0, "손빈", null, 0, null, 57, 38, 12, 0, 160, 300, null, null],
[0, "소진", null, 0, null, 50, 23, 14, 0, 160, 300, null, null],
[0, "범증", null, 0, null, 72, 86, 46, 0, 160, 300, null, null],
[0, "장의2", null, 0, null, 65, 87, 17, 0, 160, 300, null, null],
[0, "공구", null, 0, null, 72, 70, 49, 0, 160, 300, null, null],
[0, "소하", null, 0, null, 84, 23, 8, 0, 160, 300, null, null],
[0, "한비", null, 0, null, 90, 81, 43, 0, 160, 300, null, null],
[0, "이사", null, 0, null, 42, 16, 45, 0, 160, 300, null, null],
[0, "전문", null, 0, null, 61, 73, 41, 0, 160, 300, null, null],
[0, "황헐", null, 0, null, 59, 22, 42, 0, 160, 300, null, null, "헐…"],
[0, "황호", null, 0, null, 98, 100, 67, 0, 160, 300, null, null],
[0, "방난", null, 0, null, 52, 25, 44, 0, 160, 300, null, null],
[0, "개섭", null, 0, null, 89, 33, 86, 0, 160, 300, null, null],
[0, "형가", null, 0, null, 88, 41, 91, 0, 160, 300, null, null],
[0, "유방", null, 0, null, 50, 24, 15, 0, 160, 300, null, null],
[0, "하리", null, 0, null, 98, 96, 68, 0, 160, 300, null, null],
[0, "헹이", null, 0, null, 93, 59, 98, 0, 160, 300, null, null],
[0, "나나", null, 0, null, 94, 53, 93, 0, 160, 300, null, null],
[0, "장임2", null, 0, null, 90, 89, 71, 0, 160, 300, null, null],
[0, "하야미", null, 0, null, 96, 67, 85, 0, 160, 300, null, null],
[0, "이시리스", null, 0, null, 94, 86, 54, 0, 160, 300, null, null],
[0, "연채홍", null, 0, null, 97, 47, 96, 0, 160, 300, null, null],
[0, "임사영", null, 0, null, 1, 4, 1, 0, 160, 300, null, null, "일반인 양민입니다"],
[0, "장군보", null, 0, null, 92, 90, 62, 0, 160, 300, null, null],
[0, "크렌스", null, 0, null, 98, 54, 93, 0, 160, 300, null, null],
[0, "콘", null, 0, null, 90, 42, 93, 0, 160, 300, null, null],
[0, "리즈나", null, 0, null, 97, 88, 64, 0, 160, 300, null, null, "야겜 하고 싶다"],
[0, "오티누스", null, 0, null, 97, 47, 97, 0, 160, 300, null, null],
[0, "네시", null, 0, null, 92, 67, 96, 0, 160, 300, null, null, "00"],
[0, "시뉴카린", null, 0, null, 91, 90, 59, 0, 160, 300, null, null],
[0, "Hide_D", null, 0, null, 91, 41, 95, 0, 160, 300, null, null, "버그 흥겜 힏체섭"],
[0, "Pray", null, 0, null, 88, 94, 60, 0, 160, 300, null, null, "탈영 마렵다"],
[0, "사스케", null, 0, null, 90, 96, 57, 0, 160, 300, null, null, "아무리 고민해도 찰진 대사가 없습니다."],
[0, "SARS", null, 0, null, 91, 61, 92, 0, 160, 300, null, null, "아마존 주식 떡상 기원"],
[0, "마요이", null, 0, null, 93, 59, 93, 0, 160, 300, null, null, "로열방 없습니다"],
[0, "세정", null, 0, null, 88, 68, 92, 0, 160, 300, null, null],
[0, "김나영", null, 0, null, 93, 90, 64, 0, 160, 300, null, null, "김나영 머리에서 김나영"],
[0, "Cure", null, 0, null, 89, 63, 94, 0, 160, 300, null, null]
],
"general_ex":[
]
}
-859
View File
@@ -1,859 +0,0 @@
{
"title": "【가상모드24-b】 유저무쌍 멀티 유니버스!(천지비급)",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드24-b】</b>유저무쌍 멀티 유니버스!(비급)</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>졸장과 명장, 충신과 간신, 무장과 지장, 모든 것이 뒤바뀐 세계"
],
"stat": {
"total": 310,
"min": 40,
"max": 140
},
"const": {
"npcBanMessageProb":0,
"npcSeizureMessageProb":0,
"npcMessageFreqByDay":8,
"availableSpecialWar": [
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
"che_보병", "che_궁병", "che_기병", "che_공성",
"che_돌격", "che_무쌍", "che_견고", "che_위압",
"che_저격", "che_필살", "che_징병", "che_의술", "che_격노", "che_척사"
],
"allItems": {
"horse": {
"che_명마_01_노기": 0,
"che_명마_02_조랑": 0,
"che_명마_03_노새": 0,
"che_명마_04_나귀": 0,
"che_명마_05_갈색마": 0,
"che_명마_06_흑색마": 0,
"che_명마_07_백마" : 2,
"che_명마_07_기주마" : 2,
"che_명마_07_오환마" : 2,
"che_명마_07_백상" : 2,
"che_명마_08_양주마" : 2,
"che_명마_08_흉노마" : 2,
"che_명마_09_과하마" : 2,
"che_명마_09_의남백마" : 2,
"che_명마_10_대완마" : 2,
"che_명마_10_옥추마" : 2,
"che_명마_11_서량마" : 2,
"che_명마_11_화종마" : 2,
"che_명마_12_사륜거" : 2,
"che_명마_12_옥란백용구": 2,
"che_명마_13_절영" : 2,
"che_명마_13_적로" : 2,
"che_명마_14_적란마" : 2,
"che_명마_14_조황비전" : 2,
"che_명마_15_한혈마" : 2,
"che_명마_15_적토마" : 2
},
"weapon": {
"che_무기_01_단도": 0,
"che_무기_02_단궁": 0,
"che_무기_03_단극": 0,
"che_무기_04_목검": 0,
"che_무기_05_죽창": 0,
"che_무기_06_소부": 0,
"che_무기_07_동추": 2,
"che_무기_07_철편": 2,
"che_무기_07_철쇄": 2,
"che_무기_07_맥궁": 2,
"che_무기_08_유성추": 2,
"che_무기_08_철질여골": 2,
"che_무기_09_쌍철극": 2,
"che_무기_09_동호비궁": 2,
"che_무기_10_삼첨도": 2,
"che_무기_10_대부": 2,
"che_무기_11_고정도": 2,
"che_무기_11_이광궁": 2,
"che_무기_12_철척사모": 2,
"che_무기_12_칠성검": 2,
"che_무기_13_사모": 2,
"che_무기_13_양유기궁": 2,
"che_무기_14_언월도": 2,
"che_무기_14_방천화극": 2,
"che_무기_15_청홍검": 2,
"che_무기_15_의천검": 2
},
"book": {
"che_서적_01_효경전": 0,
"che_서적_02_회남자": 0,
"che_서적_03_변도론": 0,
"che_서적_04_건상역주": 0,
"che_서적_05_여씨춘추": 0,
"che_서적_06_사민월령": 0,
"che_서적_07_위료자": 2,
"che_서적_07_사마법": 2,
"che_서적_07_한서": 2,
"che_서적_07_논어": 2,
"che_서적_08_전론": 2,
"che_서적_08_사기": 2,
"che_서적_09_장자": 2,
"che_서적_09_역경": 2,
"che_서적_10_시경": 2,
"che_서적_10_구국론": 2,
"che_서적_11_상군서": 2,
"che_서적_11_춘추전": 2,
"che_서적_12_산해경": 2,
"che_서적_12_맹덕신서": 2,
"che_서적_13_관자": 2,
"che_서적_13_병법24편": 2,
"che_서적_14_한비자": 2,
"che_서적_14_오자병법": 2,
"che_서적_15_노자": 2,
"che_서적_15_손자병법": 2
},
"item": {
"che_치료_환약": 0,
"che_저격_수극": 0,
"che_사기_탁주": 0,
"che_훈련_청주": 0,
"che_계략_이추": 0,
"che_계략_향낭": 0,
"event_전투특기_격노": 0,
"event_전투특기_견고": 0,
"event_전투특기_공성": 0,
"event_전투특기_궁병": 0,
"event_전투특기_귀병": 0,
"event_전투특기_기병": 0,
"event_전투특기_돌격": 0,
"event_전투특기_무쌍": 0,
"event_전투특기_반계": 0,
"event_전투특기_보병": 0,
"event_전투특기_신산": 0,
"event_전투특기_신중": 0,
"event_전투특기_위압": 0,
"event_전투특기_의술": 0,
"event_전투특기_저격": 0,
"event_전투특기_집중": 0,
"event_전투특기_징병": 0,
"event_전투특기_척사": 0,
"event_전투특기_필살": 0,
"event_전투특기_환술": 0
}
}
},
"iconPath": ".",
"fiction": 1,
"nation":[
],
"diplomacy":[],
"general":[
[0, "아회남", null, 0, null, 75, 46, 84, 0, 160, 300, null, null],
[0, "이적", null, 0, null, 90, 86, 42, 0, 160, 300, null, null],
[0, "윤상", null, 0, null, 89, 86, 48, 0, 160, 300, null, null],
[0, "윤묵", null, 0, null, 84, 85, 54, 0, 160, 300, null, null],
[0, "우금", null, 0, null, 55, 48, 78, 0, 160, 300, null, null],
[0, "위관", null, 0, null, 71, 84, 41, 0, 160, 300, null, null],
[0, "원윤", null, 0, null, 88, 86, 41, 0, 160, 300, null, null],
[0, "원희", null, 0, null, 74, 87, 47, 0, 160, 300, null, null],
[0, "염행", null, 0, null, 62, 40, 82, 0, 160, 300, null, null],
[0, "염유", null, 0, null, 79, 80, 49, 0, 160, 300, null, null],
[0, "원술", null, 0, null, 80, 85, 45, 0, 160, 300, null, null],
[0, "원상", null, 0, null, 87, 45, 88, 0, 160, 300, null, null],
[0, "원소", null, 0, null, 50, 58, 39, 0, 160, 300, null, null],
[0, "염상", null, 0, null, 80, 83, 39, 0, 160, 300, null, null],
[0, "원담", null, 0, null, 80, 42, 88, 0, 160, 300, null, null],
[0, "염포", null, 0, null, 80, 85, 38, 0, 160, 300, null, null],
[0, "왕위", null, 0, null, 80, 60, 82, 0, 160, 300, null, null],
[0, "왕윤", null, 0, null, 87, 88, 52, 0, 160, 300, null, null],
[0, "왕항", null, 0, null, 64, 87, 56, 0, 160, 300, null, null],
[0, "왕찬", null, 0, null, 85, 87, 41, 0, 160, 300, null, null],
[0, "왕수", null, 0, null, 86, 83, 43, 0, 160, 300, null, null],
[0, "왕숙", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "왕준", null, 0, null, 55, 76, 46, 0, 160, 300, null, null],
[0, "왕쌍", null, 0, null, 73, 42, 81, 0, 160, 300, null, null],
[0, "왕창", null, 0, null, 76, 83, 51, 0, 160, 300, null, null],
[0, "왕평", null, 0, null, 52, 39, 69, 0, 160, 300, null, null],
[0, "왕보", null, 0, null, 78, 89, 41, 0, 160, 300, null, null],
[0, "왕문", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
[0, "왕릉", null, 0, null, 66, 80, 49, 0, 160, 300, null, null],
[0, "왕루", null, 0, null, 90, 77, 41, 0, 160, 300, null, null],
[0, "왕랑", null, 0, null, 87, 75, 49, 0, 160, 300, null, null],
[0, "온회", null, 0, null, 78, 74, 56, 0, 160, 300, null, null],
[0, "하안", null, 0, null, 85, 70, 58, 0, 160, 300, null, null],
[0, "괴월", null, 0, null, 79, 72, 45, 0, 160, 300, null, null],
[0, "괴량", null, 0, null, 72, 77, 42, 0, 160, 300, null, null],
[0, "가화", null, 0, null, 81, 55, 89, 0, 160, 300, null, null],
[0, "가규", null, 0, null, 62, 79, 46, 0, 160, 300, null, null],
[0, "하의", null, 0, null, 84, 51, 84, 0, 160, 300, null, null],
[0, "화흠", null, 0, null, 89, 87, 42, 0, 160, 300, null, null],
[0, "가후", null, 0, null, 82, 96, 31, 0, 160, 300, null, null],
[0, "곽가", null, 0, null, 90, 95, 43, 0, 160, 300, null, null],
[0, "악환", null, 0, null, 75, 40, 88, 0, 160, 300, null, null],
[0, "곽사", null, 0, null, 76, 54, 87, 0, 160, 300, null, null],
[0, "악취", null, 0, null, 87, 44, 79, 0, 160, 300, null, null],
[0, "곽준", null, 0, null, 67, 88, 57, 0, 160, 300, null, null],
[0, "학소", null, 0, null, 52, 57, 7, 0, 160, 300, null, null],
[0, "악진", null, 0, null, 60, 35, 74, 0, 160, 300, null, null],
[0, "곽도", null, 0, null, 78, 90, 38, 0, 160, 300, null, null],
[0, "학맹", null, 0, null, 78, 43, 87, 0, 160, 300, null, null],
[0, "곽유지", null, 0, null, 82, 81, 41, 0, 160, 300, null, null],
[0, "곽익", null, 0, null, 67, 71, 11, 0, 160, 300, null, null],
[0, "곽회", null, 0, null, 50, 74, 45, 0, 160, 300, null, null],
[0, "하후위", null, 0, null, 69, 47, 81, 0, 160, 300, null, null],
[0, "하후연", null, 0, null, 45, 28, 58, 0, 160, 300, null, null],
[0, "하후은", null, 0, null, 87, 52, 87, 0, 160, 300, null, null],
[0, "하후화", null, 0, null, 90, 86, 51, 0, 160, 300, null, null],
[0, "하후혜", null, 0, null, 90, 88, 48, 0, 160, 300, null, null],
[0, "하후현", null, 0, null, 86, 90, 44, 0, 160, 300, null, null],
[0, "하후상", null, 0, null, 61, 65, 35, 0, 160, 300, null, null],
[0, "하후덕", null, 0, null, 71, 57, 90, 0, 160, 300, null, null],
[0, "하후돈", null, 0, null, 49, 18, 32, 0, 160, 300, null, null, "부모님께 받은 신체 쫀맛탱!"],
[0, "하후패", null, 0, null, 61, 35, 77, 0, 160, 300, null, null],
[0, "하후무", null, 0, null, 98, 100, 73, 0, 160, 300, null, null, "나와 싸워 이길 자 누구인가!"],
[0, "가충", null, 0, null, 86, 89, 41, 0, 160, 300, null, null],
[0, "하진", null, 0, null, 89, 90, 45, 0, 160, 300, null, null, "돼지 잡던 내가 대장군?"],
[0, "화웅", null, 0, null, 62, 30, 75, 0, 160, 300, null, null],
[0, "한윤", null, 0, null, 84, 81, 35, 0, 160, 300, null, null],
[0, "관우", null, 0, null, 44, 21, 44, 0, 160, 300, null, null, "차가 식기 전에 목을 베이고 오겠소!"],
[0, "환계", null, 0, null, 85, 84, 52, 0, 160, 300, null, null],
[0, "관해", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "관구검", null, 0, null, 56, 44, 78, 0, 160, 300, null, null],
[0, "한현", null, 0, null, 96, 51, 97, 0, 160, 300, null, null],
[0, "한호", null, 0, null, 67, 80, 46, 0, 160, 300, null, null],
[0, "관흥", null, 0, null, 64, 46, 78, 0, 160, 300, null, null],
[0, "관색", null, 0, null, 66, 47, 84, 0, 160, 300, null, null],
[0, "한수", null, 0, null, 62, 82, 51, 0, 160, 300, null, null],
[0, "한숭", null, 0, null, 85, 85, 59, 0, 160, 300, null, null],
[0, "관정", null, 0, null, 84, 88, 57, 0, 160, 300, null, null],
[0, "한섬", null, 0, null, 71, 44, 94, 0, 160, 300, null, null],
[0, "감택", null, 0, null, 84, 70, 37, 0, 160, 300, null, null],
[0, "한충", null, 0, null, 76, 53, 82, 0, 160, 300, null, null],
[0, "한당", null, 0, null, 64, 45, 79, 0, 160, 300, null, null],
[0, "한덕", null, 0, null, 77, 54, 85, 0, 160, 300, null, null],
[0, "감녕", null, 0, null, 48, 45, 56, 0, 160, 300, null, null],
[0, "한복", null, 0, null, 82, 87, 83, 0, 160, 300, null, null],
[0, "관평", null, 0, null, 62, 38, 80, 0, 160, 300, null, null],
[0, "간옹", null, 0, null, 93, 91, 45, 0, 160, 300, null, null, "삼대장 간손미에서 간을 맡고 있습니다"],
[0, "안량", null, 0, null, 52, 44, 57, 0, 160, 300, null, null],
[0, "위연", null, 0, null, 49, 30, 60, 0, 160, 300, null, null],
[0, "국의", null, 0, null, 56, 52, 79, 0, 160, 300, null, null],
[0, "희지재", null, 0, null, 77, 85, 49, 0, 160, 300, null, null],
[0, "위속", null, 0, null, 73, 52, 89, 0, 160, 300, null, null],
[0, "위유", null, 0, null, 89, 89, 56, 0, 160, 300, null, null],
[0, "우금2", null, 0, null, 68, 51, 82, 0, 160, 300, null, null],
[0, "우보", null, 0, null, 82, 60, 89, 0, 160, 300, null, null],
[0, "강유", null, 0, null, 48, 58, 27, 0, 160, 300, null, null, "제갈량 너무 멍청하네 진짜"],
[0, "공지", null, 0, null, 87, 88, 55, 0, 160, 300, null, null],
[0, "교유", null, 0, null, 76, 51, 82, 0, 160, 300, null, null],
[0, "공도", null, 0, null, 81, 50, 87, 0, 160, 300, null, null],
[0, "허공", null, 0, null, 86, 44, 76, 0, 160, 300, null, null],
[0, "허정", null, 0, null, 87, 79, 42, 0, 160, 300, null, null],
[0, "허저", null, 0, null, 86, 23, 96, 0, 160, 300, null, null, "조조군의 지혜주머니 호치님이시다"],
[0, "허유", null, 0, null, 74, 89, 40, 0, 160, 300, null, null],
[0, "기령", null, 0, null, 55, 46, 69, 0, 160, 300, null, null],
[0, "김의", null, 0, null, 88, 82, 45, 0, 160, 300, null, null],
[0, "김배삼결", null, 0, null, 76, 44, 81, 0, 160, 300, null, null],
[0, "김선", null, 0, null, 88, 52, 91, 0, 160, 300, null, null],
[0, "우번", null, 0, null, 84, 87, 33, 0, 160, 300, null, null],
[0, "형도영", null, 0, null, 71, 41, 79, 0, 160, 300, null, null],
[0, "엄안", null, 0, null, 58, 37, 68, 0, 160, 300, null, null],
[0, "엄망", null, 0, null, 72, 49, 90, 0, 160, 300, null, null],
[0, "엄준", null, 0, null, 86, 78, 39, 0, 160, 300, null, null],
[0, "엄정", null, 0, null, 90, 85, 31, 0, 160, 300, null, null],
[0, "엄백호", null, 0, null, 96, 69, 99, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕이다!"],
[0, "엄여", null, 0, null, 90, 52, 96, 0, 160, 300, null, null, "내가 바로 동오의 엄덕왕 동생이다!"],
[0, "오의", null, 0, null, 61, 47, 87, 0, 160, 300, null, null],
[0, "황개", null, 0, null, 60, 43, 76, 0, 160, 300, null, null, "주유 이 미친 놈아!"],
[0, "고간", null, 0, null, 66, 64, 82, 0, 160, 300, null, null],
[0, "황권", null, 0, null, 65, 66, 32, 0, 160, 300, null, null],
[0, "고유", null, 0, null, 83, 87, 49, 0, 160, 300, null, null],
[0, "고순", null, 0, null, 53, 31, 60, 0, 160, 300, null, null, "함진영 그거 망한 지 오래됐음"],
[0, "고상", null, 0, null, 72, 52, 87, 0, 160, 300, null, null],
[0, "고승", null, 0, null, 73, 57, 88, 0, 160, 300, null, null],
[0, "후성", null, 0, null, 66, 55, 56, 0, 160, 300, null, null],
[0, "후선", null, 0, null, 77, 44, 86, 0, 160, 300, null, null],
[0, "황조", null, 0, null, 59, 51, 82, 0, 160, 300, null, null],
[0, "공손월", null, 0, null, 66, 48, 93, 0, 160, 300, null, null],
[0, "공손연", null, 0, null, 75, 40, 91, 0, 160, 300, null, null],
[0, "공손공", null, 0, null, 89, 83, 41, 0, 160, 300, null, null],
[0, "공손강", null, 0, null, 68, 44, 84, 0, 160, 300, null, null],
[0, "공손찬", null, 0, null, 54, 38, 68, 0, 160, 300, null, null, "백마 어떻게 타요?"],
[0, "공손속", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "공손도", null, 0, null, 73, 49, 81, 0, 160, 300, null, null],
[0, "공손범", null, 0, null, 67, 41, 89, 0, 160, 300, null, null],
[0, "황충", null, 0, null, 52, 34, 65, 0, 160, 300, null, null],
[0, "고정", null, 0, null, 85, 57, 87, 0, 160, 300, null, null],
[0, "고패", null, 0, null, 74, 70, 31, 0, 160, 300, null, null],
[0, "황보숭", null, 0, null, 49, 29, 28, 0, 160, 300, null, null],
[0, "공융", null, 0, null, 91, 86, 37, 0, 160, 300, null, null],
[0, "고람", null, 0, null, 64, 38, 60, 0, 160, 300, null, null],
[0, "오경", null, 0, null, 71, 43, 75, 0, 160, 300, null, null],
[0, "호거아", null, 0, null, 70, 48, 80, 0, 160, 300, null, null],
[0, "호진", null, 0, null, 75, 46, 88, 0, 160, 300, null, null],
[0, "올돌골", null, 0, null, 96, 54, 99, 0, 160, 300, null, null, "남만이 낳은 천재 올돌골님이시다"],
[0, "호반", null, 0, null, 85, 41, 81, 0, 160, 300, null, null],
[0, "오반", null, 0, null, 66, 49, 90, 0, 160, 300, null, null],
[0, "고옹", null, 0, null, 88, 82, 49, 0, 160, 300, null, null],
[0, "오란", null, 0, null, 72, 50, 85, 0, 160, 300, null, null],
[0, "채화", null, 0, null, 91, 41, 87, 0, 160, 300, null, null],
[0, "채중", null, 0, null, 90, 46, 88, 0, 160, 300, null, null],
[0, "채모", null, 0, null, 70, 45, 63, 0, 160, 300, null, null],
[0, "착융", null, 0, null, 83, 51, 86, 0, 160, 300, null, null],
[0, "사마의", null, 0, null, 41, 47, 42, 0, 160, 300, null, null, "조조 걔 별 거 아님"],
[0, "사마염", null, 0, null, 71, 81, 43, 0, 160, 300, null, null],
[0, "사마사", null, 0, null, 56, 76, 41, 0, 160, 300, null, null, "위나라 조진 썰 푼다"],
[0, "사마소", null, 0, null, 55, 83, 42, 0, 160, 300, null, null],
[0, "사마부", null, 0, null, 70, 83, 43, 0, 160, 300, null, null],
[0, "사마랑", null, 0, null, 80, 39, 68, 0, 160, 300, null, null],
[0, "사마가", null, 0, null, 74, 26, 85, 0, 160, 300, null, null],
[0, "주흔", null, 0, null, 75, 89, 47, 0, 160, 300, null, null],
[0, "주앙", null, 0, null, 66, 55, 82, 0, 160, 300, null, null],
[0, "주지", null, 0, null, 67, 45, 89, 0, 160, 300, null, null],
[0, "주창", null, 0, null, 72, 43, 68, 0, 160, 300, null, null],
[0, "주태", null, 0, null, 56, 30, 52, 0, 160, 300, null, null],
[0, "주방", null, 0, null, 88, 66, 40, 0, 160, 300, null, null],
[0, "주유", null, 0, null, 43, 22, 43, 0, 160, 300, null, null, "동남풍이 부는구나. 황개 몸에 불을 질러라."],
[0, "주환", null, 0, null, 53, 36, 55, 0, 160, 300, null, null],
[0, "주거", null, 0, null, 63, 83, 58, 0, 160, 300, null, null],
[0, "축융", null, 0, null, 98, 65, 95, 0, 160, 300, null, null],
[0, "주준", null, 0, null, 51, 83, 54, 0, 160, 300, null, null],
[0, "주연", null, 0, null, 54, 55, 83, 0, 160, 300, null, null],
[0, "주치", null, 0, null, 69, 56, 68, 0, 160, 300, null, null],
[0, "주포", null, 0, null, 72, 57, 86, 0, 160, 300, null, null],
[0, "주령", null, 0, null, 62, 47, 87, 0, 160, 300, null, null],
[0, "순욱", null, 0, null, 62, 72, 33, 0, 160, 300, null, null],
[0, "순우경", null, 0, null, 62, 74, 41, 0, 160, 300, null, null],
[0, "순심", null, 0, null, 85, 86, 22, 0, 160, 300, null, null],
[0, "순유", null, 0, null, 60, 75, 35, 0, 160, 300, null, null],
[0, "장완", null, 0, null, 62, 76, 31, 0, 160, 300, null, null],
[0, "종회", null, 0, null, 52, 78, 47, 0, 160, 300, null, null],
[0, "장간", null, 0, null, 81, 84, 64, 0, 160, 300, null, null],
[0, "장의거", null, 0, null, 69, 91, 71, 0, 160, 300, null, null],
[0, "장흠", null, 0, null, 62, 45, 86, 0, 160, 300, null, null],
[0, "장제3", null, 0, null, 78, 90, 45, 0, 160, 300, null, null],
[0, "초주", null, 0, null, 84, 87, 23, 0, 160, 300, null, null],
[0, "초촉", null, 0, null, 75, 64, 31, 0, 160, 300, null, null],
[0, "향총", null, 0, null, 64, 84, 53, 0, 160, 300, null, null],
[0, "종요", null, 0, null, 61, 86, 40, 0, 160, 300, null, null],
[0, "향랑", null, 0, null, 82, 82, 46, 0, 160, 300, null, null],
[0, "서영", null, 0, null, 48, 50, 78, 0, 160, 300, null, null],
[0, "제갈각", null, 0, null, 68, 83, 40, 0, 160, 300, null, null],
[0, "제갈근", null, 0, null, 65, 26, 35, 0, 160, 300, null, null],
[0, "제갈균", null, 0, null, 81, 55, 88, 0, 160, 300, null, null],
[0, "제갈탄", null, 0, null, 68, 86, 44, 0, 160, 300, null, null],
[0, "제갈량", null, 0, null, 42, 14, 22, 0, 160, 300, null, null, "헤헤헤…제갈량 바보 아니다. 엄마가 바보 아니라 그랬다."],
[0, "서황", null, 0, null, 45, 26, 46, 0, 160, 300, null, null],
[0, "서서", null, 0, null, 46, 26, 21, 0, 160, 300, null, null, "제갈량 어디 가서 나랑 동문이라고 하지마라"],
[0, "서성", null, 0, null, 54, 59, 59, 0, 160, 300, null, null],
[0, "서막", null, 0, null, 85, 80, 32, 0, 160, 300, null, null],
[0, "신의", null, 0, null, 85, 50, 81, 0, 160, 300, null, null],
[0, "신탐", null, 0, null, 84, 58, 86, 0, 160, 300, null, null],
[0, "심배", null, 0, null, 60, 60, 56, 0, 160, 300, null, null],
[0, "신비", null, 0, null, 88, 76, 51, 0, 160, 300, null, null, "뭘 봐? 인체 신비해지고 싶냐"],
[0, "신평", null, 0, null, 71, 45, 63, 0, 160, 300, null, null],
[0, "진복", null, 0, null, 89, 83, 47, 0, 160, 300, null, null],
[0, "진랑", null, 0, null, 82, 60, 85, 0, 160, 300, null, null],
[0, "휴고", null, 0, null, 77, 59, 82, 0, 160, 300, null, null],
[0, "추단", null, 0, null, 79, 46, 76, 0, 160, 300, null, null],
[0, "성의", null, 0, null, 66, 58, 87, 0, 160, 300, null, null],
[0, "성공영", null, 0, null, 67, 38, 60, 0, 160, 300, null, null],
[0, "설종", null, 0, null, 76, 74, 57, 0, 160, 300, null, null],
[0, "단경", null, 0, null, 69, 52, 87, 0, 160, 300, null, null],
[0, "전종", null, 0, null, 72, 85, 55, 0, 160, 300, null, null],
[0, "조예", null, 0, null, 88, 88, 48, 0, 160, 300, null, null],
[0, "조휴", null, 0, null, 56, 52, 72, 0, 160, 300, null, null],
[0, "송헌", null, 0, null, 72, 53, 84, 0, 160, 300, null, null],
[0, "조앙", null, 0, null, 62, 40, 71, 0, 160, 300, null, null],
[0, "조홍", null, 0, null, 60, 55, 85, 0, 160, 300, null, null],
[0, "조순", null, 0, null, 55, 37, 77, 0, 160, 300, null, null],
[0, "조창", null, 0, null, 54, 39, 81, 0, 160, 300, null, null],
[0, "조식", null, 0, null, 85, 93, 14, 0, 160, 300, null, null],
[0, "조진", null, 0, null, 52, 56, 44, 0, 160, 300, null, null],
[0, "조인", null, 0, null, 46, 40, 60, 0, 160, 300, null, null],
[0, "조성", null, 0, null, 86, 66, 37, 0, 160, 300, null, null],
[0, "조조", null, 0, null, 40, 17, 13, 0, 160, 300, null, null, "미망인이 뭐예요?"],
[0, "조충", null, 0, null, 87, 82, 36, 0, 160, 300, null, null],
[0, "장패", null, 0, null, 62, 44, 87, 0, 160, 300, null, null],
[0, "조비", null, 0, null, 65, 36, 53, 0, 160, 300, null, null],
[0, "조표", null, 0, null, 86, 51, 83, 0, 160, 300, null, null],
[0, "저수", null, 0, null, 54, 31, 45, 0, 160, 300, null, null],
[0, "소비", null, 0, null, 71, 85, 44, 0, 160, 300, null, null],
[0, "조무", null, 0, null, 70, 49, 71, 0, 160, 300, null, null],
[0, "손환", null, 0, null, 58, 64, 34, 0, 160, 300, null, null],
[0, "손견", null, 0, null, 46, 45, 22, 0, 160, 300, null, null, "강동의 고양이 손견이 간다"],
[0, "손건", null, 0, null, 96, 93, 51, 0, 160, 300, null, null, "삼대장 간손미에서 손을 맡고 있습니다"],
[0, "손권", null, 0, null, 54, 49, 29, 0, 160, 300, null, null],
[0, "손교", null, 0, null, 63, 58, 88, 0, 160, 300, null, null],
[0, "손책", null, 0, null, 47, 26, 36, 0, 160, 300, null, null],
[0, "손소", null, 0, null, 58, 61, 32, 0, 160, 300, null, null],
[0, "손정", null, 0, null, 74, 77, 37, 0, 160, 300, null, null],
[0, "손중", null, 0, null, 78, 49, 80, 0, 160, 300, null, null],
[0, "손등", null, 0, null, 78, 33, 61, 0, 160, 300, null, null],
[0, "손유", null, 0, null, 63, 50, 39, 0, 160, 300, null, null],
[0, "손익", null, 0, null, 73, 57, 37, 0, 160, 300, null, null],
[0, "손례", null, 0, null, 62, 39, 81, 0, 160, 300, null, null],
[0, "태사자", null, 0, null, 46, 22, 47, 0, 160, 300, null, null],
[0, "대래동주", null, 0, null, 89, 57, 87, 0, 160, 300, null, null],
[0, "대릉", null, 0, null, 70, 55, 81, 0, 160, 300, null, null],
[0, "타사대왕", null, 0, null, 78, 27, 70, 0, 160, 300, null, null],
[0, "담웅", null, 0, null, 82, 57, 96, 0, 160, 300, null, null],
[0, "장윤", null, 0, null, 68, 56, 94, 0, 160, 300, null, null],
[0, "조운", null, 0, null, 42, 22, 13, 0, 160, 300, null, null, "아두야 나 좀 살려줘"],
[0, "장위", null, 0, null, 66, 54, 95, 0, 160, 300, null, null],
[0, "장영", null, 0, null, 65, 56, 69, 0, 160, 300, null, null],
[0, "장연", null, 0, null, 64, 49, 83, 0, 160, 300, null, null],
[0, "장횡", null, 0, null, 81, 30, 70, 0, 160, 300, null, null],
[0, "장온", null, 0, null, 88, 79, 48, 0, 160, 300, null, null],
[0, "장개", null, 0, null, 96, 54, 82, 0, 160, 300, null, null],
[0, "장각", null, 0, null, 53, 30, 50, 0, 160, 300, null, null],
[0, "장기", null, 0, null, 66, 72, 54, 0, 160, 300, null, null],
[0, "장의", null, 0, null, 61, 85, 55, 0, 160, 300, null, null],
[0, "장훈", null, 0, null, 68, 62, 93, 0, 160, 300, null, null],
[0, "장굉", null, 0, null, 86, 88, 24, 0, 160, 300, null, null],
[0, "장합", null, 0, null, 48, 22, 41, 0, 160, 300, null, null],
[0, "조홍2", null, 0, null, 74, 68, 22, 0, 160, 300, null, null],
[0, "장제2", null, 0, null, 70, 74, 34, 0, 160, 300, null, null],
[0, "장수", null, 0, null, 60, 57, 89, 0, 160, 300, null, null],
[0, "장소", null, 0, null, 59, 87, 43, 0, 160, 300, null, null],
[0, "장송", null, 0, null, 80, 64, 45, 0, 160, 300, null, null],
[0, "장임", null, 0, null, 55, 46, 76, 0, 160, 300, null, null],
[0, "장제", null, 0, null, 73, 37, 60, 0, 160, 300, null, null],
[0, "장막", null, 0, null, 88, 87, 59, 0, 160, 300, null, null],
[0, "조범", null, 0, null, 92, 90, 58, 0, 160, 300, null, null],
[0, "장비", null, 0, null, 43, 2, 36, 0, 160, 300, null, null, "덤비지 마….제발"],
[0, "장포", null, 0, null, 62, 46, 82, 0, 160, 300, null, null],
[0, "장보", null, 0, null, 57, 80, 49, 0, 160, 300, null, null],
[0, "장만성", null, 0, null, 65, 49, 85, 0, 160, 300, null, null],
[0, "장양", null, 0, null, 68, 50, 80, 0, 160, 300, null, null],
[0, "장익", null, 0, null, 65, 85, 44, 0, 160, 300, null, null],
[0, "장료", null, 0, null, 44, 26, 46, 0, 160, 300, null, null],
[0, "장량", null, 0, null, 62, 50, 81, 0, 160, 300, null, null],
[0, "조루", null, 0, null, 70, 91, 62, 0, 160, 300, null, null],
[0, "장로", null, 0, null, 75, 98, 49, 0, 160, 300, null, null],
[0, "진횡", null, 0, null, 76, 57, 84, 0, 160, 300, null, null],
[0, "진응", null, 0, null, 78, 58, 91, 0, 160, 300, null, null],
[0, "진기", null, 0, null, 82, 65, 92, 0, 160, 300, null, null],
[0, "진궁", null, 0, null, 56, 85, 40, 0, 160, 300, null, null],
[0, "진교", null, 0, null, 79, 83, 53, 0, 160, 300, null, null],
[0, "진군", null, 0, null, 88, 13, 65, 0, 160, 300, null, null],
[0, "진규", null, 0, null, 80, 76, 38, 0, 160, 300, null, null],
[0, "진식", null, 0, null, 70, 59, 85, 0, 160, 300, null, null],
[0, "진진", null, 0, null, 92, 90, 51, 0, 160, 300, null, null],
[0, "진태", null, 0, null, 54, 72, 41, 0, 160, 300, null, null],
[0, "진등", null, 0, null, 61, 81, 49, 0, 160, 300, null, null],
[0, "진도", null, 0, null, 58, 52, 82, 0, 160, 300, null, null],
[0, "진무", null, 0, null, 64, 43, 97, 0, 160, 300, null, null],
[0, "진란", null, 0, null, 74, 51, 80, 0, 160, 300, null, null],
[0, "진림", null, 0, null, 95, 11, 65, 0, 160, 300, null, null],
[0, "정욱", null, 0, null, 64, 91, 36, 0, 160, 300, null, null],
[0, "정원지", null, 0, null, 71, 56, 83, 0, 160, 300, null, null],
[0, "정은", null, 0, null, 71, 57, 80, 0, 160, 300, null, null],
[0, "정원", null, 0, null, 70, 54, 85, 0, 160, 300, null, null],
[0, "정보", null, 0, null, 56, 11, 46, 0, 160, 300, null, null],
[0, "정봉", null, 0, null, 59, 38, 71, 0, 160, 300, null, null],
[0, "전위", null, 0, null, 41, 22, 48, 0, 160, 300, null, null, "적이 열 보 안으로 들어오거든 나부터 튄다"],
[0, "전해", null, 0, null, 72, 55, 85, 0, 160, 300, null, null],
[0, "전주", null, 0, null, 74, 89, 57, 0, 160, 300, null, null],
[0, "전풍", null, 0, null, 58, 67, 24, 0, 160, 300, null, null, "아 원소 저거 진짜 사람 아니네"],
[0, "전예", null, 0, null, 47, 55, 24, 0, 160, 300, null, null],
[0, "동윤", null, 0, null, 90, 82, 51, 0, 160, 300, null, null],
[0, "동화", null, 0, null, 83, 86, 45, 0, 160, 300, null, null],
[0, "등애", null, 0, null, 48, 47, 26, 0, 160, 300, null, null, "이 산이 아닌개벼…"],
[0, "도겸", null, 0, null, 89, 83, 56, 0, 160, 300, null, null],
[0, "등현", null, 0, null, 79, 67, 35, 0, 160, 300, null, null],
[0, "등지", null, 0, null, 67, 68, 49, 0, 160, 300, null, null],
[0, "동습", null, 0, null, 68, 45, 80, 0, 160, 300, null, null],
[0, "동승", null, 0, null, 84, 87, 55, 0, 160, 300, null, null],
[0, "동소", null, 0, null, 86, 85, 40, 0, 160, 300, null, null],
[0, "동탁", null, 0, null, 49, 43, 73, 0, 160, 300, null, null],
[0, "동도나", null, 0, null, 72, 57, 89, 0, 160, 300, null, null],
[0, "동민", null, 0, null, 89, 51, 87, 0, 160, 300, null, null],
[0, "등무", null, 0, null, 79, 55, 91, 0, 160, 300, null, null],
[0, "두기", null, 0, null, 66, 17, 62, 0, 160, 300, null, null],
[0, "두예", null, 0, null, 44, 71, 35, 0, 160, 300, null, null],
[0, "배원소", null, 0, null, 90, 45, 85, 0, 160, 300, null, null],
[0, "마완", null, 0, null, 69, 56, 84, 0, 160, 300, null, null],
[0, "마휴", null, 0, null, 72, 57, 90, 0, 160, 300, null, null],
[0, "파재", null, 0, null, 66, 56, 85, 0, 160, 300, null, null],
[0, "마준", null, 0, null, 82, 88, 39, 0, 160, 300, null, null],
[0, "마속", null, 0, null, 69, 51, 26, 0, 160, 300, null, null],
[0, "마대", null, 0, null, 61, 45, 78, 0, 160, 300, null, null],
[0, "마충", null, 0, null, 62, 48, 88, 0, 160, 300, null, null],
[0, "마초", null, 0, null, 54, 33, 46, 0, 160, 300, null, null, "서량의 븅마초 나가신다"],
[0, "마철", null, 0, null, 70, 48, 77, 0, 160, 300, null, null],
[0, "마등", null, 0, null, 55, 30, 58, 0, 160, 300, null, null],
[0, "마량", null, 0, null, 87, 17, 55, 0, 160, 300, null, null],
[0, "반준", null, 0, null, 79, 91, 48, 0, 160, 300, null, null],
[0, "반장", null, 0, null, 64, 50, 81, 0, 160, 300, null, null],
[0, "번조", null, 0, null, 74, 57, 88, 0, 160, 300, null, null],
[0, "번능", null, 0, null, 71, 19, 84, 0, 160, 300, null, null],
[0, "반봉", null, 0, null, 84, 53, 86, 0, 160, 300, null, null],
[0, "비의", null, 0, null, 58, 84, 42, 0, 160, 300, null, null],
[0, "비연", null, 0, null, 80, 62, 89, 0, 160, 300, null, null],
[0, "비시", null, 0, null, 82, 42, 75, 0, 160, 300, null, null],
[0, "미축", null, 0, null, 90, 91, 52, 0, 160, 300, null, null, "돈도 많고 싸움도 잘하는 간손미 에이스 미축입니다"],
[0, "미방", null, 0, null, 86, 50, 88, 0, 160, 300, null, null],
[0, "비요", null, 0, null, 70, 88, 57, 0, 160, 300, null, null],
[0, "무안국", null, 0, null, 70, 51, 86, 0, 160, 300, null, null],
[0, "풍습", null, 0, null, 68, 59, 90, 0, 160, 300, null, null],
[0, "부사인", null, 0, null, 94, 47, 83, 0, 160, 300, null, null],
[0, "부첨", null, 0, null, 67, 45, 78, 0, 160, 300, null, null],
[0, "부손", null, 0, null, 87, 90, 40, 0, 160, 300, null, null],
[0, "문앙", null, 0, null, 64, 34, 75, 0, 160, 300, null, null],
[0, "문흠", null, 0, null, 66, 61, 26, 0, 160, 300, null, null],
[0, "문추", null, 0, null, 53, 26, 51, 0, 160, 300, null, null],
[0, "문빙", null, 0, null, 52, 35, 55, 0, 160, 300, null, null],
[0, "변희", null, 0, null, 84, 50, 78, 0, 160, 300, null, null],
[0, "망아장", null, 0, null, 90, 51, 87, 0, 160, 300, null, null],
[0, "봉기", null, 0, null, 84, 90, 46, 0, 160, 300, null, null],
[0, "방희", null, 0, null, 80, 82, 41, 0, 160, 300, null, null],
[0, "법정", null, 0, null, 58, 46, 11, 0, 160, 300, null, null],
[0, "방통", null, 0, null, 51, 43, 22, 0, 160, 300, null, null],
[0, "방덕", null, 0, null, 51, 26, 40, 0, 160, 300, null, null],
[0, "포륭", null, 0, null, 82, 54, 91, 0, 160, 300, null, null],
[0, "목순", null, 0, null, 88, 33, 88, 0, 160, 300, null, null],
[0, "목록대왕", null, 0, null, 93, 59, 99, 0, 160, 300, null, null, "코끼리만 있으면 너도 한 방 나도 한 방"],
[0, "보즐", null, 0, null, 57, 19, 59, 0, 160, 300, null, null],
[0, "만총", null, 0, null, 52, 16, 53, 0, 160, 300, null, null],
[0, "모개", null, 0, null, 77, 81, 20, 0, 160, 300, null, null],
[0, "맹획", null, 0, null, 59, 12, 88, 0, 160, 300, null, null],
[0, "맹체", null, 0, null, 65, 85, 55, 0, 160, 300, null, null],
[0, "맹우", null, 0, null, 90, 9, 90, 0, 160, 300, null, null],
[0, "유섭", null, 0, null, 78, 51, 96, 0, 160, 300, null, null],
[0, "양부", null, 0, null, 78, 86, 52, 0, 160, 300, null, null],
[0, "옹개", null, 0, null, 67, 55, 83, 0, 160, 300, null, null],
[0, "양의", null, 0, null, 72, 20, 58, 0, 160, 300, null, null],
[0, "양호", null, 0, null, 46, 51, 28, 0, 160, 300, null, null],
[0, "양홍", null, 0, null, 92, 87, 13, 0, 160, 300, null, null],
[0, "양앙", null, 0, null, 72, 58, 92, 0, 160, 300, null, null],
[0, "양추", null, 0, null, 88, 55, 90, 0, 160, 300, null, null],
[0, "양수", null, 0, null, 92, 91, 1, 0, 160, 300, null, null],
[0, "양추2", null, 0, null, 73, 56, 96, 0, 160, 300, null, null],
[0, "양송", null, 0, null, 100, 65, 98, 0, 160, 300, null, null, "군신 악의만이 나와 비견될만 하다"],
[0, "양임", null, 0, null, 70, 42, 84, 0, 160, 300, null, null],
[0, "양조", null, 0, null, 87, 79, 34, 0, 160, 300, null, null],
[0, "양백", null, 0, null, 90, 81, 31, 0, 160, 300, null, null],
[0, "양부2", null, 0, null, 73, 90, 47, 0, 160, 300, null, null],
[0, "양봉", null, 0, null, 74, 75, 39, 0, 160, 300, null, null],
[0, "양봉2", null, 0, null, 86, 28, 87, 0, 160, 300, null, null],
[0, "뇌동", null, 0, null, 71, 52, 89, 0, 160, 300, null, null],
[0, "뇌박", null, 0, null, 78, 60, 84, 0, 160, 300, null, null],
[0, "이이", null, 0, null, 77, 22, 81, 0, 160, 300, null, null],
[0, "이회", null, 0, null, 61, 82, 51, 0, 160, 300, null, null],
[0, "이각", null, 0, null, 71, 58, 86, 0, 160, 300, null, null],
[0, "육항", null, 0, null, 46, 61, 27, 0, 160, 300, null, null],
[0, "육적", null, 0, null, 60, 61, 28, 0, 160, 300, null, null],
[0, "육손", null, 0, null, 45, 69, 34, 0, 160, 300, null, null],
[0, "이엄", null, 0, null, 57, 46, 77, 0, 160, 300, null, null],
[0, "이유", null, 0, null, 69, 84, 37, 0, 160, 300, null, null],
[0, "이숙", null, 0, null, 87, 41, 89, 0, 160, 300, null, null],
[0, "이통", null, 0, null, 67, 49, 78, 0, 160, 300, null, null],
[0, "이전", null, 0, null, 62, 40, 61, 0, 160, 300, null, null],
[0, "이풍", null, 0, null, 71, 56, 90, 0, 160, 300, null, null],
[0, "유언", null, 0, null, 79, 82, 50, 0, 160, 300, null, null],
[0, "유괴", null, 0, null, 69, 57, 88, 0, 160, 300, null, null],
[0, "유기", null, 0, null, 88, 88, 37, 0, 160, 300, null, null],
[0, "유우", null, 0, null, 78, 87, 55, 0, 160, 300, null, null],
[0, "유훈", null, 0, null, 90, 37, 82, 0, 160, 300, null, null],
[0, "유현", null, 0, null, 86, 44, 89, 0, 160, 300, null, null],
[0, "유순", null, 0, null, 77, 34, 92, 0, 160, 300, null, null],
[0, "유장", null, 0, null, 99, 90, 47, 0, 160, 300, null, null],
[0, "유심", null, 0, null, 80, 82, 56, 0, 160, 300, null, null],
[0, "유선", null, 0, null, 97, 65, 96, 0, 160, 300, null, null, "촉은 제갈량이 다 말아먹었다"],
[0, "유종", null, 0, null, 86, 88, 35, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 85, 87, 34, 0, 160, 300, null, null],
[0, "유파", null, 0, null, 81, 38, 85, 0, 160, 300, null, null],
[0, "유반", null, 0, null, 71, 54, 93, 0, 160, 300, null, null],
[0, "유비", null, 0, null, 52, 18, 23, 0, 160, 300, null, null, "돗자리 좀 사주세요"],
[0, "유표", null, 0, null, 82, 81, 28, 0, 160, 300, null, null],
[0, "유복", null, 0, null, 76, 81, 56, 0, 160, 300, null, null],
[0, "유벽", null, 0, null, 70, 58, 93, 0, 160, 300, null, null],
[0, "유봉", null, 0, null, 65, 51, 32, 0, 160, 300, null, null],
[0, "유엽", null, 0, null, 84, 65, 38, 0, 160, 300, null, null],
[0, "유요", null, 0, null, 78, 63, 24, 0, 160, 300, null, null],
[0, "여위황", null, 0, null, 82, 57, 86, 0, 160, 300, null, null],
[0, "요화", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
[0, "양흥", null, 0, null, 79, 45, 81, 0, 160, 300, null, null],
[0, "양습", null, 0, null, 67, 80, 56, 0, 160, 300, null, null],
[0, "양서", null, 0, null, 84, 78, 54, 0, 160, 300, null, null],
[0, "능조", null, 0, null, 65, 29, 38, 0, 160, 300, null, null],
[0, "능통", null, 0, null, 57, 11, 40, 0, 160, 300, null, null],
[0, "여개", null, 0, null, 87, 80, 53, 0, 160, 300, null, null],
[0, "여건", null, 0, null, 83, 40, 78, 0, 160, 300, null, null],
[0, "여광", null, 0, null, 84, 41, 87, 0, 160, 300, null, null],
[0, "여상", null, 0, null, 86, 39, 88, 0, 160, 300, null, null],
[0, "여대", null, 0, null, 60, 69, 38, 0, 160, 300, null, null],
[0, "여범", null, 0, null, 67, 86, 55, 0, 160, 300, null, null],
[0, "여포", null, 0, null, 51, 10, 100, 0, 160, 300, null, null, "이기기 위한 전략만 내어드리겠습니다."],
[0, "여몽", null, 0, null, 49, 31, 10, 0, 160, 300, null, null],
[0, "윤직", null, 0, null, 88, 88, 47, 0, 160, 300, null, null],
[0, "냉포", null, 0, null, 69, 48, 79, 0, 160, 300, null, null],
[0, "누규", null, 0, null, 88, 87, 43, 0, 160, 300, null, null],
[0, "노숙", null, 0, null, 51, 64, 17, 0, 160, 300, null, null],
[0, "노식", null, 0, null, 54, 77, 48, 0, 160, 300, null, null],
[0, "범강", null, 0, null, 89, 89, 34, 0, 160, 300, null, null],
[0, "장달", null, 0, null, 87, 84, 46, 0, 160, 300, null, null],
[0, "규람", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
[0, "대원", null, 0, null, 82, 88, 42, 0, 160, 300, null, null],
[0, "왕기", null, 0, null, 59, 76, 44, 0, 160, 300, null, null],
[0, "왕상", null, 0, null, 87, 89, 52, 0, 160, 300, null, null],
[0, "왕돈", null, 0, null, 80, 54, 94, 0, 160, 300, null, null],
[0, "악침", null, 0, null, 67, 55, 97, 0, 160, 300, null, null],
[0, "하제", null, 0, null, 57, 79, 48, 0, 160, 300, null, null],
[0, "환범", null, 0, null, 81, 89, 42, 0, 160, 300, null, null],
[0, "견초", null, 0, null, 68, 51, 83, 0, 160, 300, null, null],
[0, "고당륭", null, 0, null, 90, 90, 44, 0, 160, 300, null, null],
[0, "오찬", null, 0, null, 72, 91, 42, 0, 160, 300, null, null],
[0, "호질", null, 0, null, 67, 88, 56, 0, 160, 300, null, null],
[0, "오질", null, 0, null, 90, 89, 22, 0, 160, 300, null, null],
[0, "호준", null, 0, null, 61, 54, 85, 0, 160, 300, null, null],
[0, "고담", null, 0, null, 87, 87, 33, 0, 160, 300, null, null],
[0, "최림", null, 0, null, 84, 85, 14, 0, 160, 300, null, null],
[0, "사마망", null, 0, null, 62, 82, 47, 0, 160, 300, null, null],
[0, "주이", null, 0, null, 70, 57, 88, 0, 160, 300, null, null],
[0, "전단", null, 0, null, 73, 76, 71, 0, 160, 300, null, null],
[0, "조우", null, 0, null, 89, 83, 23, 0, 160, 300, null, null],
[0, "조상", null, 0, null, 81, 87, 40, 0, 160, 300, null, null],
[0, "조방", null, 0, null, 90, 86, 43, 0, 160, 300, null, null],
[0, "태사향", null, 0, null, 83, 52, 82, 0, 160, 300, null, null],
[0, "장휴", null, 0, null, 77, 43, 66, 0, 160, 300, null, null],
[0, "장호", null, 0, null, 65, 56, 89, 0, 160, 300, null, null],
[0, "조광", null, 0, null, 73, 59, 87, 0, 160, 300, null, null],
[0, "장집", null, 0, null, 64, 81, 50, 0, 160, 300, null, null],
[0, "장승", null, 0, null, 63, 85, 55, 0, 160, 300, null, null],
[0, "장소2", null, 0, null, 87, 84, 19, 0, 160, 300, null, null],
[0, "조통", null, 0, null, 72, 53, 81, 0, 160, 300, null, null],
[0, "진표", null, 0, null, 74, 88, 56, 0, 160, 300, null, null],
[0, "정무", null, 0, null, 84, 85, 45, 0, 160, 300, null, null],
[0, "정봉2", null, 0, null, 74, 22, 74, 0, 160, 300, null, null],
[0, "전만", null, 0, null, 89, 11, 67, 0, 160, 300, null, null],
[0, "마균", null, 0, null, 88, 83, 29, 0, 160, 300, null, null],
[0, "방회", null, 0, null, 71, 55, 86, 0, 160, 300, null, null],
[0, "낙통", null, 0, null, 64, 82, 55, 0, 160, 300, null, null],
[0, "육개", null, 0, null, 75, 79, 51, 0, 160, 300, null, null],
[0, "유찬", null, 0, null, 62, 59, 81, 0, 160, 300, null, null],
[0, "유소", null, 0, null, 72, 87, 56, 0, 160, 300, null, null],
[0, "요립", null, 0, null, 88, 85, 24, 0, 160, 300, null, null],
[0, "여거", null, 0, null, 62, 89, 49, 0, 160, 300, null, null],
[0, "제갈첨", null, 0, null, 70, 83, 54, 0, 160, 300, null, null],
[0, "손휴", null, 0, null, 83, 90, 52, 0, 160, 300, null, null],
[0, "극정", null, 0, null, 90, 77, 32, 0, 160, 300, null, null],
[0, "호분", null, 0, null, 69, 54, 80, 0, 160, 300, null, null],
[0, "손량", null, 0, null, 88, 84, 30, 0, 160, 300, null, null],
[0, "마막", null, 0, null, 96, 98, 71, 0, 160, 300, null, null],
[0, "손호", null, 0, null, 89, 43, 41, 0, 160, 300, null, null],
[0, "조모", null, 0, null, 86, 39, 81, 0, 160, 300, null, null],
[0, "조환", null, 0, null, 90, 42, 80, 0, 160, 300, null, null],
[0, "사마유", null, 0, null, 69, 86, 55, 0, 160, 300, null, null],
[0, "제갈상", null, 0, null, 76, 51, 78, 0, 160, 300, null, null],
[0, "손화", null, 0, null, 87, 71, 22, 0, 160, 300, null, null],
[0, "염우", null, 0, null, 88, 49, 89, 0, 160, 300, null, null],
[0, "왕경", null, 0, null, 73, 81, 59, 0, 160, 300, null, null],
[0, "왕혼", null, 0, null, 66, 59, 80, 0, 160, 300, null, null],
[0, "곽혁", null, 0, null, 87, 81, 30, 0, 160, 300, null, null],
[0, "가범", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
[0, "서질", null, 0, null, 72, 47, 86, 0, 160, 300, null, null],
[0, "손준", null, 0, null, 76, 40, 82, 0, 160, 300, null, null],
[0, "손침", null, 0, null, 82, 85, 45, 0, 160, 300, null, null],
[0, "우사", null, 0, null, 79, 86, 56, 0, 160, 300, null, null],
[0, "진건", null, 0, null, 68, 49, 88, 0, 160, 300, null, null],
[0, "동궐", null, 0, null, 75, 81, 44, 0, 160, 300, null, null],
[0, "당자", null, 0, null, 79, 49, 89, 0, 160, 300, null, null],
[0, "등충", null, 0, null, 64, 40, 81, 0, 160, 300, null, null],
[0, "황숭", null, 0, null, 73, 70, 38, 0, 160, 300, null, null],
[0, "화핵", null, 0, null, 80, 76, 29, 0, 160, 300, null, null],
[0, "허의", null, 0, null, 89, 46, 85, 0, 160, 300, null, null],
[0, "송겸", null, 0, null, 74, 42, 87, 0, 160, 300, null, null],
[0, "호제", null, 0, null, 83, 81, 52, 0, 160, 300, null, null],
[0, "나헌", null, 0, null, 54, 78, 38, 0, 160, 300, null, null],
[0, "노숙2", null, 0, null, 67, 87, 46, 0, 160, 300, null, null],
[0, "구성", null, 0, null, 77, 40, 82, 0, 160, 300, null, null],
[0, "어부라", null, 0, null, 78, 42, 86, 0, 160, 300, null, null],
[0, "아하소과", null, 0, null, 89, 54, 90, 0, 160, 300, null, null],
[0, "가비능", null, 0, null, 63, 41, 88, 0, 160, 300, null, null],
[0, "구력거", null, 0, null, 60, 42, 80, 0, 160, 300, null, null],
[0, "강단", null, 0, null, 75, 47, 82, 0, 160, 300, null, null],
[0, "황란", null, 0, null, 77, 45, 76, 0, 160, 300, null, null],
[0, "호주천", null, 0, null, 70, 49, 81, 0, 160, 300, null, null],
[0, "종리목", null, 0, null, 56, 79, 38, 0, 160, 300, null, null],
[0, "제갈교", null, 0, null, 78, 83, 45, 0, 160, 300, null, null],
[0, "답돈", null, 0, null, 56, 48, 79, 0, 160, 300, null, null],
[0, "반임", null, 0, null, 74, 41, 82, 0, 160, 300, null, null],
[0, "보도근", null, 0, null, 76, 57, 80, 0, 160, 300, null, null],
[0, "미당대왕", null, 0, null, 81, 51, 89, 0, 160, 300, null, null],
[0, "유표2", null, 0, null, 67, 56, 82, 0, 160, 300, null, null],
[0, "루반", null, 0, null, 75, 44, 81, 0, 160, 300, null, null],
[0, "손관", null, 0, null, 68, 42, 89, 0, 160, 300, null, null],
[0, "곽석", null, 0, null, 81, 49, 86, 0, 160, 300, null, null],
[0, "주조", null, 0, null, 77, 42, 84, 0, 160, 300, null, null],
[0, "장거", null, 0, null, 61, 45, 84, 0, 160, 300, null, null],
[0, "장순", null, 0, null, 67, 49, 80, 0, 160, 300, null, null],
[0, "철리길", null, 0, null, 63, 50, 88, 0, 160, 300, null, null],
[0, "주삭", null, 0, null, 90, 52, 90, 0, 160, 300, null, null],
[0, "황월영", null, 0, null, 94, 97, 58, 0, 160, 300, null, null, "어쩌다 저런 걸 남편이라고…."],
[0, "채염", null, 0, null, 98, 99, 49, 0, 160, 300, null, null],
[0, "소교", null, 0, null, 97, 95, 52, 0, 160, 300, null, null, "주유 너무 무능하다."],
[0, "신헌영", null, 0, null, 85, 95, 60, 0, 160, 300, null, null],
[0, "손상향", null, 0, null, 98, 58, 92, 0, 160, 300, null, null],
[0, "대교", null, 0, null, 98, 90, 52, 0, 160, 300, null, null, "손책 너무 무능하다."],
[0, "초선", null, 0, null, 99, 98, 59, 0, 160, 300, null, null, "동탁 이리와봐 한대만 맞자"],
[0, "교모", null, 0, null, 86, 90, 31, 0, 160, 300, null, null],
[0, "관구수", null, 0, null, 82, 28, 91, 0, 160, 300, null, null],
[0, "관구전", null, 0, null, 77, 88, 51, 0, 160, 300, null, null],
[0, "원유", null, 0, null, 84, 80, 47, 0, 160, 300, null, null],
[0, "왕광", null, 0, null, 75, 86, 49, 0, 160, 300, null, null],
[0, "신창", null, 0, null, 85, 84, 48, 0, 160, 300, null, null],
[0, "사마주", null, 0, null, 79, 86, 49, 0, 160, 300, null, null],
[0, "양제", null, 0, null, 73, 82, 29, 0, 160, 300, null, null],
[0, "성만", null, 0, null, 79, 42, 90, 0, 160, 300, null, null],
[0, "오연", null, 0, null, 74, 47, 88, 0, 160, 300, null, null],
[0, "맹충", null, 0, null, 90, 72, 38, 0, 160, 300, null, null],
[0, "잠혼", null, 0, null, 100, 99, 58, 0, 160, 300, null, null, "이 몸이 만부부당이라 불리는 맹장 잠혼이다."],
[0, "사정", null, 0, null, 76, 44, 86, 0, 160, 300, null, null],
[0, "심영", null, 0, null, 70, 43, 85, 0, 160, 300, null, null],
[0, "도준", null, 0, null, 75, 44, 83, 0, 160, 300, null, null],
[0, "만욱", null, 0, null, 89, 85, 45, 0, 160, 300, null, null],
[0, "오언", null, 0, null, 64, 49, 81, 0, 160, 300, null, null],
[0, "위막", null, 0, null, 86, 58, 81, 0, 160, 300, null, null],
[0, "시삭", null, 0, null, 88, 55, 83, 0, 160, 300, null, null],
[0, "전속", null, 0, null, 90, 40, 85, 0, 160, 300, null, null],
[0, "장화", null, 0, null, 84, 83, 32, 0, 160, 300, null, null],
[0, "오거", null, 0, null, 90, 19, 91, 0, 160, 300, null, null],
[0, "추정", null, 0, null, 70, 84, 24, 0, 160, 300, null, null],
[0, "장특", null, 0, null, 67, 86, 45, 0, 160, 300, null, null],
[0, "곽마", null, 0, null, 72, 49, 83, 0, 160, 300, null, null],
[0, "석포", null, 0, null, 71, 49, 81, 0, 160, 300, null, null],
[0, "견홍", null, 0, null, 70, 56, 87, 0, 160, 300, null, null],
[0, "한거자", null, 0, null, 89, 81, 29, 0, 160, 300, null, null],
[0, "휴원진", null, 0, null, 88, 22, 85, 0, 160, 300, null, null],
[0, "곽원", null, 0, null, 74, 84, 47, 0, 160, 300, null, null],
[0, "계옹", null, 0, null, 77, 87, 28, 0, 160, 300, null, null],
[0, "이부", null, 0, null, 89, 84, 46, 0, 160, 300, null, null],
[0, "왕업", null, 0, null, 87, 84, 45, 0, 160, 300, null, null],
[0, "좌혁", null, 0, null, 78, 44, 89, 0, 160, 300, null, null],
[0, "화타", null, 0, null, 83, 96, 37, 0, 160, 300, null, null, "가시는 길 한 방에 편안하게"],
[0, "사마휘", null, 0, null, 85, 84, 28, 0, 160, 300, null, null, "공명과 방통은 아무 짝에도 쓸모가 없습니다"],
[0, "우길", null, 0, null, 87, 85, 30, 0, 160, 300, null, null],
[0, "헌제", null, 0, null, 88, 92, 52, 0, 160, 300, null, null, "한 황실의 미래는 내 알바 아니다"],
[0, "백기", null, 0, null, 40, 42, 61, 0, 160, 300, null, null],
[0, "한신", null, 0, null, 40, 56, 35, 0, 160, 300, null, null],
[0, "악비", null, 0, null, 41, 48, 20, 0, 160, 300, null, null],
[0, "항적", null, 0, null, 41, 18, 35, 0, 160, 300, null, null],
[0, "악의", null, 0, null, 42, 27, 13, 0, 160, 300, null, null],
[0, "영정", null, 0, null, 43, 25, 48, 0, 160, 300, null, null],
[0, "강상", null, 0, null, 46, 40, 54, 0, 160, 300, null, null],
[0, "전단2", null, 0, null, 44, 55, 25, 0, 160, 300, null, null],
[0, "이목", null, 0, null, 44, 13, 42, 0, 160, 300, null, null],
[0, "염파", null, 0, null, 43, 9, 44, 0, 160, 300, null, null],
[0, "왕전", null, 0, null, 46, 37, 16, 0, 160, 300, null, null],
[0, "오기", null, 0, null, 46, 74, 25, 0, 160, 300, null, null],
[0, "곽거병", null, 0, null, 47, 16, 87, 0, 160, 300, null, null],
[0, "영포", null, 0, null, 58, 22, 49, 0, 160, 300, null, null],
[0, "이신", null, 0, null, 59, 37, 57, 0, 160, 300, null, null],
[0, "몽념", null, 0, null, 53, 34, 25, 0, 160, 300, null, null],
[0, "전기", null, 0, null, 60, 62, 36, 0, 160, 300, null, null],
[0, "극신", null, 0, null, 64, 27, 88, 0, 160, 300, null, null],
[0, "항연", null, 0, null, 51, 38, 22, 0, 160, 300, null, null],
[0, "인상여", null, 0, null, 71, 14, 44, 0, 160, 300, null, null],
[0, "장자방", null, 0, null, 68, 43, 27, 0, 160, 300, null, null],
[0, "관이오", null, 0, null, 55, 76, 41, 0, 160, 300, null, null],
[0, "손빈", null, 0, null, 57, 38, 12, 0, 160, 300, null, null],
[0, "소진", null, 0, null, 50, 23, 14, 0, 160, 300, null, null],
[0, "범증", null, 0, null, 72, 86, 46, 0, 160, 300, null, null],
[0, "장의2", null, 0, null, 65, 87, 17, 0, 160, 300, null, null],
[0, "공구", null, 0, null, 72, 70, 49, 0, 160, 300, null, null],
[0, "소하", null, 0, null, 84, 23, 8, 0, 160, 300, null, null],
[0, "한비", null, 0, null, 90, 81, 43, 0, 160, 300, null, null],
[0, "이사", null, 0, null, 42, 16, 45, 0, 160, 300, null, null],
[0, "전문", null, 0, null, 61, 73, 41, 0, 160, 300, null, null],
[0, "황헐", null, 0, null, 59, 22, 42, 0, 160, 300, null, null, "헐…"],
[0, "황호", null, 0, null, 98, 100, 67, 0, 160, 300, null, null],
[0, "방난", null, 0, null, 52, 25, 44, 0, 160, 300, null, null],
[0, "개섭", null, 0, null, 89, 33, 86, 0, 160, 300, null, null],
[0, "형가", null, 0, null, 88, 41, 91, 0, 160, 300, null, null],
[0, "유방", null, 0, null, 50, 24, 15, 0, 160, 300, null, null],
[0, "하리", null, 0, null, 98, 96, 68, 0, 160, 300, null, null],
[0, "헹이", null, 0, null, 93, 59, 98, 0, 160, 300, null, null],
[0, "나나", null, 0, null, 94, 53, 93, 0, 160, 300, null, null],
[0, "장임2", null, 0, null, 90, 89, 71, 0, 160, 300, null, null],
[0, "하야미", null, 0, null, 96, 67, 85, 0, 160, 300, null, null],
[0, "이시리스", null, 0, null, 94, 86, 54, 0, 160, 300, null, null],
[0, "연채홍", null, 0, null, 97, 47, 96, 0, 160, 300, null, null],
[0, "임사영", null, 0, null, 1, 4, 1, 0, 160, 300, null, null, "일반인 양민입니다"],
[0, "장군보", null, 0, null, 92, 90, 62, 0, 160, 300, null, null],
[0, "크렌스", null, 0, null, 98, 54, 93, 0, 160, 300, null, null],
[0, "콘", null, 0, null, 90, 42, 93, 0, 160, 300, null, null],
[0, "리즈나", null, 0, null, 97, 88, 64, 0, 160, 300, null, null, "야겜 하고 싶다"],
[0, "오티누스", null, 0, null, 97, 47, 97, 0, 160, 300, null, null],
[0, "네시", null, 0, null, 92, 67, 96, 0, 160, 300, null, null, "00"],
[0, "시뉴카린", null, 0, null, 91, 90, 59, 0, 160, 300, null, null],
[0, "Hide_D", null, 0, null, 91, 41, 95, 0, 160, 300, null, null, "버그 흥겜 힏체섭"],
[0, "Pray", null, 0, null, 88, 94, 60, 0, 160, 300, null, null, "탈영 마렵다"],
[0, "사스케", null, 0, null, 90, 96, 57, 0, 160, 300, null, null, "아무리 고민해도 찰진 대사가 없습니다."],
[0, "SARS", null, 0, null, 91, 61, 92, 0, 160, 300, null, null, "아마존 주식 떡상 기원"],
[0, "마요이", null, 0, null, 93, 59, 93, 0, 160, 300, null, null, "로열방 없습니다"],
[0, "세정", null, 0, null, 88, 68, 92, 0, 160, 300, null, null],
[0, "김나영", null, 0, null, 93, 90, 64, 0, 160, 300, null, null, "김나영 머리에서 김나영"],
[0, "Cure", null, 0, null, 89, 63, 94, 0, 160, 300, null, null]
],
"general_ex":[
],
"initialEvents":[
[
true,
["ChangeCity", "all", {
"trade":100
}]
]
],
"events":[
[
"month", 1000,
["Date", "==", 180, 1],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 180, 7],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 1],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 181, 7],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 182, 1],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
],
[
"month", 1000,
["Date", "==", 182, 7],
["ChangeCity", "all", {
"trade":100
}],
["DeleteEvent"]
]
]
}
-3
View File
@@ -11,9 +11,6 @@
"history": [
"<C>●</>180년 1월:<L><b>【이벤트】</b></>병기로 싸운다! 최고의 충차 지휘관을 가린다"
],
"const": {
"npcBanMessageProb":1
},
"initialEvents":[
[
true,
+1 -2
View File
@@ -8,7 +8,6 @@
],
"const": {
"expandCityDefaultCost": 30000,
"expandCityCostCoef": 250,
"npcBanMessageProb":1
"expandCityCostCoef": 250
}
}
-1
View File
@@ -8,7 +8,6 @@
],
"const": {
"joinRuinedNPCProp":0,
"npcBanMessageProb":1,
"availableSpecialWar":[
"che_귀병", "che_신산", "che_환술", "che_집중", "che_신중", "che_반계",
"che_보병", "che_궁병", "che_기병", "che_공성",
-3
View File
@@ -9,9 +9,6 @@
"history": [
"<C>●</>180년 1월:<L><b>【이벤트】</b></>29기까지 내로라 하는 모든 장수들이 모였다!"
],
"const": {
"npcBanMessageProb":1
},
"events": [
[
"month", 1000,
-1
View File
@@ -9,7 +9,6 @@
],
"const": {
"joinRuinedNPCProp":0,
"npcBanMessageProb":1,
"availableGeneralCommand": {
"": [
"휴식",
+4 -4
View File
@@ -318,7 +318,7 @@ CREATE TABLE IF NOT EXISTS `ng_old_nations` (
PRIMARY KEY (`id`),
INDEX `server_id` (`server_id`, `nation`)
)
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
ENGINE=Aria DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
CREATE TABLE IF NOT EXISTS `ng_old_generals` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
@@ -334,7 +334,7 @@ CREATE TABLE IF NOT EXISTS `ng_old_generals` (
INDEX `by_name` (`server_id`, `name`),
INDEX `owner` (`owner`, `server_id`)
)
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
ENGINE=Aria DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPRESSED;
CREATE TABLE IF NOT EXISTS `emperior` (
`no` INT(6) NOT NULL AUTO_INCREMENT,
@@ -380,7 +380,7 @@ CREATE TABLE IF NOT EXISTS `emperior` (
`history` MEDIUMTEXT NULL DEFAULT '{}' CHECK (json_valid(`aux`)),
`aux` MEDIUMTEXT NULL DEFAULT '{}' CHECK (json_valid(`aux`)),
PRIMARY KEY (`no`)
) ENGINE=Aria DEFAULT CHARSET=utf8mb4;
) ENGINE=Aria ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4;
###########################################################################
##
@@ -482,7 +482,7 @@ CREATE TABLE `statistic` (
`aux` TEXT NULL DEFAULT NULL CHECK (json_valid(`aux`)),
PRIMARY KEY (`no`)
)
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
ENGINE=Aria ROW_FORMAT=COMPRESSED DEFAULT CHARSET=utf8mb4;
###########################################################################
##
-7
View File
@@ -1,7 +0,0 @@
import { assert } from 'chai';
describe('hello', ()=>{
it('hello1', ()=>{
assert.equal(2, 1+1);
});
});
-370
View File
@@ -1,370 +0,0 @@
import chai, { assert } from 'chai';
import chaiBytes from 'chai-bytes';
import { bufferByteSize, LiteHashDRBG } from '../ts/util/LiteHashDRBG';
import { RandUtil } from '../ts/util/RandUtil';
import { convertBytesLikeToArrayBuffer } from '../ts/util/convertBytesLikeToArrayBuffer';
import { convertBytesLikeToUint8Array as toBytes } from '../ts/util/convertBytesLikeToUint8Array';
import _ from 'lodash';
chai.use(chaiBytes);
type Bytes = ArrayBuffer | DataView | Uint8Array;
type MaybeBytes = Bytes | string;
function fillBlock(body: MaybeBytes, filler: MaybeBytes = '\0', length = bufferByteSize): Uint8Array {
const u8Body = toBytes(body);
const u8Filler = toBytes(filler, false);
if (u8Filler.byteLength < 1) {
throw new Error('filler must have length');
}
const buffer = new Uint8Array(length);
buffer.set(u8Body, 0);
let bufferIdx = u8Body.byteLength;
while (bufferIdx + u8Filler.byteLength < length) {
buffer.set(u8Filler, bufferIdx);
bufferIdx += u8Filler.byteLength;
}
if (bufferIdx < length) {
const slice = new Uint8Array(u8Filler.buffer, u8Filler.byteOffset, length - bufferIdx);
buffer.set(slice, bufferIdx);
}
return buffer;
}
class DummyBlockRNG extends LiteHashDRBG {
private repeatBlockCnt: number;
private repeatBlock: ArrayBuffer[];
public constructor(repeatBlock: MaybeBytes[], stateIdx = 0) {
super('x');
this.repeatBlock = [];
for (const rawBlock of repeatBlock) {
const block = convertBytesLikeToArrayBuffer(rawBlock);
if (block.byteLength !== bufferByteSize) {
throw new Error;
}
this.repeatBlock.push(block);
}
this.repeatBlockCnt = this.repeatBlock.length;
this.stateIdx = stateIdx;
this.bufferIdx = 0;
this.genNextBlock();
}
protected genNextBlock() {
if (!this.repeatBlock) {
return;
}
this.buffer = this.repeatBlock[this.stateIdx];
this.bufferIdx = 0;
this.stateIdx = (this.stateIdx + 1) % this.repeatBlockCnt;
}
}
const fixedKey = 'HelloWorld';
describe('RNGtestDummy', () => {
const rng = new DummyBlockRNG([
fillBlock('', "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff")
]);
it('BasicConvert', () => {
assert.equal(toBytes("\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff", false).length, 16);
});
it('SimpleByte', () => {
assert.equalBytes(toBytes("\x00", false), rng.nextBytes(1), 'b1');
assert.equalBytes(toBytes("\x11\x22", false), rng.nextBytes(2), 'b2');
assert.equalBytes(toBytes("\x33\x44\x55", false), rng.nextBytes(3), 'b3');
assert.equalBytes(toBytes("\x66\x77\x88\x99", false), rng.nextBytes(4), 'b4');
});
it('OverflowBlock', () => {
for (const idx in _.range(16)) {
assert.equalBytes(
toBytes("\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", false),
rng.nextBytes(16)
);
}
});
it('MultiBlock', () => {
assert.equalBytes(
fillBlock('', "\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", bufferByteSize * 2),
rng.nextBytes(bufferByteSize * 2)
);
});
it('bitTest', () => {
assert.equalBytes(toBytes("\x00", false), rng.nextBits(1)); //aa
assert.equalBytes(toBytes("\x01", false), rng.nextBits(1)); //bb
assert.equalBytes(toBytes("\xcc", false), rng.nextBits(8)); //cc
assert.equalBytes(toBytes("\xdd\x02", false), rng.nextBits(10)); //ddee
assert.equalBytes(toBytes("\x7f", false), rng.nextBits(7)); //ff
assert.equalBytes(toBytes("\x00\x11\x22\x33\x44\x55\x06", false), rng.nextBits(53));
});
it('int', () => {
assert.equal(0x77, rng.nextInt(0xff));
assert.equal(0x9988, rng.nextInt((1 << 16) - 1));
assert.equal(0xddccbbaa, rng.nextInt(0xffffffff));
assert.equal(0x0433221100ffee, rng.nextInt());
assert.equal(0x05, rng.nextInt(0x0f)); //55
assert.equal(0x06, rng.nextInt(0x12)); //66
assert.equal(0x08, rng.nextInt(99)); //77(119 -> 7bit) -> 88(136 -> 8bit -> 8)
assert.equal(0x99, rng.nextInt(0x99)); //99
assert.equal(0xaa, rng.nextInt(0xaa)); //aa (fit Max)
});
it('float', () => {
const floatMax = 2 ** 53;
const fa = rng.nextFloat1();
assert.equal(0x1100ffeeddccbb / floatMax, fa);
assert.isTrue(0.5313720384 > fa);
assert.isTrue(0.5313720383 < fa);
const fb = rng.nextFloat1();
assert.equal(0x08776655443322 / floatMax, fb);
});
});
describe('RandUtilDummy', () => {
it('shuffle', () => {
const rng = new DummyBlockRNG([fillBlock('', '\x17\x16\x15\x14\x13\x12\x11\x10')]);
const randUtil = new RandUtil(rng);
/**
* 7, [7,1,2,3,4,5,6,0]
* 6, [7,0,2,3,4,5,6,1]
* 5, [7,0,1,3,4,5,6,2]
* 4, [7,0,1,2,4,5,6,3]
* 3, [7,0,1,2,3,5,6,4]
* 2, [7,0,1,2,3,4,6,5]
* 1, [7,0,1,2,3,4,5,6]
*/
assert.deepEqual(
randUtil.shuffle(Array.from(_.range(8))),
[7, 0, 1, 2, 3, 4, 5, 6]
);
/**
* 0, [0,1,2,3,4,5,6,7,8,9]
* 7, [0,8,2,3,4,5,6,7,1,9]
* 6, [0,8,1,3,4,5,6,7,2,9]
* 5, [0,8,1,2,4,5,6,7,3,9]
* 4, [0,8,1,2,3,5,6,7,4,9]
* 3, [0,8,1,2,3,4,6,7,5,9]
* 2, [0,8,1,2,3,4,5,7,6,9]
* 1, [0,8,1,2,3,4,5,6,7,9]
* 0, [0,8,1,2,3,4,5,6,7,9]
*/
assert.deepEqual(
randUtil.shuffle(Array.from(_.range(10))),
[0, 8, 1, 2, 3, 4, 5, 6, 7, 9]
);
});
const rng = new DummyBlockRNG([fillBlock('', '\x17\x16\x15\x14\x13\x12\x11\x10')]);
const randUtil = new RandUtil(rng);
it('choice', () => {
//0x17(7), 0x16(6)
assert.equal(randUtil.choice([0, 1, 2, 3, 4, 5]), 5);
//0x15(5), Set 순서 유지
assert.equal(randUtil.choice(new Set([5, 3, 1, 2, 8, 0])), 8);
//0x14(4), 정렬 순서상 숫자(소-대) > 문자열(삽입순) > 심볼 순서
assert.equal(randUtil.choice({ c: 'c', a: 'a', b: 'b', 4: 'x', 2: 't', '3': 'q' }), 'c');
});
it('choiceUsingWeight', () => {
//0.6275740099377194 * 38.1 = 23.91
assert.equal(randUtil.choiceUsingWeight({
a: 0.1,
b: 10,
tt: 2,
x: -1,
c: 20,
d: 0,
e: 6
}), 'c');
//0.658946544056166
assert.equal(randUtil.choiceUsingWeightPair([
['xx', 10],
]), 'xx');
//0.6903152783785083 * 27.3 = 18.84560709973328
assert.equal(randUtil.choiceUsingWeightPair([
['e', 10],
['d', 4],
['c', 0.1],
['baba', 0.2],
['q', 9],
['xt', 4]
]), 'q');
});
});
describe('RNGexpectedError', () => {
const rng = new LiteHashDRBG(fixedKey);
it('nextBits0', () => {
assert.throw(() => rng.nextBits(0));
});
it('nextBits-1', () => {
assert.throw(() => rng.nextBits(-1));
});
it('nextBytes0', () => {
assert.throw(() => rng.nextBytes(0));
});
it('nextBytes-1', () => {
assert.throw(() => rng.nextBytes(-1));
});
const randUtil = new RandUtil(rng);
it('utilEmptyChoice', () => {
assert.throw(() => randUtil.choice([]));
});
it('utilEmptyChoiceUsingWeight', () => {
assert.throw(() => randUtil.choiceUsingWeight({}));
});
it('utilEmptyChoiceUsingWeightPair', () => {
assert.throw(() => randUtil.choiceUsingWeightPair([]));
});
});
describe('RNGAcceptable', () => {
const rng = new LiteHashDRBG(fixedKey);
it('RNG', () => {
rng.nextInt(0);
rng.nextInt(2 ** 53 - 1);
rng.nextBytes(65);
rng.nextBits(512);
});
const randUtil = new RandUtil(rng);
it('RandUtil', () => {
randUtil.choice([0, 0, 0]);
randUtil.choiceUsingWeight({
0: 0,
1: -1
});
randUtil.choiceUsingWeightPair([
[0, 0],
[1, 0],
[2, -2]
]);
randUtil.nextBool(1.1);
randUtil.nextBool(-0.1);
randUtil.shuffle([]);
randUtil.shuffle([1]);
randUtil.nextRange(0, 0);
randUtil.nextRangeInt(0, 0);
randUtil.nextRange(1, -1);
randUtil.nextRangeInt(1, -1);
})
it('RNGLong', () => {
const longKey = fixedKey;
for(const _a of _.range(8)){
longKey.concat(longKey);
}
const rngLong = new LiteHashDRBG(longKey);
for(const _a of _.range(10)){
rngLong.nextBytes(16);
}
})
});
/* Python TestVector
import hashlib
import struct
fixedKey = 'HelloWorld'.encode('utf-8')
def hash(key, idx):
idxV = struct.pack("<I", idx)
return hashlib.sha512(key + idxV).digest()
for idx in range(5):
print(hash(fixedKey, idx).hex())
*/
describe('RNG', () => {
//JS - PHP 일치 확인 정도로.
const testVector = Buffer.from([
'24d9ccd648556255fd0ee9f5b29918de90617341958b3b354d572167e4dee02b757816a2bbe0b502c52413ffd384381a9d7b4e193df6f4345d6a95e111d661c4',
'2e9264512f6f4b080cf1376b74fab6878ecf4a6e185942d2e5b22cf923885b9952d40601a414225d6901417fd4ce9368ac77e4a63d3fc9b58ab952bb8c33f165',
'8e2ebf5af6283a1b18f4c044c86c20d02be3890613c4cc8b7c6b7b35581263b972a82630df69a9289988422d7c3a9be5edf78d5de16fabd01e5dd4e458068d8a',
'398596047ba547bfe371ec863a3e019ab0dbc4bb3b27e9077685aae4283ff6bbccfd981d92f9358f7efffbb72a940414802d98466d132e2ad0a16a12946d5f47',
'b3606fe9b18c4aa7315e78bb9e47cb51cc4e203fcc2e631f0405c1b872c8e1cb5b6415ea74bbb77fffaaadb002b47cb4f4628dc0709634365b187667f5c708cb',
].join(''), 'hex');
it('bytes', ()=>{
const rng = new LiteHashDRBG(fixedKey);
let offset = 0;
assert.equalBytes(rng.nextBytes(10), testVector.slice(offset, offset + 10), '1');
offset += 10;
assert.equalBytes(rng.nextBytes(32), testVector.slice(offset, offset + 32), '2');
offset += 32;
assert.equalBytes(rng.nextBytes(1), testVector.slice(offset, offset + 1), '3');
offset += 1;
assert.equalBytes(rng.nextBytes(64), testVector.slice(offset, offset + 64), '4');
offset += 64;
assert.equalBytes(rng.nextBytes(5), testVector.slice(offset, offset + 5), '5');
offset += 5;
const lastA = rng.nextBytes(16, 18);
const lastB = new Uint8Array(18);
lastB.set(testVector.slice(offset, offset + 16));
assert.equalBytes(lastA, lastB);
});
it('bits', ()=>{
const rng = new LiteHashDRBG(fixedKey);
let offset = 0;
const testBits = [10, 4, 15, 32, 7, 99, 512, 1, 2, 3];
for(const bits of testBits){
const bytes = Math.ceil(bits / 8)
const A = rng.nextBits(bits);
const B = new Uint8Array(testVector.slice(offset, offset + bytes));
offset += bytes;
if(bits % 8 != 0){
const bitMask = 0xff >> (8 - (bits % 8));
B[bytes - 1] &= bitMask;
}
assert.equalBytes(A, B);
}
});
it('float', ()=>{
const rng = new LiteHashDRBG(fixedKey);
const rng2 = new DummyBlockRNG([
new Uint8Array(testVector.slice(bufferByteSize * 0, bufferByteSize * 1)),
new Uint8Array(testVector.slice(bufferByteSize * 1, bufferByteSize * 2)),
new Uint8Array(testVector.slice(bufferByteSize * 2, bufferByteSize * 3)),
new Uint8Array(testVector.slice(bufferByteSize * 3, bufferByteSize * 4)),
new Uint8Array(testVector.slice(bufferByteSize * 4, bufferByteSize * 5)),
]);
for(const idx of _.range(18)){
assert.equal(rng.nextFloat1(), rng2.nextFloat1(), `float${idx}`);
}
});
});
+3 -3
View File
@@ -260,7 +260,7 @@ function setupAdminForm() {
}
},
}
const validator = new JQValidateForm($('#admin_form'), descriptor);
const validator = new JQValidateForm($('#db_form'), descriptor);
validator.installChangeHandler();
$('#admin_form').on('submit', async function (e) {
@@ -278,7 +278,7 @@ function setupAdminForm() {
let result: InvalidResponse;
try {
const response = await axios({
url: 'j_create_admin.php',
url: 'j_setup_db.php',
method: 'post',
responseType: 'json',
data: convertFormData({
@@ -299,7 +299,7 @@ function setupAdminForm() {
return;
}
alert('관리자 계정 생성되었습니다.');
alert('RootDB.php가 생성되었습니다. 관리자 계정 생성을 진행합니다.');
await changeInstallMode();
});
}
-2
View File
@@ -1,2 +0,0 @@
export type Bytes = ArrayBuffer | DataView | Uint8Array;
export type BytesLike = Bytes | string;
-232
View File
@@ -1,232 +0,0 @@
import { RNG } from "./RNG";
import { sha512 } from 'js-sha512';
import { convertBytesLikeToUint8Array } from "./convertBytesLikeToUint8Array";
import { BytesLike } from "./BytesLike";
const maxRngSupportBit = 53;
const maxInt = 0x1f_ffff_ffff_ffff; // NOTE: b 0, 10000110011, 11...11
const maxIntMore1 = 0x20_0000_0000_0000n; //NOTE: b 0, 10000110100, 00...00
const maxIntMore1f = Number(maxIntMore1);
export const bufferByteSize = 512 / 8; //SHA512
const intBitMapMask = new Map([
[0x1n, 1],
[0x3n, 2],
[0x7n, 3],
[0xfn, 4],
[0x1fn, 5],
[0x3fn, 6],
[0x7fn, 7],
[0xffn, 8],
[0x1ffn, 9],
[0x3ffn, 10],
[0x7ffn, 11],
[0xfffn, 12],
[0x1fffn, 13],
[0x3fffn, 14],
[0x7fffn, 15],
[0xffffn, 16],
[0x1ffffn, 17],
[0x3ffffn, 18],
[0x7ffffn, 19],
[0xfffffn, 20],
[0x1fffffn, 21],
[0x3fffffn, 22],
[0x7fffffn, 23],
[0xffffffn, 24],
[0x1ffffffn, 25],
[0x3ffffffn, 26],
[0x7ffffffn, 27],
[0xfffffffn, 28],
[0x1fffffffn, 29],
[0x3fffffffn, 30],
[0x7fffffffn, 31],
[0xffffffffn, 32],
[0x1ffffffffn, 33],
[0x3ffffffffn, 34],
[0x7ffffffffn, 35],
[0xfffffffffn, 36],
[0x1fffffffffn, 37],
[0x3fffffffffn, 38],
[0x7fffffffffn, 39],
[0xffffffffffn, 40],
[0x1ffffffffffn, 41],
[0x3ffffffffffn, 42],
[0x7ffffffffffn, 43],
[0xfffffffffffn, 44],
[0x1fffffffffffn, 45],
[0x3fffffffffffn, 46],
[0x7fffffffffffn, 47],
[0xffffffffffffn, 48],
[0x1ffffffffffffn, 49],
[0x3ffffffffffffn, 50],
[0x7ffffffffffffn, 51],
[0xfffffffffffffn, 52],
[0x1fffffffffffffn, 53],
]);
function calcBitMask(n: bigint): bigint {
n |= n >> 1n;
n |= n >> 2n;
n |= n >> 4n;
n |= n >> 8n;
n |= n >> 16n;
n |= n >> 32n;
return n;
}
export class LiteHashDRBG implements RNG {
protected buffer!: ArrayBuffer;
protected bufferIdx!: number;
protected hq: DataView;
protected hqIdxPos: number;
public constructor(protected seed: BytesLike, protected stateIdx = 0, bufferIdx = 0) {
if(bufferIdx < 0){
throw new Error(`bufferIdx ${bufferIdx} < 0`);
}
if(bufferIdx >= bufferByteSize){
throw new Error(`bufferidx ${bufferIdx} >= ${bufferByteSize}`);
}
if(stateIdx < 0){
throw new Error(`stateIdx ${stateIdx} < 0`);
}
const seedU8 = convertBytesLikeToUint8Array(seed);
const hqBuffer = new ArrayBuffer(seedU8.byteLength + 4);
const hqU8 = new Uint8Array(hqBuffer);
hqU8.set(seedU8, 0);
this.hq = new DataView(hqBuffer);
this.hqIdxPos = seedU8.byteLength;
this.genNextBlock();
this.bufferIdx = bufferIdx;
}
protected genNextBlock(): void {
this.hq.setUint32(this.hqIdxPos, this.stateIdx, true);
const digest = sha512.arrayBuffer(this.hq.buffer);
this.buffer = digest;
this.bufferIdx = 0;
this.stateIdx += 1;
}
public getMaxInt(): number {
return maxInt;
}
public nextBytes(bytes: number, baseBytes?: number): Uint8Array {
bytes |= 0;
if (bytes <= 0) {
throw new Error(`${bytes} <= 0`);
}
if (this.bufferIdx + bytes <= bufferByteSize) {
if(baseBytes === undefined || bytes >= baseBytes){
const result = this.buffer.slice(this.bufferIdx, this.bufferIdx + bytes);
this.bufferIdx += bytes;
if (this.bufferIdx === bufferByteSize) {
this.genNextBlock();
}
return new Uint8Array(result);
}
const resultBuffer = new ArrayBuffer(Math.max(bytes, baseBytes));
const result = new Uint8Array(resultBuffer);
result.set(new Uint8Array(this.buffer, this.bufferIdx, bytes));
this.bufferIdx += bytes;
if( this.bufferIdx === bufferByteSize){
this.genNextBlock();
}
return result;
}
const resultBuffer = new ArrayBuffer(baseBytes ? Math.max(bytes, baseBytes) : bytes);
const result = new Uint8Array(resultBuffer);
result.set(new Uint8Array(this.buffer, this.bufferIdx));
let offset = bufferByteSize - this.bufferIdx;
let remain = bytes - offset;
while (remain > bufferByteSize) {
this.genNextBlock();
result.set(new Uint8Array(this.buffer), offset);
offset += bufferByteSize;
remain -= bufferByteSize;
}
this.genNextBlock();
if (remain === 0) {
return result;
}
result.set(new Uint8Array(this.buffer, 0, remain), offset);
this.bufferIdx = remain;
return result;
}
public nextBits(bits: number, baseBytes?: number): Uint8Array {
bits |= 0;
const bytes = (bits + 7) >> 3;
const headBits = bits & 0x7;
const result = this.nextBytes(bytes, baseBytes);
if (headBits === 0) {
return result;
}
result[bytes - 1] &= 0xff >> (8 - headBits);
return result;
}
protected _nextInt(bits: number): bigint{
const buffer = this.nextBits(bits, 8);
const dataView = new DataView(buffer.buffer);
return dataView.getBigUint64(0, true);
}
public nextInt(max?: number): number {
if (max === undefined || max === maxInt) {
return Number(this._nextInt(maxRngSupportBit));
}
if (max > maxInt) {
throw new Error('Over max int');
}
if (max === 0) {
return 0;
}
if (max < 0) {
return -this.nextInt(-max);
}
const mask = calcBitMask(BigInt(max));
const bits = intBitMapMask.get(mask) as number;
let n = Number(this._nextInt(bits));
while (n > max){
n = Number(this._nextInt(bits));
}
return n;
}
public nextFloat1(): number {
// eslint-disable-next-line no-constant-condition
while(true){
const nInt = this._nextInt(maxRngSupportBit + 1);
if(nInt < maxIntMore1){
return Number(nInt) / maxIntMore1f;
}
if(nInt === maxIntMore1){
return 1;
}
}
}
public static build(seed: BytesLike, stateIdx = 0): LiteHashDRBG{
return new LiteHashDRBG(seed, stateIdx);
}
}
-13
View File
@@ -1,13 +0,0 @@
export interface RNG {
/**
* nextInt()가 반환 가능한 최대값
*/
getMaxInt(): number;
nextBytes(bytes: number): Uint8Array;
nextBits(bits: number): Uint8Array;
nextInt(max?: number): number;
nextFloat1(): number;
}
-138
View File
@@ -1,138 +0,0 @@
import { RNG } from './RNG';
export class RandUtil {
constructor(protected rng: RNG) {
}
public nextFloat1(): number {
return this.rng.nextFloat1();
}
public nextRange(min: number, max: number): number {
const range = max - min;
return this.nextFloat1() * (range) + min;
}
public nextRangeInt(min: number, max: number): number {
const range = max - min;
return this.rng.nextInt(range) + min;
}
public nextInt(max?: number): number {
return this.rng.nextInt(max);
}
public nextBit(): boolean {
const view = new DataView(this.rng.nextBits(1));
return view.getUint8(0) != 0;
}
public nextBool(prob = 0.5): boolean {
if (prob >= 1) {
return true;
}
return this.nextFloat1() < prob;
}
public shuffle<T>(srcArray: T[]): T[] {
const cnt = srcArray.length;
if(cnt === 0){
return [];
}
if (cnt > this.rng.getMaxInt()) {
throw 'Invalid random int range';
}
const result: T[] = Array.from(srcArray);
for (let srcIdx = 0; srcIdx < cnt; srcIdx += 1) {
const destIdx = this.rng.nextInt(cnt - srcIdx - 1) + srcIdx;
if(srcIdx === destIdx){
continue;
}
[result[srcIdx], result[destIdx]] = [result[destIdx], result[srcIdx]];
}
return result;
}
//Object는 integer key에 예외가 있어 shuffleAssoc은 없음
public choice<T>(items: T[] | Record<string | number, T> | Set<T>): T {
if (items instanceof Array) {
if(items.length === 0){
throw new Error('Empty items');
}
const idx = this.rng.nextInt(items.length - 1);
return items[idx];
}
if (items instanceof Set) {
return this.choice(Array.from(items.values()));
}
return items[this.choice(Array.from(Object.keys(items)))];
}
public choiceUsingWeight(items: Record<string | number, number>): string | number {
if(Object.keys(items).length === 0){
throw new Error('Empty items');
}
let sum = 0;
for (const value of Object.values(items)) {
if (value <= 0) {
continue;
}
sum += value;
}
let rd = this.nextFloat1() * sum;
for (const [item, value] of Object.entries(items)) {
if (value <= 0) {
if (rd <= 0) {
return item;
}
continue;
}
if (rd <= value) {
return item;
}
rd -= value;
}
throw new Error('Unreacheable');
}
public choiceUsingWeightPair<T>(items: [T, number][]): T {
if(items.length === 0){
throw new Error('Empty items');
}
let sum = 0;
for (const [, value] of items) {
if (value <= 0) {
continue;
}
sum += value;
}
let rd = this.nextFloat1() * sum;
for (const [item, value] of items) {
if (value <= 0) {
if (rd <= 0) {
return item;
}
continue;
}
if (rd <= value) {
return item;
}
rd -= value;
}
throw new Error('Unreacheable');
}
}
+5 -2
View File
@@ -16,10 +16,13 @@ export async function callSammoAPI<ResultType extends ValidResponse, ErrorType e
}
const response = await axios({
url: `api.php?path=${path}`,
url: "api.php",
method: "post",
responseType: "json",
data: args
data: {
path,
args,
},
});
const result: ErrorType | ResultType = response.data;
if (!result.result) {
@@ -1,17 +0,0 @@
import { BytesLike } from "./BytesLike";
export function convertBytesLikeToArrayBuffer(data: BytesLike, encodeUTF8 = true): ArrayBuffer{
if (data instanceof ArrayBuffer) {
return data;
}
if (data instanceof Uint8Array) {
return data.buffer;
}
if (typeof(data) === 'string'){
if(encodeUTF8){
return (new TextEncoder()).encode(data);
}
return new Uint8Array(data.split('').map(s=>s.codePointAt(0) as number));
}
return data.buffer;
}
@@ -1,17 +0,0 @@
import { BytesLike } from "./BytesLike";
export function convertBytesLikeToUint8Array(data: BytesLike, encodeUTF8 = true): Uint8Array {
if (data instanceof Uint8Array) {
return data;
}
if (data instanceof ArrayBuffer) {
return new Uint8Array(data);
}
if (typeof (data) === 'string') {
if(encodeUTF8){
return (new TextEncoder()).encode(data);
}
return new Uint8Array(data.split('').map(s=>s.codePointAt(0) as number));
}
return new Uint8Array(data.buffer);
}
-4
View File
@@ -2,10 +2,6 @@
namespace sammo;
if (!file_exists(__DIR__ . '/vendor/autoload.php')){
header('Location:install.php');
die();
}
require(__DIR__ . '/vendor/autoload.php');
if (!class_exists('\\sammo\\RootDB')) {
+21 -106
View File
@@ -3,88 +3,27 @@ namespace sammo;
set_time_limit(600);
class Json
{
/** @return never */
public static function die($value)
{
if (!headers_sent()) {
header('Expires: Wed, 01 Jan 2014 00:00:00 GMT');
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
}
header('Content-Type: application/json');
die(json_encode($value));
}
}
function tryComposerInstall()
{
$resultPath = 'composer_result.json.log';
$lockPath = 'composer.lock';
$runCode = "php composer.phar install";
$timestamp = time();
if (file_exists($resultPath) && file_exists($lockPath)) {
do {
$result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->lockHash;
$lockHash = hash_file('sha512', $lockPath);
if ($lockHash != $oldJsonHash) {
break;
}
//그것도 아니라면 업데이트하지 않겠다.
return false;
} while (0);
}
exec($runCode, $output, $result_code);
if ($result_code != 0) {
Json::die([
'result' => false,
'reason' => $output,
'state' => 'composer',
]);
}
if (!file_exists($lockPath)){
Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp,
]));
return true;
}
function tryNpmInstall()
{
$resultPath = 'npm_recent.json.log';
$lockPath = 'package-lock.json';
$runCode = "npm ci";
$runAltCode = "npm install";
$npmResultPath = 'npm_recent.json.log';
$packageJsonPath = 'package.json';
$packageJsonLockPath = 'package-lock.json';
$packageJsonHash = hash_file('sha512', $packageJsonPath);
$timestamp = time();
if (file_exists($resultPath) && file_exists($lockPath)) {
if (file_exists($npmResultPath) && file_exists($packageJsonLockPath)) {
do {
$result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->lockHash;
$lockHash = hash_file('sha512', $lockPath);
$result = json_decode(file_get_contents($npmResultPath));
$oldJsonHash = $result->packageJsonHash;
$oldTimestamp = $result->updateTimestamp;
if ($lockHash != $oldJsonHash) {
//1. package.json 파일이 다르면 업데이트.
if ($packageJsonHash != $oldJsonHash) {
break;
}
//2. package-lock.json 업데이트가 2주를 초과했다면 업데이트.
if($oldTimestamp + 60*60*24*14 < $timestamp){
break;
}
@@ -93,56 +32,32 @@ function tryNpmInstall()
} while (0);
}
if(file_exists($lockPath)){
exec($runCode, $output, $result_code);
}
else{
exec($runAltCode, $output, $result_code);
}
exec("npm install", $output, $result_code);
if ($result_code != 0) {
Json::die([
'result' => false,
'reason' => $output,
'state' => 'npm ci',
'reason' => $output
]);
}
if (!file_exists($lockPath)){
Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
file_put_contents($npmResultPath, json_encode([
'packageJsonHash'=>$packageJsonHash,
'updateTimestamp'=>$timestamp,
]));
return true;
}
function genJS()
{
$command = sprintf("./node_modules/.bin/webpack build --env target=gateway");
$command = "./node_modules/.bin/webpack build";
exec(($command), $output, $result_code);
if ($result_code != 0) {
Json::die([
'result' => false,
'reason' => $output,
'state' => 'webpack build',
'reason' => $output
]);
}
}
if(tryComposerInstall()){
header('location:install.php');
die();
}
if(tryNpmInstall()){
genJS();
}
+21 -79
View File
@@ -66,68 +66,27 @@ function genJS($server)
}
}
function tryComposerInstall()
{
$resultPath = 'composer_result.json.log';
$lockPath = 'composer.lock';
$runCode = "php composer.phar install";
$timestamp = time();
if (file_exists($resultPath) && file_exists($lockPath)) {
do {
$result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->lockHash;
$lockHash = hash_file('sha512', $lockPath);
if ($lockHash != $oldJsonHash) {
break;
}
//그것도 아니라면 업데이트하지 않겠다.
return false;
} while (0);
}
exec($runCode, $output, $result_code);
if ($result_code != 0) {
Json::die([
'result' => false,
'reason' => $output
]);
}
if (!file_exists($lockPath)){
Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp,
]));
return true;
}
function tryNpmInstall()
{
$resultPath = 'npm_recent.json.log';
$lockPath = 'package-lock.json';
$runCode = "npm ci";
$runAltCode = "npm install";
$npmResultPath = './npm_recent.json.log';
$packageJsonPath = './package.json';
$packageJsonLockPath = './package-lock.json';
$packageJsonHash = hash_file('sha512', $packageJsonPath);
$timestamp = time();
if (file_exists($resultPath) && file_exists($lockPath)) {
if (file_exists($npmResultPath) && file_exists($packageJsonLockPath)) {
do {
$result = json_decode(file_get_contents($resultPath));
$oldJsonHash = $result->lockHash;
$lockHash = hash_file('sha512', $lockPath);
$result = json_decode(file_get_contents($npmResultPath));
$oldJsonHash = $result->packageJsonHash;
$oldTimestamp = $result->updateTimestamp;
if ($lockHash != $oldJsonHash) {
//1. package.json 파일이 다르면 업데이트.
if ($packageJsonHash != $oldJsonHash) {
break;
}
//2. package-lock.json 업데이트가 2주를 초과했다면 업데이트.
if ($oldTimestamp + 60 * 60 * 24 * 14 < $timestamp) {
break;
}
@@ -136,13 +95,7 @@ function tryNpmInstall()
} while (0);
}
if(file_exists($lockPath)){
exec($runCode, $output, $result_code);
}
else{
exec($runAltCode, $output, $result_code);
}
exec("npm install", $output, $result_code);
if ($result_code != 0) {
Json::die([
'result' => false,
@@ -150,26 +103,16 @@ function tryNpmInstall()
]);
}
if (!file_exists($lockPath)){
Json::die([
'result' => false,
'reason' => "no lockfile: {$lockPath}"
]);
}
$lockHash = hash_file('sha512', $lockPath);
file_put_contents($resultPath, json_encode([
'lockHash'=>$lockHash,
'updateTimestamp'=>$timestamp,
file_put_contents($npmResultPath, json_encode([
'packageJsonHash' => $packageJsonHash,
'updateTimestamp' => $timestamp,
]));
return true;
}
//묻고 따지지 않고 일단 composer install, npm install은 시도한다.
//묻고 따지지 않고 일단 npm install은 시도한다.
//hwe 업데이트인 경우에만 한번 더 부른다.
tryComposerInstall();
if (tryNpmInstall()) {
genJS(Util::array_last_key(ServConfig::getServerList()));
}
@@ -325,8 +268,7 @@ if ($server == $baseServerName) {
]));
}
//git 업데이트했는데, package 바뀌면 곤란하니까
tryComposerInstall();
//git 업데이트했는데, package.json이 바뀌면 곤란하니까
tryNpmInstall();
genJS($server);
+7 -9
View File
@@ -138,13 +138,12 @@ if (!$userInfo) {
'aux' => $session->tmpx,
]);
}
$userID = $userInfo['no'];
if ($userInfo['delete_after']) {
if ($userInfo['delete_after'] < $now) {
$restAPI->unlink();
$session->access_token = null;
$RootDB->delete('member', 'no=%i', $userID);
$RootDB->delete('member', 'no=%i', $userInfo['no']);
Json::die([
'result' => false,
'reqOTP' => false,
@@ -171,20 +170,20 @@ if ($refresh_token) {
RootDB::db()->update('member', [
'oauth_info' => Json::encode($oauthInfo)
], 'no=%i', $userID);
], 'no=%i', $userInfo['no']);
$tokenValidUntil = $userInfo['token_valid_until'];
if (!$tokenValidUntil || $tokenValidUntil < $now) {
if (!createOTPbyUserNO($userID)) {
if (!createOTPbyUserNO($userInfo['no'])) {
Json::die([
'result' => false,
'reqOTP' => false,
'reason' => '인증 코드를 보내는데 실패했습니다.'
]);
}
$session->login($userID, $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], true, $userInfo['token_valid_until'], null, Json::decode($userInfo['acl'] ?? '{}'));
Json::die([
'result' => false,
'reqOTP' => true,
@@ -193,9 +192,8 @@ if (!$tokenValidUntil || $tokenValidUntil < $now) {
}
$RootDB->insert('member_log', [
'member_no' => $userID,
'member_no' => $userInfo['no'],
'action_type' => 'login',
'action' => Json::encode([
'ip' => Util::get_client_ip(true),
@@ -227,7 +225,7 @@ $RootDB->query(
);
$token = Util::randomStr(20);
$RootDB->insert('login_token', [
'user_id' => $userID,
'user_id' => $userInfo['no'],
'base_token' => $token,
'reg_ip' => Util::get_client_ip(true),
'reg_date' => $nowDate,
@@ -235,7 +233,7 @@ $RootDB->insert('login_token', [
]);
$tokenID = $RootDB->insertId();
$session->login($userID, $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}'));
$session->login($userInfo['no'], $userInfo['id'], $userInfo['grade'], false, $userInfo['token_valid_until'], $tokenID, Json::decode($userInfo['acl'] ?? '{}'));
-16227
View File
File diff suppressed because it is too large Load Diff
+43 -50
View File
@@ -4,9 +4,7 @@
"description": "",
"main": "js/index.js",
"scripts": {
"test": "npm-run-all test-php-gateway test-ts",
"test-php-gateway": "vendor/bin/phpunit --bootstrap vendor/autoload.php tests",
"test-ts": "mocha",
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"buildDev": "webpack --mode=development",
"watch": "webpack watch --mode=development",
@@ -22,11 +20,7 @@
"license": "MIT",
"type": "module",
"dependencies": {
"@babel/cli": "^7.17.6",
"@babel/core": "^7.17.5",
"@babel/preset-env": "^7.16.11",
"@babel/preset-typescript": "^7.16.7",
"@popperjs/core": "^2.11.3",
"@popperjs/core": "^2.11.2",
"@tiptap/extension-color": "^2.0.0-beta.9",
"@tiptap/extension-image": "^2.0.0-beta.27",
"@tiptap/extension-link": "^2.0.0-beta.36",
@@ -36,71 +30,70 @@
"@tiptap/starter-kit": "^2.0.0-beta.183",
"@tiptap/vue-3": "^2.0.0-beta.90",
"@types/bootstrap": "^5.1.9",
"@types/chai": "^4.3.0",
"@types/downloadjs": "^1.4.3",
"@types/jquery": "^3.5.14",
"@types/linkifyjs": "^2.1.4",
"@types/lodash": "^4.14.179",
"@types/mocha": "^9.1.0",
"@types/node": "^17.0.21",
"@types/react": "file:hwe/ts/@types/types__react",
"@types/select2": "^4.0.55",
"@types/uuid": "^8.3.4",
"@typescript-eslint/eslint-plugin": "^5.14.0",
"@typescript-eslint/parser": "^5.14.0",
"@vue/compiler-sfc": "^3.2.31",
"@vue/eslint-config-typescript": "^10.0.0",
"async-validator": "^4.0.7",
"autoprefixer": "^10.4.2",
"axios": "^0.26.1",
"babel-plugin-lodash": "^3.3.4",
"babel-preset-modern-browsers": "^15.0.2",
"axios": "^0.26.0",
"bootstrap": "^5.1.3",
"bootstrap-vue-3": "=0.1.6",
"bootswatch": "^5.1.3",
"bootstrap-vue-3": "^0.1.6",
"buffer": "^6.0.3",
"chai": "^4.3.6",
"chai-bytes": "^0.1.2",
"clean-terminal-webpack-plugin": "^3.0.0",
"core-js": "^3.21.1",
"css-loader": "^6.7.1",
"cssnano": "^5.1.3",
"date-fns": "^2.28.0",
"downloadjs": "^1.4.7",
"esbuild-loader": "^2.18.0",
"eslint": "^8.11.0",
"eslint-import-resolver-alias": "^1.1.2",
"eslint-plugin-vue": "^8.5.0",
"file-loader": "^6.2.0",
"jquery": "^3.6.0",
"js-sha512": "^0.8.0",
"linkifyjs": "^3.0",
"lodash": "^4.17.21",
"mini-css-extract-plugin": "^2.6.0",
"mocha": "^9.2.2",
"npm-run-all": "^4.1.5",
"postcss-discard-duplicates": "^5.1.0",
"query-string": "^7.1.1",
"select2": "^4.0",
"uuid": "^8.3.2",
"vue": "^3.2.31",
"vue-multiselect": "^3.0.0-alpha.2",
"vue-types": "^4.1.1",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@babel/cli": "^7.17.3",
"@babel/core": "^7.17.5",
"@babel/preset-env": "^7.16.11",
"@babel/preset-typescript": "^7.16.7",
"@types/jquery": "^3.5.13",
"@types/lodash": "^4.14.178",
"@types/node": "^17.0.18",
"@types/react": "file:hwe/ts/@types/types__react",
"@typescript-eslint/eslint-plugin": "^5.12.0",
"@typescript-eslint/parser": "^5.12.0",
"@vue/compiler-sfc": "^3.2.31",
"@vue/eslint-config-typescript": "^10.0.0",
"autoprefixer": "^10.4.2",
"babel-plugin-lodash": "^3.3.4",
"babel-preset-modern-browsers": "^15.0.2",
"bootswatch": "^5.1.3",
"clean-terminal-webpack-plugin": "^3.0.0",
"css-loader": "^6.6.0",
"cssnano": "^5.0.17",
"esbuild-loader": "^2.18.0",
"eslint": "^8.9.0",
"eslint-plugin-vue": "^8.4.1",
"file-loader": "^6.2.0",
"mini-css-extract-plugin": "^2.5.3",
"postcss-discard-duplicates": "^5.0.3",
"postcss-import": "^14.0.2",
"postcss-loader": "^6.2.1",
"pre-commit": "^1.2.2",
"query-string": "^7.1.1",
"sass": "^1.49.9",
"sass": "^1.49.8",
"sass-loader": "^12.6.0",
"select2": "^4.0",
"style-loader": "^3.3.1",
"ts-node": "^10.7.0",
"tsconfig-paths": "^3.13.0",
"typescript": "^4.6.2",
"ts-node": "^10.5.0",
"typescript": "^4.5.5",
"url-loader": "^4.1.1",
"uuid": "^8.3.2",
"vue": "^3.2.31",
"vue-eslint-parser": "^8.3.0",
"vue-eslint-parser": "^8.2.0",
"vue-loader": "^17.0.0",
"vue-multiselect": "^3.0.0-alpha.2",
"vue-style-loader": "^4.1.3",
"vue-types": "^4.1.1",
"vuedraggable": "^4.1.0",
"webpack": "^5.70.0",
"webpack": "^5.69.1",
"webpack-bundle-analyzer": "^4.5.0",
"webpack-cli": "^4.9.2"
},
+10 -25
View File
@@ -9,7 +9,7 @@ class APIHelper
//static only
}
public static function launch(string $rootPath, ?string $actionPath = null)
public static function launch(string $rootPath)
{
//TODO: path를 php://input에서 받는게 아니라 api.php?~~~~~ 로 받아오는것이 etag 캐시 측면에서 훨씬 나을 듯!
try {
@@ -19,35 +19,20 @@ class APIHelper
Json::dieWithReason($e->getMessage());
}
if($actionPath !== null){
if ($input && !is_array($input)) {
Json::dieWithReason('args가 array가 아닙니다.' . gettype($input));
}
if(!$input){
$input = [];
}
$actionArgs = $input;
}
else{
if(!$input){
Json::dieWithReason("input이 비어있습니다. {$rawInput}");
}
if (!key_exists('path', $input)) {
Json::dieWithReason('path가 지정되지 않았습니다.');
}
$actionPath = $input['path'];
if (key_exists('args', $input) && !is_array($input['args'])) {
Json::dieWithReason('args가 array가 아닙니다.' . gettype($input['args']));
}
$actionArgs = $input['args'] ?? null;
if(!$input){
Json::dieWithReason("input이 비어있습니다. {$rawInput}");
}
if (!key_exists('path', $input)) {
Json::dieWithReason('path가 지정되지 않았습니다.');
}
if (key_exists('args', $input) && !is_array($input['args'])) {
Json::dieWithReason('args가 array가 아닙니다.' . gettype($input['args']));
}
try {
$obj = buildAPIExecutorClass($actionPath, $rootPath, $actionArgs);
$obj = buildAPIExecutorClass($input['path'], $rootPath, $input['args'] ?? []);
$validateResult = $obj->validateArgs();
if ($validateResult !== null) {
Json::dieWithReason($validateResult);
-225
View File
@@ -1,225 +0,0 @@
<?php
namespace sammo;
//NOTE: JavaScript 버전과 일치
const MAX_RNG_SUPPORT_BIT = 53;
if (PHP_INT_SIZE * 8 < MAX_RNG_SUPPORT_BIT) {
throw new \RangeException("PHP not support {$MAX_RNG_SUPPORT_BIT} bit integer");
}
/**
* Reseed를 하지 않는 단순한 형태의 sha512 drbg
* float: bit를 강제로 채움
**/
class LiteHashDRBG implements RNG
{
const MAX_INT = (1 << MAX_RNG_SUPPORT_BIT) - 1;
const BUFFER_BYTE_SIZE = 512 / 8; //SHA512
protected string $buffer;
protected int $bufferIdx;
public function __construct(protected string $seed, protected int $stateIdx = 0, int $bufferIdx = 0)
{
if($bufferIdx < 0){
throw new \InvalidArgumentException("bufferIdx {$bufferIdx} < 0");
}
if($bufferIdx >= self::BUFFER_BYTE_SIZE){
throw new \InvalidArgumentException("bufferIdx {$bufferIdx} >= ".self::BUFFER_BYTE_SIZE);
}
if($stateIdx < 0){
throw new \InvalidArgumentException("stateIdx {$stateIdx} < 0");
}
$this->genNextBlock();
$this->bufferIdx = $bufferIdx;
}
protected function genNextBlock(): void
{
$hq = $this->seed . pack('V', $this->stateIdx);
$this->buffer = hash('sha512', $hq, true);
$this->bufferIdx = 0;
$this->stateIdx += 1;
}
static function getMaxInt(): int
{
return self::MAX_INT;
}
const INT_BIT_MASK_MAP = [
0x1 => 1,
0x3 => 2,
0x7 => 3,
0xf => 4,
0x1f => 5,
0x3f => 6,
0x7f => 7,
0xff => 8,
0x1ff => 9,
0x3ff => 10,
0x7ff => 11,
0xfff => 12,
0x1fff => 13,
0x3fff => 14,
0x7fff => 15,
0xffff => 16,
0x1ffff => 17,
0x3ffff => 18,
0x7ffff => 19,
0xfffff => 20,
0x1fffff => 21,
0x3fffff => 22,
0x7fffff => 23,
0xffffff => 24,
0x1ffffff => 25,
0x3ffffff => 26,
0x7ffffff => 27,
0xfffffff => 28,
0x1fffffff => 29,
0x3fffffff => 30,
0x7fffffff => 31,
0xffffffff => 32,
0x1ffffffff => 33,
0x3ffffffff => 34,
0x7ffffffff => 35,
0xfffffffff => 36,
0x1fffffffff => 37,
0x3fffffffff => 38,
0x7fffffffff => 39,
0xffffffffff => 40,
0x1ffffffffff => 41,
0x3ffffffffff => 42,
0x7ffffffffff => 43,
0xfffffffffff => 44,
0x1fffffffffff => 45,
0x3fffffffffff => 46,
0x7fffffffffff => 47,
0xffffffffffff => 48,
0x1ffffffffffff => 49,
0x3ffffffffffff => 50,
0x7ffffffffffff => 51,
0xfffffffffffff => 52,
0x1fffffffffffff => 53,
];
private static function calcBitMask($n)
{
$n |= $n >> 1;
$n |= $n >> 2;
$n |= $n >> 4;
$n |= $n >> 8;
$n |= $n >> 16;
$n |= $n >> 32;
return $n;
}
public function nextBytes(int $bytes): string
{
if ($bytes <= 0) {
throw new \InvalidArgumentException("{$bytes} <= 0");
}
if ($this->bufferIdx + $bytes <= self::BUFFER_BYTE_SIZE) {
$buffer = substr($this->buffer, $this->bufferIdx, $bytes);
$this->bufferIdx += $bytes;
if ($this->bufferIdx == self::BUFFER_BYTE_SIZE) {
$this->genNextBlock();
}
return $buffer;
}
$result = [substr($this->buffer, $this->bufferIdx)];
$remain = $bytes - (self::BUFFER_BYTE_SIZE - $this->bufferIdx);
while ($remain > self::BUFFER_BYTE_SIZE) {
$this->genNextBlock();
$result[] = $this->buffer;
$remain -= self::BUFFER_BYTE_SIZE;
}
$this->genNextBlock();
if ($remain == 0) {
return join("", $result);
}
$result[] = substr($this->buffer, 0, $remain);
$this->bufferIdx = $remain;
return join("", $result);
}
public function nextBits(int $bits): string
{
$bytes = ($bits + 7) >> 3;
$headBits = $bits & 0x7;
$buffer = $this->nextBytes($bytes);
if ($headBits === 0) {
return $buffer;
}
$buffer[$bytes - 1] = chr(ord($buffer[$bytes - 1]) & (0xff >> (8 - $headBits)));
return $buffer;
}
static private function parseU64(string $value): int
{
return unpack('P', $value)[1];
}
private function _nextInt(int $bits): int
{
$buffer = $this->nextBits($bits) . "\x00\x00\x00\x00\x00\x00\x00";
return self::parseU64($buffer);
}
public function nextInt(?int $max = null): int
{
if ($max === null || $max === self::MAX_INT) {
$buffer = $this->nextBits(MAX_RNG_SUPPORT_BIT) . "\x00";
return self::parseU64($buffer);
}
if ($max > self::MAX_INT) {
throw new \InvalidArgumentException('Over Max Int');
} else if ($max === 0) {
return 0;
} else if ($max < 0) {
return -$this->nextInt(-$max);
}
$mask = self::calcBitMask($max);
$bits = self::INT_BIT_MASK_MAP[$mask];
$n = $this->_nextInt($bits);
while ($n > $max) {
$n = $this->_nextInt($bits);
}
return $n;
}
public function nextFloat1(): float
{
$max = 1 << MAX_RNG_SUPPORT_BIT;
while (true) {
$buffer = $this->nextBits(MAX_RNG_SUPPORT_BIT + 1) . "\x00";
$nInt = self::parseU64($buffer);
if ($nInt <= $max) {
break;
}
}
return $nInt / $max;
}
static function build(string $seed, int $idx = 0): self
{
return new LiteHashDRBG($seed, $idx);
}
}
-28
View File
@@ -1,28 +0,0 @@
<?php
namespace sammo;
interface RNG
{
/**
* @return int nextInt()가 반환 가능한 최대값
*/
public static function getMaxInt(): int;
/**
*
* @param int $bytes
* @return string Little Endian 형태로 채워진 binary 값
*/
public function nextBytes(int $bytes): string;
public function nextBits(int $bits): string;
/**
* @param ?int $max 최대치(해당 값 포함)
* @return int 0과 최대치 사이의 임의의 정수
*/
public function nextInt(?int $max = null): int;
public function nextFloat1(): float;
}
-146
View File
@@ -1,146 +0,0 @@
<?php
namespace sammo;
class RandUtil
{
public function __construct(protected RNG $rng)
{
}
public function nextFloat1(): float
{
return $this->rng->nextFloat1();
}
public function nextRange(int|float $min, int|float $max): float
{
$range = $max - $min;
return $this->nextFloat1() * $range + $min;
}
public function nextRangeInt(int $min, int $max): int
{
$range = $max - $min;
if ($range > $this->rng->getMaxInt()) {
throw new \InvalidArgumentException("Invalid random int range");
}
return $this->rng->nextInt($range) + $min;
}
public function nextInt(?int $max = null): int{
return $this->rng->nextInt($max);
}
public function nextBit(): bool
{
return $this->rng->nextBits(1) !== "\0";
}
public function nextBool(int|float $prob = 0.5): bool
{
if ($prob >= 1) {
return true;
}
return $this->nextFloat1() < $prob;
}
public function shuffle(array $srcArray): array
{
if(!$srcArray){
return $srcArray;
}
$cnt = count($srcArray);
if ($cnt > $this->rng->getMaxInt()) {
throw new \InvalidArgumentException("Invalid random int range");
}
$result = [];
foreach ($srcArray as $val) {
$result[] = $val;
}
//PHP의 range는 max 포함
foreach (range(0, $cnt - 1) as $srcIdx) {
$destIdx = $this->rng->nextInt($cnt - $srcIdx - 1) + $srcIdx;
if($srcIdx === $destIdx){
continue;
}
$tmpVal = $result[$srcIdx];
$result[$srcIdx] = $result[$destIdx];
$result[$destIdx] = $tmpVal;
}
return $result;
}
public function shuffleAssoc(array $srcArray): array
{
if(!$srcArray){
return $srcArray;
}
$result = [];
foreach ($this->shuffle(array_keys($srcArray)) as $key) {
$result[$key] = $srcArray[$key];
}
return $result;
}
public function choice(array $items)
{
$keys = array_keys($items);
$keyIdx = $this->rng->nextInt(count($keys) - 1);
return $items[$keys[$keyIdx]];
}
public function choiceUsingWeight(array $items)
{
$sum = 0;
foreach ($items as $value) {
if ($value <= 0) {
continue;
}
$sum += $value;
}
$rd = $this->nextFloat1() * $sum;
foreach ($items as $item => $value) {
if ($value <= 0) {
$value = 0;
}
if ($rd <= $value) {
return $item;
}
$rd -= $value;
}
//fallback. 이곳으로 빠지지 않음
end($items);
return $items[key($items)][0];
}
public function choiceUsingWeightPair(array $items)
{
$sum = 0;
foreach ($items as [$item, $value]) {
if ($value <= 0) {
continue;
}
$sum += $value;
}
$rd = $this->nextFloat1() * $sum;
foreach ($items as [$item, $value]) {
if ($value <= 0) {
$value = 0;
}
if ($rd <= $value) {
return $item;
}
$rd -= $value;
}
//fallback. 이곳으로 빠지지 않음
end($items);
return $items[key($items)][0];
}
}
+1
View File
@@ -809,4 +809,5 @@ class Util extends \utilphp\util
}
}
}
};
-6
View File
@@ -1,6 +0,0 @@
<?php
class BasicTest extends PHPUnit\Framework\TestCase{
public function testHelloWorld(){
$this->assertEquals(1+1, 2);
}
}
-415
View File
@@ -1,415 +0,0 @@
<?php
use sammo\LiteHashDRBG;
use sammo\RandUtil;
const BLOCK_SIZE = LiteHashDRBG::BUFFER_BYTE_SIZE;
function fillBlock(string $src, string $filler = '\0', int $length = BLOCK_SIZE)
{
$tmp = [$src];
$fillerLen = strlen($filler);
if ($fillerLen < 1) {
throw new \InvalidArgumentException('filler must have length');
}
$remainFill = intdiv($length - strlen($src), $fillerLen);
for (; $remainFill > 0; $remainFill--) {
$tmp[] = $filler;
}
$result = join("", $tmp);
$moreLen = $length - strlen($result);
if ($moreLen === 0) {
return $result;
}
return $result . substr($filler, 0, $moreLen);
}
class DummyBlockRNG extends LiteHashDRBG
{
private int $repeatBlockCnt;
/**
*
* @param string[] $repeatBlock
* @param int $stateIdx
* @return void
* @throws RuntimeException
*/
public function __construct(protected array $repeatBlock, protected int $stateIdx = 0)
{
foreach ($repeatBlock as $block) {
if (strlen($block) != BLOCK_SIZE) {
throw new RuntimeException('Invalid repeat block');
}
}
$this->repeatBlockCnt = count($this->repeatBlock);
$this->genNextBlock();
}
protected function genNextBlock(): void
{
$this->buffer = $this->repeatBlock[$this->stateIdx];
$this->bufferIdx = 0;
$this->stateIdx = ($this->stateIdx + 1) % $this->repeatBlockCnt;
}
}
/* Python TestVector
import hashlib
import struct
fixedKey = 'HelloWorld'.encode('utf-8')
def hash(key, idx):
idxV = struct.pack("<I", idx)
return hashlib.sha512(key + idxV).digest()
for idx in range(5):
print(hash(fixedKey, idx).hex())
*/
$rngTestVector = hex2bin(join('', [
'24d9ccd648556255fd0ee9f5b29918de90617341958b3b354d572167e4dee02b757816a2bbe0b502c52413ffd384381a9d7b4e193df6f4345d6a95e111d661c4',
'2e9264512f6f4b080cf1376b74fab6878ecf4a6e185942d2e5b22cf923885b9952d40601a414225d6901417fd4ce9368ac77e4a63d3fc9b58ab952bb8c33f165',
'8e2ebf5af6283a1b18f4c044c86c20d02be3890613c4cc8b7c6b7b35581263b972a82630df69a9289988422d7c3a9be5edf78d5de16fabd01e5dd4e458068d8a',
'398596047ba547bfe371ec863a3e019ab0dbc4bb3b27e9077685aae4283ff6bbccfd981d92f9358f7efffbb72a940414802d98466d132e2ad0a16a12946d5f47',
'b3606fe9b18c4aa7315e78bb9e47cb51cc4e203fcc2e631f0405c1b872c8e1cb5b6415ea74bbb77fffaaadb002b47cb4f4628dc0709634365b187667f5c708cb',
]));
class RNGTest extends PHPUnit\Framework\TestCase
{
const FIXED_KEY = 'HelloWorld';
public function testDummyRNG()
{
//Block의 값을 고정하고 입력값을 확인
$rng = new DummyBlockRNG([
fillBlock('', "\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff")
]);
$this->setName('DummyRNG-SimpleByte');
$this->assertEquals("\x00", $rng->nextBytes(1));
$this->assertEquals("\x11\x22", $rng->nextBytes(2));
$this->assertEquals("\x33\x44\x55", $rng->nextBytes(3));
$this->assertEquals("\x66\x77\x88\x99", $rng->nextBytes(4));
$this->setName('DummyRNG-OverflowBlock');
foreach (range(1, 16) as $_i) {
$this->assertEquals(
"\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99",
$rng->nextBytes(16)
);
}
$this->setName('DummyRNG-MultiBlock');
$this->assertEquals(
fillBlock('', "\xaa\xbb\xcc\xdd\xee\xff\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99", BLOCK_SIZE * 2),
$rng->nextBytes(BLOCK_SIZE * 2)
);
$this->setName('DummyRNG-BitTest');
$this->assertEquals("\x00", $rng->nextBits(1)); //aa
$this->assertEquals("\x01", $rng->nextBits(1)); //bb
$this->assertEquals("\xcc", $rng->nextBits(8)); //cc
$this->assertEquals("\xdd\x02", $rng->nextBits(10)); //ddee
$this->assertEquals("\x7f", $rng->nextBits(7)); //ff
$this->assertEquals("\x00\x11\x22\x33\x44\x55\x06", $rng->nextBits(53));
$this->setName('DummyRNG-Int');
$this->assertEquals(0x77, $rng->nextInt(0xff));
$this->assertEquals(0x9988, $rng->nextInt((1 << 16) - 1));
$this->assertEquals(0xddccbbaa, $rng->nextInt((1 << 32) - 1));
$this->assertEquals(0x0433221100ffee, $rng->nextInt());
$this->assertEquals(0x05, $rng->nextInt(0x0f)); //55
$this->assertEquals(0x06, $rng->nextInt(0x12)); //66
$this->assertEquals(0x08, $rng->nextInt(99)); //77(119 -> 7bit) -> 88(136 -> 8bit -> 8)
$this->assertEquals(0x99, $rng->nextInt(0x99)); //99
$this->assertEquals(0xaa, $rng->nextInt(0xaa)); //aa (fit Max)
$floatMax = 1 << 53;
$this->setName('DummyRNG-Float'); //7개씩
$fa = $rng->nextFloat1();
$this->assertEquals(0x1100ffeeddccbb / $floatMax, $fa, 'float1-1');
$this->assertIsFloat($fa);
$this->assertLessThan(0.5313720384, $fa);
$this->assertGreaterThan(0.5313720383, $fa);
$fb = $rng->nextFloat1();
$this->assertEquals(0x08776655443322 / $floatMax, $fb, 'float1-2');
}
public function testRandUtilDummy_shuffle(){
$rng = new DummyBlockRNG([
fillBlock('', "\x17\x16\x15\x14\x13\x12\x11\x10")
]);
$randUtil = new RandUtil($rng);
/**
* 7, [7,1,2,3,4,5,6,0]
* 6, [7,0,2,3,4,5,6,1]
* 5, [7,0,1,3,4,5,6,2]
* 4, [7,0,1,2,4,5,6,3]
* 3, [7,0,1,2,3,5,6,4]
* 2, [7,0,1,2,3,4,6,5]
* 1, [7,0,1,2,3,4,5,6]
*/
$this->assertEquals(
$randUtil->shuffle(range(0, 7)),
[7, 0, 1, 2, 3, 4, 5, 6]
);
/**
* 0, [0,1,2,3,4,5,6,7,8,9]
* 7, [0,8,2,3,4,5,6,7,1,9]
* 6, [0,8,1,3,4,5,6,7,2,9]
* 5, [0,8,1,2,4,5,6,7,3,9]
* 4, [0,8,1,2,3,5,6,7,4,9]
* 3, [0,8,1,2,3,4,6,7,5,9]
* 2, [0,8,1,2,3,4,5,7,6,9]
* 1, [0,8,1,2,3,4,5,6,7,9]
* 0, [0,8,1,2,3,4,5,6,7,9]
*/
$this->assertEquals(
$randUtil->shuffle(range(0, 9)),
[0, 8, 1, 2, 3, 4, 5, 6, 7, 9]
);
$rng = new DummyBlockRNG([
fillBlock('', "\x17\x16\x15\x14\x13\x12\x11\x10")
]);
$randUtil = new RandUtil($rng);
//Same as first, but assoc.
$this->assertEquals($randUtil->shuffleAssoc([
'a' => 0,
'b' => 1,
'c' => 2,
'd' => 3,
'e' => 4,
'f' => 5,
'g' => 6,
'h' => 7,
]), [
'h' => 7,
'a' => 0,
'b' => 1,
'c' => 2,
'd' => 3,
'e' => 4,
'f' => 5,
'g' => 6,
]);
}
public function testRandUtilDummy_choiceSeries(){
$rng = new DummyBlockRNG([
fillBlock('', "\x17\x16\x15\x14\x13\x12\x11\x10")
]);
$randUtil = new RandUtil($rng);
//0x17(7), 0x16(6)
$this->assertEquals($randUtil->choice([0, 1, 2, 3, 4, 5]), 5);
//0x15(5), Set 순서 유지
$this->assertEquals($randUtil->choice([5, 3, 1, 2, 8, 0]), 8);
//0x14(4), Js의 Object와 순서 다름!
$this->assertEquals($randUtil->choice([
2=>'t', 3=>'q', 4=>'x',
'c'=> 'c', 'a'=> 'a', 'b'=> 'b'
]), 'c');
//0.6275740099377194 * 38.1 = 23.91
$this->assertEquals($randUtil->choiceUsingWeight([
"a"=> 0.1,
"b"=> 10,
"tt"=> 2,
"x"=> -1,
"c"=> 20,
"d"=> 0,
"e"=> 6
]), 'c');
//0.658946544056166
$this->assertEquals($randUtil->choiceUsingWeightPair([
['xx', 10],
]), 'xx');
//0.6903152783785083 * 27.3 = 18.84560709973328
$this->assertEquals($randUtil->choiceUsingWeightPair([
['e', 10],
['d', 4],
['c', 0.1],
['baba', 0.2],
['q', 9],
['xt', 4]
]), 'q');
}
public function testRNGInvalidNextBits0()
{
$rng = new LiteHashDRBG(self::FIXED_KEY);
$this->expectException('\InvalidArgumentException');
$rng->nextBits(0);
}
public function testRNGInvalidNextBitsMinus1()
{
$rng = new LiteHashDRBG(self::FIXED_KEY);
$this->expectException('\InvalidArgumentException');
$rng->nextBits(-1);
}
public function testRNGInvalidNextBytes0()
{
$rng = new LiteHashDRBG(self::FIXED_KEY);
$this->expectException('\InvalidArgumentException');
$rng->nextBytes(0);
}
public function testRNGInvalidNextBytesMinus1()
{
$rng = new LiteHashDRBG(self::FIXED_KEY);
$this->expectException('\InvalidArgumentException');
$rng->nextBytes(-1);
}
public function testRNGInvalidNextIntOverflow()
{
$rng = new LiteHashDRBG(self::FIXED_KEY);
$this->expectException('\InvalidArgumentException');
$rng->nextInt(1 << 53);
}
public function testRandUtilEmptyChoice()
{
$this->expectException('\InvalidArgumentException');
$rng = new LiteHashDRBG(self::FIXED_KEY);
$randUtil = new RandUtil($rng);
$randUtil->choice([]);
}
public function testRandUtilEmptychoiceUsingWeight()
{
$this->expectException('\InvalidArgumentException');
$rng = new LiteHashDRBG(self::FIXED_KEY);
$randUtil = new RandUtil($rng);
$randUtil->choiceUsingWeight([]);
}
public function testRandUtilEmptychoiceUsingWeightPair()
{
$this->expectException('\InvalidArgumentException');
$rng = new LiteHashDRBG(self::FIXED_KEY);
$randUtil = new RandUtil($rng);
$randUtil->choiceUsingWeightPair([]);
}
/**
* @doesNotPerformAssertions
*/
public function testRNGAcceptable()
{
$rng = new LiteHashDRBG(self::FIXED_KEY);
$rng->nextInt(0);
$rng->nextInt(1 << 53 - 1);
$rng->nextBytes(65);
$rng->nextBits(512);
$randUtil = new RandUtil($rng);
$randUtil->choice([0, 0, 0]);
$randUtil->choiceUsingWeight([0 => 0, 1 => -1]);
$randUtil->choiceUsingWeightPair([
[0, 0],
[1, 0],
[2, -1],
]);
$randUtil->nextBool(1.1);
$randUtil->nextBool(-0.1);
$randUtil->shuffle([]);
$randUtil->shuffle([1]);
$randUtil->shuffleAssoc([]);
$randUtil->shuffleAssoc([1]);
$randUtil->nextRange(0, 0);
$randUtil->nextRangeInt(0, 0);
$randUtil->nextRange(1, -1);
$randUtil->nextRangeInt(1, -1);
$longKey = self::FIXED_KEY;
foreach(range(0, 7) as $_){
$longKey.=$longKey;
}
$rngLong = new LiteHashDRBG($longKey);
foreach(range(0, 9) as $_){
$rngLong->nextBytes(16);
}
}
public function testRNGBytes()
{
global $rngTestVector;
$testVector = $rngTestVector;
$rng = new LiteHashDRBG(static::FIXED_KEY);
$offset = 0;
$this->assertEquals($rng->nextBytes(10), substr($testVector, $offset, 10));
$offset += 10;
$this->assertEquals($rng->nextBytes(32), substr($testVector, $offset, 32));
$offset += 32;
$this->assertEquals($rng->nextBytes(1), substr($testVector, $offset, 1));
$offset += 1;
$this->assertEquals($rng->nextBytes(64), substr($testVector, $offset, 64));
$offset += 64;
$this->assertEquals($rng->nextBytes(5), substr($testVector, $offset, 5));
$offset += 5;
$this->assertEquals($rng->nextBytes(16), substr($testVector, $offset, 16));
$offset += 16;
}
public function testRNGBits()
{
global $rngTestVector;
$testVector = $rngTestVector;
$rng = new LiteHashDRBG(static::FIXED_KEY);
$offset = 0;
$testBits = [10, 4, 15, 32, 7, 99, 512, 1, 2, 3];
foreach($testBits as $bits){
$bytes = intdiv($bits + 7, 8);
$A = $rng->nextBits($bits);
$B = substr($testVector, $offset, $bytes);
$offset += $bytes;
if($bits % 8 != 0){
$bitMask = 0xff >> (8 - ($bits % 8));
$B[$bytes - 1] = chr(ord($B[$bytes - 1]) & $bitMask);
}
$this->assertEquals($A, $B);
}
}
public function testRNGFloat()
{
global $rngTestVector;
$testVector = $rngTestVector;
$rng = new LiteHashDRBG(static::FIXED_KEY);
$rng2 = new DummyBlockRNG([
substr($testVector, BLOCK_SIZE * 0, BLOCK_SIZE),
substr($testVector, BLOCK_SIZE * 1, BLOCK_SIZE),
substr($testVector, BLOCK_SIZE * 2, BLOCK_SIZE),
substr($testVector, BLOCK_SIZE * 3, BLOCK_SIZE),
substr($testVector, BLOCK_SIZE * 4, BLOCK_SIZE),
]);
foreach(range(0, 17) as $idx){
$this->assertEquals($rng->nextFloat1(), $rng2->nextFloat1(), "float{$idx}");
}
}
}
+1 -4
View File
@@ -72,8 +72,5 @@
/* Advanced Options */
"skipLibCheck": true, /* Skip type checking of declaration files. */
"forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
},
"exclude": [
"**/*.test.ts"
]
}
}
+1
View File
@@ -0,0 +1 @@
Deny from all
+7
View File
@@ -0,0 +1,7 @@
<?php
// autoload.php @generated by Composer
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a::getLoader();
Vendored Symlink
+1
View File
@@ -0,0 +1 @@
../nesbot/carbon/bin/carbon
Vendored Symlink
+1
View File
@@ -0,0 +1 @@
../phan/phan/phan
Vendored Symlink
+1
View File
@@ -0,0 +1 @@
../phan/phan/phan_client
Vendored Symlink
+1
View File
@@ -0,0 +1 @@
../phan/phan/tocheckstyle
+1
View File
@@ -0,0 +1 @@
service_name: travis-ci
@@ -0,0 +1,4 @@
test.php
build/*
report/*
tests/test*
+22
View File
@@ -0,0 +1,22 @@
language: php
php:
- 5.3
- 5.4
- 5.5
- 5.6
- hhvm
matrix:
allow_failures:
- php: hhvm
before_script:
- pyrus install pear/PHP_CodeSniffer
- wget -nc http://getcomposer.org/composer.phar
- php composer.phar install --dev --no-interaction
- mkdir -p build/logs
- phpenv rehash
after_script:
- php vendor/bin/coveralls
+86
View File
@@ -0,0 +1,86 @@
Change Log
==========
1.1.0
-----
This release introduces a deprecation notice for `slugify()`, please update your code.
* Added a cryptographically secure random string function `secure_random_string`. Thanks to @abhimanyusharma003 via [Pull Request #53](https://github.com/brandonwamboldt/utilphp/pull/53)
* Added `limit_characters` and `limit_words` functions. Thanks to @abhimanyusharma003 via [Pull Request #55](https://github.com/brandonwamboldt/utilphp/pull/55)
* Added `rmdir` method to recursively delete a directory. Thanks to @ARACOOOL via [Pull Request #56](https://github.com/brandonwamboldt/utilphp/pull/56)
* Added `set_executable`, `set_readable`, `set_writable`, `directory_size`, `directory_contents` and `get_user_dir` functions. Thanks to @sergserg via [Pull Request #70](https://github.com/brandonwamboldt/utilphp/pull/70)
* Changed parameter ordering for `slugify`, `$css_mode` is now the third argument. For backwards compatibility, the old order will still work but it will generate an `E_USER_DEPRECATED` warning. Thanks to @abhimanyusharma003 via [Pull Request #71](https://github.com/brandonwamboldt/utilphp/pull/71)
* Added `match_string` method. Thanks to @abhimanyusharma003 via [Pull Request #72](https://github.com/brandonwamboldt/utilphp/pull/72)
* Renamed internal methods (protected ones) for PSR-2 compliance
* General performance improvements, code quality improvements, and increased unit test coverage (special thanks to @hopeseekr for getting us near 100% coverage)
1.0.7
-----
* Added `fix_broken_serialization` to fix broken serialized strings (Thanks to @hopeseekr via [Pull Request #48](https://github.com/brandonwamboldt/utilphp/pull/48))
* Fixed `get_current_url` appending port 80 or 443 when not needed (Thanks to @scottchiefbaker via [Pull Request #49](https://github.com/brandonwamboldt/utilphp/pull/49))
* `var_dump` can now handle recursive data structures without crashing
* `var_dump` code was minified and cleaned up
* `array_flatten` was optimized (thanks to @hopeseekr via [Pull Request #47](https://github.com/brandonwamboldt/utilphp/pull/47))
* `remove_accents` was completely rewritten and is now ~4x faster
1.0.6
-----
* Added `start_with` function
* Added `ends_with` function
* Added `str_contains` function
* Added `str_icontains` function
* Added `get_file_ext` function
* Fixing permissions on the files & directories
* Fixing a bug with the include path of util.php
1.0.5
-----
* [Issue #29](https://github.com/brandonwamboldt/utilphp/issues/29) Fixed error in `var_dump` if mbstring extension wasn't present
* Adding Composer support
* Updating license from GPL to MIT
* Adding Changelog to project
* Bumping minimum version to PHP 5.3.3
1.0.4
-----
* [Issue #22](https://github.com/brandonwamboldt/utilphp/issues/22) Removed all superglobal *_get functions, you can use the modified array_get now
* [Issue #22](https://github.com/brandonwamboldt/utilphp/issues/22) Modifed the behaviour of `array_get`, see documentation
* [Pull Request #21](https://github.com/brandonwamboldt/utilphp/pull/21) Added multibyte support to html* functions
* [Issue #9](https://github.com/brandonwamboldt/utilphp/issues/9) Removed the `str_to_utf8` function
* [Issue #3](https://github.com/brandonwamboldt/utilphp/issues/3) Removed the `absint` function
* Removed declare() from util.php to avoid errors
* Updated PHPUnit tests to use PHPUnit 3.6
1.0.3
-----
* [Issue #16](https://github.com/brandonwamboldt/utilphp/issues/16) Improved performance of `slugify`
* [Issue #14](https://github.com/brandonwamboldt/utilphp/issues/14) Modified the regex for `seems_utf8` to be more accurate
* [Issue #13](https://github.com/brandonwamboldt/utilphp/issues/13) Changed `validate_email` to be wrapper for `filter_var`
* Added 'ok' to the list of yes words for `str_to_bool`
* `str_to_bool` matches no followed by any number of 'o's
1.0.2
-----
* [Issue #12](https://github.com/brandonwamboldt/utilphp/issues/12) `get_current_url` now includes the port and user/password if required
* [Issue #11](https://github.com/brandonwamboldt/utilphp/issues/11) `human_time_diff` now uses the DateTime functions
* [Issue #10](https://github.com/brandonwamboldt/utilphp/issues/10) `is_https` no longer checks the port as well
1.0.1
-----
* [Issue #7](https://github.com/brandonwamboldt/utilphp/issues/7) Added the `$trust_proxy_headers` parameter to `get_client_ip`
* [Issue #6](https://github.com/brandonwamboldt/utilphp/issues/6) Removed `is_isset` as the function did not work as intended
* [Issue #6](https://github.com/brandonwamboldt/utilphp/issues/6) Removed `is_empty` as it is redundant, use ! with function calls instead
* Fixed a bug with `get_gravatar`
1.0.0
-----
* Initial release of util.php.
+48
View File
@@ -0,0 +1,48 @@
# CONTRIBUTORS
Util.php is the combined effort of many people who contributed new functions and features, bug fixes, tests, and documentation.
# Maintainer / Lead
* Brandon Wamboldt (http://brandonwamboldt.ca)
## Third-Party Projects
The following projects were fully or partially incorporated into util.php (and properly attributed).
* IntToWords (https://github.com/hemant347/IntToWords)
* LinkifyURL (https://github.com/jmrware/LinkifyURL)
* URLify.php (https://github.com/jbroadway/urlify/)
* Pure PHP http_build_url (https://github.com/jakeasmith/http_build_url)
## Methods
The following developers and/or companies helped contribute to building util.php.
* PHP Experts, Inc. (http://www.phpexperts.pro/)
- `array_flatten()`
- `fix_broken_serialization()`
- Lots of unit tests.
* Tony Ferrara (ircmaxwell, http://blog.ircmaxell.com/)
- `seemsUtf8Regex()`: http://stackoverflow.com/a/11709412/430062
* Askar ([@ARACOOOL](https://github.com/ARACOOOL))
- `rmdir()`
- `limit_characters()`
- `limit_words()`
* Anonymous (tmp1000@fastmail.fm)
- `htmlspecialentities()`: http://php.timesoft.cc/manual/en/function.htmlentities.php
- `htmlspecialchars()`
* Laravel Project (https://github.com/laravel/laravel)
- `secure_random_string()`: http://trac.allenjb.me.uk/php/browser/tagi/vendor/laravel/framework/src/Illuminate/Support/Str.php?rev=87#L127
* Abhimanyu Sharma ([@abhimanyusharma003](https://github.com/abhimanyusharma003))
- `limit_characters()`
- `limit_words()`
- `match_string()`
* Scott Baker ([@scottchiefbaker](https://github.com/scottchiefbaker))
* [@sergserg](https://github.com/sergserg)
- `set_writable()`
- `set_executable()`
- `set_readable()`
- `directory_size()`
- `directory_contents()`
- `get_user_dir()`
+24
View File
@@ -0,0 +1,24 @@
The MIT License (MIT)
=====================
The MIT License (MIT)
Copyright (c) 2013 Brandon Wamboldt
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+123
View File
@@ -0,0 +1,123 @@
# Util.php [![Build Status](https://img.shields.io/travis/brandonwamboldt/utilphp.svg)](https://travis-ci.org/brandonwamboldt/utilphp) [![Coverage Status](https://img.shields.io/coveralls/brandonwamboldt/utilphp/master.svg)](https://coveralls.io/r/brandonwamboldt/utilphp)
[UtilPHP](http://brandonwamboldt.github.com/utilphp/) (Aka util.php) is a
collection of useful functions and snippets that you need or could use every
day. It's implemented as a class with static methods, to avoid conflicts with
your existing code-base. Just drop it in and start using it immediately.
Included are 55+ functions that provide you with the ability to do common
tasks much easier and more efficiently, without having to find that one comment
on php.net where you know it's been done already. Access superglobals without
checking to see if certain indexes are set first and pass default values, use a
nicely formatted var dump, validate emails, generate random strings, flatten an
array, pull a single column out of a multidimensional array and much more.
Although it's implemented as one giant class, util.php has extensive
documentation and a full suite of unit tests to avoid breaking
backwards-compatibility unintentionally.
## Release Information
This repo contains in development code for future releases as well as the
current stable branch. Development code is contained in the develop branch.
## Changelog and New Features
You can find a list of all changes for each release in the
[official documentation](http://brandonwamboldt.github.com/utilphp/#changelog)
## Installation
### Server Requirements
* PHP version 5.3.3 or higher.
### Standalone File
Simply drop `util.php` in any project and call `include 'util.php';` in your
project. You can then access the `Util` class.
### Composer
Add the following dependency to your composer.json:
```
"brandonwamboldt/utilphp": "1.0.*"
```
When used with composer, the class is namespaced (`\utilphp\util`) instead of
just `util`.
## Contributing
UtilPHP is a community driven project and accepts contributions of code and
documentation from the community. These contributions are made in the form of
Issues or [Pull Requests](http://help.github.com/send-pull-requests/) on the
[UtilityPHP repository](https://github.com/brandonwamboldt/utilphp) on GitHub.
Issues are a quick way to point out a bug. If you find a bug or documentation
error in UtilityPHP then please check a few things first:
* There is not already an open Issue
* The issue has already been fixed (check the develop branch, or look for closed Issues)
* Is it something really obvious that you fix it yourself?
Reporting issues is helpful but an even better approach is to send a Pull
Request, which is done by "Forking" the main repository and committing to your
own copy. This will require you to use the version control system called Git.
## Guidelines
Before we look into how, here are the guidelines. If your Pull Requests fail to
pass these guidelines it will be declined and you will need to re-submit when
youve made the changes. This might sound a bit tough, but it is required for
me to maintain quality of the code-base.
### PHP Style
Please ensure all new contributions match the [PSR-2](http://www.php-fig.org/psr/psr-2/)
coding style guide.
### Documentation
If you change anything that requires a change to documentation then you will
need to add it. New methods, parameters, changing default values, adding
constants, etc are all things that will require a change to documentation. The
change-log must also be updated for every change. Also PHPDoc blocks must be
maintained.
### PHP Version Compatibility
UtilityPHP is compatible with PHP 5.3.3 so all code supplied must stick to this
requirement.
Of particular note is avoiding short array notation like this:
```
$var = [];
```
Please use the old notation instead:
```
$var = array();
```
I know it's uglier, but PHP 5.3 while EOL'd, still isn't that old.
### Branching
One thing at a time: A pull request should only contain one change. That does
not mean only one commit, but one change - however many commits it took. The
reason for this is that if you change X and Y but send a pull request for both
at the same time, we might really want X but disagree with Y, meaning we cannot
merge the request. Using the Git-Flow branching model you can create new
branches for both of these features and send two requests.
## License
UtilPHP is licensed under the MIT license.
## Resources
* [Documentation](http://brandonwamboldt.github.com/utilphp/)
+24
View File
@@ -0,0 +1,24 @@
{
"name": "brandonwamboldt/utilphp",
"type": "library",
"version": "1.1.0",
"description": "util.php is a collection of useful functions and snippets that you need or could use every day, designed to avoid conflicts with existing projects",
"keywords": ["php", "utility", "collection", "helpers"],
"homepage": "https://github.com/brandonwamboldt/utilphp",
"license": "MIT",
"authors": [
{
"name": "Brandon Wamboldt",
"email": "brandon.wamboldt@gmail.com"
}
],
"autoload": {
"psr-0": { "utilphp\\": "src/" }
},
"require-dev": {
"satooshi/php-coveralls": "dev-master"
},
"require": {
"php": ">=5.3.3"
}
}
+168
View File
@@ -0,0 +1,168 @@
body {
background: #f4f4f4 url('../images/background.png');
color: #333;
font: 18px/30px "Droid Serif", "Helvetica Neue", Helvetica, Arial;
}
a {
text-decoration: none;
color: #f00;
padding: 2px;
}
a:hover {
background: #277585;
color: #fff;
border-radius: 3px;
}
h1, h2, h3, h4, h5, h6 {
padding-top: 20px;
}
h2 {
font-size: 40px;
font-weight: normal;
margin: 0 0 15px;
}
p {
margin: 20px 0;
min-width: 550px;
max-width: 900px;
}
table, tr, td {
margin: 0; padding: 0;
}
td {
padding: 2px 12px 2px 0;
}
ul {
list-style-type: circle;
padding: 0 0 0 20px;
}
li {
width: 500px;
margin-bottom: 10px;
}
code, pre, tt {
font-family: Monaco, Consolas, "Lucida Console", monospace;
font-size: 12px;
line-height: 18px;
font-style: normal;
}
tt {
padding: 0px 3px;
background: #fff;
border: 1px solid #ddd;
zoom: 1;
}
code {
margin-left: 20px;
}
pre {
font-size: 12px;
padding: 12px;
background: #fff;
margin: 0px 0 30px;
border-radius: 0 0 2px 2px;
box-shadow: inset 0 0 0 1px rgba(0,0,0,.15);
}
span.header {
font-size: 24px;
line-height: 30px;
border-left: 10px solid #ddd;
padding-left: 10px;
}
.desc-text code {
margin-left: 0;
font-size: 18px;
color: #0E04C8;
}
#sidebar {
background: #fff;
position: fixed;
top: 0; left: 0; bottom: 0;
width: 220px;
overflow-y: auto;
overflow-x: hidden;
padding: 5px 0 30px 10px;
border-right: 1px solid #bbb;
box-shadow: 0 0 20px #ccc;
-webkit-box-shadow: 0 0 20px #ccc;
-moz-box-shadow: 0 0 20px #ccc;
-webkit-overflow-scrolling: touch;
}
.toc_title, .toc_title:visited {
display: block;
color: #000;
margin-top: 15px;
}
.toc_title:hover {
background: none;
color: #f00;
}
.toc_title .version {
font-size: 12px;
font-weight: normal;
}
.toc_section {
font-size: 14px;
line-height: 24px;
margin: 5px 0 0 0;
padding-left: 10px;
list-style-type: none;
}
.toc_section li {
cursor: pointer;
margin: 0 0 3px 0;
}
.toc_section li a {
text-decoration: none;
color: black;
}
.toc_section li a:hover {
background: none;
color: #f00;
}
.container {
min-width: 550px;
max-width: 1000px;
margin: 40px 0 50px 260px;
}
#documentation section > article > p > code {
color: #999;
}
#documentation section > article > p > code > .util_class {
color: #bbb;
}
#documentation section > article > p > code > .func_name {
color: #0E04C8;
}
#documentation section > article > p > code > .param {
color: #DA72F3;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

+1234
View File
@@ -0,0 +1,1234 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="chrome=1" />
<meta name="viewport" content="width=device-width" />
<link rel="canonical" href="http://includephp.brandonwamboldt.ca/" />
<link rel="shortcut icon" href="favicon.png" type="image/png" />
<link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Droid+Serif:400,700,400italic" />
<link rel="stylesheet" href="css/docs.css" />
<title>util.php - The PHP programmers best friend - UtilityPHP</title>
</head>
<body>
<div id="sidebar" class="interface">
<a class="toc_title" href="#">util.php <span class="version">(1.1.0)</span></a>
<a class="toc_title" href="#debug_functions">Debugging</a>
<ul class="toc_section">
<li>- <a href="#var_dump">var_dump</a></li>
</ul>
<a class="toc_title" href="#arrays">Arrays &amp; Objects</a>
<ul class="toc_section">
<li>- <a href="#array_first">array_first</a></li>
<li>- <a href="#array_first_key">array_first_key</a></li>
<li>- <a href="#array_flatten">array_flatten</a></li>
<li>- <a href="#array_get">array_get</a></li>
<li>- <a href="#array_last">array_last</a></li>
<li>- <a href="#array_last_key">array_last_key</a></li>
<li>- <a href="#array_map_deep">array_map_deep</a></li>
<li>- <a href="#array_pluck">array_pluck</a></li>
<li>- <a href="#array_search_deep">array_search_deep</a></li>
<li>- <a href="#array_clean">array_clean</a></li>
</ul>
<a class="toc_title" href="#urls">URLs</a>
<ul class="toc_section">
<li>- <a href="#add_query_arg">add_query_arg</a></li>
<li>- <a href="#get_current_url">get_current_url</a></li>
<li>- <a href="#http_build_url">http_build_url</a></li>
<li>- <a href="#is_https">is_https</a></li>
<li>- <a href="#remove_query_arg">remove_query_arg</a></li>
<li>- <a href="#slugify">slugify</a></li>
</ul>
<a class="toc_title" href="#strings">Strings</a>
<ul class="toc_section">
<li>- <a href="#htmlentities">htmlentities</a></li>
<li>- <a href="#htmlspecialchars">htmlspecialchars</a></li>
<li>- <a href="#linkify">linkify</a></li>
<li>- <a href="#match_string">match_string</a></li>
<li>- <a href="#random_string">random_string</a></li>
<li>- <a href="#number_to_word">number_to_word</a></li>
<li>- <a href="#ordinal">ordinal</a></li>
<li>- <a href="#remove_accents">remove_accents</a></li>
<li>- <a href="#secure_random_string">secure_random_string</a></li>
<li>- <a href="#seems_utf8">seems_utf8</a></li>
<li>- <a href="#safe_truncate">safe_truncate</a></li>
<li>- <a href="#size_format">size_format</a></li>
<li>- <a href="#str_to_bool">str_to_bool</a></li>
<li>- <a href="#zero_pad">zero_pad</a></li>
<li>- <a href="#strip_space">strip_space</a></li>
<li>- <a href="#sanitize_string">sanitize_string</a></li>
</ul>
<a class="toc_title" href="#files">Files</a>
<ul class="toc_section">
<li>- <a href="#full_permissions">full_permissions</a></li>
<li>- <a href="#rmdir">rmdir</a></li>
</ul>
<a class="toc_title" href="#serialization">Serialization</a>
<ul class="toc_section">
<li>- <a href="#is_serialized">is_serialized</a></li>
<li>- <a href="#maybe_serialize">maybe_serialize</a></li>
<li>- <a href="#maybe_unserialize">maybe_unserialize</a></li>
<li>- <a href="#fix_broken_serialization">fix_broken_serialization</a></li>
</ul>
<a class="toc_title" href="#other">Other</a>
<ul class="toc_section">
<li>- <a href="#force_download">force_download</a></li>
<li>- <a href="#get_client_ip">get_client_ip</a></li>
<li>- <a href="#get_gravatar">get_gravatar</a></li>
<li>- <a href="#human_time_diff">human_time_diff</a></li>
<li>- <a href="#nocache_headers">nocache_headers</a></li>
<li>- <a href="#utf8_headers">utf8_headers</a></li>
<li>- <a href="#validate_email">validate_email</a></li>
</ul>
<a class="toc_title" href="#constants">Constants</a>
<ul class="toc_section">
<li>- <a href="#SECONDS_IN_A_MINUTE">SECONDS_IN_A_MINUTE</a></li>
<li>- <a href="#SECONDS_IN_AN_HOUR">SECONDS_IN_AN_HOUR</a></li>
<li>- <a href="#SECONDS_IN_A_DAY">SECONDS_IN_A_DAY</a></li>
<li>- <a href="#SECONDS_IN_A_WEEK">SECONDS_IN_A_WEEK</a></li>
<li>- <a href="#SECONDS_IN_A_MONTH">SECONDS_IN_A_MONTH</a></li>
<li>- <a href="#SECONDS_IN_A_YEAR">SECONDS_IN_A_YEAR</a></li>
</ul>
<a class="toc_title" href="#changelog">Change Log</a>
</div>
<div class="container">
<p id="introduction">
<img id="logo" src="images/utility_logo.png" alt="Util.php" />
</p>
<p>
<a href="http://github.com/brandonwamboldt/utilphp/">util.php</a> is a collection of useful functions and snippets
that you need or could use every day. It's implemented as a class with static methods, to avoid conflicts with your
existing code-base. Just drop it in and start using it immediately.
</p>
<p>
Included are 60+ functions that provide you with the ability to do common tasks much easier and more efficiently,
without having to find that one comment on php.net where you know its been done already. Access superglobals
without checking to see if certain indexes are set first and pass default values, use a nicely formatted var dump,
validate emails, generate random strings, flatten an array, pull a single column out of a multidimensional array
and much more.
</p>
<p>
Although it's implemented as one giant class, util.php has extensive documentation and a full suite of unit tests
to avoid breaking backwards-compatibility unintentionally.
</p>
<p>
The project is <a href="http://github.com/brandonwamboldt/utilphp/">hosted on GitHub</a>.
You can report bugs and discuss features on the
<a href="https://github.com/brandonwamboldt/utilphp/issues">issues page</a>,
or send tweets to <a href="http://twitter.com/brandonwamboldt">@brandonwamboldt</a>.
</p>
<h2>Downloads <i style="padding-left: 12px; font-size:12px;">(Right-click, and use "Save As")</i></h2>
<p>
<a href="https://github.com/brandonwamboldt/utilphp/archive/1.1.0.zip">Stable Version (1.1.0)</a><br>
<a href="https://github.com/brandonwamboldt/utilphp/zipball/master">Unstable Version (master)</a>
</p>
<h2>Installation</h2>
<span class="header">Server Requirements</span><br>
<ul>
<li>PHP 5.3.3+</li>
</ul>
<span class="header">Standalone File</span><br>
<p class="desc-text">
Simply drop <code>util.php</code> in any project and call <code>include 'util.php';</code> in your project.
You can then access the <code>Util</code> class.
</p>
<span class="header">Composer</span><br>
<p class="desc-text">
Add the following dependency to your composer.json:
<pre>"brandonwamboldt/utilphp": "1.1.*"</pre>
When used with composer, the class is namespaced (<code>\utilphp\util</code>) instead of
just <code>util</code>.
</p>
<div id="documentation">
<h2 id="debug_functions">Debugging Functions</h2>
<section>
<article id="var_dump">
<p>
<span class="header">var_dump</span>
<code>
<span class="util_class">util::</span><span class="func_name">var_dump</span>(mixed <span class="param">$var</span>[, bool <span class="param">$return</span> = FALSE])
</code>
</p>
<p>
Nicely prints out the contents of a passed variable. Booleans are properly displayed as 'true' or 'false',
null values are shown as 'NULL', variable types are displayed, and arrays and objects are displayed as a
collapsible tree powered by JavaScript.
</p>
<p><strong>Usage:</strong></p>
<pre class="usage-example">util::var_dump($var);</pre>
<img src="images/awesome_var_dump.jpg" style="border: 1px solid #ccc;" />
</article>
</section>
<h2 id="arrays">Array/Object Functions</h2>
<section>
<article id="array_first">
<p>
<span class="header">array_first</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_first</span>(array <span class="param">$array</span>)
</code>
</p>
<p>
Retrieve the first value from an array. Can be run on function callbacks, and it will not modify the pointer
of the source array unlike most other methods of doing this.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_first( ['a', 'b', 'c'] );<br />=&gt; Returns 'a'</pre>
</article>
<article id="array_first_key">
<p>
<span class="header">array_first_key</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_first_key</span>(array <span class="param">$array</span>)
</code>
</p>
<p>
Retrieve the first key from an array. Can be run on function callbacks, and it will not modify the pointer of
the source array unlike most other methods of doing this.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_first_key( $users );<br />=&gt; Returns 'brandon'</pre>
</article>
<article id="array_flatten">
<p>
<span class="header">array_flatten</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_flatten</span>(array <span class="param">$array</span>[, bool <span class="param">$preserve_keys</span> = TRUE])
</code>
</p>
<p>Flattens a multi-dimensional array into a one dimensional array</p>
<p><strong>Usage:</strong></p>
<pre>util::array_flatten( [ 'a', 'b', [ 'c', 'd', 'e', [ 'f', 'g', [ [ [ [ 'h', 'i', 'j' ] ] ] ] ] ] ] );
=&gt; Returns [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ]</pre>
</article>
<article id="array_get">
<p>
<span class="header">array_get</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_get</span>(<span class="param">$var</span>[, mixed <span class="param">$default</span> = NULL])
</code>
</p>
<p>Retrieve a value from an array, or return a given default if the index isn't set</p>
<p><strong>Usage:</strong></p>
<pre>util::array_get($_POST['action'], 'index');
=&gt; If $_POST['action'] is set, returns its value, otherwise returns 'index'
util::array_get($_POST['action']['do'], 'index');
=&gt; Returns the value of $_POST['action']['do'] or 'index'</pre>
</article>
<article id="array_last">
<p>
<span class="header">array_last</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_last</span>(array <span class="param">$array</span>)
</code>
</p>
<p>
Retrieve the last value from an array. Can be run on function callbacks, and it will not modify the pointer
of the source array unlike most other methods of doing this.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_last( [ 'a', 'b', 'c'] );
=&gt; Returns 'c'</pre>
</article>
<article id="array_last_key">
<p>
<span class="header">array_last_key</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_last_key</span>(array <span class="param">$array</span>)
</code>
</p>
<p>
Retrieve the last key from an array. Can be run on function callbacks, and it will not modify the pointer of
the source array unlike most other methods of doing this.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_last_key( $users );
=&gt; Returns 'zane'</pre>
</article>
<article id="array_map_deep">
<p>
<span class="header">array_map_deep</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_map_deep</span>(array <span class="param">$array</span>, callable <span class="param">$callback</span>[, bool <span class="param">$on_nonscalar</span> = FALSE])
</code>
</p>
<p>
Returns an array containing all the elements of $array after applying the callback function to each one recursively.
Particularly useful for avoiding errors when calling functions that only accept scalar values on an array that could
contain nested arrays, such as $_GET or $_POST.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_map_deep($_POST, 'htmlentities');
=&gt; Recursively escapes each scalar value in $_POST
util::array_map_deep($_POST, 'htmlentities', TRUE);
=&gt; Recursively escapes each value in $_POST regardless of its type</pre>
</article>
<article id="array_pluck">
<p>
<span class="header">array_pluck</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_pluck</span>(array <span class="param">$array</span>, string <span class="param">$field</span>[, bool <span class="param">$preserve_keys</span>, bool <span class="param">$remove_nomatches</span>])
</code>
</p>
<p>
Replaces each value in an array with the specified field of the array or object that used to be the value. Very
useful when you have an array of objects or arrays from a database, and you only want one specific field. For
example, you want an array of emails from an array of users.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_pluck([['val' => 1], ['val' => 2], ['val' => 3]], 'val');
=&gt; Returns [1, 2, 3]
util::array_pluck($users, 'email');
=&gt; Returns an array of email addresses for each user</pre>
</article>
<article id="array_search_deep">
<p>
<span class="header">array_search_deep</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_search_deep</span>(array <span class="param">$array</span>, mixed <span class="param">$search</span>[, string <span class="param">$field</span> = FALSE])
</code>
</p>
<p>
Allows you to search for a value in an array of arrays or an array of objects, and return the key of the value
that matches the search criteria. If $field is unspecified, the entire array/object is searched.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_search_deep($_POST, 'delete_post');
=&gt; Might return 'do' if $_POST['do']['action'] = 'delete_post'
util::array_search_deep($users, 'rogue_coder', 'username');
=&gt; Might return 5 if $users[5]->username = 'rogue_coder'</pre>
</article>
<article id="array_clean">
<p>
<span class="header">array_clean</span>
<code>
<span class="util_class">util::</span><span class="func_name">array_clean</span>(array <span class="param">$array</span>)
</code>
</p>
<p>
Remove all null/empty/false values from the given array.
</p>
<p><strong>Usage:</strong></p>
<pre>util::array_clean( array( 'a', 'b', '', null, false, 0) );<br />=&gt; Returns array('a', 'b');</pre>
</article>
</section>
<h2 id="urls">URL Functions</h2>
<section>
<article id="add_query_arg">
<p>
<span class="header">add_query_arg</span>
<code>
<span class="util_class">util::</span><span class="func_name">add_query_arg</span>()
</code>
</p>
<p>Adds one ore more query args to the query string of the current URL or a given URL</p>
<p><strong>Usage:</strong></p>
<pre>util::add_query_arg( 'user', '5', '/admin/users?action=edit' );
=&gt; Returns '/admin/users?action=edit&amp;user=5'
util::add_query_arg( [ 'user' => 5, 'action' => 'edit' ], '/admin/users' );
=&gt; Returns '/admin/users?user=5&amp;action=edit'</pre>
</article>
<article id="get_current_url">
<p>
<span class="header">get_current_url</span>
<code>
<span class="util_class">util::</span><span class="func_name">get_current_url</span>()
</code>
</p>
<p>Returns the current URL with hostname</p>
<p><strong>Usage:</strong></p>
<pre>util::get_current_url();
=&gt; Returns 'http://brandonwamboldt.ca/utilphp/'</pre>
</article>
<article id="is_https">
<p>
<span class="header">is_https</span>
<code>
<span class="util_class">util::</span><span class="func_name">is_https</span>()
</code>
</p>
<p>Returns true if the current page is being loaded over https, false if it isn't</p>
<p><strong>Usage:</strong></p>
<pre>util::is_https();
=&gt; Returns false</pre>
</article>
<article id="http_build_url">
<p>
<span class="header">http_build_url</span>
<code>
<span class="util_class">util::</span><span class="func_name">http_build_url</span>([mixed $url[, mixed $parts[, int $flags = HTTP_URL_REPLACE[, array &amo;$new_url]]]])
</code>
</p>
<p>
Pure PHP implementation/polyfill for <a href="http://php.net/http_build_url">http_build_url</a>
which requires pecl_http to be installed.
</p>
<p><strong>Usage:</strong></p>
<pre>echo util::http_build_url("http://user@www.example.com/pub/index.php?a=b#files",
array(
"scheme" => "ftp",
"host" => "ftp.example.com",
"path" => "files/current/",
"query" => "a=c"
),
HTTP_URL_STRIP_AUTH | HTTP_URL_JOIN_PATH | HTTP_URL_JOIN_QUERY | HTTP_URL_STRIP_FRAGMENT
);</pre>
<p>The above example will output:</p>
<pre>ftp://ftp.example.com/pub/files/current/?a=c</pre>
</article>
<article id="is_https">
<p>
<span class="header">is_https</span>
<code>
<span class="util_class">util::</span><span class="func_name">is_https</span>()
</code>
</p>
<p>Returns true if the current page is being loaded over https, false if it isn't</p>
<p><strong>Usage:</strong></p>
<pre>util::is_https();
=&gt; Returns false</pre>
</article>
<article id="remove_query_arg">
<p>
<span class="header">remove_query_arg</span>
<code>
<span class="util_class">util::</span><span class="func_name">remove_query_arg</span>( array|string <span class="param">$query_args</span>[, string <span class="param">$url</span>])
</code>
</p>
<p>Removes one ore more query args from the query string of the current URL or a given URL</p>
<p><strong>Usage:</strong></p>
<pre>util::remove_query_arg( 'action', '/admin/users?action=edit&amp;user=5' );
=&gt; Returns '/admin/users?user=5'
util::remove_query_arg( [ 'user', 'action'], '/admin/users?action=edit&amp;user=5' );
=&gt; Returns '/admin/users'</pre>
</article>
<article id="slugify">
<p>
<span class="header">slugify</span>
<code>
<span class="util_class">util::</span><span class="func_name">slugify</span>(string <span class="param">$string</span>[, string <span class="param">$separator</span> = "-", bool <span class="param">$css_mode</span> = FALSE])
</code>
</p>
<p>
Generate a string safe for use in URLs from any given string. Converts any accent characters
to their equivalent normal characters and converts any other non-alphanumeric characters to
dashes, then converts any sequence of two or more dashes to a single dash. This function
generates slugs safe for use as URLs, and if you pass TRUE as the second parameter, it will
create strings safe for use as CSS classes or IDs.
</p>
<p><strong>Usage:</strong></p>
<pre>util::slugify('This is a random --string with an Ãccent');
=&gt; Returns 'this-is-a-random-string-with-an-accent'
util::slugify('Another String', '.');
=&gt; Returns 'another.string'</pre>
</article>
</section>
<h2 id="strings">String Functions</h2>
<section>
<article id="htmlentities">
<p>
<span class="header">htmlentities</span>
<code>
<span class="util_class">util::</span><span class="func_name">htmlentities</span>(string <span class="param">$string</span>[, bool <span class="param">$preserve_encoded_entities</span> = FALSE])
</code>
</p>
<p>
Executes htmlentities with ENT_QUOTES set by default. However, if you pass TRUE as
the second parameter, it will not re-encode entities that are already encoded.
</p>
<p><strong>Usage:</strong></p>
<pre>util::htmlentities('this string &lt; this string', TRUE);
=&gt; Returns 'this string &lt; this string'</pre>
</article>
<article id="htmlspecialchars">
<p>
<span class="header">htmlspecialchars</span>
<code>
<span class="util_class">util::</span><span class="func_name">htmlspecialchars</span>(string <span class="param">$string</span>[, bool <span class="param">$preserve_encoded_entities</span> = FALSE])
</code>
</p>
<p>
Executes htmlspecialchars with ENT_QUOTES set by default. However, if you pass TRUE as
the second parameter, it will not re-encode entities that are already encoded.
</p>
<p><strong>Usage:</strong></p>
<pre>util::htmlspecialchars('this string &lt; this string', TRUE);
=&gt; Returns 'this string &lt; this string'</pre>
</article>
<article id="linkify">
<p>
<span class="header">linkify</span>
<code>
<span class="util_class">util::</span><span class="func_name">linkify</span>(string <span class="param">$text</span>)
</code>
</p>
<p>Find's any URLs in the specified text and wraps them with HTML anchor tags</p>
<p><strong>Usage:</strong></p>
<pre>util::linkify('this string has a link to www.google.com');
=&gt; Returns 'this string has a link to &lt;a href="http://wwww.google.com/"&gt;www.google.com&lt;/a&gt;'</pre>
</article>
<article id="match_string">
<p>
<span class="header">match_string</span>
<code>
<span class="util_class">util::</span><span class="func_name">match_string</span>(string <span class="param">$pattern</span>, string <span class="param">$string</span>[, bool <span class="param">$caseSensitive</span> = true])
</code>
</p>
<p>
Check if a string matches a given pattern. You can use '*' as a wildcard character.
</p>
<p><strong>Usage:</strong></p>
<pre>util::match_string("test/*", "test/my/test");
=&gt; Returns true
util::match_string("test/", "test/my/test");
=&gt; Returns false</pre>
</article>
<article id="random_string">
<p>
<span class="header">random_string</span>
<code>
<span class="util_class">util::</span><span class="func_name">random_string</span>(int <span class="param">$length</span>[, bool <span class="param">$human_friendly</span> = TRUE, bool <span class="param">$include_symbols</span> = FALSE, bool <span class="param">$no_duplicate_chars</span> = FALSE])
</code>
</p>
<p>
Generates a random string of the specified length. Human friendly mode
will exclude characters that can be confused with other characters, such
as 0 (zero) and O (capital o), 1 (one) and l (lowercase L).
</p>
<p><strong>Usage:</strong></p>
<pre>util::random_string(8);
=&gt; Returns 'a6BiF4UW'</pre>
</article>
<article id="number_to_word">
<p>
<span class="header">number_to_word</span>
<code>
<span class="util_class">util::</span><span class="func_name">number_to_word</span>(int|float <span class="param">$number</span>)
</code>
</p>
<p>Converts a number into its text equivalent. For example, 56 becomes fifty-six.</p>
<pre>util::number_to_word(512.5);
=&gt; Returns 'five hundred and twelve point five'</pre>
</article>
<article id="ordinal">
<p>
<span class="header">ordinal</span>
<code>
<span class="util_class">util::</span><span class="func_name">ordinal</span>(int <span class="param">$number</span>)
</code>
</p>
<p>Returns the ordinal version of a number (appends th, st, nd, rd)</p>
<p><strong>Usage:</strong></p>
<pre>util::ordinal(22);
=&gt; Returns '22nd'</pre>
</article>
<article id="remove_accents">
<p>
<span class="header">remove_accents</span>
<code>
<span class="util_class">util::</span><span class="func_name">remove_accents</span>(string <span class="param">$string</span>)
</code>
</p>
<p>Converts all accent characters to their ASCII equivalents</p>
<p><strong>Usage:</strong></p>
<pre>util::remove_accents('&#192;ccent');
=&gt; Returns 'Accent'</pre>
</article>
<article id="secure_random_string">
<p>
<span class="header">secure_random_string</span>
<code>
<span class="util_class">util::</span><span class="func_name">secure_random_string</span>(int <span class="param">$length</span>)
</code>
</p>
<p>Generate a random string of characters. Will attempt to use a secure source (openssl).</p>
<p><strong>Usage:</strong></p>
<pre>util::secure_random_string(16);
=&gt; Returns '5bB1RJH0cQhNjviT'</pre>
</article>
<article id="seems_utf8">
<p>
<span class="header">seems_utf8</span>
<code>
<span class="util_class">util::</span><span class="func_name">seems_utf8</span>(string <span class="param">$string</span>)
</code>
</p>
<p>Checks to see if a given string is UTF-8 encoded/safe</p>
<p><strong>Usage:</strong></p>
<pre>util::seems_utf8('This is some random string user input');
=&gt; Returns true</pre>
</article>
<article id="safe_truncate">
<p>
<span class="header">safe_truncate</span>
<code>
<span class="util_class">util::</span><span class="func_name">safe_truncate</span>(string <span class="param">$string</span>, int <span class="param">$length</span>[, string <span class="param">$append</span> = '...'])
</code>
</p>
<p>Truncate a string to a specified length without cutting a word off</p>
<p><strong>Usage:</strong></p>
<pre>util::safe_truncate('The quick brown fox jumps over the lazy dog', 24);
=&gt; Returns 'The quick brown fox...'</pre>
</article>
<article id="size_format">
<p>
<span class="header">size_format</span>
<code>
<span class="util_class">util::</span><span class="func_name">size_format</span>(int <span class="param">$bytes</span>[, int <span class="param">$decimals</span> = 0])
</code>
</p>
<p>Formats an integer as a human friendly size string, such as 4 KiB.</p>
<p><strong>Usage:</strong></p>
<pre>util::size_format( 25151251, 2 );
=&gt; Returns '23.99 MiB'</pre>
</article>
<article id="str_to_bool">
<p>
<span class="header">str_to_bool</span>
<code>
<span class="util_class">util::</span><span class="func_name">str_to_bool</span>(string <span class="param">$string</span>)
</code>
</p>
<p>Converts a string to boolean, looking for yes/no words like 'yes', 'no', 'true', 'false', 'y', 'n', etc</p>
<p><strong>Usage:</strong></p>
<pre>util::str_to_bool('yes');
=&gt; Returns true</pre>
</article>
<article id="zero_pad">
<p>
<span class="header">zero_pad</span>
<code>
<span class="util_class">util::</span><span class="func_name">zero_pad</span>(int <span class="param">$number</span>, int <span class="param">$length</span>)
</code>
</p>
<p>Pads a given number with zeroes on the left</p>
<p><strong>Usage:</strong></p>
<pre>util::zero_pad(341, 8);
=&gt; Returns '00000341'</pre>
</article>
<article id="strip_space">
<p>
<span class="header">strip_space</span>
<code>
<span class="util_class">util::</span><span class="func_name">strip_space</span>(string <span class="param">$string</span>)
</code>
</p>
<p>Strip all withspace from the given string</p>
<p><strong>Usage:</strong></p>
<pre>util::strip_space(' The quick brown fox jumps over the lazy dog ');
=&gt; Returns 'Thequickbrownfoxjumpsoverthelazydog'</pre>
</article>
<article id="sanitize_string">
<p>
<span class="header">sanitize_string</span>
<code>
<span class="util_class">util::</span><span class="func_name">sanitize_string</span>(string <span class="param">$string</span>)
</code>
</p>
<p>
Sanitize a string by performing the following operation :
<ul>
<li>Remove accents</li>
<li>Lower the string</li>
<li>Remove punctuation characters</li>
<li>Strip whitespaces</li>
</ul>
</p>
<p><strong>Usage:</strong></p>
<pre>util::sanitize_string(' Benoit! à New-York? jai perçu 1 % : Quas-tu "gagné" chez M. V. Noël? Dix francs.');
=&gt; Returns 'benoitanewyorkjaipercu1quastugagnechezmvnoeldixfrancs'</pre>
</article>
</section>
<h2 id="files">Files</h2>
<section>
<article id="full_permissions">
<p>
<span class="header">full_permissions</span>
<code>
<span class="util_class">util::</span><span class="func_name">full_permissions</span>(string <span class="param">$file</span>)
</code>
</p>
<p>Returns the file permissions as a nice string, like -rw-r--r--</p>
<p><strong>Usage:</strong></p>
<pre>util::full_permissions('/etc/passwd');
=&gt; Returns '-rw-r--r--'</pre>
</article>
<article id="rmdir">
<p>
<span class="header">rmdir</span>
<code>
<span class="util_class">util::</span><span class="func_name">rmdir</span>(string <span class="param">$dir</span>[, bool <span class="param">$traverseSymlinks</span> = false])
</code>
</p>
<p>Recursively deletes a directories (including all contents).</p>
<p><strong>Usage:</strong></p>
<pre>util::rmdir('/tmp/working/dir');
=&gt; Returns true</pre>
</article>
</section>
<h2 id="serialization">Serialization</h2>
<section>
<article id="is_serialized">
<p>
<span class="header">is_serialized</span>
<code>
<span class="util_class">util::</span><span class="func_name">is_serialized</span>(mixed <span class="param">$data</span>)
</code>
</p>
<p>Checks to see if a given variable is a seralized data structure</p>
<p><strong>Usage:</strong></p>
<pre>util::is_serialized( 'a:0:{}' );
=&gt; Returns true</pre>
</article>
<article id="maybe_serialize">
<p>
<span class="header">maybe_serialize</span>
<code>
<span class="util_class">util::</span><span class="func_name">maybe_serialize</span>(mixed <span class="param">$data</span>)
</code>
</p>
<p>Serialize data, if needed to store in plaintext (Arrays or objects)</p>
<p><strong>Usage:</strong></p>
<pre>util::maybe_serialize( 5 );
=&gt; Returns 5
util::maybe_serialize( array() );
=&gt; Returns 'a:0:{}'</pre>
</article>
<article id="maybe_unserialize">
<p>
<span class="header">maybe_unserialize</span>
<code>
<span class="util_class">util::</span><span class="func_name">maybe_unserialize</span>(mixed <span class="param">$data</span>)
</code>
</p>
<p>Unserialize data, if it's a serialized string</p>
<p><strong>Usage:</strong></p>
<pre>util::maybe_unserialize(5);
=&gt; Returns 5
util::maybe_unserialize("a:0:{}");
=&gt; Returns array()</pre>
</article>
<article id="fix_broken_serialization">
<p>
<span class="header">fix_broken_serialization</span>
<code>
<span class="util_class">util::</span><span class="func_name">fix_broken_serialization</span>(mixed <span class="param">$data</span>)
</code>
</p>
<p>
Attempt to fix a broken serialization string (e.g. where string offsets are incorrect). Can fix
errors that frequently occur with mismatched character sets or higher-than-ASCII characters.
</p>
<p><strong>Usage:</strong></p>
<pre>util::fix_broken_serialization('a:1:{s:4:"test";s:4:"abc";}');
=&gt; Returns 'a:1:{s:4:"test";s:3:"abc";}'</pre>
</article>
</section>
<h2 id="other">Other</h2>
<section>
<article id="force_download">
<p>
<span class="header">force_download</span>
<code>
<span class="util_class">util::</span><span class="func_name">force_download</span>(string <span class="param">$filename</span>, string <span class="param">$content</span> = FALSE)
</code>
</p>
<p>
Transmit headers that force a browser to display the download file dialog. Cross
browser compatible. Only fires if headers have not already been sent.
</p>
<p><strong>Usage:</strong></p>
<pre>util::force_download( 'export.csv', file_get_contents( 'securefile.csv' ) );
=&gt; The user will be prompted to download the file</pre>
</article>
<article id="get_client_ip">
<p>
<span class="header">get_client_ip</span>
<code>
<span class="util_class">util::</span><span class="func_name">get_client_ip</span>(bool <span class="param">$trust_proxy_headers</span> = FALSE)
</code>
</p>
<p>
Returns the IP address of the client. Only enable $trust_proxy_headers if your server is behind a proxy
that sets the HTTP_CLIENT_IP and HTTP_X_FORWARDED_FOR headers.
</p>
<p><strong>Usage:</strong></p>
<pre>util::get_client_ip();
=&gt; Returns '12.123.12.100'</pre>
</article>
<article id="get_gravatar">
<p>
<span class="header">get_gravatar</span>
<code>
<span class="util_class">util::</span><span class="func_name">get_gravatar</span>(string <span class="param">$email</span>, int <span class="param">$size</span> = 32)
</code>
</p>
<p>Return the URL to a user's gravatar</p>
<p><strong>Usage:</strong></p>
<pre>util::get_gravatar('brandon.wamboldt@gmail.com');
=&gt; Returns 'http://www.gravatar.com/avatar/46679faeb6780ecb1ea57527fdc66eb3?s=32'</pre>
</article>
<article id="human_time_diff">
<p>
<span class="header">human_time_diff</span>
<code>
<span class="util_class">util::</span><span class="func_name">human_time_diff</span>(int <span class="param">$from</span>, int <span class="param">$to</span> = '', int <span class="param">$as_text</span> = FALSE, string <span class="param">$suffix</span> = ' ago')
</code>
</p>
<p>Converts a unix timestamp to a relative time string, such as "3 days ago" or "2 weeks ago"</p>
<p><strong>Usage:</strong></p>
<pre>util::human_time_diff(time() - 7400);
=&gt; Returns '2 hours ago'
util::human_time_diff(time() - 7400, '', TRUE);
=&gt; Returns 'two hours ago'</pre>
</article>
<article id="nocache_headers">
<p>
<span class="header">nocache_headers</span>
<code>
<span class="util_class">util::</span><span class="func_name">nocache_headers</span>(mixed <span class="param">$data</span>)
</code>
</p>
<p>Sets the headers to prevent caching for the different browsers</p>
<p>
Different browsers support different nocache headers, so several headers must be sent
so that all of them get the point that no caching should occur
</p>
<p><strong>Usage:</strong></p>
<pre>util::nocache_headers();</pre>
</article>
<article id="utf8_headers">
<p>
<span class="header">utf8_headers</span>
<code>
<span class="util_class">util::</span><span class="func_name">utf8_headers</span>(mixed <span class="param">$content_type</span> = 'text/html')
</code>
</p>
<p>Transmit UTF-8 content headers if the headers haven't already been sent</p>
<p><strong>Usage:</strong></p>
<pre>util::utf8_headers();</pre>
</article>
<article id="validate_email">
<p>
<span class="header">validate_email</span>
<code>
<span class="util_class">util::</span><span class="func_name">validate_email</span>(string <span class="param">$possible_email</span>)
</code>
</p>
<p>Validate an email address</p>
<p><strong>Usage:</strong></p>
<pre>util::validate_email( 'brandon.wamboldt@gmail.com' );
=&gt; Returns true
util::validate_email( 'not an email' );
=&gt; Returns false</pre>
</article>
</section>
<h2 id="constants">Constants</h2>
<section>
<article id="SECONDS_IN_A_MINUTE">
<p>
<span class="header">SECONDS_IN_A_MINUTE</span>
<code>
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_MINUTE</span>
</code>
</p>
<p>The number of seconds in a minute, useful for making code more verbose</p>
</article>
<article id="SECONDS_IN_AN_HOUR">
<p>
<span class="header">SECONDS_IN_AN_HOUR</span>
<code>
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_AN_HOUR</span>
</code>
</p>
<p>The number of seconds in an hour, useful for making code more verbose</p>
</article>
<article id="SECONDS_IN_A_DAY">
<p>
<span class="header">SECONDS_IN_A_DAY</span>
<code>
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_DAY</span>
</code>
</p>
<p>The number of seconds in a day, useful for making code more verbose</p>
</article>
<article id="SECONDS_IN_A_WEEK">
<p>
<span class="header">SECONDS_IN_A_WEEK</span>
<code>
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_WEEK</span>
</code>
</p>
<p>The number of seconds in a week (7 days), useful for making code more verbose</p>
</article>
<article id="SECONDS_IN_A_MONTH">
<p>
<span class="header">SECONDS_IN_A_MONTH</span>
<code>
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_MONTH</span>
</code>
</p>
<p>The number of seconds in a month (30 days), useful for making code more verbose</p>
</article>
<article id="SECONDS_IN_A_YEAR">
<p>
<span class="header">SECONDS_IN_A_YEAR</span>
<code>
<span class="util_class">util::</span><span class="func_name">SECONDS_IN_A_YEAR</span>
</code>
</p>
<p>The number of seconds in a year (365 days), useful for making code more verbose</p>
</article>
</section>
<h2 id="changelog">Change Log</h2>
<!--
Find: `(.*?)`
Replace: <code>\1<\/code>
Find: \[(.*?)\]\((.*?)\)
Replace: <a href="\2">\1</a>
-->
<p class="desc-text">
<span class="header">1.1.0</span><br>
This release introduces a deprecation notice for <code>slugify()</code>, please update your code.<br><br>
- Added a cryptographically secure random string function <code>secure_random_string</code>. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/53">Pull Request #53</a><br>
- Added <code>limit_characters</code> and <code>limit_words</code> functions. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/55">Pull Request #55</a><br>
- Added <code>rmdir</code> method to recursively delete a directory. Thanks to @ARACOOOL via <a href="https://github.com/brandonwamboldt/utilphp/pull/56">Pull Request #56</a><br>
- Added <code>set_executable</code>, <code>set_readable</code>, <code>set_writable</code>, <code>directory_size</code>, <code>directory_contents</code> and <code>get_user_dir</code> functions. Thanks to @sergserg via <a href="https://github.com/brandonwamboldt/utilphp/pull/70">Pull Request #70</a><br>
- Changed parameter ordering for <code>slugify</code>, <code>$css_mode</code> is now the third argument. For backwards compatibility, the old order will still work but it will generate an <code>E_USER_DEPRECATED</code> warning. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/71">Pull Request #71</a><br>
- Added <code>match_string</code> method. Thanks to @abhimanyusharma003 via <a href="https://github.com/brandonwamboldt/utilphp/pull/72">Pull Request #72</a><br>
- Renamed internal methods (protected ones) for PSR-2 compliance<br>
- General performance improvements, code quality improvements, and increased unit test coverage (special thanks to @hopeseekr for getting us near 100% coverage)<br>
</p>
<p class="desc-text">
<span class="header">1.0.7</span><br>
- Added <code>fix_broken_serialization</code> to fix broken serialized strings (Thanks to @hopeseekr via <a href="https://github.com/brandonwamboldt/utilphp/pull/48">Pull Request #48</a>)<br>
- Fixed <code>get_current_url</code> appending port 80 or 443 when not needed (Thanks to @scottchiefbaker via <a href="https://github.com/brandonwamboldt/utilphp/pull/49">Pull Request #49</a>)<br>
- <code>var_dump</code> can now handle recursive data structures without crashing<br>
- <code>var_dump</code> code was minified and cleaned up<br>
- <code>array_flatten</code> was optimized (thanks to @hopeseekr via <a href="https://github.com/brandonwamboldt/utilphp/pull/47">Pull Request #47</a>)<br>
- <code>remove_accents</code> was completely rewritten and is now ~4x faster<br>
</p>
<p class="desc-text">
<span class="header">1.0.6</span><br>
- Added <code>start_with</code> function<br>
- Added <code>ends_with</code> function<br>
- Added <code>str_contains</code> function<br>
- Added <code>str_icontains</code> function<br>
- Added <code>get_file_ext</code> function<br>
- Fixing permissions on the files &amp; directories<br>
- Fixing a bug with the include path of util.php<br>
</p>
<p class="desc-text">
<span class="header">1.0.5</span><br>
- <a href="https://github.com/brandonwamboldt/utilphp/issues/29">Issue #29</a> Fixed error in <code>var_dump</code> if mbstring extension wasn't present<br>
- Adding Composer support<br>
- Updating license from GPL to MIT<br>
- Adding Changelog to project<br>
- Bumping minimum version to PHP 5.3.3<br>
</p>
<p class="desc-text">
<span class="header">1.0.4</span><br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/22">Issue #22</a> Removed all superglobal *_get functions, you can use the modified <code>array_get</code> now<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/22">Issue #22</a> Modifed the behaviour of <code>array_get</code>, see documentation<br />
- <a href="https://github.com/brandonwamboldt/utilphp/pull/21">Pull Request #21</a> Added multibyte support to html* functions<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/9">Issue #9</a> Removed the <code>str_to_utf8</code> function<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/3">Issue #3</a> Removed the absint function<br />
- Removed declare() from util.php to avoid errors<br />
- Updated PHPUnit tests to use PHPUnit 3.6
</p>
<p class="desc-text">
<span class="header">1.0.3</span><br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/16">Issue #16</a> Improved performance of <code>slugify</code><br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/14">Issue #14</a> Modified the regex for <code>seems_utf8</code> to be more accurate<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/13">Issue #13</a> Changed <code>validate_email</code> to be wrapper for <code>filter_var</code><br />
- Added 'ok' to the list of yes words for <code>str_to_bool</code><br />
- <code>str_to_bool</code> matches no followed by any number of 'o's
</p>
<p class="desc-text">
<span class="header">1.0.2</span><br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/12">Issue #12</a> <code>get_current_url</code> now includes the port and user/password if required<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/11">Issue #11</a> <code>human_time_diff</code> now uses the DateTime functions<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/10">Issue #10</a> <code>is_https</code> no longer checks the port as well
</p>
<p class="desc-text">
<span class="header">1.0.1</span><br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/7">Issue #7</a> Added the <code style="color:#DA72F3">$trust_proxy_headers</code> parameter to <code>get_client_ip</code><br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/6">Issue #6</a> Removed <code>is_isset</code> as the function did not work as intended<br />
- <a href="https://github.com/brandonwamboldt/utilphp/issues/6">Issue #6</a> Removed <code>is_empty</code> as it is redundant, use ! with function calls instead<br />
- Fixed a bug with <code>get_gravatar</code>
</p>
<p class="desc-text">
<span class="header">1.0.0</span><br />
Initial release of util.php.
</p>
</div>
</div>
</body>
</html>
+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
>
<testsuites>
<testsuite name="Tests suite">
<directory>./tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./src</directory>
</whitelist>
</filter>
<logging>
<log type="coverage-clover" target="build/logs/clover.xml"/>
</logging>
</phpunit>
File diff suppressed because one or more lines are too long
+39
View File
@@ -0,0 +1,39 @@
# UtilityPHP Unit Tests #
### Introduction
This is the testing documentation for util.php. The unit tests require PHPUnit,
and can be run in your web browser.
### Requirements
PHP Unit >= 3.5.6
#### Installation of PHPUnit
# Download the PHPUnit phar.
wget https://phar.phpunit.de/phpunit.phar
# You can just run it locally. (Preferred for Windows)
php phpunit.phar --version
# Or install it system-wide.
mv phpunit.phar phpunit
chmod +x phpunit
sudo mv phpunit /usr/local/bin
phpunit --version
## Test Suites:
util.php includes a phpunit config file, so just run `phpunit` from the working
directory to run the test suite.
```
phpunit
```
If you want code coverage reports, use the following:
```
phpunit --coverage-html ./report
```
+1183
View File
@@ -0,0 +1,1183 @@
<?php
date_default_timezone_set('UTC');
require_once dirname(__FILE__) . '/../util.php';
class VarDumpExperiment
{
public $public = 1;
protected $protected = 2;
private $private = 3;
public $data;
public function __construct()
{
$this->data = (object)array('a', 'b', 'c');
}
}
/**
* PHPUnit test case for the util.php library
*
* @author Brandon Wamboldt <brandon.wamboldt@gmail.com>
* @since 1.0.000
*/
class UtilityPHPTest extends PHPUnit_Framework_TestCase
{
/**
* Allows for the testing of private and protected methods.
*
* @param $name
* @return \ReflectionMethod
*/
protected static function getMethod($name)
{
$class = new \ReflectionClass('util');
$method = $class->getMethod($name);
$method->setAccessible(true);
return $method;
}
public function test_array_get()
{
$_GET = array();
$_GET['abc'] = 'def';
$_GET['nested'] = array( 'key1' => 'val1', 'key2' => 'val2', 'key3' => 'val3' );
// Looks for $array['abc']
$this->assertEquals( 'def', util::array_get( $_GET['abc'] ) );
// Looks for $array['nested']['key2']
$this->assertEquals( 'val2', util::array_get( $_GET['nested']['key2'] ) );
// Looks for $array['doesnotexist']
$this->assertEquals( 'defaultval', util::array_get( $_GET['doesnotexist'], 'defaultval' ) );
}
public function test_slugify()
{
$this->assertEquals( 'a-simple-title', util::slugify( 'A simple title' ) );
$this->assertEquals( 'this-post-it-has-a-dash', util::slugify( 'This post -- it has a dash' ) );
$this->assertEquals( '123-1251251', util::slugify( '123----1251251' ) );
$this->assertEquals( 'one23-1251251', util::slugify( '123----1251251', '-', true ) );
$this->assertEquals( 'a-simple-title', util::slugify( 'A simple title', '-' ) );
$this->assertEquals( 'this-post-it-has-a-dash', util::slugify( 'This post -- it has a dash', '-' ) );
$this->assertEquals( '123-1251251', util::slugify( '123----1251251', '-' ) );
$this->assertEquals( 'one23-1251251', util::slugify( '123----1251251', '-', true ) );
$this->assertEquals( 'a_simple_title', util::slugify( 'A simple title', '_' ) );
$this->assertEquals( 'this_post_it_has_a_dash', util::slugify( 'This post -- it has a dash', '_' ) );
$this->assertEquals( '123_1251251', util::slugify( '123----1251251', '_' ) );
$this->assertEquals( 'one23_1251251', util::slugify( '123----1251251', '_', true ) );
// Blank seperator test
$this->assertEquals( 'asimpletitle', util::slugify( 'A simple title', '' ) );
$this->assertEquals( 'thispostithasadash', util::slugify( 'This post -- it has a dash', '' ) );
$this->assertEquals( '1231251251', util::slugify( '123----1251251', '' ) );
$this->assertEquals( 'one231251251', util::slugify( '123----1251251', '', true ) );
// Test old parameter ordering for backwards compatability
error_reporting(E_ALL ^ E_USER_DEPRECATED);
$this->assertEquals( 'one23-1251251', util::slugify( '123----1251251', true ) );
$this->assertEquals( '123-1251251', util::slugify( '123----1251251', false ) );
}
public function test_seems_utf8()
{
// Test a valid UTF-8 sequence: "ÜTF-8 Fµñ".
$validUTF8 = "\xC3\x9CTF-8 F\xC2\xB5\xC3\xB1";
$this->assertTrue( util::seems_utf8( $validUTF8 ) );
$this->assertTrue( util::seems_utf8( "\xEF\xBF\xBD this has \xEF\xBF\xBD\xEF\xBF\xBD some invalid utf8 \xEF\xBF\xBD" ) );
// Test invalid UTF-8 sequences
$invalidUTF8 = "\xc3 this has \xe6\x9d some invalid utf8 \xe6";
$this->assertFalse( util::seems_utf8( $invalidUTF8 ) );
// And test some plain ASCII
$this->assertTrue( util::seems_utf8( 'The quick brown fox jumps over the lazy dog' ) );
// Test an invalid non-UTF-8 string.
if (function_exists('mb_convert_encoding')) {
mb_internal_encoding('UTF-8');
// Converts the 'ç' UTF-8 character to UCS-2LE
$utf8Char = pack('n', 50087);
$ucsChar = mb_convert_encoding($utf8Char, 'UCS-2LE', 'UTF-8');
// Ensure that PHP's internal encoding system isn't malconfigured.
$this->assertEquals( $utf8Char, 'ç', 'This PHP system\'s internal character set is not properly set as UTF-8.' );
$this->assertEquals( $utf8Char, pack('n', 50087), 'Something is wrong with your ICU unicode library.' );
// Test for not UTF-8.
$this->assertFalse( util::seems_utf8( $ucsChar) );
// Test the worker method.
$method = self::getMethod('seemsUtf8Regex');
$this->assertFalse($method->invoke(null, $invalidUTF8), 'util::seemsUtf8Regex did not properly detect invalid UTF-8.');
$this->assertTrue($method->invoke(null, $validUTF8), 'util::seemsUtf8Regex did not properly detect valid UTF-8.');
}
}
public function test_size_format()
{
$size = util::size_format( 512, 0 );
$this->assertEquals( '512 B', $size );
$size = util::size_format( 2048, 1 );
$this->assertEquals( '2.0 KiB', $size );
$size = util::size_format( 25151251, 2 );
$this->assertEquals( '23.99 MiB', $size );
$size = util::size_format( 19971597926, 2 );
$this->assertEquals( '18.60 GiB', $size );
$size = util::size_format( 2748779069440, 1 );
$this->assertEquals( '2.5 TiB', $size );
$size = util::size_format( 2.81475e15, 1 );
$this->assertEquals( '2.5 PiB', $size );
$size = util::size_format( 2.81475e19, 1 );
$this->assertEquals( '25000.0 PiB', $size );
}
public function test_maybe_serialize()
{
$obj = new stdClass();
$obj->prop1 = 'Hello';
$obj->prop2 = 'World';
$this->assertEquals( 'This is a string', util::maybe_serialize( 'This is a string' ) );
$this->assertEquals( 5.81, util::maybe_serialize( 5.81 ) );
$this->assertEquals( 'a:0:{}', util::maybe_serialize( array() ) );
$this->assertEquals( 'O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}', util::maybe_serialize( $obj ) );
$this->assertEquals( 'a:4:{i:0;s:4:"test";i:1;s:4:"blah";s:5:"hello";s:5:"world";s:5:"array";O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}}', util::maybe_serialize( array( 'test', 'blah', 'hello' => 'world', 'array' => $obj ) ) );
}
public function test_maybe_unserialize()
{
$obj = new stdClass();
$obj->prop1 = 'Hello';
$obj->prop2 = 'World';
$this->assertNull(util::maybe_unserialize(serialize(null)));
$this->assertFalse(util::maybe_unserialize(serialize(false)));
$this->assertEquals( 'This is a string', util::maybe_unserialize( 'This is a string' ) );
$this->assertEquals( 5.81, util::maybe_unserialize( 5.81 ) );
$this->assertEquals( array(), util::maybe_unserialize( 'a:0:{}' ) );
$this->assertEquals( $obj, util::maybe_unserialize( 'O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}' ) );
$this->assertEquals( array( 'test', 'blah', 'hello' => 'world', 'array' => $obj ), util::maybe_unserialize( 'a:4:{i:0;s:4:"test";i:1;s:4:"blah";s:5:"hello";s:5:"world";s:5:"array";O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}}' ) );
// Test a broken serialization.
$expectedData = array(
'Normal',
'High-value Char: '.chr(231).'a-va?', // High-value Char: ça-va? [in ISO-8859-1]
);
$brokenSerialization = 'a:2:{i:0;s:6:"Normal";i:1;s:23:"High-value Char: ▒a-va?";}';
$unserializedData = util::maybe_unserialize($brokenSerialization);
$this->assertEquals($expectedData[0], $unserializedData[0], 'Did not properly fix the broken serialized data.');
$this->assertEquals(substr($expectedData[1], 0, 10), substr($unserializedData[1], 0, 10), 'Did not properly fix the broken serialized data.');
// Test unfixable serialization.
$unfixableSerialization = 'a:2:{i:0;s:6:"Normal";}';
$this->assertEquals($unfixableSerialization, util::maybe_unserialize($unfixableSerialization), 'Somehow the [previously?] impossible happened and utilphp thinks it has unserialized an unfixable serialization.');
}
public function test_is_serialized()
{
$this->assertFalse( util::is_serialized(1) );
$this->assertFalse( util::is_serialized(null) );
$this->assertFalse( util::is_serialized( 's:4:"test;' ) );
$this->assertFalse( util::is_serialized( 'a:0:{}!' ) );
$this->assertFalse( util::is_serialized( 'a:0' ) );
$this->assertFalse( util::is_serialized( 'This is a string' ) );
$this->assertFalse( util::is_serialized( 'a string' ) );
$this->assertFalse( util::is_serialized( 'z:0;' ) );
$this->assertTrue( util::is_serialized( 'N;' ) );
$this->assertTrue( util::is_serialized( 'b:1;' ) );
$this->assertTrue( util::is_serialized( 'a:0:{}' ) );
$this->assertTrue( util::is_serialized( 'O:8:"stdClass":2:{s:5:"prop1";s:5:"Hello";s:5:"prop2";s:5:"World";}' ) );
}
public function test_fix_broken_serialization()
{
$expectedData = array(
'Normal',
'High-value Char: '.chr(231).'a-va?', // High-value Char: ça-va? [in ISO-8859-1]
);
$brokenSerialization = 'a:2:{i:0;s:6:"Normal";i:1;s:23:"High-value Char: ▒a-va?";}';
// Temporarily override error handling to ensure that this is, in fact, [still] a broken serialization.
{
$expectedError = array(
'errno' => 8,
'errstr' => 'unserialize(): Error at offset 55 of 60 bytes'
);
$reportedError = array();
set_error_handler(function ($errno, $errstr, $errfile, $errline, $errcontext) use (&$reportedError) {
$reportedError = compact('errno', 'errstr');
});
unserialize($brokenSerialization);
$this->assertEquals($expectedError['errno'], $reportedError['errno']);
// Because HHVM's unserialize() error message does not contain enough info to properly test.
if (!defined('HHVM_VERSION')) {
$this->assertEquals($expectedError['errstr'], $reportedError['errstr']);
}
restore_error_handler();
}
$fixedSerialization = util::fix_broken_serialization($brokenSerialization);
$unserializedData = unserialize($fixedSerialization);
$this->assertEquals($expectedData[0], $unserializedData[0], 'Did not properly fix the broken serialized data.');
$this->assertEquals(substr($expectedData[1], 0, 10), substr($unserializedData[1], 0, 10), 'Did not properly fix the broken serialized data.');
}
public function test_is_https()
{
$_SERVER['HTTPS'] = null;
$this->assertFalse( util::is_https() );
$_SERVER['HTTPS'] = 'on';
$this->assertTrue( util::is_https() );
}
public function test_add_query_arg()
{
// Regular tests
$this->assertEquals( '/app/admin/users?user=5', util::add_query_arg( 'user', 5, '/app/admin/users' ) );
$this->assertEquals( '/app/admin/users?user=5', util::add_query_arg( array( 'user' => 5 ), '/app/admin/users' ) );
$this->assertEquals( '/app/admin/users?user=5', util::add_query_arg( array( 'user' => 5 ), null, '/app/admin/users' ) );
$this->assertEquals( '/app/admin/users?action=edit&user=5', util::add_query_arg( 'user', 5, '/app/admin/users?action=edit' ) );
$this->assertEquals( '/app/admin/users?action=edit&user=5', util::add_query_arg( array( 'user' => 5 ), '/app/admin/users?action=edit' ) );
$this->assertEquals( '/app/admin/users?action=edit&tab=personal&user=5', util::add_query_arg( 'user', 5, '/app/admin/users?action=edit&tab=personal' ) );
$this->assertEquals( '/app/admin/users?action=edit&tab=personal&user=5', util::add_query_arg( array( 'user' => 5 ), '/app/admin/users?action=edit&tab=personal' ) );
// Ensure strips false.
$this->assertEquals('/index.php', util::add_query_arg('debug', false, '/index.php'));
// With a URL fragment
$this->assertEquals( '/app/admin/users?user=5#test', util::add_query_arg( 'user', 5, '/app/admin/users#test' ) );
// Full URL
$this->assertEquals( 'http://example.com/?a=b', util::add_query_arg( 'a', 'b', 'http://example.com' ) );
// Only the query string
$this->assertEquals( '?a=b&c=d', util::add_query_arg( 'c', 'd', '?a=b' ) );
$this->assertEquals( 'a=b&c=d', util::add_query_arg( 'c', 'd', 'a=b' ) );
// Url encoding test
$this->assertEquals( '/app/admin/users?param=containsa%26sym', util::add_query_arg( 'param', 'containsa&sym', '/app/admin/users' ) );
// If not provided, grab the URI from the server.
$_SERVER['REQUEST_URI'] = '/app/admin/users';
$this->assertEquals( '/app/admin/users?user=6', util::add_query_arg( array( 'user' => 6 ) ) );
$this->assertEquals( '/app/admin/users?user=7', util::add_query_arg( 'user', 7 ) );
}
public function test_remove_query_arg()
{
$this->assertEquals( '/app/admin/users', util::remove_query_arg( 'user', '/app/admin/users?user=5' ) );
$this->assertEquals( '/app/admin/users?action=edit', util::remove_query_arg( 'user', '/app/admin/users?action=edit&user=5' ) );
$this->assertEquals( '/app/admin/users?user=5', util::remove_query_arg( array( 'tab', 'action' ), '/app/admin/users?action=edit&tab=personal&user=5' ) );
}
public function test_http_build_url()
{
$url = 'http://user:pass@example.com:8080/path/?query#fragment';
$expected = 'http://example.com/';
$actual = util::http_build_url($url, array(), util::HTTP_URL_STRIP_ALL);
$this->assertEquals($expected, $actual);
$expected = 'http://example.com:8080/path/?query#fragment';
$actual = util::http_build_url($url, array(), util::HTTP_URL_STRIP_AUTH);
$this->assertEquals($expected, $actual);
$this->assertEquals('https://dev.example.com/', util::http_build_url('http://example.com/', array('scheme' => 'https', 'host' => 'dev.example.com')));
$this->assertEquals('http://example.com/#hi', util::http_build_url('http://example.com/', array('fragment' => 'hi'), util::HTTP_URL_REPLACE));
$this->assertEquals('http://example.com/page', util::http_build_url('http://example.com/', array('path' => 'page'), util::HTTP_URL_JOIN_PATH));
$this->assertEquals('http://example.com/page', util::http_build_url('http://example.com', array('path' => 'page'), util::HTTP_URL_JOIN_PATH));
$this->assertEquals('http://example.com/?hi=Bro', util::http_build_url('http://example.com/', array('query' => 'hi=Bro'), util::HTTP_URL_JOIN_QUERY));
$this->assertEquals('http://example.com/?show=1&hi=Bro', util::http_build_url('http://example.com/?show=1', array('query' => 'hi=Bro'), util::HTTP_URL_JOIN_QUERY));
$this->assertEquals('http://admin@example.com/', util::http_build_url('http://example.com/', array('user' => 'admin')));
$this->assertEquals('http://admin:1@example.com/', util::http_build_url('http://example.com/', array('user' => 'admin', 'pass' => '1')));
}
public function test_str_to_bool()
{
$this->assertTrue( util::str_to_bool( 'true' ) );
$this->assertTrue( util::str_to_bool( 'yes' ) );
$this->assertTrue( util::str_to_bool( 'y' ) );
$this->assertTrue( util::str_to_bool( 'oui' ) );
$this->assertTrue( util::str_to_bool( 'vrai' ) );
$this->assertFalse( util::str_to_bool( 'false' ) );
$this->assertFalse( util::str_to_bool( 'no' ) );
$this->assertFalse( util::str_to_bool( 'n' ) );
$this->assertFalse( util::str_to_bool( 'non' ) );
$this->assertFalse( util::str_to_bool( 'faux' ) );
$this->assertFalse( util::str_to_bool( 'test' , false) );
}
public function test_array_pluck()
{
$array = array(
array(
'name' => 'Bob',
'age' => 37
),
array(
'name' => 'Fred',
'age' => 37
),
array(
'name' => 'Jane',
'age' => 29
),
array(
'name' => 'Brandon',
'age' => 20
),
array(
'age' => 41
)
);
$obj_array = array(
'bob' => (object) array(
'name' => 'Bob',
'age' => 37
),
'fred' => (object) array(
'name' => 'Fred',
'age' => 37
),
'jane' => (object) array(
'name' => 'Jane',
'age' => 29
),
'brandon' => (object) array(
'name' => 'Brandon',
'age' => 20
),
'invalid' => (object) array(
'age' => 41
)
);
$obj_array_expect = array(
'bob' => 'Bob',
'fred' => 'Fred',
'jane' => 'Jane',
'brandon' => 'Brandon'
);
$this->assertEquals( array( 'Bob', 'Fred', 'Jane', 'Brandon' ), util::array_pluck( $array, 'name' ) );
$this->assertEquals( array( 'Bob', 'Fred', 'Jane', 'Brandon', array( 'age' => 41 ) ), util::array_pluck( $array, 'name', TRUE, FALSE ) );
$this->assertEquals( $obj_array_expect, util::array_pluck( $obj_array, 'name' ) );
$this->assertEquals( array( 'Bob', 'Fred', 'Jane', 'Brandon' ), util::array_pluck( $obj_array, 'name', FALSE ) );
$expected = array('Bob', 'Fred', 'Jane', 'Brandon', 'invalid' => (object)array('age' => 41));
$this->assertEquals($expected, util::array_pluck($obj_array, 'name', FALSE, FALSE));
$expected = array('Bob', 'Fred', 'Jane', 'Brandon', array('age' => 41));
$this->assertEquals($expected, util::array_pluck($array, 'name', false, false));
}
public function test_htmlentities()
{
$this->assertEquals( 'One &amp; Two', util::htmlentities( 'One & Two' ) );
$this->assertEquals( 'One &amp; Two', util::htmlentities( 'One &amp; Two', TRUE ) );
}
public function test_htmlspecialchars()
{
$this->assertEquals( 'One &amp; Two', util::htmlspecialchars( 'One & Two' ) );
$this->assertEquals( 'One &amp; Two', util::htmlspecialchars( 'One &amp; Two', TRUE ) );
}
public function test_remove_accents()
{
$this->assertEquals( 'A', util::remove_accents( "\xC3\x81" ) );
$this->assertEquals( 'e', util::remove_accents( "\xC4\x97" ) );
$this->assertEquals( 'U', util::remove_accents( "\xC3\x9C" ) );
$this->assertEquals( 'Ae', util::remove_accents( "Ä", 'de' ) );
$this->assertEquals( 'OEoeAEDHTHssaedhth', util::remove_accents(chr(140) . chr(156) . chr(198) . chr(208) . chr(222) . chr(223) . chr(230) . chr(240) . chr(254)));
}
public function test_zero_pad()
{
$this->assertEquals( '00000341', util::zero_pad( 341, 8 ) );
$this->assertEquals( '341', util::zero_pad( 341, 1 ) );
}
public function test_human_time_diff()
{
$this->assertEquals( '1 second ago', util::human_time_diff( time() - 1 ) );
$this->assertEquals( '30 seconds ago', util::human_time_diff( time() - 30 ) );
$this->assertEquals( '1 minute ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MINUTE * 1.4 ) ) );
$this->assertEquals( '5 minutes ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MINUTE * 5 ) ) );
$this->assertEquals( '1 hour ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR ) ) );
$this->assertEquals( '2 hours ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 2 ) ) );
$this->assertEquals( '1 day ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 ) ) );
$this->assertEquals( '5 days ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 * 5 ) ) );
$this->assertEquals( '1 week ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 * 7 ) ) );
$this->assertEquals( '2 weeks ago', util::human_time_diff( time() - ( util::SECONDS_IN_AN_HOUR * 24 * 14 ) ) );
$this->assertEquals( '1 month ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_WEEK * 5 ) ) );
$this->assertEquals( '2 months ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_WEEK * 10 ) ) );
$this->assertEquals( '1 year ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MONTH * 15 ) ) );
$this->assertEquals( '2 years ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MONTH * 36 ) ) );
$this->assertEquals( '11 years ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MONTH * 140 ) ) );
$this->assertEquals( 'fifteen minutes ago', util::human_time_diff( time() - ( util::SECONDS_IN_A_MINUTE * 15 ), '', TRUE ) );
}
public function test_number_to_word()
{
try {
util::number_to_word('junk data');
$this->fail('Accepted junk data');
} catch(\LogicException $e) {
$this->assertEquals('Not a number', $e->getMessage());
}
// Partially numeric.
$this->assertEquals('', util::number_to_word('1a'));
// Decimals
$this->assertEquals( 'five point zero five', util::number_to_word('5.05') );
$this->assertEquals( 'zero point eight', util::number_to_word( 0.8 ) );
// Integers
$this->assertEquals( 'positive one', util::number_to_word( '+1' ) );
$this->assertEquals( 'negative twelve', util::number_to_word( -12 ) );
$this->assertEquals( 'one', util::number_to_word( 1 ) );
$this->assertEquals( 'five', util::number_to_word( 5 ) );
$this->assertEquals( 'fifteen', util::number_to_word( 15 ) );
$this->assertEquals( 'twenty-one', util::number_to_word( 21 ) );
$this->assertEquals( 'thirty-two', util::number_to_word( 32 ) );
$this->assertEquals( 'forty-three', util::number_to_word( 43 ) );
$this->assertEquals( 'fifty-four', util::number_to_word( 54 ) );
$this->assertEquals( 'sixty-six', util::number_to_word( 66 ) );
$this->assertEquals( 'seventy-seven', util::number_to_word( 77 ) );
$this->assertEquals( 'eighty-eight', util::number_to_word( 88 ) );
$this->assertEquals( 'ninety-nine', util::number_to_word( 99 ) );
$this->assertEquals( 'one hundred and thirty-six', util::number_to_word( 136 ) );
$this->assertEquals( 'ten', util::number_to_word( 10 ) );
$this->assertEquals( 'twenty', util::number_to_word( 20 ) );
$this->assertEquals( 'thirty', util::number_to_word( 30 ) );
$this->assertEquals( 'forty', util::number_to_word( 40 ) );
$this->assertEquals( 'fifty', util::number_to_word( 50 ) );
$this->assertEquals( 'sixty', util::number_to_word( 60 ) );
$this->assertEquals( 'seventy', util::number_to_word( 70 ) );
$this->assertEquals( 'eighty', util::number_to_word( 80 ) );
$this->assertEquals( 'ninety', util::number_to_word( 90 ) );
$this->assertEquals( 'eleven', util::number_to_word( 11 ) );
$this->assertEquals( 'thirteen', util::number_to_word( 13 ) );
$this->assertEquals( 'fourteen', util::number_to_word( 14 ) );
$this->assertEquals( 'fifteen', util::number_to_word( 15 ) );
$this->assertEquals( 'sixteen', util::number_to_word( 16 ) );
$this->assertEquals( 'seventeen', util::number_to_word( 17 ) );
$this->assertEquals( 'eighteen', util::number_to_word( 18 ) );
$this->assertEquals( 'nineteen', util::number_to_word( 19 ) );
$this->assertEquals( 'one thousand', util::number_to_word( 1000 ) );
$this->assertEquals( 'one million', util::number_to_word( 1000000 ) );
$this->assertEquals( 'one billion', util::number_to_word( 1000000000 ) );
$this->assertEquals( 'one trillion', util::number_to_word( 1000000000000 ) );
$this->assertEquals( 'one quadrillion', util::number_to_word( '1000000000000000' ) );
$this->assertEquals( 'one quintrillion', util::number_to_word( '1000000000000000000' ) );
$this->assertEquals( 'one sextillion', util::number_to_word( '1000000000000000000000' ) );
$this->assertEquals( 'one septillion', util::number_to_word( '1000000000000000000000000' ) );
$this->assertEquals( 'one octillion', util::number_to_word( '1000000000000000000000000000' ) );
$this->assertEquals( 'one nonillion', util::number_to_word( '1000000000000000000000000000000' ) );
$this->assertEquals( 'one decillion', util::number_to_word( '1000000000000000000000000000000000' ) );
$this->assertEquals( 'one', util::number_to_word( '1000000000000000000000000000000000000000000' ) );
}
public function test_array_search_deep()
{
$users = array(
1 => (object) array( 'username' => 'brandon', 'age' => 20 ),
2 => (object) array( 'username' => 'matt', 'age' => 27 ),
3 => (object) array( 'username' => 'jane', 'age' => 53 ),
4 => (object) array( 'username' => 'john', 'age' => 41 ),
5 => (object) array( 'username' => 'steve', 'age' => 11 ),
6 => (object) array( 'username' => 'fred', 'age' => 42 ),
7 => (object) array( 'username' => 'rasmus', 'age' => 21 ),
8 => (object) array( 'username' => 'don', 'age' => 15 ),
9 => array( 'username' => 'darcy', 'age' => 33 ),
);
$test = array(
1 => 'brandon',
2 => 'devon',
3 => array( 'troy' ),
4 => 'annie'
);
$this->assertFalse( util::array_search_deep( $test, 'bob' ) );
$this->assertEquals( 3, util::array_search_deep( $test, 'troy' ) );
$this->assertEquals( 4, util::array_search_deep( $test, 'annie' ) );
$this->assertEquals( 2, util::array_search_deep( $test, 'devon', 'devon' ) );
$this->assertEquals( 7, util::array_search_deep( $users, 'rasmus', 'username' ) );
$this->assertEquals( 9, util::array_search_deep( $users, 'darcy', 'username' ) );
$this->assertEquals( 1, util::array_search_deep( $users, 'brandon' ) );
}
public function test_array_map_deep()
{
$input = array(
'<',
'abc',
'>',
'def',
array( '&', 'test', '123' ),
(object) array( 'hey', '<>' )
);
$expect = array(
'&lt;',
'abc',
'&gt;',
'def',
array( '&amp;', 'test', '123' ),
(object) array( 'hey', '<>' )
);
$this->assertEquals( $expect, util::array_map_deep( $input, 'htmlentities' ) );
}
public function test_random_string()
{
// Make sure the generated string contains only human friendly characters and is 30 characters long
$str = util::random_string( 30 );
$this->assertTrue( (bool) preg_match( '/^([ABCDEFGHJKLMNPQRSTUVWXYZabcdefhjkmnprstuvwxyz23456789]{30})$/', $str ) );
// Make sure the generated string is 30 characters long
$str = util::random_string( 30, false, true );
$this->assertTrue( strlen( $str ) === 30, 'random_string produced an invalid length string' );
// Make sure the generated string is 120 characters long
$str = util::random_string( 120 );
$this->assertTrue(strlen( $str ) === 120, 'random_string produced an invalid length string');
// Make sure the string doesn't contain duplicate letters
$str = util::random_string( 53, true, false, true );
$this->assertTrue(strlen($str) === 53, 'random_string produced an invalid length string');
$this->assertTrue(count(array_unique(str_split($str))) === strlen($str), 'random_string produced a string with duplicate characters');
// Longer length than characters available
try {
$str = util::random_string( 55, true, false, true );
$this->assertTrue( false );
} catch (Exception $e) {
$this->assertTrue( true );
}
// Test secure variant
$str = util::secure_random_string(16);
$this->assertTrue(strlen($str) === 16);
// Longer length than characters available
try {
$str = util::secure_random_string(0);
$this->assertTrue(false);
} catch (Exception $e) {
$this->assertTrue(true);
}
}
public function test_match_string()
{
$this->assertTrue( util::match_string('a', 'a') );
$this->assertFalse( util::match_string('a', ' a') );
$this->assertFalse( util::match_string('/', '/something') );
$this->assertTrue( util::match_string('test/*', 'test/first/second') );
$this->assertTrue( util::match_string('*/test', 'first/second/test') );
$this->assertFalse( util::match_string('first/', 'first/second/test') );
$this->assertFalse( util::match_string('test', 'TEST') );
$this->assertTrue( util::match_string('test', 'TEST', false) );
}
public function test_validate_email()
{
$this->assertTrue( util::validate_email( 'john.smith@gmail.com' ) );
$this->assertTrue( util::validate_email( 'john.smith+label@gmail.com' ) );
$this->assertTrue( util::validate_email( 'john.smith@gmail.co.uk' ) );
}
public function test_safe_truncate()
{
$this->assertEquals( 'The quick brown fox...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 24 ) );
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 55 ) );
$this->assertEquals( 'Th...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 2 ) );
$this->assertEquals( 'The...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 3 ) );
$this->assertEquals( 'The...', util::safe_truncate( 'The quick brown fox jumps over the lazy dog', 7 ) );
}
public function test_limit_characters()
{
$this->assertEquals( 'The quick brown fox jump...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 24 ) );
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 55 ) );
$this->assertEquals( 'Th...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 2 ) );
$this->assertEquals( 'The...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 3 ) );
$this->assertEquals( 'The qui...', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 7 ) );
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::limit_characters( 'The quick brown fox jumps over the lazy dog', 150 ) );
}
public function test_limit_words()
{
$this->assertEquals( 'The quick brown...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 3 ) );
$this->assertEquals( 'The quick brown fox jumps...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 5 ) );
$this->assertEquals( 'The...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 1 ) );
$this->assertEquals( 'The quick brown fox jumps over the lazy dog', util::limit_words( 'The quick brown fox jumps over the lazy dog', 90 ) );
$this->assertEquals( 'The quick brown fox jumps over the...', util::limit_words( 'The quick brown fox jumps over the lazy dog', 7 ) );
}
public function test_ordinal()
{
$this->assertEquals( '1st', util::ordinal( 1 ) );
$this->assertEquals( '2nd', util::ordinal( 2 ) );
$this->assertEquals( '3rd', util::ordinal( 3 ) );
$this->assertEquals( '4th', util::ordinal( 4 ) );
$this->assertEquals( '5th', util::ordinal( 5 ) );
$this->assertEquals( '6th', util::ordinal( 6 ) );
$this->assertEquals( '7th', util::ordinal( 7 ) );
$this->assertEquals( '8th', util::ordinal( 8 ) );
$this->assertEquals( '9th', util::ordinal( 9 ) );
$this->assertEquals( '22nd', util::ordinal( 22 ) );
$this->assertEquals( '23rd', util::ordinal( 23 ) );
$this->assertEquals( '143rd', util::ordinal( 143 ) );
}
public function test_array_first()
{
$test = array( 'a' => array( 'a', 'b', 'c' ) );
$this->assertEquals( 'a', util::array_first( util::array_get( $test['a'] ) ) );
}
public function test_array_first_key()
{
$test = array( 'a' => array( 'a' => 'b', 'c' => 'd' ) );
$this->assertEquals( 'a', util::array_first_key( util::array_get( $test['a'] ) ) );
}
public function test_array_last()
{
$test = array( 'a' => array( 'a', 'b', 'c' ) );
$this->assertEquals( 'c', util::array_last( util::array_get( $test['a'] ) ) );
}
public function test_array_last_key()
{
$test = array( 'a' => array( 'a' => 'b', 'c' => 'd' ) );
$this->assertEquals( 'c', util::array_last_key( util::array_get( $test['a'] ) ) );
}
public function test_array_flatten()
{
$input = array( 'a', 'b', 'c', 'd', array( 'first' => 'e', 'f', 'second' => 'g', array( 'h', 'third' => 'i', array( array( array( array( 'j', 'k', 'l' ) ) ) ) ) ) );
$expectNoKeys = range( 'a', 'l' );
$expectWithKeys = array(
'a', 'b', 'c', 'd',
'first' => 'e',
'f',
'second' => 'g',
'h',
'third' => 'i',
'j', 'k', 'l'
);
$this->assertEquals( $expectWithKeys, util::array_flatten( $input ) );
$this->assertEquals( $expectNoKeys, util::array_flatten( $input, false ) );
$this->assertEquals( $expectWithKeys, util::array_flatten( $input, true ) );
}
public function test_strip_space()
{
$input = ' The quick brown fox jumps over the lazy dog ';
$expect = 'Thequickbrownfoxjumpsoverthelazydog';
$this->assertEquals($expect, Util::strip_space($input));
}
public function test_sanitize_string()
{
$input = ' Benoit! à New-York? jai perçu 1 % : Quas-tu "gagné" chez M. V. Noël? Dix francs.';
$expect = 'benoitanewyorkjaipercu1quastugagnechezmvnoeldixfrancs';
$this->assertEquals($expect, Util::sanitize_string($input));
}
public function test_get_gravatar()
{
$_SERVER['HTTPS'] = 'on';
$this->assertEquals('https://secure.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=32', util::get_gravatar('john.doe@example.org'));
$this->assertEquals('https://secure.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=128', util::get_gravatar('john.doe@example.org', 128));
$_SERVER['HTTPS'] = 'off';
$this->assertEquals('http://www.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=32', util::get_gravatar('john.doe@example.org'));
$this->assertEquals('http://www.gravatar.com/avatar/a4bf5bbb9feaa2713d99a3b52ab80024?s=128', util::get_gravatar('john.doe@example.org', 128));
}
public function test_get_client_ip()
{
$_SERVER['REMOTE_ADDR'] = '192.168.30.152';
$_SERVER['HTTP_CLIENT_IP'] = '192.168.30.153';
$_SERVER['HTTP_X_FORWARDED_FOR'] = '192.168.30.154';
$this->assertEquals('192.168.30.152', util::get_client_ip());
$this->assertEquals('192.168.30.153', util::get_client_ip(true));
unset($_SERVER['HTTP_CLIENT_IP']);
$this->assertEquals('192.168.30.154', util::get_client_ip(true));
unset($_SERVER['HTTP_X_FORWARDED_FOR']);
$this->assertEquals('192.168.30.152', util::get_client_ip(true));
}
public function test_full_permissions()
{
// Text a non-existant file.
$this->assertFalse(util::full_permissions('faker-123.blah'), 'Gave a permission value for a non-existant file.');
// Test an existing file.
$expected = '-rw-rw-rw-';
$tempFile = tempnam(sys_get_temp_dir(), 'foo');
$this->assertTrue(chmod($tempFile, 0666), 'Oops. Could not change temp file\'s permissions to 0666.');
$this->assertEquals($expected, util::full_permissions($tempFile), 'Could not properly obtain permissions of an existing file.');
unlink($tempFile);
$this->assertEquals('lr--r--r--', util::full_permissions('fake-file-222', octdec('120444')));
$this->assertEquals('ur--r--r--', util::full_permissions('fake-file-222', octdec('000444')));
$this->assertEquals('srwxr-xr-x', util::full_permissions('fake-file-222', octdec('140755')));
$this->assertEquals('drwxr-xr-x', util::full_permissions('fake-file-222', octdec('40755')));
$this->assertEquals('brw-rw----', util::full_permissions('fake-file-222', octdec('60660')));
$this->assertEquals('crw-rw----', util::full_permissions('fake-file-222', octdec('20660')));
$this->assertEquals('prw-rw----', util::full_permissions('fake-file-222', octdec('10660')));
$this->assertEquals('---x------', util::full_permissions('fake-file-222', octdec('100100')));
$this->assertEquals('--w-------', util::full_permissions('fake-file-222', octdec('100200')));
$this->assertEquals('--wx------', util::full_permissions('fake-file-222', octdec('100300')));
$this->assertEquals('-r--------', util::full_permissions('fake-file-222', octdec('100400')));
$this->assertEquals('-r-x------', util::full_permissions('fake-file-222', octdec('100500')));
$this->assertEquals('-rw-------', util::full_permissions('fake-file-222', octdec('100600')));
$this->assertEquals('-rwx------', util::full_permissions('fake-file-222', octdec('100700')));
// Windows does not have the concept of /.
if (!defined('PHP_WINDOWS_VERSION_MAJOR')) {
$this->assertEquals('drwxr-xr-x', util::full_permissions('/'));
}
}
public function test_array_clean()
{
$input = array( 'a', 'b', '', null, false, 0);
$expect = array('a', 'b');
$this->assertEquals($expect, Util::array_clean($input));
}
public function test_var_dump_plain()
{
$input = 'var';
$expect = '<span style="color:#588bff;">string</span><span style="color:#999;">(</span>3<span style="color:#999;">)</span> <strong>"var"</strong>';
$this->assertEquals($expect, Util::var_dump_plain($input, true));
$input = true;
$expect = '<span style="color:#588bff;">bool</span><span style="color:#999;">(</span><strong>true</strong><span style="color:#999;">)</span>';
$this->assertEquals($expect, Util::var_dump_plain($input, true));
$input = 1;
$expect = '<span style="color:#588bff;">int</span><span style="color:#999;">(</span><strong>1</strong><span style="color:#999;">)</span>';
$this->assertEquals($expect, Util::var_dump_plain($input, true));
$input = 1.5;
$expect = '<span style="color:#588bff;">float</span><span style="color:#999;">(</span><strong>1.5</strong><span style="color:#999;">)</span>';
$this->assertEquals($expect, Util::var_dump_plain($input, true));
$input = null;
$expect = '<strong>NULL</strong>';
$this->assertEquals($expect, Util::var_dump_plain($input, true));
$input = fopen('php://memory', 'r');
$expect = '<span style="color:#588bff;">resource</span>("stream") <strong>"' . $input . '"</strong>';
$this->assertEquals($expect, Util::var_dump_plain($input, -1));
fclose($input);
// Test complex arrays.
$input = array(1, 2, 4, 6, 10 => 20, 100 => 200);
$actual = util::var_dump_plain($input, true);
$this->assertContains('<img id="include-php-', $actual);
$this->assertContains('<br /> 100 => <span', $actual);
$this->assertContains('(</span><strong>200</strong><span style="color:#999;">)', $actual);
// Test complex objects.
$experiment = new VarDumpExperiment();
$actual = util::var_dump_plain($experiment, true);
$this->assertContains('1 => <span style="color:#588bff;">string</span><span style="color:#999;">(</span>1<span style="color:#999;">', $actual);
}
public function test_var_dump()
{
$input = 'var';
$expect = '<pre style="margin-bottom: 18px;background: #f7f7f9;border: 1px solid #e1e1e8;padding: 8px;border-radius: 4px;-moz-border-radius: 4px;-webkit-border radius: 4px;display: block;font-size: 12.05px;white-space: pre-wrap;word-wrap: break-word;color: #333;font-family: Menlo,Monaco,Consolas,\'Courier New\',monospace;"><span style="color:#588bff;">string</span><span style="color:#999;">(</span>3<span style="color:#999;">)</span> <strong>"var"</strong></pre>';
// Ensure the proper output is returned
$this->assertEquals($expect, Util::var_dump($input, true));
// Ensure the proper output is actually outputted
$this->expectOutputString($expect);
util::var_dump($input);
// Ensure we avoid infinite recursion on recursive arrays
$a = array('a' => 'value a', 'b' => 'value b');
$b = array('test' => &$a);
$c = array('a' => &$a, 'b' => &$b);
$a['c'] = &$c;
$b['c'] = &$c;
$this->assertContains('*RECURSION DETECTED*', Util::var_dump($c, true));
// Ensure we avoid infinite recursion on recursive objects
$a = (object) array('a' => 'value a', 'b' => 'value b');
$b = (object) array('test' => &$a);
$c = (object) array('a' => &$a, 'b' => &$b);
$a->c = &$c;
$b->c = &$c;
$this->assertContains('*RECURSION DETECTED*', Util::var_dump($c, true));
// Test class scoping.
$experiment = new VarDumpExperiment();
$actual = util::var_dump($experiment, true);
$snippet = substr($actual, strrpos($actual, 'display:inline'));
$this->assertContains('"public"', $snippet);
$this->assertContains('"protected:protected"', $snippet);
$this->assertContains('"private:VarDumpExperiment:private"', $actual);
}
public function test_linkify()
{
$input = 'great websites: http://www.google.com?param=test and http://yahoo.com/a/nested/folder';
$expect = 'great websites: <a href="http://www.google.com?param=test">http://www.google.com?param=test</a> and <a href="http://yahoo.com/a/nested/folder">http://yahoo.com/a/nested/folder</a>';
$this->assertEquals($expect, Util::linkify($input));
$this->assertEquals($expect, util::linkify($expect), 'linkify() tried to double linkify an href.');
}
public function test_start_with()
{
$this->assertTrue(Util::starts_with('start a string', 'start a'));
$this->assertFalse(Util::starts_with('start a string', 'string'));
}
public function test_end_with()
{
$this->assertTrue(Util::ends_with('start a string', 'a string'));
$this->assertFalse(Util::ends_with('start a string', 'start'));
}
public function test_contains()
{
$this->assertTrue(Util::str_contains('start a string', 'a string'));
$this->assertFalse(Util::str_contains('start a string', 'Start'));
}
public function test_iContains()
{
$this->assertTrue(Util::str_icontains('start a string', 'a string'));
$this->assertTrue(Util::str_icontains('start a string', 'Start'));
}
public function test_get_file_ext()
{
$input = 'a_pdf_fil.pdf';
$expect = 'pdf';
$this->assertEquals($expect, Util::get_file_ext($input));
}
public function test_rmdir()
{
$dirname = dirname(__FILE__);
// Test deleting a non-existant directory
$this->assertFalse(file_exists($dirname . '/test1'));
$this->assertTrue(util::rmdir($dirname . '/test1'));
// Test deleting an empty directory
$dir = $dirname . '/test2';
mkdir($dir);
$this->assertTrue(is_dir($dir));
if (is_dir($dir)) {
util::rmdir($dir);
$this->assertFalse(is_dir($dir));
}
// Test deleting a non-empty directory
$dir = $dirname . '/test3';
$file = $dirname . '/test3/test.txt';
mkdir($dir);
touch($file);
$this->assertTrue(is_dir($dir));
$this->assertTrue(is_file($file));
if (is_dir($dir)) {
util::rmdir($dir);
$this->assertFalse(is_dir($dir));
$this->assertFalse(is_file($file));
}
// Test deleting a non-directory path
$file = $dirname . '/test4.txt';
touch($file);
try {
$str = util::rmdir($file);
$this->assertTrue(false);
} catch (\Exception $e) {
$this->assertTrue(true);
}
unlink($file);
// Test deleting a nested directory
$dir1 = $dirname . '/test5';
$dir2 = $dirname . '/test5/nested_dir';
$file1 = $dir1 . '/file1.txt';
$file2 = $dir2 . '/file2.txt';
mkdir($dir1);
mkdir($dir2);
touch($file1);
touch($file2);
$this->assertTrue(is_dir($dir1));
$this->assertTrue(is_dir($dir2));
$this->assertTrue(is_file($file1));
$this->assertTrue(is_file($file2));
if (is_dir($dir1)) {
util::rmdir($dir1);
$this->assertFalse(is_dir($dir1));
$this->assertFalse(is_dir($dir2));
$this->assertFalse(is_file($file1));
$this->assertFalse(is_file($file2));
}
// Test symlink traversal.
$dir = $dirname . '/test6';
$nestedDir = "$dir/nested";
$symlink = "$dir/nested-symlink";
mkdir($dir);
mkdir($nestedDir);
$symlinkStatus = symlink($nestedDir, $symlink);
$this->assertTrue($symlinkStatus, 'The test system does not support making symlinks.');
if (!$symlink) {
return;
}
$this->assertTrue(util::rmdir($symlink, true), 'Could not delete a symlinked directory.');
$this->assertFalse(file_exists($symlink), 'Could not delete a symlinked directory.');
util::rmdir($dir, true);
$this->assertFalse(is_dir($dir), 'Could not delete a directory with a symlinked directory inside of it.');
}
public function test_get_current_url()
{
$expected = 'http://test.dev/test.php?foo=bar';
$expectedAuth = 'http://admin:123@test.dev/test.php?foo=bar';
$expectedPort = 'http://test.dev:443/test.php?foo=bar';
$expectedPort2 = 'https://test.dev:80/test.php?foo=bar';
$expectedSSL = 'https://test.dev/test.php?foo=bar';
$_SERVER['HTTP_HOST'] = 'test.dev';
$_SERVER['SERVER_PORT'] = 80;
$_SERVER['REQUEST_URI'] = '/test.php?foo=bar';
$_SERVER['QUERY_STRING'] = 'foo=bar';
$_SERVER['PHP_SELF'] = '/test.php';
// Test regular.
$this->assertEquals($expected, util::get_current_url());
// Test server auth.
$_SERVER['PHP_AUTH_USER'] = 'admin';
$_SERVER['PHP_AUTH_PW'] = '123';
$this->assertEquals($expectedAuth, util::get_current_url());
unset($_SERVER['PHP_AUTH_USER']);
unset($_SERVER['PHP_AUTH_PW']);
// Test port.
$_SERVER['SERVER_PORT'] = 443;
$this->assertEquals($expectedPort, util::get_current_url());
// Test SSL.
$_SERVER['HTTPS'] = 'on';
$this->assertEquals($expectedSSL, util::get_current_url());
$_SERVER['SERVER_PORT'] = 80;
$this->assertEquals($expectedPort2, util::get_current_url());
unset($_SERVER['HTTPS']);
// Test no $_SERVER['REQUEST_URI'] (e.g., MS IIS).
unset($_SERVER['REQUEST_URI']);
$this->assertEquals($expected, util::get_current_url());
}
public function test_set_writable()
{
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
$this->markTestSkipped('This functionality is not working on Windows.');
}
if (posix_geteuid() === 0) {
$this->markTestSkipped('These tests don\'t work when run as root');
}
$this->assertFalse(util::set_writable('/no/such/file'));
// Create a file to test with
$dirname = dirname(__FILE__);
$file = $dirname . '/test7';
touch($file);
chmod($file, 0644);
// The file is owned by us so it should be writable
$this->assertTrue(is_writable($file));
$this->assertEquals('-rw-r--r--', util::full_permissions($file));
// Toggle writable bit off for us
util::set_writable($file, false);
clearstatcache();
$this->assertFalse(is_writable($file));
$this->assertEquals('-r--r--r--', util::full_permissions($file));
// Toggle writable bit back on for us
util::set_writable($file, true);
clearstatcache();
$this->assertTrue(is_writable($file));
$this->assertEquals('-rw-r--r--', util::full_permissions($file));
unlink($file);
}
public function test_set_readable()
{
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
$this->markTestSkipped('This functionality is not working on Windows.');
}
if (posix_geteuid() === 0) {
$this->markTestSkipped('These tests don\'t work when run as root');
}
$this->assertFalse(util::set_readable('/no/such/file'));
$dirname = dirname(__FILE__);
$file = $dirname . '/test8';
touch($file);
$this->assertTrue(is_readable($file));
util::set_readable($file, false);
clearstatcache();
$this->assertFalse(is_readable($file));
util::set_readable($file, true);
clearstatcache();
$this->assertTrue(is_readable($file));
unlink($file);
}
public function test_set_executable()
{
if (strncasecmp(PHP_OS, 'WIN', 3) === 0) {
$this->markTestSkipped('This functionality is not working on Windows.');
}
if (posix_geteuid() === 0) {
$this->markTestSkipped('These tests don\'t work when run as root');
}
$this->assertFalse(util::set_executable('/no/such/file'));
$dirname = dirname(__FILE__);
$file = $dirname . '/test9';
touch($file);
$this->assertFalse(is_executable($file));
util::set_executable($file, true);
clearstatcache();
$this->assertTrue(is_executable($file));
util::set_executable($file, false);
clearstatcache();
$this->assertFalse(is_executable($file));
unlink($file);
}
public function test_directory_size() {
$dirname = dirname(__FILE__);
$dir = $dirname .'/dir1';
mkdir($dir);
$file1 = $dir .'/file1';
file_put_contents($file1, '1234567890');
$file2 = $dir .'/file2';
file_put_contents($file2, range('a', 'z'));
$this->assertEquals(10 + 26, util::directory_size($dir));
util::rmdir($dir);
}
public function test_get_user_directory() {
// Test for OS Default.
$this->assertTrue(is_writable(util::get_user_directory()));
$oldServer = $_SERVER;
unset($_SERVER);
// Test for UNIX.
$_SERVER['HOME'] = '/home/unknown';
$this->assertEquals($_SERVER['HOME'], util::get_user_directory(), 'Could not get the user\'s home directory in UNIX.');
unset($_SERVER);
// Test for Windows.
$expected = 'X:\Users\ThisUser';
$_SERVER['HOMEDRIVE'] = 'X:';
$_SERVER['HOMEPATH'] = '\Users\ThisUser';
$this->assertEquals($expected, util::get_user_directory(), 'Could not get the user\'s home directory in Windows.');
// In case the tests are not being run in isolation.
$_SERVER = $oldServer;
}
public function test_directory_contents() {
$dirname = dirname(__FILE__);
$dir = $dirname . DIRECTORY_SEPARATOR .'dir1';
mkdir($dir);
$file1 = $dir . DIRECTORY_SEPARATOR .'file1';
touch($file1);
$this->assertEquals(array($file1), util::directory_contents($dir));
util::rmdir($dir);
}
}
+10
View File
@@ -0,0 +1,10 @@
<?php
require __DIR__ . '/src/utilphp/util.php';
/**
* Globally namespaced version of the class.
*
* @author Brandon Wamboldt <brandon.wamboldt@gmail.com>
*/
class util extends \utilphp\util { }
+22
View File
@@ -0,0 +1,22 @@
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
*.sln merge=union
*.csproj merge=union
*.vbproj merge=union
*.fsproj merge=union
*.dbproj merge=union
# Standard to msysgit
*.doc diff=astextplain
*.DOC diff=astextplain
*.docx diff=astextplain
*.DOCX diff=astextplain
*.dot diff=astextplain
*.DOT diff=astextplain
*.pdf diff=astextplain
*.PDF diff=astextplain
*.rtf diff=astextplain
*.RTF diff=astextplain
+3
View File
@@ -0,0 +1,3 @@
# These are supported funding model platforms
open_collective: medoo
@@ -0,0 +1,19 @@
---
name: Bug report
about: Create a report to help us improve
---
**Describe the bug**
A clear and concise description of what the bug is.
**Information**
- Version of Medoo:
- Type of Database (MySQL, MSSQL, SQLite...):
- System (Liunx\Windows\Mac):
**Detail Code**
The detail code causes the problem.
**Expected output**
A clear and concise description of what output you expected.
+216
View File
@@ -0,0 +1,216 @@
#################
## Eclipse
#################
*.pydevproject
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
#################
## Visual Studio
#################
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.sln.docstates
# Build results
[Dd]ebug/
[Rr]elease/
x64/
build/
[Bb]in/
[Oo]bj/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
*_i.c
*_p.c
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.log
*.scc
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opensdf
*.sdf
*.cachefile
# Visual Studio profiler
*.psess
*.vsp
*.vspx
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
*.ncrunch*
.*crunch*.local.xml
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.Publish.xml
*.pubxml
*.publishproj
# NuGet Packages Directory
## TODO: If you have NuGet Package Restore enabled, uncomment the next line
#packages/
# Windows Azure Build Output
csx
*.build.csdef
# Windows Store app package directory
AppPackages/
# Others
sql/
*.Cache
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.[Pp]ublish.xml
*.pfx
*.publishsettings
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file to a newer
# Visual Studio version. Backup files are not needed, because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
App_Data/*.mdf
App_Data/*.ldf
#############
## Windows detritus
#############
# Windows image file caches
Thumbs.db
ehthumbs.db
# Folder config file
Desktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Mac crap
.DS_Store
#############
## Python
#############
*.py[cod]
# Packages
*.egg
*.egg-info
dist/
build/
eggs/
parts/
var/
sdist/
develop-eggs/
.installed.cfg
# Installer logs
pip-log.txt
# Unit test / coverage reports
.coverage
.tox
#Translations
*.mo
#Mr Developer
.mr.developer.cfg
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 Angel Lai
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+102
View File
@@ -0,0 +1,102 @@
<p align="center">
<a href="https://medoo.in" target="_blank"><img src="https://cloud.githubusercontent.com/assets/1467904/19835326/ca62bc36-9ebd-11e6-8b37-7240d76319cd.png"></a>
</p>
<p align="center">
<a href="https://packagist.org/packages/catfan/medoo"><img alt="Total Downloads" src="https://poser.pugx.org/catfan/medoo/downloads"></a>
<a href="https://packagist.org/packages/catfan/medoo"><img alt="Latest Stable Version" src="https://poser.pugx.org/catfan/medoo/v/stable"></a>
<a href="https://packagist.org/packages/catfan/medoo"><img alt="License" src="https://poser.pugx.org/catfan/medoo/license"></a>
<a href="https://opencollective.com/medoo"><img alt="Backers on Open Collective" src="https://opencollective.com/Medoo/backers/badge.svg"></a>
<a href="https://opencollective.com/medoo"><img alt="Sponsors on Open Collective" src="https://opencollective.com/Medoo/sponsors/badge.svg"> </a>
</p>
> The lightweight PHP database framework to accelerate development
## Features
* **Lightweight** - Less than 100 KB, portable with only one file
* **Easy** - Extremely easy to learn and use, friendly construction
* **Powerful** - Supports various common and complex SQL queries, data mapping, and prevent SQL injection
* **Compatible** - Supports all SQL databases, including MySQL, MSSQL, SQLite, MariaDB, PostgreSQL, Sybase, Oracle and more
* **Friendly** - Works well with every PHP frameworks, like Laravel, Codeigniter, Yii, Slim, and framework which supports singleton extension or composer
* **Free** - Under MIT license, you can use it anywhere whatever you want
## Requirement
PHP 5.4+ and PDO extension installed, recommend PHP 7.0+
## Get Started
### Install via composer
Add Medoo to composer.json configuration file.
```
$ composer require catfan/medoo
```
And update the composer
```
$ composer update
```
```php
// If you installed via composer, just use this code to require autoloader on the top of your projects.
require 'vendor/autoload.php';
// Using Medoo namespace
use Medoo\Medoo;
// Initialize
$database = new Medoo([
'database_type' => 'mysql',
'database_name' => 'name',
'server' => 'localhost',
'username' => 'your_username',
'password' => 'your_password'
]);
// Enjoy
$database->insert('account', [
'user_name' => 'foo',
'email' => 'foo@bar.com'
]);
$data = $database->select('account', [
'user_name',
'email'
], [
'user_id' => 50
]);
echo json_encode($data);
// [
// {
// "user_name" : "foo",
// "email" : "foo@bar.com",
// }
// ]
```
## Contribution Guides
For most of time, Medoo is using develop branch for adding feature and fixing bug, and the branch will be merged into master branch while releasing a public version. For contribution, submit your code to the develop branch, and start a pull request into it.
On develop branch, each commits are started with `[fix]`, `[feature]` or `[update]` tag to indicate the change.
Keep it simple and keep it clear.
## License
Medoo is under the MIT license.
## Links
* Official website: [https://medoo.in](https://medoo.in)
* Documentation: [https://medoo.in/doc](https://medoo.in/doc)
+33
View File
@@ -0,0 +1,33 @@
{
"name": "catfan/medoo",
"type": "framework",
"description": "The lightweight PHP database framework to accelerate development",
"keywords": ["database", "database library", "lightweight", "PHP framework", "SQL", "MySQL", "MSSQL", "SQLite", "PostgreSQL", "MariaDB", "Oracle"],
"homepage": "https://medoo.in",
"license": "MIT",
"support": {
"issues": "https://github.com/catfan/Medoo/issues",
"source": "https://github.com/catfan/Medoo"
},
"authors": [
{"name": "Angel Lai", "email": "angel@catfan.me"}
],
"require": {
"php": ">=5.4",
"ext-pdo": "*"
},
"suggest": {
"ext-pdo_mysql": "For MySQL or MariaDB database",
"ext-pdo_sqlsrv": "For MSSQL database on both Window/Liunx platform",
"ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
"ext-pdo_oci": "For Oracle database",
"ext-pdo_oci8": "For Oracle version 8 database",
"ext-pdo_pqsql": "For PostgreSQL database",
"ext-pdo_sqlite": "For SQLite database"
},
"autoload": {
"psr-4": {
"Medoo\\": "/src"
}
}
}
+1852
View File
@@ -0,0 +1,1852 @@
<?php
/*!
* Medoo database framework
* https://medoo.in
* Version 1.7.10
*
* Copyright 2020, Angel Lai
* Released under the MIT license
*/
namespace Medoo;
use PDO;
use Exception;
use PDOException;
use InvalidArgumentException;
class Raw {
public $map;
public $value;
}
class Medoo
{
public $pdo;
protected $type;
protected $prefix;
protected $statement;
protected $dsn;
protected $logs = [];
protected $logging = false;
protected $debug_mode = false;
protected $guid = 0;
protected $errorInfo = null;
public function __construct(array $options)
{
if (isset($options[ 'database_type' ]))
{
$this->type = strtolower($options[ 'database_type' ]);
if ($this->type === 'mariadb')
{
$this->type = 'mysql';
}
}
if (isset($options[ 'prefix' ]))
{
$this->prefix = $options[ 'prefix' ];
}
if (isset($options[ 'logging' ]) && is_bool($options[ 'logging' ]))
{
$this->logging = $options[ 'logging' ];
}
$option = isset($options[ 'option' ]) ? $options[ 'option' ] : [];
$commands = (isset($options[ 'command' ]) && is_array($options[ 'command' ])) ? $options[ 'command' ] : [];
switch ($this->type)
{
case 'mysql':
// Make MySQL using standard quoted identifier
$commands[] = 'SET SQL_MODE=ANSI_QUOTES';
break;
case 'mssql':
// Keep MSSQL QUOTED_IDENTIFIER is ON for standard quoting
$commands[] = 'SET QUOTED_IDENTIFIER ON';
// Make ANSI_NULLS is ON for NULL value
$commands[] = 'SET ANSI_NULLS ON';
break;
}
if (isset($options[ 'pdo' ]))
{
if (!$options[ 'pdo' ] instanceof PDO)
{
throw new InvalidArgumentException('Invalid PDO object supplied');
}
$this->pdo = $options[ 'pdo' ];
foreach ($commands as $value)
{
$this->pdo->exec($value);
}
return;
}
if (isset($options[ 'dsn' ]))
{
if (is_array($options[ 'dsn' ]) && isset($options[ 'dsn' ][ 'driver' ]))
{
$attr = $options[ 'dsn' ];
}
else
{
throw new InvalidArgumentException('Invalid DSN option supplied');
}
}
else
{
if (
isset($options[ 'port' ]) &&
is_int($options[ 'port' ] * 1)
)
{
$port = $options[ 'port' ];
}
$is_port = isset($port);
switch ($this->type)
{
case 'mysql':
$attr = [
'driver' => 'mysql',
'dbname' => $options[ 'database_name' ]
];
if (isset($options[ 'socket' ]))
{
$attr[ 'unix_socket' ] = $options[ 'socket' ];
}
else
{
$attr[ 'host' ] = $options[ 'server' ];
if ($is_port)
{
$attr[ 'port' ] = $port;
}
}
break;
case 'pgsql':
$attr = [
'driver' => 'pgsql',
'host' => $options[ 'server' ],
'dbname' => $options[ 'database_name' ]
];
if ($is_port)
{
$attr[ 'port' ] = $port;
}
break;
case 'sybase':
$attr = [
'driver' => 'dblib',
'host' => $options[ 'server' ],
'dbname' => $options[ 'database_name' ]
];
if ($is_port)
{
$attr[ 'port' ] = $port;
}
break;
case 'oracle':
$attr = [
'driver' => 'oci',
'dbname' => $options[ 'server' ] ?
'//' . $options[ 'server' ] . ($is_port ? ':' . $port : ':1521') . '/' . $options[ 'database_name' ] :
$options[ 'database_name' ]
];
if (isset($options[ 'charset' ]))
{
$attr[ 'charset' ] = $options[ 'charset' ];
}
break;
case 'mssql':
if (isset($options[ 'driver' ]) && $options[ 'driver' ] === 'dblib')
{
$attr = [
'driver' => 'dblib',
'host' => $options[ 'server' ] . ($is_port ? ':' . $port : ''),
'dbname' => $options[ 'database_name' ]
];
if (isset($options[ 'appname' ]))
{
$attr[ 'appname' ] = $options[ 'appname' ];
}
if (isset($options[ 'charset' ]))
{
$attr[ 'charset' ] = $options[ 'charset' ];
}
}
else
{
$attr = [
'driver' => 'sqlsrv',
'Server' => $options[ 'server' ] . ($is_port ? ',' . $port : ''),
'Database' => $options[ 'database_name' ]
];
if (isset($options[ 'appname' ]))
{
$attr[ 'APP' ] = $options[ 'appname' ];
}
$config = [
'ApplicationIntent',
'AttachDBFileName',
'Authentication',
'ColumnEncryption',
'ConnectionPooling',
'Encrypt',
'Failover_Partner',
'KeyStoreAuthentication',
'KeyStorePrincipalId',
'KeyStoreSecret',
'LoginTimeout',
'MultipleActiveResultSets',
'MultiSubnetFailover',
'Scrollable',
'TraceFile',
'TraceOn',
'TransactionIsolation',
'TransparentNetworkIPResolution',
'TrustServerCertificate',
'WSID',
];
foreach ($config as $value)
{
$keyname = strtolower(preg_replace(['/([a-z\d])([A-Z])/', '/([^_])([A-Z][a-z])/'], '$1_$2', $value));
if (isset($options[ $keyname ]))
{
$attr[ $value ] = $options[ $keyname ];
}
}
}
break;
case 'sqlite':
$attr = [
'driver' => 'sqlite',
$options[ 'database_file' ]
];
break;
}
}
if (!isset($attr))
{
throw new InvalidArgumentException('Incorrect connection options');
}
$driver = $attr[ 'driver' ];
if (!in_array($driver, PDO::getAvailableDrivers()))
{
throw new InvalidArgumentException("Unsupported PDO driver: {$driver}");
}
unset($attr[ 'driver' ]);
$stack = [];
foreach ($attr as $key => $value)
{
$stack[] = is_int($key) ? $value : $key . '=' . $value;
}
$dsn = $driver . ':' . implode(';', $stack);
if (
in_array($this->type, ['mysql', 'pgsql', 'sybase', 'mssql']) &&
isset($options[ 'charset' ])
)
{
$commands[] = "SET NAMES '{$options[ 'charset' ]}'" . (
$this->type === 'mysql' && isset($options[ 'collation' ]) ?
" COLLATE '{$options[ 'collation' ]}'" : ''
);
}
$this->dsn = $dsn;
try {
$this->pdo = new PDO(
$dsn,
isset($options[ 'username' ]) ? $options[ 'username' ] : null,
isset($options[ 'password' ]) ? $options[ 'password' ] : null,
$option
);
foreach ($commands as $value)
{
$this->pdo->exec($value);
}
}
catch (PDOException $e) {
throw new PDOException($e->getMessage());
}
}
public function query($query, $map = [])
{
$raw = $this->raw($query, $map);
$query = $this->buildRaw($raw, $map);
return $this->exec($query, $map);
}
public function exec($query, $map = [])
{
$this->statement = null;
if ($this->debug_mode)
{
echo $this->generate($query, $map);
$this->debug_mode = false;
return false;
}
if ($this->logging)
{
$this->logs[] = [$query, $map];
}
else
{
$this->logs = [[$query, $map]];
}
$statement = $this->pdo->prepare($query);
if (!$statement)
{
$this->errorInfo = $this->pdo->errorInfo();
$this->statement = null;
return false;
}
$this->statement = $statement;
foreach ($map as $key => $value)
{
$statement->bindValue($key, $value[ 0 ], $value[ 1 ]);
}
$execute = $statement->execute();
$this->errorInfo = $statement->errorInfo();
if (!$execute)
{
$this->statement = null;
}
return $statement;
}
protected function generate($query, $map)
{
$identifier = [
'mysql' => '`$1`',
'mssql' => '[$1]'
];
$query = preg_replace(
'/"([a-zA-Z0-9_]+)"/i',
isset($identifier[ $this->type ]) ? $identifier[ $this->type ] : '"$1"',
$query
);
foreach ($map as $key => $value)
{
if ($value[ 1 ] === PDO::PARAM_STR)
{
$replace = $this->quote($value[ 0 ]);
}
elseif ($value[ 1 ] === PDO::PARAM_NULL)
{
$replace = 'NULL';
}
elseif ($value[ 1 ] === PDO::PARAM_LOB)
{
$replace = '{LOB_DATA}';
}
else
{
$replace = $value[ 0 ];
}
$query = str_replace($key, $replace, $query);
}
return $query;
}
public static function raw($string, $map = [])
{
$raw = new Raw();
$raw->map = $map;
$raw->value = $string;
return $raw;
}
protected function isRaw($object)
{
return $object instanceof Raw;
}
protected function buildRaw($raw, &$map)
{
if (!$this->isRaw($raw))
{
return false;
}
$query = preg_replace_callback(
'/(([`\']).*?)?((FROM|TABLE|INTO|UPDATE|JOIN)\s*)?\<(([a-zA-Z0-9_]+)(\.[a-zA-Z0-9_]+)?)\>(.*?\2)?/i',
function ($matches)
{
if (!empty($matches[ 2 ]) && isset($matches[ 8 ]))
{
return $matches[ 0 ];
}
if (!empty($matches[ 4 ]))
{
return $matches[ 1 ] . $matches[ 4 ] . ' ' . $this->tableQuote($matches[ 5 ]);
}
return $matches[ 1 ] . $this->columnQuote($matches[ 5 ]);
},
$raw->value);
$raw_map = $raw->map;
if (!empty($raw_map))
{
foreach ($raw_map as $key => $value)
{
$map[ $key ] = $this->typeMap($value, gettype($value));
}
}
return $query;
}
public function quote($string)
{
return $this->pdo->quote($string);
}
protected function tableQuote($table)
{
if (!preg_match('/^[a-zA-Z0-9_]+$/i', $table))
{
throw new InvalidArgumentException("Incorrect table name \"$table\"");
}
return '"' . $this->prefix . $table . '"';
}
protected function mapKey()
{
return ':MeDoO_' . $this->guid++ . '_mEdOo';
}
protected function typeMap($value, $type)
{
$map = [
'NULL' => PDO::PARAM_NULL,
'integer' => PDO::PARAM_INT,
'double' => PDO::PARAM_STR,
'boolean' => PDO::PARAM_BOOL,
'string' => PDO::PARAM_STR,
'object' => PDO::PARAM_STR,
'resource' => PDO::PARAM_LOB
];
if ($type === 'boolean')
{
$value = ($value ? '1' : '0');
}
elseif ($type === 'NULL')
{
$value = null;
}
return [$value, $map[ $type ]];
}
protected function columnQuote($string)
{
if (!preg_match('/^[a-zA-Z0-9_]+(\.?[a-zA-Z0-9_]+)?$/i', $string))
{
throw new InvalidArgumentException("Incorrect column name \"$string\"");
}
if (strpos($string, '.') !== false)
{
return '"' . $this->prefix . str_replace('.', '"."', $string) . '"';
}
return '"' . $string . '"';
}
protected function columnPush(&$columns, &$map, $root, $is_join = false)
{
if ($columns === '*')
{
return $columns;
}
$stack = [];
if (is_string($columns))
{
$columns = [$columns];
}
foreach ($columns as $key => $value)
{
if (!is_int($key) && is_array($value) && $root && count(array_keys($columns)) === 1)
{
$stack[] = $this->columnQuote($key);
$stack[] = $this->columnPush($value, $map, false, $is_join);
}
elseif (is_array($value))
{
$stack[] = $this->columnPush($value, $map, false, $is_join);
}
elseif (!is_int($key) && $raw = $this->buildRaw($value, $map))
{
preg_match('/(?<column>[a-zA-Z0-9_\.]+)(\s*\[(?<type>(String|Bool|Int|Number))\])?/i', $key, $match);
$stack[] = $raw . ' AS ' . $this->columnQuote($match[ 'column' ]);
}
elseif (is_int($key) && is_string($value))
{
if ($is_join && strpos($value, '*') !== false)
{
throw new InvalidArgumentException('Cannot use table.* to select all columns while joining table');
}
preg_match('/(?<column>[a-zA-Z0-9_\.]+)(?:\s*\((?<alias>[a-zA-Z0-9_]+)\))?(?:\s*\[(?<type>(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $match);
if (!empty($match[ 'alias' ]))
{
$stack[] = $this->columnQuote($match[ 'column' ]) . ' AS ' . $this->columnQuote($match[ 'alias' ]);
$columns[ $key ] = $match[ 'alias' ];
if (!empty($match[ 'type' ]))
{
$columns[ $key ] .= ' [' . $match[ 'type' ] . ']';
}
}
else
{
$stack[] = $this->columnQuote($match[ 'column' ]);
}
}
}
return implode(',', $stack);
}
protected function arrayQuote($array)
{
$stack = [];
foreach ($array as $value)
{
$stack[] = is_int($value) ? $value : $this->pdo->quote($value);
}
return implode(',', $stack);
}
protected function innerConjunct($data, $map, $conjunctor, $outer_conjunctor)
{
$stack = [];
foreach ($data as $value)
{
$stack[] = '(' . $this->dataImplode($value, $map, $conjunctor) . ')';
}
return implode($outer_conjunctor . ' ', $stack);
}
protected function dataImplode($data, &$map, $conjunctor)
{
$stack = [];
foreach ($data as $key => $value)
{
$type = gettype($value);
if (
$type === 'array' &&
preg_match("/^(AND|OR)(\s+#.*)?$/", $key, $relation_match)
)
{
$relationship = $relation_match[ 1 ];
$stack[] = $value !== array_keys(array_keys($value)) ?
'(' . $this->dataImplode($value, $map, ' ' . $relationship) . ')' :
'(' . $this->innerConjunct($value, $map, ' ' . $relationship, $conjunctor) . ')';
continue;
}
$map_key = $this->mapKey();
if (
is_int($key) &&
preg_match('/([a-zA-Z0-9_\.]+)\[(?<operator>\>\=?|\<\=?|\!?\=)\]([a-zA-Z0-9_\.]+)/i', $value, $match)
)
{
$stack[] = $this->columnQuote($match[ 1 ]) . ' ' . $match[ 'operator' ] . ' ' . $this->columnQuote($match[ 3 ]);
}
else
{
preg_match('/([a-zA-Z0-9_\.]+)(\[(?<operator>\>\=?|\<\=?|\!|\<\>|\>\<|\!?~|REGEXP)\])?/i', $key, $match);
$column = $this->columnQuote($match[ 1 ]);
if (isset($match[ 'operator' ]))
{
$operator = $match[ 'operator' ];
if (in_array($operator, ['>', '>=', '<', '<=']))
{
$condition = $column . ' ' . $operator . ' ';
if (is_numeric($value))
{
$condition .= $map_key;
$map[ $map_key ] = [$value, is_float($value) ? PDO::PARAM_STR : PDO::PARAM_INT];
}
elseif ($raw = $this->buildRaw($value, $map))
{
$condition .= $raw;
}
else
{
$condition .= $map_key;
$map[ $map_key ] = [$value, PDO::PARAM_STR];
}
$stack[] = $condition;
}
elseif ($operator === '!')
{
switch ($type)
{
case 'NULL':
$stack[] = $column . ' IS NOT NULL';
break;
case 'array':
$placeholders = [];
foreach ($value as $index => $item)
{
$stack_key = $map_key . $index . '_i';
$placeholders[] = $stack_key;
$map[ $stack_key ] = $this->typeMap($item, gettype($item));
}
$stack[] = $column . ' NOT IN (' . implode(', ', $placeholders) . ')';
break;
case 'object':
if ($raw = $this->buildRaw($value, $map))
{
$stack[] = $column . ' != ' . $raw;
}
break;
case 'integer':
case 'double':
case 'boolean':
case 'string':
$stack[] = $column . ' != ' . $map_key;
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
elseif ($operator === '~' || $operator === '!~')
{
if ($type !== 'array')
{
$value = [ $value ];
}
$connector = ' OR ';
$data = array_values($value);
if (is_array($data[ 0 ]))
{
if (isset($value[ 'AND' ]) || isset($value[ 'OR' ]))
{
$connector = ' ' . array_keys($value)[ 0 ] . ' ';
$value = $data[ 0 ];
}
}
$like_clauses = [];
foreach ($value as $index => $item)
{
$item = strval($item);
if (!preg_match('/(\[.+\]|[\*\?\!\%#^-_]|%.+|.+%)/', $item))
{
$item = '%' . $item . '%';
}
$like_clauses[] = $column . ($operator === '!~' ? ' NOT' : '') . ' LIKE ' . $map_key . 'L' . $index;
$map[ $map_key . 'L' . $index ] = [$item, PDO::PARAM_STR];
}
$stack[] = '(' . implode($connector, $like_clauses) . ')';
}
elseif ($operator === '<>' || $operator === '><')
{
if ($type === 'array')
{
if ($operator === '><')
{
$column .= ' NOT';
}
$stack[] = '(' . $column . ' BETWEEN ' . $map_key . 'a AND ' . $map_key . 'b)';
$data_type = (is_numeric($value[ 0 ]) && is_numeric($value[ 1 ])) ? PDO::PARAM_INT : PDO::PARAM_STR;
$map[ $map_key . 'a' ] = [$value[ 0 ], $data_type];
$map[ $map_key . 'b' ] = [$value[ 1 ], $data_type];
}
}
elseif ($operator === 'REGEXP')
{
$stack[] = $column . ' REGEXP ' . $map_key;
$map[ $map_key ] = [$value, PDO::PARAM_STR];
}
}
else
{
switch ($type)
{
case 'NULL':
$stack[] = $column . ' IS NULL';
break;
case 'array':
$placeholders = [];
foreach ($value as $index => $item)
{
$stack_key = $map_key . $index . '_i';
$placeholders[] = $stack_key;
$map[ $stack_key ] = $this->typeMap($item, gettype($item));
}
$stack[] = $column . ' IN (' . implode(', ', $placeholders) . ')';
break;
case 'object':
if ($raw = $this->buildRaw($value, $map))
{
$stack[] = $column . ' = ' . $raw;
}
break;
case 'integer':
case 'double':
case 'boolean':
case 'string':
$stack[] = $column . ' = ' . $map_key;
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
}
}
return implode($conjunctor . ' ', $stack);
}
protected function whereClause($where, &$map)
{
$where_clause = '';
if (is_array($where))
{
$where_keys = array_keys($where);
$conditions = array_diff_key($where, array_flip(
['GROUP', 'ORDER', 'HAVING', 'LIMIT', 'LIKE', 'MATCH']
));
if (!empty($conditions))
{
$where_clause = ' WHERE ' . $this->dataImplode($conditions, $map, ' AND');
}
if (isset($where[ 'MATCH' ]) && $this->type === 'mysql')
{
$MATCH = $where[ 'MATCH' ];
if (is_array($MATCH) && isset($MATCH[ 'columns' ], $MATCH[ 'keyword' ]))
{
$mode = '';
$mode_array = [
'natural' => 'IN NATURAL LANGUAGE MODE',
'natural+query' => 'IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION',
'boolean' => 'IN BOOLEAN MODE',
'query' => 'WITH QUERY EXPANSION'
];
if (isset($MATCH[ 'mode' ], $mode_array[ $MATCH[ 'mode' ] ]))
{
$mode = ' ' . $mode_array[ $MATCH[ 'mode' ] ];
}
$columns = implode(', ', array_map([$this, 'columnQuote'], $MATCH[ 'columns' ]));
$map_key = $this->mapKey();
$map[ $map_key ] = [$MATCH[ 'keyword' ], PDO::PARAM_STR];
$where_clause .= ($where_clause !== '' ? ' AND ' : ' WHERE') . ' MATCH (' . $columns . ') AGAINST (' . $map_key . $mode . ')';
}
}
if (isset($where[ 'GROUP' ]))
{
$GROUP = $where[ 'GROUP' ];
if (is_array($GROUP))
{
$stack = [];
foreach ($GROUP as $column => $value)
{
$stack[] = $this->columnQuote($value);
}
$where_clause .= ' GROUP BY ' . implode(',', $stack);
}
elseif ($raw = $this->buildRaw($GROUP, $map))
{
$where_clause .= ' GROUP BY ' . $raw;
}
else
{
$where_clause .= ' GROUP BY ' . $this->columnQuote($GROUP);
}
if (isset($where[ 'HAVING' ]))
{
if ($raw = $this->buildRaw($where[ 'HAVING' ], $map))
{
$where_clause .= ' HAVING ' . $raw;
}
else
{
$where_clause .= ' HAVING ' . $this->dataImplode($where[ 'HAVING' ], $map, ' AND');
}
}
}
if (isset($where[ 'ORDER' ]))
{
$ORDER = $where[ 'ORDER' ];
if (is_array($ORDER))
{
$stack = [];
foreach ($ORDER as $column => $value)
{
if (is_array($value))
{
$stack[] = 'FIELD(' . $this->columnQuote($column) . ', ' . $this->arrayQuote($value) . ')';
}
elseif ($value === 'ASC' || $value === 'DESC')
{
$stack[] = $this->columnQuote($column) . ' ' . $value;
}
elseif (is_int($column))
{
$stack[] = $this->columnQuote($value);
}
}
$where_clause .= ' ORDER BY ' . implode(',', $stack);
}
elseif ($raw = $this->buildRaw($ORDER, $map))
{
$where_clause .= ' ORDER BY ' . $raw;
}
else
{
$where_clause .= ' ORDER BY ' . $this->columnQuote($ORDER);
}
if (
isset($where[ 'LIMIT' ]) &&
in_array($this->type, ['oracle', 'mssql'])
)
{
$LIMIT = $where[ 'LIMIT' ];
if (is_numeric($LIMIT))
{
$LIMIT = [0, $LIMIT];
}
if (
is_array($LIMIT) &&
is_numeric($LIMIT[ 0 ]) &&
is_numeric($LIMIT[ 1 ])
)
{
$where_clause .= ' OFFSET ' . $LIMIT[ 0 ] . ' ROWS FETCH NEXT ' . $LIMIT[ 1 ] . ' ROWS ONLY';
}
}
}
if (isset($where[ 'LIMIT' ]) && !in_array($this->type, ['oracle', 'mssql']))
{
$LIMIT = $where[ 'LIMIT' ];
if (is_numeric($LIMIT))
{
$where_clause .= ' LIMIT ' . $LIMIT;
}
elseif (
is_array($LIMIT) &&
is_numeric($LIMIT[ 0 ]) &&
is_numeric($LIMIT[ 1 ])
)
{
$where_clause .= ' LIMIT ' . $LIMIT[ 1 ] . ' OFFSET ' . $LIMIT[ 0 ];
}
}
}
elseif ($raw = $this->buildRaw($where, $map))
{
$where_clause .= ' ' . $raw;
}
return $where_clause;
}
protected function selectContext($table, &$map, $join, &$columns = null, $where = null, $column_fn = null)
{
preg_match('/(?<table>[a-zA-Z0-9_]+)\s*\((?<alias>[a-zA-Z0-9_]+)\)/i', $table, $table_match);
if (isset($table_match[ 'table' ], $table_match[ 'alias' ]))
{
$table = $this->tableQuote($table_match[ 'table' ]);
$table_query = $table . ' AS ' . $this->tableQuote($table_match[ 'alias' ]);
}
else
{
$table = $this->tableQuote($table);
$table_query = $table;
}
$is_join = false;
$join_key = is_array($join) ? array_keys($join) : null;
if (
isset($join_key[ 0 ]) &&
strpos($join_key[ 0 ], '[') === 0
)
{
$is_join = true;
$table_query .= ' ' . $this->buildJoin($table, $join);
}
else
{
if (is_null($columns))
{
if (
!is_null($where) ||
(is_array($join) && isset($column_fn))
)
{
$where = $join;
$columns = null;
}
else
{
$where = null;
$columns = $join;
}
}
else
{
$where = $columns;
$columns = $join;
}
}
if (isset($column_fn))
{
if ($column_fn === 1)
{
$column = '1';
if (is_null($where))
{
$where = $columns;
}
}
elseif ($raw = $this->buildRaw($column_fn, $map))
{
$column = $raw;
}
else
{
if (empty($columns) || $this->isRaw($columns))
{
$columns = '*';
$where = $join;
}
$column = $column_fn . '(' . $this->columnPush($columns, $map, true) . ')';
}
}
else
{
$column = $this->columnPush($columns, $map, true, $is_join);
}
return 'SELECT ' . $column . ' FROM ' . $table_query . $this->whereClause($where, $map);
}
protected function buildJoin($table, $join)
{
$table_join = [];
$join_array = [
'>' => 'LEFT',
'<' => 'RIGHT',
'<>' => 'FULL',
'><' => 'INNER'
];
foreach($join as $sub_table => $relation)
{
preg_match('/(\[(?<join>\<\>?|\>\<?)\])?(?<table>[a-zA-Z0-9_]+)\s?(\((?<alias>[a-zA-Z0-9_]+)\))?/', $sub_table, $match);
if ($match[ 'join' ] !== '' && $match[ 'table' ] !== '')
{
if (is_string($relation))
{
$relation = 'USING ("' . $relation . '")';
}
if (is_array($relation))
{
// For ['column1', 'column2']
if (isset($relation[ 0 ]))
{
$relation = 'USING ("' . implode('", "', $relation) . '")';
}
else
{
$joins = [];
foreach ($relation as $key => $value)
{
$joins[] = (
strpos($key, '.') > 0 ?
// For ['tableB.column' => 'column']
$this->columnQuote($key) :
// For ['column1' => 'column2']
$table . '."' . $key . '"'
) .
' = ' .
$this->tableQuote(isset($match[ 'alias' ]) ? $match[ 'alias' ] : $match[ 'table' ]) . '."' . $value . '"';
}
$relation = 'ON ' . implode(' AND ', $joins);
}
}
$table_name = $this->tableQuote($match[ 'table' ]) . ' ';
if (isset($match[ 'alias' ]))
{
$table_name .= 'AS ' . $this->tableQuote($match[ 'alias' ]) . ' ';
}
$table_join[] = $join_array[ $match[ 'join' ] ] . ' JOIN ' . $table_name . $relation;
}
}
return implode(' ', $table_join);
}
protected function columnMap($columns, &$stack, $root)
{
if ($columns === '*')
{
return $stack;
}
foreach ($columns as $key => $value)
{
if (is_int($key))
{
preg_match('/([a-zA-Z0-9_]+\.)?(?<column>[a-zA-Z0-9_]+)(?:\s*\((?<alias>[a-zA-Z0-9_]+)\))?(?:\s*\[(?<type>(?:String|Bool|Int|Number|Object|JSON))\])?/i', $value, $key_match);
$column_key = !empty($key_match[ 'alias' ]) ?
$key_match[ 'alias' ] :
$key_match[ 'column' ];
if (isset($key_match[ 'type' ]))
{
$stack[ $value ] = [$column_key, $key_match[ 'type' ]];
}
else
{
$stack[ $value ] = [$column_key, 'String'];
}
}
elseif ($this->isRaw($value))
{
preg_match('/([a-zA-Z0-9_]+\.)?(?<column>[a-zA-Z0-9_]+)(\s*\[(?<type>(String|Bool|Int|Number))\])?/i', $key, $key_match);
$column_key = $key_match[ 'column' ];
if (isset($key_match[ 'type' ]))
{
$stack[ $key ] = [$column_key, $key_match[ 'type' ]];
}
else
{
$stack[ $key ] = [$column_key, 'String'];
}
}
elseif (!is_int($key) && is_array($value))
{
if ($root && count(array_keys($columns)) === 1)
{
$stack[ $key ] = [$key, 'String'];
}
$this->columnMap($value, $stack, false);
}
}
return $stack;
}
protected function dataMap($data, $columns, $column_map, &$stack, $root, &$result)
{
if ($root)
{
$columns_key = array_keys($columns);
if (count($columns_key) === 1 && is_array($columns[$columns_key[0]]))
{
$index_key = array_keys($columns)[0];
$data_key = preg_replace("/^[a-zA-Z0-9_]+\./i", "", $index_key);
$current_stack = [];
foreach ($data as $item)
{
$this->dataMap($data, $columns[ $index_key ], $column_map, $current_stack, false, $result);
$index = $data[ $data_key ];
$result[ $index ] = $current_stack;
}
}
else
{
$current_stack = [];
$this->dataMap($data, $columns, $column_map, $current_stack, false, $result);
$result[] = $current_stack;
}
return;
}
foreach ($columns as $key => $value)
{
$isRaw = $this->isRaw($value);
if (is_int($key) || $isRaw)
{
$map = $column_map[ $isRaw ? $key : $value ];
$column_key = $map[ 0 ];
$item = $data[ $column_key ];
if (isset($map[ 1 ]))
{
if ($isRaw && in_array($map[ 1 ], ['Object', 'JSON']))
{
continue;
}
if (is_null($item))
{
$stack[ $column_key ] = null;
continue;
}
switch ($map[ 1 ])
{
case 'Number':
$stack[ $column_key ] = (double) $item;
break;
case 'Int':
$stack[ $column_key ] = (int) $item;
break;
case 'Bool':
$stack[ $column_key ] = (bool) $item;
break;
case 'Object':
$stack[ $column_key ] = unserialize($item);
break;
case 'JSON':
$stack[ $column_key ] = json_decode($item, true);
break;
case 'String':
$stack[ $column_key ] = $item;
break;
}
}
else
{
$stack[ $column_key ] = $item;
}
}
else
{
$current_stack = [];
$this->dataMap($data, $value, $column_map, $current_stack, false, $result);
$stack[ $key ] = $current_stack;
}
}
}
public function create($table, $columns, $options = null)
{
$stack = [];
$tableName = $this->prefix . $table;
foreach ($columns as $name => $definition)
{
if (is_int($name))
{
$stack[] = preg_replace('/\<([a-zA-Z0-9_]+)\>/i', '"$1"', $definition);
}
elseif (is_array($definition))
{
$stack[] = $name . ' ' . implode(' ', $definition);
}
elseif (is_string($definition))
{
$stack[] = $name . ' ' . $this->query($definition);
}
}
$table_option = '';
if (is_array($options))
{
$option_stack = [];
foreach ($options as $key => $value)
{
if (is_string($value) || is_int($value))
{
$option_stack[] = "$key = $value";
}
}
$table_option = ' ' . implode(', ', $option_stack);
}
elseif (is_string($options))
{
$table_option = ' ' . $options;
}
return $this->exec("CREATE TABLE IF NOT EXISTS $tableName (" . implode(', ', $stack) . ")$table_option");
}
public function drop($table)
{
$tableName = $this->prefix . $table;
return $this->exec("DROP TABLE IF EXISTS $tableName");
}
public function select($table, $join, $columns = null, $where = null)
{
$map = [];
$result = [];
$column_map = [];
$index = 0;
$column = $where === null ? $join : $columns;
$is_single = (is_string($column) && $column !== '*');
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where), $map);
$this->columnMap($columns, $column_map, true);
if (!$this->statement)
{
return false;
}
if ($columns === '*')
{
return $query->fetchAll(PDO::FETCH_ASSOC);
}
while ($data = $query->fetch(PDO::FETCH_ASSOC))
{
$current_stack = [];
$this->dataMap($data, $columns, $column_map, $current_stack, true, $result);
}
if ($is_single)
{
$single_result = [];
$result_key = $column_map[ $column ][ 0 ];
foreach ($result as $item)
{
$single_result[] = $item[ $result_key ];
}
return $single_result;
}
return $result;
}
public function insert($table, $datas)
{
$stack = [];
$columns = [];
$fields = [];
$map = [];
if (!isset($datas[ 0 ]))
{
$datas = [$datas];
}
foreach ($datas as $data)
{
foreach ($data as $key => $value)
{
$columns[] = $key;
}
}
$columns = array_unique($columns);
foreach ($datas as $data)
{
$values = [];
foreach ($columns as $key)
{
if ($raw = $this->buildRaw($data[ $key ], $map))
{
$values[] = $raw;
continue;
}
$map_key = $this->mapKey();
$values[] = $map_key;
if (!isset($data[ $key ]))
{
$map[ $map_key ] = [null, PDO::PARAM_NULL];
}
else
{
$value = $data[ $key ];
$type = gettype($value);
switch ($type)
{
case 'array':
$map[ $map_key ] = [
strpos($key, '[JSON]') === strlen($key) - 6 ?
json_encode($value) :
serialize($value),
PDO::PARAM_STR
];
break;
case 'object':
$value = serialize($value);
case 'NULL':
case 'resource':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
}
$stack[] = '(' . implode(', ', $values) . ')';
}
foreach ($columns as $key)
{
$fields[] = $this->columnQuote(preg_replace("/(\s*\[JSON\]$)/i", '', $key));
}
return $this->exec('INSERT INTO ' . $this->tableQuote($table) . ' (' . implode(', ', $fields) . ') VALUES ' . implode(', ', $stack), $map);
}
public function update($table, $data, $where = null)
{
$fields = [];
$map = [];
foreach ($data as $key => $value)
{
$column = $this->columnQuote(preg_replace("/(\s*\[(JSON|\+|\-|\*|\/)\]$)/i", '', $key));
if ($raw = $this->buildRaw($value, $map))
{
$fields[] = $column . ' = ' . $raw;
continue;
}
$map_key = $this->mapKey();
preg_match('/(?<column>[a-zA-Z0-9_]+)(\[(?<operator>\+|\-|\*|\/)\])?/i', $key, $match);
if (isset($match[ 'operator' ]))
{
if (is_numeric($value))
{
$fields[] = $column . ' = ' . $column . ' ' . $match[ 'operator' ] . ' ' . $value;
}
}
else
{
$fields[] = $column . ' = ' . $map_key;
$type = gettype($value);
switch ($type)
{
case 'array':
$map[ $map_key ] = [
strpos($key, '[JSON]') === strlen($key) - 6 ?
json_encode($value) :
serialize($value),
PDO::PARAM_STR
];
break;
case 'object':
$value = serialize($value);
case 'NULL':
case 'resource':
case 'boolean':
case 'integer':
case 'double':
case 'string':
$map[ $map_key ] = $this->typeMap($value, $type);
break;
}
}
}
return $this->exec('UPDATE ' . $this->tableQuote($table) . ' SET ' . implode(', ', $fields) . $this->whereClause($where, $map), $map);
}
public function delete($table, $where)
{
$map = [];
return $this->exec('DELETE FROM ' . $this->tableQuote($table) . $this->whereClause($where, $map), $map);
}
public function replace($table, $columns, $where = null)
{
if (!is_array($columns) || empty($columns))
{
return false;
}
$map = [];
$stack = [];
foreach ($columns as $column => $replacements)
{
if (is_array($replacements))
{
foreach ($replacements as $old => $new)
{
$map_key = $this->mapKey();
$stack[] = $this->columnQuote($column) . ' = REPLACE(' . $this->columnQuote($column) . ', ' . $map_key . 'a, ' . $map_key . 'b)';
$map[ $map_key . 'a' ] = [$old, PDO::PARAM_STR];
$map[ $map_key . 'b' ] = [$new, PDO::PARAM_STR];
}
}
}
if (!empty($stack))
{
return $this->exec('UPDATE ' . $this->tableQuote($table) . ' SET ' . implode(', ', $stack) . $this->whereClause($where, $map), $map);
}
return false;
}
public function get($table, $join = null, $columns = null, $where = null)
{
$map = [];
$result = [];
$column_map = [];
$current_stack = [];
if ($where === null)
{
$column = $join;
unset($columns[ 'LIMIT' ]);
}
else
{
$column = $columns;
unset($where[ 'LIMIT' ]);
}
$is_single = (is_string($column) && $column !== '*');
$query = $this->exec($this->selectContext($table, $map, $join, $columns, $where) . ' LIMIT 1', $map);
if (!$this->statement)
{
return false;
}
$data = $query->fetchAll(PDO::FETCH_ASSOC);
if (isset($data[ 0 ]))
{
if ($column === '*')
{
return $data[ 0 ];
}
$this->columnMap($columns, $column_map, true);
$this->dataMap($data[ 0 ], $columns, $column_map, $current_stack, true, $result);
if ($is_single)
{
return $result[ 0 ][ $column_map[ $column ][ 0 ] ];
}
return $result[ 0 ];
}
}
public function has($table, $join, $where = null)
{
$map = [];
$column = null;
if ($this->type === 'mssql')
{
$query = $this->exec($this->selectContext($table, $map, $join, $column, $where, Medoo::raw('TOP 1 1')), $map);
}
else
{
$query = $this->exec('SELECT EXISTS(' . $this->selectContext($table, $map, $join, $column, $where, 1) . ')', $map);
}
if (!$this->statement)
{
return false;
}
$result = $query->fetchColumn();
return $result === '1' || $result === 1 || $result === true;
}
public function rand($table, $join = null, $columns = null, $where = null)
{
$type = $this->type;
$order = 'RANDOM()';
if ($type === 'mysql')
{
$order = 'RAND()';
}
elseif ($type === 'mssql')
{
$order = 'NEWID()';
}
$order_raw = $this->raw($order);
if ($where === null)
{
if ($columns === null)
{
$columns = [
'ORDER' => $order_raw
];
}
else
{
$column = $join;
unset($columns[ 'ORDER' ]);
$columns[ 'ORDER' ] = $order_raw;
}
}
else
{
unset($where[ 'ORDER' ]);
$where[ 'ORDER' ] = $order_raw;
}
return $this->select($table, $join, $columns, $where);
}
private function aggregate($type, $table, $join = null, $column = null, $where = null)
{
$map = [];
$query = $this->exec($this->selectContext($table, $map, $join, $column, $where, strtoupper($type)), $map);
if (!$this->statement)
{
return false;
}
$number = $query->fetchColumn();
return is_numeric($number) ? $number + 0 : $number;
}
public function count($table, $join = null, $column = null, $where = null)
{
return $this->aggregate('count', $table, $join, $column, $where);
}
public function avg($table, $join, $column = null, $where = null)
{
return $this->aggregate('avg', $table, $join, $column, $where);
}
public function max($table, $join, $column = null, $where = null)
{
return $this->aggregate('max', $table, $join, $column, $where);
}
public function min($table, $join, $column = null, $where = null)
{
return $this->aggregate('min', $table, $join, $column, $where);
}
public function sum($table, $join, $column = null, $where = null)
{
return $this->aggregate('sum', $table, $join, $column, $where);
}
public function action($actions)
{
if (is_callable($actions))
{
$this->pdo->beginTransaction();
try {
$result = $actions($this);
if ($result === false)
{
$this->pdo->rollBack();
}
else
{
$this->pdo->commit();
}
}
catch (Exception $e) {
$this->pdo->rollBack();
throw $e;
}
return $result;
}
return false;
}
public function id()
{
if ($this->statement == null)
{
return null;
}
$type = $this->type;
if ($type === 'oracle')
{
return 0;
}
elseif ($type === 'pgsql')
{
return $this->pdo->query('SELECT LASTVAL()')->fetchColumn();
}
$lastId = $this->pdo->lastInsertId();
if ($lastId != "0" && $lastId != "")
{
return $lastId;
}
return null;
}
public function debug()
{
$this->debug_mode = true;
return $this;
}
public function error()
{
return $this->errorInfo;
}
public function last()
{
$log = end($this->logs);
return $this->generate($log[ 0 ], $log[ 1 ]);
}
public function log()
{
return array_map(function ($log)
{
return $this->generate($log[ 0 ], $log[ 1 ]);
},
$this->logs
);
}
public function info()
{
$output = [
'server' => 'SERVER_INFO',
'driver' => 'DRIVER_NAME',
'client' => 'CLIENT_VERSION',
'version' => 'SERVER_VERSION',
'connection' => 'CONNECTION_STATUS'
];
foreach ($output as $key => $value)
{
$output[ $key ] = @$this->pdo->getAttribute(constant('PDO::ATTR_' . $value));
}
$output[ 'dsn' ] = $this->dsn;
return $output;
}
}
+445
View File
@@ -0,0 +1,445 @@
<?php
/*
* This file is part of Composer.
*
* (c) Nils Adermann <naderman@naderman.de>
* Jordi Boggiano <j.boggiano@seld.be>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Composer\Autoload;
/**
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
*
* $loader = new \Composer\Autoload\ClassLoader();
*
* // register classes with namespaces
* $loader->add('Symfony\Component', __DIR__.'/component');
* $loader->add('Symfony', __DIR__.'/framework');
*
* // activate the autoloader
* $loader->register();
*
* // to enable searching the include path (eg. for PEAR packages)
* $loader->setUseIncludePath(true);
*
* In this example, if you try to use a class in the Symfony\Component
* namespace or one of its children (Symfony\Component\Console for instance),
* the autoloader will first look for the class under the component/
* directory, and it will then fallback to the framework/ directory if not
* found before giving up.
*
* This class is loosely based on the Symfony UniversalClassLoader.
*
* @author Fabien Potencier <fabien@symfony.com>
* @author Jordi Boggiano <j.boggiano@seld.be>
* @see https://www.php-fig.org/psr/psr-0/
* @see https://www.php-fig.org/psr/psr-4/
*/
class ClassLoader
{
// PSR-4
private $prefixLengthsPsr4 = array();
private $prefixDirsPsr4 = array();
private $fallbackDirsPsr4 = array();
// PSR-0
private $prefixesPsr0 = array();
private $fallbackDirsPsr0 = array();
private $useIncludePath = false;
private $classMap = array();
private $classMapAuthoritative = false;
private $missingClasses = array();
private $apcuPrefix;
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
}
return array();
}
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
public function getClassMap()
{
return $this->classMap;
}
/**
* @param array $classMap Class to filename map
*/
public function addClassMap(array $classMap)
{
if ($this->classMap) {
$this->classMap = array_merge($this->classMap, $classMap);
} else {
$this->classMap = $classMap;
}
}
/**
* Registers a set of PSR-0 directories for a given prefix, either
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*/
public function add($prefix, $paths, $prepend = false)
{
if (!$prefix) {
if ($prepend) {
$this->fallbackDirsPsr0 = array_merge(
(array) $paths,
$this->fallbackDirsPsr0
);
} else {
$this->fallbackDirsPsr0 = array_merge(
$this->fallbackDirsPsr0,
(array) $paths
);
}
return;
}
$first = $prefix[0];
if (!isset($this->prefixesPsr0[$first][$prefix])) {
$this->prefixesPsr0[$first][$prefix] = (array) $paths;
return;
}
if ($prepend) {
$this->prefixesPsr0[$first][$prefix] = array_merge(
(array) $paths,
$this->prefixesPsr0[$first][$prefix]
);
} else {
$this->prefixesPsr0[$first][$prefix] = array_merge(
$this->prefixesPsr0[$first][$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-4 directories for a given namespace, either
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
if (!$prefix) {
// Register directories for the root namespace.
if ($prepend) {
$this->fallbackDirsPsr4 = array_merge(
(array) $paths,
$this->fallbackDirsPsr4
);
} else {
$this->fallbackDirsPsr4 = array_merge(
$this->fallbackDirsPsr4,
(array) $paths
);
}
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
// Register directories for a new namespace.
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
} elseif ($prepend) {
// Prepend directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
(array) $paths,
$this->prefixDirsPsr4[$prefix]
);
} else {
// Append directories for an already registered namespace.
$this->prefixDirsPsr4[$prefix] = array_merge(
$this->prefixDirsPsr4[$prefix],
(array) $paths
);
}
}
/**
* Registers a set of PSR-0 directories for a given prefix,
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param array|string $paths The PSR-0 base directories
*/
public function set($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr0 = (array) $paths;
} else {
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
}
}
/**
* Registers a set of PSR-4 directories for a given namespace,
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param array|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*/
public function setPsr4($prefix, $paths)
{
if (!$prefix) {
$this->fallbackDirsPsr4 = (array) $paths;
} else {
$length = strlen($prefix);
if ('\\' !== $prefix[$length - 1]) {
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
}
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
$this->prefixDirsPsr4[$prefix] = (array) $paths;
}
}
/**
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*/
public function setUseIncludePath($useIncludePath)
{
$this->useIncludePath = $useIncludePath;
}
/**
* Can be used to check if the autoloader uses the include path to check
* for classes.
*
* @return bool
*/
public function getUseIncludePath()
{
return $this->useIncludePath;
}
/**
* Turns off searching the prefix and fallback directories for classes
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
$this->classMapAuthoritative = $classMapAuthoritative;
}
/**
* Should class lookup fail if not found in the current class map?
*
* @return bool
*/
public function isClassMapAuthoritative()
{
return $this->classMapAuthoritative;
}
/**
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*/
public function setApcuPrefix($apcuPrefix)
{
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
}
/**
* The APCu prefix in use, or null if APCu caching is not enabled.
*
* @return string|null
*/
public function getApcuPrefix()
{
return $this->apcuPrefix;
}
/**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
}
/**
* Unregisters this instance as an autoloader.
*/
public function unregister()
{
spl_autoload_unregister(array($this, 'loadClass'));
}
/**
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return bool|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
includeFile($file);
return true;
}
}
/**
* Finds the path to the file where the class is defined.
*
* @param string $class The name of the class
*
* @return string|false The path if found, false otherwise
*/
public function findFile($class)
{
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
}
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
if (null !== $this->apcuPrefix) {
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
if ($hit) {
return $file;
}
}
$file = $this->findFileWithExtension($class, '.php');
// Search for Hack files if we are running on HHVM
if (false === $file && defined('HHVM_VERSION')) {
$file = $this->findFileWithExtension($class, '.hh');
}
if (null !== $this->apcuPrefix) {
apcu_add($this->apcuPrefix.$class, $file);
}
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
}
return $file;
}
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
$first = $class[0];
if (isset($this->prefixLengthsPsr4[$first])) {
$subPath = $class;
while (false !== $lastPos = strrpos($subPath, '\\')) {
$subPath = substr($subPath, 0, $lastPos);
$search = $subPath . '\\';
if (isset($this->prefixDirsPsr4[$search])) {
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
foreach ($this->prefixDirsPsr4[$search] as $dir) {
if (file_exists($file = $dir . $pathEnd)) {
return $file;
}
}
}
}
}
// PSR-4 fallback dirs
foreach ($this->fallbackDirsPsr4 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
return $file;
}
}
// PSR-0 lookup
if (false !== $pos = strrpos($class, '\\')) {
// namespaced class name
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
} else {
// PEAR-like class name
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
}
if (isset($this->prefixesPsr0[$first])) {
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
if (0 === strpos($class, $prefix)) {
foreach ($dirs as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
}
}
}
// PSR-0 fallback dirs
foreach ($this->fallbackDirsPsr0 as $dir) {
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
return $file;
}
}
// PSR-0 include paths.
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
return $file;
}
return false;
}
}
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*/
function includeFile($file)
{
include $file;
}
+833
View File
@@ -0,0 +1,833 @@
<?php
namespace Composer;
use Composer\Semver\VersionParser;
class InstalledVersions
{
private static $installed = array (
'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
'name' => 'sammo-hid/sammo',
),
'versions' =>
array (
'brandonwamboldt/utilphp' =>
array (
'pretty_version' => '1.1.0',
'version' => '1.1.0.0',
'aliases' =>
array (
),
'reference' => '36c32efc4f0679c05163464a550f45c8d83fe683',
),
'catfan/medoo' =>
array (
'pretty_version' => 'v1.7.10',
'version' => '1.7.10.0',
'aliases' =>
array (
),
'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f',
),
'composer/semver' =>
array (
'pretty_version' => '3.2.6',
'version' => '3.2.6.0',
'aliases' =>
array (
),
'reference' => '83e511e247de329283478496f7a1e114c9517506',
),
'composer/xdebug-handler' =>
array (
'pretty_version' => '2.0.2',
'version' => '2.0.2.0',
'aliases' =>
array (
),
'reference' => '84674dd3a7575ba617f5a76d7e9e29a7d3891339',
),
'doctrine/inflector' =>
array (
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'aliases' =>
array (
),
'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89',
),
'erusev/parsedown' =>
array (
'pretty_version' => '1.7.4',
'version' => '1.7.4.0',
'aliases' =>
array (
),
'reference' => 'cb17b6477dfff935958ba01325f2e8a2bfa6dab3',
),
'erusev/parsedown-extra' =>
array (
'pretty_version' => '0.8.1',
'version' => '0.8.1.0',
'aliases' =>
array (
),
'reference' => '91ac3ff98f0cea243bdccc688df43810f044dcef',
),
'ezyang/htmlpurifier' =>
array (
'pretty_version' => 'v4.13.0',
'version' => '4.13.0.0',
'aliases' =>
array (
),
'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75',
),
'felixfbecker/advanced-json-rpc' =>
array (
'pretty_version' => 'v3.2.1',
'version' => '3.2.1.0',
'aliases' =>
array (
),
'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447',
),
'firephp/firephp-core' =>
array (
'pretty_version' => 'v0.4.0',
'version' => '0.4.0.0',
'aliases' =>
array (
),
'reference' => 'fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf',
),
'guzzlehttp/guzzle' =>
array (
'pretty_version' => '6.5.5',
'version' => '6.5.5.0',
'aliases' =>
array (
),
'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e',
),
'guzzlehttp/promises' =>
array (
'pretty_version' => '1.5.1',
'version' => '1.5.1.0',
'aliases' =>
array (
),
'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
),
'guzzlehttp/psr7' =>
array (
'pretty_version' => '1.8.3',
'version' => '1.8.3.0',
'aliases' =>
array (
),
'reference' => '1afdd860a2566ed3c2b0b4a3de6e23434a79ec85',
),
'illuminate/bus' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'be400399687b97d5558a224e970060fd5d5f2735',
),
'illuminate/collections' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '05f286ec5fd2dd286e8384577047efc375c8954c',
),
'illuminate/container' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d',
),
'illuminate/contracts' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'e76f4bce73a2a1656add24bd5210ebc4b8af49c0',
),
'illuminate/database' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '43c7ffb6299ae55b000b286cf1278afd268ef29f',
),
'illuminate/events' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'b7f06cafb6c09581617f2ca05d69e9b159e5a35d',
),
'illuminate/macroable' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '300aa13c086f25116b5f3cde3ca54ff5c822fb05',
),
'illuminate/pipeline' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '23aeff5b26ae4aee3f370835c76bd0f4e93f71d2',
),
'illuminate/support' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'a8851b7001530d3c11626a81449ed9b63dd10db7',
),
'league/plates' =>
array (
'pretty_version' => 'v3.4.0',
'version' => '3.4.0.0',
'aliases' =>
array (
),
'reference' => '6d3ee31199b536a4e003b34a356ca20f6f75496a',
),
'microsoft/tolerant-php-parser' =>
array (
'pretty_version' => 'v0.1.1',
'version' => '0.1.1.0',
'aliases' =>
array (
),
'reference' => '6a965617cf484355048ac6d2d3de7b6ec93abb16',
),
'monolog/monolog' =>
array (
'pretty_version' => '1.26.1',
'version' => '1.26.1.0',
'aliases' =>
array (
),
'reference' => 'c6b00f05152ae2c9b04a448f99c7590beb6042f5',
),
'nesbot/carbon' =>
array (
'pretty_version' => '2.54.0',
'version' => '2.54.0.0',
'aliases' =>
array (
),
'reference' => 'eed83939f1aed3eee517d03a33f5ec587ac529b5',
),
'netresearch/jsonmapper' =>
array (
'pretty_version' => 'v4.0.0',
'version' => '4.0.0.0',
'aliases' =>
array (
),
'reference' => '8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d',
),
'nette/caching' =>
array (
'pretty_version' => 'v3.1.1',
'version' => '3.1.1.0',
'aliases' =>
array (
),
'reference' => '3e771c589dee414724be473c24ad16dae50c1960',
),
'nette/finder' =>
array (
'pretty_version' => 'v2.5.2',
'version' => '2.5.2.0',
'aliases' =>
array (
),
'reference' => '4ad2c298eb8c687dd0e74ae84206a4186eeaed50',
),
'nette/utils' =>
array (
'pretty_version' => 'v3.2.5',
'version' => '3.2.5.0',
'aliases' =>
array (
),
'reference' => '9cd80396ca58d7969ab44fc7afcf03624dfa526e',
),
'pguardiario/phpuri' =>
array (
'pretty_version' => '1.0',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => 'ad0a5ec033fe616cfef55578b9c7f2458be8fbfc',
),
'phan/phan' =>
array (
'pretty_version' => '5.2.1',
'version' => '5.2.1.0',
'aliases' =>
array (
),
'reference' => 'd724bbb8fc3ba89179868bb5220ecdf6a9c1636b',
),
'php-extended/php-system' =>
array (
'pretty_version' => '1.4.0',
'version' => '1.4.0.0',
'aliases' =>
array (
),
'reference' => '9e6b3c2009ef56dc123efc43900e40cdf217ace0',
),
'php-extended/php-tail' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'aliases' =>
array (
),
'reference' => '19fbd3a79ccc071954f28296b2c44754335304a0',
),
'phpdocumentor/reflection-common' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'aliases' =>
array (
),
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
),
'phpdocumentor/reflection-docblock' =>
array (
'pretty_version' => '5.3.0',
'version' => '5.3.0.0',
'aliases' =>
array (
),
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
),
'phpdocumentor/type-resolver' =>
array (
'pretty_version' => '1.5.1',
'version' => '1.5.1.0',
'aliases' =>
array (
),
'reference' => 'a12f7e301eb7258bb68acd89d4aefa05c2906cae',
),
'psr/container' =>
array (
'pretty_version' => '1.1.2',
'version' => '1.1.2.0',
'aliases' =>
array (
),
'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
),
'psr/container-implementation' =>
array (
'provided' =>
array (
0 => '1.0',
),
),
'psr/http-message' =>
array (
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'aliases' =>
array (
),
'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
),
'psr/http-message-implementation' =>
array (
'provided' =>
array (
0 => '1.0',
),
),
'psr/log' =>
array (
'pretty_version' => '1.1.4',
'version' => '1.1.4.0',
'aliases' =>
array (
),
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
),
'psr/log-implementation' =>
array (
'provided' =>
array (
0 => '1.0.0',
1 => '1.0|2.0',
),
),
'psr/simple-cache' =>
array (
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'aliases' =>
array (
),
'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
),
'ralouphie/getallheaders' =>
array (
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'aliases' =>
array (
),
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
),
'sabre/event' =>
array (
'pretty_version' => '5.1.4',
'version' => '5.1.4.0',
'aliases' =>
array (
),
'reference' => 'd7da22897125d34d7eddf7977758191c06a74497',
),
'sammo-hid/sammo' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
),
'sergeytsalkov/meekrodb' =>
array (
'pretty_version' => 'v2.4',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => 'e30c240d54bc81f58c58507a9ed768032eb494a5',
),
'spatie/data-transfer-object' =>
array (
'pretty_version' => '3.7.3',
'version' => '3.7.3.0',
'aliases' =>
array (
),
'reference' => '341f72c77e0fce40ea2e0dcb212cb54dc27bbe72',
),
'symfony/console' =>
array (
'pretty_version' => 'v5.3.10',
'version' => '5.3.10.0',
'aliases' =>
array (
),
'reference' => 'd4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3',
),
'symfony/deprecation-contracts' =>
array (
'pretty_version' => 'v2.4.0',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627',
),
'symfony/lock' =>
array (
'pretty_version' => 'v4.4.33',
'version' => '4.4.33.0',
'aliases' =>
array (
),
'reference' => '567d29b1bc6e3937652054dafc069151d17824a9',
),
'symfony/polyfill-ctype' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '46cd95797e9df938fdd2b03693b5fca5e64b01ce',
),
'symfony/polyfill-intl-grapheme' =>
array (
'pretty_version' => 'v1.23.1',
'version' => '1.23.1.0',
'aliases' =>
array (
),
'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535',
),
'symfony/polyfill-intl-idn' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '65bd267525e82759e7d8c4e8ceea44f398838e65',
),
'symfony/polyfill-intl-normalizer' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
),
'symfony/polyfill-mbstring' =>
array (
'pretty_version' => 'v1.23.1',
'version' => '1.23.1.0',
'aliases' =>
array (
),
'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6',
),
'symfony/polyfill-php72' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976',
),
'symfony/polyfill-php73' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => 'fba8933c384d6476ab14fb7b8526e5287ca7e010',
),
'symfony/polyfill-php80' =>
array (
'pretty_version' => 'v1.23.1',
'version' => '1.23.1.0',
'aliases' =>
array (
),
'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be',
),
'symfony/service-contracts' =>
array (
'pretty_version' => 'v2.4.0',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => 'f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb',
),
'symfony/string' =>
array (
'pretty_version' => 'v5.3.10',
'version' => '5.3.10.0',
'aliases' =>
array (
),
'reference' => 'd70c35bb20bbca71fc4ab7921e3c6bda1a82a60c',
),
'symfony/translation' =>
array (
'pretty_version' => 'v5.3.10',
'version' => '5.3.10.0',
'aliases' =>
array (
),
'reference' => '6ef197aea2ac8b9cd63e0da7522b3771714035aa',
),
'symfony/translation-contracts' =>
array (
'pretty_version' => 'v2.4.0',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => '95c812666f3e91db75385749fe219c5e494c7f95',
),
'symfony/translation-implementation' =>
array (
'provided' =>
array (
0 => '2.3',
),
),
'tysonandre/var_representation_polyfill' =>
array (
'pretty_version' => '0.1.1',
'version' => '0.1.1.0',
'aliases' =>
array (
),
'reference' => '0a942e74e18af5514749895507bc6ca7ab96399a',
),
'vlucas/valitron' =>
array (
'pretty_version' => 'v1.4.10',
'version' => '1.4.10.0',
'aliases' =>
array (
),
'reference' => '5ebd5d7af82cc0a9d798e816a2ecad63f1b59ceb',
),
'voku/portable-ascii' =>
array (
'pretty_version' => '1.5.6',
'version' => '1.5.6.0',
'aliases' =>
array (
),
'reference' => '80953678b19901e5165c56752d087fc11526017c',
),
'webmozart/assert' =>
array (
'pretty_version' => '1.10.0',
'version' => '1.10.0.0',
'aliases' =>
array (
),
'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
),
'xemlock/htmlpurifier-html5' =>
array (
'pretty_version' => 'v0.1.11',
'version' => '0.1.11.0',
'aliases' =>
array (
),
'reference' => 'f0d563f9fd4a82a3d759043483f9a94c0d8c2255',
),
),
);
public static function getInstalledPackages()
{
return array_keys(self::$installed['versions']);
}
public static function isInstalled($packageName)
{
return isset(self::$installed['versions'][$packageName]);
}
public static function satisfies(VersionParser $parser, $packageName, $constraint)
{
$constraint = $parser->parseConstraints($constraint);
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
return $provided->matches($constraint);
}
public static function getVersionRanges($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
$ranges = array();
if (isset(self::$installed['versions'][$packageName]['pretty_version'])) {
$ranges[] = self::$installed['versions'][$packageName]['pretty_version'];
}
if (array_key_exists('aliases', self::$installed['versions'][$packageName])) {
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['aliases']);
}
if (array_key_exists('replaced', self::$installed['versions'][$packageName])) {
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['replaced']);
}
if (array_key_exists('provided', self::$installed['versions'][$packageName])) {
$ranges = array_merge($ranges, self::$installed['versions'][$packageName]['provided']);
}
return implode(' || ', $ranges);
}
public static function getVersion($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
if (!isset(self::$installed['versions'][$packageName]['version'])) {
return null;
}
return self::$installed['versions'][$packageName]['version'];
}
public static function getPrettyVersion($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
if (!isset(self::$installed['versions'][$packageName]['pretty_version'])) {
return null;
}
return self::$installed['versions'][$packageName]['pretty_version'];
}
public static function getReference($packageName)
{
if (!isset(self::$installed['versions'][$packageName])) {
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
if (!isset(self::$installed['versions'][$packageName]['reference'])) {
return null;
}
return self::$installed['versions'][$packageName]['reference'];
}
public static function getRootPackage()
{
return self::$installed['root'];
}
public static function getRawData()
{
return self::$installed;
}
public static function reload($data)
{
self::$installed = $data;
}
}
+21
View File
@@ -0,0 +1,21 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished
to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
+122
View File
@@ -0,0 +1,122 @@
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Attribute' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
'DB' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'DBTransaction' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'FB' => $vendorDir . '/firephp/firephp-core/lib/FirePHPCore/fb.php',
'FirePHP' => $vendorDir . '/firephp/firephp-core/lib/FirePHPCore/FirePHP.class.php',
'HTMLPurifier_AttrDef_Float' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/Float.php',
'HTMLPurifier_AttrDef_HTML5_ARel' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/ARel.php',
'HTMLPurifier_AttrDef_HTML5_Datetime' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Datetime.php',
'HTMLPurifier_AttrDef_HTML5_Duration' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Duration.php',
'HTMLPurifier_AttrDef_HTML5_Week' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Week.php',
'HTMLPurifier_AttrDef_HTML5_YearlessDate' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/YearlessDate.php',
'HTMLPurifier_AttrDef_HTML_Bool2' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML/Bool2.php',
'HTMLPurifier_AttrTransform_HTML5_Dialog' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Dialog.php',
'HTMLPurifier_AttrTransform_HTML5_Progress' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Progress.php',
'HTMLPurifier_AttrTransform_HTML5_Script' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Script.php',
'HTMLPurifier_ChildDef_HTML5_Abstract' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Abstract.php',
'HTMLPurifier_ChildDef_HTML5_Details' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Details.php',
'HTMLPurifier_ChildDef_HTML5_Fieldset' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Fieldset.php',
'HTMLPurifier_ChildDef_HTML5_Figure' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Figure.php',
'HTMLPurifier_ChildDef_HTML5_Media' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Media.php',
'HTMLPurifier_ChildDef_HTML5_Picture' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Picture.php',
'HTMLPurifier_ChildDef_HTML5_Script' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Script.php',
'HTMLPurifier_ChildDef_HTML5_Time' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Time.php',
'HTMLPurifier_HTML5Config' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Config.php',
'HTMLPurifier_HTML5Definition' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Definition.php',
'HTMLPurifier_HTMLModule_HTML5_Bdo' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Bdo.php',
'HTMLPurifier_HTMLModule_HTML5_Edit' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Edit.php',
'HTMLPurifier_HTMLModule_HTML5_Forms' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Forms.php',
'HTMLPurifier_HTMLModule_HTML5_Hypertext' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Hypertext.php',
'HTMLPurifier_HTMLModule_HTML5_Iframe' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Iframe.php',
'HTMLPurifier_HTMLModule_HTML5_Interactive' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Interactive.php',
'HTMLPurifier_HTMLModule_HTML5_List' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/List.php',
'HTMLPurifier_HTMLModule_HTML5_Media' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Media.php',
'HTMLPurifier_HTMLModule_HTML5_Ruby' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Ruby.php',
'HTMLPurifier_HTMLModule_HTML5_SafeScripting' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/SafeScripting.php',
'HTMLPurifier_HTMLModule_HTML5_Scripting' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Scripting.php',
'HTMLPurifier_HTMLModule_HTML5_Text' => $vendorDir . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Text.php',
'JsonException' => $vendorDir . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'MeekroDB' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'MeekroDBEval' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'MeekroDBException' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'MeekroDBWalk' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'Nette\\ArgumentOutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\Bridges\\CacheDI\\CacheExtension' => $vendorDir . '/nette/caching/src/Bridges/CacheDI/CacheExtension.php',
'Nette\\Bridges\\CacheLatte\\CacheMacro' => $vendorDir . '/nette/caching/src/Bridges/CacheLatte/CacheMacro.php',
'Nette\\Caching\\BulkReader' => $vendorDir . '/nette/caching/src/Caching/BulkReader.php',
'Nette\\Caching\\Cache' => $vendorDir . '/nette/caching/src/Caching/Cache.php',
'Nette\\Caching\\IBulkReader' => $vendorDir . '/nette/caching/src/compatibility.php',
'Nette\\Caching\\IStorage' => $vendorDir . '/nette/caching/src/compatibility.php',
'Nette\\Caching\\OutputHelper' => $vendorDir . '/nette/caching/src/Caching/OutputHelper.php',
'Nette\\Caching\\Storage' => $vendorDir . '/nette/caching/src/Caching/Storage.php',
'Nette\\Caching\\Storages\\DevNullStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/DevNullStorage.php',
'Nette\\Caching\\Storages\\FileStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/FileStorage.php',
'Nette\\Caching\\Storages\\IJournal' => $vendorDir . '/nette/caching/src/compatibility.php',
'Nette\\Caching\\Storages\\Journal' => $vendorDir . '/nette/caching/src/Caching/Storages/Journal.php',
'Nette\\Caching\\Storages\\MemcachedStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/MemcachedStorage.php',
'Nette\\Caching\\Storages\\MemoryStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/MemoryStorage.php',
'Nette\\Caching\\Storages\\NewMemcachedStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/NewMemcachedStorage.php',
'Nette\\Caching\\Storages\\SQLiteJournal' => $vendorDir . '/nette/caching/src/Caching/Storages/SQLiteJournal.php',
'Nette\\Caching\\Storages\\SQLiteStorage' => $vendorDir . '/nette/caching/src/Caching/Storages/SQLiteStorage.php',
'Nette\\DeprecatedException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\DirectoryNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\FileNotFoundException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\HtmlStringable' => $vendorDir . '/nette/utils/src/HtmlStringable.php',
'Nette\\IOException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\InvalidArgumentException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\InvalidStateException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\Iterators\\CachingIterator' => $vendorDir . '/nette/utils/src/Iterators/CachingIterator.php',
'Nette\\Iterators\\Mapper' => $vendorDir . '/nette/utils/src/Iterators/Mapper.php',
'Nette\\Localization\\ITranslator' => $vendorDir . '/nette/utils/src/compatibility.php',
'Nette\\Localization\\Translator' => $vendorDir . '/nette/utils/src/Translator.php',
'Nette\\MemberAccessException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\NotImplementedException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\NotSupportedException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\OutOfRangeException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\SmartObject' => $vendorDir . '/nette/utils/src/SmartObject.php',
'Nette\\StaticClass' => $vendorDir . '/nette/utils/src/StaticClass.php',
'Nette\\UnexpectedValueException' => $vendorDir . '/nette/utils/src/exceptions.php',
'Nette\\Utils\\ArrayHash' => $vendorDir . '/nette/utils/src/Utils/ArrayHash.php',
'Nette\\Utils\\ArrayList' => $vendorDir . '/nette/utils/src/Utils/ArrayList.php',
'Nette\\Utils\\Arrays' => $vendorDir . '/nette/utils/src/Utils/Arrays.php',
'Nette\\Utils\\AssertionException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Callback' => $vendorDir . '/nette/utils/src/Utils/Callback.php',
'Nette\\Utils\\DateTime' => $vendorDir . '/nette/utils/src/Utils/DateTime.php',
'Nette\\Utils\\FileSystem' => $vendorDir . '/nette/utils/src/Utils/FileSystem.php',
'Nette\\Utils\\Finder' => $vendorDir . '/nette/finder/src/Utils/Finder.php',
'Nette\\Utils\\Floats' => $vendorDir . '/nette/utils/src/Utils/Floats.php',
'Nette\\Utils\\Helpers' => $vendorDir . '/nette/utils/src/Utils/Helpers.php',
'Nette\\Utils\\Html' => $vendorDir . '/nette/utils/src/Utils/Html.php',
'Nette\\Utils\\IHtmlString' => $vendorDir . '/nette/utils/src/compatibility.php',
'Nette\\Utils\\Image' => $vendorDir . '/nette/utils/src/Utils/Image.php',
'Nette\\Utils\\ImageException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Json' => $vendorDir . '/nette/utils/src/Utils/Json.php',
'Nette\\Utils\\JsonException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\ObjectHelpers' => $vendorDir . '/nette/utils/src/Utils/ObjectHelpers.php',
'Nette\\Utils\\ObjectMixin' => $vendorDir . '/nette/utils/src/Utils/ObjectMixin.php',
'Nette\\Utils\\Paginator' => $vendorDir . '/nette/utils/src/Utils/Paginator.php',
'Nette\\Utils\\Random' => $vendorDir . '/nette/utils/src/Utils/Random.php',
'Nette\\Utils\\Reflection' => $vendorDir . '/nette/utils/src/Utils/Reflection.php',
'Nette\\Utils\\RegexpException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Strings' => $vendorDir . '/nette/utils/src/Utils/Strings.php',
'Nette\\Utils\\Type' => $vendorDir . '/nette/utils/src/Utils/Type.php',
'Nette\\Utils\\UnknownImageFileException' => $vendorDir . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Validators' => $vendorDir . '/nette/utils/src/Utils/Validators.php',
'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
'Stringable' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
'UnhandledMatchError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'ValueError' => $vendorDir . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
'WhereClause' => $vendorDir . '/sergeytsalkov/meekrodb/db.class.php',
'kakao\\KakaoKey' => $baseDir . '/d_setting/KakaoKey.php',
'sammo\\RootDB' => $baseDir . '/d_setting/RootDB.php',
'sammo\\ServConfig' => $baseDir . '/d_setting/ServConfig.php',
);
+34
View File
@@ -0,0 +1,34 @@
<?php
// autoload_files.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
'60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php',
'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php',
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',
'2b9d0f43f9552984cfa82fee95491826' => $vendorDir . '/sabre/event/lib/coroutine.php',
'd81bab31d3feb45bfe2f283ea3c8fdf7' => $vendorDir . '/sabre/event/lib/Loop/functions.php',
'a1cce3d26cc15c00fcd0b3354bd72c88' => $vendorDir . '/sabre/event/lib/Promise/functions.php',
'7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
'25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
'2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php',
'6714be961f4a45ae8b9a99d5d55c5d07' => $vendorDir . '/tysonandre/var_representation_polyfill/src/var_representation.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
'ef65a1626449d89d0811cf9befce46f0' => $vendorDir . '/illuminate/events/functions.php',
'5b154887902198b16314243c6e0e3e19' => $vendorDir . '/pguardiario/phpuri/phpuri.php',
'870dc64919afa8b0f700701bb2c6a783' => $baseDir . '/f_config/config.php',
);
+14
View File
@@ -0,0 +1,14 @@
<?php
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'utilphp\\' => array($vendorDir . '/brandonwamboldt/utilphp/src'),
'ParsedownExtra' => array($vendorDir . '/erusev/parsedown-extra'),
'Parsedown' => array($vendorDir . '/erusev/parsedown'),
'JsonMapper' => array($vendorDir . '/netresearch/jsonmapper/src'),
'HTMLPurifier' => array($vendorDir . '/ezyang/htmlpurifier/library'),
);
+58
View File
@@ -0,0 +1,58 @@
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'voku\\' => array($vendorDir . '/voku/portable-ascii/src/voku'),
'sammo\\' => array($baseDir . '/src/sammo'),
'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/reflection-docblock/src', $vendorDir . '/phpdocumentor/type-resolver/src'),
'kakao\\' => array($baseDir . '/src/kakao'),
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
'VarRepresentation\\' => array($vendorDir . '/tysonandre/var_representation_polyfill/src/VarRepresentation'),
'Valitron\\' => array($vendorDir . '/vlucas/valitron/src/Valitron'),
'Symfony\\Polyfill\\Php80\\' => array($vendorDir . '/symfony/polyfill-php80'),
'Symfony\\Polyfill\\Php73\\' => array($vendorDir . '/symfony/polyfill-php73'),
'Symfony\\Polyfill\\Php72\\' => array($vendorDir . '/symfony/polyfill-php72'),
'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'),
'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
'Symfony\\Polyfill\\Intl\\Grapheme\\' => array($vendorDir . '/symfony/polyfill-intl-grapheme'),
'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
'Symfony\\Contracts\\Translation\\' => array($vendorDir . '/symfony/translation-contracts'),
'Symfony\\Contracts\\Service\\' => array($vendorDir . '/symfony/service-contracts'),
'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
'Symfony\\Component\\String\\' => array($vendorDir . '/symfony/string'),
'Symfony\\Component\\Lock\\' => array($vendorDir . '/symfony/lock'),
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
'Spatie\\DataTransferObject\\' => array($vendorDir . '/spatie/data-transfer-object/src'),
'Sabre\\Event\\' => array($vendorDir . '/sabre/event/lib'),
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
'PhpExtended\\Tail\\' => array($vendorDir . '/php-extended/php-tail/src'),
'PhpExtended\\System\\' => array($vendorDir . '/php-extended/php-system/src'),
'Phan\\' => array($vendorDir . '/phan/phan/src/Phan'),
'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
'Microsoft\\PhpParser\\' => array($vendorDir . '/microsoft/tolerant-php-parser/src'),
'Medoo\\' => array($vendorDir . '/catfan/medoo/src'),
'League\\Plates\\' => array($vendorDir . '/league/plates/src'),
'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/support'),
'Illuminate\\Pipeline\\' => array($vendorDir . '/illuminate/pipeline'),
'Illuminate\\Events\\' => array($vendorDir . '/illuminate/events'),
'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'),
'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'),
'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'),
'Illuminate\\Bus\\' => array($vendorDir . '/illuminate/bus'),
'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
'Doctrine\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib/Doctrine/Inflector'),
'Composer\\XdebugHandler\\' => array($vendorDir . '/composer/xdebug-handler/src'),
'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'),
'Carbon\\' => array($vendorDir . '/nesbot/carbon/src/Carbon'),
'AdvancedJsonRpc\\' => array($vendorDir . '/felixfbecker/advanced-json-rpc/lib'),
);
+75
View File
@@ -0,0 +1,75 @@
<?php
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a
{
private static $loader;
public static function loadClassLoader($class)
{
if ('Composer\Autoload\ClassLoader' === $class) {
require __DIR__ . '/ClassLoader.php';
}
}
/**
* @return \Composer\Autoload\ClassLoader
*/
public static function getLoader()
{
if (null !== self::$loader) {
return self::$loader;
}
require __DIR__ . '/platform_check.php';
spl_autoload_register(array('ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit67b09c83b85c3bc0027caefe5bba171a', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire67b09c83b85c3bc0027caefe5bba171a($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequire67b09c83b85c3bc0027caefe5bba171a($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}
+498
View File
@@ -0,0 +1,498 @@
<?php
// autoload_static.php @generated by Composer
namespace Composer\Autoload;
class ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
'60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php',
'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php',
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
'2b9d0f43f9552984cfa82fee95491826' => __DIR__ . '/..' . '/sabre/event/lib/coroutine.php',
'd81bab31d3feb45bfe2f283ea3c8fdf7' => __DIR__ . '/..' . '/sabre/event/lib/Loop/functions.php',
'a1cce3d26cc15c00fcd0b3354bd72c88' => __DIR__ . '/..' . '/sabre/event/lib/Promise/functions.php',
'7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
'25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
'2cffec82183ee1cea088009cef9a6fc3' => __DIR__ . '/..' . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php',
'6714be961f4a45ae8b9a99d5d55c5d07' => __DIR__ . '/..' . '/tysonandre/var_representation_polyfill/src/var_representation.php',
'37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
'ef65a1626449d89d0811cf9befce46f0' => __DIR__ . '/..' . '/illuminate/events/functions.php',
'5b154887902198b16314243c6e0e3e19' => __DIR__ . '/..' . '/pguardiario/phpuri/phpuri.php',
'870dc64919afa8b0f700701bb2c6a783' => __DIR__ . '/../..' . '/f_config/config.php',
);
public static $prefixLengthsPsr4 = array (
'v' =>
array (
'voku\\' => 5,
),
's' =>
array (
'sammo\\' => 6,
),
'p' =>
array (
'phpDocumentor\\Reflection\\' => 25,
),
'k' =>
array (
'kakao\\' => 6,
),
'W' =>
array (
'Webmozart\\Assert\\' => 17,
),
'V' =>
array (
'VarRepresentation\\' => 18,
'Valitron\\' => 9,
),
'S' =>
array (
'Symfony\\Polyfill\\Php80\\' => 23,
'Symfony\\Polyfill\\Php73\\' => 23,
'Symfony\\Polyfill\\Php72\\' => 23,
'Symfony\\Polyfill\\Mbstring\\' => 26,
'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33,
'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
'Symfony\\Polyfill\\Intl\\Grapheme\\' => 31,
'Symfony\\Polyfill\\Ctype\\' => 23,
'Symfony\\Contracts\\Translation\\' => 30,
'Symfony\\Contracts\\Service\\' => 26,
'Symfony\\Component\\Translation\\' => 30,
'Symfony\\Component\\String\\' => 25,
'Symfony\\Component\\Lock\\' => 23,
'Symfony\\Component\\Console\\' => 26,
'Spatie\\DataTransferObject\\' => 26,
'Sabre\\Event\\' => 12,
),
'P' =>
array (
'Psr\\SimpleCache\\' => 16,
'Psr\\Log\\' => 8,
'Psr\\Http\\Message\\' => 17,
'Psr\\Container\\' => 14,
'PhpExtended\\Tail\\' => 17,
'PhpExtended\\System\\' => 19,
'Phan\\' => 5,
),
'M' =>
array (
'Monolog\\' => 8,
'Microsoft\\PhpParser\\' => 20,
'Medoo\\' => 6,
),
'L' =>
array (
'League\\Plates\\' => 14,
),
'I' =>
array (
'Illuminate\\Support\\' => 19,
'Illuminate\\Pipeline\\' => 20,
'Illuminate\\Events\\' => 18,
'Illuminate\\Database\\' => 20,
'Illuminate\\Contracts\\' => 21,
'Illuminate\\Container\\' => 21,
'Illuminate\\Bus\\' => 15,
),
'G' =>
array (
'GuzzleHttp\\Psr7\\' => 16,
'GuzzleHttp\\Promise\\' => 19,
'GuzzleHttp\\' => 11,
),
'D' =>
array (
'Doctrine\\Inflector\\' => 19,
),
'C' =>
array (
'Composer\\XdebugHandler\\' => 23,
'Composer\\Semver\\' => 16,
'Carbon\\' => 7,
),
'A' =>
array (
'AdvancedJsonRpc\\' => 16,
),
);
public static $prefixDirsPsr4 = array (
'voku\\' =>
array (
0 => __DIR__ . '/..' . '/voku/portable-ascii/src/voku',
),
'sammo\\' =>
array (
0 => __DIR__ . '/../..' . '/src/sammo',
),
'phpDocumentor\\Reflection\\' =>
array (
0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
1 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
2 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
),
'kakao\\' =>
array (
0 => __DIR__ . '/../..' . '/src/kakao',
),
'Webmozart\\Assert\\' =>
array (
0 => __DIR__ . '/..' . '/webmozart/assert/src',
),
'VarRepresentation\\' =>
array (
0 => __DIR__ . '/..' . '/tysonandre/var_representation_polyfill/src/VarRepresentation',
),
'Valitron\\' =>
array (
0 => __DIR__ . '/..' . '/vlucas/valitron/src/Valitron',
),
'Symfony\\Polyfill\\Php80\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-php80',
),
'Symfony\\Polyfill\\Php73\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-php73',
),
'Symfony\\Polyfill\\Php72\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-php72',
),
'Symfony\\Polyfill\\Mbstring\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
),
'Symfony\\Polyfill\\Intl\\Normalizer\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer',
),
'Symfony\\Polyfill\\Intl\\Idn\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn',
),
'Symfony\\Polyfill\\Intl\\Grapheme\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme',
),
'Symfony\\Polyfill\\Ctype\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
),
'Symfony\\Contracts\\Translation\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/translation-contracts',
),
'Symfony\\Contracts\\Service\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/service-contracts',
),
'Symfony\\Component\\Translation\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/translation',
),
'Symfony\\Component\\String\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/string',
),
'Symfony\\Component\\Lock\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/lock',
),
'Symfony\\Component\\Console\\' =>
array (
0 => __DIR__ . '/..' . '/symfony/console',
),
'Spatie\\DataTransferObject\\' =>
array (
0 => __DIR__ . '/..' . '/spatie/data-transfer-object/src',
),
'Sabre\\Event\\' =>
array (
0 => __DIR__ . '/..' . '/sabre/event/lib',
),
'Psr\\SimpleCache\\' =>
array (
0 => __DIR__ . '/..' . '/psr/simple-cache/src',
),
'Psr\\Log\\' =>
array (
0 => __DIR__ . '/..' . '/psr/log/Psr/Log',
),
'Psr\\Http\\Message\\' =>
array (
0 => __DIR__ . '/..' . '/psr/http-message/src',
),
'Psr\\Container\\' =>
array (
0 => __DIR__ . '/..' . '/psr/container/src',
),
'PhpExtended\\Tail\\' =>
array (
0 => __DIR__ . '/..' . '/php-extended/php-tail/src',
),
'PhpExtended\\System\\' =>
array (
0 => __DIR__ . '/..' . '/php-extended/php-system/src',
),
'Phan\\' =>
array (
0 => __DIR__ . '/..' . '/phan/phan/src/Phan',
),
'Monolog\\' =>
array (
0 => __DIR__ . '/..' . '/monolog/monolog/src/Monolog',
),
'Microsoft\\PhpParser\\' =>
array (
0 => __DIR__ . '/..' . '/microsoft/tolerant-php-parser/src',
),
'Medoo\\' =>
array (
0 => __DIR__ . '/..' . '/catfan/medoo/src',
),
'League\\Plates\\' =>
array (
0 => __DIR__ . '/..' . '/league/plates/src',
),
'Illuminate\\Support\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/collections',
1 => __DIR__ . '/..' . '/illuminate/macroable',
2 => __DIR__ . '/..' . '/illuminate/support',
),
'Illuminate\\Pipeline\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/pipeline',
),
'Illuminate\\Events\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/events',
),
'Illuminate\\Database\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/database',
),
'Illuminate\\Contracts\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/contracts',
),
'Illuminate\\Container\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/container',
),
'Illuminate\\Bus\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/bus',
),
'GuzzleHttp\\Psr7\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src',
),
'GuzzleHttp\\Promise\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/promises/src',
),
'GuzzleHttp\\' =>
array (
0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src',
),
'Doctrine\\Inflector\\' =>
array (
0 => __DIR__ . '/..' . '/doctrine/inflector/lib/Doctrine/Inflector',
),
'Composer\\XdebugHandler\\' =>
array (
0 => __DIR__ . '/..' . '/composer/xdebug-handler/src',
),
'Composer\\Semver\\' =>
array (
0 => __DIR__ . '/..' . '/composer/semver/src',
),
'Carbon\\' =>
array (
0 => __DIR__ . '/..' . '/nesbot/carbon/src/Carbon',
),
'AdvancedJsonRpc\\' =>
array (
0 => __DIR__ . '/..' . '/felixfbecker/advanced-json-rpc/lib',
),
);
public static $prefixesPsr0 = array (
'u' =>
array (
'utilphp\\' =>
array (
0 => __DIR__ . '/..' . '/brandonwamboldt/utilphp/src',
),
),
'P' =>
array (
'ParsedownExtra' =>
array (
0 => __DIR__ . '/..' . '/erusev/parsedown-extra',
),
'Parsedown' =>
array (
0 => __DIR__ . '/..' . '/erusev/parsedown',
),
),
'J' =>
array (
'JsonMapper' =>
array (
0 => __DIR__ . '/..' . '/netresearch/jsonmapper/src',
),
),
'H' =>
array (
'HTMLPurifier' =>
array (
0 => __DIR__ . '/..' . '/ezyang/htmlpurifier/library',
),
),
);
public static $classMap = array (
'Attribute' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Attribute.php',
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
'DB' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'DBTransaction' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'FB' => __DIR__ . '/..' . '/firephp/firephp-core/lib/FirePHPCore/fb.php',
'FirePHP' => __DIR__ . '/..' . '/firephp/firephp-core/lib/FirePHPCore/FirePHP.class.php',
'HTMLPurifier_AttrDef_Float' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/Float.php',
'HTMLPurifier_AttrDef_HTML5_ARel' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/ARel.php',
'HTMLPurifier_AttrDef_HTML5_Datetime' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Datetime.php',
'HTMLPurifier_AttrDef_HTML5_Duration' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Duration.php',
'HTMLPurifier_AttrDef_HTML5_Week' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/Week.php',
'HTMLPurifier_AttrDef_HTML5_YearlessDate' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML5/YearlessDate.php',
'HTMLPurifier_AttrDef_HTML_Bool2' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrDef/HTML/Bool2.php',
'HTMLPurifier_AttrTransform_HTML5_Dialog' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Dialog.php',
'HTMLPurifier_AttrTransform_HTML5_Progress' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Progress.php',
'HTMLPurifier_AttrTransform_HTML5_Script' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/AttrTransform/HTML5/Script.php',
'HTMLPurifier_ChildDef_HTML5_Abstract' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Abstract.php',
'HTMLPurifier_ChildDef_HTML5_Details' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Details.php',
'HTMLPurifier_ChildDef_HTML5_Fieldset' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Fieldset.php',
'HTMLPurifier_ChildDef_HTML5_Figure' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Figure.php',
'HTMLPurifier_ChildDef_HTML5_Media' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Media.php',
'HTMLPurifier_ChildDef_HTML5_Picture' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Picture.php',
'HTMLPurifier_ChildDef_HTML5_Script' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Script.php',
'HTMLPurifier_ChildDef_HTML5_Time' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/ChildDef/HTML5/Time.php',
'HTMLPurifier_HTML5Config' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Config.php',
'HTMLPurifier_HTML5Definition' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTML5Definition.php',
'HTMLPurifier_HTMLModule_HTML5_Bdo' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Bdo.php',
'HTMLPurifier_HTMLModule_HTML5_Edit' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Edit.php',
'HTMLPurifier_HTMLModule_HTML5_Forms' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Forms.php',
'HTMLPurifier_HTMLModule_HTML5_Hypertext' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Hypertext.php',
'HTMLPurifier_HTMLModule_HTML5_Iframe' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Iframe.php',
'HTMLPurifier_HTMLModule_HTML5_Interactive' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Interactive.php',
'HTMLPurifier_HTMLModule_HTML5_List' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/List.php',
'HTMLPurifier_HTMLModule_HTML5_Media' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Media.php',
'HTMLPurifier_HTMLModule_HTML5_Ruby' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Ruby.php',
'HTMLPurifier_HTMLModule_HTML5_SafeScripting' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/SafeScripting.php',
'HTMLPurifier_HTMLModule_HTML5_Scripting' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Scripting.php',
'HTMLPurifier_HTMLModule_HTML5_Text' => __DIR__ . '/..' . '/xemlock/htmlpurifier-html5/library/HTMLPurifier/HTMLModule/HTML5/Text.php',
'JsonException' => __DIR__ . '/..' . '/symfony/polyfill-php73/Resources/stubs/JsonException.php',
'MeekroDB' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'MeekroDBEval' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'MeekroDBException' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'MeekroDBWalk' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'Nette\\ArgumentOutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\Bridges\\CacheDI\\CacheExtension' => __DIR__ . '/..' . '/nette/caching/src/Bridges/CacheDI/CacheExtension.php',
'Nette\\Bridges\\CacheLatte\\CacheMacro' => __DIR__ . '/..' . '/nette/caching/src/Bridges/CacheLatte/CacheMacro.php',
'Nette\\Caching\\BulkReader' => __DIR__ . '/..' . '/nette/caching/src/Caching/BulkReader.php',
'Nette\\Caching\\Cache' => __DIR__ . '/..' . '/nette/caching/src/Caching/Cache.php',
'Nette\\Caching\\IBulkReader' => __DIR__ . '/..' . '/nette/caching/src/compatibility.php',
'Nette\\Caching\\IStorage' => __DIR__ . '/..' . '/nette/caching/src/compatibility.php',
'Nette\\Caching\\OutputHelper' => __DIR__ . '/..' . '/nette/caching/src/Caching/OutputHelper.php',
'Nette\\Caching\\Storage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storage.php',
'Nette\\Caching\\Storages\\DevNullStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/DevNullStorage.php',
'Nette\\Caching\\Storages\\FileStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/FileStorage.php',
'Nette\\Caching\\Storages\\IJournal' => __DIR__ . '/..' . '/nette/caching/src/compatibility.php',
'Nette\\Caching\\Storages\\Journal' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/Journal.php',
'Nette\\Caching\\Storages\\MemcachedStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/MemcachedStorage.php',
'Nette\\Caching\\Storages\\MemoryStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/MemoryStorage.php',
'Nette\\Caching\\Storages\\NewMemcachedStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/NewMemcachedStorage.php',
'Nette\\Caching\\Storages\\SQLiteJournal' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/SQLiteJournal.php',
'Nette\\Caching\\Storages\\SQLiteStorage' => __DIR__ . '/..' . '/nette/caching/src/Caching/Storages/SQLiteStorage.php',
'Nette\\DeprecatedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\DirectoryNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\FileNotFoundException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\HtmlStringable' => __DIR__ . '/..' . '/nette/utils/src/HtmlStringable.php',
'Nette\\IOException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\InvalidArgumentException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\InvalidStateException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\Iterators\\CachingIterator' => __DIR__ . '/..' . '/nette/utils/src/Iterators/CachingIterator.php',
'Nette\\Iterators\\Mapper' => __DIR__ . '/..' . '/nette/utils/src/Iterators/Mapper.php',
'Nette\\Localization\\ITranslator' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php',
'Nette\\Localization\\Translator' => __DIR__ . '/..' . '/nette/utils/src/Translator.php',
'Nette\\MemberAccessException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\NotImplementedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\NotSupportedException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\OutOfRangeException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\SmartObject' => __DIR__ . '/..' . '/nette/utils/src/SmartObject.php',
'Nette\\StaticClass' => __DIR__ . '/..' . '/nette/utils/src/StaticClass.php',
'Nette\\UnexpectedValueException' => __DIR__ . '/..' . '/nette/utils/src/exceptions.php',
'Nette\\Utils\\ArrayHash' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayHash.php',
'Nette\\Utils\\ArrayList' => __DIR__ . '/..' . '/nette/utils/src/Utils/ArrayList.php',
'Nette\\Utils\\Arrays' => __DIR__ . '/..' . '/nette/utils/src/Utils/Arrays.php',
'Nette\\Utils\\AssertionException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Callback' => __DIR__ . '/..' . '/nette/utils/src/Utils/Callback.php',
'Nette\\Utils\\DateTime' => __DIR__ . '/..' . '/nette/utils/src/Utils/DateTime.php',
'Nette\\Utils\\FileSystem' => __DIR__ . '/..' . '/nette/utils/src/Utils/FileSystem.php',
'Nette\\Utils\\Finder' => __DIR__ . '/..' . '/nette/finder/src/Utils/Finder.php',
'Nette\\Utils\\Floats' => __DIR__ . '/..' . '/nette/utils/src/Utils/Floats.php',
'Nette\\Utils\\Helpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/Helpers.php',
'Nette\\Utils\\Html' => __DIR__ . '/..' . '/nette/utils/src/Utils/Html.php',
'Nette\\Utils\\IHtmlString' => __DIR__ . '/..' . '/nette/utils/src/compatibility.php',
'Nette\\Utils\\Image' => __DIR__ . '/..' . '/nette/utils/src/Utils/Image.php',
'Nette\\Utils\\ImageException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Json' => __DIR__ . '/..' . '/nette/utils/src/Utils/Json.php',
'Nette\\Utils\\JsonException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\ObjectHelpers' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectHelpers.php',
'Nette\\Utils\\ObjectMixin' => __DIR__ . '/..' . '/nette/utils/src/Utils/ObjectMixin.php',
'Nette\\Utils\\Paginator' => __DIR__ . '/..' . '/nette/utils/src/Utils/Paginator.php',
'Nette\\Utils\\Random' => __DIR__ . '/..' . '/nette/utils/src/Utils/Random.php',
'Nette\\Utils\\Reflection' => __DIR__ . '/..' . '/nette/utils/src/Utils/Reflection.php',
'Nette\\Utils\\RegexpException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Strings' => __DIR__ . '/..' . '/nette/utils/src/Utils/Strings.php',
'Nette\\Utils\\Type' => __DIR__ . '/..' . '/nette/utils/src/Utils/Type.php',
'Nette\\Utils\\UnknownImageFileException' => __DIR__ . '/..' . '/nette/utils/src/Utils/exceptions.php',
'Nette\\Utils\\Validators' => __DIR__ . '/..' . '/nette/utils/src/Utils/Validators.php',
'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php',
'Stringable' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/Stringable.php',
'UnhandledMatchError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/UnhandledMatchError.php',
'ValueError' => __DIR__ . '/..' . '/symfony/polyfill-php80/Resources/stubs/ValueError.php',
'WhereClause' => __DIR__ . '/..' . '/sergeytsalkov/meekrodb/db.class.php',
'kakao\\KakaoKey' => __DIR__ . '/../..' . '/d_setting/KakaoKey.php',
'sammo\\RootDB' => __DIR__ . '/../..' . '/d_setting/RootDB.php',
'sammo\\ServConfig' => __DIR__ . '/../..' . '/d_setting/ServConfig.php',
);
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$prefixDirsPsr4;
$loader->prefixesPsr0 = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$prefixesPsr0;
$loader->classMap = ComposerStaticInit67b09c83b85c3bc0027caefe5bba171a::$classMap;
}, null, ClassLoader::class);
}
}
+4378
View File
File diff suppressed because it is too large Load Diff
+638
View File
@@ -0,0 +1,638 @@
<?php return array (
'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
'name' => 'sammo-hid/sammo',
),
'versions' =>
array (
'brandonwamboldt/utilphp' =>
array (
'pretty_version' => '1.1.0',
'version' => '1.1.0.0',
'aliases' =>
array (
),
'reference' => '36c32efc4f0679c05163464a550f45c8d83fe683',
),
'catfan/medoo' =>
array (
'pretty_version' => 'v1.7.10',
'version' => '1.7.10.0',
'aliases' =>
array (
),
'reference' => '2d675f73e23f63bbaeb9a8aa33318659a3d3c32f',
),
'composer/semver' =>
array (
'pretty_version' => '3.2.6',
'version' => '3.2.6.0',
'aliases' =>
array (
),
'reference' => '83e511e247de329283478496f7a1e114c9517506',
),
'composer/xdebug-handler' =>
array (
'pretty_version' => '2.0.2',
'version' => '2.0.2.0',
'aliases' =>
array (
),
'reference' => '84674dd3a7575ba617f5a76d7e9e29a7d3891339',
),
'doctrine/inflector' =>
array (
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'aliases' =>
array (
),
'reference' => '8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89',
),
'erusev/parsedown' =>
array (
'pretty_version' => '1.7.4',
'version' => '1.7.4.0',
'aliases' =>
array (
),
'reference' => 'cb17b6477dfff935958ba01325f2e8a2bfa6dab3',
),
'erusev/parsedown-extra' =>
array (
'pretty_version' => '0.8.1',
'version' => '0.8.1.0',
'aliases' =>
array (
),
'reference' => '91ac3ff98f0cea243bdccc688df43810f044dcef',
),
'ezyang/htmlpurifier' =>
array (
'pretty_version' => 'v4.13.0',
'version' => '4.13.0.0',
'aliases' =>
array (
),
'reference' => '08e27c97e4c6ed02f37c5b2b20488046c8d90d75',
),
'felixfbecker/advanced-json-rpc' =>
array (
'pretty_version' => 'v3.2.1',
'version' => '3.2.1.0',
'aliases' =>
array (
),
'reference' => 'b5f37dbff9a8ad360ca341f3240dc1c168b45447',
),
'firephp/firephp-core' =>
array (
'pretty_version' => 'v0.4.0',
'version' => '0.4.0.0',
'aliases' =>
array (
),
'reference' => 'fabad0f2503f9577fe8dd2cb1d1c7cd73ed2aacf',
),
'guzzlehttp/guzzle' =>
array (
'pretty_version' => '6.5.5',
'version' => '6.5.5.0',
'aliases' =>
array (
),
'reference' => '9d4290de1cfd701f38099ef7e183b64b4b7b0c5e',
),
'guzzlehttp/promises' =>
array (
'pretty_version' => '1.5.1',
'version' => '1.5.1.0',
'aliases' =>
array (
),
'reference' => 'fe752aedc9fd8fcca3fe7ad05d419d32998a06da',
),
'guzzlehttp/psr7' =>
array (
'pretty_version' => '1.8.3',
'version' => '1.8.3.0',
'aliases' =>
array (
),
'reference' => '1afdd860a2566ed3c2b0b4a3de6e23434a79ec85',
),
'illuminate/bus' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'be400399687b97d5558a224e970060fd5d5f2735',
),
'illuminate/collections' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '05f286ec5fd2dd286e8384577047efc375c8954c',
),
'illuminate/container' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d',
),
'illuminate/contracts' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'e76f4bce73a2a1656add24bd5210ebc4b8af49c0',
),
'illuminate/database' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '43c7ffb6299ae55b000b286cf1278afd268ef29f',
),
'illuminate/events' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'b7f06cafb6c09581617f2ca05d69e9b159e5a35d',
),
'illuminate/macroable' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '300aa13c086f25116b5f3cde3ca54ff5c822fb05',
),
'illuminate/pipeline' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => '23aeff5b26ae4aee3f370835c76bd0f4e93f71d2',
),
'illuminate/support' =>
array (
'pretty_version' => 'v8.69.0',
'version' => '8.69.0.0',
'aliases' =>
array (
),
'reference' => 'a8851b7001530d3c11626a81449ed9b63dd10db7',
),
'league/plates' =>
array (
'pretty_version' => 'v3.4.0',
'version' => '3.4.0.0',
'aliases' =>
array (
),
'reference' => '6d3ee31199b536a4e003b34a356ca20f6f75496a',
),
'microsoft/tolerant-php-parser' =>
array (
'pretty_version' => 'v0.1.1',
'version' => '0.1.1.0',
'aliases' =>
array (
),
'reference' => '6a965617cf484355048ac6d2d3de7b6ec93abb16',
),
'monolog/monolog' =>
array (
'pretty_version' => '1.26.1',
'version' => '1.26.1.0',
'aliases' =>
array (
),
'reference' => 'c6b00f05152ae2c9b04a448f99c7590beb6042f5',
),
'nesbot/carbon' =>
array (
'pretty_version' => '2.54.0',
'version' => '2.54.0.0',
'aliases' =>
array (
),
'reference' => 'eed83939f1aed3eee517d03a33f5ec587ac529b5',
),
'netresearch/jsonmapper' =>
array (
'pretty_version' => 'v4.0.0',
'version' => '4.0.0.0',
'aliases' =>
array (
),
'reference' => '8bbc021a8edb2e4a7ea2f8ad4fa9ec9dce2fcb8d',
),
'nette/caching' =>
array (
'pretty_version' => 'v3.1.1',
'version' => '3.1.1.0',
'aliases' =>
array (
),
'reference' => '3e771c589dee414724be473c24ad16dae50c1960',
),
'nette/finder' =>
array (
'pretty_version' => 'v2.5.2',
'version' => '2.5.2.0',
'aliases' =>
array (
),
'reference' => '4ad2c298eb8c687dd0e74ae84206a4186eeaed50',
),
'nette/utils' =>
array (
'pretty_version' => 'v3.2.5',
'version' => '3.2.5.0',
'aliases' =>
array (
),
'reference' => '9cd80396ca58d7969ab44fc7afcf03624dfa526e',
),
'pguardiario/phpuri' =>
array (
'pretty_version' => '1.0',
'version' => '1.0.0.0',
'aliases' =>
array (
),
'reference' => 'ad0a5ec033fe616cfef55578b9c7f2458be8fbfc',
),
'phan/phan' =>
array (
'pretty_version' => '5.2.1',
'version' => '5.2.1.0',
'aliases' =>
array (
),
'reference' => 'd724bbb8fc3ba89179868bb5220ecdf6a9c1636b',
),
'php-extended/php-system' =>
array (
'pretty_version' => '1.4.0',
'version' => '1.4.0.0',
'aliases' =>
array (
),
'reference' => '9e6b3c2009ef56dc123efc43900e40cdf217ace0',
),
'php-extended/php-tail' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'aliases' =>
array (
),
'reference' => '19fbd3a79ccc071954f28296b2c44754335304a0',
),
'phpdocumentor/reflection-common' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'aliases' =>
array (
),
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
),
'phpdocumentor/reflection-docblock' =>
array (
'pretty_version' => '5.3.0',
'version' => '5.3.0.0',
'aliases' =>
array (
),
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
),
'phpdocumentor/type-resolver' =>
array (
'pretty_version' => '1.5.1',
'version' => '1.5.1.0',
'aliases' =>
array (
),
'reference' => 'a12f7e301eb7258bb68acd89d4aefa05c2906cae',
),
'psr/container' =>
array (
'pretty_version' => '1.1.2',
'version' => '1.1.2.0',
'aliases' =>
array (
),
'reference' => '513e0666f7216c7459170d56df27dfcefe1689ea',
),
'psr/container-implementation' =>
array (
'provided' =>
array (
0 => '1.0',
),
),
'psr/http-message' =>
array (
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'aliases' =>
array (
),
'reference' => 'f6561bf28d520154e4b0ec72be95418abe6d9363',
),
'psr/http-message-implementation' =>
array (
'provided' =>
array (
0 => '1.0',
),
),
'psr/log' =>
array (
'pretty_version' => '1.1.4',
'version' => '1.1.4.0',
'aliases' =>
array (
),
'reference' => 'd49695b909c3b7628b6289db5479a1c204601f11',
),
'psr/log-implementation' =>
array (
'provided' =>
array (
0 => '1.0.0',
1 => '1.0|2.0',
),
),
'psr/simple-cache' =>
array (
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'aliases' =>
array (
),
'reference' => '408d5eafb83c57f6365a3ca330ff23aa4a5fa39b',
),
'ralouphie/getallheaders' =>
array (
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'aliases' =>
array (
),
'reference' => '120b605dfeb996808c31b6477290a714d356e822',
),
'sabre/event' =>
array (
'pretty_version' => '5.1.4',
'version' => '5.1.4.0',
'aliases' =>
array (
),
'reference' => 'd7da22897125d34d7eddf7977758191c06a74497',
),
'sammo-hid/sammo' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'd75f21035d2d747010efd234b5e7b3a42e0a41fd',
),
'sergeytsalkov/meekrodb' =>
array (
'pretty_version' => 'v2.4',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => 'e30c240d54bc81f58c58507a9ed768032eb494a5',
),
'spatie/data-transfer-object' =>
array (
'pretty_version' => '3.7.3',
'version' => '3.7.3.0',
'aliases' =>
array (
),
'reference' => '341f72c77e0fce40ea2e0dcb212cb54dc27bbe72',
),
'symfony/console' =>
array (
'pretty_version' => 'v5.3.10',
'version' => '5.3.10.0',
'aliases' =>
array (
),
'reference' => 'd4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3',
),
'symfony/deprecation-contracts' =>
array (
'pretty_version' => 'v2.4.0',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => '5f38c8804a9e97d23e0c8d63341088cd8a22d627',
),
'symfony/lock' =>
array (
'pretty_version' => 'v4.4.33',
'version' => '4.4.33.0',
'aliases' =>
array (
),
'reference' => '567d29b1bc6e3937652054dafc069151d17824a9',
),
'symfony/polyfill-ctype' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '46cd95797e9df938fdd2b03693b5fca5e64b01ce',
),
'symfony/polyfill-intl-grapheme' =>
array (
'pretty_version' => 'v1.23.1',
'version' => '1.23.1.0',
'aliases' =>
array (
),
'reference' => '16880ba9c5ebe3642d1995ab866db29270b36535',
),
'symfony/polyfill-intl-idn' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '65bd267525e82759e7d8c4e8ceea44f398838e65',
),
'symfony/polyfill-intl-normalizer' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '8590a5f561694770bdcd3f9b5c69dde6945028e8',
),
'symfony/polyfill-mbstring' =>
array (
'pretty_version' => 'v1.23.1',
'version' => '1.23.1.0',
'aliases' =>
array (
),
'reference' => '9174a3d80210dca8daa7f31fec659150bbeabfc6',
),
'symfony/polyfill-php72' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => '9a142215a36a3888e30d0a9eeea9766764e96976',
),
'symfony/polyfill-php73' =>
array (
'pretty_version' => 'v1.23.0',
'version' => '1.23.0.0',
'aliases' =>
array (
),
'reference' => 'fba8933c384d6476ab14fb7b8526e5287ca7e010',
),
'symfony/polyfill-php80' =>
array (
'pretty_version' => 'v1.23.1',
'version' => '1.23.1.0',
'aliases' =>
array (
),
'reference' => '1100343ed1a92e3a38f9ae122fc0eb21602547be',
),
'symfony/service-contracts' =>
array (
'pretty_version' => 'v2.4.0',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => 'f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb',
),
'symfony/string' =>
array (
'pretty_version' => 'v5.3.10',
'version' => '5.3.10.0',
'aliases' =>
array (
),
'reference' => 'd70c35bb20bbca71fc4ab7921e3c6bda1a82a60c',
),
'symfony/translation' =>
array (
'pretty_version' => 'v5.3.10',
'version' => '5.3.10.0',
'aliases' =>
array (
),
'reference' => '6ef197aea2ac8b9cd63e0da7522b3771714035aa',
),
'symfony/translation-contracts' =>
array (
'pretty_version' => 'v2.4.0',
'version' => '2.4.0.0',
'aliases' =>
array (
),
'reference' => '95c812666f3e91db75385749fe219c5e494c7f95',
),
'symfony/translation-implementation' =>
array (
'provided' =>
array (
0 => '2.3',
),
),
'tysonandre/var_representation_polyfill' =>
array (
'pretty_version' => '0.1.1',
'version' => '0.1.1.0',
'aliases' =>
array (
),
'reference' => '0a942e74e18af5514749895507bc6ca7ab96399a',
),
'vlucas/valitron' =>
array (
'pretty_version' => 'v1.4.10',
'version' => '1.4.10.0',
'aliases' =>
array (
),
'reference' => '5ebd5d7af82cc0a9d798e816a2ecad63f1b59ceb',
),
'voku/portable-ascii' =>
array (
'pretty_version' => '1.5.6',
'version' => '1.5.6.0',
'aliases' =>
array (
),
'reference' => '80953678b19901e5165c56752d087fc11526017c',
),
'webmozart/assert' =>
array (
'pretty_version' => '1.10.0',
'version' => '1.10.0.0',
'aliases' =>
array (
),
'reference' => '6964c76c7804814a842473e0c8fd15bab0f18e25',
),
'xemlock/htmlpurifier-html5' =>
array (
'pretty_version' => 'v0.1.11',
'version' => '0.1.11.0',
'aliases' =>
array (
),
'reference' => 'f0d563f9fd4a82a3d759043483f9a94c0d8c2255',
),
),
);
+26
View File
@@ -0,0 +1,26 @@
<?php
// platform_check.php @generated by Composer
$issues = array();
if (!(PHP_VERSION_ID >= 80000)) {
$issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.';
}
if ($issues) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
} elseif (!headers_sent()) {
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
}
}
trigger_error(
'Composer detected issues in your platform: ' . implode(' ', $issues),
E_USER_ERROR
);
}

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