diff --git a/bin/json/game_enchantboss.json b/bin/json/game_enchantboss.json
new file mode 100644
index 000000000..605a683ac
--- /dev/null
+++ b/bin/json/game_enchantboss.json
@@ -0,0 +1,2018 @@
+[
+ {
+ "id": 101,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "SSS",
+ "score_low": 6666667,
+ "score_up": 99999999,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 102,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "SS",
+ "score_low": 3500001,
+ "score_up": 6666666,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 2
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 2
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 2
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 2
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 2
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301014,
+ 301015,
+ 301016
+ ]
+ },
+ {
+ "id": 103,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "S",
+ "score_low": 1800001,
+ "score_up": 3500000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 3
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 3
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 3
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 3
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 3
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301017,
+ 301018,
+ 301019
+ ]
+ },
+ {
+ "id": 104,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "A+",
+ "score_low": 800001,
+ "score_up": 1800000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 4
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 4
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 4
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 4
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 4
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 105,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "A",
+ "score_low": 350001,
+ "score_up": 800000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 5
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 5
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 5
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 5
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 5
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 106,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "B",
+ "score_low": 100001,
+ "score_up": 350000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 6
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 6
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 6
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 6
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 6
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301014,
+ 301015,
+ 301016
+ ]
+ },
+ {
+ "id": 107,
+ "bossid": 1,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "C",
+ "score_low": 0,
+ "score_up": 100000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 7
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 7
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 7
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 7
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 7
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text1",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text1",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301017,
+ 301018,
+ 301019
+ ]
+ },
+ {
+ "id": 201,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "SSS",
+ "score_low": 6666667,
+ "score_up": 99999999,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 8
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 8
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 8
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 8
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 8
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 202,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "SS",
+ "score_low": 3500001,
+ "score_up": 6666666,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 9
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 9
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 9
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 9
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 9
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301014,
+ 301015,
+ 301016
+ ]
+ },
+ {
+ "id": 203,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "S",
+ "score_low": 1800001,
+ "score_up": 3500000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 10
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 10
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 10
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 10
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 10
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301017,
+ 301018,
+ 301019
+ ]
+ },
+ {
+ "id": 204,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "A+",
+ "score_low": 800001,
+ "score_up": 1800000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 11
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 11
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 11
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 11
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 11
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 205,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "A",
+ "score_low": 350001,
+ "score_up": 800000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 12
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 12
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 12
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 12
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 12
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 206,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "B",
+ "score_low": 100001,
+ "score_up": 350000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 13
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 13
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 13
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 13
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 13
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301014,
+ 301015,
+ 301016
+ ]
+ },
+ {
+ "id": 207,
+ "bossid": 2,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "C",
+ "score_low": 0,
+ "score_up": 100000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 14
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 14
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 14
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 14
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 14
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text2",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text2",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301017,
+ 301018,
+ 301019
+ ]
+ },
+ {
+ "id": 301,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "SSS",
+ "score_low": 6666667,
+ "score_up": 99999999,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 15
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 15
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 15
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 15
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 15
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 302,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "SS",
+ "score_low": 3500001,
+ "score_up": 6666666,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 16
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 16
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 16
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 16
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 16
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301014,
+ 301015,
+ 301016
+ ]
+ },
+ {
+ "id": 303,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "S",
+ "score_low": 1800001,
+ "score_up": 3500000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 17
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 17
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 17
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 17
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 17
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301017,
+ 301018,
+ 301019
+ ]
+ },
+ {
+ "id": 304,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "A+",
+ "score_low": 800001,
+ "score_up": 1800000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 18
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 18
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 18
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 18
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 18
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 305,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "A",
+ "score_low": 350001,
+ "score_up": 800000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 19
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 19
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 19
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 19
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 19
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301011,
+ 301012,
+ 301013
+ ]
+ },
+ {
+ "id": 306,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "B",
+ "score_low": 100001,
+ "score_up": 350000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 20
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 20
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 20
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 20
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 20
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301014,
+ 301015,
+ 301016
+ ]
+ },
+ {
+ "id": 307,
+ "bossid": 3,
+ "name": {
+ "key": "viking_boss_1001",
+ "text": "火焰泰坦"
+ },
+ "grade": "C",
+ "score_low": 0,
+ "score_up": 100000,
+ "reward_drop": [
+ 10001,
+ 10002
+ ],
+ "dropshow1": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 1
+ }
+ ],
+ "dropshow2": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 21
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 21
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 21
+ }
+ ],
+ "dropshow3": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 21
+ },
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 21
+ }
+ ],
+ "dropshow": [
+ 1000,
+ 900,
+ 78
+ ],
+ "bossmodel": 11009,
+ "main_text": {
+ "key": "main_text3",
+ "text": "BOSS主界面描述"
+ },
+ "strategy_text": {
+ "key": "strategy_text3",
+ "text": "BOSS攻略描述"
+ },
+ "boss_skill": 51004,
+ "boss": [
+ 301017,
+ 301018,
+ 301019
+ ]
+ }
+]
\ No newline at end of file
diff --git a/bin/json/game_enchantshop.json b/bin/json/game_enchantshop.json
new file mode 100644
index 000000000..b66be6731
--- /dev/null
+++ b/bin/json/game_enchantshop.json
@@ -0,0 +1,102 @@
+[
+ {
+ "buynum": 1,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 10
+ }
+ ]
+ },
+ {
+ "buynum": 2,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 20
+ }
+ ]
+ },
+ {
+ "buynum": 3,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 30
+ }
+ ]
+ },
+ {
+ "buynum": 4,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 40
+ }
+ ]
+ },
+ {
+ "buynum": 5,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 50
+ }
+ ]
+ },
+ {
+ "buynum": 6,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 60
+ }
+ ]
+ },
+ {
+ "buynum": 7,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 70
+ }
+ ]
+ },
+ {
+ "buynum": 8,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 80
+ }
+ ]
+ },
+ {
+ "buynum": 9,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 90
+ }
+ ]
+ },
+ {
+ "buynum": 10,
+ "need": [
+ {
+ "a": "attr",
+ "t": "diamond",
+ "n": 100
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/modules/enchant/api.go b/modules/enchant/api.go
new file mode 100644
index 000000000..18eda61f9
--- /dev/null
+++ b/modules/enchant/api.go
@@ -0,0 +1,49 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/lego/core"
+ "go_dreamfactory/modules"
+)
+
+const (
+ HuntingGetListResp = "getlist"
+ HuntingChallengeResp = "challenge"
+ HuntingChallengeOverResp = "challengeover"
+ HuntingSkillLvResp = "skilllv"
+ HuntingGetRewardResp = "getreward"
+ HuntingBuyResp = "buy"
+ HuntingRankListResp = "ranklist"
+)
+
+type apiComp struct {
+ modules.MCompGate
+ service core.IService
+ configure *configureComp
+ module *Hunting
+ friend comm.IFriend
+ chat comm.IChat
+}
+
+//组件初始化接口
+func (this *apiComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
+ err = this.MCompGate.Init(service, module, comp, options)
+ this.module = module.(*Hunting)
+
+ this.service = service
+ return
+}
+
+func (this *apiComp) Start() (err error) {
+ err = this.MCompGate.Start()
+ var module core.IModule
+ if module, err = this.service.GetModule(comm.ModuleFriend); err != nil {
+ return
+ }
+ this.friend = module.(comm.IFriend)
+ if module, err = this.service.GetModule(comm.ModuleChat); err != nil {
+ return
+ }
+ this.chat = module.(comm.IChat)
+ return
+}
diff --git a/modules/enchant/api_buy.go b/modules/enchant/api_buy.go
new file mode 100644
index 000000000..17b24b376
--- /dev/null
+++ b/modules/enchant/api_buy.go
@@ -0,0 +1,137 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/pb"
+ "go_dreamfactory/sys/configure"
+ cfg "go_dreamfactory/sys/configure/structs"
+ "go_dreamfactory/utils"
+
+ "google.golang.org/protobuf/proto"
+)
+
+//参数校验
+func (this *apiComp) BuyCheck(session comm.IUserSession, req *pb.HuntingBuyReq) (code pb.ErrorCode) {
+ if req.Count <= 0 {
+ code = pb.ErrorCode_ReqParameterError
+ return
+ }
+ return
+}
+
+func (this *apiComp) Buy(session comm.IUserSession, req *pb.HuntingBuyReq) (code pb.ErrorCode, data proto.Message) {
+ var (
+ curByCount int32
+ costRes *cfg.Gameatn // 门票atn 类型 只取T
+ mapData map[string]interface{}
+ szCostRes []*cfg.Gameatn // 购买累计消耗
+ curCount int32 // 当前门票数量
+ addCount int32 //获得数量
+ )
+ mapData = make(map[string]interface{}, 0)
+ code = this.BuyCheck(session, req)
+ if code != pb.ErrorCode_Success {
+ return // 参数校验失败直接返回
+ }
+ list, err := this.module.modelHunting.getHuntingList(session.GetUserId())
+ if err != nil {
+ code = pb.ErrorCode_DBError
+ return
+ }
+
+ // 校验是不是今天
+ if !utils.IsToday(list.CTime) {
+ list.CTime = configure.Now().Unix()
+ list.BuyCount = 0
+ mapData["cTime"] = list.CTime
+ mapData["buyCount"] = list.BuyCount
+ } else {
+ curByCount = list.BuyCount
+ }
+ curByCount += req.Count // 当前需要购买的数量
+ if this.configure.GetMaxBuyChallengeCount() < curByCount {
+ code = pb.ErrorCode_HuntingBuyMaxCount
+ return
+ }
+ conf := this.module.configure.GetGlobalConf()
+ if conf == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ costRes = conf.HuntingCos
+ if costRes == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ amount := int32(this.module.ModuleItems.QueryItemAmount(session.GetUserId(), costRes.T)) // 获取当前数量
+ curCount = amount
+ if amount < conf.HuntingNum {
+ if list.RecoveryTime == 0 {
+ list.RecoveryTime = configure.Now().Unix()
+ }
+ for { // 计算恢复时间
+ if list.RecoveryTime+int64(conf.HuntingRecovery*60) <= configure.Now().Unix() {
+ curCount++
+ list.RecoveryTime += int64(conf.HuntingRecovery * 60)
+ if curCount >= conf.HuntingNum {
+ list.RecoveryTime = 0
+ break
+ }
+ } else {
+ break
+ }
+ }
+ if curCount-amount > 0 {
+ addCount = curCount - amount
+ }
+ } else {
+ list.RecoveryTime = 0
+ }
+ addCount += req.Count
+ if amount+addCount > conf.VikingNum {
+ code = pb.ErrorCode_VikingBuyMaxCount
+ return
+ }
+ mapData["recoveryTime"] = list.RecoveryTime
+
+ for i := list.BuyCount + 1; i <= curByCount; i++ {
+ _cfg := this.configure.GetBuyChallengeCount(i)
+ if _cfg == nil {
+ code = pb.ErrorCode_HuntingBuyMaxCount
+ return
+ }
+ szCostRes = append(szCostRes, _cfg.Need...)
+ }
+ sz := make([]*cfg.Gameatn, 0)
+ for _, v := range szCostRes {
+ bFound := false
+ for _, v1 := range sz {
+ if v.A == v1.A && v.T == v1.T {
+ v1.N += v.N
+ bFound = true
+ break
+ }
+ }
+ if !bFound {
+ sz = append(sz, v)
+ }
+ }
+ //消耗
+ if code = this.module.ConsumeRes(session, sz, true); code != pb.ErrorCode_Success {
+ return
+ }
+ res := &cfg.Gameatn{
+ A: "item",
+ T: costRes.T,
+ N: addCount,
+ }
+ if code = this.module.DispenseRes(session, []*cfg.Gameatn{res}, true); code != pb.ErrorCode_Success {
+ return
+ }
+ list.BuyCount = curByCount
+ mapData["buyCount"] = curByCount
+ code = this.module.ModifyHuntingData(session.GetUserId(), mapData)
+
+ session.SendMsg(string(this.module.GetType()), HuntingBuyResp, &pb.HuntingBuyResp{Data: list})
+ return
+}
diff --git a/modules/enchant/api_challenge.go b/modules/enchant/api_challenge.go
new file mode 100644
index 000000000..a3baf53a7
--- /dev/null
+++ b/modules/enchant/api_challenge.go
@@ -0,0 +1,90 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/pb"
+ cfg "go_dreamfactory/sys/configure/structs"
+
+ "google.golang.org/protobuf/proto"
+)
+
+//参数校验
+func (this *apiComp) ChallengeCheck(session comm.IUserSession, req *pb.HuntingChallengeReq) (code pb.ErrorCode) {
+ if req.BossType <= 0 && req.Difficulty > 0 {
+ code = pb.ErrorCode_ReqParameterError
+ return
+ }
+ return
+}
+
+///挑战主线关卡
+func (this *apiComp) Challenge(session comm.IUserSession, req *pb.HuntingChallengeReq) (code pb.ErrorCode, data proto.Message) {
+
+ code = this.ChallengeCheck(session, req)
+ if code != pb.ErrorCode_Success {
+ return // 参数校验失败直接返回
+ }
+
+ hunting, err := this.module.modelHunting.getHuntingList(session.GetUserId())
+ if err != nil {
+ code = pb.ErrorCode_PagodaNotFound
+ return
+ }
+ conf := this.module.configure.GetGlobalConf()
+ if conf == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ costRes := conf.HuntingCos
+ if costRes == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ if code = this.module.CheckRes(session, []*cfg.Gameatn{costRes}); code != pb.ErrorCode_Success {
+ code = pb.ErrorCode_HuntingNoChallengeCount
+ return
+ }
+ // if hunting.ChallengeCount > this.module.configure.GetGlobalConf().HuntingNum+hunting.BuyCount {
+ // code = pb.ErrorCode_HuntingMaxChallengeCount
+ // return
+ // }
+ cfgData := this.module.configure.GetHuntingBossConfigData(req.BossType, req.Difficulty)
+ if cfgData == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ value, ok := hunting.Boss[req.BossType]
+ if !ok { // 类型校验
+ hunting.Boss[req.BossType] = 0
+ }
+ if value < req.Difficulty {
+ if value+1 != req.Difficulty {
+ code = pb.ErrorCode_HuntingLvErr
+ return
+ }
+ }
+
+ code, record := this.module.battle.CreatePveBattle(session, &pb.BattlePVEReq{
+ Ptype: pb.PlayType_hunting,
+ Title: "",
+ Format: &pb.BattleFormation{
+ Leadpos: req.Leadpos,
+ Format: req.Teamids,
+ },
+ Mformat: cfgData.Boss,
+ })
+ if code != pb.ErrorCode_Success {
+ return
+ }
+ session.SendMsg(string(this.module.GetType()), HuntingChallengeResp, &pb.HuntingChallengeResp{
+ Info: &pb.BattleInfo{Id: record.Id, Title: record.Title, Btype: record.Btype, Ptype: record.Ptype, RedCompId: record.RedCompId, Redflist: record.Redflist, BlueCompId: record.BlueCompId, Buleflist: record.Buleflist},
+ BossType: req.BossType,
+ Difficulty: req.Difficulty,
+ })
+ if user := this.module.ModuleUser.GetUser(session.GetUserId()); user != nil {
+ this.chat.SendSysChatToWorld(comm.ChatSystem15, nil, req.BossType, req.Difficulty, user.Name)
+ } else {
+ this.module.Errorf("no found userdata uid:%s", session.GetUserId())
+ }
+ return
+}
diff --git a/modules/enchant/api_challengeover.go b/modules/enchant/api_challengeover.go
new file mode 100644
index 000000000..d3bdd872b
--- /dev/null
+++ b/modules/enchant/api_challengeover.go
@@ -0,0 +1,119 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/pb"
+ "go_dreamfactory/sys/configure"
+ cfg "go_dreamfactory/sys/configure/structs"
+
+ "google.golang.org/protobuf/proto"
+)
+
+//参数校验
+func (this *apiComp) ChallengeOverCheck(session comm.IUserSession, req *pb.HuntingChallengeOverReq) (code pb.ErrorCode) {
+ if req.BossType <= 0 && req.Difficulty > 0 {
+ code = pb.ErrorCode_ReqParameterError
+ return
+ }
+ return
+}
+
+///挑战主线关卡
+func (this *apiComp) ChallengeOver(session comm.IUserSession, req *pb.HuntingChallengeOverReq) (code pb.ErrorCode, data proto.Message) {
+ var (
+ mapData map[string]interface{}
+ newChallenge bool // 新的关卡
+ reward []*cfg.Gameatn
+ bWin bool // 战斗是否胜利
+ )
+ mapData = make(map[string]interface{}, 0)
+ reward = make([]*cfg.Gameatn, 0)
+ code = this.ChallengeOverCheck(session, req)
+ if code != pb.ErrorCode_Success {
+ return // 参数校验失败直接返回
+ }
+
+ hunting, err := this.module.modelHunting.getHuntingList(session.GetUserId())
+ if err != nil {
+ code = pb.ErrorCode_PagodaNotFound
+ return
+ }
+ conf := this.module.configure.GetGlobalConf()
+ if conf == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ costRes := conf.HuntingCos
+ if costRes == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+
+ if code = this.module.CheckRes(session, []*cfg.Gameatn{costRes}); code != pb.ErrorCode_Success {
+ code = pb.ErrorCode_HuntingNoChallengeCount
+ return
+ }
+
+ cfgHunting := this.module.configure.GetHuntingBossConfigData(req.BossType, req.Difficulty)
+ if cfgHunting == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ value, ok := hunting.Boss[req.BossType]
+ if !ok { // 类型校验
+ hunting.Boss[req.BossType] = 0
+ }
+ if value < req.Difficulty {
+ if value+1 != req.Difficulty {
+ code = pb.ErrorCode_HuntingLvErr
+ return
+ }
+ newChallenge = true
+ }
+ // 校验门票数量够不够
+ if code = this.module.ConsumeRes(session, []*cfg.Gameatn{costRes}, true); code != pb.ErrorCode_Success {
+ return
+ }
+ // check
+ code, bWin = this.module.battle.CheckBattleReport(session, req.Report)
+ if code != pb.ErrorCode_Success {
+ return
+ }
+
+ amount := int32(this.module.ModuleItems.QueryItemAmount(session.GetUserId(), costRes.T)) // 获取当前数量
+
+ if amount < conf.HuntingNum {
+ hunting.RecoveryTime = configure.Now().Unix()
+ mapData["recoveryTime"] = hunting.RecoveryTime
+ }
+ if bWin {
+ this.module.CheckRank(session.GetUserId(), req.BossType, req.Difficulty, hunting, req.Report)
+ }
+ // 耗时校验 当前战斗胜利时间消耗小于之前刷新数据
+
+ // 发放通关随机奖励
+ reward = this.module.configure.GetDropReward(cfgHunting.Drop) // 获取掉落奖励
+ if code = this.module.DispenseRes(session, reward, true); code != pb.ErrorCode_Success {
+ return
+ }
+ if newChallenge && bWin { // 新关卡挑战通过 发放首通奖励
+ if code = this.module.DispenseRes(session, cfgHunting.Firstprize, true); code != pb.ErrorCode_Success {
+ return
+ }
+ hunting.Boss[req.BossType] += 1
+ mapData["boss"] = hunting.Boss
+
+ }
+ for k := range hunting.Boss {
+ hunting.Boss[k] += 1
+ }
+ mapData["challengeTime"] = hunting.BossTime
+ code = this.module.ModifyHuntingData(session.GetUserId(), mapData)
+ session.SendMsg(string(this.module.GetType()), HuntingChallengeOverResp, &pb.HuntingChallengeOverResp{Data: hunting})
+
+ // 随机任务统计
+ this.module.ModuleRtask.SendToRtask(session, comm.Rtype81, req.Difficulty, req.BossType)
+ this.module.ModuleRtask.SendToRtask(session, comm.Rtype82, req.BossType)
+
+ return
+}
diff --git a/modules/enchant/api_getlist.go b/modules/enchant/api_getlist.go
new file mode 100644
index 000000000..8b6d7f8ca
--- /dev/null
+++ b/modules/enchant/api_getlist.go
@@ -0,0 +1,95 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/pb"
+ "go_dreamfactory/sys/configure"
+ cfg "go_dreamfactory/sys/configure/structs"
+ "go_dreamfactory/utils"
+
+ "google.golang.org/protobuf/proto"
+)
+
+//参数校验
+func (this *apiComp) GetListCheck(session comm.IUserSession, req *pb.HuntingGetListReq) (code pb.ErrorCode) {
+
+ return
+}
+
+func (this *apiComp) GetList(session comm.IUserSession, req *pb.HuntingGetListReq) (code pb.ErrorCode, data proto.Message) {
+ var (
+ mapData map[string]interface{}
+ curCount int32
+ )
+ mapData = make(map[string]interface{}, 0)
+ code = this.GetListCheck(session, req)
+ if code != pb.ErrorCode_Success {
+ return // 参数校验失败直接返回
+ }
+
+ list, err := this.module.modelHunting.getHuntingList(session.GetUserId())
+ if err != nil {
+ code = pb.ErrorCode_DBError
+ return
+ }
+ // 校验 是不是当天
+ if !utils.IsToday(list.CTime) {
+ list.CTime = configure.Now().Unix()
+ list.BuyCount = 0
+ mapData["cTime"] = list.CTime
+ mapData["buyCount"] = list.BuyCount
+
+ }
+ // 检查恢复时间
+ conf := this.module.configure.GetGlobalConf()
+ if conf == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ costRes := conf.HuntingCos
+ if costRes == nil {
+ code = pb.ErrorCode_ConfigNoFound
+ return
+ }
+ amount := int32(this.module.ModuleItems.QueryItemAmount(session.GetUserId(), costRes.T)) // 获取当前数量
+ curCount = amount
+ if amount < conf.HuntingNum {
+ if list.RecoveryTime == 0 {
+ list.RecoveryTime = configure.Now().Unix()
+ }
+ for { // 计算恢复时间
+ if list.RecoveryTime+int64(conf.HuntingRecovery*60) <= configure.Now().Unix() {
+ curCount++
+ list.RecoveryTime += int64(conf.HuntingRecovery * 60)
+ if curCount >= conf.HuntingNum {
+ list.RecoveryTime = 0
+ break
+ }
+ } else {
+ break
+ }
+ }
+
+ addCount := curCount - amount
+ if addCount > 0 {
+ res := &cfg.Gameatn{
+ A: "item",
+ T: costRes.T,
+ N: addCount,
+ }
+ if code = this.module.DispenseRes(session, []*cfg.Gameatn{res}, true); code != pb.ErrorCode_Success {
+ return
+ }
+ }
+ } else {
+ list.RecoveryTime = 0
+ }
+ mapData["recoveryTime"] = list.RecoveryTime
+ code = this.module.ModifyHuntingData(session.GetUserId(), mapData) //修改内存信息
+ // 发送难度
+ for k := range list.Boss {
+ list.Boss[k] += 1
+ }
+ session.SendMsg(string(this.module.GetType()), HuntingGetListResp, &pb.HuntingGetListResp{Data: list})
+ return
+}
diff --git a/modules/enchant/api_ranklist.go b/modules/enchant/api_ranklist.go
new file mode 100644
index 000000000..85ef360c0
--- /dev/null
+++ b/modules/enchant/api_ranklist.go
@@ -0,0 +1,59 @@
+package enchant
+
+import (
+ "context"
+ "go_dreamfactory/comm"
+ "go_dreamfactory/lego/sys/redis/pipe"
+ "go_dreamfactory/pb"
+ "strconv"
+
+ "github.com/go-redis/redis/v8"
+ "google.golang.org/protobuf/proto"
+)
+
+//参数校验
+func (this *apiComp) RankListCheck(session comm.IUserSession, req *pb.HuntingRankListReq) (code pb.ErrorCode) {
+
+ return
+}
+
+func (this *apiComp) RankList(session comm.IUserSession, req *pb.HuntingRankListReq) (code pb.ErrorCode, data proto.Message) {
+ var (
+ szRank []*pb.DBHuntingRank
+ rd *redis.StringSliceCmd
+ )
+ code = this.RankListCheck(session, req)
+ if code != pb.ErrorCode_Success {
+ return // 参数校验失败直接返回
+ }
+ if !req.Friend {
+ var (
+ pipe *pipe.RedisPipe = this.module.modelHunting.Redis.RedisPipe(context.TODO())
+ )
+ rd = pipe.ZRange("huntingRank"+strconv.Itoa(int(req.BoosType)), 0, -1)
+
+ if _, err := pipe.Exec(); err != nil {
+ this.module.Errorln(err)
+ return
+ }
+ _dataList := rd.Val()
+ for _, v := range _dataList {
+ result := &pb.DBHuntingRank{}
+ if err := this.module.modulerank.GetListObj(session.GetUserId(), v, result); err == nil {
+ szRank = append(szRank, result)
+ }
+ }
+
+ } else {
+ uids := this.friend.GetFriendList(session.GetUserId())
+ for _, id := range uids {
+ rankData := this.module.modulerank.getHuntingRankListByBossType(id, req.BoosType)
+ if rankData != nil {
+ szRank = append(szRank, rankData)
+ }
+ }
+ }
+
+ session.SendMsg(string(this.module.GetType()), HuntingRankListResp, &pb.HuntingRankListResp{Ranks: szRank})
+ return
+}
diff --git a/modules/enchant/comp_configure.go b/modules/enchant/comp_configure.go
new file mode 100644
index 000000000..d7aba3dec
--- /dev/null
+++ b/modules/enchant/comp_configure.go
@@ -0,0 +1,112 @@
+package enchant
+
+import (
+ "go_dreamfactory/lego/core"
+ "go_dreamfactory/lego/sys/log"
+ "go_dreamfactory/modules"
+ "go_dreamfactory/sys/configure"
+ cfg "go_dreamfactory/sys/configure/structs"
+ "sync"
+)
+
+const (
+ game_huntingboss = "game_huntingboss.json"
+ game_challenge = "game_huntingchallenge.json"
+)
+
+///配置管理基础组件
+type configureComp struct {
+ hlock sync.RWMutex
+ modules.MCompConfigure
+ _huntingMap map[int64]*cfg.GameHuntingBossData
+}
+
+//组件初始化接口
+func (this *configureComp) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
+ err = this.MCompConfigure.Init(service, module, comp, options)
+
+ this._huntingMap = make(map[int64]*cfg.GameHuntingBossData, 0)
+ configure.RegisterConfigure(game_huntingboss, cfg.NewGameHuntingBoss, func() {
+ if v, err := this.GetConfigure(game_huntingboss); err == nil {
+ if configure, ok := v.(*cfg.GameHuntingBoss); ok {
+ this.hlock.Lock()
+ defer this.hlock.Unlock()
+ for _, value := range configure.GetDataList() {
+ this._huntingMap[int64(value.Type<<16)+int64(value.Difficulty)] = value
+ }
+ return
+ }
+ } else {
+ log.Errorf("get game_huntingboss conf err:%v", err)
+ }
+ return
+ })
+ err = this.LoadConfigure(game_challenge, cfg.NewGameHuntingChallenge)
+ return
+}
+
+// 参数: boss类型 难度
+func (this *configureComp) GetHuntingBossConfigData(bossType int32, difficulty int32) (data *cfg.GameHuntingBossData) {
+
+ return this._huntingMap[int64(bossType<<16)+int64(difficulty)]
+}
+
+//加载多个配置文件
+func (this *configureComp) LoadMultiConfigure(confs map[string]interface{}) (err error) {
+ for k, v := range confs {
+ err = configure.RegisterConfigure(k, v, nil)
+ if err != nil {
+ log.Errorf("配置文件:%s解析失败!", k)
+ break
+ }
+ }
+ return
+}
+
+//读取配置数据
+func (this *configureComp) GetConfigure(name string) (v interface{}, err error) {
+ return configure.GetConfigure(name)
+}
+
+// get boss Type
+func (this *configureComp) GetHuntingBossTypeConfigData() (mapType map[int32]struct{}) {
+
+ mapType = make(map[int32]struct{}, 0)
+ if v, err := this.GetConfigure(game_huntingboss); err == nil {
+ if configure, ok := v.(*cfg.GameHuntingBoss); ok {
+ this.hlock.Lock()
+ defer this.hlock.Unlock()
+ for _, value := range configure.GetDataList() {
+ if _, ok := mapType[value.Type]; !ok {
+ mapType[value.Type] = struct{}{}
+ }
+ }
+
+ }
+ }
+ return
+}
+
+func (this *configureComp) GetBuyChallengeCount(index int32) (data *cfg.GameHuntingChallengeData) {
+ if v, err := this.GetConfigure(game_challenge); err == nil {
+ if configure, ok := v.(*cfg.GameHuntingChallenge); ok {
+ data = configure.Get(index)
+ return
+ }
+ } else {
+ log.Errorf("get game_challenge conf err:%v", err)
+ }
+
+ return
+}
+func (this *configureComp) GetMaxBuyChallengeCount() int32 {
+ if v, err := this.GetConfigure(game_challenge); err == nil {
+ if configure, ok := v.(*cfg.GameHuntingChallenge); ok {
+ return int32(len(configure.GetDataList()))
+ }
+ } else {
+ log.Errorf("get game_challenge conf err:%v", err)
+ }
+
+ return 0
+}
diff --git a/modules/enchant/model_hunting.go b/modules/enchant/model_hunting.go
new file mode 100644
index 000000000..f468fbbdf
--- /dev/null
+++ b/modules/enchant/model_hunting.go
@@ -0,0 +1,79 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/lego/core"
+ "go_dreamfactory/lego/sys/mgo"
+ "go_dreamfactory/modules"
+ "go_dreamfactory/pb"
+ "strconv"
+
+ "go.mongodb.org/mongo-driver/bson/primitive"
+ "go.mongodb.org/mongo-driver/mongo"
+ "go.mongodb.org/mongo-driver/x/bsonx"
+)
+
+type modelHunting struct {
+ modules.MCompModel
+ module *Hunting
+}
+
+func (this *modelHunting) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
+ this.TableName = string(comm.TableHunting)
+ err = this.MCompModel.Init(service, module, comp, options)
+ this.module = module.(*Hunting)
+ // uid 创建索引
+ this.DB.CreateIndex(core.SqlTable(this.TableName), mongo.IndexModel{
+ Keys: bsonx.Doc{{Key: "uid", Value: bsonx.Int32(1)}},
+ })
+ return
+}
+
+func (this *modelHunting) modifyHuntingDataByObjId(uid string, data map[string]interface{}) error {
+ return this.Change(uid, data)
+}
+
+// 获取列表信息
+func (this *modelHunting) getHuntingList(uid string) (result *pb.DBHunting, err error) {
+ result = &pb.DBHunting{
+ Id: primitive.NewObjectID().Hex(),
+ Uid: uid,
+ Boss: make(map[int32]int32),
+ BossTime: make(map[string]int32),
+ }
+ if err = this.Get(uid, result); err != nil && mgo.MongodbNil != err {
+
+ return
+ }
+ if mgo.MongodbNil == err {
+ if len(result.Boss) == 0 {
+ _cfg := this.module.configure.GetHuntingBossTypeConfigData()
+ for k := range _cfg {
+ result.Boss[k] = 0
+ str := strconv.Itoa(int(k)) + "_1"
+ result.BossTime[str] = 0
+ }
+ }
+ this.Add(uid, result)
+ }
+ err = nil
+ return result, err
+}
+
+// 红点检测
+func (this *modelHunting) checkReddot32(uid string) bool {
+
+ conf := this.module.configure.GetGlobalConf()
+ if conf == nil {
+ return false
+ }
+ costRes := conf.HuntingCos
+ if costRes == nil {
+ return false
+ }
+ amount := int32(this.module.ModuleItems.QueryItemAmount(uid, costRes.T)) // 获取当前数量
+ if amount > 0 {
+ return true
+ }
+ return false
+}
diff --git a/modules/enchant/model_rank.go b/modules/enchant/model_rank.go
new file mode 100644
index 000000000..22f91442d
--- /dev/null
+++ b/modules/enchant/model_rank.go
@@ -0,0 +1,82 @@
+package enchant
+
+import (
+ "context"
+ "go_dreamfactory/comm"
+ "go_dreamfactory/lego/core"
+ "go_dreamfactory/lego/sys/redis/pipe"
+ "go_dreamfactory/modules"
+ "go_dreamfactory/pb"
+ "go_dreamfactory/sys/db"
+
+ "github.com/go-redis/redis/v8"
+)
+
+type ModelRank struct {
+ modules.MCompModel
+ moduleHunting *Hunting
+}
+
+func (this *ModelRank) Init(service core.IService, module core.IModule, comp core.IModuleComp, options core.IModuleOptions) (err error) {
+ this.TableName = comm.TableHuntingRecord // 挑战记录
+ err = this.MCompModel.Init(service, module, comp, options)
+ this.moduleHunting = module.(*Hunting)
+ return
+}
+
+func (this *ModelRank) AddRankList(uId string, objId string, data *pb.DBHuntingRank) (err error) {
+
+ if err = this.AddList(uId, objId, data); err != nil {
+ return
+ }
+ return nil
+}
+
+func (this *ModelRank) getHuntingRankList(uid string) []*pb.DBHuntingRank {
+ ranks := make([]*pb.DBHuntingRank, 0)
+ err := this.GetList(uid, &ranks)
+ if err != nil {
+ return nil
+ }
+ return ranks
+}
+
+func (this *ModelRank) getHuntingRankListByBossType(uid string, bossType int32) *pb.DBHuntingRank {
+ ranks := make([]*pb.DBHuntingRank, 0)
+ err := this.GetList(uid, &ranks)
+ if err != nil {
+ return nil
+ }
+ for _, v := range ranks {
+ if v.Bosstype == bossType {
+ return v
+ }
+ }
+ return nil
+}
+
+// 排行数据写跨服
+func (this *ModelRank) SetRankListData(tableName string, score int32, uid string) {
+ if !db.IsCross() {
+ if conn, err := db.Cross(); err == nil {
+ var (
+ pipe *pipe.RedisPipe = conn.Redis.RedisPipe(context.TODO())
+ menbers *redis.Z
+ )
+
+ menbers = &redis.Z{Score: float64(score), Member: uid}
+
+ if cmd := pipe.ZAdd(tableName, menbers); cmd != nil {
+
+ dock, err1 := cmd.Result()
+ if err1 != nil {
+ this.moduleHunting.Errorln(dock, err1)
+ }
+ }
+ if _, err := pipe.Exec(); err != nil {
+ this.moduleHunting.Errorln(err)
+ return
+ }
+ }
+ }
+}
diff --git a/modules/enchant/module.go b/modules/enchant/module.go
new file mode 100644
index 000000000..5d94d3f49
--- /dev/null
+++ b/modules/enchant/module.go
@@ -0,0 +1,181 @@
+package enchant
+
+import (
+ "go_dreamfactory/comm"
+ "go_dreamfactory/lego/core"
+ "go_dreamfactory/modules"
+ "go_dreamfactory/pb"
+ "go_dreamfactory/sys/db"
+ "strconv"
+ "time"
+
+ "go.mongodb.org/mongo-driver/bson/primitive"
+)
+
+type Hunting struct {
+ modules.ModuleBase
+ modelHunting *modelHunting
+ api *apiComp
+ configure *configureComp
+ modulerank *ModelRank
+ battle comm.IBattle
+ service core.IService
+}
+
+func NewModule() core.IModule {
+ return &Hunting{}
+}
+
+func (this *Hunting) GetType() core.M_Modules {
+ return comm.ModuleHunting
+}
+
+func (this *Hunting) Init(service core.IService, module core.IModule, options core.IModuleOptions) (err error) {
+ err = this.ModuleBase.Init(service, module, options)
+ this.service = service
+ return
+}
+
+func (this *Hunting) Start() (err error) {
+ err = this.ModuleBase.Start()
+ var module core.IModule
+ if module, err = this.service.GetModule(comm.ModuleBattle); err != nil {
+ return
+ }
+
+ this.battle = module.(comm.IBattle)
+ return
+}
+
+func (this *Hunting) OnInstallComp() {
+ this.ModuleBase.OnInstallComp()
+ this.api = this.RegisterComp(new(apiComp)).(*apiComp)
+ this.modelHunting = this.RegisterComp(new(modelHunting)).(*modelHunting)
+ this.modulerank = this.RegisterComp(new(ModelRank)).(*ModelRank)
+ this.configure = this.RegisterComp(new(configureComp)).(*configureComp)
+}
+
+// 接口信息
+func (this *Hunting) ModifyHuntingData(uid string, data map[string]interface{}) (code pb.ErrorCode) {
+ err := this.modelHunting.modifyHuntingDataByObjId(uid, data)
+ if err != nil {
+ code = pb.ErrorCode_DBError
+ }
+ return
+}
+
+func (this *Hunting) CheckUserBaseHuntingInfo(uid string) (data []*pb.DBHuntingRank) {
+ list, err := this.modelHunting.getHuntingList(uid)
+ if err != nil {
+ for k := range list.Boss {
+ _d := this.modulerank.getHuntingRankListByBossType(uid, k)
+ if _d != nil {
+ data = append(data, _d)
+ }
+ }
+ }
+ return
+}
+func (this *Hunting) CheckRank(uid string, boosID int32, difficulty int32, hunting *pb.DBHunting, report *pb.BattleReport) {
+ costTime := report.Costtime
+ key := strconv.Itoa(int(boosID)) + "_" + strconv.Itoa(int(difficulty))
+
+ if hunting.BossTime[key] > costTime || hunting.BossTime[key] == 0 && difficulty >= hunting.Boss[boosID] { // 刷新记录
+ hunting.BossTime[key] = costTime
+ szLine := make([]*pb.LineUp, 5)
+ Leadpos := 0
+ if report != nil && report.Info != nil && len(report.Info.Redflist) > 0 {
+ costTime = report.Costtime
+ Leadpos = int(report.Info.Redflist[0].Leadpos)
+ for i, v := range report.Info.Redflist[0].Team {
+ if v != nil {
+ szLine[i] = &pb.LineUp{
+ Cid: v.HeroID,
+ Star: v.Star,
+ Lv: v.Lv,
+ }
+ }
+ }
+ }
+ // 写入排行榜
+ objID := ""
+ bFind := false
+ ranks := this.modulerank.getHuntingRankList(uid)
+ for _, v := range ranks {
+ if v.Bosstype == boosID {
+ mapRankData := make(map[string]interface{}, 0)
+ mapRankData["difficulty"] = difficulty
+ mapRankData["bosstype"] = boosID
+ mapRankData["Leadpos"] = Leadpos
+ mapRankData["line"] = szLine
+ mapRankData["costTime"] = costTime
+ conn_, _ := db.Cross()
+ dbModel := db.NewDBModel(comm.TableHuntingRank, time.Hour, conn_)
+ dbModel.ChangeList(uid, v.Id, mapRankData)
+ objID = v.Id
+ bFind = true
+ break
+ }
+ }
+ if !bFind {
+ userinfo := this.ModuleUser.GetUser(uid)
+ new := &pb.DBHuntingRank{
+ Id: primitive.NewObjectID().Hex(),
+ Uid: uid,
+ Difficulty: difficulty,
+ Bosstype: boosID,
+ Nickname: userinfo.Name,
+ Icon: "",
+ Lv: userinfo.Lv,
+ Leadpos: int32(Leadpos),
+ Line: szLine,
+ CostTime: costTime,
+ }
+ objID = new.Id
+ conn_, _ := db.Cross()
+ dbModel := db.NewDBModel(comm.TableHuntingRank, time.Hour, conn_)
+ dbModel.AddList(uid, new.Id, new)
+ }
+ this.modulerank.SetRankListData("huntingRank"+strconv.Itoa(int(boosID)), difficulty<<16+costTime, objID)
+ }
+}
+
+//红点查询
+func (this *Hunting) Reddot(session comm.IUserSession, rid ...comm.ReddotType) (reddot map[comm.ReddotType]bool) {
+ reddot = make(map[comm.ReddotType]bool)
+ for _, v := range rid {
+ switch v {
+ case comm.Reddot32:
+ reddot[comm.Reddot32] = this.modelHunting.checkReddot32(session.GetUserId())
+ break
+
+ }
+ }
+ return
+}
+
+// 解锁远征所有难度
+func (this *Hunting) CompleteAllLevel(session comm.IUserSession) (code pb.ErrorCode) {
+ list, err := this.modelHunting.getHuntingList(session.GetUserId())
+ if err != nil {
+ code = pb.ErrorCode_DBError
+ return
+ }
+ mapData := make(map[string]interface{}, 0)
+ // 查配置获取每个Boss的最大难度
+ for k := range list.Boss {
+ for i := 1; ; i++ {
+ conf := this.configure.GetHuntingBossConfigData(k, int32(i))
+ if conf == nil {
+ list.Boss[k] = int32(i - 1)
+ }
+ }
+ }
+ mapData["boss"] = list.Boss
+ code = this.ModifyHuntingData(session.GetUserId(), mapData)
+ for k := range list.Boss {
+ list.Boss[k] += 1
+ }
+ session.SendMsg(string(this.GetType()), HuntingGetListResp, &pb.HuntingGetListResp{Data: list})
+ return
+}
diff --git a/sys/configure/structs/Game.EnchantBoss.go b/sys/configure/structs/Game.EnchantBoss.go
new file mode 100644
index 000000000..4d84c9e1d
--- /dev/null
+++ b/sys/configure/structs/Game.EnchantBoss.go
@@ -0,0 +1,42 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+package cfg
+
+type GameEnchantBoss struct {
+ _dataMap map[int32]*GameEnchantBossData
+ _dataList []*GameEnchantBossData
+}
+
+func NewGameEnchantBoss(_buf []map[string]interface{}) (*GameEnchantBoss, error) {
+ _dataList := make([]*GameEnchantBossData, 0, len(_buf))
+ dataMap := make(map[int32]*GameEnchantBossData)
+ for _, _ele_ := range _buf {
+ if _v, err2 := DeserializeGameEnchantBossData(_ele_); err2 != nil {
+ return nil, err2
+ } else {
+ _dataList = append(_dataList, _v)
+ dataMap[_v.Id] = _v
+ }
+ }
+ return &GameEnchantBoss{_dataList:_dataList, _dataMap:dataMap}, nil
+}
+
+func (table *GameEnchantBoss) GetDataMap() map[int32]*GameEnchantBossData {
+ return table._dataMap
+}
+
+func (table *GameEnchantBoss) GetDataList() []*GameEnchantBossData {
+ return table._dataList
+}
+
+func (table *GameEnchantBoss) Get(key int32) *GameEnchantBossData {
+ return table._dataMap[key]
+}
+
+
diff --git a/sys/configure/structs/Game.EnchantBossData.go b/sys/configure/structs/Game.EnchantBossData.go
new file mode 100644
index 000000000..d42584ab8
--- /dev/null
+++ b/sys/configure/structs/Game.EnchantBossData.go
@@ -0,0 +1,143 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+package cfg
+
+import "errors"
+
+type GameEnchantBossData struct {
+ Id int32
+ Bossid int32
+ Name string
+ Grade string
+ ScoreLow int32
+ ScoreUp int32
+ RewardDrop []int32
+ Dropshow1 []*Gameatn
+ Dropshow2 []*Gameatn
+ Dropshow3 []*Gameatn
+ Dropshow []int32
+ Bossmodel int32
+ MainText string
+ StrategyText string
+ BossSkill int32
+ Boss []int32
+}
+
+const TypeId_GameEnchantBossData = -287548876
+
+func (*GameEnchantBossData) GetTypeId() int32 {
+ return -287548876
+}
+
+func (_v *GameEnchantBossData)Deserialize(_buf map[string]interface{}) (err error) {
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["id"].(float64); !_ok_ { err = errors.New("id error"); return }; _v.Id = int32(_tempNum_) }
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["bossid"].(float64); !_ok_ { err = errors.New("bossid error"); return }; _v.Bossid = int32(_tempNum_) }
+ {var _ok_ bool; var __json_text__ map[string]interface{}; if __json_text__, _ok_ = _buf["name"].(map[string]interface{}) ; !_ok_ { err = errors.New("_v.Name error"); return }; { var _ok_ bool; if _, _ok_ = __json_text__["key"].(string); !_ok_ { err = errors.New("key error"); return } }; { var _ok_ bool; if _v.Name, _ok_ = __json_text__["text"].(string); !_ok_ { err = errors.New("text error"); return } } }
+ { var _ok_ bool; if _v.Grade, _ok_ = _buf["grade"].(string); !_ok_ { err = errors.New("grade error"); return } }
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["score_low"].(float64); !_ok_ { err = errors.New("score_low error"); return }; _v.ScoreLow = int32(_tempNum_) }
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["score_up"].(float64); !_ok_ { err = errors.New("score_up error"); return }; _v.ScoreUp = int32(_tempNum_) }
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["reward_drop"].([]interface{}); !_ok_ { err = errors.New("reward_drop error"); return }
+
+ _v.RewardDrop = make([]int32, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ int32
+ { var _ok_ bool; var _x_ float64; if _x_, _ok_ = _e_.(float64); !_ok_ { err = errors.New("_list_v_ error"); return }; _list_v_ = int32(_x_) }
+ _v.RewardDrop = append(_v.RewardDrop, _list_v_)
+ }
+ }
+
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["dropshow1"].([]interface{}); !_ok_ { err = errors.New("dropshow1 error"); return }
+
+ _v.Dropshow1 = make([]*Gameatn, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ *Gameatn
+ { var _ok_ bool; var _x_ map[string]interface{}; if _x_, _ok_ = _e_.(map[string]interface{}); !_ok_ { err = errors.New("_list_v_ error"); return }; if _list_v_, err = DeserializeGameatn(_x_); err != nil { return } }
+ _v.Dropshow1 = append(_v.Dropshow1, _list_v_)
+ }
+ }
+
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["dropshow2"].([]interface{}); !_ok_ { err = errors.New("dropshow2 error"); return }
+
+ _v.Dropshow2 = make([]*Gameatn, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ *Gameatn
+ { var _ok_ bool; var _x_ map[string]interface{}; if _x_, _ok_ = _e_.(map[string]interface{}); !_ok_ { err = errors.New("_list_v_ error"); return }; if _list_v_, err = DeserializeGameatn(_x_); err != nil { return } }
+ _v.Dropshow2 = append(_v.Dropshow2, _list_v_)
+ }
+ }
+
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["dropshow3"].([]interface{}); !_ok_ { err = errors.New("dropshow3 error"); return }
+
+ _v.Dropshow3 = make([]*Gameatn, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ *Gameatn
+ { var _ok_ bool; var _x_ map[string]interface{}; if _x_, _ok_ = _e_.(map[string]interface{}); !_ok_ { err = errors.New("_list_v_ error"); return }; if _list_v_, err = DeserializeGameatn(_x_); err != nil { return } }
+ _v.Dropshow3 = append(_v.Dropshow3, _list_v_)
+ }
+ }
+
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["dropshow"].([]interface{}); !_ok_ { err = errors.New("dropshow error"); return }
+
+ _v.Dropshow = make([]int32, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ int32
+ { var _ok_ bool; var _x_ float64; if _x_, _ok_ = _e_.(float64); !_ok_ { err = errors.New("_list_v_ error"); return }; _list_v_ = int32(_x_) }
+ _v.Dropshow = append(_v.Dropshow, _list_v_)
+ }
+ }
+
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["bossmodel"].(float64); !_ok_ { err = errors.New("bossmodel error"); return }; _v.Bossmodel = int32(_tempNum_) }
+ {var _ok_ bool; var __json_text__ map[string]interface{}; if __json_text__, _ok_ = _buf["main_text"].(map[string]interface{}) ; !_ok_ { err = errors.New("_v.MainText error"); return }; { var _ok_ bool; if _, _ok_ = __json_text__["key"].(string); !_ok_ { err = errors.New("key error"); return } }; { var _ok_ bool; if _v.MainText, _ok_ = __json_text__["text"].(string); !_ok_ { err = errors.New("text error"); return } } }
+ {var _ok_ bool; var __json_text__ map[string]interface{}; if __json_text__, _ok_ = _buf["strategy_text"].(map[string]interface{}) ; !_ok_ { err = errors.New("_v.StrategyText error"); return }; { var _ok_ bool; if _, _ok_ = __json_text__["key"].(string); !_ok_ { err = errors.New("key error"); return } }; { var _ok_ bool; if _v.StrategyText, _ok_ = __json_text__["text"].(string); !_ok_ { err = errors.New("text error"); return } } }
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["boss_skill"].(float64); !_ok_ { err = errors.New("boss_skill error"); return }; _v.BossSkill = int32(_tempNum_) }
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["boss"].([]interface{}); !_ok_ { err = errors.New("boss error"); return }
+
+ _v.Boss = make([]int32, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ int32
+ { var _ok_ bool; var _x_ float64; if _x_, _ok_ = _e_.(float64); !_ok_ { err = errors.New("_list_v_ error"); return }; _list_v_ = int32(_x_) }
+ _v.Boss = append(_v.Boss, _list_v_)
+ }
+ }
+
+ return
+}
+
+func DeserializeGameEnchantBossData(_buf map[string]interface{}) (*GameEnchantBossData, error) {
+ v := &GameEnchantBossData{}
+ if err := v.Deserialize(_buf); err == nil {
+ return v, nil
+ } else {
+ return nil, err
+ }
+}
diff --git a/sys/configure/structs/Game.EnchantShop.go b/sys/configure/structs/Game.EnchantShop.go
new file mode 100644
index 000000000..1f37a0138
--- /dev/null
+++ b/sys/configure/structs/Game.EnchantShop.go
@@ -0,0 +1,42 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+package cfg
+
+type GameEnchantShop struct {
+ _dataMap map[int32]*GameEnchantShopData
+ _dataList []*GameEnchantShopData
+}
+
+func NewGameEnchantShop(_buf []map[string]interface{}) (*GameEnchantShop, error) {
+ _dataList := make([]*GameEnchantShopData, 0, len(_buf))
+ dataMap := make(map[int32]*GameEnchantShopData)
+ for _, _ele_ := range _buf {
+ if _v, err2 := DeserializeGameEnchantShopData(_ele_); err2 != nil {
+ return nil, err2
+ } else {
+ _dataList = append(_dataList, _v)
+ dataMap[_v.Buynum] = _v
+ }
+ }
+ return &GameEnchantShop{_dataList:_dataList, _dataMap:dataMap}, nil
+}
+
+func (table *GameEnchantShop) GetDataMap() map[int32]*GameEnchantShopData {
+ return table._dataMap
+}
+
+func (table *GameEnchantShop) GetDataList() []*GameEnchantShopData {
+ return table._dataList
+}
+
+func (table *GameEnchantShop) Get(key int32) *GameEnchantShopData {
+ return table._dataMap[key]
+}
+
+
diff --git a/sys/configure/structs/Game.EnchantShopData.go b/sys/configure/structs/Game.EnchantShopData.go
new file mode 100644
index 000000000..30e7c72ec
--- /dev/null
+++ b/sys/configure/structs/Game.EnchantShopData.go
@@ -0,0 +1,50 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+package cfg
+
+import "errors"
+
+type GameEnchantShopData struct {
+ Buynum int32
+ Need []*Gameatn
+}
+
+const TypeId_GameEnchantShopData = 1535577405
+
+func (*GameEnchantShopData) GetTypeId() int32 {
+ return 1535577405
+}
+
+func (_v *GameEnchantShopData)Deserialize(_buf map[string]interface{}) (err error) {
+ { var _ok_ bool; var _tempNum_ float64; if _tempNum_, _ok_ = _buf["buynum"].(float64); !_ok_ { err = errors.New("buynum error"); return }; _v.Buynum = int32(_tempNum_) }
+ {
+ var _arr_ []interface{}
+ var _ok_ bool
+ if _arr_, _ok_ = _buf["need"].([]interface{}); !_ok_ { err = errors.New("need error"); return }
+
+ _v.Need = make([]*Gameatn, 0, len(_arr_))
+
+ for _, _e_ := range _arr_ {
+ var _list_v_ *Gameatn
+ { var _ok_ bool; var _x_ map[string]interface{}; if _x_, _ok_ = _e_.(map[string]interface{}); !_ok_ { err = errors.New("_list_v_ error"); return }; if _list_v_, err = DeserializeGameatn(_x_); err != nil { return } }
+ _v.Need = append(_v.Need, _list_v_)
+ }
+ }
+
+ return
+}
+
+func DeserializeGameEnchantShopData(_buf map[string]interface{}) (*GameEnchantShopData, error) {
+ v := &GameEnchantShopData{}
+ if err := v.Deserialize(_buf); err == nil {
+ return v, nil
+ } else {
+ return nil, err
+ }
+}