diff --git a/.gitignore b/.gitignore index 311e8a0..60438cd 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,6 @@ *.dol *.bat *.db +*.dat .idea logs -event diff --git a/dump_quest.py b/dump_quest.py new file mode 100644 index 0000000..acc146b --- /dev/null +++ b/dump_quest.py @@ -0,0 +1,3393 @@ +#! /usr/bin/env python +# -*- coding: utf-8 -*- +# SPDX-FileCopyrightText: Copyright (C) 2021-2024 MH3SP Server Project +# SPDX-License-Identifier: AGPL-3.0-or-later +"""Quest dumper. + +Arena Quest ID List: +EA60 +EA61 +EA62 +EA63 +EA64 +EA65 +EA66 +EA67 +EA68 +EA69 +EA6A +EA6B + +bird and brute bowgun: +rathling gun + barrel, poison stinger frame, light bowgun stock + +sea power bowgun: +rathling gun barrel, rathling gun + frame, rathling gun + stock + +land lords bowgun: +jho barrel, diablos frame, barioth stock + +two flames bowgun: +lagiacrus barrel, lagiacrus frame, barioth stock + +https://web.archive.org/web/20111012085906/ +http://divinewh.im/q/c/Grudge_Match:_Royal_Ludroth + +https://web.archive.org/web/20111012085901/ +http://divinewh.im/q/c/Grudge_Match:_Rathian + +https://web.archive.org/web/20111012090656/ +http://divinewh.im/q/c/Grudge_Match:_Uragaan + +https://web.archive.org/web/20111012090915/ +http://divinewh.im/q/c/Grudge_Match:_Bird_and_Brute +""" + +from mh.quest_utils import ItemsType, Monster, LocationType,\ + QuestRankType, QuestRestrictionType, ResourcesType,\ + StartingPositionType, WaveType +from mh.equipment_utils import Chestpiece, Gauntlets, Faulds,\ + Leggings, Helmet, EquipmentClasses, Greatsword,\ + SnS, Hammer, Longsword, Switchaxe, Lance,\ + BowgunFrame, BowgunStock, BowgunBarrel + + +def EXPORT(quest): + import json + name = quest['quest_info']['name'].replace(':', '') + with open('event/{}.json'.format(name), "w") as outfile: + json.dump(quest, outfile, indent=4) + + +""" +EVENT QUEST 1: Jump Four Jaggi +Quest description/rewards/etc from https://www.youtube.com/watch?v=qyQt2Xmpt0g +Quest requirements altered to make it possible to win. +""" +QUEST_EVENT_JUMP_FOUR_JAGGI = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': 2039.26,'pos_y': 12.70,'pos_z': 210.05, + 'rot_x': 0,'rot_y': 17,'rot_z': 0, + + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': 857.89,'pos_y': -41.97,'pos_z': 814.06, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': 97.58,'pos_y': -75.54,'pos_z': 135.22, + 'rot_x': 0,'rot_y': -45,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': -393.52,'pos_y': -163.94,'pos_z': -667.01, + 'rot_x': 0,'rot_y': -199,'rot_z': 0, + }, + ], + [ + # Area 2 + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 2,'quantity': 1, + 'pos_x': -853.86,'pos_y': 19.45,'pos_z': 1381.66, + 'rot_x': 0,'rot_y': -113,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 2,'quantity': 2, + 'pos_x': -553.59,'pos_y': -2.57,'pos_z': -369.71, + 'rot_x': 0,'rot_y': 193,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 2,'quantity': 3, + 'pos_x': -1698.75,'pos_y': 5.74,'pos_z': -530.30, + 'rot_x': 0,'rot_y': 398,'rot_z': 0, + }, + ], + [ + # Area 3 + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': -1, + 'pos_x': 873.28,'pos_y': 85.07,'pos_z': -610.86, + 'rot_x': 0,'rot_y': -153,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': -1, + 'pos_x': 1247.84,'pos_y': 106.65,'pos_z': 25.11, + 'rot_x': 0,'rot_y': -358,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 3,'quantity': 2, + 'pos_x': 177.92,'pos_y': 450.70,'pos_z': -32.21, + 'rot_x': 0,'rot_y': -238,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': 2, + 'pos_x': -78.66,'pos_y': 330.70,'pos_z': 362.86, + 'rot_x': 0,'rot_y': -79,'rot_z': 0, + }, + ], + [ + # Area 4 + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 3, + 'pos_x': 606.18,'pos_y': -12.89,'pos_z': 4145.11, + 'rot_x': 0,'rot_y': 324,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 1, + 'pos_x': 524.37,'pos_y': -18.65,'pos_z': 2292.05, + 'rot_x': 0,'rot_y': 199,'rot_z': 0, + }, + { + 'type': Monster.rhenoplos,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': -1, + 'pos_x': -460.08,'pos_y': -71.51,'pos_z': 3044.50, + 'rot_x': 0,'rot_y': -460,'rot_z': 0, + }, + ], + [ + # Area 5 + { + 'type': Monster.jaggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': 1, + 'pos_x': 300.40,'pos_y': 4.00,'pos_z': -211.14, + 'rot_x': 0,'rot_y': 0,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': -1, + 'pos_x': 458.16,'pos_y': 1.49,'pos_z': -918.94, + 'rot_x': 0,'rot_y': 51,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': 4, + 'pos_x': 1813.83,'pos_y': 3.06,'pos_z': 925.68, + 'rot_x': 0,'rot_y': 494,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': -1, + 'pos_x': -504.37,'pos_y': 3.05,'pos_z': -757.30, + 'rot_x': 0,'rot_y': 676,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': 2, + 'pos_x': 1118.48,'pos_y': 4.00,'pos_z': -420.89, + 'rot_x': 0,'rot_y': 364,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': -1, + 'pos_x': 2658.84,'pos_y': 3.24,'pos_z': 222.99, + 'rot_x': 0,'rot_y': 756,'rot_z': 0, + }, + ], + [ + # Area 6 (Area 8 in Sandy Plains) + { + 'type': Monster.rhenoplos,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': -1, + 'pos_x': 1612.71,'pos_y': -30.27,'pos_z': 695.30, + 'rot_x': 0,'rot_y': 517,'rot_z': 0, + }, + { + 'type': Monster.rhenoplos,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': -1, + 'pos_x': -2050.04,'pos_y': -31.90,'pos_z': -266.33, + 'rot_x': 0,'rot_y': 28,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 5, + 'pos_x': -344.14,'pos_y': -13.00,'pos_z': -26.14, + 'rot_x': 0,'rot_y': 443,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 4, + 'pos_x': -161.74,'pos_y': 4.80,'pos_z': -416.52, + 'rot_x': 0,'rot_y': 472,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 2, + 'pos_x': -481.05,'pos_y': 15.34,'pos_z': -643.19, + 'rot_x': 0,'rot_y': 568,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': -1, + 'pos_x': -692.26,'pos_y': -11.02,'pos_z': -235.13, + 'rot_x': 0,'rot_y': 608,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 3, + 'pos_x': -417.82,'pos_y': -1.44,'pos_z': -343.46, + 'rot_x': 0,'rot_y': 147,'rot_z': 0, + }, + ], + [ + # Area 7 (Area 9 in Sandy Plains) + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 3, + 'pos_x': 4294.59,'pos_y': -75.65,'pos_z': -2925.29, + 'rot_x': 0,'rot_y': -130,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 2, + 'pos_x': 3995.30,'pos_y': -45.09,'pos_z': -2049.22, + 'rot_x': 0,'rot_y': -85,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 2, + 'pos_x': 4187.00,'pos_y': -17.07,'pos_z': -1574.97, + 'rot_x': 0,'rot_y': -17,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 1, + 'pos_x': 3781.64,'pos_y': -66.86,'pos_z': -2570.78, + 'rot_x': 0,'rot_y': -130,'rot_z': 0, + }, + ], + [ + # Area 8 (Area 10 in Sandy Plains) + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 7, + 'pos_x': 293.99,'pos_y': -170.31,'pos_z': 4049.95, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 5, + 'pos_x': 124.95,'pos_y': -186.54,'pos_z': 3440.16, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 3, + 'pos_x': -425.01,'pos_y': -179.30,'pos_z': 4509.84, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 2, + 'pos_x': -714.48,'pos_y': -183.78,'pos_z': 4108.50, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 1, + 'pos_x': -1021.27,'pos_y': -215.48,'pos_z': 3726.09, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': -1, + 'pos_x': -1974.57,'pos_y': -209.48,'pos_z': -316.05, + 'rot_x': 0,'rot_y': -56,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': -1, + 'pos_x': -1825.11,'pos_y': -210.91,'pos_z': -382.90, + 'rot_x': 0,'rot_y': 130,'rot_z': 0, + + }, + ], + [ + # Area 9 (Area 7 in Sandy Plains) + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 2, + 'pos_x': 3383.92,'pos_y': 2.65,'pos_z': 592.49, + 'rot_x': 0,'rot_y': -193,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 1, + 'pos_x': 2653.55,'pos_y': -22.59,'pos_z': 987.24, + 'rot_x': 0,'rot_y': -73,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': -1, + 'pos_x': 2838.69,'pos_y': -28.00,'pos_z': 445.91, + 'rot_x': 0,'rot_y': -142,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': -1, + 'pos_x': 2109.53,'pos_y': -26.57,'pos_z': 575.43, + 'rot_x': 0,'rot_y': -460,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 9,'quantity': -1, + 'pos_x': -1713.72,'pos_y': 1262.50,'pos_z': 2199.24, + 'rot_x': 273,'rot_y': -45,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 9,'quantity': 6, + 'pos_x': -1174.44,'pos_y': 1319.50,'pos_z': 1682.19, + 'rot_x': 0,'rot_y': -39,'rot_z': 0, + }, + ], + [ + # Area 10 + ], + [ + # Area 11 (Area 6 in Sandy Plains) + { + 'type': Monster.giggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': 2195.89,'pos_y': 73.70,'pos_z': -720.92, + 'rot_x': 0,'rot_y': 39,'rot_z': 0, + + }, + { + 'type': Monster.giggi,'unk1': 1,'unk2': 0xFF, + 'variant': 6,'room': 11,'quantity': 1, + 'pos_x': -535.73,'pos_y': 1212.59,'pos_z': 896.44, + 'rot_x': 0,'rot_y': 169,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': -434.00,'pos_y': 198.96,'pos_z': 289.52, + 'rot_x': 0,'rot_y': -267,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': -802.69,'pos_y': 198.96,'pos_z': 66.62, + 'rot_x': 0,'rot_y': -216,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': -645.14,'pos_y': 288.96,'pos_z': -371.21, + 'rot_x': 0,'rot_y': -227,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 1, + 'pos_x': -473.33,'pos_y': 168.96,'pos_z': -166.43, + 'rot_x': 0,'rot_y': -210,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 61001, + 'name': "Jump Four Jaggi", + 'client': "Guild Subcontractor", + 'description': "Hunt 4 Great Jaggi", + 'details': + "I'm gonna get so fired for\n" + "this... The Great Jaggi some\n" + "hunter brought in just\n" + "escaped. Mind going after\n" + "them? You better hurry,\n" + "though. Bet they've got some\n" + "incredible materials, too.", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 1, 1) + ), + 'penalty_per_cart': 1400, + 'quest_fee': 400, + 'time_limit': 50, + 'main_monster_1': Monster.bnahabra2, + 'main_monster_2': Monster.melynx, + 'location': LocationType.QUEST_LOCATION_SANDY_PLAINS, + 'quest_rank': QuestRankType.star_1, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, + 'resources': ResourcesType.low_rank, + 'supply_set_number': 19, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x64050219, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.great_jaggi, + 'starting_area': 0x00, + 'boss_id': 0xFF, + 'spawn_count': 0x04, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x01 + }, + 'monster_2': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.great_jaggi, + 'objective_num': 0x04, + 'zenny_reward': 4000, + 'hrp_reward': 440, + 'rewards_row_1': [ + (ItemsType.great_jagi_claw, 1, 3), + (ItemsType.great_jagi_hide, 1, 12), + (ItemsType.jagi_scale, 1, 10), + (ItemsType.screamer, 1, 20), + (ItemsType.kings_frill, 1, 12), + (ItemsType.bone_husk_s, 8, 18), + (ItemsType.great_jagi_head, 1, 25) + ], + 'rewards_row_2': [ + (ItemsType.mystery_charm, 1, 1), + (ItemsType.aquaglow_jewel, 1, 1), + (ItemsType.shining_charm, 1, 1), + (ItemsType.armor_sphere, 1, 1), + (ItemsType.armor_sphere_plus, 1, 1) + ], + }, + 'subquest_1': { + 'description': "Hunt 2 Great Jaggi", + 'type': 0x00000001, + 'objective_type': Monster.great_jaggi, + 'objective_num': 0x02, + 'zenny_reward': 4000, + 'hrp_reward': 220, + 'rewards_row_1': [ + (ItemsType.great_jagi_claw, 1, 1), + (ItemsType.great_jagi_hide, 1, 1), + (ItemsType.jagi_scale, 1, 1), + (ItemsType.screamer, 1, 1), + (ItemsType.kings_frill, 1, 1), + (ItemsType.bone_husk_s, 8, 1), + (ItemsType.great_jagi_head, 1, 1) + ], + }, + 'subquest_2': { + 'description': "None", + 'type': 0, + 'objective_type': Monster.none, + 'objective_num': 0, + 'zenny_reward': 0, + 'hrp_reward': 0, + 'rewards_row_1': [], + } + }, + 'unknown': { + # (2 for large mon quest, 3 for small/delivery, 5 for jhen/ala) + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST 7: The Phantom Uragaan +Quest description from https://www.youtube.com/watch?v=Py5PkCXhf6w +""" +QUEST_EVENT_THE_PHANTOM_URAGAAN = { + 'quest_info': { + 'quest_id': 61007, + 'name': "The Phantom Uragaan", + 'client': "Spoiled Princess", + 'description': "Hunt an Uragaan", + 'details': + "Oooh, I just heard they've\n" + "spotted the cutest, tiniest,\n" + "most adorable little Uragaan\n" + "on the Volcano. Hunt me one\n" + "this instant or I will get\n" + "very angry. And if I'm angry,\n" + "Daddy's angry. Now go!", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 1, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 1, 1) + ), + 'penalty_per_cart': 3000, + 'quest_fee': 850, + 'time_limit': 50, + 'main_monster_1': Monster.uroktor, + 'main_monster_2': Monster.aptonoth, + 'location': LocationType.QUEST_LOCATION_VOLCANO, + 'quest_rank': QuestRankType.star_3, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_18_INITJOIN, + 'resources': ResourcesType.low_rank, + 'supply_set_number': 15, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x1D, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + 'smallmonster_data_file': 'sm_phantomuragaan.dat', + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.uragaan, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x1D, # 0x01 through 0x3c + 'size': 0x13, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.uragaan, + 'objective_num': 0x01, + 'zenny_reward': 8800, + 'hrp_reward': 1100, + 'rewards_row_1': [ + (ItemsType.mystery_charm, 1, 1), + (ItemsType.uragaan_shell, 1, 16), + (ItemsType.uragaan_scale, 1, 20), + (ItemsType.uragaan_marrow, 1, 10), + (ItemsType.monster_bone_l, 1, 10), + (ItemsType.bone_husk_l, 15, 13), + (ItemsType.shining_charm, 1, 5), + (ItemsType.rustshard, 1, 25) + ], + 'rewards_row_2': [ + (ItemsType.mystery_charm, 1, 1), + (ItemsType.uragaan_shell, 1, 16), + (ItemsType.uragaan_scale, 1, 20), + (ItemsType.uragaan_marrow, 1, 10), + (ItemsType.monster_bone_l, 1, 10), + (ItemsType.bone_husk_l, 15, 13), + (ItemsType.shining_charm, 1, 5), + (ItemsType.rustshard, 1, 25) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST 8: Blood Sport +Quest description from https://www.youtube.com/watch?v=tuRSdC_mlO4 +""" +QUEST_EVENT_BLOOD_SPORT = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.fly_wyv,'unk1': 1,'unk2': 0xFF, + 'variant': 3,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 61008, + 'name': "Blood Sport", + 'client': "Spoiled Princess", + 'description': + "Hunt an Uragaan\n" + "and a Diablos", + 'details': + "Oh, boo! I'm tired of watching\n" + "run-of-the-mill hunts. The\n" + "Diablos and the Uragaan are\n" + "supposed to be the ultimate\n" + "monster duo. I'd love to watch\n" + "them maim some foolish hunter!\n" + "Do put on a good show...", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 1, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 0, 0) + ), + 'penalty_per_cart': 6000, + 'quest_fee': 1750, + 'time_limit': 50, + 'main_monster_1': Monster.uragaan, + 'main_monster_2': Monster.diablos, + 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, + 'quest_rank': QuestRankType.star_3, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_18_INITJOIN, + 'resources': ResourcesType.low_rank, + 'supply_set_number': 43, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x001D, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.uragaan, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x1D, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_2': { + 'type': Monster.diablos, + 'starting_area': 0x00, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x1D, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.uragaan, + 'objective_num': 0x01, + 'zenny_reward': 17600, + 'hrp_reward': 1760, + 'rewards_row_1': [ + (ItemsType.uragaan_scale, 1, 1), + (ItemsType.diablos_ridge, 1, 14), + (ItemsType.uragaan_shell, 1, 10), + (ItemsType.diablos_shell, 1, 20), + (ItemsType.twisted_horn, 1, 12), + (ItemsType.diablos_marrow, 8, 9), + (ItemsType.uragaan_marrow, 1, 9), + (ItemsType.incomplete_plans, 1, 25) + ], + 'rewards_row_2': [ + (ItemsType.uragaan_scale, 1, 1), + (ItemsType.diablos_ridge, 1, 14), + (ItemsType.uragaan_shell, 1, 10), + (ItemsType.diablos_shell, 1, 20), + (ItemsType.twisted_horn, 1, 12), + (ItemsType.diablos_marrow, 1, 9), + (ItemsType.uragaan_marrow, 1, 9), + (ItemsType.incomplete_plans, 1, 25) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000001, + 'objective_type': Monster.diablos, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0, + 'objective_type': Monster.none, + 'objective_num': 0, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST 2: Mercy Mission +(INCOMPLETE) Invading monster is "faked" by hardcoding a Royal Ludroth +from the start. +""" +QUEST_EVENT_MERCY_MISSION = { + 'quest_info': { + 'quest_id': 61002, + 'name': "Mercy Mission", + 'client': "MH3SP Dev Team", + 'description': "Deliver 10 Monster Guts", + 'details': + "Wanted:\n" + "The description for this\n" + "quest! If you can find\n" + "it, please let us know!\n" + "Thanks!", + 'success_message': + "Complete the Main Quest\n" + "and both Subquests.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 1, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (0, 1, 0, 0, 0, 0, 0, 0) + ), + 'penalty_per_cart': 600, + 'quest_fee': 150, + 'time_limit': 15, + 'main_monster_1': Monster.ludroth, + 'main_monster_2': Monster.epioth, + 'location': LocationType.QUEST_LOCATION_D_ISLAND, + 'quest_rank': QuestRankType.star_1, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, + 'resources': ResourcesType.low_rank, + 'supply_set_number': 35, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x64030303, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + 'smallmonster_data_file': 'sm_mercymission.dat', + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.royal_ludroth, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_2': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000002, + 'objective_type': ItemsType.monster_guts, + 'objective_num': 0x0A, + 'zenny_reward': 1500, + 'hrp_reward': 70, + 'rewards_row_1': [ + (ItemsType.mystery_charm, 1, 8), + (ItemsType.black_pearl, 1, 20), + (ItemsType.honey, 2, 20), + (ItemsType.armor_sphere, 1, 18), + (ItemsType.small_goldenfish, 1, 8), + (ItemsType.machalite_ore, 8, 14), + (ItemsType.steel_eg, 1, 12) + ], + 'rewards_row_2': [ + (ItemsType.mystery_charm, 1, 35), + (ItemsType.aquaglow_jewel, 1, 5), + (ItemsType.shining_charm, 1, 15), + (ItemsType.armor_sphere, 1, 20), + (ItemsType.armor_sphere_plus, 1, 25) + ], + }, + 'subquest_1': { + 'description': "Deliver 12 Red Coral Stones", + 'type': 0x00000002, + 'objective_type': ItemsType.red_coral_stone, + 'objective_num': 0x0C, + 'zenny_reward': 1200, + 'hrp_reward': 55, + 'rewards_row_1': [ + (ItemsType.mystery_charm, 1, 8), + (ItemsType.black_pearl, 1, 20), + (ItemsType.honey, 2, 20), + (ItemsType.armor_sphere, 1, 18), + (ItemsType.small_goldenfish, 1, 8), + (ItemsType.machalite_ore, 1, 14), + (ItemsType.steel_eg, 1, 12) + ], + }, + 'subquest_2': { + 'description': "Deliver 3 Goldenfish", + 'type': 0x00000002, + 'objective_type': ItemsType.goldenfish, + 'objective_num': 0x03, + 'zenny_reward': 2000, + 'hrp_reward': 70, + 'rewards_row_1': [ + (ItemsType.mystery_charm, 1, 35), + (ItemsType.aquaglow_jewel, 1, 5), + (ItemsType.shining_charm, 1, 15), + (ItemsType.armor_sphere, 1, 20), + (ItemsType.armor_sphere_plus, 1, 25) + ], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000003, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST 18: Flooded Forest Free-For-All +Quest description from https://www.youtube.com/watch?v=mWHonz4dXHk + thanks to "kazuma_6969" +""" +QUEST_EVENT_FF_FREE_FOR_ALL = { + 'quest_info': { + 'quest_id': 61017, + 'name': "Flooded Forest Free-For-All", + 'client': "Argosy Captain", + 'description': "Hunt a Royal L., Lag. & Gobul", + 'details': + "Taihen! Means very bad, yes?\n" + "Flooded Forest overrun by pack\n" + "of leviathans -- Argosy cannot\n" + "get anywhere near area! Big\n" + "problem for trade, yes? Only\n" + "hunters can return fair seas\n" + "to Flooded Forest. Onegai!", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 1, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 0, 0) + ), + 'penalty_per_cart': 9000, + 'quest_fee': 2550, + 'time_limit': 50, + 'main_monster_1': Monster.ludroth, + 'main_monster_2': Monster.kelbi, + 'location': LocationType.QUEST_LOCATION_FLOODED_FOR, + 'quest_rank': QuestRankType.star_5, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_40_INITJOIN, + 'resources': ResourcesType.high_rank, + 'supply_set_number': 43, + 'starting_position': StartingPositionType.random, + 'general_enemy_level': 0x0040, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + 'smallmonster_data_file': 'sm_ff_free_for_all.dat', + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.royal_ludroth, + 'starting_area': 0x00, # 4 -> area 1 # 3 -> area 1 # 2 -> basecamp? # 1 -> area 3 # 0 -> area 4 + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x1F, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_2': { + 'type': Monster.lagiacrus, + 'starting_area': 0x00, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x1F, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_3': { + 'type': Monster.gobul, + 'starting_area': 0x00, + 'boss_id': 0x02, + 'spawn_count': 0x01, + 'level': 0x1F, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.royal_ludroth, + 'objective_num': 0x01, + 'zenny_reward': 25800, + 'hrp_reward': 2600, + 'rewards_row_1': [ + (ItemsType.hrd_armor_sphere, 1, 1), + (ItemsType.hvy_armor_sphere, 1, 5), + (ItemsType.quality_sponge, 1, 14), + (ItemsType.gobul_spike_plus, 1, 20), + (ItemsType.gobul_fin_plus, 1, 7), + (ItemsType.lagiacrus_hide_plus, 1, 10), + (ItemsType.lagiacrus_scale_plus, 1, 8), + (ItemsType.shining_charm, 1, 10), + (ItemsType.black_gem_ticket, 1, 25) + ], + 'rewards_row_2': [ + (ItemsType.hrd_armor_sphere, 1, 1), + (ItemsType.hvy_armor_sphere, 1, 5), + (ItemsType.quality_sponge, 1, 14), + (ItemsType.gobul_spike_plus, 1, 20), + (ItemsType.gobul_fin_plus, 1, 7), + (ItemsType.lagiacrus_hide_plus, 1, 10), + (ItemsType.lagiacrus_scale_plus, 1, 8), + (ItemsType.shining_charm, 1, 10), + (ItemsType.black_gem_ticket, 1, 25) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000001, + 'objective_type': Monster.lagiacrus, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000001, + 'objective_type': Monster.gobul, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0, + 'rewards_row_1': [], + } + }, + 'unknown': { + # (2 for large mon quest, 3 for small/delivery, 5 for jhen/ala) + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" + +EVENT QUEST 18: Rage Match +Quest description from https://www.youtube.com/watch?v=rbbiLgsAoGU + thanks to "kazuma_6969" +(INCOMPLETE) Second deviljho does not spawn on a delay. +""" +QUEST_EVENT_RAGE_MATCH = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + ], + ], + 'quest_info': { + 'quest_id': 61018, + 'name': "Rage Match", + 'client': "Arena Manager", + 'description': "Hunt 2 Deviljho", + 'details': + "We've all heard of that\n" + "outrageous dragon of rage,\n" + "the Deviljho! Now, we've got\n" + "not one -- but two -- stalking\n" + "the Arena! What hunter has the\n" + "cojones to challenge these\n" + "pernicious predators? Not me.", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 1, 1) + ), + 'penalty_per_cart': 13000, + 'quest_fee': 3600, + 'time_limit': 50, + 'main_monster_1': Monster.none, + 'main_monster_2': Monster.none, + 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, + 'quest_rank': QuestRankType.urgent, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_51_INITJOIN, + 'resources': ResourcesType.high_rank, + 'supply_set_number': 43, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 244, + 'summon': 0x64010232, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.deviljho, + 'starting_area': 0x01, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x3C, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x0A + }, + 'monster_2': { + 'type': Monster.deviljho, + 'starting_area': 0x01, + 'boss_id': 0x02, + 'spawn_count': 0x01, + 'level': 0x3C, # 0x01 through 0x3c + 'size': 0x5A, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x0A + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.deviljho, + 'objective_num': 0x02, + 'zenny_reward': 36000, + 'hrp_reward': 2880, + 'rewards_row_1': [ + (ItemsType.deviljho_fang, 1, 6), + (ItemsType.deviljho_talon, 1, 13), + (ItemsType.deviljho_scale, 1, 26), + (ItemsType.deviljho_hide, 1, 20), + (ItemsType.shining_charm, 1, 6), + (ItemsType.deviljho_gem, 1, 4), + (ItemsType.wyvrnhide_ticket, 1, 25) + ], + 'rewards_row_2': [ + (ItemsType.deviljho_fang, 1, 6), + (ItemsType.deviljho_talon, 1, 13), + (ItemsType.deviljho_scale, 1, 26), + (ItemsType.deviljho_hide, 1, 20), + (ItemsType.shining_charm, 1, 6), + (ItemsType.deviljho_gem, 1, 4), + (ItemsType.wyvrnhide_ticket, 1, 25) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0, + 'objective_type': Monster.none, + 'objective_num': 0, + 'zenny_reward': 0, + 'hrp_reward': 0, + 'rewards_row_1': [], + } + }, + 'unknown': { + # (2 for large mon quest, 3 for small/delivery, 5 for jhen/ala) + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST 20: World Eater +Quest description/rewards/etc from https://www.youtube.com/watch?v=Z6joazT8J78 +(INCOMPLETE) Needs invading queropeco +""" +QUEST_EVENT_WORLD_EATER = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 1,'quantity': 1, + 'pos_x': 247.42,'pos_y': 560.37,'pos_z': -3613.80, + 'rot_x': 0,'rot_y': -119,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 3, + 'pos_x': -474.90,'pos_y': 491.91,'pos_z': -3857.25, + 'rot_x': 0,'rot_y': -267,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 1,'quantity': 3, + 'pos_x': 897.01,'pos_y': 418.60,'pos_z': -4931.83, + 'rot_x': 0,'rot_y': -284,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 2, + 'pos_x': 219.95,'pos_y': 402.97,'pos_z': -4449.25, + 'rot_x': 0,'rot_y': 244,'rot_z': 0, + }, + ], + [ + # Area 2 (Area 3 in Deserted Island) + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 2,'quantity': 3, + 'pos_x': -6654.10,'pos_y': 23.12,'pos_z': 117.64, + 'rot_x': 0,'rot_y': 455,'rot_z': 0, + }, + ], + [ + # Area 3 (Area 2 in Deserted Island) + { + 'type': Monster.aptonoth,'unk1': 0,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': -1, + 'pos_x': 2567.38,'pos_y': -4.58,'pos_z': -1280.44, + 'rot_x': 0,'rot_y': 352,'rot_z': 0, + }, + { + 'type': Monster.aptonoth,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 3,'quantity': -1, + 'pos_x': 2119.14,'pos_y': -14.21,'pos_z': -787.00, + 'rot_x': 0,'rot_y': 335,'rot_z': 0, + }, + ], + [ + # Area 4 (Area 7 in Deserted Island) + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 2, + 'pos_x': 39.65,'pos_y': 2.00,'pos_z': 2631.32, + 'rot_x': 0,'rot_y': 113,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 2, + 'pos_x': -538.14,'pos_y': 2.00,'pos_z': 2165.99, + 'rot_x': 0,'rot_y': -91,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 1, + 'pos_x': 360.98,'pos_y': 2.00,'pos_z': 820.71, + 'rot_x': 0,'rot_y': -187,'rot_z': 0, + }, + { + 'type': Monster.bnahabra2,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 4,'quantity': -1, + 'pos_x': -5671.42,'pos_y': 466.03,'pos_z': 3071.35, + 'rot_x': 273,'rot_y': 304,'rot_z': 0, + }, + ], + [ + # Area 5 + ], + [ + # Area 6 + ], + [ + # Area 7 (Area 11 in Deserted Island) + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 4,'room': 7,'quantity': 4, + 'pos_x': 2237.04,'pos_y': -1090.00,'pos_z': 1586.48, + 'rot_x': 0,'rot_y': 96,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 4,'room': 7,'quantity': 2, + 'pos_x': 2469.26,'pos_y': -1330.00,'pos_z': 2832.58, + 'rot_x': 0,'rot_y': -108,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 4,'room': 7,'quantity': 2, + 'pos_x': 1103.05,'pos_y': -2050.00,'pos_z': -1429.32, + 'rot_x': 0,'rot_y': -108,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 4,'room': 7,'quantity': 1, + 'pos_x': -3054.79,'pos_y': -3047.85,'pos_z': 3126.22, + 'rot_x': 0,'rot_y': -62,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 4,'room': 7,'quantity': 1, + 'pos_x': 1268.03,'pos_y': -2470.00,'pos_z': -557.22, + 'rot_x': 0,'rot_y': -108,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 3, + 'pos_x': 1742.13,'pos_y': -3820.00,'pos_z': -1993.49, + 'rot_x': 0,'rot_y': -108,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 2, + 'pos_x': 1732.89,'pos_y': -3580.00,'pos_z': -4462.32, + 'rot_x': 0,'rot_y': -278,'rot_z': 0, + }, + ], + [ + # Area 8 (Area 12 in the Deserted Island) + { + 'type': Monster.ludroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 2, + 'pos_x': 80.95,'pos_y': 35.81,'pos_z': -523.41, + 'rot_x': 0,'rot_y': -420,'rot_z': 0, + }, + { + 'type': Monster.ludroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 1, + 'pos_x': -1342.36,'pos_y': -18.00,'pos_z': 465.56, + 'rot_x': 0,'rot_y': -324,'rot_z': 0, + }, + ], + [ + # Area 9 (Area 6 in the Deserted Island) + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 3, + 'pos_x': 1059.13,'pos_y': 5.78,'pos_z': -3228.47, + 'rot_x': 0,'rot_y': -261,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 4, + 'pos_x': 390.83,'pos_y': 20.44,'pos_z': -746.07, + 'rot_x': 0,'rot_y': -176,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 2, + 'pos_x': -482.31,'pos_y': 16.39,'pos_z': 5.01, + 'rot_x': 0,'rot_y': 250,'rot_z': 0, + }, + ], + [ + # Area 10 (Area 8 in the Deserted Island) + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': 5, + 'pos_x': -1846.87,'pos_y': -263.00,'pos_z': 931.19, + 'rot_x': 0,'rot_y': -5,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': 3, + 'pos_x': -3160.63,'pos_y': -206.32,'pos_z': -355.73, + 'rot_x': 0,'rot_y': 307,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': 2, + 'pos_x': -1949.45,'pos_y': -276.13,'pos_z': 1228.73, + 'rot_x': 0,'rot_y': 216,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': -1, + 'pos_x': -1552.64,'pos_y': -186.42,'pos_z': 1504.30, + 'rot_x': 0,'rot_y': -28,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': -1, + 'pos_x': -1352.11,'pos_y': -174.80,'pos_z': 1441.92, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.bnahabra2,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': 1, + 'pos_x': -653.75,'pos_y': 306.58,'pos_z': 2295.24, + 'rot_x': 0,'rot_y': 221,'rot_z': 0, + }, + { + 'type': Monster.bnahabra2,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 10,'quantity': 4, + 'pos_x': -615.28,'pos_y': 96.58,'pos_z': 2086.81, + 'rot_x': 0,'rot_y': 119,'rot_z': 0, + }, + ], + [ + # Area 11 (Area 4 in the Deserted Island) + { + 'type': Monster.giggi,'unk1': 1,'unk2': 0xFF, + 'variant': 6,'room': 11,'quantity': 2, + 'pos_x': -453.62,'pos_y': 705.50,'pos_z': 2253.55, + 'rot_x': 0,'rot_y': -5,'rot_z': 0, + }, + { + 'type': Monster.giggi,'unk1': 1,'unk2': 0xFF, + 'variant': 6,'room': 11,'quantity': 4, + 'pos_x': 142.14,'pos_y': 336.98,'pos_z': 3677.44, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 11,'quantity': 1, + 'pos_x': 4363.26,'pos_y': 426.27,'pos_z': 5818.19, + 'rot_x': 0,'rot_y': 171,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 11,'quantity': 1, + 'pos_x': 4782.14,'pos_y': 426.27,'pos_z': 5556.53, + 'rot_x': 0,'rot_y': 164,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 11,'quantity': 1, + 'pos_x': 4617.08,'pos_y': 426.27,'pos_z': 6208.15, + 'rot_x': 0,'rot_y': 284,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 11,'quantity': 1, + 'pos_x': 5099.46,'pos_y': 426.27,'pos_z': 5456.15, + 'rot_x': 0,'rot_y': 161,'rot_z': 0, + }, + { + 'type': Monster.bnahabra2,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 4, + 'pos_x': 2767.15,'pos_y': 611.59,'pos_z': 4297.09, + 'rot_x': 0,'rot_y': -301,'rot_z': 0, + }, + { + 'type': Monster.bnahabra2,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': 2793.18,'pos_y': 1205.81,'pos_z': 5908.79, + 'rot_x': 0,'rot_y': -295,'rot_z': 0, + }, + { + 'type': Monster.bnahabra2,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 1, + 'pos_x': 3210.49,'pos_y': 845.81,'pos_z': 5369.26, + 'rot_x': 0,'rot_y': -398,'rot_z': 0, + }, + ], + [ + # Area 12 (Area 10 in the Deserted Island) + { + 'type': Monster.epioth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 12,'quantity': -1, + 'pos_x': 572.89,'pos_y': -618.12,'pos_z': -2648.11, + 'rot_x': 0,'rot_y': -142,'rot_z': 0, + }, + { + 'type': Monster.epioth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 12,'quantity': -1, + 'pos_x': -501.62,'pos_y': -210.00,'pos_z': -3356.64, + 'rot_x': 0,'rot_y': 45,'rot_z': 0, + }, + { + 'type': Monster.epioth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 12,'quantity': -1, + 'pos_x': -1624.63,'pos_y': -888.12,'pos_z': -2880.06, + 'rot_x': 0,'rot_y': 113,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 12,'quantity': -1, + 'pos_x': -2352.88,'pos_y': -523.55,'pos_z': -7478.20, + 'rot_x': 0,'rot_y': -91,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 12,'quantity': -1, + 'pos_x': -1957.86,'pos_y': -1228.41,'pos_z': -7734.46, + 'rot_x': 0,'rot_y': -91,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 12,'quantity': -1, + 'pos_x': -2821.80,'pos_y': -988.41,'pos_z': -8174.07, + 'rot_x': 0,'rot_y': -91,'rot_z': 0, + }, + { + 'type': Monster.fish,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 12,'quantity': -1, + 'pos_x': -2435.99,'pos_y': -988.41,'pos_z': -7780.24, + 'rot_x': 0,'rot_y': -91,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 61020, + 'name': "World Eater", + 'client': "Guildmaster", + 'description': "Hunt a Deviljho", + 'details': + "Emergency! A huge Deviljho has\n" + "appeared. It's twice as big as\n" + "a normal one and it's eating\n" + "everything in sight! Go get\n" + "it! And now, a haiku: A huge\n" + "Deviljho/with no food in its\n" + "stomach/eats the whole island.", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 1, 1) + ), + 'penalty_per_cart': 6000, + 'quest_fee': 1800, + 'time_limit': 50, + 'main_monster_1': Monster.jaggi, + 'main_monster_2': Monster.jaggia, + 'location': LocationType.QUEST_LOCATION_D_ISLAND, + 'quest_rank': QuestRankType.urgent, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_51_INITJOIN, + 'resources': ResourcesType.high_rank, + 'supply_set_number': 31, + 'starting_position': StartingPositionType.random, + 'general_enemy_level': 0x0034, + 'summon': 0x64010234, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.deviljho, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x40, # 0x01 through 0x3c + 'size': 0xC8, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.deviljho, + 'objective_num': 0x01, + 'zenny_reward': 18000, + 'hrp_reward': 1800, + 'rewards_row_1': [ + (ItemsType.timeworn_charm, 1, 33), + (ItemsType.deviljho_gem, 1, 4), + (ItemsType.deviljho_scalp, 1, 8), + (ItemsType.deviljho_hide, 1, 17), + (ItemsType.hvy_armor_sphere, 1, 11), + (ItemsType.shining_charm, 1, 19), + (ItemsType.deviljho_fang, 1, 8) + ], + 'rewards_row_2': [ + (ItemsType.deviljho_scalp, 1, 20), + (ItemsType.timeworn_charm, 1, 34), + (ItemsType.deviljho_fang, 1, 6), + (ItemsType.deviljho_hide, 1, 17), + (ItemsType.deviljho_gem, 1, 3), + (ItemsType.shining_charm, 1, 11), + (ItemsType.hvy_armor_sphere, 1, 9) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST 20: Where Gods Fear To Tread +Quest description from https://www.youtube.com/watch?v=mQHTdPRlD1w, + thanks to "soulmizute, emperor of the abyss#5094" + and "El Matiah#8904" +""" +QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + ], + ], + 'quest_info': { + 'quest_id': 61021, + 'name': "Where Gods Fear to Tread", + 'client': "Scarlet Mystery Man", + 'description': "Slay the Alatreon", + 'details': + "I've been waiting, hunter. Now\n" + "comes your final challenge:\n" + "Alatreon, a dragon of darkness\n" + "and light. Can mere mortals\n" + "fell an elder dragon feared\n" + "even by the gods? Don't even\n" + "bother saying your prayers...", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 0, 0, 0, 0, 1, 0) + ), + 'penalty_per_cart': 14000, + 'quest_fee': 4200, + 'time_limit': 50, + 'main_monster_1': Monster.none, + 'main_monster_2': Monster.none, + 'location': LocationType.QUEST_LOCATION_SACRED_LAND, + 'quest_rank': QuestRankType.urgent, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_51_INITJOIN, + 'resources': ResourcesType.high_rank, + 'supply_set_number': 0, + 'starting_position': StartingPositionType.shrine, + 'general_enemy_level': 0x0040, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.alatreon, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x40, # 0x01 through 0x3c + 'size': 0x7D, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000101, + 'objective_type': Monster.alatreon, + 'objective_num': 0x01, + 'zenny_reward': 42000, + 'hrp_reward': 4200, + 'rewards_row_1': [ + (ItemsType.alatreon_scute, 1, 40), + (ItemsType.brkn_skypiercer, 1, 30), + (ItemsType.alatreon_talon, 1, 10), + (ItemsType.alatreon_plate, 1, 10), + (ItemsType.skypiercer, 1, 5), + (ItemsType.azure_dragongem, 1, 5) + ], + 'rewards_row_2': [ + (ItemsType.alatreon_plate, 1, 11), + (ItemsType.brkn_skypiercer, 1, 34), + (ItemsType.alatreon_talon, 1, 39), + (ItemsType.elderdragonblood, 1, 6), + (ItemsType.skypiercer, 1, 5), + (ItemsType.azure_dragongem, 1, 5) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000005, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +QUEST_EVENT_GREEN_EGGS = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.giggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.giggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.giggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.giggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.giggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.giggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.bnahabra1,'unk1': 3,'unk2': 0xFF, + 'variant': 1,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.bnahabra1,'unk1': 3,'unk2': 0xFF, + 'variant': 1,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 61050, + 'name': "[MH3SP] Green Eggs and...", + 'client': "Ze SpyRo", + 'description': + "Hunt a Gigginox\n" + "and an Agnaktor", + 'details': + "Why do we live, only to suffer?\n" + "Only slayers of pig meat know\n" + "these things. Take care, Hunter,\n" + "for those who look to antidote\n" + "herbs may find their breath\n" + "stolen away.", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 1, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 0, 0) + ), + 'penalty_per_cart': 2400, + 'quest_fee': 200, + 'time_limit': 50, + 'main_monster_1': Monster.gigginox, + 'main_monster_2': Monster.agnaktor, + 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, + 'quest_rank': QuestRankType.star_3, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_18_INITJOIN, + 'resources': ResourcesType.low_rank, + 'supply_set_number': 43, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x001B, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.gigginox, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x1B, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_2': { + 'type': Monster.agnaktor, + 'starting_area': 0x00, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x1B, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x03 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x02, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.gigginox, + 'objective_num': 0x01, + 'zenny_reward': 7000, + 'hrp_reward': 950, + 'rewards_row_1': [ + (ItemsType.flabby_hide, 1, 18), + (ItemsType.uncanny_hide, 1, 6), + (ItemsType.pale_extract, 1, 11), + (ItemsType.poison_sac, 1, 15), + (ItemsType.agnaktor_shell, 1, 10), + (ItemsType.agnaktor_scale, 1, 16), + (ItemsType.agnaktor_hide, 1, 13), + (ItemsType.agnaktor_fin, 1, 6), + (ItemsType.agnaktor_beak, 1, 5) + ], + 'rewards_row_2': [ + (ItemsType.flabby_hide, 1, 13), + (ItemsType.uncanny_hide, 1, 6), + (ItemsType.pale_extract, 1, 11), + (ItemsType.poison_sac, 1, 10), + (ItemsType.agnaktor_shell, 1, 9), + (ItemsType.agnaktor_scale, 1, 10), + (ItemsType.agnaktor_hide, 1, 10), + (ItemsType.agnaktor_fin, 1, 6), + (ItemsType.agnaktor_beak, 1, 5), + (ItemsType.commendation, 1, 20) + ], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000001, + 'objective_type': Monster.agnaktor, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +""" +EVENT QUEST ???: Jump Fourty-Eight Jaggi +Quest description/rewards/etc from https://www.youtube.com/watch?v=qyQt2Xmpt0g +Quest requirements altered to make it possible to win. +""" +QUEST_EVENT_JUMP_FOURTY_EIGHT_JAGGI = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': 2039.26,'pos_y': 12.70,'pos_z': 210.05, + 'rot_x': 0,'rot_y': 17,'rot_z': 0, + + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': 857.89,'pos_y': -41.97,'pos_z': 814.06, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': 97.58,'pos_y': -75.54,'pos_z': 135.22, + 'rot_x': 0,'rot_y': -45,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 1,'quantity': 1, + 'pos_x': -393.52,'pos_y': -163.94,'pos_z': -667.01, + 'rot_x': 0,'rot_y': -199,'rot_z': 0, + }, + ], + [ + # Area 2 + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 2,'quantity': 1, + 'pos_x': -853.86,'pos_y': 19.45,'pos_z': 1381.66, + 'rot_x': 0,'rot_y': -113,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 2,'quantity': 2, + 'pos_x': -553.59,'pos_y': -2.57,'pos_z': -369.71, + 'rot_x': 0,'rot_y': 193,'rot_z': 0, + }, + { + 'type': Monster.kelbi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 2,'quantity': 3, + 'pos_x': -1698.75,'pos_y': 5.74,'pos_z': -530.30, + 'rot_x': 0,'rot_y': 398,'rot_z': 0, + }, + ], + [ + # Area 3 + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': -1, + 'pos_x': 873.28,'pos_y': 85.07,'pos_z': -610.86, + 'rot_x': 0,'rot_y': -153,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': -1, + 'pos_x': 1247.84,'pos_y': 106.65,'pos_z': 25.11, + 'rot_x': 0,'rot_y': -358,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 2,'room': 3,'quantity': 2, + 'pos_x': 177.92,'pos_y': 450.70,'pos_z': -32.21, + 'rot_x': 0,'rot_y': -238,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 3,'quantity': 2, + 'pos_x': -78.66,'pos_y': 330.70,'pos_z': 362.86, + 'rot_x': 0,'rot_y': -79,'rot_z': 0, + }, + ], + [ + # Area 4 + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 3, + 'pos_x': 606.18,'pos_y': -12.89,'pos_z': 4145.11, + 'rot_x': 0,'rot_y': 324,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': 1, + 'pos_x': 524.37,'pos_y': -18.65,'pos_z': 2292.05, + 'rot_x': 0,'rot_y': 199,'rot_z': 0, + }, + { + 'type': Monster.rhenoplos,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 4,'quantity': -1, + 'pos_x': -460.08,'pos_y': -71.51,'pos_z': 3044.50, + 'rot_x': 0,'rot_y': -460,'rot_z': 0, + }, + ], + [ + # Area 5 + { + 'type': Monster.jaggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': 1, + 'pos_x': 300.40,'pos_y': 4.00,'pos_z': -211.14, + 'rot_x': 0,'rot_y': 0,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': -1, + 'pos_x': 458.16,'pos_y': 1.49,'pos_z': -918.94, + 'rot_x': 0,'rot_y': 51,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': 4, + 'pos_x': 1813.83,'pos_y': 3.06,'pos_z': 925.68, + 'rot_x': 0,'rot_y': 494,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': -1, + 'pos_x': -504.37,'pos_y': 3.05,'pos_z': -757.30, + 'rot_x': 0,'rot_y': 676,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': 2, + 'pos_x': 1118.48,'pos_y': 4.00,'pos_z': -420.89, + 'rot_x': 0,'rot_y': 364,'rot_z': 0, + }, + { + 'type': Monster.jaggia,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 5,'quantity': -1, + 'pos_x': 2658.84,'pos_y': 3.24,'pos_z': 222.99, + 'rot_x': 0,'rot_y': 756,'rot_z': 0, + }, + ], + [ + # Area 6 (Area 8 in Sandy Plains) + { + 'type': Monster.rhenoplos,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': -1, + 'pos_x': 1612.71,'pos_y': -30.27,'pos_z': 695.30, + 'rot_x': 0,'rot_y': 517,'rot_z': 0, + }, + { + 'type': Monster.rhenoplos,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': -1, + 'pos_x': -2050.04,'pos_y': -31.90,'pos_z': -266.33, + 'rot_x': 0,'rot_y': 28,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 5, + 'pos_x': -344.14,'pos_y': -13.00,'pos_z': -26.14, + 'rot_x': 0,'rot_y': 443,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 4, + 'pos_x': -161.74,'pos_y': 4.80,'pos_z': -416.52, + 'rot_x': 0,'rot_y': 472,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 2, + 'pos_x': -481.05,'pos_y': 15.34,'pos_z': -643.19, + 'rot_x': 0,'rot_y': 568,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': -1, + 'pos_x': -692.26,'pos_y': -11.02,'pos_z': -235.13, + 'rot_x': 0,'rot_y': 608,'rot_z': 0, + }, + { + 'type': Monster.altaroth,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 6,'quantity': 3, + 'pos_x': -417.82,'pos_y': -1.44,'pos_z': -343.46, + 'rot_x': 0,'rot_y': 147,'rot_z': 0, + }, + ], + [ + # Area 7 (Area 9 in Sandy Plains) + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 3, + 'pos_x': 4294.59,'pos_y': -75.65,'pos_z': -2925.29, + 'rot_x': 0,'rot_y': -130,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 2, + 'pos_x': 3995.30,'pos_y': -45.09,'pos_z': -2049.22, + 'rot_x': 0,'rot_y': -85,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 2, + 'pos_x': 4187.00,'pos_y': -17.07,'pos_z': -1574.97, + 'rot_x': 0,'rot_y': -17,'rot_z': 0, + }, + { + 'type': Monster.jaggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 7,'quantity': 1, + 'pos_x': 3781.64,'pos_y': -66.86,'pos_z': -2570.78, + 'rot_x': 0,'rot_y': -130,'rot_z': 0, + }, + ], + [ + # Area 8 (Area 10 in Sandy Plains) + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 7, + 'pos_x': 293.99,'pos_y': -170.31,'pos_z': 4049.95, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 5, + 'pos_x': 124.95,'pos_y': -186.54,'pos_z': 3440.16, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 3, + 'pos_x': -425.01,'pos_y': -179.30,'pos_z': 4509.84, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 2, + 'pos_x': -714.48,'pos_y': -183.78,'pos_z': 4108.50, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.delex,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': 1, + 'pos_x': -1021.27,'pos_y': -215.48,'pos_z': 3726.09, + 'rot_x': 0,'rot_y': 819,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': -1, + 'pos_x': -1974.57,'pos_y': -209.48,'pos_z': -316.05, + 'rot_x': 0,'rot_y': -56,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 8,'quantity': -1, + 'pos_x': -1825.11,'pos_y': -210.91,'pos_z': -382.90, + 'rot_x': 0,'rot_y': 130,'rot_z': 0, + + }, + ], + [ + # Area 9 (Area 7 in Sandy Plains) + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 2, + 'pos_x': 3383.92,'pos_y': 2.65,'pos_z': 592.49, + 'rot_x': 0,'rot_y': -193,'rot_z': 0, + }, + { + 'type': Monster.felyne,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': 1, + 'pos_x': 2653.55,'pos_y': -22.59,'pos_z': 987.24, + 'rot_x': 0,'rot_y': -73,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': -1, + 'pos_x': 2838.69,'pos_y': -28.00,'pos_z': 445.91, + 'rot_x': 0,'rot_y': -142,'rot_z': 0, + }, + { + 'type': Monster.melynx,'unk1': 3,'unk2': 0xFF, + 'variant': 0,'room': 9,'quantity': -1, + 'pos_x': 2109.53,'pos_y': -26.57,'pos_z': 575.43, + 'rot_x': 0,'rot_y': -460,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 9,'quantity': -1, + 'pos_x': -1713.72,'pos_y': 1262.50,'pos_z': 2199.24, + 'rot_x': 273,'rot_y': -45,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 1,'room': 9,'quantity': 6, + 'pos_x': -1174.44,'pos_y': 1319.50,'pos_z': 1682.19, + 'rot_x': 0,'rot_y': -39,'rot_z': 0, + }, + ], + [ + # Area 10 + ], + [ + # Area 11 (Area 6 in Sandy Plains) + { + 'type': Monster.giggi,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': 2195.89,'pos_y': 73.70,'pos_z': -720.92, + 'rot_x': 0,'rot_y': 39,'rot_z': 0, + + }, + { + 'type': Monster.giggi,'unk1': 1,'unk2': 0xFF, + 'variant': 6,'room': 11,'quantity': 1, + 'pos_x': -535.73,'pos_y': 1212.59,'pos_z': 896.44, + 'rot_x': 0,'rot_y': 169,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': -434.00,'pos_y': 198.96,'pos_z': 289.52, + 'rot_x': 0,'rot_y': -267,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': -802.69,'pos_y': 198.96,'pos_z': 66.62, + 'rot_x': 0,'rot_y': -216,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 2, + 'pos_x': -645.14,'pos_y': 288.96,'pos_z': -371.21, + 'rot_x': 0,'rot_y': -227,'rot_z': 0, + }, + { + 'type': Monster.bnahabra3,'unk1': 1,'unk2': 0xFF, + 'variant': 0,'room': 11,'quantity': 1, + 'pos_x': -473.33,'pos_y': 168.96,'pos_z': -166.43, + 'rot_x': 0,'rot_y': -210,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 61003, + 'name': "Jump Fourty-Eight Jaggi", + 'client': "Guild Subcontractor", + 'description': "Hunt 48 Great Jaggi", + 'details': + "I'm gonna get so fired for\n" + "this... The Great Jaggi some\n" + "hunter brought in just\n" + "escaped. Mind going after\n" + "them? You better hurry,\n" + "though. Bet they've got some\n" + "incredible materials, too.", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 1, 0, 0, 0, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 1, 0, 0, 0, 1, 1) + ), + 'penalty_per_cart': 1400, + 'quest_fee': 400, + 'time_limit': 50, + 'main_monster_1': Monster.bnahabra2, + 'main_monster_2': Monster.melynx, + 'location': LocationType.QUEST_LOCATION_SANDY_PLAINS, + 'quest_rank': QuestRankType.star_1, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, + 'resources': ResourcesType.low_rank, + 'supply_set_number': 19, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x64050219, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.great_jaggi, + 'starting_area': 0x00, + 'boss_id': 0xFF, + 'spawn_count': 0x10, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x01 + }, + 'monster_2': { + 'type': Monster.great_jaggi, + 'starting_area': 0x00, + 'boss_id': 0xFF, + 'spawn_count': 0x10, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x01 + }, + 'monster_3': { + 'type': Monster.great_jaggi, + 'starting_area': 0x00, + 'boss_id': 0xFF, + 'spawn_count': 0x10, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x01 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000001, + 'objective_type': Monster.great_jaggi, + 'objective_num': 0x30, + 'zenny_reward': 15000, + 'hrp_reward': 750, + 'rewards_row_1': [ + (ItemsType.great_jagi_claw, 2, 3), + (ItemsType.great_jagi_hide, 2, 12), + (ItemsType.kings_frill, 1, 10), + (ItemsType.rustshard, 1, 20), + (ItemsType.commendation, 1, 12), + (ItemsType.voucher, 2, 18), + (ItemsType.great_jagi_head, 1, 25) + ], + 'rewards_row_2': [ + (ItemsType.mystery_charm, 1, 1), + (ItemsType.aquaglow_jewel, 1, 1), + (ItemsType.shining_charm, 1, 1), + (ItemsType.armor_sphere, 1, 1), + (ItemsType.armor_sphere_plus, 1, 1) + ], + }, + 'subquest_1': { + 'description': "Hunt 24 Great Jaggi", + 'type': 0x00000001, + 'objective_type': Monster.great_jaggi, + 'objective_num': 0x18, + 'zenny_reward': 8000, + 'hrp_reward': 255, + 'rewards_row_1': [ + (ItemsType.great_jagi_claw, 1, 1), + (ItemsType.great_jagi_hide, 1, 1), + (ItemsType.jagi_scale, 1, 1), + (ItemsType.screamer, 1, 1), + (ItemsType.kings_frill, 1, 1), + (ItemsType.bone_husk_s, 8, 1), + (ItemsType.great_jagi_head, 1, 1) + ], + }, + 'subquest_2': { + 'description': "None", + 'type': 0, + 'objective_type': Monster.none, + 'objective_num': 0, + 'zenny_reward': 0, + 'hrp_reward': 0, + 'rewards_row_1': [], + } + }, + 'unknown': { + # (2 for large mon quest, 3 for small/delivery, 5 for jhen/ala) + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + } +} + + +# ---------- ARENA QUESTS ---------- + +""" +00 00 00 28 +00 00 00 FF +FF +01 +01 +03 +00 00 00 00 +BF 00 00 00 +C5 9D 74 00 +C5 3E 2B 33 +00 00 00 00 +FF FF A4 00 +00 00 00 00 +FF 00 00 00 +00 00 00 00 +""" + +GRUDGE_MATCH_ROYAL_LUDROTH = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.fly_wyv,'unk1': 1,'unk2': 0xFF, + 'variant': 3,'room': 1,'quantity': -1, + 'pos_x': -0.5,'pos_y': -5038.5,'pos_z': -3042.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 0xEA61, + 'name': "Grudge Match: Royal Ludroth", + 'client': "Announcer/Receptionist", + 'description': "Slay a Royal Ludroth", + 'details': + "Ahoy, adrenaline junkies!\n" + "Next up is the regally maned\n" + "Royal Ludroth! Will the pressure\n" + "of facing this sea dragon on\n" + "its home surf with a strict\n" + "time limit leave the hunters\n" + "all washed up?", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 0, 0, 0, 1, 0, 0), + (1, 0, 0, 0, 1, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 0, 0, 1, 0, 1, 0) + ), + 'penalty_per_cart': 350, + 'quest_fee': 0, + 'time_limit': 50, + 'main_monster_1': Monster.none, + 'main_monster_2': Monster.none, + 'location': LocationType.QUEST_LOCATION_WATER_ARENA_2, + 'quest_rank': QuestRankType.star_1, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, + 'resources': ResourcesType.arena, + 'supply_set_number': 0, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.royal_ludroth, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000101, + 'objective_type': Monster.royal_ludroth, + 'objective_num': 0x01, + 'zenny_reward': 1000, + 'hrp_reward': 0, + 'rewards_row_1': [ + (ItemsType.r_ludroth_coin, 1, 24), + (ItemsType.r_ludroth_coin, 2, 8), + (ItemsType.voucher, 1, 10), + (ItemsType.armor_sphere, 1, 24), + (ItemsType.steel_eg, 1, 18), + (ItemsType.pinnacle_coin, 1, 16) + ], + 'rewards_row_2': [], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + }, + 'arena_equipment': ( + ( + (EquipmentClasses.SnS, SnS.HydraKnife), + None, None, + Helmet.QurupecoHelm, Chestpiece.QurupecoMail, + Gauntlets.BlastBracelet, Faulds.SteelFaulds, + Leggings.IngotGreaves, + ((ItemsType.whetstone, 20), (ItemsType.potion, 10), + (ItemsType.ration, 10), (ItemsType.oxygen_supply, 10), + (ItemsType.lifepowder, 2), (ItemsType.barrel_bomb_l, 3), + (ItemsType.barrel_bomb_s, 10)), + () + ), + ( + (EquipmentClasses.Greatsword, Greatsword.ChieftainsGrtSwd), + None, None, + Helmet.DrawEarring, Chestpiece.SteelMail, + Gauntlets.GobulVambraces, Faulds.GobulFaulds, + Leggings.HuntersGreaves, + ((ItemsType.whetstone, 20), (ItemsType.potion, 10), + (ItemsType.ration, 10), (ItemsType.oxygen_supply, 10), + (ItemsType.might_pill, 2), (ItemsType.shock_trap, 1), + (ItemsType.ez_flash_bomb, 1)), + () + ), + ( + (EquipmentClasses.Hammer, Hammer.BoneBludgeon), + None, None, + Helmet.BarrothHelm, Chestpiece.BarrothMail, + Gauntlets.AlloyVambraces, Faulds.BarrothFaulds, + Leggings.BarrothGreaves, + ((ItemsType.whetstone, 20), (ItemsType.potion, 10), + (ItemsType.ration, 10), (ItemsType.oxygen_supply, 10), + (ItemsType.paralysis_knife, 5), (ItemsType.ez_flash_bomb, 1)), + () + ), + ( + (EquipmentClasses.BowgunFrame, BowgunFrame.RoyalLauncher), + (EquipmentClasses.BowgunBarrel, BowgunBarrel.JaggidFire), + (EquipmentClasses.BowgunStock, BowgunStock.LightBowgun), + Helmet.AlloyCap, Chestpiece.AlloyVest, + Gauntlets.LagiacrusGuards, Faulds.AlloyCoat, + Leggings.PiscineLeggings, + ((ItemsType.potion, 10), (ItemsType.ration, 10), + (ItemsType.oxygen_supply, 10), (ItemsType.lifepowder, 2), + (ItemsType.shock_trap, 1), (ItemsType.barrel_bomb_l_plus, 2), + (ItemsType.barrel_bomb_l, 2)), + ((ItemsType.normal_s_lv2, 99), (ItemsType.pierce_s_lv1, 60), + (ItemsType.pierce_s_lv2, 50), (ItemsType.clust_s_lv1, 5), + (ItemsType.poison_s_lv1, 12), (ItemsType.para_s_lv1, 12)) + ) + ) +} + + +GRUDGE_MATCH_BIRD_BRUTE = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.fly_wyv,'unk1': 1,'unk2': 0xFF, + 'variant': 3,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 0xEA66, + 'name': "Grudge Match: Bird and Brute", + 'client': "Announcer/Receptionist", + 'description': + "Slay a Qurupeco\n" + "and a Barroth", + 'details': + "Double trouble! It's the\n" + "dirty-bird Qurupeco and the\n" + "land dragon Barroth -- heaven\n" + "and earth, laughter and tears,\n" + "in an ultimate contest! When\n" + "the dust clears, will it\n" + "reveal victory? Or tragedy?", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 1, 0, 0, 0, 1, 0, 0), + (1, 0, 0, 0, 1, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 0, 0, 1, 0, 1, 0) + ), + 'penalty_per_cart': 350, + 'quest_fee': 0, + 'time_limit': 50, + 'main_monster_1': Monster.none, + 'main_monster_2': Monster.none, + 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, + 'quest_rank': QuestRankType.star_4, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_31_INITJOIN, + 'resources': ResourcesType.arena, + 'supply_set_number': 0, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.qurupeco, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.barroth, + 'starting_area': 0x00, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000101, + 'objective_type': Monster.qurupeco, + 'objective_num': 0x01, + 'zenny_reward': 1000, + 'hrp_reward': 0, + 'rewards_row_1': [ + (ItemsType.qurupeco_coin, 1, 16), + (ItemsType.barroth_coin, 1, 20), + (ItemsType.voucher, 1, 14), + (ItemsType.armor_sphere_plus, 1, 10), + (ItemsType.adv_armor_sphere, 1, 5), + (ItemsType.steel_eg, 1, 15), + (ItemsType.silver_eg, 1, 5), + (ItemsType.hunter_king_coin, 1, 15) + ], + 'rewards_row_2': [], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000101, + 'objective_type': Monster.barroth, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + }, + 'arena_equipment': ( + ( + (EquipmentClasses.Switchaxe, Switchaxe.AssaultAxePlus), + None, None, + Helmet.GigginoxCapPlus, Chestpiece.AlloyMail, + Gauntlets.BaggiVambracesPlus, Faulds.GigginoxFauldsPlus, + Leggings.GigginoxGreaves, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.whetstone, 20), (ItemsType.ration, 10), + (ItemsType.cleanser, 5), (ItemsType.barrel_bomb_l, 2), + (ItemsType.lifepowder, 1), (ItemsType.ez_shock_trap, 1), + (ItemsType.ez_flash_bomb, 2)), + () + ), + ( + (EquipmentClasses.Greatsword, Greatsword.CataclysmSword), + None, None, + Helmet.DrawEarring, Chestpiece.JaggiMailPlus, + Gauntlets.JaggiVambracesPlus, Faulds.JaggiFauldsPlus, + Leggings.BoneGreavesPlus, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.whetstone, 20), (ItemsType.ration, 10), + (ItemsType.cleanser, 5), (ItemsType.barrel_bomb_l, 3), + (ItemsType.barrel_bomb_s, 2), (ItemsType.pitfall_trap, 1), + (ItemsType.ez_flash_bomb, 2)), + () + ), + ( + (EquipmentClasses.Lance, Lance.Undertaker), + None, None, + Helmet.DiablosCap, Chestpiece.AgnaktorMailPlus, + Gauntlets.SteelVambracesPlus, Faulds.SteelCoilPlus, + Leggings.AlloyGreaves, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.whetstone, 20), (ItemsType.ration, 10), + (ItemsType.cleanser, 5), (ItemsType.barrel_bomb_l, 2), + (ItemsType.ez_flash_bomb, 1)), + () + ), + ( + (EquipmentClasses.BowgunFrame, BowgunFrame.PoisonStinger), + (EquipmentClasses.BowgunBarrel, BowgunBarrel.RathlingGunPlus), + (EquipmentClasses.BowgunStock, BowgunStock.LightBowgun), + Helmet.AgnaktorCapPlus, Chestpiece.AgnaktorVestPlus, + Gauntlets.AgnaktorGuardsPlus, Faulds.AgnaktorCoatPlus, + Leggings.RathalosLeggingsPlus, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.ration, 10), (ItemsType.cleanser, 5), + (ItemsType.lifepowder, 2), (ItemsType.ez_flash_bomb, 1), + (ItemsType.sonic_bomb, 2)), + ((ItemsType.normal_s_lv2, 99), (ItemsType.normal_s_lv3, 99), + (ItemsType.pierce_s_lv2, 50), (ItemsType.clust_s_lv2, 5), + (ItemsType.crag_s_lv2, 9), (ItemsType.poison_s_lv1, 12), + (ItemsType.para_s_lv1, 12), (ItemsType.sleep_s_lv1, 12)) + ) + ) +} + + +GRUDGE_MATCH_TWO_FLAMES = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.fly_wyv,'unk1': 1,'unk2': 0xFF, + 'variant': 3,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 0xEA68, + 'name': "Grudge Match: The Two Flames", + 'client': "Announcer/Receptionist", + 'description': + "Slay a Rathalos\n" + "and a Rathian", + 'details': + "Wanted:\n" + "The description for this\n" + "quest! If you can find\n" + "it, please let us know!\n" + "Thanks!", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 1, 0, 0, 0, 1, 0, 0), + (1, 0, 0, 0, 1, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 0, 0, 1, 0, 1, 0) + ), + 'penalty_per_cart': 350, + 'quest_fee': 0, + 'time_limit': 50, + 'main_monster_1': Monster.none, + 'main_monster_2': Monster.none, + 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, + 'quest_rank': QuestRankType.star_5, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_31_INITJOIN, + 'resources': ResourcesType.arena, + 'supply_set_number': 0, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.rathalos, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.rathian, + 'starting_area': 0x00, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x17, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.none, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x00, + 'level': 0x00, # 0x01 through 0x3c + 'size': 0x00, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00000101, + 'objective_type': Monster.rathalos, + 'objective_num': 0x01, + 'zenny_reward': 1000, + 'hrp_reward': 0, + 'rewards_row_1': [ + (ItemsType.rathalos_coin, 1, 10), + (ItemsType.rathian_coin, 1, 24), + (ItemsType.voucher, 1, 14), + (ItemsType.armor_sphere_plus, 1, 10), + (ItemsType.adv_armor_sphere, 1, 5), + (ItemsType.steel_eg, 1, 15), + (ItemsType.silver_eg, 1, 5), + (ItemsType.hunter_king_coin, 1, 17) + ], + 'rewards_row_2': [], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00000101, + 'objective_type': Monster.rathian, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00000000, + 'objective_type': Monster.none, + 'objective_num': 0x00, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + }, + 'arena_equipment': ( + ( + (EquipmentClasses.SnS, SnS.IcicleSpikePlus), + None, None, + Helmet.QurupecoHelmPlus, Chestpiece.QurupecoMailPlus, + Gauntlets.QurupecoVambracesPlus, Faulds.QurupecoCoilPlus, + Leggings.QurupecoGreavesPlus, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.whetstone, 20), (ItemsType.ration, 10), + (ItemsType.might_pill, 2), (ItemsType.antidote, 2), + (ItemsType.lifepowder, 1), (ItemsType.dung_bomb, 1), + (ItemsType.paralysis_knife, 5), (ItemsType.pitfall_trap, 1), + (ItemsType.ez_flash_bomb, 5), (ItemsType.barrel_bomb_l_plus, 1), + (ItemsType.barrel_bomb_s, 1)), + () + ), + ( + (EquipmentClasses.Longsword, Longsword.Thunderclap), + None, None, + Helmet.SilenceEarring, Chestpiece.AlloyMailPlus, + Gauntlets.SteelVambracesPlus, Faulds.SteelCoilPlus, + Leggings.VangisGreaves, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.whetstone, 20), (ItemsType.ration, 10), + (ItemsType.antidote, 2), (ItemsType.lifepowder, 1), + (ItemsType.dung_bomb, 1), (ItemsType.ez_flash_bomb, 2)), + () + ), + ( + (EquipmentClasses.Lance, Lance.SpiralLancePlus), + None, None, + Helmet.DemonEdgeEarring, Chestpiece.IngotMailPlus, + Gauntlets.AgnaktorVambracesPlus, Faulds.RhenoplosCoilPlus, + Leggings.IngotGreavesPlus, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.whetstone, 20), (ItemsType.well_done_steak, 10), + (ItemsType.antidote, 2), (ItemsType.lifepowder, 1), + (ItemsType.dung_bomb, 1), (ItemsType.poison_knife, 5), + (ItemsType.shock_trap, 1), (ItemsType.ez_flash_bomb, 1)), + () + ), + ( + (EquipmentClasses.BowgunFrame, BowgunFrame.ThundacrusRex), + (EquipmentClasses.BowgunBarrel, BowgunBarrel.ThundacrusRex), + (EquipmentClasses.BowgunStock, BowgunStock.BlizzardCannon), + Helmet.EarringofFate, Chestpiece.UragaanVestPlus, + Gauntlets.BlastBracelet, Faulds.UragaanCoatPlus, + Leggings.UragaanLeggingsPlus, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.ration, 10), (ItemsType.antidote, 2), + (ItemsType.lifepowder, 2), (ItemsType.dung_bomb, 1), + (ItemsType.shock_trap, 1), (ItemsType.ez_shock_trap, 1), + (ItemsType.pitfall_trap, 1), (ItemsType.ez_barrel_bomb_l, 1), + (ItemsType.barrel_bomb_l, 3), (ItemsType.barrel_bomb_s, 10)), + ((ItemsType.normal_s_lv2, 99), (ItemsType.normal_s_lv3, 99), + (ItemsType.pierce_s_lv3, 40), (ItemsType.demon_s_ii, 5), + (ItemsType.thunder_s, 60)) + ) + ) +} + + +GRUDGE_MATCH_LAND_LORDS = { + 'small_monsters': [ + [ + # Area 0 + ], + [ + # Area 1 + { + 'type': Monster.fly_wyv,'unk1': 1,'unk2': 0xFF, + 'variant': 3,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 170,'rot_z': 0, + }, + { + 'type': Monster.fly_wyv,'unk1': 3,'unk2': 0xFF, + 'variant': 8,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 1828,'rot_z': 0, + }, + { + 'type': Monster.fly_wyv,'unk1': 3,'unk2': 0xFF, + 'variant': 8,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 1828,'rot_z': 0, + }, + { + 'type': Monster.fly_wyv,'unk1': 3,'unk2': 0xFF, + 'variant': 8,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 1828,'rot_z': 0, + }, + { + 'type': Monster.fly_wyv,'unk1': 3,'unk2': 0xFF, + 'variant': 8,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 1828,'rot_z': 0, + }, + { + 'type': Monster.fly_wyv,'unk1': 3,'unk2': 0xFF, + 'variant': 8,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 1828,'rot_z': 0, + }, + { + 'type': Monster.fly_wyv,'unk1': 3,'unk2': 0xFF, + 'variant': 8,'room': 1,'quantity': -1, + 'pos_x': -2404.5,'pos_y': -5038.5,'pos_z': -3542.7, + 'rot_x': 0,'rot_y': 1828,'rot_z': 0, + }, + ], + ], + 'quest_info': { + 'quest_id': 0xEA6B, + 'name': "Grudge Match: Land Lords", + 'client': "Announcer/Receptionist", + 'description': "Slay all 3 monsters", + 'details': + "Wanted:\n" + "The description for this\n" + "quest! If you can find\n" + "it, please let us know!\n" + "Thanks!", + 'success_message': "Complete the Main Quest.", + 'flags': ( + (0, 0, 1, 0, 0, 1, 0, 0), + (1, 0, 0, 0, 1, 0, 0, 0), + (0, 0, 0, 0, 0, 0, 0, 0), + (1, 0, 0, 0, 1, 0, 1, 0) + ), + 'penalty_per_cart': 1150, + 'quest_fee': 0, + 'time_limit': 50, + 'main_monster_1': Monster.none, + 'main_monster_2': Monster.none, + 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, + 'quest_rank': QuestRankType.urgent, + 'hrp_restriction': QuestRestrictionType.RESTRICTION_31_INITJOIN, + 'resources': ResourcesType.arena, + 'supply_set_number': 0, + 'starting_position': StartingPositionType.camp, + 'general_enemy_level': 0x0017, + 'summon': 0x00000000, + 'wave_1_transition_type': WaveType.none, + 'wave_1_transition_target': 0x0000, + 'wave_1_transition_quantity': 0x0000, + 'wave_2_transition_type': WaveType.none, + 'wave_2_transition_target': 0x0000, + 'wave_2_transition_quantity': 0x0000, + }, + 'large_monsters': { + 'monster_1': { + 'type': Monster.barroth, + 'starting_area': 0x00, + 'boss_id': 0x00, + 'spawn_count': 0x01, + 'level': 0x17, + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_2': { + 'type': Monster.uragaan, + 'starting_area': 0x00, + 'boss_id': 0x01, + 'spawn_count': 0x01, + 'level': 0x17, + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + }, + 'monster_3': { + 'type': Monster.deviljho, + 'starting_area': 0x00, + 'boss_id': 0x02, + 'spawn_count': 0x01, + 'level': 0x12, # 0x01 through 0x3c + 'size': 0x64, + 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 + 'size_spread': 0x00 + } + }, + 'objective_details': { + 'main_quest': { + 'type': 0x00020101, + 'objective_type': Monster.barroth, + 'objective_num': 0x01, + 'zenny_reward': 3000, + 'hrp_reward': 0, + 'rewards_row_1': [ + (ItemsType.deviljho_coin, 1, 10), + (ItemsType.barroth_coin, 1, 10), + (ItemsType.uragaan_coin, 1, 15), + (ItemsType.voucher, 1, 14), + (ItemsType.adv_armor_sphere, 1, 10), + (ItemsType.hrd_armor_sphere, 1, 7), + (ItemsType.silver_eg, 1, 10), + (ItemsType.hunter_king_coin, 1, 24) + ], + 'rewards_row_2': [], + }, + 'subquest_1': { + 'description': "None", + 'type': 0x00020101, + 'objective_type': Monster.uragaan, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + 'subquest_2': { + 'description': "None", + 'type': 0x00020101, + 'objective_type': Monster.deviljho, + 'objective_num': 0x01, + 'zenny_reward': 0, + 'hrp_reward': 0x00000000, + 'rewards_row_1': [], + }, + }, + 'unknown': { + # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala + 'unk_12': 0x00000002, + 'unk_4': 0x00, + 'unk_5': 0x00, + 'unk_6': 0x00, + 'unk_7': 0x00000000, + }, + 'arena_equipment': ( + ( + (EquipmentClasses.SnS, SnS.PlagueTabar), + None, None, + Helmet.UragaanHelmPlus, Chestpiece.UragaanMailPlus, + Gauntlets.UragaanVambracesPlus, Faulds.UragaanFauldsPlus, + Leggings.UragaanGreavesPlus, + ((ItemsType.whetstone, 20), (ItemsType.potion, 10), + (ItemsType.mega_potion, 10), (ItemsType.energy_drink, 5), + (ItemsType.lifepowder, 3), (ItemsType.paralysis_knife, 5), + (ItemsType.sleep_knife, 5), (ItemsType.poison_knife, 5), + (ItemsType.tinged_meat, 5), (ItemsType.druged_meat, 5), + (ItemsType.poisoned_meat, 5), (ItemsType.pitfall_trap, 1), + (ItemsType.shock_trap, 1), (ItemsType.ez_shock_trap, 1), + (ItemsType.ez_flash_bomb, 5), (ItemsType.barrel_bomb_l_plus, 2), + (ItemsType.barrel_bomb_l, 3), (ItemsType.barrel_bomb_s, 10), + (ItemsType.max_potion, 2), (ItemsType.ancient_potion, 1), + (ItemsType.powercharm, 1), (ItemsType.armorcharm, 1), + (ItemsType.powertalon, 1), (ItemsType.armortalon, 1)), + () + ), + ( + (EquipmentClasses.Switchaxe, Switchaxe.GreatDemonbindG), + None, None, + Helmet.RathalosHelmPlus, Chestpiece.RathalosMailPlus, + Gauntlets.RathalosVambracesPlus, Faulds.RathalosFauldsPlus, + Leggings.RathalosGreavesPlus, + ((ItemsType.whetstone, 20), (ItemsType.potion, 10), + (ItemsType.mega_potion, 10), (ItemsType.energy_drink, 5), + (ItemsType.lifepowder, 3), (ItemsType.dung_bomb, 5), + (ItemsType.paralysis_knife, 5), (ItemsType.sleep_knife, 5), + (ItemsType.poison_knife, 5), (ItemsType.tinged_meat, 5), + (ItemsType.druged_meat, 5), (ItemsType.poisoned_meat, 5), + (ItemsType.pitfall_trap, 1), (ItemsType.shock_trap, 1), + (ItemsType.ez_flash_bomb, 5), (ItemsType.barrel_bomb_l_plus, 1), + (ItemsType.max_potion, 2), (ItemsType.ancient_potion, 1), + (ItemsType.powercharm, 1), (ItemsType.armorcharm, 1), + (ItemsType.powertalon, 1), (ItemsType.armortalon, 1)), + () + ), + ( + (EquipmentClasses.Longsword, Longsword.ReaverCalamity), + None, None, + Helmet.StimulusEarring, Chestpiece.VangisMail, + Gauntlets.DoberVambraces, Faulds.DoberCoil, + Leggings.DamascusGreaves, + ((ItemsType.whetstone, 20), (ItemsType.potion, 10), + (ItemsType.mega_potion, 10), (ItemsType.energy_drink, 5), + (ItemsType.cleanser, 5), (ItemsType.lifepowder, 5), + (ItemsType.paralysis_knife, 5), (ItemsType.sleep_knife, 5), + (ItemsType.poison_knife, 5), (ItemsType.tinged_meat, 5), + (ItemsType.druged_meat, 5), (ItemsType.poisoned_meat, 5), + (ItemsType.pitfall_trap, 1), (ItemsType.shock_trap, 1), + (ItemsType.ez_shock_trap, 1), (ItemsType.ez_flash_bomb, 5), + (ItemsType.barrel_bomb_l_plus, 2), (ItemsType.barrel_bomb_l, 3), + (ItemsType.barrel_bomb_s, 10), (ItemsType.max_potion, 2), + (ItemsType.ancient_potion, 1), (ItemsType.powercharm, 1), + (ItemsType.armorcharm, 1), (ItemsType.armortalon, 1)), + () + ), + ( + (EquipmentClasses.BowgunFrame, BowgunFrame.Diablazooka), + (EquipmentClasses.BowgunBarrel, BowgunBarrel.DevilsGrin), + (EquipmentClasses.BowgunStock, BowgunStock.BlizzardCannon), + Helmet.BarrageEarring, Chestpiece.DamascusVest, + Gauntlets.DamascusGuards, Faulds.DamascusCoat, + Leggings.DamascusLeggings, + ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), + (ItemsType.energy_drink, 5), (ItemsType.lifepowder, 3), + (ItemsType.paralysis_knife, 5), (ItemsType.sleep_knife, 5), + (ItemsType.poison_knife, 5), (ItemsType.tinged_meat, 5), + (ItemsType.druged_meat, 5), (ItemsType.pitfall_trap, 1), + (ItemsType.shock_trap, 1), (ItemsType.ez_shock_trap, 1), + (ItemsType.ez_flash_bomb, 5), (ItemsType.ez_barrel_bomb_l, 2), + (ItemsType.barrel_bomb_l_plus, 2), (ItemsType.barrel_bomb_l, 3), + (ItemsType.barrel_bomb_s, 10), (ItemsType.max_potion, 2), + (ItemsType.ancient_potion, 1), (ItemsType.powercharm, 1), + (ItemsType.armorcharm, 1), (ItemsType.powertalon, 1), + (ItemsType.armortalon, 1)), + ((ItemsType.normal_s_lv2, 99), (ItemsType.pierce_s_lv3, 40), + (ItemsType.crag_s_lv2, 9), (ItemsType.crag_s_lv3, 9), + (ItemsType.wyvernfire_lv1, 10), (ItemsType.water_s, 60), + (ItemsType.sleep_s_lv2, 8), (ItemsType.dragon_s, 20), + (ItemsType.demon_s_ii, 5)) + ) + ) +} + + +if __name__ == "__main__": + QUESTS = [] + QUESTS.append(QUEST_EVENT_JUMP_FOUR_JAGGI) + QUESTS.append(QUEST_EVENT_THE_PHANTOM_URAGAAN) + QUESTS.append(QUEST_EVENT_BLOOD_SPORT) + QUESTS.append(QUEST_EVENT_MERCY_MISSION) + QUESTS.append(QUEST_EVENT_FF_FREE_FOR_ALL) + QUESTS.append(QUEST_EVENT_RAGE_MATCH) + QUESTS.append(QUEST_EVENT_WORLD_EATER) + QUESTS.append(QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD) + QUESTS.append(QUEST_EVENT_GREEN_EGGS) + QUESTS.append(QUEST_EVENT_JUMP_FOURTY_EIGHT_JAGGI) + QUESTS.append(GRUDGE_MATCH_ROYAL_LUDROTH) + QUESTS.append(GRUDGE_MATCH_BIRD_BRUTE) + QUESTS.append(GRUDGE_MATCH_TWO_FLAMES) + QUESTS.append(GRUDGE_MATCH_LAND_LORDS) + for q in QUESTS: + EXPORT(q) + print("done") diff --git a/event/Blood Sport.json b/event/Blood Sport.json new file mode 100644 index 0000000..bea5c12 --- /dev/null +++ b/event/Blood Sport.json @@ -0,0 +1,240 @@ +{ + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 1760, + "rewards_row_1": [ + [ + 479, + 1, + 1 + ], + [ + 457, + 1, + 14 + ], + [ + 410, + 1, + 10 + ], + [ + 296, + 1, + 20 + ], + [ + 386, + 1, + 12 + ], + [ + 455, + 8, + 9 + ], + [ + 412, + 1, + 9 + ], + [ + 592, + 1, + 25 + ] + ], + "rewards_row_2": [ + [ + 479, + 1, + 1 + ], + [ + 457, + 1, + 14 + ], + [ + 410, + 1, + 10 + ], + [ + 296, + 1, + 20 + ], + [ + 386, + 1, + 12 + ], + [ + 455, + 1, + 9 + ], + [ + 412, + 1, + 9 + ], + [ + 592, + 1, + 25 + ] + ], + "objective_type": 9, + "zenny_reward": 17600, + "type": 1 + }, + "subquest_1": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 6, + "zenny_reward": 0, + "type": 1 + } + }, + "small_monsters": [ + [], + [ + { + "variant": 3, + "unk1": 1, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 40, + "quantity": -1 + } + ] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 3, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 29, + "wave_2_transition_type": 0, + "location": 8, + "penalty_per_cart": 6000, + "resources": 0, + "details": "Oh, boo! I'm tired of watching\nrun-of-the-mill hunts. The\nDiablos and the Uragaan are\nsupposed to be the ultimate\nmonster duo. I'd love to watch\nthem maim some foolish hunter!\nDo put on a good show...", + "description": "Hunt an Uragaan\nand a Diablos", + "wave_1_transition_target": 0, + "hrp_restriction": 8, + "quest_fee": 1750, + "quest_id": 61008, + "name": "Blood Sport", + "main_monster_2": 6, + "main_monster_1": 9, + "supply_set_number": 43, + "summon": 0, + "client": "Spoiled Princess", + "flags": [ + [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 3, + "hp_spread": 1, + "level": 29, + "boss_id": 1, + "type": 6, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 3, + "hp_spread": 1, + "level": 29, + "boss_id": 0, + "type": 9, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Flooded Forest Free-For-All.json b/event/Flooded Forest Free-For-All.json new file mode 100644 index 0000000..decf8d0 --- /dev/null +++ b/event/Flooded Forest Free-For-All.json @@ -0,0 +1,232 @@ +{ + "objective_details": { + "subquest_2": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 18, + "zenny_reward": 0, + "type": 1 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 2600, + "rewards_row_1": [ + [ + 445, + 1, + 1 + ], + [ + 446, + 1, + 5 + ], + [ + 490, + 1, + 14 + ], + [ + 495, + 1, + 20 + ], + [ + 498, + 1, + 7 + ], + [ + 499, + 1, + 10 + ], + [ + 500, + 1, + 8 + ], + [ + 441, + 1, + 10 + ], + [ + 186, + 1, + 25 + ] + ], + "rewards_row_2": [ + [ + 445, + 1, + 1 + ], + [ + 446, + 1, + 5 + ], + [ + 490, + 1, + 14 + ], + [ + 495, + 1, + 20 + ], + [ + 498, + 1, + 7 + ], + [ + 499, + 1, + 10 + ], + [ + 500, + 1, + 8 + ], + [ + 441, + 1, + 10 + ], + [ + 186, + 1, + 25 + ] + ], + "objective_type": 16, + "zenny_reward": 25800, + "type": 1 + }, + "subquest_1": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 15, + "zenny_reward": 0, + "type": 1 + } + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 1, + "quest_rank": 5, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 64, + "wave_2_transition_type": 0, + "location": 3, + "penalty_per_cart": 9000, + "resources": 1, + "details": "Taihen! Means very bad, yes?\nFlooded Forest overrun by pack\nof leviathans -- Argosy cannot\nget anywhere near area! Big\nproblem for trade, yes? Only\nhunters can return fair seas\nto Flooded Forest. Onegai!", + "description": "Hunt a Royal L., Lag. & Gobul", + "smallmonster_data_file": "sm_ff_free_for_all.dat", + "wave_1_transition_target": 0, + "hrp_restriction": 10, + "quest_fee": 2550, + "quest_id": 61017, + "name": "Flooded Forest Free-For-All", + "main_monster_2": 34, + "main_monster_1": 17, + "supply_set_number": 43, + "summon": 0, + "client": "Argosy Captain", + "flags": [ + [ + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "large_monsters": { + "monster_2": { + "size_spread": 3, + "hp_spread": 0, + "level": 31, + "boss_id": 1, + "type": 15, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_3": { + "size_spread": 3, + "hp_spread": 0, + "level": 31, + "boss_id": 2, + "type": 18, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_1": { + "size_spread": 3, + "hp_spread": 0, + "level": 31, + "boss_id": 0, + "type": 16, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Grudge Match Bird and Brute.json b/event/Grudge Match Bird and Brute.json new file mode 100644 index 0000000..a02f2c5 --- /dev/null +++ b/event/Grudge Match Bird and Brute.json @@ -0,0 +1,432 @@ +{ + "small_monsters": [ + [], + [ + { + "variant": 3, + "unk1": 1, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 40, + "quantity": -1 + } + ] + ], + "arena_equipment": [ + [ + [ + 15, + 4 + ], + null, + null, + 89, + 8, + 75, + 95, + 35, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 2, + 2 + ], + [ + 360, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ] + ], + [] + ], + [ + [ + 7, + 35 + ], + null, + null, + 131, + 71, + 66, + 72, + 67, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 2, + 3 + ], + [ + 1, + 2 + ], + [ + 3, + 1 + ], + [ + 50, + 2 + ] + ], + [] + ], + [ + [ + 10, + 66 + ], + null, + null, + 43, + 110, + 74, + 82, + 9, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 2, + 2 + ], + [ + 50, + 1 + ] + ], + [] + ], + [ + [ + 11, + 9 + ], + [ + 12, + 10 + ], + [ + 13, + 1 + ], + 105, + 111, + 104, + 110, + 102, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 360, + 2 + ], + [ + 50, + 1 + ], + [ + 7, + 2 + ] + ], + [ + [ + 54, + 99 + ], + [ + 55, + 99 + ], + [ + 57, + 50 + ], + [ + 66, + 5 + ], + [ + 63, + 9 + ], + [ + 75, + 12 + ], + [ + 77, + 12 + ], + [ + 79, + 12 + ] + ] + ] + ], + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 4, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 8, + "penalty_per_cart": 350, + "resources": 2, + "details": "Double trouble! It's the\ndirty-bird Qurupeco and the\nland dragon Barroth -- heaven\nand earth, laughter and tears,\nin an ultimate contest! When\nthe dust clears, will it\nreveal victory? Or tragedy?", + "description": "Slay a Qurupeco\nand a Barroth", + "wave_1_transition_target": 0, + "hrp_restriction": 9, + "quest_fee": 0, + "quest_id": 60006, + "name": "Grudge Match: Bird and Brute", + "main_monster_2": 0, + "main_monster_1": 0, + "supply_set_number": 0, + "summon": 0, + "client": "Announcer/Receptionist", + "flags": [ + [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [ + [ + 607, + 1, + 16 + ], + [ + 608, + 1, + 20 + ], + [ + 431, + 1, + 14 + ], + [ + 328, + 1, + 10 + ], + [ + 444, + 1, + 5 + ], + [ + 569, + 1, + 15 + ], + [ + 570, + 1, + 5 + ], + [ + 587, + 1, + 15 + ] + ], + "rewards_row_2": [], + "objective_type": 3, + "zenny_reward": 1000, + "type": 257 + }, + "subquest_1": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 8, + "zenny_reward": 0, + "type": 257 + } + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 1, + "type": 8, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 0, + "type": 3, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Grudge Match Brute and Brute.json b/event/Grudge Match Brute and Brute.json new file mode 100644 index 0000000..edecd82 --- /dev/null +++ b/event/Grudge Match Brute and Brute.json @@ -0,0 +1,642 @@ +{ + "small_monsters": [ + [], + [ + { + "type": 40, + "unk1": 1, + "unk2": 255, + "variant": 3, + "room": 1, + "quantity": -1, + "pos_x": -2404.5, + "pos_y": -5038.5, + "pos_z": -3542.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -1942.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -1342.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -1542.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -1842.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -404.5, + "pos_y": -5038.5, + "pos_z": -1742.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -404.5, + "pos_y": -5038.5, + "pos_z": -1342.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -404.5, + "pos_y": -5038.5, + "pos_z": -1142.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1704.5, + "pos_y": -5038.5, + "pos_z": -1042.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -1742.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -2142.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1704.5, + "pos_y": -5038.5, + "pos_z": -2542.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -2404.5, + "pos_y": -5038.5, + "pos_z": -2742.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1404.5, + "pos_y": -5038.5, + "pos_z": -3142.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -1104.5, + "pos_y": -5038.5, + "pos_z": -3542.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + }, + { + "type": 7, + "unk1": 1, + "unk2": 255, + "variant": 0, + "room": 1, + "quantity": 1, + "pos_x": -2904.5, + "pos_y": -5038.5, + "pos_z": -3742.7, + "rot_x": 0, + "rot_y": 170, + "rot_z": 0 + } + ] + ], + "quest_info": { + "quest_id": 60006, + "name": "Grudge Match: Brute and Brute", + "client": "Announcer/Receptionist", + "description": "Slay a Barroth\nand a Barroth", + "details": "Double trouble! It's the\nland dragon Barroth and the\nland dragon Barroth -- earth\nand earth, laughter and tears,\nin an ultimate contest! When\nthe dust clears, will it\nreveal victory? Or tragedy?", + "success_message": "Complete the Main Quest.", + "flags": [ + [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0 + ] + ], + "penalty_per_cart": 1100, + "quest_fee": 0, + "time_limit": 50, + "main_monster_1": 0, + "main_monster_2": 0, + "location": 8, + "quest_rank": 4, + "hrp_restriction": 9, + "resources": 2, + "supply_set_number": 0, + "starting_position": 0, + "general_enemy_level": 23, + "summon": 0, + "wave_1_transition_type": 0, + "wave_1_transition_target": 0, + "wave_1_transition_quantity": 0, + "wave_2_transition_type": 0, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0 + }, + "large_monsters": { + "monster_1": { + "type": 7, + "starting_area": 0, + "boss_id": 0, + "spawn_count": 1, + "level": 23, + "size": 100, + "hp_spread": 0, + "size_spread": 0 + }, + "monster_2": { + "type": 7, + "starting_area": 0, + "boss_id": 1, + "spawn_count": 1, + "level": 23, + "size": 100, + "hp_spread": 0, + "size_spread": 0 + }, + "monster_3": { + "type": 0, + "starting_area": 0, + "boss_id": 0, + "spawn_count": 0, + "level": 0, + "size": 0, + "hp_spread": 0, + "size_spread": 0 + } + }, + "objective_details": { + "main_quest": { + "type": 257, + "objective_type": 8, + "objective_num": 1, + "zenny_reward": 1000, + "hrp_reward": 0, + "rewards_row_1": [ + [ + 607, + 1, + 16 + ], + [ + 608, + 1, + 20 + ], + [ + 431, + 1, + 14 + ], + [ + 328, + 1, + 10 + ], + [ + 444, + 1, + 5 + ], + [ + 569, + 1, + 15 + ], + [ + 570, + 1, + 5 + ], + [ + 587, + 1, + 15 + ] + ], + "rewards_row_2": [] + }, + "subquest_1": { + "description": "None", + "type": 257, + "objective_type": 8, + "objective_num": 1, + "zenny_reward": 0, + "hrp_reward": 0, + "rewards_row_1": [] + }, + "subquest_2": { + "description": "None", + "type": 0, + "objective_type": 0, + "objective_num": 0, + "zenny_reward": 0, + "hrp_reward": 0, + "rewards_row_1": [] + } + }, + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "arena_equipment": [ + [ + [ + 15, + 4 + ], + null, + null, + 89, + 8, + 75, + 95, + 35, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 2, + 2 + ], + [ + 360, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 2 + ] + ], + [] + ], + [ + [ + 7, + 35 + ], + null, + null, + 131, + 71, + 66, + 72, + 67, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 2, + 3 + ], + [ + 1, + 2 + ], + [ + 3, + 1 + ], + [ + 50, + 2 + ] + ], + [] + ], + [ + [ + 10, + 66 + ], + null, + null, + 43, + 110, + 74, + 82, + 9, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 2, + 2 + ], + [ + 50, + 1 + ] + ], + [] + ], + [ + [ + 11, + 9 + ], + [ + 12, + 10 + ], + [ + 13, + 1 + ], + 105, + 111, + 104, + 110, + 102, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 45, + 10 + ], + [ + 375, + 5 + ], + [ + 360, + 2 + ], + [ + 50, + 1 + ], + [ + 7, + 2 + ] + ], + [ + [ + 54, + 99 + ], + [ + 55, + 99 + ], + [ + 57, + 50 + ], + [ + 66, + 5 + ], + [ + 63, + 9 + ], + [ + 75, + 12 + ], + [ + 77, + 12 + ], + [ + 79, + 12 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/event/Grudge Match Land Lords.json b/event/Grudge Match Land Lords.json new file mode 100644 index 0000000..56620a5 --- /dev/null +++ b/event/Grudge Match Land Lords.json @@ -0,0 +1,764 @@ +{ + "small_monsters": [ + [], + [ + { + "variant": 3, + "unk1": 1, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 40, + "quantity": -1 + }, + { + "variant": 8, + "unk1": 3, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 1828, + "rot_x": 0, + "type": 40, + "quantity": -1 + }, + { + "variant": 8, + "unk1": 3, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 1828, + "rot_x": 0, + "type": 40, + "quantity": -1 + }, + { + "variant": 8, + "unk1": 3, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 1828, + "rot_x": 0, + "type": 40, + "quantity": -1 + }, + { + "variant": 8, + "unk1": 3, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 1828, + "rot_x": 0, + "type": 40, + "quantity": -1 + }, + { + "variant": 8, + "unk1": 3, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 1828, + "rot_x": 0, + "type": 40, + "quantity": -1 + }, + { + "variant": 8, + "unk1": 3, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 1828, + "rot_x": 0, + "type": 40, + "quantity": -1 + } + ] + ], + "arena_equipment": [ + [ + [ + 8, + 39 + ], + null, + null, + 102, + 108, + 101, + 107, + 105, + [ + [ + 98, + 20 + ], + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 374, + 5 + ], + [ + 360, + 3 + ], + [ + 11, + 5 + ], + [ + 10, + 5 + ], + [ + 9, + 5 + ], + [ + 31, + 5 + ], + [ + 32, + 5 + ], + [ + 30, + 5 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 5 + ], + [ + 52, + 2 + ], + [ + 2, + 3 + ], + [ + 1, + 10 + ], + [ + 51, + 2 + ], + [ + 377, + 1 + ], + [ + 596, + 1 + ], + [ + 598, + 1 + ], + [ + 597, + 1 + ], + [ + 599, + 1 + ] + ], + [] + ], + [ + [ + 15, + 45 + ], + null, + null, + 96, + 102, + 95, + 103, + 101, + [ + [ + 98, + 20 + ], + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 374, + 5 + ], + [ + 360, + 3 + ], + [ + 347, + 5 + ], + [ + 11, + 5 + ], + [ + 10, + 5 + ], + [ + 9, + 5 + ], + [ + 31, + 5 + ], + [ + 32, + 5 + ], + [ + 30, + 5 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 50, + 5 + ], + [ + 52, + 1 + ], + [ + 51, + 2 + ], + [ + 377, + 1 + ], + [ + 596, + 1 + ], + [ + 598, + 1 + ], + [ + 597, + 1 + ], + [ + 599, + 1 + ] + ], + [] + ], + [ + [ + 14, + 38 + ], + null, + null, + 139, + 112, + 91, + 99, + 111, + [ + [ + 98, + 20 + ], + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 374, + 5 + ], + [ + 375, + 5 + ], + [ + 360, + 5 + ], + [ + 11, + 5 + ], + [ + 10, + 5 + ], + [ + 9, + 5 + ], + [ + 31, + 5 + ], + [ + 32, + 5 + ], + [ + 30, + 5 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 5 + ], + [ + 52, + 2 + ], + [ + 2, + 3 + ], + [ + 1, + 10 + ], + [ + 51, + 2 + ], + [ + 377, + 1 + ], + [ + 596, + 1 + ], + [ + 598, + 1 + ], + [ + 599, + 1 + ] + ], + [] + ], + [ + [ + 11, + 12 + ], + [ + 12, + 12 + ], + [ + 13, + 10 + ], + 130, + 115, + 108, + 114, + 112, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 374, + 5 + ], + [ + 360, + 3 + ], + [ + 11, + 5 + ], + [ + 10, + 5 + ], + [ + 9, + 5 + ], + [ + 31, + 5 + ], + [ + 32, + 5 + ], + [ + 3, + 1 + ], + [ + 4, + 1 + ], + [ + 49, + 1 + ], + [ + 50, + 5 + ], + [ + 582, + 2 + ], + [ + 52, + 2 + ], + [ + 2, + 3 + ], + [ + 1, + 10 + ], + [ + 51, + 2 + ], + [ + 377, + 1 + ], + [ + 596, + 1 + ], + [ + 598, + 1 + ], + [ + 597, + 1 + ], + [ + 599, + 1 + ] + ], + [ + [ + 54, + 99 + ], + [ + 58, + 40 + ], + [ + 63, + 9 + ], + [ + 64, + 9 + ], + [ + 92, + 10 + ], + [ + 69, + 60 + ], + [ + 80, + 8 + ], + [ + 72, + 20 + ], + [ + 84, + 5 + ] + ] + ] + ], + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 6, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 8, + "penalty_per_cart": 1150, + "resources": 2, + "details": "Wanted:\nThe description for this\nquest! If you can find\nit, please let us know!\nThanks!", + "description": "Slay all 3 monsters", + "wave_1_transition_target": 0, + "hrp_restriction": 9, + "quest_fee": 0, + "quest_id": 60011, + "name": "Grudge Match: Land Lords", + "main_monster_2": 0, + "main_monster_1": 0, + "supply_set_number": 0, + "summon": 0, + "client": "Announcer/Receptionist", + "flags": [ + [ + 0, + 0, + 1, + 0, + 0, + 1, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "objective_details": { + "subquest_2": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 7, + "zenny_reward": 0, + "type": 131329 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [ + [ + 589, + 1, + 10 + ], + [ + 608, + 1, + 10 + ], + [ + 612, + 1, + 15 + ], + [ + 431, + 1, + 14 + ], + [ + 444, + 1, + 10 + ], + [ + 445, + 1, + 7 + ], + [ + 570, + 1, + 10 + ], + [ + 587, + 1, + 24 + ] + ], + "rewards_row_2": [], + "objective_type": 8, + "zenny_reward": 3000, + "type": 131329 + }, + "subquest_1": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 9, + "zenny_reward": 0, + "type": 131329 + } + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 1, + "type": 9, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 18, + "boss_id": 2, + "type": 7, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 0, + "type": 8, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Grudge Match Royal Ludroth.json b/event/Grudge Match Royal Ludroth.json new file mode 100644 index 0000000..4abd354 --- /dev/null +++ b/event/Grudge Match Royal Ludroth.json @@ -0,0 +1,394 @@ +{ + "small_monsters": [ + [], + [ + { + "variant": 3, + "unk1": 1, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 40, + "quantity": -1 + } + ] + ], + "arena_equipment": [ + [ + [ + 8, + 13 + ], + null, + null, + 14, + 16, + 123, + 21, + 37, + [ + [ + 98, + 20 + ], + [ + 13, + 10 + ], + [ + 45, + 10 + ], + [ + 6, + 10 + ], + [ + 360, + 2 + ], + [ + 2, + 3 + ], + [ + 1, + 10 + ] + ], + [] + ], + [ + [ + 7, + 13 + ], + null, + null, + 131, + 20, + 22, + 26, + 5, + [ + [ + 98, + 20 + ], + [ + 13, + 10 + ], + [ + 45, + 10 + ], + [ + 6, + 10 + ], + [ + 20, + 2 + ], + [ + 4, + 1 + ], + [ + 50, + 1 + ] + ], + [] + ], + [ + [ + 9, + 53 + ], + null, + null, + 20, + 23, + 7, + 24, + 23, + [ + [ + 98, + 20 + ], + [ + 13, + 10 + ], + [ + 45, + 10 + ], + [ + 6, + 10 + ], + [ + 11, + 5 + ], + [ + 50, + 1 + ] + ], + [] + ], + [ + [ + 11, + 4 + ], + [ + 12, + 6 + ], + [ + 13, + 1 + ], + 9, + 9, + 37, + 10, + 2, + [ + [ + 13, + 10 + ], + [ + 45, + 10 + ], + [ + 6, + 10 + ], + [ + 360, + 2 + ], + [ + 4, + 1 + ], + [ + 52, + 2 + ], + [ + 2, + 2 + ] + ], + [ + [ + 54, + 99 + ], + [ + 56, + 60 + ], + [ + 57, + 50 + ], + [ + 65, + 5 + ], + [ + 75, + 12 + ], + [ + 77, + 12 + ] + ] + ] + ], + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 1, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 12, + "penalty_per_cart": 350, + "resources": 2, + "details": "Ahoy, adrenaline junkies!\nNext up is the regally maned\nRoyal Ludroth! Will the pressure\nof facing this sea dragon on\nits home surf with a strict\ntime limit leave the hunters\nall washed up?", + "description": "Slay a Royal Ludroth", + "wave_1_transition_target": 0, + "hrp_restriction": 0, + "quest_fee": 0, + "quest_id": 60001, + "name": "Grudge Match: Royal Ludroth", + "main_monster_2": 0, + "main_monster_1": 0, + "supply_set_number": 0, + "summon": 0, + "client": "Announcer/Receptionist", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [ + [ + 609, + 1, + 24 + ], + [ + 609, + 2, + 8 + ], + [ + 431, + 1, + 10 + ], + [ + 327, + 1, + 24 + ], + [ + 569, + 1, + 18 + ], + [ + 615, + 1, + 16 + ] + ], + "rewards_row_2": [], + "objective_type": 16, + "zenny_reward": 1000, + "type": 257 + }, + "subquest_1": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + } + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 0, + "type": 16, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Grudge Match The Two Flames.json b/event/Grudge Match The Two Flames.json new file mode 100644 index 0000000..569eeb3 --- /dev/null +++ b/event/Grudge Match The Two Flames.json @@ -0,0 +1,464 @@ +{ + "small_monsters": [ + [], + [ + { + "variant": 3, + "unk1": 1, + "unk2": 255, + "pos_z": -3542.7, + "pos_x": -2404.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 40, + "quantity": -1 + } + ] + ], + "arena_equipment": [ + [ + [ + 8, + 9 + ], + null, + null, + 72, + 77, + 70, + 78, + 77, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 20, + 2 + ], + [ + 17, + 2 + ], + [ + 360, + 1 + ], + [ + 347, + 1 + ], + [ + 11, + 5 + ], + [ + 3, + 1 + ], + [ + 50, + 5 + ], + [ + 52, + 1 + ], + [ + 1, + 1 + ] + ], + [] + ], + [ + [ + 14, + 1 + ], + null, + null, + 132, + 69, + 74, + 82, + 109, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 45, + 10 + ], + [ + 17, + 2 + ], + [ + 360, + 1 + ], + [ + 347, + 1 + ], + [ + 50, + 2 + ] + ], + [] + ], + [ + [ + 10, + 55 + ], + null, + null, + 136, + 96, + 103, + 76, + 95, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 98, + 20 + ], + [ + 26, + 10 + ], + [ + 17, + 2 + ], + [ + 360, + 1 + ], + [ + 347, + 1 + ], + [ + 9, + 5 + ], + [ + 4, + 1 + ], + [ + 50, + 1 + ] + ], + [] + ], + [ + [ + 11, + 6 + ], + [ + 12, + 8 + ], + [ + 13, + 10 + ], + 140, + 109, + 123, + 108, + 106, + [ + [ + 13, + 10 + ], + [ + 14, + 10 + ], + [ + 45, + 10 + ], + [ + 17, + 2 + ], + [ + 360, + 2 + ], + [ + 347, + 1 + ], + [ + 4, + 1 + ], + [ + 49, + 1 + ], + [ + 3, + 1 + ], + [ + 582, + 1 + ], + [ + 2, + 3 + ], + [ + 1, + 10 + ] + ], + [ + [ + 54, + 99 + ], + [ + 55, + 99 + ], + [ + 58, + 40 + ], + [ + 84, + 5 + ], + [ + 70, + 60 + ] + ] + ] + ], + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 5, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 8, + "penalty_per_cart": 350, + "resources": 2, + "details": "Wanted:\nThe description for this\nquest! If you can find\nit, please let us know!\nThanks!", + "description": "Slay a Rathalos\nand a Rathian", + "wave_1_transition_target": 0, + "hrp_restriction": 9, + "quest_fee": 0, + "quest_id": 60008, + "name": "Grudge Match: The Two Flames", + "main_monster_2": 0, + "main_monster_1": 0, + "supply_set_number": 0, + "summon": 0, + "client": "Announcer/Receptionist", + "flags": [ + [ + 0, + 1, + 0, + 0, + 0, + 1, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 1, + 0, + 1, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [ + [ + 584, + 1, + 10 + ], + [ + 610, + 1, + 24 + ], + [ + 431, + 1, + 14 + ], + [ + 328, + 1, + 10 + ], + [ + 444, + 1, + 5 + ], + [ + 569, + 1, + 15 + ], + [ + 570, + 1, + 5 + ], + [ + 587, + 1, + 17 + ] + ], + "rewards_row_2": [], + "objective_type": 2, + "zenny_reward": 1000, + "type": 257 + }, + "subquest_1": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 1, + "zenny_reward": 0, + "type": 257 + } + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 1, + "type": 1, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 23, + "boss_id": 0, + "type": 2, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Jump Four Jaggi.json b/event/Jump Four Jaggi.json new file mode 100644 index 0000000..191a8b1 --- /dev/null +++ b/event/Jump Four Jaggi.json @@ -0,0 +1,961 @@ +{ + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 4, + "hrp_reward": 440, + "rewards_row_1": [ + [ + 307, + 1, + 3 + ], + [ + 308, + 1, + 12 + ], + [ + 306, + 1, + 10 + ], + [ + 309, + 1, + 20 + ], + [ + 420, + 1, + 12 + ], + [ + 342, + 8, + 18 + ], + [ + 41, + 1, + 25 + ] + ], + "rewards_row_2": [ + [ + 440, + 1, + 1 + ], + [ + 447, + 1, + 1 + ], + [ + 441, + 1, + 1 + ], + [ + 327, + 1, + 1 + ], + [ + 328, + 1, + 1 + ] + ], + "objective_type": 12, + "zenny_reward": 4000, + "type": 1 + }, + "subquest_1": { + "objective_num": 2, + "hrp_reward": 220, + "rewards_row_1": [ + [ + 307, + 1, + 1 + ], + [ + 308, + 1, + 1 + ], + [ + 306, + 1, + 1 + ], + [ + 309, + 1, + 1 + ], + [ + 420, + 1, + 1 + ], + [ + 342, + 8, + 1 + ], + [ + 41, + 1, + 1 + ] + ], + "description": "Hunt 2 Great Jaggi", + "objective_type": 12, + "zenny_reward": 4000, + "type": 1 + } + }, + "small_monsters": [ + [], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 210.05, + "pos_x": 2039.26, + "pos_y": 12.7, + "room": 1, + "rot_z": 0, + "rot_y": 17, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 814.06, + "pos_x": 857.89, + "pos_y": -41.97, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 135.22, + "pos_x": 97.58, + "pos_y": -75.54, + "room": 1, + "rot_z": 0, + "rot_y": -45, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -667.01, + "pos_x": -393.52, + "pos_y": -163.94, + "room": 1, + "rot_z": 0, + "rot_y": -199, + "rot_x": 0, + "type": 10, + "quantity": 1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 1381.66, + "pos_x": -853.86, + "pos_y": 19.45, + "room": 2, + "rot_z": 0, + "rot_y": -113, + "rot_x": 0, + "type": 34, + "quantity": 1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": -369.71, + "pos_x": -553.59, + "pos_y": -2.57, + "room": 2, + "rot_z": 0, + "rot_y": 193, + "rot_x": 0, + "type": 34, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -530.3, + "pos_x": -1698.75, + "pos_y": 5.74, + "room": 2, + "rot_z": 0, + "rot_y": 398, + "rot_x": 0, + "type": 34, + "quantity": 3 + } + ], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -610.86, + "pos_x": 873.28, + "pos_y": 85.07, + "room": 3, + "rot_z": 0, + "rot_y": -153, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 25.11, + "pos_x": 1247.84, + "pos_y": 106.65, + "room": 3, + "rot_z": 0, + "rot_y": -358, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -32.21, + "pos_x": 177.92, + "pos_y": 450.7, + "room": 3, + "rot_z": 0, + "rot_y": -238, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 362.86, + "pos_x": -78.66, + "pos_y": 330.7, + "room": 3, + "rot_z": 0, + "rot_y": -79, + "rot_x": 0, + "type": 37, + "quantity": 2 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4145.11, + "pos_x": 606.18, + "pos_y": -12.89, + "room": 4, + "rot_z": 0, + "rot_y": 324, + "rot_x": 0, + "type": 11, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 2292.05, + "pos_x": 524.37, + "pos_y": -18.65, + "room": 4, + "rot_z": 0, + "rot_y": 199, + "rot_x": 0, + "type": 11, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 3044.5, + "pos_x": -460.08, + "pos_y": -71.51, + "room": 4, + "rot_z": 0, + "rot_y": -460, + "rot_x": 0, + "type": 29, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -211.14, + "pos_x": 300.4, + "pos_y": 4.0, + "room": 5, + "rot_z": 0, + "rot_y": 0, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -918.94, + "pos_x": 458.16, + "pos_y": 1.49, + "room": 5, + "rot_z": 0, + "rot_y": 51, + "rot_x": 0, + "type": 10, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 925.68, + "pos_x": 1813.83, + "pos_y": 3.06, + "room": 5, + "rot_z": 0, + "rot_y": 494, + "rot_x": 0, + "type": 10, + "quantity": 4 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -757.3, + "pos_x": -504.37, + "pos_y": 3.05, + "room": 5, + "rot_z": 0, + "rot_y": 676, + "rot_x": 0, + "type": 11, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -420.89, + "pos_x": 1118.48, + "pos_y": 4.0, + "room": 5, + "rot_z": 0, + "rot_y": 364, + "rot_x": 0, + "type": 11, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 222.99, + "pos_x": 2658.84, + "pos_y": 3.24, + "room": 5, + "rot_z": 0, + "rot_y": 756, + "rot_x": 0, + "type": 11, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 695.3, + "pos_x": 1612.71, + "pos_y": -30.27, + "room": 6, + "rot_z": 0, + "rot_y": 517, + "rot_x": 0, + "type": 29, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -266.33, + "pos_x": -2050.04, + "pos_y": -31.9, + "room": 6, + "rot_z": 0, + "rot_y": 28, + "rot_x": 0, + "type": 29, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -26.14, + "pos_x": -344.14, + "pos_y": -13.0, + "room": 6, + "rot_z": 0, + "rot_y": 443, + "rot_x": 0, + "type": 33, + "quantity": 5 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -416.52, + "pos_x": -161.74, + "pos_y": 4.8, + "room": 6, + "rot_z": 0, + "rot_y": 472, + "rot_x": 0, + "type": 33, + "quantity": 4 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -643.19, + "pos_x": -481.05, + "pos_y": 15.34, + "room": 6, + "rot_z": 0, + "rot_y": 568, + "rot_x": 0, + "type": 33, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -235.13, + "pos_x": -692.26, + "pos_y": -11.02, + "room": 6, + "rot_z": 0, + "rot_y": 608, + "rot_x": 0, + "type": 33, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -343.46, + "pos_x": -417.82, + "pos_y": -1.44, + "room": 6, + "rot_z": 0, + "rot_y": 147, + "rot_x": 0, + "type": 33, + "quantity": 3 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2925.29, + "pos_x": 4294.59, + "pos_y": -75.65, + "room": 7, + "rot_z": 0, + "rot_y": -130, + "rot_x": 0, + "type": 10, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2049.22, + "pos_x": 3995.3, + "pos_y": -45.09, + "room": 7, + "rot_z": 0, + "rot_y": -85, + "rot_x": 0, + "type": 10, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -1574.97, + "pos_x": 4187.0, + "pos_y": -17.07, + "room": 7, + "rot_z": 0, + "rot_y": -17, + "rot_x": 0, + "type": 10, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2570.78, + "pos_x": 3781.64, + "pos_y": -66.86, + "room": 7, + "rot_z": 0, + "rot_y": -130, + "rot_x": 0, + "type": 10, + "quantity": 1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4049.95, + "pos_x": 293.99, + "pos_y": -170.31, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 7 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 3440.16, + "pos_x": 124.95, + "pos_y": -186.54, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 5 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4509.84, + "pos_x": -425.01, + "pos_y": -179.3, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4108.5, + "pos_x": -714.48, + "pos_y": -183.78, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 3726.09, + "pos_x": -1021.27, + "pos_y": -215.48, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -316.05, + "pos_x": -1974.57, + "pos_y": -209.48, + "room": 8, + "rot_z": 0, + "rot_y": -56, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -382.9, + "pos_x": -1825.11, + "pos_y": -210.91, + "room": 8, + "rot_z": 0, + "rot_y": 130, + "rot_x": 0, + "type": 31, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 592.49, + "pos_x": 3383.92, + "pos_y": 2.65, + "room": 9, + "rot_z": 0, + "rot_y": -193, + "rot_x": 0, + "type": 30, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 987.24, + "pos_x": 2653.55, + "pos_y": -22.59, + "room": 9, + "rot_z": 0, + "rot_y": -73, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 445.91, + "pos_x": 2838.69, + "pos_y": -28.0, + "room": 9, + "rot_z": 0, + "rot_y": -142, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 575.43, + "pos_x": 2109.53, + "pos_y": -26.57, + "room": 9, + "rot_z": 0, + "rot_y": -460, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 2199.24, + "pos_x": -1713.72, + "pos_y": 1262.5, + "room": 9, + "rot_z": 0, + "rot_y": -45, + "rot_x": 273, + "type": 37, + "quantity": -1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 1682.19, + "pos_x": -1174.44, + "pos_y": 1319.5, + "room": 9, + "rot_z": 0, + "rot_y": -39, + "rot_x": 0, + "type": 37, + "quantity": 6 + } + ], + [], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -720.92, + "pos_x": 2195.89, + "pos_y": 73.7, + "room": 11, + "rot_z": 0, + "rot_y": 39, + "rot_x": 0, + "type": 26, + "quantity": 2 + }, + { + "variant": 6, + "unk1": 1, + "unk2": 255, + "pos_z": 896.44, + "pos_x": -535.73, + "pos_y": 1212.59, + "room": 11, + "rot_z": 0, + "rot_y": 169, + "rot_x": 0, + "type": 26, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 289.52, + "pos_x": -434.0, + "pos_y": 198.96, + "room": 11, + "rot_z": 0, + "rot_y": -267, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 66.62, + "pos_x": -802.69, + "pos_y": 198.96, + "room": 11, + "rot_z": 0, + "rot_y": -216, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -371.21, + "pos_x": -645.14, + "pos_y": 288.96, + "room": 11, + "rot_z": 0, + "rot_y": -227, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -166.43, + "pos_x": -473.33, + "pos_y": 168.96, + "room": 11, + "rot_z": 0, + "rot_y": -210, + "rot_x": 0, + "type": 37, + "quantity": 1 + } + ] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 1, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 2, + "penalty_per_cart": 1400, + "resources": 0, + "details": "I'm gonna get so fired for\nthis... The Great Jaggi some\nhunter brought in just\nescaped. Mind going after\nthem? You better hurry,\nthough. Bet they've got some\nincredible materials, too.", + "description": "Hunt 4 Great Jaggi", + "wave_1_transition_target": 0, + "hrp_restriction": 0, + "quest_fee": 400, + "quest_id": 61001, + "name": "Jump Four Jaggi", + "main_monster_2": 31, + "main_monster_1": 36, + "supply_set_number": 19, + "summon": 1678049817, + "client": "Guild Subcontractor", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 1, + "hp_spread": 1, + "level": 23, + "boss_id": 255, + "type": 12, + "starting_area": 0, + "spawn_count": 4, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Jump Fourty-Eight Jaggi.json b/event/Jump Fourty-Eight Jaggi.json new file mode 100644 index 0000000..9e56886 --- /dev/null +++ b/event/Jump Fourty-Eight Jaggi.json @@ -0,0 +1,961 @@ +{ + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 48, + "hrp_reward": 750, + "rewards_row_1": [ + [ + 307, + 2, + 3 + ], + [ + 308, + 2, + 12 + ], + [ + 420, + 1, + 10 + ], + [ + 110, + 1, + 20 + ], + [ + 565, + 1, + 12 + ], + [ + 431, + 2, + 18 + ], + [ + 41, + 1, + 25 + ] + ], + "rewards_row_2": [ + [ + 440, + 1, + 1 + ], + [ + 447, + 1, + 1 + ], + [ + 441, + 1, + 1 + ], + [ + 327, + 1, + 1 + ], + [ + 328, + 1, + 1 + ] + ], + "objective_type": 12, + "zenny_reward": 15000, + "type": 1 + }, + "subquest_1": { + "objective_num": 24, + "hrp_reward": 255, + "rewards_row_1": [ + [ + 307, + 1, + 1 + ], + [ + 308, + 1, + 1 + ], + [ + 306, + 1, + 1 + ], + [ + 309, + 1, + 1 + ], + [ + 420, + 1, + 1 + ], + [ + 342, + 8, + 1 + ], + [ + 41, + 1, + 1 + ] + ], + "description": "Hunt 24 Great Jaggi", + "objective_type": 12, + "zenny_reward": 8000, + "type": 1 + } + }, + "small_monsters": [ + [], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 210.05, + "pos_x": 2039.26, + "pos_y": 12.7, + "room": 1, + "rot_z": 0, + "rot_y": 17, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 814.06, + "pos_x": 857.89, + "pos_y": -41.97, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 135.22, + "pos_x": 97.58, + "pos_y": -75.54, + "room": 1, + "rot_z": 0, + "rot_y": -45, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -667.01, + "pos_x": -393.52, + "pos_y": -163.94, + "room": 1, + "rot_z": 0, + "rot_y": -199, + "rot_x": 0, + "type": 10, + "quantity": 1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 1381.66, + "pos_x": -853.86, + "pos_y": 19.45, + "room": 2, + "rot_z": 0, + "rot_y": -113, + "rot_x": 0, + "type": 34, + "quantity": 1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": -369.71, + "pos_x": -553.59, + "pos_y": -2.57, + "room": 2, + "rot_z": 0, + "rot_y": 193, + "rot_x": 0, + "type": 34, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -530.3, + "pos_x": -1698.75, + "pos_y": 5.74, + "room": 2, + "rot_z": 0, + "rot_y": 398, + "rot_x": 0, + "type": 34, + "quantity": 3 + } + ], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -610.86, + "pos_x": 873.28, + "pos_y": 85.07, + "room": 3, + "rot_z": 0, + "rot_y": -153, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 25.11, + "pos_x": 1247.84, + "pos_y": 106.65, + "room": 3, + "rot_z": 0, + "rot_y": -358, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -32.21, + "pos_x": 177.92, + "pos_y": 450.7, + "room": 3, + "rot_z": 0, + "rot_y": -238, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 362.86, + "pos_x": -78.66, + "pos_y": 330.7, + "room": 3, + "rot_z": 0, + "rot_y": -79, + "rot_x": 0, + "type": 37, + "quantity": 2 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4145.11, + "pos_x": 606.18, + "pos_y": -12.89, + "room": 4, + "rot_z": 0, + "rot_y": 324, + "rot_x": 0, + "type": 11, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 2292.05, + "pos_x": 524.37, + "pos_y": -18.65, + "room": 4, + "rot_z": 0, + "rot_y": 199, + "rot_x": 0, + "type": 11, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 3044.5, + "pos_x": -460.08, + "pos_y": -71.51, + "room": 4, + "rot_z": 0, + "rot_y": -460, + "rot_x": 0, + "type": 29, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -211.14, + "pos_x": 300.4, + "pos_y": 4.0, + "room": 5, + "rot_z": 0, + "rot_y": 0, + "rot_x": 0, + "type": 10, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -918.94, + "pos_x": 458.16, + "pos_y": 1.49, + "room": 5, + "rot_z": 0, + "rot_y": 51, + "rot_x": 0, + "type": 10, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 925.68, + "pos_x": 1813.83, + "pos_y": 3.06, + "room": 5, + "rot_z": 0, + "rot_y": 494, + "rot_x": 0, + "type": 10, + "quantity": 4 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -757.3, + "pos_x": -504.37, + "pos_y": 3.05, + "room": 5, + "rot_z": 0, + "rot_y": 676, + "rot_x": 0, + "type": 11, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -420.89, + "pos_x": 1118.48, + "pos_y": 4.0, + "room": 5, + "rot_z": 0, + "rot_y": 364, + "rot_x": 0, + "type": 11, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 222.99, + "pos_x": 2658.84, + "pos_y": 3.24, + "room": 5, + "rot_z": 0, + "rot_y": 756, + "rot_x": 0, + "type": 11, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 695.3, + "pos_x": 1612.71, + "pos_y": -30.27, + "room": 6, + "rot_z": 0, + "rot_y": 517, + "rot_x": 0, + "type": 29, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -266.33, + "pos_x": -2050.04, + "pos_y": -31.9, + "room": 6, + "rot_z": 0, + "rot_y": 28, + "rot_x": 0, + "type": 29, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -26.14, + "pos_x": -344.14, + "pos_y": -13.0, + "room": 6, + "rot_z": 0, + "rot_y": 443, + "rot_x": 0, + "type": 33, + "quantity": 5 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -416.52, + "pos_x": -161.74, + "pos_y": 4.8, + "room": 6, + "rot_z": 0, + "rot_y": 472, + "rot_x": 0, + "type": 33, + "quantity": 4 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -643.19, + "pos_x": -481.05, + "pos_y": 15.34, + "room": 6, + "rot_z": 0, + "rot_y": 568, + "rot_x": 0, + "type": 33, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -235.13, + "pos_x": -692.26, + "pos_y": -11.02, + "room": 6, + "rot_z": 0, + "rot_y": 608, + "rot_x": 0, + "type": 33, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -343.46, + "pos_x": -417.82, + "pos_y": -1.44, + "room": 6, + "rot_z": 0, + "rot_y": 147, + "rot_x": 0, + "type": 33, + "quantity": 3 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2925.29, + "pos_x": 4294.59, + "pos_y": -75.65, + "room": 7, + "rot_z": 0, + "rot_y": -130, + "rot_x": 0, + "type": 10, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2049.22, + "pos_x": 3995.3, + "pos_y": -45.09, + "room": 7, + "rot_z": 0, + "rot_y": -85, + "rot_x": 0, + "type": 10, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -1574.97, + "pos_x": 4187.0, + "pos_y": -17.07, + "room": 7, + "rot_z": 0, + "rot_y": -17, + "rot_x": 0, + "type": 10, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2570.78, + "pos_x": 3781.64, + "pos_y": -66.86, + "room": 7, + "rot_z": 0, + "rot_y": -130, + "rot_x": 0, + "type": 10, + "quantity": 1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4049.95, + "pos_x": 293.99, + "pos_y": -170.31, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 7 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 3440.16, + "pos_x": 124.95, + "pos_y": -186.54, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 5 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4509.84, + "pos_x": -425.01, + "pos_y": -179.3, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4108.5, + "pos_x": -714.48, + "pos_y": -183.78, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 3726.09, + "pos_x": -1021.27, + "pos_y": -215.48, + "room": 8, + "rot_z": 0, + "rot_y": 819, + "rot_x": 0, + "type": 22, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -316.05, + "pos_x": -1974.57, + "pos_y": -209.48, + "room": 8, + "rot_z": 0, + "rot_y": -56, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -382.9, + "pos_x": -1825.11, + "pos_y": -210.91, + "room": 8, + "rot_z": 0, + "rot_y": 130, + "rot_x": 0, + "type": 31, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 592.49, + "pos_x": 3383.92, + "pos_y": 2.65, + "room": 9, + "rot_z": 0, + "rot_y": -193, + "rot_x": 0, + "type": 30, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 987.24, + "pos_x": 2653.55, + "pos_y": -22.59, + "room": 9, + "rot_z": 0, + "rot_y": -73, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 445.91, + "pos_x": 2838.69, + "pos_y": -28.0, + "room": 9, + "rot_z": 0, + "rot_y": -142, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 575.43, + "pos_x": 2109.53, + "pos_y": -26.57, + "room": 9, + "rot_z": 0, + "rot_y": -460, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 2199.24, + "pos_x": -1713.72, + "pos_y": 1262.5, + "room": 9, + "rot_z": 0, + "rot_y": -45, + "rot_x": 273, + "type": 37, + "quantity": -1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 1682.19, + "pos_x": -1174.44, + "pos_y": 1319.5, + "room": 9, + "rot_z": 0, + "rot_y": -39, + "rot_x": 0, + "type": 37, + "quantity": 6 + } + ], + [], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -720.92, + "pos_x": 2195.89, + "pos_y": 73.7, + "room": 11, + "rot_z": 0, + "rot_y": 39, + "rot_x": 0, + "type": 26, + "quantity": 2 + }, + { + "variant": 6, + "unk1": 1, + "unk2": 255, + "pos_z": 896.44, + "pos_x": -535.73, + "pos_y": 1212.59, + "room": 11, + "rot_z": 0, + "rot_y": 169, + "rot_x": 0, + "type": 26, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 289.52, + "pos_x": -434.0, + "pos_y": 198.96, + "room": 11, + "rot_z": 0, + "rot_y": -267, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 66.62, + "pos_x": -802.69, + "pos_y": 198.96, + "room": 11, + "rot_z": 0, + "rot_y": -216, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -371.21, + "pos_x": -645.14, + "pos_y": 288.96, + "room": 11, + "rot_z": 0, + "rot_y": -227, + "rot_x": 0, + "type": 37, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -166.43, + "pos_x": -473.33, + "pos_y": 168.96, + "room": 11, + "rot_z": 0, + "rot_y": -210, + "rot_x": 0, + "type": 37, + "quantity": 1 + } + ] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 1, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 2, + "penalty_per_cart": 1400, + "resources": 0, + "details": "I'm gonna get so fired for\nthis... The Great Jaggi some\nhunter brought in just\nescaped. Mind going after\nthem? You better hurry,\nthough. Bet they've got some\nincredible materials, too.", + "description": "Hunt 48 Great Jaggi", + "wave_1_transition_target": 0, + "hrp_restriction": 0, + "quest_fee": 400, + "quest_id": 61003, + "name": "Jump Fourty-Eight Jaggi", + "main_monster_2": 31, + "main_monster_1": 36, + "supply_set_number": 19, + "summon": 1678049817, + "client": "Guild Subcontractor", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 1, + "hp_spread": 1, + "level": 23, + "boss_id": 255, + "type": 12, + "starting_area": 0, + "spawn_count": 16, + "size": 100 + }, + "monster_3": { + "size_spread": 1, + "hp_spread": 1, + "level": 23, + "boss_id": 255, + "type": 12, + "starting_area": 0, + "spawn_count": 16, + "size": 100 + }, + "monster_1": { + "size_spread": 1, + "hp_spread": 1, + "level": 23, + "boss_id": 255, + "type": 12, + "starting_area": 0, + "spawn_count": 16, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Mercy Mission.json b/event/Mercy Mission.json new file mode 100644 index 0000000..ffe1c74 --- /dev/null +++ b/event/Mercy Mission.json @@ -0,0 +1,264 @@ +{ + "objective_details": { + "subquest_2": { + "objective_num": 3, + "hrp_reward": 70, + "rewards_row_1": [ + [ + 440, + 1, + 35 + ], + [ + 447, + 1, + 5 + ], + [ + 441, + 1, + 15 + ], + [ + 327, + 1, + 20 + ], + [ + 328, + 1, + 25 + ] + ], + "description": "Deliver 3 Goldenfish", + "objective_type": 217, + "zenny_reward": 2000, + "type": 2 + }, + "main_quest": { + "objective_num": 10, + "hrp_reward": 70, + "rewards_row_1": [ + [ + 440, + 1, + 8 + ], + [ + 149, + 1, + 20 + ], + [ + 141, + 2, + 20 + ], + [ + 327, + 1, + 18 + ], + [ + 216, + 1, + 8 + ], + [ + 101, + 8, + 14 + ], + [ + 569, + 1, + 12 + ] + ], + "rewards_row_2": [ + [ + 440, + 1, + 35 + ], + [ + 447, + 1, + 5 + ], + [ + 441, + 1, + 15 + ], + [ + 327, + 1, + 20 + ], + [ + 328, + 1, + 25 + ] + ], + "objective_type": 429, + "zenny_reward": 1500, + "type": 2 + }, + "subquest_1": { + "objective_num": 12, + "hrp_reward": 55, + "rewards_row_1": [ + [ + 440, + 1, + 8 + ], + [ + 149, + 1, + 20 + ], + [ + 141, + 2, + 20 + ], + [ + 327, + 1, + 18 + ], + [ + 216, + 1, + 8 + ], + [ + 101, + 1, + 14 + ], + [ + 569, + 1, + 12 + ] + ], + "description": "Deliver 12 Red Coral Stones", + "objective_type": 430, + "zenny_reward": 1200, + "type": 2 + } + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 15, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 1, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 23, + "wave_2_transition_type": 0, + "location": 1, + "penalty_per_cart": 600, + "resources": 0, + "details": "Wanted:\nThe description for this\nquest! If you can find\nit, please let us know!\nThanks!", + "description": "Deliver 10 Monster Guts", + "smallmonster_data_file": "sm_mercymission.dat", + "wave_1_transition_target": 0, + "hrp_restriction": 0, + "quest_fee": 150, + "quest_id": 61002, + "name": "Mercy Mission", + "main_monster_2": 23, + "main_monster_1": 17, + "supply_set_number": 35, + "summon": 1677918979, + "client": "MH3SP Dev Team", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 1, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ] + ], + "success_message": "Complete the Main Quest\nand both Subquests." + }, + "unknown": { + "unk_12": 3, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 3, + "hp_spread": 1, + "level": 23, + "boss_id": 0, + "type": 16, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/Rage Match.json b/event/Rage Match.json new file mode 100644 index 0000000..f44b6a0 --- /dev/null +++ b/event/Rage Match.json @@ -0,0 +1,215 @@ +{ + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 2, + "hrp_reward": 2880, + "rewards_row_1": [ + [ + 486, + 1, + 6 + ], + [ + 485, + 1, + 13 + ], + [ + 484, + 1, + 26 + ], + [ + 483, + 1, + 20 + ], + [ + 441, + 1, + 6 + ], + [ + 487, + 1, + 4 + ], + [ + 185, + 1, + 25 + ] + ], + "rewards_row_2": [ + [ + 486, + 1, + 6 + ], + [ + 485, + 1, + 13 + ], + [ + 484, + 1, + 26 + ], + [ + 483, + 1, + 20 + ], + [ + 441, + 1, + 6 + ], + [ + 487, + 1, + 4 + ], + [ + 185, + 1, + 25 + ] + ], + "objective_type": 7, + "zenny_reward": 36000, + "type": 1 + }, + "subquest_1": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + } + }, + "small_monsters": [ + [], + [] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 6, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 244, + "wave_2_transition_type": 0, + "location": 8, + "penalty_per_cart": 13000, + "resources": 1, + "details": "We've all heard of that\noutrageous dragon of rage,\nthe Deviljho! Now, we've got\nnot one -- but two -- stalking\nthe Arena! What hunter has the\ncojones to challenge these\npernicious predators? Not me.", + "description": "Hunt 2 Deviljho", + "wave_1_transition_target": 0, + "hrp_restriction": 11, + "quest_fee": 3600, + "quest_id": 61018, + "name": "Rage Match", + "main_monster_2": 0, + "main_monster_1": 0, + "supply_set_number": 43, + "summon": 1677787698, + "client": "Arena Manager", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 10, + "hp_spread": 0, + "level": 60, + "boss_id": 2, + "type": 7, + "starting_area": 1, + "spawn_count": 1, + "size": 90 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 10, + "hp_spread": 0, + "level": 60, + "boss_id": 1, + "type": 7, + "starting_area": 1, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/The Phantom Uragaan.json b/event/The Phantom Uragaan.json new file mode 100644 index 0000000..14c2e5b --- /dev/null +++ b/event/The Phantom Uragaan.json @@ -0,0 +1,222 @@ +{ + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 1100, + "rewards_row_1": [ + [ + 440, + 1, + 1 + ], + [ + 410, + 1, + 16 + ], + [ + 479, + 1, + 20 + ], + [ + 412, + 1, + 10 + ], + [ + 155, + 1, + 10 + ], + [ + 343, + 15, + 13 + ], + [ + 441, + 1, + 5 + ], + [ + 110, + 1, + 25 + ] + ], + "rewards_row_2": [ + [ + 440, + 1, + 1 + ], + [ + 410, + 1, + 16 + ], + [ + 479, + 1, + 20 + ], + [ + 412, + 1, + 10 + ], + [ + 155, + 1, + 10 + ], + [ + 343, + 15, + 13 + ], + [ + 441, + 1, + 5 + ], + [ + 110, + 1, + 25 + ] + ], + "objective_type": 9, + "zenny_reward": 8800, + "type": 1 + }, + "subquest_1": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + } + }, + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 3, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 29, + "wave_2_transition_type": 0, + "location": 5, + "penalty_per_cart": 3000, + "resources": 0, + "details": "Oooh, I just heard they've\nspotted the cutest, tiniest,\nmost adorable little Uragaan\non the Volcano. Hunt me one\nthis instant or I will get\nvery angry. And if I'm angry,\nDaddy's angry. Now go!", + "description": "Hunt an Uragaan", + "smallmonster_data_file": "sm_phantomuragaan.dat", + "wave_1_transition_target": 0, + "hrp_restriction": 8, + "quest_fee": 850, + "quest_id": 61007, + "name": "The Phantom Uragaan", + "main_monster_2": 27, + "main_monster_1": 21, + "supply_set_number": 15, + "summon": 0, + "client": "Spoiled Princess", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ] + ], + "success_message": "Complete the Main Quest." + }, + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 29, + "boss_id": 0, + "type": 9, + "starting_area": 0, + "spawn_count": 1, + "size": 19 + } + } +} \ No newline at end of file diff --git a/event/Where Gods Fear to Tread.json b/event/Where Gods Fear to Tread.json new file mode 100644 index 0000000..aabbdf7 --- /dev/null +++ b/event/Where Gods Fear to Tread.json @@ -0,0 +1,205 @@ +{ + "unknown": { + "unk_12": 5, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 4200, + "rewards_row_1": [ + [ + 433, + 1, + 40 + ], + [ + 510, + 1, + 30 + ], + [ + 435, + 1, + 10 + ], + [ + 434, + 1, + 10 + ], + [ + 437, + 1, + 5 + ], + [ + 436, + 1, + 5 + ] + ], + "rewards_row_2": [ + [ + 434, + 1, + 11 + ], + [ + 510, + 1, + 34 + ], + [ + 435, + 1, + 39 + ], + [ + 466, + 1, + 6 + ], + [ + 437, + 1, + 5 + ], + [ + 436, + 1, + 5 + ] + ], + "objective_type": 24, + "zenny_reward": 42000, + "type": 257 + }, + "subquest_1": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + } + }, + "small_monsters": [ + [], + [] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 2, + "quest_rank": 6, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 64, + "wave_2_transition_type": 0, + "location": 11, + "penalty_per_cart": 14000, + "resources": 1, + "details": "I've been waiting, hunter. Now\ncomes your final challenge:\nAlatreon, a dragon of darkness\nand light. Can mere mortals\nfell an elder dragon feared\neven by the gods? Don't even\nbother saying your prayers...", + "description": "Slay the Alatreon", + "wave_1_transition_target": 0, + "hrp_restriction": 11, + "quest_fee": 4200, + "quest_id": 61021, + "name": "Where Gods Fear to Tread", + "main_monster_2": 0, + "main_monster_1": 0, + "supply_set_number": 0, + "summon": 0, + "client": "Scarlet Mystery Man", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 64, + "boss_id": 0, + "type": 24, + "starting_area": 0, + "spawn_count": 1, + "size": 125 + } + } +} \ No newline at end of file diff --git a/event/World Eater.json b/event/World Eater.json new file mode 100644 index 0000000..09a2da9 --- /dev/null +++ b/event/World Eater.json @@ -0,0 +1,880 @@ +{ + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 1800, + "rewards_row_1": [ + [ + 442, + 1, + 33 + ], + [ + 487, + 1, + 4 + ], + [ + 488, + 1, + 8 + ], + [ + 483, + 1, + 17 + ], + [ + 446, + 1, + 11 + ], + [ + 441, + 1, + 19 + ], + [ + 486, + 1, + 8 + ] + ], + "rewards_row_2": [ + [ + 488, + 1, + 20 + ], + [ + 442, + 1, + 34 + ], + [ + 486, + 1, + 6 + ], + [ + 483, + 1, + 17 + ], + [ + 487, + 1, + 3 + ], + [ + 441, + 1, + 11 + ], + [ + 446, + 1, + 9 + ] + ], + "objective_type": 7, + "zenny_reward": 18000, + "type": 1 + }, + "subquest_1": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + } + }, + "small_monsters": [ + [], + [ + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": -3613.8, + "pos_x": 247.42, + "pos_y": 560.37, + "room": 1, + "rot_z": 0, + "rot_y": -119, + "rot_x": 0, + "type": 34, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -3857.25, + "pos_x": -474.9, + "pos_y": 491.91, + "room": 1, + "rot_z": 0, + "rot_y": -267, + "rot_x": 0, + "type": 34, + "quantity": 3 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": -4931.83, + "pos_x": 897.01, + "pos_y": 418.6, + "room": 1, + "rot_z": 0, + "rot_y": -284, + "rot_x": 0, + "type": 34, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -4449.25, + "pos_x": 219.95, + "pos_y": 402.97, + "room": 1, + "rot_z": 0, + "rot_y": 244, + "rot_x": 0, + "type": 34, + "quantity": 2 + } + ], + [ + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 117.64, + "pos_x": -6654.1, + "pos_y": 23.12, + "room": 2, + "rot_z": 0, + "rot_y": 455, + "rot_x": 0, + "type": 33, + "quantity": 3 + } + ], + [ + { + "variant": 0, + "unk1": 0, + "unk2": 255, + "pos_z": -1280.44, + "pos_x": 2567.38, + "pos_y": -4.58, + "room": 3, + "rot_z": 0, + "rot_y": 352, + "rot_x": 0, + "type": 27, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -787.0, + "pos_x": 2119.14, + "pos_y": -14.21, + "room": 3, + "rot_z": 0, + "rot_y": 335, + "rot_x": 0, + "type": 27, + "quantity": -1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 2631.32, + "pos_x": 39.65, + "pos_y": 2.0, + "room": 4, + "rot_z": 0, + "rot_y": 113, + "rot_x": 0, + "type": 30, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 2165.99, + "pos_x": -538.14, + "pos_y": 2.0, + "room": 4, + "rot_z": 0, + "rot_y": -91, + "rot_x": 0, + "type": 30, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 820.71, + "pos_x": 360.98, + "pos_y": 2.0, + "room": 4, + "rot_z": 0, + "rot_y": -187, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 3071.35, + "pos_x": -5671.42, + "pos_y": 466.03, + "room": 4, + "rot_z": 0, + "rot_y": 304, + "rot_x": 273, + "type": 36, + "quantity": -1 + } + ], + [], + [], + [ + { + "variant": 4, + "unk1": 1, + "unk2": 255, + "pos_z": 1586.48, + "pos_x": 2237.04, + "pos_y": -1090.0, + "room": 7, + "rot_z": 0, + "rot_y": 96, + "rot_x": 0, + "type": 32, + "quantity": 4 + }, + { + "variant": 4, + "unk1": 1, + "unk2": 255, + "pos_z": 2832.58, + "pos_x": 2469.26, + "pos_y": -1330.0, + "room": 7, + "rot_z": 0, + "rot_y": -108, + "rot_x": 0, + "type": 32, + "quantity": 2 + }, + { + "variant": 4, + "unk1": 1, + "unk2": 255, + "pos_z": -1429.32, + "pos_x": 1103.05, + "pos_y": -2050.0, + "room": 7, + "rot_z": 0, + "rot_y": -108, + "rot_x": 0, + "type": 32, + "quantity": 2 + }, + { + "variant": 4, + "unk1": 1, + "unk2": 255, + "pos_z": 3126.22, + "pos_x": -3054.79, + "pos_y": -3047.85, + "room": 7, + "rot_z": 0, + "rot_y": -62, + "rot_x": 0, + "type": 32, + "quantity": 1 + }, + { + "variant": 4, + "unk1": 1, + "unk2": 255, + "pos_z": -557.22, + "pos_x": 1268.03, + "pos_y": -2470.0, + "room": 7, + "rot_z": 0, + "rot_y": -108, + "rot_x": 0, + "type": 32, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -1993.49, + "pos_x": 1742.13, + "pos_y": -3820.0, + "room": 7, + "rot_z": 0, + "rot_y": -108, + "rot_x": 0, + "type": 32, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -4462.32, + "pos_x": 1732.89, + "pos_y": -3580.0, + "room": 7, + "rot_z": 0, + "rot_y": -278, + "rot_x": 0, + "type": 32, + "quantity": 2 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -523.41, + "pos_x": 80.95, + "pos_y": 35.81, + "room": 8, + "rot_z": 0, + "rot_y": -420, + "rot_x": 0, + "type": 17, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 465.56, + "pos_x": -1342.36, + "pos_y": -18.0, + "room": 8, + "rot_z": 0, + "rot_y": -324, + "rot_x": 0, + "type": 17, + "quantity": 1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -3228.47, + "pos_x": 1059.13, + "pos_y": 5.78, + "room": 9, + "rot_z": 0, + "rot_y": -261, + "rot_x": 0, + "type": 10, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -746.07, + "pos_x": 390.83, + "pos_y": 20.44, + "room": 9, + "rot_z": 0, + "rot_y": -176, + "rot_x": 0, + "type": 11, + "quantity": 4 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 5.01, + "pos_x": -482.31, + "pos_y": 16.39, + "room": 9, + "rot_z": 0, + "rot_y": 250, + "rot_x": 0, + "type": 11, + "quantity": 2 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 931.19, + "pos_x": -1846.87, + "pos_y": -263.0, + "room": 10, + "rot_z": 0, + "rot_y": -5, + "rot_x": 0, + "type": 10, + "quantity": 5 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -355.73, + "pos_x": -3160.63, + "pos_y": -206.32, + "room": 10, + "rot_z": 0, + "rot_y": 307, + "rot_x": 0, + "type": 10, + "quantity": 3 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 1228.73, + "pos_x": -1949.45, + "pos_y": -276.13, + "room": 10, + "rot_z": 0, + "rot_y": 216, + "rot_x": 0, + "type": 10, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 1504.3, + "pos_x": -1552.64, + "pos_y": -186.42, + "room": 10, + "rot_z": 0, + "rot_y": -28, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": 1441.92, + "pos_x": -1352.11, + "pos_y": -174.8, + "room": 10, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 31, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 2295.24, + "pos_x": -653.75, + "pos_y": 306.58, + "room": 10, + "rot_z": 0, + "rot_y": 221, + "rot_x": 0, + "type": 36, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 2086.81, + "pos_x": -615.28, + "pos_y": 96.58, + "room": 10, + "rot_z": 0, + "rot_y": 119, + "rot_x": 0, + "type": 36, + "quantity": 4 + } + ], + [ + { + "variant": 6, + "unk1": 1, + "unk2": 255, + "pos_z": 2253.55, + "pos_x": -453.62, + "pos_y": 705.5, + "room": 11, + "rot_z": 0, + "rot_y": -5, + "rot_x": 0, + "type": 26, + "quantity": 2 + }, + { + "variant": 6, + "unk1": 1, + "unk2": 255, + "pos_z": 3677.44, + "pos_x": 142.14, + "pos_y": 336.98, + "room": 11, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": 4 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 5818.19, + "pos_x": 4363.26, + "pos_y": 426.27, + "room": 11, + "rot_z": 0, + "rot_y": 171, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 5556.53, + "pos_x": 4782.14, + "pos_y": 426.27, + "room": 11, + "rot_z": 0, + "rot_y": 164, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 6208.15, + "pos_x": 4617.08, + "pos_y": 426.27, + "room": 11, + "rot_z": 0, + "rot_y": 284, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 1, + "unk1": 1, + "unk2": 255, + "pos_z": 5456.15, + "pos_x": 5099.46, + "pos_y": 426.27, + "room": 11, + "rot_z": 0, + "rot_y": 161, + "rot_x": 0, + "type": 30, + "quantity": 1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 4297.09, + "pos_x": 2767.15, + "pos_y": 611.59, + "room": 11, + "rot_z": 0, + "rot_y": -301, + "rot_x": 0, + "type": 36, + "quantity": 4 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 5908.79, + "pos_x": 2793.18, + "pos_y": 1205.81, + "room": 11, + "rot_z": 0, + "rot_y": -295, + "rot_x": 0, + "type": 36, + "quantity": 2 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": 5369.26, + "pos_x": 3210.49, + "pos_y": 845.81, + "room": 11, + "rot_z": 0, + "rot_y": -398, + "rot_x": 0, + "type": 36, + "quantity": 1 + } + ], + [ + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2648.11, + "pos_x": 572.89, + "pos_y": -618.12, + "room": 12, + "rot_z": 0, + "rot_y": -142, + "rot_x": 0, + "type": 23, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -3356.64, + "pos_x": -501.62, + "pos_y": -210.0, + "room": 12, + "rot_z": 0, + "rot_y": 45, + "rot_x": 0, + "type": 23, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 1, + "unk2": 255, + "pos_z": -2880.06, + "pos_x": -1624.63, + "pos_y": -888.12, + "room": 12, + "rot_z": 0, + "rot_y": 113, + "rot_x": 0, + "type": 23, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -7478.2, + "pos_x": -2352.88, + "pos_y": -523.55, + "room": 12, + "rot_z": 0, + "rot_y": -91, + "rot_x": 0, + "type": 32, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -7734.46, + "pos_x": -1957.86, + "pos_y": -1228.41, + "room": 12, + "rot_z": 0, + "rot_y": -91, + "rot_x": 0, + "type": 32, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -8174.07, + "pos_x": -2821.8, + "pos_y": -988.41, + "room": 12, + "rot_z": 0, + "rot_y": -91, + "rot_x": 0, + "type": 32, + "quantity": -1 + }, + { + "variant": 2, + "unk1": 1, + "unk2": 255, + "pos_z": -7780.24, + "pos_x": -2435.99, + "pos_y": -988.41, + "room": 12, + "rot_z": 0, + "rot_y": -91, + "rot_x": 0, + "type": 32, + "quantity": -1 + } + ] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 1, + "quest_rank": 6, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 52, + "wave_2_transition_type": 0, + "location": 1, + "penalty_per_cart": 6000, + "resources": 1, + "details": "Emergency! A huge Deviljho has\nappeared. It's twice as big as\na normal one and it's eating\neverything in sight! Go get\nit! And now, a haiku: A huge\nDeviljho/with no food in its\nstomach/eats the whole island.", + "description": "Hunt a Deviljho", + "wave_1_transition_target": 0, + "hrp_restriction": 11, + "quest_fee": 1800, + "quest_id": 61020, + "name": "World Eater", + "main_monster_2": 11, + "main_monster_1": 10, + "supply_set_number": 31, + "summon": 1677787700, + "client": "Guildmaster", + "flags": [ + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 1, + 1 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 0, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 0, + "hp_spread": 0, + "level": 64, + "boss_id": 0, + "type": 7, + "starting_area": 0, + "spawn_count": 1, + "size": 200 + } + } +} \ No newline at end of file diff --git a/event/[MH3SP] Green Eggs and....json b/event/[MH3SP] Green Eggs and....json new file mode 100644 index 0000000..7a42826 --- /dev/null +++ b/event/[MH3SP] Green Eggs and....json @@ -0,0 +1,353 @@ +{ + "unknown": { + "unk_12": 2, + "unk_4": 0, + "unk_5": 0, + "unk_6": 0, + "unk_7": 0 + }, + "objective_details": { + "subquest_2": { + "objective_num": 0, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 0, + "zenny_reward": 0, + "type": 0 + }, + "main_quest": { + "objective_num": 1, + "hrp_reward": 950, + "rewards_row_1": [ + [ + 291, + 1, + 18 + ], + [ + 292, + 1, + 6 + ], + [ + 294, + 1, + 11 + ], + [ + 293, + 1, + 15 + ], + [ + 414, + 1, + 10 + ], + [ + 418, + 1, + 16 + ], + [ + 415, + 1, + 13 + ], + [ + 416, + 1, + 6 + ], + [ + 419, + 1, + 5 + ] + ], + "rewards_row_2": [ + [ + 291, + 1, + 13 + ], + [ + 292, + 1, + 6 + ], + [ + 294, + 1, + 11 + ], + [ + 293, + 1, + 10 + ], + [ + 414, + 1, + 9 + ], + [ + 418, + 1, + 10 + ], + [ + 415, + 1, + 10 + ], + [ + 416, + 1, + 6 + ], + [ + 419, + 1, + 5 + ], + [ + 565, + 1, + 20 + ] + ], + "objective_type": 4, + "zenny_reward": 7000, + "type": 1 + }, + "subquest_1": { + "objective_num": 1, + "hrp_reward": 0, + "rewards_row_1": [], + "description": "None", + "objective_type": 19, + "zenny_reward": 0, + "type": 1 + } + }, + "small_monsters": [ + [], + [ + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": -1 + }, + { + "variant": 0, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 26, + "quantity": -1 + }, + { + "variant": 1, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 35, + "quantity": -1 + }, + { + "variant": 1, + "unk1": 3, + "unk2": 255, + "pos_z": -3042.7, + "pos_x": -0.5, + "pos_y": -5038.5, + "room": 1, + "rot_z": 0, + "rot_y": 170, + "rot_x": 0, + "type": 35, + "quantity": -1 + } + ] + ], + "quest_info": { + "wave_1_transition_type": 0, + "time_limit": 50, + "wave_1_transition_quantity": 0, + "starting_position": 0, + "quest_rank": 3, + "wave_2_transition_target": 0, + "wave_2_transition_quantity": 0, + "general_enemy_level": 27, + "wave_2_transition_type": 0, + "location": 8, + "penalty_per_cart": 2400, + "resources": 0, + "details": "Why do we live, only to suffer?\nOnly slayers of pig meat know\nthese things. Take care, Hunter,\nfor those who look to antidote\nherbs may find their breath\nstolen away.", + "description": "Hunt a Gigginox\nand an Agnaktor", + "wave_1_transition_target": 0, + "hrp_restriction": 8, + "quest_fee": 200, + "quest_id": 61050, + "name": "[MH3SP] Green Eggs and...", + "main_monster_2": 19, + "main_monster_1": 4, + "supply_set_number": 43, + "summon": 0, + "client": "Ze SpyRo", + "flags": [ + [ + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 1, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ], + [ + 1, + 0, + 1, + 0, + 0, + 0, + 0, + 0 + ] + ], + "success_message": "Complete the Main Quest." + }, + "large_monsters": { + "monster_2": { + "size_spread": 3, + "hp_spread": 0, + "level": 27, + "boss_id": 1, + "type": 19, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + }, + "monster_3": { + "size_spread": 0, + "hp_spread": 0, + "level": 0, + "boss_id": 2, + "type": 0, + "starting_area": 0, + "spawn_count": 0, + "size": 0 + }, + "monster_1": { + "size_spread": 3, + "hp_spread": 0, + "level": 27, + "boss_id": 0, + "type": 4, + "starting_area": 0, + "spawn_count": 1, + "size": 100 + } + } +} \ No newline at end of file diff --git a/event/quest_rotation.json b/event/quest_rotation.json new file mode 100644 index 0000000..105f796 --- /dev/null +++ b/event/quest_rotation.json @@ -0,0 +1,128 @@ +[ + [ + "event/Jump Four Jaggi.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Mercy Mission.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match The Two Flames.json" + ], + [ + "event/Mercy Mission.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Where Gods Fear to Tread.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Blood Sport.json", + "event/Rage Match.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/[MH3SP] Green Eggs and....json", + "event/Rage Match.json", + "event/Where Gods Fear to Tread.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/[MH3SP] Green Eggs and....json", + "event/Rage Match.json", + "event/Where Gods Fear to Tread.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/[MH3SP] Green Eggs and....json", + "event/Rage Match.json", + "event/Where Gods Fear to Tread.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Jump Fourty-Eight Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match The Two Flames.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Fourty-Eight Jaggi.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json" + ], + [ + "event/Jump Fourty-Eight Jaggi.json", + "event/Blood Sport.json", + "event/Mercy Mission.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Bird and Brute.json", + "event/Grudge Match The Two Flames.json", + "event/Grudge Match Land Lords.json" + ], + [ + "event/Jump Four Jaggi.json", + "event/Flooded Forest Free-For-All.json", + "event/Rage Match.json", + "event/Grudge Match Royal Ludroth.json", + "event/Grudge Match Land Lords.json" + ] +] \ No newline at end of file diff --git a/master_server.py b/master_server.py index fcd8c7f..d0cd934 100644 --- a/master_server.py +++ b/master_server.py @@ -14,14 +14,16 @@ from other.debug import register_debug_signal from other.utils import create_server_from_base +from mh.quest_utils import QuestLoader -def create_servers(silent=False, debug_mode=False): +def create_servers(binary_loader, silent=False, debug_mode=False): """Create servers and check if it has ui.""" servers = [] has_ui = False for module in (OPN, LMP, FMP, RFP): server, has_window = create_server_from_base(*module.BASE, + binary_loader=binary_loader, silent=silent, debug_mode=debug_mode) has_ui = has_ui or has_window @@ -32,8 +34,9 @@ def create_servers(silent=False, debug_mode=False): def main(args): """Master server main function.""" register_debug_signal() - - servers, has_ui = create_servers(silent=args.silent, + binary_loader = QuestLoader("event/quest_rotation.json") + servers, has_ui = create_servers(binary_loader, + silent=args.silent, debug_mode=args.debug_mode) threads = [ threading.Thread( diff --git a/mh/arena_utils.py b/mh/arena_utils.py deleted file mode 100644 index aedaa84..0000000 --- a/mh/arena_utils.py +++ /dev/null @@ -1,769 +0,0 @@ -#! /usr/bin/env python -# -*- coding: utf-8 -*- -# SPDX-FileCopyrightText: Copyright (C) 2023 MH3SP Server Project -# SPDX-License-Identifier: AGPL-3.0-or-later -"""Arena utils module. - -Arena Quest ID List: -EA60 -EA61 -EA62 -EA63 -EA64 -EA65 -EA66 -EA67 -EA68 -EA69 -EA6A -EA6B - -bird and brute bowgun: -rathling gun + barrel, poison stinger frame, light bowgun stock - -sea power bowgun: -rathling gun barrel, rathling gun + frame, rathling gun + stock - -land lords bowgun: -jho barrel, diablos frame, barioth stock - -two flames bowgun: -lagiacrus barrel, lagiacrus frame, barioth stock - -https://web.archive.org/web/20111012085906/ -http://divinewh.im/q/c/Grudge_Match:_Royal_Ludroth - -https://web.archive.org/web/20111012085901/ -http://divinewh.im/q/c/Grudge_Match:_Rathian - -https://web.archive.org/web/20111012090656/ -http://divinewh.im/q/c/Grudge_Match:_Uragaan - -https://web.archive.org/web/20111012090915/ -http://divinewh.im/q/c/Grudge_Match:_Bird_and_Brute -""" - -from mh.quest_utils import \ - generate_flags, Monster, LocationType,\ - QuestRankType, QuestRestrictionType, ResourcesType,\ - StartingPositionType, ItemsType -from mh.equipment_utils import Chestpiece, Gauntlets, Faulds,\ - Leggings, Helmet, EquipmentClasses, Greatsword,\ - SnS, Hammer, Longsword, Switchaxe, Lance,\ - BowgunFrame, BowgunStock, BowgunBarrel - - -GRUDGE_MATCH_ROYAL_LUDROTH = { - 'quest_info': { - 'quest_id': 0xEA61, - 'name': "Grudge Match: Royal Ludroth", - 'client': "Announcer/Receptionist", - 'description': "Slay a Royal Ludroth", - 'details': - "Ahoy, adrenaline junkies!\n" - "Next up is the regally maned\n" - "Royal Ludroth! Will the pressure\n" - "of facing this sea dragon on\n" - "its home surf with a strict\n" - "time limit leave the hunters\n" - "all washed up?", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 0, 0, 0, 0, 1, 0, 0), - (1, 0, 0, 0, 1, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 0, 0, 1, 0, 1, 0) - ), - 'penalty_per_cart': 350, - 'quest_fee': 0, - 'time_limit': 50, - 'main_monster_1': Monster.none, - 'main_monster_2': Monster.none, - 'location': LocationType.QUEST_LOCATION_WATER_ARENA_2, - 'quest_rank': QuestRankType.star_1, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, - 'resources': ResourcesType.arena, - 'supply_set_number': 0, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x0017, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_underwaterarenarock.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.royal_ludroth, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000101, - 'objective_type': Monster.royal_ludroth, - 'objective_num': 0x01, - 'zenny_reward': 1000, - 'hrp_reward': 0, - 'rewards_row_1': [ - (ItemsType.r_ludroth_coin, 1, 24), - (ItemsType.r_ludroth_coin, 2, 8), - (ItemsType.voucher, 1, 10), - (ItemsType.armor_sphere, 1, 24), - (ItemsType.steel_eg, 1, 18), - (ItemsType.pinnacle_coin, 1, 16) - ], - 'rewards_row_2': [], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - }, - 'arena_equipment': ( - ( - (EquipmentClasses.SnS, SnS.HydraKnife), - None, None, - Helmet.QurupecoHelm, Chestpiece.QurupecoMail, - Gauntlets.BlastBracelet, Faulds.SteelFaulds, - Leggings.IngotGreaves, - ((ItemsType.whetstone, 20), (ItemsType.potion, 10), - (ItemsType.ration, 10), (ItemsType.oxygen_supply, 10), - (ItemsType.lifepowder, 2), (ItemsType.barrel_bomb_l, 3), - (ItemsType.barrel_bomb_s, 10)), - () - ), - ( - (EquipmentClasses.Greatsword, Greatsword.ChieftainsGrtSwd), - None, None, - Helmet.DrawEarring, Chestpiece.SteelMail, - Gauntlets.GobulVambraces, Faulds.GobulFaulds, - Leggings.HuntersGreaves, - ((ItemsType.whetstone, 20), (ItemsType.potion, 10), - (ItemsType.ration, 10), (ItemsType.oxygen_supply, 10), - (ItemsType.might_pill, 2), (ItemsType.shock_trap, 1), - (ItemsType.ez_flash_bomb, 1)), - () - ), - ( - (EquipmentClasses.Hammer, Hammer.BoneBludgeon), - None, None, - Helmet.BarrothHelm, Chestpiece.BarrothMail, - Gauntlets.AlloyVambraces, Faulds.BarrothFaulds, - Leggings.BarrothGreaves, - ((ItemsType.whetstone, 20), (ItemsType.potion, 10), - (ItemsType.ration, 10), (ItemsType.oxygen_supply, 10), - (ItemsType.paralysis_knife, 5), (ItemsType.ez_flash_bomb, 1)), - () - ), - ( - (EquipmentClasses.BowgunFrame, BowgunFrame.RoyalLauncher), - (EquipmentClasses.BowgunBarrel, BowgunBarrel.JaggidFire), - (EquipmentClasses.BowgunStock, BowgunStock.LightBowgun), - Helmet.AlloyCap, Chestpiece.AlloyVest, - Gauntlets.LagiacrusGuards, Faulds.AlloyCoat, - Leggings.PiscineLeggings, - ((ItemsType.potion, 10), (ItemsType.ration, 10), - (ItemsType.oxygen_supply, 10), (ItemsType.lifepowder, 2), - (ItemsType.shock_trap, 1), (ItemsType.barrel_bomb_l_plus, 2), - (ItemsType.barrel_bomb_l, 2)), - ((ItemsType.normal_s_lv2, 99), (ItemsType.pierce_s_lv1, 60), - (ItemsType.pierce_s_lv2, 50), (ItemsType.clust_s_lv1, 5), - (ItemsType.poison_s_lv1, 12), (ItemsType.para_s_lv1, 12)) - ) - ) -} - -GRUDGE_MATCH_BIRD_BRUTE = { - 'quest_info': { - 'quest_id': 0xEA66, - 'name': "Grudge Match: Bird and Brute", - 'client': "Announcer/Receptionist", - 'description': - "Slay a Qurupeco\n" - "and a Barroth", - 'details': - "Double trouble! It's the\n" - "dirty-bird Qurupeco and the\n" - "land dragon Barroth -- heaven\n" - "and earth, laughter and tears,\n" - "in an ultimate contest! When\n" - "the dust clears, will it\n" - "reveal victory? Or tragedy?", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 1, 0, 0, 0, 1, 0, 0), - (1, 0, 0, 0, 1, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 0, 0, 1, 0, 1, 0) - ), - 'penalty_per_cart': 350, - 'quest_fee': 0, - 'time_limit': 50, - 'main_monster_1': Monster.none, - 'main_monster_2': Monster.none, - 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, - 'quest_rank': QuestRankType.star_4, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_31_INITJOIN, - 'resources': ResourcesType.arena, - 'supply_set_number': 0, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x0017, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_bloodsport.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.qurupeco, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.barroth, - 'boss_id': 0x0001, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000101, - 'objective_type': Monster.qurupeco, - 'objective_num': 0x01, - 'zenny_reward': 1000, - 'hrp_reward': 0, - 'rewards_row_1': [ - (ItemsType.qurupeco_coin, 1, 16), - (ItemsType.barroth_coin, 1, 20), - (ItemsType.voucher, 1, 14), - (ItemsType.armor_sphere_plus, 1, 10), - (ItemsType.adv_armor_sphere, 1, 5), - (ItemsType.steel_eg, 1, 15), - (ItemsType.silver_eg, 1, 5), - (ItemsType.hunter_king_coin, 1, 15) - ], - 'rewards_row_2': [], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000101, - 'objective_type': Monster.barroth, - 'objective_num': 0x01, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - }, - 'arena_equipment': ( - ( - (EquipmentClasses.Switchaxe, Switchaxe.AssaultAxePlus), - None, None, - Helmet.GigginoxCapPlus, Chestpiece.AlloyMail, - Gauntlets.BaggiVambracesPlus, Faulds.GigginoxFauldsPlus, - Leggings.GigginoxGreaves, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.whetstone, 20), (ItemsType.ration, 10), - (ItemsType.cleanser, 5), (ItemsType.barrel_bomb_l, 2), - (ItemsType.lifepowder, 1), (ItemsType.ez_shock_trap, 1), - (ItemsType.ez_flash_bomb, 2)), - () - ), - ( - (EquipmentClasses.Greatsword, Greatsword.CataclysmSword), - None, None, - Helmet.DrawEarring, Chestpiece.JaggiMailPlus, - Gauntlets.JaggiVambracesPlus, Faulds.JaggiFauldsPlus, - Leggings.BoneGreavesPlus, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.whetstone, 20), (ItemsType.ration, 10), - (ItemsType.cleanser, 5), (ItemsType.barrel_bomb_l, 3), - (ItemsType.barrel_bomb_s, 2), (ItemsType.pitfall_trap, 1), - (ItemsType.ez_flash_bomb, 2)), - () - ), - ( - (EquipmentClasses.Lance, Lance.Undertaker), - None, None, - Helmet.DiablosCap, Chestpiece.AgnaktorMailPlus, - Gauntlets.SteelVambracesPlus, Faulds.SteelCoilPlus, - Leggings.AlloyGreaves, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.whetstone, 20), (ItemsType.ration, 10), - (ItemsType.cleanser, 5), (ItemsType.barrel_bomb_l, 2), - (ItemsType.ez_flash_bomb, 1)), - () - ), - ( - (EquipmentClasses.BowgunFrame, BowgunFrame.PoisonStinger), - (EquipmentClasses.BowgunBarrel, BowgunBarrel.RathlingGunPlus), - (EquipmentClasses.BowgunStock, BowgunStock.LightBowgun), - Helmet.AgnaktorCapPlus, Chestpiece.AgnaktorVestPlus, - Gauntlets.AgnaktorGuardsPlus, Faulds.AgnaktorCoatPlus, - Leggings.RathalosLeggingsPlus, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.ration, 10), (ItemsType.cleanser, 5), - (ItemsType.lifepowder, 2), (ItemsType.ez_flash_bomb, 1), - (ItemsType.sonic_bomb, 2)), - ((ItemsType.normal_s_lv2, 99), (ItemsType.normal_s_lv3, 99), - (ItemsType.pierce_s_lv2, 50), (ItemsType.clust_s_lv2, 5), - (ItemsType.crag_s_lv2, 9), (ItemsType.poison_s_lv1, 12), - (ItemsType.para_s_lv1, 12), (ItemsType.sleep_s_lv1, 12)) - ) - ) -} - -GRUDGE_MATCH_TWO_FLAMES = { - 'quest_info': { - 'quest_id': 0xEA68, - 'name': "Grudge Match: The Two Flames", - 'client': "Announcer/Receptionist", - 'description': - "Slay a Rathalos\n" - "and a Rathian", - 'details': - "Wanted:\n" - "The description for this\n" - "quest! If you can find\n" - "it, please let us know!\n" - "Thanks!", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 1, 0, 0, 0, 1, 0, 0), - (1, 0, 0, 0, 1, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 0, 0, 1, 0, 1, 0) - ), - 'penalty_per_cart': 350, - 'quest_fee': 0, - 'time_limit': 50, - 'main_monster_1': Monster.none, - 'main_monster_2': Monster.none, - 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, - 'quest_rank': QuestRankType.star_5, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_31_INITJOIN, - 'resources': ResourcesType.arena, - 'supply_set_number': 0, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x0017, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_bloodsport.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.rathalos, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.rathian, - 'boss_id': 0x0001, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000101, - 'objective_type': Monster.rathalos, - 'objective_num': 0x01, - 'zenny_reward': 1000, - 'hrp_reward': 0, - 'rewards_row_1': [ - (ItemsType.rathalos_coin, 1, 10), - (ItemsType.rathian_coin, 1, 24), - (ItemsType.voucher, 1, 14), - (ItemsType.armor_sphere_plus, 1, 10), - (ItemsType.adv_armor_sphere, 1, 5), - (ItemsType.steel_eg, 1, 15), - (ItemsType.silver_eg, 1, 5), - (ItemsType.hunter_king_coin, 1, 17) - ], - 'rewards_row_2': [], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000101, - 'objective_type': Monster.rathian, - 'objective_num': 0x01, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - }, - 'arena_equipment': ( - ( - (EquipmentClasses.SnS, SnS.IcicleSpikePlus), - None, None, - Helmet.QurupecoHelmPlus, Chestpiece.QurupecoMailPlus, - Gauntlets.QurupecoVambracesPlus, Faulds.QurupecoCoilPlus, - Leggings.QurupecoGreavesPlus, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.whetstone, 20), (ItemsType.ration, 10), - (ItemsType.might_pill, 2), (ItemsType.antidote, 2), - (ItemsType.lifepowder, 1), (ItemsType.dung_bomb, 1), - (ItemsType.paralysis_knife, 5), (ItemsType.pitfall_trap, 1), - (ItemsType.ez_flash_bomb, 5), (ItemsType.barrel_bomb_l_plus, 1), - (ItemsType.barrel_bomb_s, 1)), - () - ), - ( - (EquipmentClasses.Longsword, Longsword.Thunderclap), - None, None, - Helmet.SilenceEarring, Chestpiece.AlloyMailPlus, - Gauntlets.SteelVambracesPlus, Faulds.SteelCoilPlus, - Leggings.VangisGreaves, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.whetstone, 20), (ItemsType.ration, 10), - (ItemsType.antidote, 2), (ItemsType.lifepowder, 1), - (ItemsType.dung_bomb, 1), (ItemsType.ez_flash_bomb, 2)), - () - ), - ( - (EquipmentClasses.Lance, Lance.SpiralLancePlus), - None, None, - Helmet.DemonEdgeEarring, Chestpiece.IngotMailPlus, - Gauntlets.AgnaktorVambracesPlus, Faulds.RhenoplosCoilPlus, - Leggings.IngotGreavesPlus, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.whetstone, 20), (ItemsType.well_done_steak, 10), - (ItemsType.antidote, 2), (ItemsType.lifepowder, 1), - (ItemsType.dung_bomb, 1), (ItemsType.poison_knife, 5), - (ItemsType.shock_trap, 1), (ItemsType.ez_flash_bomb, 1)), - () - ), - ( - (EquipmentClasses.BowgunFrame, BowgunFrame.ThundacrusRex), - (EquipmentClasses.BowgunBarrel, BowgunBarrel.ThundacrusRex), - (EquipmentClasses.BowgunStock, BowgunStock.BlizzardCannon), - Helmet.EarringofFate, Chestpiece.UragaanVestPlus, - Gauntlets.BlastBracelet, Faulds.UragaanCoatPlus, - Leggings.UragaanLeggingsPlus, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.ration, 10), (ItemsType.antidote, 2), - (ItemsType.lifepowder, 2), (ItemsType.dung_bomb, 1), - (ItemsType.shock_trap, 1), (ItemsType.ez_shock_trap, 1), - (ItemsType.pitfall_trap, 1), (ItemsType.ez_barrel_bomb_l, 1), - (ItemsType.barrel_bomb_l, 3), (ItemsType.barrel_bomb_s, 10)), - ((ItemsType.normal_s_lv2, 99), (ItemsType.normal_s_lv3, 99), - (ItemsType.pierce_s_lv3, 40), (ItemsType.demon_s_ii, 5), - (ItemsType.thunder_s, 60)) - ) - ) -} - -GRUDGE_MATCH_LAND_LORDS = { - 'quest_info': { - 'quest_id': 0xEA6B, - 'name': "Grudge Match: Land Lords", - 'client': "Announcer/Receptionist", - 'description': "Slay all 3 monsters", - 'details': - "Wanted:\n" - "The description for this\n" - "quest! If you can find\n" - "it, please let us know!\n" - "Thanks!", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 0, 1, 0, 0, 1, 0, 0), - (1, 0, 0, 0, 1, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 0, 0, 1, 0, 1, 0) - ), - 'penalty_per_cart': 1150, - 'quest_fee': 0, - 'time_limit': 50, - 'main_monster_1': Monster.none, - 'main_monster_2': Monster.none, - 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, - 'quest_rank': QuestRankType.urgent, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_31_INITJOIN, - 'resources': ResourcesType.arena, - 'supply_set_number': 0, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x0017, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_bloodsport.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.barroth, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x17, - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.uragaan, - 'boss_id': 0x0001, - 'enabled': True, - 'level': 0x17, - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.deviljho, - 'boss_id': 0x0002, - 'enabled': True, - 'level': 0x12, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00020101, - 'objective_type': Monster.barroth, - 'objective_num': 0x01, - 'zenny_reward': 3000, - 'hrp_reward': 0, - 'rewards_row_1': [ - (ItemsType.deviljho_coin, 1, 10), - (ItemsType.barroth_coin, 1, 10), - (ItemsType.uragaan_coin, 1, 15), - (ItemsType.voucher, 1, 14), - (ItemsType.adv_armor_sphere, 1, 10), - (ItemsType.hrd_armor_sphere, 1, 7), - (ItemsType.silver_eg, 1, 10), - (ItemsType.hunter_king_coin, 1, 24) - ], - 'rewards_row_2': [], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00020101, - 'objective_type': Monster.uragaan, - 'objective_num': 0x01, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00020101, - 'objective_type': Monster.deviljho, - 'objective_num': 0x01, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - }, - 'arena_equipment': ( - ( - (EquipmentClasses.SnS, SnS.PlagueTabar), - None, None, - Helmet.UragaanHelmPlus, Chestpiece.UragaanMailPlus, - Gauntlets.UragaanVambracesPlus, Faulds.UragaanFauldsPlus, - Leggings.UragaanGreavesPlus, - ((ItemsType.whetstone, 20), (ItemsType.potion, 10), - (ItemsType.mega_potion, 10), (ItemsType.energy_drink, 5), - (ItemsType.lifepowder, 3), (ItemsType.paralysis_knife, 5), - (ItemsType.sleep_knife, 5), (ItemsType.poison_knife, 5), - (ItemsType.tinged_meat, 5), (ItemsType.druged_meat, 5), - (ItemsType.poisoned_meat, 5), (ItemsType.pitfall_trap, 1), - (ItemsType.shock_trap, 1), (ItemsType.ez_shock_trap, 1), - (ItemsType.ez_flash_bomb, 5), (ItemsType.barrel_bomb_l_plus, 2), - (ItemsType.barrel_bomb_l, 3), (ItemsType.barrel_bomb_s, 10), - (ItemsType.max_potion, 2), (ItemsType.ancient_potion, 1), - (ItemsType.powercharm, 1), (ItemsType.armorcharm, 1), - (ItemsType.powertalon, 1), (ItemsType.armortalon, 1)), - () - ), - ( - (EquipmentClasses.Switchaxe, Switchaxe.GreatDemonbindG), - None, None, - Helmet.RathalosHelmPlus, Chestpiece.RathalosMailPlus, - Gauntlets.RathalosVambracesPlus, Faulds.RathalosFauldsPlus, - Leggings.RathalosGreavesPlus, - ((ItemsType.whetstone, 20), (ItemsType.potion, 10), - (ItemsType.mega_potion, 10), (ItemsType.energy_drink, 5), - (ItemsType.lifepowder, 3), (ItemsType.dung_bomb, 5), - (ItemsType.paralysis_knife, 5), (ItemsType.sleep_knife, 5), - (ItemsType.poison_knife, 5), (ItemsType.tinged_meat, 5), - (ItemsType.druged_meat, 5), (ItemsType.poisoned_meat, 5), - (ItemsType.pitfall_trap, 1), (ItemsType.shock_trap, 1), - (ItemsType.ez_flash_bomb, 5), (ItemsType.barrel_bomb_l_plus, 1), - (ItemsType.max_potion, 2), (ItemsType.ancient_potion, 1), - (ItemsType.powercharm, 1), (ItemsType.armorcharm, 1), - (ItemsType.powertalon, 1), (ItemsType.armortalon, 1)), - () - ), - ( - (EquipmentClasses.Longsword, Longsword.ReaverCalamity), - None, None, - Helmet.StimulusEarring, Chestpiece.VangisMail, - Gauntlets.DoberVambraces, Faulds.DoberCoil, - Leggings.DamascusGreaves, - ((ItemsType.whetstone, 20), (ItemsType.potion, 10), - (ItemsType.mega_potion, 10), (ItemsType.energy_drink, 5), - (ItemsType.cleanser, 5), (ItemsType.lifepowder, 5), - (ItemsType.paralysis_knife, 5), (ItemsType.sleep_knife, 5), - (ItemsType.poison_knife, 5), (ItemsType.tinged_meat, 5), - (ItemsType.druged_meat, 5), (ItemsType.poisoned_meat, 5), - (ItemsType.pitfall_trap, 1), (ItemsType.shock_trap, 1), - (ItemsType.ez_shock_trap, 1), (ItemsType.ez_flash_bomb, 5), - (ItemsType.barrel_bomb_l_plus, 2), (ItemsType.barrel_bomb_l, 3), - (ItemsType.barrel_bomb_s, 10), (ItemsType.max_potion, 2), - (ItemsType.ancient_potion, 1), (ItemsType.powercharm, 1), - (ItemsType.armorcharm, 1), (ItemsType.armortalon, 1)), - () - ), - ( - (EquipmentClasses.BowgunFrame, BowgunFrame.Diablazooka), - (EquipmentClasses.BowgunBarrel, BowgunBarrel.DevilsGrin), - (EquipmentClasses.BowgunStock, BowgunStock.BlizzardCannon), - Helmet.BarrageEarring, Chestpiece.DamascusVest, - Gauntlets.DamascusGuards, Faulds.DamascusCoat, - Leggings.DamascusLeggings, - ((ItemsType.potion, 10), (ItemsType.mega_potion, 10), - (ItemsType.energy_drink, 5), (ItemsType.lifepowder, 3), - (ItemsType.paralysis_knife, 5), (ItemsType.sleep_knife, 5), - (ItemsType.poison_knife, 5), (ItemsType.tinged_meat, 5), - (ItemsType.druged_meat, 5), (ItemsType.pitfall_trap, 1), - (ItemsType.shock_trap, 1), (ItemsType.ez_shock_trap, 1), - (ItemsType.ez_flash_bomb, 5), (ItemsType.ez_barrel_bomb_l, 2), - (ItemsType.barrel_bomb_l_plus, 2), (ItemsType.barrel_bomb_l, 3), - (ItemsType.barrel_bomb_s, 10), (ItemsType.max_potion, 2), - (ItemsType.ancient_potion, 1), (ItemsType.powercharm, 1), - (ItemsType.armorcharm, 1), (ItemsType.powertalon, 1), - (ItemsType.armortalon, 1)), - ((ItemsType.normal_s_lv2, 99), (ItemsType.pierce_s_lv3, 40), - (ItemsType.crag_s_lv2, 9), (ItemsType.crag_s_lv3, 9), - (ItemsType.wyvernfire_lv1, 10), (ItemsType.water_s, 60), - (ItemsType.sleep_s_lv2, 8), (ItemsType.dragon_s, 20), - (ItemsType.demon_s_ii, 5)) - ) - ) -} diff --git a/mh/constants.py b/mh/constants.py index c5d2ec3..4e0eca4 100644 --- a/mh/constants.py +++ b/mh/constants.py @@ -7,22 +7,24 @@ import struct from other.utils import pad from mh.time_utils import current_server_time, TICKS_PER_CYCLE, \ - get_jhen_event_times, is_jhen_active -from mh.quest_utils import \ - QUEST_EVENT_JUMP_FOUR_JAGGI, QUEST_EVENT_BLOOD_SPORT, \ - QUEST_EVENT_MERCY_MISSION, QUEST_EVENT_THE_PHANTOM_URAGAAN, \ - QUEST_EVENT_WORLD_EATER, QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD, \ - make_binary_event_quest -from mh.arena_utils import \ - GRUDGE_MATCH_ROYAL_LUDROTH, GRUDGE_MATCH_BIRD_BRUTE, \ - GRUDGE_MATCH_TWO_FLAMES, GRUDGE_MATCH_LAND_LORDS + get_jhen_event_times, is_jhen_active, current_event_time_slot +from mh.quest_utils import make_binary_event_quest from res.trading_post import CURRENT_TRADES - -def make_binary_type_time_events(): +def make_binary_type_time_events(binary_loader=None): return struct.pack(">III", *get_jhen_event_times()) +def make_event_slot(event): + return (make_binary_event_quest(event), event) + + +def get_event_slot(slot_num, temporal_slot): + return lambda quest_loader, slot_num=slot_num, temporal_slot=temporal_slot: \ + quest_loader[temporal_slot][slot_num] \ + if slot_num < len(quest_loader[temporal_slot]) else b'\0' * 0x4B4 + + def make_binary_server_type_list(is_jap=False): data = bytearray() PROPERTIES = [ @@ -149,7 +151,7 @@ def make_binary_server_type_list(is_jap=False): return data -def make_binary_npc_greeters(is_jap=False): +def make_binary_npc_greeters(binary_loader, is_jap=False, temporal_slot=None): """Binary with NPC City Greeter. Data offset: @@ -171,6 +173,8 @@ def make_binary_npc_greeters(is_jap=False): US_OFFSET = 0x180 JP_OFFSET = 0x100 offset = JP_OFFSET if is_jap else US_OFFSET + if temporal_slot is None: + temporal_slot = current_event_time_slot() if is_jhen_active(): tool_shop = b"Half-off sale!" @@ -181,30 +185,16 @@ def make_binary_npc_greeters(is_jap=False): material_shop = b"Prices are normal." event_quests = b"" - QUEST_LIST = ( - QUEST_EVENT_JUMP_FOUR_JAGGI, - QUEST_EVENT_BLOOD_SPORT, - QUEST_EVENT_MERCY_MISSION, - QUEST_EVENT_THE_PHANTOM_URAGAAN, - QUEST_EVENT_WORLD_EATER, - QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD - ) - - ARENA_LIST = ( - GRUDGE_MATCH_ROYAL_LUDROTH, - GRUDGE_MATCH_BIRD_BRUTE, - GRUDGE_MATCH_TWO_FLAMES, - GRUDGE_MATCH_LAND_LORDS - ) + quest_list, arena_list = binary_loader.get_separated_quest_dicts(temporal_slot) event_quests += b"\n".join([ quest['quest_info']['name'].encode("ascii") - for quest in QUEST_LIST + for quest in quest_list ]) arena_quests = b"\n".join([ quest['quest_info']['name'].encode("ascii") - for quest in ARENA_LIST + for quest in arena_list ]) guildmaster_str = ( @@ -266,6 +256,15 @@ def make_binary_trading_post(): TIME_STATE = 0 IS_JAP = False + +def get_binary_loader_assisted_version(binary_loader): + return current_event_time_slot() + 1 + binary_loader.version + + +def get_binary_quest_content_from_quest_slot(quest_slot): + return lambda temporal_slot, quest_slot=quest_slot: get_event_slot(quest_slot, temporal_slot) + + # Dummy PAT_BINARY PAT_BINARIES = { 0x01: { @@ -277,8 +276,8 @@ def make_binary_trading_post(): "content": make_binary_type_time_events }, 0x03: { - "version": 1, - "content": lambda: make_binary_npc_greeters(is_jap=IS_JAP) + "version": lambda binary_loader: current_event_time_slot() + 1, + "content": lambda temporal_slot: lambda binary_loader: make_binary_npc_greeters(binary_loader, is_jap=IS_JAP, temporal_slot=temporal_slot) }, 0x04: { "version": 1, @@ -291,46 +290,44 @@ def make_binary_trading_post(): # "content": b"TEST_BINARY" }, 0x06: { # English - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_JUMP_FOUR_JAGGI) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(0) }, 0x07: { # English - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_BLOOD_SPORT) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(1) }, 0x08: { # English - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_MERCY_MISSION) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(2) }, 0x09: { # English - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_THE_PHANTOM_URAGAAN) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(3) }, 0x0a: { # Japanese(?)English - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_WORLD_EATER) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(4) }, 0x0b: { # Japanese(?)English - "version": 1, - "content": make_binary_event_quest( - QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD - ) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(5) }, 0x0c: { # Japanese(?)English - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_ROYAL_LUDROTH) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(6) }, 0x0d: { # Japanese(?)English - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_BIRD_BRUTE) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(7) }, 0x0e: { # Japanese(?)English - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_TWO_FLAMES) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(8) }, 0x0f: { # Japanese(?)English - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_LAND_LORDS) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(9) }, 0x10: { # French "version": 1, @@ -341,8 +338,8 @@ def make_binary_trading_post(): "content": make_binary_type_time_events }, 0x12: { # French - "version": 1, - "content": make_binary_npc_greeters + "version": lambda binary_loader: current_event_time_slot() + 1, + "content": lambda temporal_slot: lambda binary_loader: make_binary_npc_greeters(binary_loader, temporal_slot=temporal_slot) }, 0x13: { # French "version": 1, @@ -353,46 +350,44 @@ def make_binary_trading_post(): "content": b"dummy_14\0" }, 0x15: { # French - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_JUMP_FOUR_JAGGI) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(0) }, 0x16: { # French - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_BLOOD_SPORT) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(1) }, 0x17: { # French - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_MERCY_MISSION) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(2) }, 0x18: { # French - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_THE_PHANTOM_URAGAAN) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(3) }, 0x19: { # French - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_WORLD_EATER) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(4) }, 0x1a: { # French - "version": 1, - "content": make_binary_event_quest( - QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD - ) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(5) }, 0x1b: { # French - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_ROYAL_LUDROTH) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(6) }, 0x1c: { # French - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_BIRD_BRUTE) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(7) }, 0x1d: { # French - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_TWO_FLAMES) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(8) }, 0x1e: { # French - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_LAND_LORDS) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(9) }, 0x1f: { # German "version": 1, @@ -403,8 +398,8 @@ def make_binary_trading_post(): "content": make_binary_type_time_events }, 0x21: { # German - "version": 1, - "content": make_binary_npc_greeters + "version": lambda binary_loader: current_event_time_slot() + 1, + "content": lambda temporal_slot: lambda binary_loader: make_binary_npc_greeters(binary_loader, temporal_slot=temporal_slot) }, 0x22: { # German "version": 1, @@ -415,46 +410,44 @@ def make_binary_trading_post(): "content": b"dummy_23\0" }, 0x24: { # German - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_JUMP_FOUR_JAGGI) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(0) }, 0x25: { # German - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_BLOOD_SPORT) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(1) }, 0x26: { # German - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_MERCY_MISSION) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(2) }, 0x27: { # German - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_THE_PHANTOM_URAGAAN) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(3) }, 0x28: { # German - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_WORLD_EATER) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(4) }, 0x29: { # German - "version": 1, - "content": make_binary_event_quest( - QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD - ) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(5) }, 0x2a: { # German - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_ROYAL_LUDROTH) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(6) }, 0x2b: { # German - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_BIRD_BRUTE) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(7) }, 0x2c: { # German - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_TWO_FLAMES) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(8) }, 0x2d: { # German - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_LAND_LORDS) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(9) }, 0x2e: { # Italian "version": 1, @@ -465,8 +458,8 @@ def make_binary_trading_post(): "content": make_binary_type_time_events }, 0x30: { # Italian - "version": 1, - "content": make_binary_npc_greeters + "version": lambda binary_loader: current_event_time_slot() + 1, + "content": lambda temporal_slot: lambda binary_loader: make_binary_npc_greeters(binary_loader, temporal_slot=temporal_slot) }, 0x31: { # Italian "version": 1, @@ -477,46 +470,44 @@ def make_binary_trading_post(): "content": b"dummy_32\0" }, 0x33: { # Italian - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_JUMP_FOUR_JAGGI) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(0) }, 0x34: { # Italian - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_BLOOD_SPORT) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(1) }, 0x35: { # Italian - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_MERCY_MISSION) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(2) }, 0x36: { # Italian - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_THE_PHANTOM_URAGAAN) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(3) }, 0x37: { # Italian - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_WORLD_EATER) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(4) }, 0x38: { # Italian - "version": 1, - "content": make_binary_event_quest( - QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD - ) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(5) }, 0x39: { # Italian - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_ROYAL_LUDROTH) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(6) }, 0x3a: { # Italian - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_BIRD_BRUTE) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(7) }, 0x3b: { # Italian - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_TWO_FLAMES) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(8) }, 0x3c: { # Italian - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_LAND_LORDS) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(9) }, 0x3d: { # Spanish "version": 1, @@ -527,8 +518,8 @@ def make_binary_trading_post(): "content": make_binary_type_time_events }, 0x3f: { # Spanish - "version": 1, - "content": make_binary_npc_greeters + "version": lambda binary_loader: current_event_time_slot() + 1, + "content": lambda temporal_slot: lambda binary_loader: make_binary_npc_greeters(binary_loader, temporal_slot=temporal_slot) }, 0x40: { # Spanish "version": 1, @@ -539,49 +530,57 @@ def make_binary_trading_post(): "content": b"dummy_41\0" }, 0x42: { # Spanish - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_JUMP_FOUR_JAGGI) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(0) }, 0x43: { # Spanish - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_BLOOD_SPORT) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(1) }, 0x44: { # Spanish - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_MERCY_MISSION) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(2) }, 0x45: { # Spanish - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_THE_PHANTOM_URAGAAN) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(3) }, 0x46: { # Spanish - "version": 1, - "content": make_binary_event_quest(QUEST_EVENT_WORLD_EATER) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(4) }, 0x47: { # Spanish - "version": 1, - "content": make_binary_event_quest( - QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD - ) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(5) }, 0x48: { # Spanish - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_ROYAL_LUDROTH) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(6) }, 0x49: { # Spanish - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_BIRD_BRUTE) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(7) }, 0x4a: { # Spanish - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_TWO_FLAMES) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(8) }, 0x4b: { # Spanish - "version": 1, - "content": make_binary_event_quest(GRUDGE_MATCH_LAND_LORDS) + "version": get_binary_loader_assisted_version, + "content": get_binary_quest_content_from_quest_slot(9) }, } + +def get_pat_binary_from_version(binary_type, version): + static_binaries = (0x01, 0x02, 0x04, 0x05, 0x10, 0x11, + 0x13, 0x14, 0x1f, 0x20, 0x22, 0x23, 0x2e, 0x2f, + 0x31, 0x32, 0x3d, 0x3e, 0x40, 0x41) + if binary_type in static_binaries: + return PAT_BINARIES[binary_type]["content"] + return PAT_BINARIES[binary_type]["content"](version) + + PAT_CATEGORIES = { 0x60: "Opn", 0x61: "Rfp", diff --git a/mh/pat.py b/mh/pat.py index 4c60ecf..66c232e 100644 --- a/mh/pat.py +++ b/mh/pat.py @@ -15,7 +15,8 @@ import mh.time_utils as time_utils from mh.constants import \ LAYER_CHAT_COLORS, TERMS_VERSION, TERMS, SUBTERMS, ANNOUNCE, \ - CHARGE, VULGARITY_INFO, FMP_VERSION, PAT_BINARIES, PAT_NAMES, PatID4 + CHARGE, VULGARITY_INFO, FMP_VERSION, PAT_BINARIES, PAT_NAMES, \ + PatID4, get_pat_binary_from_version from mh.session import Session import mh.database as db @@ -33,8 +34,9 @@ class PatServer(server.BasicPatServer, Logger): """Generic PAT server class.""" - def __init__(self, address, handler_class, max_thread_count=0, - logger=None, debug_mode=False, ssl_cert=None, ssl_key=None): + def __init__(self, address, handler_class, binary_loader, + max_thread_count=0, logger=None, debug_mode=False, + ssl_cert=None, ssl_key=None): server.BasicPatServer.__init__( self, address, handler_class, max_thread_count, ssl_cert=ssl_cert, ssl_key=ssl_key @@ -45,6 +47,7 @@ def __init__(self, address, handler_class, max_thread_count=0, self.info("Running on {} port {}".format(*address)) self.debug_con = [] self.debug_mode = debug_mode + self.binary_loader = binary_loader def add_to_debug(self, con): """Add connection to the debug connection list.""" @@ -1133,10 +1136,13 @@ def sendAnsBinaryHead(self, binary_type, seq): - Spanish: 0x41, 0x3d, 0x41, 0x3e, 0x3f, 0x40 """ binary = PAT_BINARIES[binary_type] - content = binary["content"] + version = binary["version"] + if callable(version): + version = version(self.server.binary_loader) + content = get_pat_binary_from_version(binary_type, version) if callable(content): - content = content() - data = struct.pack(">II", binary["version"], len(content)) + content = content(self.server.binary_loader) + data = struct.pack(">II", version, len(content)) self.send_packet(PatID4.AnsBinaryHead, data, seq) def recvReqBinaryData(self, packet_id, data, seq): @@ -1145,14 +1151,11 @@ def recvReqBinaryData(self, packet_id, data, seq): ID: 63030100 JP: バイナリデータ要求 TR: Binary data request - - TODO: Handle multiple versions of a binary """ binary_type, version, offset, size = struct.unpack(">BIII", data) - binary = PAT_BINARIES[binary_type] - content = binary["content"] + content = get_pat_binary_from_version(binary_type, version) if callable(content): - content = content() + content = content(self.server.binary_loader) self.sendAnsBinaryData(version, offset, size, content, seq) def sendAnsBinaryData(self, version, offset, size, binary, seq): @@ -1438,10 +1441,10 @@ def recvReqBinaryVersion(self, packet_id, data, seq): JP: バイナリバージョン確認 TR: Binary version check """ - unk, = struct.unpack(">B", data) - self.sendAnsBinaryVersion(unk, seq) + binary_type, = struct.unpack(">B", data) + self.sendAnsBinaryVersion(binary_type, seq) - def sendAnsBinaryVersion(self, unk, seq): + def sendAnsBinaryVersion(self, binary_type, seq): """AnsBinaryVersion packet. ID: 63010200 @@ -1449,7 +1452,10 @@ def sendAnsBinaryVersion(self, unk, seq): TR: Binary version acknowledgment """ unused = 0 - version = 1 # The game might send binary requests for this version + binary = PAT_BINARIES[binary_type] + version = binary["version"] + if callable(version): + version = version(self.server.binary_loader) data = struct.pack(">BI", unused, version) self.send_packet(PatID4.AnsBinaryVersion, data, seq) diff --git a/mh/quest_utils.py b/mh/quest_utils.py index 66edcc3..c75d25a 100644 --- a/mh/quest_utils.py +++ b/mh/quest_utils.py @@ -10,7 +10,19 @@ from mh.equipment_utils import create_arena_equipment_set -class LocationType: +class Enum(object): + def __getitem__(self, idx): + return getattr(self, idx) + + +class WaveType(Enum): + none = 0 + monster = 1 + item = 2 + unknown = 3 + + +class LocationType(Enum): QUEST_LOCATION_NONE = 0 QUEST_LOCATION_D_ISLAND = 1 QUEST_LOCATION_SANDY_PLAINS = 2 @@ -24,9 +36,27 @@ class LocationType: QUEST_LOCATION_WATER_ARENA_1 = 10 QUEST_LOCATION_SACRED_LAND = 11 QUEST_LOCATION_WATER_ARENA_2 = 12 +LocationType = LocationType() + + +LOCATION_SIZE = { + LocationType.QUEST_LOCATION_NONE: 0, + LocationType.QUEST_LOCATION_D_ISLAND: 13, + LocationType.QUEST_LOCATION_SANDY_PLAINS: 12, + LocationType.QUEST_LOCATION_FLOODED_FOR: 11, + LocationType.QUEST_LOCATION_TUNDRA: 10, + LocationType.QUEST_LOCATION_VOLCANO: 11, + LocationType.QUEST_LOCATION_GRT_DESERT: 3, + LocationType.QUEST_LOCATION_UW_RUIN: 4, + LocationType.QUEST_LOCATION_LAND_ARENA_1: 2, + LocationType.QUEST_LOCATION_LAND_ARENA_2: 2, + LocationType.QUEST_LOCATION_WATER_ARENA_1: 2, + LocationType.QUEST_LOCATION_SACRED_LAND: 2, + LocationType.QUEST_LOCATION_WATER_ARENA_2: 2, +} -class Monster: +class Monster(Enum): none = 0 rathian = 1 rathalos = 2 @@ -62,23 +92,24 @@ class Monster: fish = 32 altaroth = 33 kelbi = 34 - bnahabra1 = 35 - bnahabra2 = 36 - bnahabra3 = 37 - bnahabra4 = 38 - brd_wyv = 39 - fly_wyv = 40 - brt_wyv = 41 - psc_wyv = 42 - levthn = 43 - elddrg = 44 - lynian = 45 - herbvr = 46 - nptron = 47 - fish = 48 - - -class QuestRankType: + bnahabra1 = 35 # Gigginox Egg + bnahabra2 = 36 # Bnahabra (Blue Wing) + bnahabra3 = 37 # Bnahabra (Orange Wing) + bnahabra4 = 38 # Bnahabra (Green Wing) + brd_wyv = 39 # Bnahabra (Red Wing) + fly_wyv = 40 # ---- INVALID AS AN IN-QUEST MONSTER --- + brt_wyv = 41 # ---- INVALID AS AN IN-QUEST MONSTER --- + psc_wyv = 42 # ---- INVALID AS AN IN-QUEST MONSTER --- + levthn = 43 # ---- INVALID AS AN IN-QUEST MONSTER --- + elddrg = 44 # ---- INVALID AS AN IN-QUEST MONSTER --- + lynian = 45 # ---- INVALID AS AN IN-QUEST MONSTER --- + herbvr = 46 # ---- INVALID AS AN IN-QUEST MONSTER --- + nptron = 47 # ---- INVALID AS AN IN-QUEST MONSTER --- + unk = 48 # ---- INVALID AS AN IN-QUEST MONSTER --- +Monster = Monster() + + +class QuestRankType(Enum): none = 0 star_1 = 1 star_2 = 2 @@ -86,9 +117,10 @@ class QuestRankType: star_4 = 4 star_5 = 5 urgent = 6 +QuestRankType = QuestRankType() -class ItemsType: +class ItemsType(Enum): none = 0 barrel_bomb_s = 1 barrel_bomb_l = 2 @@ -836,21 +868,24 @@ class ItemsType: fusillade_jewel = 744 dung_jewel = 745 torchlight_jewel = 746 +ItemsType = ItemsType() -class ResourcesType: +class ResourcesType(Enum): low_rank = 0x0000 high_rank = 0x0001 arena = 0x0002 +ResourcesType = ResourcesType() -class StartingPositionType: +class StartingPositionType(Enum): camp = 0x00 random = 0x01 shrine = 0x02 +StartingPositionType = StartingPositionType() -class QuestRestrictionType: +class QuestRestrictionType(Enum): RESTRICTION_NONE = 0 RESTRICTION_9_JOIN = 1 RESTRICTION_18_JOIN = 2 @@ -878,9 +913,10 @@ class QuestRestrictionType: RESTRICTION_27_JOIN = 24 RESTRICTION_35_JOIN = 25 RESTRICTION_46_JOIN = 26 +QuestRestrictionType = QuestRestrictionType() -def make_monster_quest_type(monster_type, boss_id, enabled, level, +def make_monster_quest_type(monster_type, starting_area, boss_id, spawn_count, level, min, size, max): data = b"" # - id: monster_type @@ -890,14 +926,12 @@ def make_monster_quest_type(monster_type, boss_id, enabled, level, # - id: boss_id # type: u2 - data += struct.pack(">h", boss_id) + data += struct.pack(">B", starting_area) + data += struct.pack(">B", boss_id) - # - id: enabled + # - id: spawn_count # type: u1 - if enabled: - data += struct.pack(">B", 0x01) - else: - data += struct.pack(">B", 0x00) + data += struct.pack(">B", spawn_count) # - id: level # type: u1 @@ -988,7 +1022,13 @@ def make_binary_event_quest(quest_data): 'starting_position': starting_position, 'general_enemy_level': general_enemy_level, 'summon': summon, - 'smallmonster_data_file': smallmonster_data, + 'wave_1_transition_type': wave_1_transition_type, + 'wave_1_transition_target': wave_1_transition_target, + 'wave_1_transition_quantity': wave_1_transition_quantity, + 'wave_2_transition_type': wave_2_transition_type, + 'wave_2_transition_target': wave_2_transition_target, + 'wave_2_transition_quantity': wave_2_transition_quantity, + 'smallmonster_data_file': smallmonster_data (or None), }, """ quest_info = quest_data['quest_info'] @@ -1091,32 +1131,38 @@ def make_binary_event_quest(quest_data): # - id: name # type: str # size: 44 + # offset: 0x0000 data += pad(quest_info['name'].encode("ascii"), 40) # Size 0x28 data += struct.pack(">I", 0x00000000) # - id: quest_id # type: u2 + # offset: 0x002C data += struct.pack(">H", quest_info['quest_id']) # - id: description # type: str # size: 92 + # offset: 0x002E data += pad(quest_info['description'].encode("ascii"), 80) data += b'\0' * 0xC # Padding # - id: quest_rank # type: u1 # enum: QuestRankType + # offset: 0x008A data += struct.pack(">B", quest_info['quest_rank']) # - id: location # type: u1 # enum: LocationType + # offset: 0x008B data += struct.pack(">B", quest_info['location']) # Offset 0x8C # - id: sub_quest_1_title # type: str # size: 41 + # offset: 0x008C data += pad( objective_details['subquest_1']['description'].encode("ascii"), 0x29 @@ -1125,6 +1171,7 @@ def make_binary_event_quest(quest_data): # - id: sub_quest_2_title # type: str # size: 41 + # offset: 0x00B5 data += pad( objective_details['subquest_2']['description'].encode("ascii"), 0x29 @@ -1133,46 +1180,56 @@ def make_binary_event_quest(quest_data): # - id: sucess_message # type: str # size: 92 + # offset: 0x00DE data += pad(quest_info['success_message'].encode("ascii"), 0x5C) # - id: time_limit # type: u2 - data += struct.pack(">h", quest_info['time_limit']) # Offset 0x13A + # offset: 0x013A + data += struct.pack(">h", quest_info['time_limit']) # - id: failure_message # type: str # size: 92 # Presently hardcoded + # offset: 0x013C data += pad(b"Reward hits 0, or time\nexpires.", 0x5C) # - id: hunter_rank_point_restriction # type: u2 + # offset: 0x0198 data += struct.pack(">h", quest_info['hrp_restriction']) # - id: client # type: str # size: 41 + # offset: 0x019A data += pad(quest_info['client'].encode("ascii"), 0x29) # - id: unk2 # size: 6 + # offset: 0x01C3 data += b'\0' * 0x06 # - id: details # type: str # size: 256 + # offset: 0x01C9 data += pad(quest_info['details'].encode("ascii"), 0x100) # b'\0' * 0x100 # - id: unk1 # size: 61 + # offset: 0x02C9 data += b'\0' * 0x3D # - id: minion_unsure # size: 3 + # offset: 0x0306 data += b'\0' * 0x03 # - id: quest_flags_unsure # size: 3 + # offset: 0x0309 data += b'\0' * 0x03 # - id: monster_1 @@ -1189,22 +1246,25 @@ def make_binary_event_quest(quest_data): # - id: unk3 # size: 2 + # offset: 0x030E data += b'\0' * 0x02 # Padding # - id: flags # type: u4 - data += struct.pack(">I", quest_info['flags']) # Offset 0x310 + # offset: 0x0310 + data += struct.pack(">I", generate_flags(*(quest_info['flags']))) # Offset 0x310 # - id: monsters # type: monster_quest_type # repeat: expr # repeat-expr: 3 - + # # offset: 0x0314 if monster_1['type'] != 0: data += make_monster_quest_type( monster_type=monster_1['type'], + starting_area=monster_1['starting_area'], boss_id=monster_1['boss_id'], - enabled=monster_1['enabled'], + spawn_count=monster_1['spawn_count'], level=monster_1['level'], min=monster_1['hp_spread'], size=monster_1['size'], @@ -1213,11 +1273,13 @@ def make_binary_event_quest(quest_data): else: data += b'\0' * 0x08 + # offset: 0x031C if monster_2['type'] != 0: data += make_monster_quest_type( monster_type=monster_2['type'], + starting_area=monster_2['starting_area'], boss_id=monster_2['boss_id'], - enabled=monster_2['enabled'], + spawn_count=monster_2['spawn_count'], level=monster_2['level'], min=monster_2['hp_spread'], size=monster_2['size'], @@ -1226,11 +1288,13 @@ def make_binary_event_quest(quest_data): else: data += b'\0' * 0x08 + # offset: 0x0324 if monster_3['type'] != 0: data += make_monster_quest_type( monster_type=monster_3['type'], + starting_area=monster_3['starting_area'], boss_id=monster_3['boss_id'], - enabled=monster_3['enabled'], + spawn_count=monster_3['spawn_count'], level=monster_3['level'], min=monster_3['hp_spread'], size=monster_3['size'], @@ -1242,6 +1306,7 @@ def make_binary_event_quest(quest_data): # SUMMON / (INVADER?) # - id: unk5 # type: u4 + # offset: 0x032C data += struct.pack(">I", quest_info['summon']) # - id: quests_properties @@ -1274,12 +1339,14 @@ def make_binary_event_quest(quest_data): # quest_objectivetype=0x000c, # quest_objectivecount=0x0003 + # offset: 0x0330 data += make_quest_properties_type( main_quest['type'], main_quest['objective_type'], main_quest['objective_num'] ) + # offset: 0x0338 if subquest_1['type'] is not None: data += make_quest_properties_type( subquest_1['type'], @@ -1289,6 +1356,7 @@ def make_binary_event_quest(quest_data): else: data += b"\0" * 0x08 + # offset: 0x0340 if subquest_2['type'] is not None: data += make_quest_properties_type( subquest_2['type'], @@ -1300,116 +1368,162 @@ def make_binary_event_quest(quest_data): # - id: contract_fee # type: u4 - data += struct.pack(">I", quest_info['quest_fee']) # Offset 0x348 + # offset: 0x0348 + data += struct.pack(">I", quest_info['quest_fee']) # - id: main_objective_reward # type: u4 + # offset: 0x034C data += struct.pack(">I", main_quest['zenny_reward']) # - id: sub_objective_a_reward # type: u4 + # offset: 0x0350 data += struct.pack(">I", subquest_1['zenny_reward']) # - id: sub_objective_b_reward # type: u4 + # offset: 0x0354 data += struct.pack(">I", subquest_2['zenny_reward']) # - id: death_reduction # type: u4 + # offset: 0x0358 data += struct.pack(">I", quest_info['penalty_per_cart']) # - id: hunter_rank_points # type: u4 + # offset: 0x035C data += struct.pack(">I", main_quest['hrp_reward']) # - id: unk7 # type: u4 # 0x0000000f for the great jaggi quest/(all quests?) + # offset: 0x0360 data += struct.pack(">I", 0x0000000f) # - id: unk8 # type: u1 + # offset: 0x0364 data += b'\0' * 0x01 # - id: gather_rank (wrong) # type: u1 + # offset: 0x0365 data += b'\0' * 0x01 # - id: unk9 # type: u1 + # offset: 0x0366 data += b'\0' * 0x01 # - id: unk10 # type: u1 + # offset: 0x0367 data += struct.pack(">B", subquest_1['hrp_reward']) # - id: supply_set (wrong) # type: u4 + # offset: 0x0368 data += struct.pack(">I", subquest_2['hrp_reward']) # - id: Unknown 4 # type: u1 + # offset: 0x036C data += struct.pack(">B", unknown['unk_4']) # - id: supply_type (0x00: low rank, 0x01: high rank, 0x02: arena) # type: u1 + # offset: 0x036D data += struct.pack(">B", quest_info['resources']) # - id: unk11 # size: 2 # type: u1 + # offset: 0x036E data += struct.pack(">B", unknown['unk_5']) # type: u1 + # offset: 0x036F data += struct.pack(">B", unknown['unk_6']) - # - id: start_pos (SUPPLY SET NUMBER) + # - id: supply_set_number # type: u4 # 0x00000011 for the great jaggi quest + # offset: 0x0370 data += struct.pack(">I", quest_info['supply_set_number']) # - id: unk12 # type: u4 + # offset: 0x0374 data += struct.pack(">I", unknown['unk_7']) # - id: unk13 # type: u2 + # offset: 0x0378 data += b'\0' * 0x02 # - id: type_flag (STARTING POSITION, 0x0000: basecamp, # 0x0001:random, 0x0002: shrine) # type: u2 + # offset: 0x037A data += struct.pack(">h", quest_info['starting_position']) # UNK + # offset: 0x037C data += b'\0' * 0x02 - # - id: type_code + # - id: small_monster_data_location # type: u2 + # offset: 0x037E data += struct.pack(">h", 0x04b8) # - id: type_amount # type: u2 + # offset: 0x0380 data += b'\0' * 0x02 # - id: general_enemy_level # type: u2 + # offset: 0x0382 data += struct.pack(">h", quest_info['general_enemy_level']) - # - id: unk14 - # type: u4 - data += struct.pack(">I", unknown['unk_9']) + # - id: wave_1_transition_type + # type: u2 + # offset: 0x0384 + data += struct.pack(">h", quest_info['wave_1_transition_type']) + + # - id: wave_1_transition_target + # type: u2 + # offset: 0x0386 + data += struct.pack(">h", quest_info['wave_1_transition_target']) + + # - id: wave_1_transition_quantity + # type: u2 + # offset: 0x0388 + data += struct.pack(">h", quest_info['wave_1_transition_quantity']) + + # - id: wave_2_transition_type + # type: u2 + # offset: 0x038A + data += struct.pack(">h", quest_info['wave_2_transition_type']) + + # - id: wave_2_transition_target + # type: u2 + # offset: 0x038C + data += struct.pack(">h", quest_info['wave_2_transition_target']) + + # - id: wave_2_transition_quantity + # type: u2 + # offset: 0x038E + data += struct.pack(">h", quest_info['wave_2_transition_quantity']) - # - id: unk15 - # type: u4 - data += struct.pack(">I", unknown['unk_10']) - # - id: unk16 - # size: 16 - data += struct.pack(">I", unknown['unk_11']) # Unknown 12 (0x00000002 for large monster hunting quests, # 0x00000003 for small monster & gathering quests, # 0x00000005 for Jhen & Alatreon) + # offset: 0x0390 data += struct.pack(">I", unknown['unk_12']) + # offset: 0x0394 data += make_quest_properties_type(main_quest['type'], main_quest['objective_type'], main_quest['objective_num']) @@ -1418,15 +1532,18 @@ def make_binary_event_quest(quest_data): # type: reward_type # repeat: expr # repeat-expr: 11 + # offset: 0x039C data += generate_rewards(main_quest['rewards_row_1']) # - id: main_objective_additional_rewards # type: reward_type # repeat: expr # repeat-expr: 11 + # offset: 0x03C8 data += generate_rewards(main_quest['rewards_row_2']) # SUBQUEST 1 REWARDS + # offset: 0x03F4 if subquest_1['type'] is not None: data += make_quest_properties_type(subquest_1['type'], subquest_1['objective_type'], @@ -1435,9 +1552,11 @@ def make_binary_event_quest(quest_data): else: data += b"\0" * 0x08 data += b'\0' * (4 * 11) + # offset: 0x0428 data += b'\0' * (4 * 11) # SUBQUEST 2 REWARDS + # offset: 0x0454 if subquest_2['type'] is not None: data += make_quest_properties_type(subquest_2['type'], subquest_2['objective_type'], @@ -1446,6 +1565,7 @@ def make_binary_event_quest(quest_data): else: data += b"\0" * 0x08 data += b'\0' * (4 * 11) + # offset: 0x0488 data += b'\0' * (4 * 11) assert len(data) == 0x4B4 @@ -1454,13 +1574,90 @@ def make_binary_event_quest(quest_data): # that describes how many bytes total the quest takes up before the # optional arena equipment data tail = 0x4B4 + 4 - sm_data = read_quest_sm_data(quest_info['smallmonster_data_file']) - if sm_data is not None: - tail += len(sm_data) - 4 - data += struct.pack(">I", tail) - data += sm_data[4:] + if 'smallmonster_data_file' in quest_info: + # Read small monster data from hex string file + sm_data = read_quest_sm_data(quest_info['smallmonster_data_file']) + if sm_data is not None: + tail += len(sm_data) - 4 + data += struct.pack(">I", tail) + data += sm_data[4:] + else: + data += struct.pack(">I", tail) else: + # Create new small monster data from parameters + """ + 'small_monsters': [ + [ + { + 'type': monsterType, + 'variant': variant, + 'room': room, + 'quantity': quantity, + 'unk1': unk1, + 'pos_x': pos_x, + 'pos_y': pos_y, + 'pos_z': pos_z, + 'rot_x': rot_x, + 'rot_y': rot_y, + 'rot_z': rot_z, + 'unk2': unk2, # Usually 0xFF + } + ] * number of waves * number of areas + ] + """ + sm_data = b"" + small_monsters = quest_data['small_monsters'] + location_size = LOCATION_SIZE[quest_info['location']] + assert len(small_monsters) % location_size == 0 + num_waves = int(len(small_monsters) / location_size) + assert num_waves <= 3 + # Pre-preamble: Establishing the locations of each of the waves' preambles + sm_data += struct.pack('>I', 0x0000000C) + sm_data += struct.pack('>I', 0x0000000C + 8*location_size) + if num_waves < 3: + sm_data += struct.pack('>I', 0xCCCCCCCC) + else: + sm_data += struct.pack('>I', 0x0000000C + 2*8*location_size) + + monster_data = b"" + # Preamble: Establishing the location and length of each of the + # small monster areas + current_sm_index = 0x0C + 8*len(small_monsters) + for entry, monster_list in enumerate(quest_data['small_monsters']): + sm_data += struct.pack(">I", current_sm_index) + area = entry % location_size + area_monster_data = b"" + for monster in monster_list: + assert monster['room'] == area + new_monster_data = b"" + new_monster_data += struct.pack(">I", monster['type']) + new_monster_data += 3* b"\0" + new_monster_data += struct.pack(">b", monster['quantity']) + new_monster_data += struct.pack(">B", monster['unk2']) + new_monster_data += struct.pack(">B", monster['room']) + new_monster_data += struct.pack(">B", monster['unk1']) + new_monster_data += struct.pack(">B", monster['variant']) + new_monster_data += struct.pack(">I", 0x00000000) + new_monster_data += struct.pack(">f", monster['pos_x']) + new_monster_data += struct.pack(">f", monster['pos_y']) + new_monster_data += struct.pack(">f", monster['pos_z']) + new_monster_data += struct.pack('>i', int(180.05 * monster['rot_x'])) + new_monster_data += struct.pack('>i', int(180.05 * monster['rot_y'])) + new_monster_data += struct.pack('>i', int(180.05 * monster['rot_z'])) + new_monster_data += struct.pack('>I', 0xFF000000) + new_monster_data += struct.pack('>I', 0x00000000) + assert len(new_monster_data) == 0x30 + + area_monster_data += new_monster_data + area_monster_data += 0x30 * '\0' + sm_data += struct.pack(">I", len(area_monster_data)) + current_sm_index += len(area_monster_data) + monster_data += area_monster_data + # Main small monster data + sm_data += monster_data + tail += len(sm_data) data += struct.pack(">I", tail) + data += sm_data # If there is arena equipment data, add it to the end of the quest binary if 'arena_equipment' in quest_data: @@ -1474,44 +1671,44 @@ def make_binary_event_quest(quest_data): # FLAGS INFO: # (Arena quests have bytes in "QUEST_FLAG_ARENA = 0b10000" set) # byte 1: Boss Order 1 ( -# +1: Unknown1 -# +2: All At Once(CombineSubquestsRequireMQAndFirstSubquest) -# +4: Marathon (CombineSubquestsRequireMQAndBothSubquests) -# +8: Unknown4 -# +16: Unknown5 -# +32: Unknown6 -# +64: Unknown7 -# +128: CombineMainAndSubquests +# +0x1000000: Unknown1 +# +0x2000000: All At Once(CombineSubquestsRequireMQAndFirstSubquest) +# +0x4000000: Marathon (CombineSubquestsRequireMQAndBothSubquests) +# +0x8000000: Unknown4 +# +0x10000000: Unknown5 +# +0x20000000: Unknown6 +# +0x40000000: Unknown7 +# +0x80000000: CombineMainAndSubquests # ) # byte 2: Boss Order 2 ( -# +1: Unknown1 -# +2: Unknown2 -# +4: RequireMQAndBothSubquests -# +8: Unknown4 -# +16: QualifyingTime -# +32: DontAnnounceSubquestCompletion -# +64: Unknown7 -# +128: ElderDragonLeftWounded +# +0x10000: Unknown1 +# +0x20000: Unknown2 +# +0x40000: RequireMQAndBothSubquests +# +0x80000: Unknown4 +# +0x100000: QualifyingTime +# +0x200000: DontAnnounceSubquestCompletion +# +0x400000: Unknown7 +# +0x800000: ElderDragonLeftWounded # ) # byte 3: Boss Order 3 ( -# +1: 2Mon_NoSubs_ReqSub1_Unstable -# +2: Unknown2 -# +4: Unknown3 -# +8: BanjoMusic -# +16: Unknown5 -# +32: Unknown6 -# +64: Unknown7 -# +128: Unknown8 +# +0x100(256): 2Mon_NoSubs_ReqSub1_Unstable +# +0x200(512): Unknown2 +# +0x400(1024): Unknown3 +# +0x800(2048): BanjoMusic +# +0x1000(4096): Unknown5 +# +0x2000(8192): Unknown6 +# +0x4000(16384): Unknown7 +# +0x8000(32768): Unknown8 # ) # byte 4: Quest Flags ( # +1: Slay # +2: Deliver # +4: Capture # +8: Defend -# +16: ArenaQuest -# +32: Unknown2 -# +64: Repel(EndAtMainQuest) -# +128: Unknown3 +# +0x10(16): ArenaQuest +# +0x20(32): Unknown2 +# +0x40(64): Repel(EndAtMainQuest) +# +0x80(128): Unknown3 # ) def generate_flags(byte1, byte2, byte3, byte4): res = 0x00000000 @@ -1548,921 +1745,75 @@ def read_quest_sm_data(fname): return bytearray.fromhex(data.replace(" ", "").replace("\n", "")) -""" -EVENT QUEST 1: Jump Four Jaggi -(INCOMPLETE) Only 3 jaggi spawn, and all at once instead of sequentially. -Quest description/rewards/etc from https://www.youtube.com/watch?v=qyQt2Xmpt0g -Quest requirements altered to make it possible to win. -""" -QUEST_EVENT_JUMP_FOUR_JAGGI = { - 'quest_info': { - 'quest_id': 61001, - 'name': "Jump Three Jaggi", - 'client': "Guild Subcontractor", - 'description': "Hunt 3 Great Jaggi", - 'details': - "I'm gonna get so fired for\n" - "this... The Great Jaggi some\n" - "hunter brought in just\n" - "escaped. Mind going after\n" - "them? You better hurry,\n" - "though. Bet they've got some\n" - "incredible materials, too.", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 1, 0, 0, 0, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 1, 0, 0, 0, 1, 1) - ), - 'penalty_per_cart': 1400, - 'quest_fee': 400, - 'time_limit': 50, - 'main_monster_1': Monster.bnahabra2, - 'main_monster_2': Monster.melynx, - 'location': LocationType.QUEST_LOCATION_SANDY_PLAINS, - 'quest_rank': QuestRankType.star_1, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, - 'resources': ResourcesType.low_rank, - 'supply_set_number': 19, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x0017, - 'summon': 0x64050219, - 'smallmonster_data_file': 'sm_jumpfourjaggi.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.great_jaggi, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_2': { - 'type': Monster.great_jaggi, - 'boss_id': 0x0001, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_3': { - 'type': Monster.great_jaggi, - 'boss_id': 0x0002, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000001, - 'objective_type': Monster.great_jaggi, - 'objective_num': 0x03, - 'zenny_reward': 4000, - 'hrp_reward': 440, - 'rewards_row_1': [ - (ItemsType.great_jagi_claw, 1, 3), - (ItemsType.great_jagi_hide, 1, 12), - (ItemsType.jagi_scale, 1, 10), - (ItemsType.screamer, 1, 20), - (ItemsType.kings_frill, 1, 12), - (ItemsType.bone_husk_s, 8, 18), - (ItemsType.great_jagi_head, 1, 25) - ], - 'rewards_row_2': [ - (ItemsType.mystery_charm, 1, 1), - (ItemsType.aquaglow_jewel, 1, 1), - (ItemsType.shining_charm, 1, 1), - (ItemsType.armor_sphere, 1, 1), - (ItemsType.armor_sphere_plus, 1, 1) - ], - }, - 'subquest_1': { - 'description': "Hunt 2 Great Jaggi", - 'type': 0x00000001, - 'objective_type': Monster.great_jaggi, - 'objective_num': 0x02, - 'zenny_reward': 4000, - 'hrp_reward': 220, - 'rewards_row_1': [ - (ItemsType.great_jagi_claw, 1, 1), - (ItemsType.great_jagi_hide, 1, 1), - (ItemsType.jagi_scale, 1, 1), - (ItemsType.screamer, 1, 1), - (ItemsType.kings_frill, 1, 1), - (ItemsType.bone_husk_s, 8, 1), - (ItemsType.great_jagi_head, 1, 1) - ], - }, - 'subquest_2': { - 'description': "None", - 'type': 0, - 'objective_type': Monster.none, - 'objective_num': 0, - 'zenny_reward': 0, - 'hrp_reward': 0, - 'rewards_row_1': [], - } - }, - 'unknown': { - # (2 for large mon quest, 3 for small/delivery, 5 for jhen/ala) - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x0002018B, - 'unk_10': 0x00010000, - 'unk_11': 0x00000000, - } -} - -""" -EVENT QUEST 7: The Phantom Uragaan -Quest description from https://www.youtube.com/watch?v=Py5PkCXhf6w -""" -QUEST_EVENT_THE_PHANTOM_URAGAAN = { - 'quest_info': { - 'quest_id': 61007, - 'name': "The Phantom Uragaan", - 'client': "Spoiled Princess", - 'description': "Hunt an Uragaan", - 'details': - "Oooh, I just heard they've\n" - "spotted the cutest, tiniest,\n" - "most adorable little Uragaan\n" - "on the Volcano. Hunt me one\n" - "this instant or I will get\n" - "very angry. And if I'm angry,\n" - "Daddy's angry. Now go!", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 1, 0, 0, 0, 0, 0, 0), - (0, 0, 0, 1, 0, 0, 0, 0), - (1, 0, 1, 0, 0, 0, 1, 1) - ), - 'penalty_per_cart': 3000, - 'quest_fee': 850, - 'time_limit': 50, - 'main_monster_1': Monster.uroktor, - 'main_monster_2': Monster.aptonoth, - 'location': LocationType.QUEST_LOCATION_VOLCANO, - 'quest_rank': QuestRankType.star_3, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_18_INITJOIN, - 'resources': ResourcesType.low_rank, - 'supply_set_number': 15, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x1D, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_phantomuragaan.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.uragaan, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x1D, # 0x01 through 0x3c - 'size': 0x13, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000001, - 'objective_type': Monster.uragaan, - 'objective_num': 0x01, - 'zenny_reward': 8800, - 'hrp_reward': 1100, - 'rewards_row_1': [ - (ItemsType.mystery_charm, 1, 1), - (ItemsType.uragaan_shell, 1, 16), - (ItemsType.uragaan_scale, 1, 20), - (ItemsType.uragaan_marrow, 1, 10), - (ItemsType.monster_bone_l, 1, 10), - (ItemsType.bone_husk_l, 15, 13), - (ItemsType.shining_charm, 1, 5), - (ItemsType.rustshard, 1, 25) - ], - 'rewards_row_2': [ - (ItemsType.mystery_charm, 1, 1), - (ItemsType.uragaan_shell, 1, 16), - (ItemsType.uragaan_scale, 1, 20), - (ItemsType.uragaan_marrow, 1, 10), - (ItemsType.monster_bone_l, 1, 10), - (ItemsType.bone_husk_l, 15, 13), - (ItemsType.shining_charm, 1, 5), - (ItemsType.rustshard, 1, 25) - ], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - } -} - -""" -EVENT QUEST 8: Blood Sport -Quest description from https://www.youtube.com/watch?v=tuRSdC_mlO4 -""" -QUEST_EVENT_BLOOD_SPORT = { - 'quest_info': { - 'quest_id': 61008, - 'name': "Blood Sport", - 'client': "Spoiled Princess", - 'description': - "Hunt an Uragaan\n" - "and a Diablos", - 'details': - "Oh, boo! I'm tired of watching\n" - "run-of-the-mill hunts. The\n" - "Diablos and the Uragaan are\n" - "supposed to be the ultimate\n" - "monster duo. I'd love to watch\n" - "them maim some foolish hunter!\n" - "Do put on a good show...", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 1, 0, 0, 0, 0, 0, 0), - (1, 1, 0, 0, 0, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 1, 0, 0, 0, 0, 0) - ), - 'penalty_per_cart': 6000, - 'quest_fee': 1750, - 'time_limit': 50, - 'main_monster_1': Monster.uragaan, - 'main_monster_2': Monster.diablos, - 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, - 'quest_rank': QuestRankType.star_3, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_18_INITJOIN, - 'resources': ResourcesType.low_rank, - 'supply_set_number': 43, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x001D, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_bloodsport.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.uragaan, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x1D, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_2': { - 'type': Monster.diablos, - 'boss_id': 0x0001, - 'enabled': True, - 'level': 0x1D, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000001, - 'objective_type': Monster.uragaan, - 'objective_num': 0x01, - 'zenny_reward': 17600, - 'hrp_reward': 1760, - 'rewards_row_1': [ - (ItemsType.uragaan_scale, 1, 1), - (ItemsType.diablos_ridge, 1, 14), - (ItemsType.uragaan_shell, 1, 10), - (ItemsType.diablos_shell, 1, 20), - (ItemsType.twisted_horn, 1, 12), - (ItemsType.diablos_marrow, 8, 9), - (ItemsType.uragaan_marrow, 1, 9), - (ItemsType.incomplete_plans, 1, 25) - ], - 'rewards_row_2': [ - (ItemsType.uragaan_scale, 1, 1), - (ItemsType.diablos_ridge, 1, 14), - (ItemsType.uragaan_shell, 1, 10), - (ItemsType.diablos_shell, 1, 20), - (ItemsType.twisted_horn, 1, 12), - (ItemsType.diablos_marrow, 1, 9), - (ItemsType.uragaan_marrow, 1, 9), - (ItemsType.incomplete_plans, 1, 25) - ], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000001, - 'objective_type': Monster.diablos, - 'objective_num': 0x01, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0, - 'objective_type': Monster.none, - 'objective_num': 0, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00010000, - 'unk_11': 0x00000000, - } -} +def make_event_slot(event): + return (make_binary_event_quest(event), event) -""" -EVENT QUEST 2: Mercy Mission -(INCOMPLETE) Invading monster is "faked" by hardcoding a Royal Ludroth -from the start. -""" -QUEST_EVENT_MERCY_MISSION = { - 'quest_info': { - 'quest_id': 61002, - 'name': "Mercy Mission", - 'client': "MH3SP Dev Team", - 'description': "Deliver 10 Monster Guts", - 'details': - "Wanted:\n" - "The description for this\n" - "quest! If you can find\n" - "it, please let us know!\n" - "Thanks!", - 'success_message': - "Complete the Main Quest\n" - "and both Subquests.", - 'flags': generate_flags( - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 1, 1, 0, 0, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (0, 1, 0, 0, 0, 0, 0, 0) - ), - 'penalty_per_cart': 600, - 'quest_fee': 150, - 'time_limit': 15, - 'main_monster_1': Monster.ludroth, - 'main_monster_2': Monster.epioth, - 'location': LocationType.QUEST_LOCATION_D_ISLAND, - 'quest_rank': QuestRankType.star_1, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_NONE, - 'resources': ResourcesType.low_rank, - 'supply_set_number': 35, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x0017, - 'summon': 0x64030303, - 'smallmonster_data_file': 'sm_mercymission.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.royal_ludroth, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x17, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x01, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_2': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000002, - 'objective_type': ItemsType.monster_guts, - 'objective_num': 0x0A, - 'zenny_reward': 1500, - 'hrp_reward': 70, - 'rewards_row_1': [ - (ItemsType.mystery_charm, 1, 8), - (ItemsType.black_pearl, 1, 20), - (ItemsType.honey, 2, 20), - (ItemsType.armor_sphere, 1, 18), - (ItemsType.small_goldenfish, 1, 8), - (ItemsType.machalite_ore, 8, 14), - (ItemsType.steel_eg, 1, 12) - ], - 'rewards_row_2': [ - (ItemsType.mystery_charm, 1, 35), - (ItemsType.aquaglow_jewel, 1, 5), - (ItemsType.shining_charm, 1, 15), - (ItemsType.armor_sphere, 1, 20), - (ItemsType.armor_sphere_plus, 1, 25) - ], - }, - 'subquest_1': { - 'description': "Deliver 12 Red Coral Stones", - 'type': 0x00000002, - 'objective_type': ItemsType.red_coral_stone, - 'objective_num': 0x0C, - 'zenny_reward': 1200, - 'hrp_reward': 55, - 'rewards_row_1': [ - (ItemsType.mystery_charm, 1, 8), - (ItemsType.black_pearl, 1, 20), - (ItemsType.honey, 2, 20), - (ItemsType.armor_sphere, 1, 18), - (ItemsType.small_goldenfish, 1, 8), - (ItemsType.machalite_ore, 1, 14), - (ItemsType.steel_eg, 1, 12) - ], - }, - 'subquest_2': { - 'description': "Deliver 3 Goldenfish", - 'type': 0x00000002, - 'objective_type': ItemsType.goldenfish, - 'objective_num': 0x03, - 'zenny_reward': 2000, - 'hrp_reward': 70, - 'rewards_row_1': [ - (ItemsType.mystery_charm, 1, 35), - (ItemsType.aquaglow_jewel, 1, 5), - (ItemsType.shining_charm, 1, 15), - (ItemsType.armor_sphere, 1, 20), - (ItemsType.armor_sphere_plus, 1, 25) - ], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000003, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00010000, - 'unk_11': 0x00000000, - } -} -""" -EVENT QUEST 20: World Eater -Quest description/rewards/etc from https://www.youtube.com/watch?v=Z6joazT8J78 -(INCOMPLETE) Needs invading queropeco -""" -QUEST_EVENT_WORLD_EATER = { - 'quest_info': { - 'quest_id': 61020, - 'name': "World Eater", - 'client': "Guildmaster", - 'description': "Hunt a Deviljho", - 'details': - "Emergency! A huge Deviljho has\n" - "appeared. It's twice as big as\n" - "a normal one and it's eating\n" - "everything in sight! Go get\n" - "it! And now, a haiku: A huge\n" - "Deviljho/with no food in its\n" - "stomach/eats the whole island.", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 1, 0, 0, 0, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 1, 0, 0, 0, 1, 1) - ), - 'penalty_per_cart': 6000, - 'quest_fee': 1800, - 'time_limit': 50, - 'main_monster_1': Monster.jaggi, - 'main_monster_2': Monster.jaggia, - 'location': LocationType.QUEST_LOCATION_D_ISLAND, - 'quest_rank': QuestRankType.urgent, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_51_INITJOIN, - 'resources': ResourcesType.high_rank, - 'supply_set_number': 31, - 'starting_position': StartingPositionType.random, - 'general_enemy_level': 0x0040, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_worldeater.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.deviljho, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x40, # 0x01 through 0x3c - 'size': 0xC8, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000001, - 'objective_type': Monster.deviljho, - 'objective_num': 0x01, - 'zenny_reward': 18000, - 'hrp_reward': 1800, - 'rewards_row_1': [ - (ItemsType.timeworn_charm, 1, 33), - (ItemsType.deviljho_gem, 1, 4), - (ItemsType.deviljho_scalp, 1, 8), - (ItemsType.deviljho_hide, 1, 17), - (ItemsType.hvy_armor_sphere, 1, 11), - (ItemsType.shining_charm, 1, 19), - (ItemsType.deviljho_fang, 1, 8) - ], - 'rewards_row_2': [ - (ItemsType.deviljho_scalp, 1, 20), - (ItemsType.timeworn_charm, 1, 34), - (ItemsType.deviljho_fang, 1, 6), - (ItemsType.deviljho_hide, 1, 17), - (ItemsType.deviljho_gem, 1, 3), - (ItemsType.shining_charm, 1, 11), - (ItemsType.hvy_armor_sphere, 1, 9) - ], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - } -} +def byteify(input): + if isinstance(input, dict): + return {byteify(key): byteify(value) + for key, value in input.iteritems()} + elif isinstance(input, list): + return [byteify(element) for element in input] + elif isinstance(input, unicode): + return input.encode('utf-8') + else: + return input + + +def is_arena_quest(flags): + return ((1 * 2**4) * 16**0) & flags > 0 + + +class QuestLoader: + def __init__(self, file_loc='event/quest_rotation.json'): + self.version = 0 + self.version_incrementer = 28 + self.file_loc = file_loc + self.load_quests() + self.version = 0 + + def load_quests(self): + import json + self.version += self.version_incrementer + quest_list = [] + with open(self.file_loc, 'r') as f: + quests_json = byteify(json.load(f)) + for day in quests_json: + curr_quest_list = [] + for quest_file in day: + with open(quest_file, 'r') as ff: + curr_quest = byteify(json.load(ff)) + curr_quest = make_event_slot(curr_quest) + curr_quest_list.append(curr_quest) + quest_list.append(curr_quest_list) + self.quests = quest_list + + def get_quest_dicts(self, idx): + # Get quest dicts for the day + true_idx = idx - 1 + return [quest[1] for _, quest in enumerate(self.quests[true_idx])] + + def get_separated_quest_dicts(self, idx): + # Get quest dicts for the day separated by event and arena + quest_list = [] + arena_list = [] + for quest in self.get_quest_dicts(idx): + if quest is None: + continue + if is_arena_quest(generate_flags(*(quest['quest_info']['flags']))): + arena_list.append(quest) + else: + quest_list.append(quest) + return quest_list, arena_list + + def __len__(self): + # Get number of days + return len(self.quests) + + def __getitem__(self, idx): + # Get quests for the day + true_idx = idx - self.version - 1 + return [quest[0] for _, quest in enumerate(self.quests[true_idx])] -""" -EVENT QUEST 20: Where Gods Fear To Tread -Quest description from https://www.youtube.com/watch?v=mQHTdPRlD1w, - thanks to "soulmizute, emperor of the abyss#5094" - and "El Matiah#8904" -""" -QUEST_EVENT_WHERE_GODS_FEAR_TO_TREAD = { - 'quest_info': { - 'quest_id': 61021, - 'name': "Where Gods Fear to Tread", - 'client': "Scarlet Mystery Man", - 'description': "Slay the Alatreon", - 'details': - "I've been waiting, hunter. Now\n" - "comes your final challenge:\n" - "Alatreon, a dragon of darkness\n" - "and light. Can mere mortals\n" - "fell an elder dragon feared\n" - "even by the gods? Don't even\n" - "bother saying your prayers...", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 1, 0, 0, 0, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 0, 0, 0, 0, 1, 0) - ), - 'penalty_per_cart': 14000, - 'quest_fee': 4200, - 'time_limit': 50, - 'main_monster_1': Monster.none, - 'main_monster_2': Monster.none, - 'location': LocationType.QUEST_LOCATION_SACRED_LAND, - 'quest_rank': QuestRankType.urgent, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_51_INITJOIN, - 'resources': ResourcesType.high_rank, - 'supply_set_number': 0, - 'starting_position': StartingPositionType.shrine, - 'general_enemy_level': 0x0040, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_wheregodsfeartotread.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.alatreon, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x40, # 0x01 through 0x3c - 'size': 0x7D, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_2': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0000, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000101, - 'objective_type': Monster.alatreon, - 'objective_num': 0x01, - 'zenny_reward': 42000, - 'hrp_reward': 4200, - 'rewards_row_1': [ - (ItemsType.alatreon_scute, 1, 40), - (ItemsType.brkn_skypiercer, 1, 30), - (ItemsType.alatreon_talon, 1, 10), - (ItemsType.alatreon_plate, 1, 10), - (ItemsType.skypiercer, 1, 5), - (ItemsType.azure_dragongem, 1, 5) - ], - 'rewards_row_2': [ - (ItemsType.alatreon_plate, 1, 11), - (ItemsType.brkn_skypiercer, 1, 34), - (ItemsType.alatreon_talon, 1, 39), - (ItemsType.elderdragonblood, 1, 6), - (ItemsType.skypiercer, 1, 5), - (ItemsType.azure_dragongem, 1, 5) - ], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0x00000000, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000005, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - } -} -QUEST_EVENT_GREEN_EGGS = { - 'quest_info': { - 'quest_id': 61050, - 'name': "[MH3SP] Green Eggs and...", - 'client': "Ze SpyRo", - 'description': - "Hunt a Gigginox\n" - "and an Agnaktor", - 'details': - "Why do we live, only to suffer?\n" - "Only slayers of pig meat know\n" - "these things. Take care, Hunter,\n" - "for those who look to antidote\n" - "herbs may find their breath\n" - "stolen away.", - 'success_message': "Complete the Main Quest.", - 'flags': generate_flags( - (0, 1, 0, 0, 0, 0, 0, 0), - (1, 1, 0, 0, 0, 0, 0, 0), - (0, 0, 0, 0, 0, 0, 0, 0), - (1, 0, 1, 0, 0, 0, 0, 0) - ), - 'penalty_per_cart': 2400, - 'quest_fee': 200, - 'time_limit': 50, - 'main_monster_1': Monster.gigginox, - 'main_monster_2': Monster.agnaktor, - 'location': LocationType.QUEST_LOCATION_LAND_ARENA_1, - 'quest_rank': QuestRankType.star_3, - 'hrp_restriction': QuestRestrictionType.RESTRICTION_18_INITJOIN, - 'resources': ResourcesType.low_rank, - 'supply_set_number': 43, - 'starting_position': StartingPositionType.camp, - 'general_enemy_level': 0x001B, - 'summon': 0x00000000, - 'smallmonster_data_file': 'sm_emptylandarena.dat', - }, - 'large_monsters': { - 'monster_1': { - 'type': Monster.gigginox, - 'boss_id': 0x0000, - 'enabled': True, - 'level': 0x1B, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_2': { - 'type': Monster.agnaktor, - 'boss_id': 0x0001, - 'enabled': True, - 'level': 0x1B, # 0x01 through 0x3c - 'size': 0x64, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x03 - }, - 'monster_3': { - 'type': Monster.none, - 'boss_id': 0x0002, - 'enabled': False, - 'level': 0x00, # 0x01 through 0x3c - 'size': 0x00, - 'hp_spread': 0x00, # 0: fixed, 1: spread of 5, 2: spread of 3 - 'size_spread': 0x00 - } - }, - 'objective_details': { - 'main_quest': { - 'type': 0x00000001, - 'objective_type': Monster.gigginox, - 'objective_num': 0x01, - 'zenny_reward': 7000, - 'hrp_reward': 950, - 'rewards_row_1': [ - (ItemsType.flabby_hide, 1, 18), - (ItemsType.uncanny_hide, 1, 6), - (ItemsType.pale_extract, 1, 11), - (ItemsType.poison_sac, 1, 15), - (ItemsType.agnaktor_shell, 1, 10), - (ItemsType.agnaktor_scale, 1, 16), - (ItemsType.agnaktor_hide, 1, 13), - (ItemsType.agnaktor_fin, 1, 6), - (ItemsType.agnaktor_beak, 1, 5) - ], - 'rewards_row_2': [ - (ItemsType.flabby_hide, 1, 13), - (ItemsType.uncanny_hide, 1, 6), - (ItemsType.pale_extract, 1, 11), - (ItemsType.poison_sac, 1, 10), - (ItemsType.agnaktor_shell, 1, 9), - (ItemsType.agnaktor_scale, 1, 10), - (ItemsType.agnaktor_hide, 1, 10), - (ItemsType.agnaktor_fin, 1, 6), - (ItemsType.agnaktor_beak, 1, 5), - (ItemsType.commendation, 1, 20) - ], - }, - 'subquest_1': { - 'description': "None", - 'type': 0x00000001, - 'objective_type': Monster.agnaktor, - 'objective_num': 0x01, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - 'subquest_2': { - 'description': "None", - 'type': 0, - 'objective_type': Monster.none, - 'objective_num': 0x00, - 'zenny_reward': 0, - 'hrp_reward': 0x00000000, - 'rewards_row_1': [], - }, - }, - 'unknown': { - # 2 for large mon quest, 3 for small/delivery, 5 for jhen/ala - 'unk_12': 0x00000002, - 'unk_4': 0x00, - 'unk_5': 0x00, - 'unk_6': 0x00, - 'unk_7': 0x00000000, - 'unk_9': 0x00000000, - 'unk_10': 0x00000000, - 'unk_11': 0x00000000, - } -} diff --git a/mh/time_utils.py b/mh/time_utils.py index f2719de..868d4cf 100644 --- a/mh/time_utils.py +++ b/mh/time_utils.py @@ -48,6 +48,14 @@ def get_jhen_event_times(): int(cycle_start + JHEN_END*SECONDS_PER_DAY)) # sandstorm end +def current_event_time_slot(): + """ + There are JHEN_EVENT_OFFSET temporal event slots per data event slot. + Each one activates on a different day, counting up from 0. + """ + return int(current_server_time()//SECONDS_PER_DAY) % JHEN_EVENT_OFFSET + + def is_jhen_active(): day_in_cycle = int( current_server_time() // SECONDS_PER_DAY diff --git a/other/utils.py b/other/utils.py index 5636922..74e4acb 100644 --- a/other/utils.py +++ b/other/utils.py @@ -340,7 +340,7 @@ def wii_ssl_wrap_socket(sock, ssl_cert, ssl_key): return context.wrap_socket(sock, server_side=True) -def create_server(server_class, server_handler, +def create_server(server_class, server_handler, binary_loader, address="0.0.0.0", port=8200, name="Server", max_thread=0, use_ssl=True, ssl_cert="server.crt", ssl_key="server.key", log_to_file=True, log_filename="server.log", @@ -351,22 +351,26 @@ def create_server(server_class, server_handler, log_to_file=log_filename if log_to_file else "", log_to_console=log_to_console, log_to_window=log_to_window) + if not use_ssl: ssl_cert = None ssl_key = None - return server_class((address, port), server_handler, max_thread, logger, - debug_mode, ssl_cert=ssl_cert, ssl_key=ssl_key) + + return server_class((address, port), server_handler, binary_loader, + max_thread, logger, debug_mode, ssl_cert=ssl_cert, + ssl_key=ssl_key) server_base = namedtuple("ServerBase", ["name", "cls", "handler"]) -def create_server_from_base(name, server_class, server_handler, silent=False, +def create_server_from_base(name, server_class, server_handler, + binary_loader=None, silent=False, debug_mode=False): """Create a server based on its config parameters.""" config = get_config(name) return create_server( - server_class, server_handler, + server_class, server_handler, binary_loader, address=config["IP"], port=config["Port"], name=config["Name"],