Implemented loaders for roles, rewards, and skill templates - including an automatic profession icon update

This commit is contained in:
Obique
2019-02-06 21:27:29 -06:00
parent 5d5b30ee8a
commit 74797a7d5e
12 changed files with 750 additions and 142 deletions

View File

@@ -0,0 +1,94 @@
name index iscategory issubcategory can_be_active faction faction_visible_only
STRING INTEGER BOOLEAN BOOLEAN BOOLEAN STRING BOOLEAN
unknown 1 true false false false
bank 2 true false false false
cantina 3 true false true false
capitol 4 true false false false
cloningfacility 5 true false false false
garage 6 true false false false
guild 7 true false false false
guild_combat 8 false true false false
guild_commerce 9 false true false false
guild_theater 10 false true true false
guild_university 11 false true false false
hotel 12 true false false false
medicalcenter 13 true false true false
shuttleport 14 true false false false
starport 15 true false false false
themepark 16 true false false false
city 17 true false false false
waypoint 18 true false false false
trainer 19 true false false false
trainer_brawler 20 false true false false
trainer_artisan 21 false true false false
trainer_scout 22 false true false false
trainer_marksman 23 false true false false
trainer_entertainer 24 false true false false
trainer_medic 25 false true false false
junkshop 26 true false false false
tavern 27 true false true false
barracks 28 true false true false
vendor 29 true false false false
vendor_armor 30 false true false false
vendor_clothing 31 false true false false
vendor_components 32 false true false false
vendor_droids 33 false true false false
vendor_equipment 34 false true false false
vendor_food 35 false true false false
vendor_housing 36 false true false false
vendor_resources 37 false true false false
vendor_tools 38 false true false false
vendor_weapons 39 false true false false
vendor_junk 40 false true false false
terminal 41 true false false false
terminal_bank 42 false true false false
terminal_bazaar 43 false true false false
terminal_mission 44 false true false false
rebel 45 true false false rebel true
imperial 46 true false false imperial true
rebel_hq 47 false true true rebel true
imperial_hq 48 false true true imperial true
camp 49 false true true false
cityhall 50 false false true false
theater 51 false false true false
vendor_pets 52 false true false false
vendor_medical 53 false true false false
poi 54 true false false false
garage 55 true false false false
museum 56 true false false false
salon 57 true false false false
space 58 true false false false
space_recruiter 59 false true false false
space_chassis_broker 60 false true false false
space_chassis 61 true false false false
trainer_starfighter_engineer 62 false true false false
trainer_shipwright 63 false true false false
trainer_pilot_privateer 64 false true false false
trainer_pilot_rebel 65 false true false false
trainer_pilot_imperial 66 false true false false
vendor_ships 67 false true false false
sf_rebel_forward_base 68 false true true rebel true
sf_imperial_forward_base 69 false true true imperial true
sf_rebel_minor_base 70 false true true rebel true
sf_imperial_minor_base 71 false true true imperial true
sf_rebel_major_base 72 false true true rebel true
sf_imperial_major_base 73 false true true imperial true
sf_rebel_hq 47 false true true rebel true
sf_imperial_hq 48 false true true imperial true
terminal_gcw_static_base 74 false true true false
terminal_mission_entertainer 75 false true false false
terminal_mission_artisan 76 false true false false
terminal_mission_scout 77 false true false false
terminal_mission_bounty 78 false true false false
terminal_mission_rebel 79 false true false rebel true
terminal_mission_imperial 80 false true false imperial true
city_junk_dealer 81 false true false false
gcw_region 82 true false false false
gcw_factional_presence 83 true false false false
gcw_factional_presence_rebel_only 84 false true false false
gcw_factional_presence_imperial_only 85 false true false false
gcw_factional_presence_rebel_and_imperial 86 false true false false
player_placed_factional_base 87 true false false false
player_placed_factional_base_rebel 88 false true true false
player_placed_factional_base_imperial 89 false true true false
vendor_chronicles 90 false true false false

View File

@@ -0,0 +1,24 @@
index role_icon qualifying_skill
INTEGER STRING STRING
0 artisan class_trader
5 entertainer class_entertainer_phase1_novice
10 medic class_medic_phase1_novice
15 officer class_officer_phase1_novice
20 bounty_hunter class_bountyhunter_phase1_novice
25 smuggler class_smuggler_phase1_novice
30 commando class_commando_phase1_novice
35 utility class_spy_phase1_novice
40 jedisaber class_forcesensitive_phase1_novice
45 advancedmedic class_medic_phase4_master
50 advancedbountyhunter class_bountyhunter_phase4_master
55 advancedcommando class_commando_phase4_master
60 advancedjedisaber class_forcesensitive_phase4_master
65 advancedartisan class_structures_phase4_master
65 advancedartisan class_munitions_phase4_master
65 advancedartisan class_domestics_phase4_master
65 advancedartisan class_engineering_phase4_master
70 advancedentertainer class_entertainer_phase4_master
75 advancedsmuggler class_smuggler_phase4_master
80 advancedofficer class_officer_phase4_master
85 advancedutilities class_spy_phase4_master
115 pet pet_special

View File

@@ -0,0 +1,306 @@
roadmap_template_name roadmap_skill_name appearance_name string_id item_default item_wookiee item_ithorian
STRING STRING STRING STRING STRING STRING STRING
bounty_hunter_1a class_bountyhunter_phase1_novice
bounty_hunter_1a class_bountyhunter_phase1_02
bounty_hunter_1a class_bountyhunter_phase1_03
bounty_hunter_1a class_bountyhunter_phase1_04 appearance/backpack_s05_m.sat @ui_roadmap:bounty_hunter_backpack item_bounty_hunter_backpack_01_02
bounty_hunter_1a class_bountyhunter_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_bounty_hunter_10_n object/tangible/quest/quest_start/profession_bounty_hunter_10.iff
bounty_hunter_1a class_bountyhunter_phase1_master
bounty_hunter_1a class_bountyhunter_phase2_novice appearance/armor_composite_s01_chest_plate_m.sat @ui_roadmap:bounty_hunter_armor armor_bounty_hunter_roadmap_chest_02_01,armor_bounty_hunter_roadmap_leggings_02_01,armor_bounty_hunter_roadmap_helmet_02_01,armor_bounty_hunter_roadmap_bicep_l_02_01,armor_bounty_hunter_roadmap_bicep_r_02_01,armor_bounty_hunter_roadmap_bracer_l_02_01,armor_bounty_hunter_roadmap_bracer_r_02_01,armor_bounty_hunter_roadmap_gloves_02_01,armor_bounty_hunter_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_03,armor_wookiee_roadmap_leggings_02_03,armor_wookiee_roadmap_bicep_l_02_03,armor_wookiee_roadmap_bicep_r_02_03,armor_wookiee_roadmap_bracer_l_02_03,armor_wookiee_roadmap_bracer_r_02_03 armor_ithorian_roadmap_chest_02_03,armor_ithorian_roadmap_leggings_02_03,armor_ithorian_roadmap_helmet_02_03,armor_ithorian_roadmap_bicep_l_02_03,armor_ithorian_roadmap_bicep_r_02_03,armor_ithorian_roadmap_bracer_l_02_03,armor_ithorian_roadmap_bracer_r_02_03,armor_ithorian_roadmap_gloves_02_03,armor_ithorian_roadmap_boots_02_03
bounty_hunter_1a class_bountyhunter_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_bounty_hunter_20_n object/tangible/quest/quest_start/profession_bounty_hunter_20.iff
bounty_hunter_1a class_bountyhunter_phase2_03 appearance/wp_carbine_ee3_combined.apt @ui_roadmap:bounty_hunter_weapon_30 weapon_carbine_bh_roadmap_01_02
bounty_hunter_1a class_bountyhunter_phase2_04
bounty_hunter_1a class_bountyhunter_phase2_05 appearance/ring_s02.apt @ui_roadmap:bounty_hunter_ring item_bounty_hunter_ring_01_02
bounty_hunter_1a class_bountyhunter_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_bounty_hunter_30_n object/tangible/quest/quest_start/profession_bounty_hunter_30.iff
bounty_hunter_1a class_bountyhunter_phase3_novice
bounty_hunter_1a class_bountyhunter_phase3_02 appearance/wp_rifle_lightning_cannon.apt @ui_roadmap:bounty_hunter_weapon_50 weapon_rifle_bh_roadmap_01_02
bounty_hunter_1a class_bountyhunter_phase3_03
bounty_hunter_1a class_bountyhunter_phase3_04
bounty_hunter_1a class_bountyhunter_phase3_05
bounty_hunter_1a class_bountyhunter_phase3_master appearance/necklace_s02_f.sat @ui_roadmap:bounty_hunter_necklace item_bounty_hunter_pendant_01_02
bounty_hunter_1a class_bountyhunter_phase4_novice
bounty_hunter_1a class_bountyhunter_phase4_02
bounty_hunter_1a class_bountyhunter_phase4_03 appearance/eqp_survey_survey_pad_advanced_s1.apt @ui_roadmap:bounty_hunter_usable item_bounty_hunter_clicky_01_02
bounty_hunter_1a class_bountyhunter_phase4_04
bounty_hunter_1a class_bountyhunter_phase4_05
bounty_hunter_1a class_bountyhunter_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:bounty_hunter_belt item_roadmap_belt_bounty_hunter_01_02
commando_1a class_commando_phase1_novice
commando_1a class_commando_phase1_02
commando_1a class_commando_phase1_03
commando_1a class_commando_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:commando_backpack item_commando_backpack_01_02
commando_1a class_commando_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_commando_10_n object/tangible/quest/quest_start/profession_commando_10.iff
commando_1a class_commando_phase1_master
commando_1a class_commando_phase2_novice appearance/armor_composite_s01_chest_plate_m.sat @ui_roadmap:commando_armor armor_commando_roadmap_chest_02_01,armor_commando_roadmap_leggings_02_01,armor_commando_roadmap_helmet_02_01,armor_commando_roadmap_bicep_l_02_01,armor_commando_roadmap_bicep_r_02_01,armor_commando_roadmap_bracer_l_02_01,armor_commando_roadmap_bracer_r_02_01,armor_commando_roadmap_gloves_02_01,armor_commando_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_03,armor_wookiee_roadmap_leggings_02_03,armor_wookiee_roadmap_bicep_l_02_03,armor_wookiee_roadmap_bicep_r_02_03,armor_wookiee_roadmap_bracer_l_02_03,armor_wookiee_roadmap_bracer_r_02_03 armor_ithorian_roadmap_chest_02_03,armor_ithorian_roadmap_leggings_02_03,armor_ithorian_roadmap_helmet_02_03,armor_ithorian_roadmap_bicep_l_02_03,armor_ithorian_roadmap_bicep_r_02_03,armor_ithorian_roadmap_bracer_l_02_03,armor_ithorian_roadmap_bracer_r_02_03,armor_ithorian_roadmap_gloves_02_03,armor_ithorian_roadmap_boots_02_03
commando_1a class_commando_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_commando_20_n object/tangible/quest/quest_start/profession_commando_20.iff
commando_1a class_commando_phase2_03 appearance/wp_rifle_dlt20.apt @ui_roadmap:commando_weapon_30 weapon_lightningbeam_commando_roadmap_01_02
commando_1a class_commando_phase2_04
commando_1a class_commando_phase2_05 appearance/ring_s03.apt @ui_roadmap:commando_ring item_commando_ring_01_02
commando_1a class_commando_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_commando_30_n object/tangible/quest/quest_start/profession_commando_30.iff
commando_1a class_commando_phase3_novice
commando_1a class_commando_phase3_02 appearance/wp_carbine_e11.apt @ui_roadmap:commando_weapon_50 weapon_acidbeam_commando_roadmap_01_02
commando_1a class_commando_phase3_03
commando_1a class_commando_phase3_04
commando_1a class_commando_phase3_05
commando_1a class_commando_phase3_master appearance/necklace_s07_f.sat @ui_roadmap:commando_necklace item_commando_pendant_01_02
commando_1a class_commando_phase4_novice
commando_1a class_commando_phase4_02
commando_1a class_commando_phase4_03 appearance/eqp_comp_weapon_high_power_module.apt @ui_roadmap:commando_usable item_commando_clicky_01_02
commando_1a class_commando_phase4_04
commando_1a class_commando_phase4_05
commando_1a class_commando_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:commando_belt item_roadmap_belt_commando_01_02
smuggler_1a class_smuggler_phase1_novice
smuggler_1a class_smuggler_phase1_02
smuggler_1a class_smuggler_phase1_03
smuggler_1a class_smuggler_phase1_04 appearance/backpack_s05_m.sat @ui_roadmap:smuggler_backpack item_smuggler_backpack_01_02
smuggler_1a class_smuggler_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_smuggler_10_n object/tangible/quest/quest_start/profession_smuggler_10.iff
smuggler_1a class_smuggler_phase1_master
smuggler_1a class_smuggler_phase2_novice appearance/armor_tantel_skreej_chest_plate_m.sat @ui_roadmap:smuggler_armor armor_smuggler_roadmap_chest_02_01,armor_smuggler_roadmap_leggings_02_01,armor_smuggler_roadmap_helmet_02_01,armor_smuggler_roadmap_bicep_l_02_01,armor_smuggler_roadmap_bicep_r_02_01,armor_smuggler_roadmap_bracer_l_02_01,armor_smuggler_roadmap_bracer_r_02_01,armor_smuggler_roadmap_gloves_02_01,armor_smuggler_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_01,armor_wookiee_roadmap_leggings_02_01,armor_wookiee_roadmap_bicep_l_02_01,armor_wookiee_roadmap_bicep_r_02_01,armor_wookiee_roadmap_bracer_l_02_01,armor_wookiee_roadmap_bracer_r_02_01 armor_ithorian_roadmap_chest_02_01,armor_ithorian_roadmap_leggings_02_01,armor_ithorian_roadmap_helmet_02_01,armor_ithorian_roadmap_bicep_l_02_01,armor_ithorian_roadmap_bicep_r_02_01,armor_ithorian_roadmap_bracer_l_02_01,armor_ithorian_roadmap_bracer_r_02_01,armor_ithorian_roadmap_gloves_02_01,armor_ithorian_roadmap_boots_02_01
smuggler_1a class_smuggler_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_smuggler_20_n object/tangible/quest/quest_start/profession_smuggler_20.iff
smuggler_1a class_smuggler_phase2_03 appearance/wp_pistol_scout_combined.apt @ui_roadmap:smuggler_weapon_30 weapon_knuckler_smuggler_roadmap_01_02
smuggler_1a class_smuggler_phase2_04
smuggler_1a class_smuggler_phase2_05 appearance/ring_s03.apt @ui_roadmap:smuggler_ring item_smuggler_ring_01_02
smuggler_1a class_smuggler_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_smuggler_30_n object/tangible/quest/quest_start/profession_smuggler_30.iff
smuggler_1a class_smuggler_phase3_novice
smuggler_1a class_smuggler_phase3_02 appearance/wp_pistol_striker.apt @ui_roadmap:smuggler_weapon_50 weapon_pistol_smuggler_roadmap_02_02
smuggler_1a class_smuggler_phase3_03
smuggler_1a class_smuggler_phase3_04
smuggler_1a class_smuggler_phase3_05
smuggler_1a class_smuggler_phase3_master appearance/necklace_s11_f.sat @ui_roadmap:smuggler_necklace item_smuggler_pendant_01_02
smuggler_1a class_smuggler_phase4_novice
smuggler_1a class_smuggler_phase4_02
smuggler_1a class_smuggler_phase4_03 appearance/eqp_data_disk.apt @ui_roadmap:smuggler_usable item_smuggler_clicky_01_02
smuggler_1a class_smuggler_phase4_04
smuggler_1a class_smuggler_phase4_05
smuggler_1a class_smuggler_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:smuggler_belt item_roadmap_belt_smuggler_01_02
force_sensitive_1a class_forcesensitive_phase1_novice
force_sensitive_1a class_forcesensitive_phase1_02
force_sensitive_1a class_forcesensitive_phase1_03
force_sensitive_1a class_forcesensitive_phase1_04 appearance/ring_s02.apt @ui_roadmap:force_sensitive_ring_2 item_force_sensitive_ring_02_01
force_sensitive_1a class_forcesensitive_phase1_05 appearance/eqp_force_crystal.apt @obj_n:profession_force_sensitive_10_n object/tangible/quest/quest_start/profession_force_sensitive_10.iff
force_sensitive_1a class_forcesensitive_phase1_master
force_sensitive_1a class_forcesensitive_phase2_novice appearance/robe_jedi_padawan_f.sat @ui_roadmap:force_sensitive_armor item_npe_fs_robe_02_02
force_sensitive_1a class_forcesensitive_phase2_02 appearance/thm_prp_holocron_splinters.apt @obj_n:profession_force_sensitive_20_n object/tangible/quest/quest_start/profession_force_sensitive_20.iff
force_sensitive_1a class_forcesensitive_phase2_03 appearance/wp_mle_sword_lightsaber_blade_anakin.lsb @ui_roadmap:force_sensitive_weapon_30 weapon_roadmap_lightsaber_02_02
force_sensitive_1a class_forcesensitive_phase2_04
force_sensitive_1a class_forcesensitive_phase2_05 appearance/ring_s01.apt @ui_roadmap:force_sensitive_ring item_force_sensitive_ring_01_02
force_sensitive_1a class_forcesensitive_phase2_master appearance/atf_sith_s01.apt @obj_n:profession_force_sensitive_30_n object/tangible/quest/quest_start/profession_force_sensitive_30.iff
force_sensitive_1a class_forcesensitive_phase3_novice
force_sensitive_1a class_forcesensitive_phase3_02 appearance/dragon_pearl.apt @ui_roadmap:force_sensitive_weapon_50 item_krayt_pearl_04_01
force_sensitive_1a class_forcesensitive_phase3_03
force_sensitive_1a class_forcesensitive_phase3_04
force_sensitive_1a class_forcesensitive_phase3_05
force_sensitive_1a class_forcesensitive_phase3_master appearance/necklace_s12_f.sat @ui_roadmap:force_sensitive_necklace item_force_sensitive_pendant_01_02
force_sensitive_1a class_forcesensitive_phase4_novice
force_sensitive_1a class_forcesensitive_phase4_02
force_sensitive_1a class_forcesensitive_phase4_03 appearance/force_amplification_crystal.apt @ui_roadmap:force_sensitive_usable item_force_sensitive_clicky_01_02
force_sensitive_1a class_forcesensitive_phase4_04
force_sensitive_1a class_forcesensitive_phase4_05
force_sensitive_1a class_forcesensitive_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:force_sensitive_belt item_roadmap_belt_force_sensitive_01_02
officer_1a class_officer_phase1_novice
officer_1a class_officer_phase1_02
officer_1a class_officer_phase1_03
officer_1a class_officer_phase1_04 appearance/backpack_s03_m.sat @ui_roadmap:officer_backpack item_officer_backpack_01_02
officer_1a class_officer_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_officer_10_n object/tangible/quest/quest_start/profession_officer_10.iff
officer_1a class_officer_phase1_master
officer_1a class_officer_phase2_novice appearance/armor_composite_s01_chest_plate_m.sat @ui_roadmap:officer_armor armor_officer_roadmap_chest_02_01,armor_officer_roadmap_leggings_02_01,armor_officer_roadmap_helmet_02_01,armor_officer_roadmap_bicep_l_02_01,armor_officer_roadmap_bicep_r_02_01,armor_officer_roadmap_bracer_l_02_01,armor_officer_roadmap_bracer_r_02_01,armor_officer_roadmap_gloves_02_01,armor_officer_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_02,armor_wookiee_roadmap_leggings_02_02,armor_wookiee_roadmap_bicep_l_02_02,armor_wookiee_roadmap_bicep_r_02_02,armor_wookiee_roadmap_bracer_l_02_02,armor_wookiee_roadmap_bracer_r_02_02 armor_ithorian_roadmap_chest_02_02,armor_ithorian_roadmap_leggings_02_02,armor_ithorian_roadmap_helmet_02_02,armor_ithorian_roadmap_bicep_l_02_02,armor_ithorian_roadmap_bicep_r_02_02,armor_ithorian_roadmap_bracer_l_02_02,armor_ithorian_roadmap_bracer_r_02_02,armor_ithorian_roadmap_gloves_02_02,armor_ithorian_roadmap_boots_02_02
officer_1a class_officer_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_officer_20_n object/tangible/quest/quest_start/profession_officer_20.iff
officer_1a class_officer_phase2_03 appearance/wp_pistol_dl44_metal_combined.apt @ui_roadmap:officer_weapon_30 weapon_pistol_officer_roadmap_02_02
officer_1a class_officer_phase2_04
officer_1a class_officer_phase2_05 appearance/ring_s04.apt @ui_roadmap:officer_ring item_officer_ring_01_02
officer_1a class_officer_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_officer_30_n object/tangible/quest/quest_start/profession_officer_30.iff
officer_1a class_officer_phase3_novice
officer_1a class_officer_phase3_02 appearance/wp_pistol_dl44_metal_combined.apt @ui_roadmap:officer_weapon_50 weapon_pistol_officer_roadmap_01_02
officer_1a class_officer_phase3_03
officer_1a class_officer_phase3_04
officer_1a class_officer_phase3_05
officer_1a class_officer_phase3_master appearance/necklace_s08_f.sat @ui_roadmap:officer_necklace item_officer_pendant_01_02
officer_1a class_officer_phase4_novice
officer_1a class_officer_phase4_02
officer_1a class_officer_phase4_03 appearance/eqp_tool_sensor_frequency_jammer.apt @ui_roadmap:officer_usable item_officer_clicky_01_02
officer_1a class_officer_phase4_04
officer_1a class_officer_phase4_05
officer_1a class_officer_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:officer_belt item_roadmap_belt_officer_01_02
medic_1a science_doctor_prereq_novice
medic_1a class_medic_phase1_novice
medic_1a class_medic_phase1_02
medic_1a class_medic_phase1_03
medic_1a class_medic_phase1_04 appearance/backpack_s03_m.sat @ui_roadmap:medic_backpack item_medic_backpack_01_02
medic_1a class_medic_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_medic_10_n object/tangible/quest/quest_start/profession_medic_10.iff
medic_1a class_medic_phase1_master
medic_1a class_medic_phase2_novice appearance/armor_tantel_skreej_chest_plate_m.sat @ui_roadmap:medic_armor armor_medic_roadmap_chest_02_01,armor_medic_roadmap_leggings_02_01,armor_medic_roadmap_helmet_02_01,armor_medic_roadmap_bicep_l_02_01,armor_medic_roadmap_bicep_r_02_01,armor_medic_roadmap_bracer_l_02_01,armor_medic_roadmap_bracer_r_02_01,armor_medic_roadmap_gloves_02_01,armor_medic_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_01,armor_wookiee_roadmap_leggings_02_01,armor_wookiee_roadmap_bicep_l_02_01,armor_wookiee_roadmap_bicep_r_02_01,armor_wookiee_roadmap_bracer_l_02_01,armor_wookiee_roadmap_bracer_r_02_01 armor_ithorian_roadmap_chest_02_01,armor_ithorian_roadmap_leggings_02_01,armor_ithorian_roadmap_helmet_02_01,armor_ithorian_roadmap_bicep_l_02_01,armor_ithorian_roadmap_bicep_r_02_01,armor_ithorian_roadmap_bracer_l_02_01,armor_ithorian_roadmap_bracer_r_02_01,armor_ithorian_roadmap_gloves_02_01,armor_ithorian_roadmap_boots_02_01
medic_1a class_medic_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_medic_20_n object/tangible/quest/quest_start/profession_medic_20.iff
medic_1a class_medic_phase2_03 appearance/wp_pistol_scout_combined.apt @ui_roadmap:medic_weapon_30 weapon_pistol_medic_roadmap_01_02
medic_1a class_medic_phase2_04
medic_1a class_medic_phase2_05 appearance/ring_s01.apt @ui_roadmap:medic_ring item_medic_ring_01_02
medic_1a class_medic_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_medic_30_n object/tangible/quest/quest_start/profession_medic_30.iff
medic_1a class_medic_phase3_novice
medic_1a class_medic_phase3_02 appearance/wp_carbine_laser_combined.apt @ui_roadmap:medic_weapon_50 weapon_carbine_medic_roadmap_01_02
medic_1a class_medic_phase3_03
medic_1a class_medic_phase3_04
medic_1a class_medic_phase3_05
medic_1a class_medic_phase3_master appearance/necklace_s09_f.sat @ui_roadmap:medic_necklace item_medic_pendant_01_02
medic_1a class_medic_phase4_novice
medic_1a class_medic_phase4_02
medic_1a class_medic_phase4_03 appearance/eqp_comp_chemical_dispersion.apt @ui_roadmap:medic_usable item_medic_clicky_01_02
medic_1a class_medic_phase4_04
medic_1a class_medic_phase4_05
medic_1a class_medic_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:medic_belt item_roadmap_belt_medic_01_02
spy_1a class_spy_phase1_novice
spy_1a class_spy_phase1_02
spy_1a class_spy_phase1_03
spy_1a class_spy_phase1_04 appearance/backpack_s06_m.sat @ui_roadmap:spy_backpack item_spy_backpack_01_02
spy_1a class_spy_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_spy_10_n object/tangible/quest/quest_start/profession_spy_10.iff
spy_1a class_spy_phase1_master
spy_1a class_spy_phase2_novice appearance/armor_padded_s01_chest_plate_m.sat @ui_roadmap:spy_armor armor_spy_roadmap_chest_02_01,armor_spy_roadmap_leggings_02_01,armor_spy_roadmap_helmet_02_01,armor_spy_roadmap_bicep_l_02_01,armor_spy_roadmap_bicep_r_02_01,armor_spy_roadmap_bracer_l_02_01,armor_spy_roadmap_bracer_r_02_01,armor_spy_roadmap_gloves_02_01,armor_spy_roadmap_boots_02_01 armor_wookiee_roadmap_chest_02_02,armor_wookiee_roadmap_leggings_02_02,armor_wookiee_roadmap_bicep_l_02_02,armor_wookiee_roadmap_bicep_r_02_02,armor_wookiee_roadmap_bracer_l_02_02,armor_wookiee_roadmap_bracer_r_02_02 armor_ithorian_roadmap_chest_02_02,armor_ithorian_roadmap_leggings_02_02,armor_ithorian_roadmap_helmet_02_02,armor_ithorian_roadmap_bicep_l_02_02,armor_ithorian_roadmap_bicep_r_02_02,armor_ithorian_roadmap_bracer_l_02_02,armor_ithorian_roadmap_bracer_r_02_02,armor_ithorian_roadmap_gloves_02_02,armor_ithorian_roadmap_boots_02_02
spy_1a class_spy_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_spy_20_n object/tangible/quest/quest_start/profession_spy_20.iff
spy_1a class_spy_phase2_03 appearance/wp_pistol_striker.apt @ui_roadmap:spy_weapon_30 weapon_pistol_spy_roadmap_01_02
spy_1a class_spy_phase2_04
spy_1a class_spy_phase2_05 appearance/ring_s02.apt @ui_roadmap:spy_ring item_spy_ring_01_02
spy_1a class_spy_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_spy_30_n object/tangible/quest/quest_start/profession_spy_30.iff
spy_1a class_spy_phase3_novice
spy_1a class_spy_phase3_02 appearance/wp_carbine_e11.apt @ui_roadmap:spy_weapon_50 weapon_carbine_spy_roadmap_01_02
spy_1a class_spy_phase3_03
spy_1a class_spy_phase3_04
spy_1a class_spy_phase3_05
spy_1a class_spy_phase3_master appearance/necklace_s01_f.sat @ui_roadmap:spy_necklace item_spy_pendant_01_02
spy_1a class_spy_phase4_novice
spy_1a class_spy_phase4_02
spy_1a class_spy_phase4_03 appearance/eqp_data_disk.apt @ui_roadmap:spy_usable item_spy_clicky_01_02
spy_1a class_spy_phase4_04
spy_1a class_spy_phase4_05
spy_1a class_spy_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:spy_belt item_roadmap_belt_spy_01_02
entertainer_1a class_entertainer_phase1
entertainer_1a class_entertainer_phase1_novice
entertainer_1a class_entertainer_phase1_02
entertainer_1a class_entertainer_phase1_03
entertainer_1a class_entertainer_phase1_04 appearance/backpack_s01_m.sat @ui_roadmap:entertainer_backpack item_entertainer_backpack_01_02
entertainer_1a class_entertainer_phase1_05 appearance/eqp_notebook_s01.apt @obj_n:profession_entertainer_10_n object/tangible/quest/quest_start/profession_entertainer_10.iff,weapon_knuckler_ent_roadmap_02_01
entertainer_1a class_entertainer_phase1_master
entertainer_1a class_entertainer_phase2_novice appearance/robe_s05_h0_f.sat @ui_roadmap:entertainer_captivator item_entertainer_roadmap_cloak_02_01,item_entertainer_roadmap_boots_02_01,item_entertainer_roadmap_gloves_02_01,item_entertainer_roadmap_pants_02_01,weapon_knuckler_ent_roadmap_02_02 item_entertainer_roadmap_robe_02_01,item_entertainer_roadmap_gloves_02_02,weapon_knuckler_ent_roadmap_02_02 item_entertainer_roadmap_jumpsuit_02_01,item_entertainer_roadmap_hat_02_01,weapon_knuckler_ent_roadmap_02_02
entertainer_1a class_entertainer_phase2_02 appearance/eqp_notebook_s01.apt @obj_n:profession_entertainer_20_n object/tangible/quest/quest_start/profession_entertainer_20.iff
entertainer_1a class_entertainer_phase2_03 appearance/wp_sp_vibroknuckler.apt @ui_roadmap:entertainer_weapon_30 weapon_knuckler_ent_roadmap_02_04
entertainer_1a class_entertainer_phase2_04
entertainer_1a class_entertainer_phase2_05 appearance/ring_s04.apt @ui_roadmap:entertainer_ring item_entertainer_ring_01_02,weapon_knuckler_ent_roadmap_02_03
entertainer_1a class_entertainer_phase2_master appearance/eqp_notebook_s01.apt @obj_n:profession_entertainer_30_n object/tangible/quest/quest_start/profession_entertainer_30.iff
entertainer_1a class_entertainer_phase3_novice
entertainer_1a class_entertainer_phase3_02 appearance/wp_pistol_striker.apt @ui_roadmap:entertainer_weapon_50 weapon_pistol_entertainer_roadmap_01_02
entertainer_1a class_entertainer_phase3_03
entertainer_1a class_entertainer_phase3_04
entertainer_1a class_entertainer_phase3_05
entertainer_1a class_entertainer_phase3_master appearance/necklace_s12_f.sat @ui_roadmap:entertainer_necklace item_entertainer_pendant_01_02
entertainer_1a class_entertainer_phase4_novice
entertainer_1a class_entertainer_phase4_02
entertainer_1a class_entertainer_phase4_03 appearance/eqp_speaker.apt @ui_roadmap:entertainer_usable item_entertainer_clicky_01_02
entertainer_1a class_entertainer_phase4_04
entertainer_1a class_entertainer_phase4_05
entertainer_1a class_entertainer_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:entertainer_belt item_roadmap_belt_entertainer_01_02
trader_0a class_domestics_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01
trader_0a class_domestics_phase1_02
trader_0a class_domestics_phase1_03
trader_0a class_domestics_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02
trader_0a class_domestics_phase1_05
trader_0a class_domestics_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff
trader_0a class_domestics_phase2_novice
trader_0a class_domestics_phase2_02
trader_0a class_domestics_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01
trader_0a class_domestics_phase2_04
trader_0a class_domestics_phase2_05
trader_0a class_domestics_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02
trader_0a class_domestics_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff
trader_0a class_domestics_phase3_02
trader_0a class_domestics_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02
trader_0a class_domestics_phase3_04
trader_0a class_domestics_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02
trader_0a class_domestics_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff
trader_0a class_domestics_phase4_novice
trader_0a class_domestics_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02
trader_0a class_domestics_phase4_03
trader_0a class_domestics_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02
trader_0a class_domestics_phase4_05
trader_0a class_domestics_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02
trader_0b class_structures_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01
trader_0b class_structures_phase1_02
trader_0b class_structures_phase1_03
trader_0b class_structures_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02
trader_0b class_structures_phase1_05
trader_0b class_structures_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff
trader_0b class_structures_phase2_novice
trader_0b class_structures_phase2_02
trader_0b class_structures_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01
trader_0b class_structures_phase2_04
trader_0b class_structures_phase2_05
trader_0b class_structures_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02
trader_0b class_structures_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff
trader_0b class_structures_phase3_02
trader_0b class_structures_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02
trader_0b class_structures_phase3_04
trader_0b class_structures_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02
trader_0b class_structures_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff
trader_0b class_structures_phase4_novice
trader_0b class_structures_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02
trader_0b class_structures_phase4_03
trader_0b class_structures_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02
trader_0b class_structures_phase4_05
trader_0b class_structures_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02
trader_0c class_munitions_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01
trader_0c class_munitions_phase1_02
trader_0c class_munitions_phase1_03
trader_0c class_munitions_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02
trader_0c class_munitions_phase1_05
trader_0c class_munitions_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff
trader_0c class_munitions_phase2_novice
trader_0c class_munitions_phase2_02
trader_0c class_munitions_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01
trader_0c class_munitions_phase2_04
trader_0c class_munitions_phase2_05
trader_0c class_munitions_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02
trader_0c class_munitions_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff
trader_0c class_munitions_phase3_02
trader_0c class_munitions_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02
trader_0c class_munitions_phase3_04
trader_0c class_munitions_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02
trader_0c class_munitions_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff
trader_0c class_munitions_phase4_novice
trader_0c class_munitions_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02
trader_0c class_munitions_phase4_03
trader_0c class_munitions_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02
trader_0c class_munitions_phase4_05
trader_0c class_munitions_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02
trader_0d class_engineering_phase1_novice @ui_roadmap:tuned_crafting_tool item_npe_gen_craft_tool_trader_03_01
trader_0d class_engineering_phase1_02
trader_0d class_engineering_phase1_03
trader_0d class_engineering_phase1_04 appearance/backpack_s04_m.sat @ui_roadmap:trader_backpack item_trader_backpack_01_02
trader_0d class_engineering_phase1_05
trader_0d class_engineering_phase1_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_10_n object/tangible/quest/quest_start/profession_trader_10.iff
trader_0d class_engineering_phase2_novice
trader_0d class_engineering_phase2_02
trader_0d class_engineering_phase2_03 appearance/bodysuit_s13_f.sat @ui_roadmap:trader_armor item_trader_roadmap_jumpsuit_02_01,item_trader_roadmap_boots_02_01,item_trader_roadmap_gloves_02_01 item_trader_roadmap_shoulder_pad_02_01,item_trader_roadmap_gloves_02_02 item_trader_roadmap_jumpsuit_02_02,item_trader_roadmap_hat_02_01
trader_0d class_engineering_phase2_04
trader_0d class_engineering_phase2_05
trader_0d class_engineering_phase2_master appearance/wp_mle_knife_dagger.apt @ui_roadmap:trader_weapon_30 weapon_knife_trader_roadmap_01_02
trader_0d class_engineering_phase3_novice appearance/eqp_notebook_s01.apt @obj_n:profession_trader_20_n object/tangible/quest/quest_start/profession_trader_20.iff
trader_0d class_engineering_phase3_02
trader_0d class_engineering_phase3_03 appearance/ring_s02.apt @ui_roadmap:trader_ring item_trader_ring_01_02
trader_0d class_engineering_phase3_04
trader_0d class_engineering_phase3_05 appearance/wp_pistol_scout_combined.apt @ui_roadmap:trader_weapon_50 weapon_pistol_trader_roadmap_01_02
trader_0d class_engineering_phase3_master appearance/eqp_notebook_s01.apt @obj_n:profession_trader_30_n object/tangible/quest/quest_start/profession_trader_30.iff
trader_0d class_engineering_phase4_novice
trader_0d class_engineering_phase4_02 appearance/necklace_s07_f.sat @ui_roadmap:trader_necklace item_trader_pendant_01_02
trader_0d class_engineering_phase4_03
trader_0d class_engineering_phase4_04 appearance/eqp_tool_computer_toolkit.apt @ui_roadmap:trader_usable item_trader_clicky_01_02
trader_0d class_engineering_phase4_05
trader_0d class_engineering_phase4_master appearance/armor_zam_wesell_belt_f.sat @ui_roadmap:trader_belt item_roadmap_belt_trader_01_02
chronicles class_chronicles_novice appearance/eqp_booster_pack.apt @static_item_n:item_pgc_starter_kit item_pgc_starter_kit
chronicles class_chronicles_2 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_4 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_5 appearance/pcg_robe_statue.apt @static_item_n:item_pgc_chronicle_master_statuette item_pgc_chronicle_master_statuette
chronicles class_chronicles_6 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_8 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_10 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_11 appearance/thm_sign_pgc_hanging.apt @static_item_n:item_special_sign_pgc_consumable item_special_sign_pgc_consumable
chronicles class_chronicles_12 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_13 appearance/thm_sign_pgc_standing.apt @static_item_n:item_special_sign_pgc_consumable_02 item_special_sign_pgc_consumable_02
chronicles class_chronicles_14 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_15 appearance/ply_pgc_merchant_tent_s01_r0.apt @static_item_n:item_pgc_chronicler_tent_deed item_pgc_chronicler_tent_deed
chronicles class_chronicles_16 appearance/eqp_booster_pack.apt @static_item_n:item_pgc_booster_pack item_pgc_booster_pack
chronicles class_chronicles_master appearance/pgc_robe_s01_m.sat @static_item_n:item_pgc_chronicle_master_robe item_pgc_booster_pack,item_pgc_chronicle_master_robe

View File

@@ -0,0 +1,38 @@
template_name starting_template_name str_class_name user_interface_priority template level_based expertise_trees respec_allowed
STRING STRING STRING INTEGER STRING BOOLEAN STRING INTEGER
smuggler_1a smuggler smuggler 3 class_smuggler_phase1_novice,class_smuggler_phase1_02,class_smuggler_phase1_03,class_smuggler_phase1_04,class_smuggler_phase1_05,class_smuggler_phase1_master,class_smuggler_phase2_novice,class_smuggler_phase2_02,class_smuggler_phase2_03,class_smuggler_phase2_04,class_smuggler_phase2_05,class_smuggler_phase2_master,class_smuggler_phase3_novice,class_smuggler_phase3_02,class_smuggler_phase3_03,class_smuggler_phase3_04,class_smuggler_phase3_05,class_smuggler_phase3_master,class_smuggler_phase4_novice,class_smuggler_phase4_02,class_smuggler_phase4_03,class_smuggler_phase4_04,class_smuggler_phase4_05,class_smuggler_phase4_master true 7,8,30 1
smuggler_2a smuggler 0 combat_smuggler_prereq_novice,combat_smuggler_prereq_01,combat_smuggler_prereq_02,combat_smuggler_prereq_03,combat_smuggler_prereq_04,combat_smuggler_prereq_master,combat_smuggler_novice,combat_unarmed_prereq_novice,combat_unarmed_prereq_01,combat_unarmed_prereq_02,combat_unarmed_prereq_03,combat_unarmed_prereq_04,combat_unarmed_prereq_master,combat_unarmed_novice,science_doctor_prereq_novice,combat_smuggler_underworld_01,combat_smuggler_slicing_01,combat_smuggler_combat_01,combat_smuggler_spice_01,science_doctor_prereq_01,combat_unarmed_accuracy_01,combat_unarmed_speed_01,combat_unarmed_ability_01,combat_unarmed_support_01,science_doctor_prereq_02,combat_smuggler_underworld_02,combat_smuggler_slicing_02,science_doctor_prereq_03,combat_smuggler_combat_02,combat_smuggler_spice_02,science_doctor_prereq_04,combat_unarmed_accuracy_02,combat_unarmed_speed_02,science_doctor_prereq_master,combat_unarmed_ability_02,combat_unarmed_support_02,science_doctor_novice,combat_smuggler_underworld_03,combat_smuggler_slicing_03,combat_smuggler_combat_03,combat_smuggler_spice_03,science_doctor_wound_speed_01,combat_unarmed_accuracy_03,combat_unarmed_speed_03,combat_unarmed_ability_03,combat_unarmed_support_03,science_doctor_wound_speed_02,combat_smuggler_underworld_04,combat_smuggler_slicing_04,combat_smuggler_combat_04,combat_smuggler_spice_04,science_doctor_wound_speed_03,combat_unarmed_accuracy_04,combat_unarmed_speed_04,combat_unarmed_ability_04,combat_unarmed_support_04,science_doctor_wound_speed_04,combat_unarmed_master,combat_smuggler_master true 7,8,30 0
smuggler_2b smuggler 0 combat_smuggler_prereq_novice,combat_smuggler_prereq_01,combat_smuggler_prereq_02,combat_smuggler_prereq_03,combat_smuggler_prereq_04,combat_smuggler_prereq_master,combat_smuggler_novice,combat_pistol_prereq_novice,combat_pistol_prereq_01,combat_pistol_prereq_02,combat_pistol_prereq_03,combat_pistol_prereq_04,combat_pistol_prereq_master,combat_pistol_novice,science_doctor_prereq_novice,combat_smuggler_underworld_01,combat_smuggler_slicing_01,combat_smuggler_combat_01,combat_smuggler_spice_01,science_doctor_prereq_01,combat_pistol_accuracy_01,combat_pistol_speed_01,combat_pistol_ability_01,combat_pistol_support_01,science_doctor_prereq_02,combat_smuggler_underworld_02,combat_smuggler_slicing_02,science_doctor_prereq_03,combat_smuggler_combat_02,combat_smuggler_spice_02,science_doctor_prereq_04,combat_pistol_accuracy_02,combat_pistol_speed_02,science_doctor_prereq_master,combat_pistol_ability_02,combat_pistol_support_02,science_doctor_novice,combat_smuggler_underworld_03,combat_smuggler_slicing_03,combat_smuggler_combat_03,combat_smuggler_spice_03,science_doctor_wound_speed_01,combat_pistol_accuracy_03,combat_pistol_speed_03,combat_pistol_ability_03,combat_pistol_support_03,science_doctor_wound_speed_02,combat_smuggler_underworld_04,combat_smuggler_slicing_04,combat_smuggler_combat_04,combat_smuggler_spice_04,science_doctor_wound_speed_03,combat_pistol_accuracy_04,combat_pistol_speed_04,combat_pistol_ability_04,combat_pistol_support_04,science_doctor_wound_speed_04,combat_pistol_master,combat_smuggler_master true 7,8,30 0
bounty_hunter_1a bounty_hunter bounty_hunter 2 class_bountyhunter_phase1_novice,class_bountyhunter_phase1_02,class_bountyhunter_phase1_03,class_bountyhunter_phase1_04,class_bountyhunter_phase1_05,class_bountyhunter_phase1_master,class_bountyhunter_phase2_novice,class_bountyhunter_phase2_02,class_bountyhunter_phase2_03,class_bountyhunter_phase2_04,class_bountyhunter_phase2_05,class_bountyhunter_phase2_master,class_bountyhunter_phase3_novice,class_bountyhunter_phase3_02,class_bountyhunter_phase3_03,class_bountyhunter_phase3_04,class_bountyhunter_phase3_05,class_bountyhunter_phase3_master,class_bountyhunter_phase4_novice,class_bountyhunter_phase4_02,class_bountyhunter_phase4_03,class_bountyhunter_phase4_04,class_bountyhunter_phase4_05,class_bountyhunter_phase4_master true 1,2,30 1
bounty_hunter_2a bounty_hunter 0 combat_bountyhunter_prereq_novice,combat_bountyhunter_prereq_01,combat_bountyhunter_prereq_02,combat_bountyhunter_prereq_03,combat_bountyhunter_prereq_04,combat_bountyhunter_prereq_master,combat_bountyhunter_novice,combat_rifleman_prereq_novice,combat_rifleman_prereq_01,combat_rifleman_prereq_02,combat_rifleman_prereq_03,combat_rifleman_prereq_04,combat_rifleman_prereq_master,combat_rifleman_novice,science_doctor_prereq_novice,combat_bountyhunter_investigation_01,combat_bountyhunter_droidcontrol_01,combat_bountyhunter_droidresponse_01,combat_bountyhunter_support_01,science_doctor_prereq_01,combat_rifleman_accuracy_01,combat_rifleman_speed_01,combat_rifleman_ability_01,combat_rifleman_support_01,science_doctor_prereq_02,combat_bountyhunter_investigation_02,combat_bountyhunter_droidcontrol_02,science_doctor_prereq_03,combat_bountyhunter_droidresponse_02,combat_bountyhunter_support_02,science_doctor_prereq_04,combat_rifleman_accuracy_02,combat_rifleman_speed_02,science_doctor_prereq_master,combat_rifleman_ability_02,combat_rifleman_support_02,science_doctor_novice,combat_bountyhunter_investigation_03,combat_bountyhunter_droidcontrol_03,combat_bountyhunter_droidresponse_03,combat_bountyhunter_support_03,science_doctor_wound_speed_01,combat_rifleman_accuracy_03,combat_rifleman_speed_03,combat_rifleman_ability_03,combat_rifleman_support_03,science_doctor_wound_speed_02,combat_bountyhunter_investigation_04,combat_bountyhunter_droidcontrol_04,combat_bountyhunter_droidresponse_04,combat_bountyhunter_support_04,science_doctor_wound_speed_03,combat_rifleman_accuracy_04,combat_rifleman_speed_04,combat_rifleman_ability_04,combat_rifleman_support_04,science_doctor_wound_speed_04,combat_rifleman_master,combat_bountyhunter_master true 1,2,30 0
bounty_hunter_2b bounty_hunter 0 combat_bountyhunter_prereq_novice,combat_bountyhunter_prereq_01,combat_bountyhunter_prereq_02,combat_bountyhunter_prereq_03,combat_bountyhunter_prereq_04,combat_bountyhunter_prereq_master,combat_bountyhunter_novice,combat_carbine_prereq_novice,combat_carbine_prereq_01,combat_carbine_prereq_02,combat_carbine_prereq_03,combat_carbine_prereq_04,combat_carbine_prereq_master,combat_carbine_novice,science_doctor_prereq_novice,combat_bountyhunter_investigation_01,combat_bountyhunter_droidcontrol_01,combat_bountyhunter_droidresponse_01,combat_bountyhunter_support_01,science_doctor_prereq_01,combat_carbine_accuracy_01,combat_carbine_speed_01,combat_carbine_ability_01,combat_carbine_support_01,science_doctor_prereq_02,combat_bountyhunter_investigation_02,combat_bountyhunter_droidcontrol_02,science_doctor_prereq_03,combat_bountyhunter_droidresponse_02,combat_bountyhunter_support_02,science_doctor_prereq_04,combat_carbine_accuracy_02,combat_carbine_speed_02,science_doctor_prereq_master,combat_carbine_ability_02,combat_carbine_support_02,science_doctor_novice,combat_bountyhunter_investigation_03,combat_bountyhunter_droidcontrol_03,combat_bountyhunter_droidresponse_03,combat_bountyhunter_support_03,science_doctor_wound_speed_01,combat_carbine_accuracy_03,combat_carbine_speed_03,combat_carbine_ability_03,combat_carbine_support_03,science_doctor_wound_speed_02,combat_bountyhunter_investigation_04,combat_bountyhunter_droidcontrol_04,combat_bountyhunter_droidresponse_04,combat_bountyhunter_support_04,science_doctor_wound_speed_03,combat_carbine_accuracy_04,combat_carbine_speed_04,combat_carbine_ability_04,combat_carbine_support_04,science_doctor_wound_speed_04,combat_carbine_master,combat_bountyhunter_master true 1,2,30 0
officer_1a officer officer 4 class_officer_phase1_novice,class_officer_phase1_02,class_officer_phase1_03,class_officer_phase1_04,class_officer_phase1_05,class_officer_phase1_master,class_officer_phase2_novice,class_officer_phase2_02,class_officer_phase2_03,class_officer_phase2_04,class_officer_phase2_05,class_officer_phase2_master,class_officer_phase3_novice,class_officer_phase3_02,class_officer_phase3_03,class_officer_phase3_04,class_officer_phase3_05,class_officer_phase3_master,class_officer_phase4_novice,class_officer_phase4_02,class_officer_phase4_03,class_officer_phase4_04,class_officer_phase4_05,class_officer_phase4_master true 10,11,30 1
officer_2a officer 0 outdoors_squadleader_prereq_novice,outdoors_squadleader_prereq_01,outdoors_squadleader_prereq_02,outdoors_squadleader_prereq_03,outdoors_squadleader_prereq_04,outdoors_squadleader_prereq_master,outdoors_squadleader_novice,combat_pistol_prereq_novice,combat_pistol_prereq_01,combat_pistol_prereq_02,combat_pistol_prereq_03,combat_pistol_prereq_04,combat_pistol_prereq_master,combat_pistol_novice,science_doctor_prereq_novice,outdoors_squadleader_movement_01,outdoors_squadleader_offense_01,outdoors_squadleader_defense_01,outdoors_squadleader_support_01,science_doctor_prereq_01,combat_pistol_accuracy_01,combat_pistol_speed_01,combat_pistol_ability_01,combat_pistol_support_01,science_doctor_prereq_02,outdoors_squadleader_movement_02,outdoors_squadleader_offense_02,science_doctor_prereq_03,outdoors_squadleader_defense_02,outdoors_squadleader_support_02,science_doctor_prereq_04,combat_pistol_accuracy_02,combat_pistol_speed_02,science_doctor_prereq_master,combat_pistol_ability_02,combat_pistol_support_02,science_doctor_novice,outdoors_squadleader_movement_03,outdoors_squadleader_offense_03,outdoors_squadleader_defense_03,outdoors_squadleader_support_03,science_doctor_wound_speed_01,combat_pistol_accuracy_03,combat_pistol_speed_03,combat_pistol_ability_03,combat_pistol_support_03,science_doctor_wound_speed_02,outdoors_squadleader_movement_04,outdoors_squadleader_offense_04,outdoors_squadleader_defense_04,outdoors_squadleader_support_04,science_doctor_wound_speed_03,combat_pistol_accuracy_04,combat_pistol_speed_04,combat_pistol_ability_04,combat_pistol_support_04,science_doctor_wound_speed_04,combat_pistol_master,outdoors_squadleader_master true 10,11,30 0
officer_2b officer 0 outdoors_squadleader_prereq_novice,outdoors_squadleader_prereq_01,outdoors_squadleader_prereq_02,outdoors_squadleader_prereq_03,outdoors_squadleader_prereq_04,outdoors_squadleader_prereq_master,outdoors_squadleader_novice,combat_1hsword_prereq_novice,combat_1hsword_prereq_01,combat_1hsword_prereq_02,combat_1hsword_prereq_03,combat_1hsword_prereq_04,combat_1hsword_prereq_master,combat_1hsword_novice,science_doctor_prereq_novice,outdoors_squadleader_movement_01,outdoors_squadleader_offense_01,outdoors_squadleader_defense_01,outdoors_squadleader_support_01,science_doctor_prereq_01,combat_1hsword_accuracy_01,combat_1hsword_speed_01,combat_1hsword_ability_01,combat_1hsword_support_01,science_doctor_prereq_02,outdoors_squadleader_movement_02,outdoors_squadleader_offense_02,science_doctor_prereq_03,outdoors_squadleader_defense_02,outdoors_squadleader_support_02,science_doctor_prereq_04,combat_1hsword_accuracy_02,combat_1hsword_speed_02,science_doctor_prereq_master,combat_1hsword_ability_02,combat_1hsword_support_02,science_doctor_novice,outdoors_squadleader_movement_03,outdoors_squadleader_offense_03,outdoors_squadleader_defense_03,outdoors_squadleader_support_03,science_doctor_wound_speed_01,combat_1hsword_accuracy_03,combat_1hsword_speed_03,combat_1hsword_ability_03,combat_1hsword_support_03,science_doctor_wound_speed_02,outdoors_squadleader_movement_04,outdoors_squadleader_offense_04,outdoors_squadleader_defense_04,outdoors_squadleader_support_04,science_doctor_wound_speed_03,combat_1hsword_accuracy_04,combat_1hsword_speed_04,combat_1hsword_ability_04,combat_1hsword_support_04,science_doctor_wound_speed_04,combat_1hsword_master,outdoors_squadleader_master true 10,11,30 0
commando_1a commando commando 5 class_commando_phase1_novice,class_commando_phase1_02,class_commando_phase1_03,class_commando_phase1_04,class_commando_phase1_05,class_commando_phase1_master,class_commando_phase2_novice,class_commando_phase2_02,class_commando_phase2_03,class_commando_phase2_04,class_commando_phase2_05,class_commando_phase2_master,class_commando_phase3_novice,class_commando_phase3_02,class_commando_phase3_03,class_commando_phase3_04,class_commando_phase3_05,class_commando_phase3_master,class_commando_phase4_novice,class_commando_phase4_02,class_commando_phase4_03,class_commando_phase4_04,class_commando_phase4_05,class_commando_phase4_master true 13,14,30 1
commando_2a commando 0 combat_commando_prereq_novice,combat_commando_prereq_01,combat_commando_prereq_02,combat_commando_prereq_03,combat_commando_prereq_04,combat_commando_prereq_master,combat_commando_novice,combat_rifleman_prereq_novice,combat_rifleman_prereq_01,combat_rifleman_prereq_02,combat_rifleman_prereq_03,combat_rifleman_prereq_04,combat_rifleman_prereq_master,combat_rifleman_novice,science_doctor_prereq_novice,combat_commando_heavyweapon_accuracy_01,combat_commando_heavyweapon_speed_01,combat_commando_thrownweapon_01,combat_commando_support_01,science_doctor_prereq_01,combat_rifleman_accuracy_01,combat_rifleman_speed_01,combat_rifleman_ability_01,combat_rifleman_support_01,science_doctor_prereq_02,combat_commando_heavyweapon_accuracy_02,combat_commando_heavyweapon_speed_02,science_doctor_prereq_03,combat_commando_thrownweapon_02,combat_commando_support_02,science_doctor_prereq_04,combat_rifleman_accuracy_02,combat_rifleman_speed_02,science_doctor_prereq_master,combat_rifleman_ability_02,combat_rifleman_support_02,science_doctor_novice,combat_commando_heavyweapon_accuracy_03,combat_commando_heavyweapon_speed_03,combat_commando_thrownweapon_03,combat_commando_support_03,science_doctor_wound_speed_01,combat_rifleman_accuracy_03,combat_rifleman_speed_03,combat_rifleman_ability_03,combat_rifleman_support_03,science_doctor_wound_speed_02,combat_commando_heavyweapon_accuracy_04,combat_commando_heavyweapon_speed_04,combat_commando_thrownweapon_04,combat_commando_support_04,science_doctor_wound_speed_03,combat_rifleman_accuracy_04,combat_rifleman_speed_04,combat_rifleman_ability_04,combat_rifleman_support_04,science_doctor_wound_speed_04,combat_rifleman_master,combat_commando_master true 13,14,30 0
commando_2b commando 0 combat_commando_prereq_novice,combat_commando_prereq_01,combat_commando_prereq_02,combat_commando_prereq_03,combat_commando_prereq_04,combat_commando_prereq_master,combat_commando_novice,combat_2hsword_prereq_novice,combat_2hsword_prereq_01,combat_2hsword_prereq_02,combat_2hsword_prereq_03,combat_2hsword_prereq_04,combat_2hsword_prereq_master,combat_2hsword_novice,science_doctor_prereq_novice,combat_commando_heavyweapon_accuracy_01,combat_commando_heavyweapon_speed_01,combat_commando_thrownweapon_01,combat_commando_support_01,science_doctor_prereq_01,combat_2hsword_accuracy_01,combat_2hsword_speed_01,combat_2hsword_ability_01,combat_2hsword_support_01,science_doctor_prereq_02,combat_commando_heavyweapon_accuracy_02,combat_commando_heavyweapon_speed_02,science_doctor_prereq_03,combat_commando_thrownweapon_02,combat_commando_support_02,science_doctor_prereq_04,combat_2hsword_accuracy_02,combat_2hsword_speed_02,science_doctor_prereq_master,combat_2hsword_ability_02,combat_2hsword_support_02,science_doctor_novice,combat_commando_heavyweapon_accuracy_03,combat_commando_heavyweapon_speed_03,combat_commando_thrownweapon_03,combat_commando_support_03,science_doctor_wound_speed_01,combat_2hsword_accuracy_03,combat_2hsword_speed_03,combat_2hsword_ability_03,combat_2hsword_support_03,science_doctor_wound_speed_02,combat_commando_heavyweapon_accuracy_04,combat_commando_heavyweapon_speed_04,combat_commando_thrownweapon_04,combat_commando_support_04,science_doctor_wound_speed_03,combat_2hsword_accuracy_04,combat_2hsword_speed_04,combat_2hsword_ability_04,combat_2hsword_support_04,science_doctor_wound_speed_04,combat_2hsword_master,combat_commando_master true 13,14,30 0
force_sensitive_1a force_sensitive force_sensitive 1 class_forcesensitive_phase1_novice,class_forcesensitive_phase1_02,class_forcesensitive_phase1_03,class_forcesensitive_phase1_04,class_forcesensitive_phase1_05,class_forcesensitive_phase1_master,class_forcesensitive_phase2_novice,class_forcesensitive_phase2_02,class_forcesensitive_phase2_03,class_forcesensitive_phase2_04,class_forcesensitive_phase2_05,class_forcesensitive_phase2_master,class_forcesensitive_phase3_novice,class_forcesensitive_phase3_02,class_forcesensitive_phase3_03,class_forcesensitive_phase3_04,class_forcesensitive_phase3_05,class_forcesensitive_phase3_master,class_forcesensitive_phase4_novice,class_forcesensitive_phase4_02,class_forcesensitive_phase4_03,class_forcesensitive_phase4_04,class_forcesensitive_phase4_05,class_forcesensitive_phase4_master true 4,5,30 1
force_sensitive_2a force_sensitive 0 combat_unarmed_prereq_novice,combat_unarmed_prereq_01,combat_unarmed_prereq_02,combat_unarmed_prereq_03,combat_unarmed_prereq_04,combat_unarmed_prereq_master,combat_unarmed_novice,combat_2hsword_prereq_novice,combat_2hsword_prereq_01,combat_2hsword_prereq_02,combat_2hsword_prereq_03,combat_2hsword_prereq_04,combat_2hsword_prereq_master,combat_2hsword_novice,science_doctor_prereq_novice,combat_unarmed_accuracy_01,combat_unarmed_speed_01,combat_unarmed_ability_01,combat_unarmed_support_01,science_doctor_prereq_01,combat_2hsword_accuracy_01,combat_2hsword_speed_01,combat_2hsword_ability_01,combat_2hsword_support_01,science_doctor_prereq_02,combat_unarmed_accuracy_02,combat_unarmed_speed_02,science_doctor_prereq_03,combat_unarmed_ability_02,combat_unarmed_support_02,science_doctor_prereq_04,combat_2hsword_accuracy_02,combat_2hsword_speed_02,science_doctor_prereq_master,combat_2hsword_ability_02,combat_2hsword_support_02,science_doctor_novice,combat_unarmed_accuracy_03,combat_unarmed_speed_03,combat_unarmed_ability_03,combat_unarmed_support_03,science_doctor_wound_speed_01,combat_2hsword_accuracy_03,combat_2hsword_speed_03,combat_2hsword_ability_03,combat_2hsword_support_03,science_doctor_wound_speed_02,combat_unarmed_accuracy_04,combat_unarmed_speed_04,combat_unarmed_ability_04,combat_unarmed_support_04,science_doctor_wound_speed_03,combat_2hsword_accuracy_04,combat_2hsword_speed_04,combat_2hsword_ability_04,combat_2hsword_support_04,science_doctor_wound_speed_04,combat_2hsword_master,combat_unarmed_master true 4,5,30 0
force_sensitive_2b force_sensitive 0 combat_unarmed_prereq_novice,combat_unarmed_prereq_01,combat_unarmed_prereq_02,combat_unarmed_prereq_03,combat_unarmed_prereq_04,combat_unarmed_prereq_master,combat_unarmed_novice,combat_polearm_prereq_novice,combat_polearm_prereq_01,combat_polearm_prereq_02,combat_polearm_prereq_03,combat_polearm_prereq_04,combat_polearm_prereq_master,combat_polearm_novice,science_doctor_prereq_novice,combat_unarmed_accuracy_01,combat_unarmed_speed_01,combat_unarmed_ability_01,combat_unarmed_support_01,science_doctor_prereq_01,combat_polearm_accuracy_01,combat_polearm_speed_01,combat_polearm_ability_01,combat_polearm_support_01,science_doctor_prereq_02,combat_unarmed_accuracy_02,combat_unarmed_speed_02,science_doctor_prereq_03,combat_unarmed_ability_02,combat_unarmed_support_02,science_doctor_prereq_04,combat_polearm_accuracy_02,combat_polearm_speed_02,science_doctor_prereq_master,combat_polearm_ability_02,combat_polearm_support_02,science_doctor_novice,combat_unarmed_accuracy_03,combat_unarmed_speed_03,combat_unarmed_ability_03,combat_unarmed_support_03,science_doctor_wound_speed_01,combat_polearm_accuracy_03,combat_polearm_speed_03,combat_polearm_ability_03,combat_polearm_support_03,science_doctor_wound_speed_02,combat_unarmed_accuracy_04,combat_unarmed_speed_04,combat_unarmed_ability_04,combat_unarmed_support_04,science_doctor_wound_speed_03,combat_polearm_accuracy_04,combat_polearm_speed_04,combat_polearm_ability_04,combat_polearm_support_04,science_doctor_wound_speed_04,combat_polearm_master,combat_unarmed_master true 4,5,30 0
medic_1a medic medic 8 class_medic_phase1_novice,class_medic_phase1_02,class_medic_phase1_03,class_medic_phase1_04,class_medic_phase1_05,class_medic_phase1_master,class_medic_phase2_novice,class_medic_phase2_02,class_medic_phase2_03,class_medic_phase2_04,class_medic_phase2_05,class_medic_phase2_master,class_medic_phase3_novice,class_medic_phase3_02,class_medic_phase3_03,class_medic_phase3_04,class_medic_phase3_05,class_medic_phase3_master,class_medic_phase4_novice,class_medic_phase4_02,class_medic_phase4_03,class_medic_phase4_04,class_medic_phase4_05,class_medic_phase4_master true 16,17,30 1
medic_2a medic 0 science_doctor_prereq_novice,science_doctor_prereq_01,science_doctor_prereq_02,science_doctor_prereq_03,science_doctor_prereq_04,science_doctor_prereq_master,science_doctor_novice,science_combatmedic_prereq_novice,science_combatmedic_prereq_01,science_combatmedic_prereq_02,science_combatmedic_prereq_03,science_combatmedic_prereq_04,science_combatmedic_prereq_master,science_combatmedic_novice,combat_pistol_prereq_novice,science_doctor_wound_speed_01,science_doctor_wound_01,science_doctor_ability_01,science_doctor_support_01,combat_pistol_prereq_01,science_combatmedic_healing_range_01,science_combatmedic_healing_range_speed_01,science_combatmedic_medicine_01,science_combatmedic_support_01,combat_pistol_prereq_02,science_doctor_wound_speed_02,science_doctor_wound_02,combat_pistol_prereq_03,science_doctor_ability_02,science_doctor_support_02,combat_pistol_prereq_04,science_combatmedic_healing_range_02,science_combatmedic_healing_range_speed_02,combat_pistol_prereq_master,science_combatmedic_medicine_02,science_combatmedic_support_02,combat_pistol_novice,science_doctor_wound_speed_03,science_doctor_wound_03,science_doctor_ability_03,science_doctor_support_03,combat_pistol_support_01,science_combatmedic_healing_range_03,science_combatmedic_healing_range_speed_03,science_combatmedic_medicine_03,science_combatmedic_support_03,combat_pistol_support_02,science_doctor_wound_speed_04,science_doctor_wound_04,science_doctor_ability_04,science_doctor_support_04,combat_pistol_support_03,science_combatmedic_healing_range_04,science_combatmedic_healing_range_speed_04,science_combatmedic_medicine_04,science_combatmedic_support_04,combat_pistol_support_04,science_combatmedic_master,science_doctor_master true 16,17,30 0
medic_2b medic 0 science_doctor_prereq_novice,science_doctor_prereq_01,science_doctor_prereq_02,science_doctor_prereq_03,science_doctor_prereq_04,science_doctor_prereq_master,science_doctor_novice,combat_pistol_prereq_novice,combat_pistol_prereq_01,combat_pistol_prereq_02,combat_pistol_prereq_03,combat_pistol_prereq_04,combat_pistol_prereq_master,combat_pistol_novice,science_combatmedic_prereq_novice,science_doctor_wound_speed_01,science_doctor_wound_01,science_doctor_ability_01,science_doctor_support_01,science_combatmedic_prereq_01,combat_pistol_accuracy_01,combat_pistol_speed_01,combat_pistol_ability_01,combat_pistol_support_01,science_combatmedic_prereq_02,science_doctor_wound_speed_02,science_doctor_wound_02,science_combatmedic_prereq_03,science_doctor_ability_02,science_doctor_support_02,science_combatmedic_prereq_04,combat_pistol_accuracy_02,combat_pistol_speed_02,science_combatmedic_prereq_master,combat_pistol_ability_02,combat_pistol_support_02,science_combatmedic_novice,science_doctor_wound_speed_03,science_doctor_wound_03,science_doctor_ability_03,science_doctor_support_03,science_combatmedic_healing_range_01,combat_pistol_accuracy_03,combat_pistol_speed_03,combat_pistol_ability_03,combat_pistol_support_03,science_combatmedic_healing_range_02,science_doctor_wound_speed_04,science_doctor_wound_04,science_doctor_ability_04,science_doctor_support_04,science_combatmedic_healing_range_03,combat_pistol_accuracy_04,combat_pistol_speed_04,combat_pistol_ability_04,combat_pistol_support_04,science_combatmedic_healing_range_04,combat_pistol_master,science_doctor_master true 16,17,30 0
spy_1a spy spy 6 class_spy_phase1_novice,class_spy_phase1_02,class_spy_phase1_03,class_spy_phase1_04,class_spy_phase1_05,class_spy_phase1_master,class_spy_phase2_novice,class_spy_phase2_02,class_spy_phase2_03,class_spy_phase2_04,class_spy_phase2_05,class_spy_phase2_master,class_spy_phase3_novice,class_spy_phase3_02,class_spy_phase3_03,class_spy_phase3_04,class_spy_phase3_05,class_spy_phase3_master,class_spy_phase4_novice,class_spy_phase4_02,class_spy_phase4_03,class_spy_phase4_04,class_spy_phase4_05,class_spy_phase4_master true 19,20,30 1
spy_2a spy 0 outdoors_ranger_prereq_novice,outdoors_ranger_prereq_01,outdoors_ranger_prereq_02,outdoors_ranger_prereq_03,outdoors_ranger_prereq_04,outdoors_ranger_prereq_master,outdoors_ranger_novice,combat_carbine_prereq_novice,combat_carbine_prereq_01,combat_carbine_prereq_02,combat_carbine_prereq_03,combat_carbine_prereq_04,combat_carbine_prereq_master,combat_carbine_novice,science_doctor_prereq_novice,outdoors_ranger_movement_01,outdoors_ranger_tracking_01,outdoors_ranger_harvest_01,outdoors_ranger_support_01,science_doctor_prereq_01,combat_carbine_accuracy_01,combat_carbine_speed_01,combat_carbine_ability_01,combat_carbine_support_01,science_doctor_prereq_02,outdoors_ranger_movement_02,outdoors_ranger_tracking_02,science_doctor_prereq_03,outdoors_ranger_harvest_02,outdoors_ranger_support_02,science_doctor_prereq_04,combat_carbine_accuracy_02,combat_carbine_speed_02,science_doctor_prereq_master,combat_carbine_ability_02,combat_carbine_support_02,science_doctor_novice,outdoors_ranger_movement_03,outdoors_ranger_tracking_03,outdoors_ranger_harvest_03,outdoors_ranger_support_03,science_doctor_wound_speed_01,combat_carbine_accuracy_03,combat_carbine_speed_03,combat_carbine_ability_03,combat_carbine_support_03,science_doctor_wound_speed_02,combat_carbine_accuracy_04,combat_carbine_speed_04,combat_carbine_ability_04,combat_carbine_support_04,science_doctor_wound_speed_03,outdoors_ranger_movement_04,outdoors_ranger_tracking_04,outdoors_ranger_harvest_04,outdoors_ranger_support_04,science_doctor_wound_speed_04,outdoors_ranger_master,combat_carbine_master true 19,20,30 0
spy_2b spy 0 outdoors_ranger_prereq_novice,outdoors_ranger_prereq_01,outdoors_ranger_prereq_02,outdoors_ranger_prereq_03,outdoors_ranger_prereq_04,outdoors_ranger_prereq_master,outdoors_ranger_novice,combat_bountyhunter_prereq_novice,combat_bountyhunter_prereq_01,combat_bountyhunter_prereq_02,combat_bountyhunter_prereq_03,combat_bountyhunter_prereq_04,combat_bountyhunter_prereq_master,combat_bountyhunter_novice,science_doctor_prereq_novice,outdoors_ranger_movement_01,outdoors_ranger_tracking_01,outdoors_ranger_harvest_01,outdoors_ranger_support_01,science_doctor_prereq_01,combat_bountyhunter_investigation_01,combat_bountyhunter_droidcontrol_01,combat_bountyhunter_droidresponse_01,combat_bountyhunter_support_01,science_doctor_prereq_02,outdoors_ranger_movement_02,outdoors_ranger_tracking_02,science_doctor_prereq_03,outdoors_ranger_harvest_02,outdoors_ranger_support_02,science_doctor_prereq_04,combat_bountyhunter_investigation_02,combat_bountyhunter_droidcontrol_02,science_doctor_prereq_master,combat_bountyhunter_droidresponse_02,combat_bountyhunter_support_02,science_doctor_novice,outdoors_ranger_movement_03,outdoors_ranger_tracking_03,outdoors_ranger_harvest_03,outdoors_ranger_support_03,science_doctor_wound_speed_01,combat_bountyhunter_investigation_03,combat_bountyhunter_droidcontrol_03,combat_bountyhunter_droidresponse_03,combat_bountyhunter_support_03,science_doctor_wound_speed_02,combat_bountyhunter_investigation_04,combat_bountyhunter_droidcontrol_04,combat_bountyhunter_droidresponse_04,combat_bountyhunter_support_04,science_doctor_wound_speed_03,outdoors_ranger_movement_04,outdoors_ranger_tracking_04,outdoors_ranger_harvest_04,outdoors_ranger_support_04,science_doctor_wound_speed_04,outdoors_ranger_master,combat_bountyhunter_master true 19,20,30 0
entertainer_1a entertainer entertainer 9 class_entertainer_phase1_novice,class_entertainer_phase1_02,class_entertainer_phase1_03,class_entertainer_phase1_04,class_entertainer_phase1_05,class_entertainer_phase1_master,class_entertainer_phase2_novice,class_entertainer_phase2_02,class_entertainer_phase2_03,class_entertainer_phase2_04,class_entertainer_phase2_05,class_entertainer_phase2_master,class_entertainer_phase3_novice,class_entertainer_phase3_02,class_entertainer_phase3_03,class_entertainer_phase3_04,class_entertainer_phase3_05,class_entertainer_phase3_master,class_entertainer_phase4_novice,class_entertainer_phase4_02,class_entertainer_phase4_03,class_entertainer_phase4_04,class_entertainer_phase4_05,class_entertainer_phase4_master true 22,23,30 1
entertainer_2a entertainer 0 social_entertainer_novice,social_entertainer_dance_01,social_entertainer_music_01,social_entertainer_healing_01,social_entertainer_hairstyle_01,social_entertainer_dance_02,social_entertainer_music_02,social_entertainer_healing_02,social_entertainer_hairstyle_02,social_entertainer_dance_03,social_entertainer_music_03,social_entertainer_healing_03,social_entertainer_hairstyle_03,social_entertainer_dance_04,social_entertainer_music_04,social_entertainer_healing_04,social_entertainer_hairstyle_04,social_entertainer_master,social_dancer_novice,social_musician_novice,social_imagedesigner_novice,social_dancer_ability_01,social_dancer_wound_01,social_dancer_knowledge_01,social_dancer_shock_01,social_musician_ability_01,social_musician_wound_01,social_musician_knowledge_01,social_musician_shock_01,social_imagedesigner_hairstyle_01,social_imagedesigner_exotic_01,social_imagedesigner_bodyform_01,social_imagedesigner_markings_01,social_dancer_ability_02,social_dancer_wound_02,social_dancer_knowledge_02,social_dancer_shock_02,social_musician_ability_02,social_musician_wound_02,social_musician_knowledge_02,social_musician_shock_02,social_imagedesigner_hairstyle_02,social_imagedesigner_exotic_02,social_imagedesigner_bodyform_02,social_imagedesigner_markings_02,social_dancer_ability_03,social_dancer_wound_03,social_dancer_knowledge_03,social_dancer_shock_03,social_musician_ability_03,social_musician_wound_03,social_musician_knowledge_03,social_musician_shock_03,social_imagedesigner_hairstyle_03,social_imagedesigner_exotic_03,social_imagedesigner_bodyform_03,social_imagedesigner_markings_03,social_dancer_ability_04,social_dancer_wound_04,social_dancer_knowledge_04,social_dancer_shock_04,social_musician_ability_04,social_musician_wound_04,social_musician_knowledge_04,social_musician_shock_04,social_imagedesigner_hairstyle_04,social_imagedesigner_exotic_04,social_imagedesigner_bodyform_04,social_imagedesigner_markings_04,social_imagedesigner_master,social_musician_master,social_dancer_master false 0
trader_0a trader trader 7 class_domestics_phase1_novice,class_domestics_phase1_02,class_domestics_phase1_03,class_domestics_phase1_04,class_domestics_phase1_05,class_domestics_phase1_master,class_domestics_phase2_novice,class_domestics_phase2_02,class_domestics_phase2_03,class_domestics_phase2_04,class_domestics_phase2_05,class_domestics_phase2_master,class_domestics_phase3_novice,class_domestics_phase3_02,class_domestics_phase3_03,class_domestics_phase3_04,class_domestics_phase3_05,class_domestics_phase3_master,class_domestics_phase4_novice,class_domestics_phase4_02,class_domestics_phase4_03,class_domestics_phase4_04,class_domestics_phase4_05,class_domestics_phase4_master true 25,29,30 1
trader_0b trader 0 class_structures_phase1_novice,class_structures_phase1_02,class_structures_phase1_03,class_structures_phase1_04,class_structures_phase1_05,class_structures_phase1_master,class_structures_phase2_novice,class_structures_phase2_02,class_structures_phase2_03,class_structures_phase2_04,class_structures_phase2_05,class_structures_phase2_master,class_structures_phase3_novice,class_structures_phase3_02,class_structures_phase3_03,class_structures_phase3_04,class_structures_phase3_05,class_structures_phase3_master,class_structures_phase4_novice,class_structures_phase4_02,class_structures_phase4_03,class_structures_phase4_04,class_structures_phase4_05,class_structures_phase4_master true 26,29,30 1
trader_0c trader 0 class_munitions_phase1_novice,class_munitions_phase1_02,class_munitions_phase1_03,class_munitions_phase1_04,class_munitions_phase1_05,class_munitions_phase1_master,class_munitions_phase2_novice,class_munitions_phase2_02,class_munitions_phase2_03,class_munitions_phase2_04,class_munitions_phase2_05,class_munitions_phase2_master,class_munitions_phase3_novice,class_munitions_phase3_02,class_munitions_phase3_03,class_munitions_phase3_04,class_munitions_phase3_05,class_munitions_phase3_master,class_munitions_phase4_novice,class_munitions_phase4_02,class_munitions_phase4_03,class_munitions_phase4_04,class_munitions_phase4_05,class_munitions_phase4_master true 27,29,30 1
trader_0d trader 0 class_engineering_phase1_novice,class_engineering_phase1_02,class_engineering_phase1_03,class_engineering_phase1_04,class_engineering_phase1_05,class_engineering_phase1_master,class_engineering_phase2_novice,class_engineering_phase2_02,class_engineering_phase2_03,class_engineering_phase2_04,class_engineering_phase2_05,class_engineering_phase2_master,class_engineering_phase3_novice,class_engineering_phase3_02,class_engineering_phase3_03,class_engineering_phase3_04,class_engineering_phase3_05,class_engineering_phase3_master,class_engineering_phase4_novice,class_engineering_phase4_02,class_engineering_phase4_03,class_engineering_phase4_04,class_engineering_phase4_05,class_engineering_phase4_master true 28,29,30 1
trader_1a trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_domestic_01,crafting_artisan_domestic_02,crafting_artisan_domestic_03,crafting_artisan_domestic_04,crafting_chef_novice,crafting_tailor_novice,crafting_chef_dish_01,crafting_chef_dessert_01,crafting_chef_drink_01,crafting_chef_techniques_01,crafting_tailor_casual_01,crafting_tailor_field_01,crafting_tailor_formal_01,crafting_tailor_production_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_chef_dish_02,crafting_chef_dessert_02,crafting_chef_drink_02,crafting_chef_techniques_02,crafting_tailor_casual_02,crafting_tailor_field_02,crafting_tailor_formal_02,crafting_tailor_production_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_chef_dish_03,crafting_chef_dessert_03,crafting_chef_drink_03,crafting_chef_techniques_03,crafting_tailor_casual_03,crafting_tailor_field_03,crafting_tailor_formal_03,crafting_tailor_production_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_chef_dish_04,crafting_chef_dessert_04,crafting_chef_drink_04,crafting_chef_techniques_04,crafting_tailor_casual_04,crafting_tailor_field_04,crafting_tailor_formal_04,crafting_tailor_production_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_chef_master,crafting_tailor_master,crafting_merchant_master false 0
trader_1b trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_engineering_01,crafting_artisan_engineering_02,crafting_artisan_engineering_03,crafting_artisan_engineering_04,crafting_architect_novice,crafting_shipwright_novice,crafting_architect_production_01,crafting_architect_techniques_01,crafting_architect_harvesting_01,crafting_architect_blueprints_01,crafting_shipwright_engineering_01,crafting_shipwright_propulsion_01,crafting_shipwright_systems_01,crafting_shipwright_defense_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_architect_production_02,crafting_architect_techniques_02,crafting_architect_harvesting_02,crafting_architect_blueprints_02,crafting_shipwright_engineering_02,crafting_shipwright_propulsion_02,crafting_shipwright_systems_02,crafting_shipwright_defense_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_architect_production_03,crafting_architect_techniques_03,crafting_architect_harvesting_03,crafting_architect_blueprints_03,crafting_shipwright_engineering_03,crafting_shipwright_propulsion_03,crafting_shipwright_systems_03,crafting_shipwright_defense_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_architect_production_04,crafting_architect_techniques_04,crafting_architect_harvesting_04,crafting_architect_blueprints_04,crafting_shipwright_engineering_04,crafting_shipwright_propulsion_04,crafting_shipwright_systems_04,crafting_shipwright_defense_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_architect_master,crafting_shipwright_master,crafting_merchant_master false 0
trader_1c trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_engineering_01,crafting_artisan_engineering_02,crafting_artisan_engineering_03,crafting_artisan_engineering_04,crafting_weaponsmith_novice,crafting_armorsmith_novice,crafting_weaponsmith_melee_01,crafting_weaponsmith_firearms_01,crafting_weaponsmith_munitions_01,crafting_weaponsmith_techniques_01,crafting_armorsmith_personal_01,crafting_armorsmith_heavy_01,crafting_armorsmith_deflectors_01,crafting_armorsmith_complexity_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_weaponsmith_melee_02,crafting_weaponsmith_firearms_02,crafting_weaponsmith_munitions_02,crafting_weaponsmith_techniques_02,crafting_armorsmith_personal_02,crafting_armorsmith_heavy_02,crafting_armorsmith_deflectors_02,crafting_armorsmith_complexity_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_weaponsmith_melee_03,crafting_weaponsmith_firearms_03,crafting_weaponsmith_munitions_03,crafting_weaponsmith_techniques_03,crafting_armorsmith_personal_03,crafting_armorsmith_heavy_03,crafting_armorsmith_deflectors_03,crafting_armorsmith_complexity_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_weaponsmith_melee_04,crafting_weaponsmith_firearms_04,crafting_weaponsmith_munitions_04,crafting_weaponsmith_techniques_04,crafting_armorsmith_personal_04,crafting_armorsmith_heavy_04,crafting_armorsmith_deflectors_04,crafting_armorsmith_complexity_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_weaponsmith_master,crafting_armorsmith_master,crafting_merchant_master false 0
trader_1d trader 0 crafting_artisan_novice,crafting_artisan_survey_01,crafting_artisan_business_01,crafting_artisan_survey_02,crafting_artisan_business_02,crafting_artisan_survey_03,crafting_artisan_business_03,crafting_artisan_survey_04,crafting_artisan_business_04,crafting_merchant_novice,crafting_artisan_engineering_01,crafting_artisan_domestic_01,crafting_artisan_engineering_02,crafting_artisan_domestic_02,crafting_artisan_engineering_03,crafting_artisan_domestic_03,crafting_artisan_engineering_04,crafting_artisan_domestic_04,crafting_artisan_master,crafting_weaponsmith_novice,crafting_droidengineer_novice,crafting_droidengineer_production_01,crafting_droidengineer_techniques_01,crafting_droidengineer_refinement_01,crafting_droidengineer_blueprints_01,crafting_weaponsmith_melee_01,crafting_weaponsmith_firearms_01,crafting_weaponsmith_techniques_01,crafting_merchant_advertising_01,crafting_merchant_sales_01,crafting_merchant_hiring_01,crafting_merchant_management_01,crafting_droidengineer_production_02,crafting_droidengineer_techniques_02,crafting_droidengineer_refinement_02,crafting_droidengineer_blueprints_02,crafting_weaponsmith_melee_02,crafting_weaponsmith_firearms_02,crafting_weaponsmith_techniques_02,crafting_merchant_advertising_02,crafting_merchant_sales_02,crafting_merchant_hiring_02,crafting_merchant_management_02,crafting_droidengineer_production_03,crafting_droidengineer_techniques_03,crafting_droidengineer_refinement_03,crafting_droidengineer_blueprints_03,crafting_weaponsmith_melee_03,crafting_weaponsmith_firearms_03,crafting_weaponsmith_techniques_03,crafting_merchant_advertising_03,crafting_merchant_sales_03,crafting_merchant_hiring_03,crafting_merchant_management_03,crafting_droidengineer_production_04,crafting_droidengineer_techniques_04,crafting_droidengineer_refinement_04,crafting_droidengineer_blueprints_04,crafting_weaponsmith_melee_04,crafting_weaponsmith_firearms_04,crafting_weaponsmith_techniques_04,crafting_merchant_advertising_04,crafting_merchant_sales_04,crafting_merchant_hiring_04,crafting_merchant_management_04,crafting_droidengineer_master,crafting_merchant_master false 0
space_pilot_rebel 0 pilot_rebel_navy_novice,pilot_rebel_navy_starships_01,pilot_rebel_navy_weapons_01,pilot_rebel_navy_procedures_01,pilot_rebel_navy_droid_01,pilot_rebel_navy_starships_02,pilot_rebel_navy_weapons_02,pilot_rebel_navy_procedures_02,pilot_rebel_navy_droid_02,pilot_rebel_navy_starships_03,pilot_rebel_navy_weapons_03,pilot_rebel_navy_procedures_03,pilot_rebel_navy_droid_03,pilot_rebel_navy_starships_04,pilot_rebel_navy_weapons_04,pilot_rebel_navy_procedures_04,pilot_rebel_navy_droid_04,pilot_rebel_navy_master false 0
space_pilot_imperial 0 pilot_imperial_navy_novice,pilot_imperial_navy_starships_01,pilot_imperial_navy_weapons_01,pilot_imperial_navy_procedures_01,pilot_imperial_navy_droid_01,pilot_imperial_navy_starships_02,pilot_imperial_navy_weapons_02,pilot_imperial_navy_procedures_02,pilot_imperial_navy_droid_02,pilot_imperial_navy_starships_03,pilot_imperial_navy_weapons_03,pilot_imperial_navy_procedures_03,pilot_imperial_navy_droid_03,pilot_imperial_navy_starships_04,pilot_imperial_navy_weapons_04,pilot_imperial_navy_procedures_04,pilot_imperial_navy_droid_04,pilot_imperial_navy_master false 0
space_pilot_neutral 0 pilot_neutral_novice,pilot_neutral_starships_01,pilot_neutral_weapons_01,pilot_neutral_procedures_01,pilot_neutral_droid_01,pilot_neutral_starships_02,pilot_neutral_weapons_02,pilot_neutral_procedures_02,pilot_neutral_droid_02,pilot_neutral_starships_03,pilot_neutral_weapons_03,pilot_neutral_procedures_03,pilot_neutral_droid_03,pilot_neutral_starships_04,pilot_neutral_weapons_04,pilot_neutral_procedures_04,pilot_neutral_droid_04,pilot_neutral_master false 0
politician 0 social_politician_novice,social_politician_fiscal_01,social_politician_fiscal_02,social_politician_fiscal_03,social_politician_fiscal_04,social_politician_martial_01,social_politician_martial_02,social_politician_martial_03,social_politician_martial_04,social_politician_civic_01,social_politician_civic_02,social_politician_civic_03,social_politician_civic_04,social_politician_urban_01,social_politician_urban_02,social_politician_urban_03,social_politician_urban_04,social_politician_master false 0
chronicles 0 class_chronicles_novice,class_chronicles_1,class_chronicles_2,class_chronicles_3,class_chronicles_4,class_chronicles_5,class_chronicles_6,class_chronicles_7,class_chronicles_8,class_chronicles_9,class_chronicles_10,class_chronicles_11,class_chronicles_12,class_chronicles_13,class_chronicles_14,class_chronicles_15,class_chronicles_16,class_chronicles_master true 0

View File

@@ -1,5 +1,6 @@
package com.projectswg.holocore.resources.support.data.server_info.loader;
import com.projectswg.holocore.resources.support.data.server_info.loader.SkillTemplateLoader.SkillTemplateInfo;
import com.projectswg.holocore.resources.support.data.server_info.loader.npc.*;
import me.joshlarson.jlcommon.log.Log;
@@ -49,10 +50,22 @@ public abstract class DataLoader {
return getInstance(SkillLoader.class, SkillLoader::new);
}
public static SkillTemplateLoader skillTemplates() {
return getInstance(SkillTemplateLoader.class, SkillTemplateLoader::new);
}
public static PlayerLevelLoader playerLevels() {
return getInstance(PlayerLevelLoader.class, PlayerLevelLoader::new);
}
public static PlayerRoleLoader playerRoles() {
return getInstance(PlayerRoleLoader.class, PlayerRoleLoader::new);
}
public static RoadmapRewardLoader roadmapRewards() {
return getInstance(RoadmapRewardLoader.class, RoadmapRewardLoader::new);
}
public static BuildoutLoader buildouts() {
return BuildoutLoader.load(List.of());
}

View File

@@ -29,14 +29,31 @@ package com.projectswg.holocore.resources.support.data.server_info.loader;
import com.projectswg.holocore.resources.support.data.server_info.SdbLoader;
import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public final class PlayerRoleLoader extends DataLoader {
private final Map<Integer, RoleInfo> rolesByIndex;
private final Map<String, RoleInfo> rolesBySkill;
PlayerRoleLoader() {
this.rolesByIndex = new HashMap<>();
this.rolesBySkill = new HashMap<>();
}
@Nullable
public RoleInfo getRoleByIndex(int index) {
return rolesByIndex.get(index);
}
@Nullable
public RoleInfo getRoleBySkill(String skill) {
return rolesBySkill.get(skill);
}
@Override
@@ -44,7 +61,8 @@ public final class PlayerRoleLoader extends DataLoader {
try (SdbResultSet set = SdbLoader.load(new File("serverdata/player/role.sdb"))) {
while (set.next()) {
RoleInfo role = new RoleInfo(set);
// TODO: Store information
rolesByIndex.put(role.getIndex(), role);
rolesBySkill.put(role.getQualifyingSkill(), role);
}
}
}
@@ -60,5 +78,18 @@ public final class PlayerRoleLoader extends DataLoader {
this.roleIcon = set.getText("role_icon");
this.qualifyingSkill = set.getText("qualifying_skill");
}
public int getIndex() {
return index;
}
public String getRoleIcon() {
return roleIcon;
}
public String getQualifyingSkill() {
return qualifyingSkill;
}
}
}

View File

@@ -29,14 +29,25 @@ package com.projectswg.holocore.resources.support.data.server_info.loader;
import com.projectswg.holocore.resources.support.data.server_info.SdbLoader;
import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public final class RoadmapRewardLoader extends DataLoader {
private final Map<String, RoadmapRewardInfo> rewardsBySkillName;
RoadmapRewardLoader() {
this.rewardsBySkillName = new HashMap<>();
}
@Nullable
public RoadmapRewardInfo getRewardBySkillName(String skillName) {
return rewardsBySkillName.get(skillName);
}
@Override
@@ -44,29 +55,71 @@ public final class RoadmapRewardLoader extends DataLoader {
try (SdbResultSet set = SdbLoader.load(new File("serverdata/roadmap/item_rewards.sdb"))) {
while (set.next()) {
RoadmapRewardInfo rewardInfo = new RoadmapRewardInfo(set);
// TODO: Store information
rewardsBySkillName.put(rewardInfo.getSkillName(), rewardInfo);
}
}
}
public static class RoadmapRewardInfo {
private final String roadmapTemplateName;
private final String roadmapSkillName;
private final String templateName;
private final String skillName;
private final String appearanceName;
private final String stringId;
private final String itemDefault;
private final String itemWookiee;
private final String itemIthorian;
private final String [] defaultItems;
private final String [] wookieeItems;
private final String [] ithorianItems;
public RoadmapRewardInfo(SdbResultSet set) {
this.roadmapTemplateName = set.getText("roadmap_template_name");
this.roadmapSkillName = set.getText("roadmap_skill_name");
this.templateName = set.getText("roadmap_template_name");
this.skillName = set.getText("roadmap_skill_name");
this.appearanceName = set.getText("appearance_name");
this.stringId = set.getText("string_id");
this.itemDefault = set.getText("item_default");
this.itemWookiee = set.getText("item_wookiee");
this.itemIthorian = set.getText("item_ithorian");
this.defaultItems = splitCsv(set.getText("item_default"));
this.wookieeItems = splitCsv(set.getText("item_wookiee"));
this.ithorianItems = splitCsv(set.getText("item_ithorian"));
}
@NotNull
public String getTemplateName() {
return templateName;
}
@NotNull
public String getSkillName() {
return skillName;
}
@NotNull
public String getAppearanceName() {
return appearanceName;
}
@NotNull
public String getStringId() {
return stringId;
}
@NotNull
public String[] getDefaultItems() {
return defaultItems.clone();
}
@NotNull
public String[] getWookieeItems() {
return wookieeItems.clone();
}
@NotNull
public String[] getIthorianItems() {
return ithorianItems.clone();
}
private static String [] splitCsv(String val) {
if (val.isBlank())
return new String[0];
return val.split(",");
}
}
}

View File

@@ -29,46 +29,95 @@ package com.projectswg.holocore.resources.support.data.server_info.loader;
import com.projectswg.holocore.resources.support.data.server_info.SdbLoader;
import com.projectswg.holocore.resources.support.data.server_info.SdbLoader.SdbResultSet;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public final class SkillTemplateLoader extends DataLoader {
private final Map<String, SkillTemplateInfo> templateFromName;
SkillTemplateLoader() {
this.templateFromName = new HashMap<>();
}
@Nullable
public SkillTemplateInfo getTemplateFromName(String name) {
return templateFromName.get(name);
}
@Override
public final void load() throws IOException {
try (SdbResultSet set = SdbLoader.load(new File("serverdata/skill/skill_template.sdb"))) {
while (set.next()) {
SkillTemplateInfo skillTemplate = new SkillTemplateInfo(set);
// TODO: Store information
SkillTemplateInfo templateInfo = new SkillTemplateInfo(set);
templateFromName.put(templateInfo.getName(), templateInfo);
}
}
}
public static class SkillTemplateInfo {
private final String templateName;
private final String startingTemplateName;
private final String strClassName;
private final int userInterfacePriority;
private final String template;
private final String name;
private final String startingName;
private final String className;
private final int uiPriority;
private final String [] templates;
private final boolean levelBased;
private final String expertiseTrees;
private final int respecAllowed;
private final boolean respecAllowed;
public SkillTemplateInfo(SdbResultSet set) {
this.templateName = set.getText("template_name");
this.startingTemplateName = set.getText("starting_template_name");
this.strClassName = set.getText("str_class_name");
this.userInterfacePriority = (int) set.getInt("user_interface_priority");
this.template = set.getText("template");
this.name = set.getText("template_name");
this.startingName = set.getText("starting_template_name");
this.className = set.getText("str_class_name");
this.uiPriority = (int) set.getInt("user_interface_priority");
this.templates = splitCsv(set.getText("template"));
this.levelBased = set.getBoolean("level_based");
this.expertiseTrees = set.getText("expertise_trees");
this.respecAllowed = (int) set.getInt("respec_allowed");
this.respecAllowed = set.getInt("respec_allowed") != 0;
}
public String getName() {
return name;
}
public String getStartingName() {
return startingName;
}
public String getClassName() {
return className;
}
public int getUiPriority() {
return uiPriority;
}
public String [] getTemplates() {
return templates.clone();
}
public boolean isLevelBased() {
return levelBased;
}
public String getExpertiseTrees() {
return expertiseTrees;
}
public boolean isRespecAllowed() {
return respecAllowed;
}
private static String [] splitCsv(String val) {
if (val.isBlank())
return new String[0];
return val.split(",");
}
}
}

View File

@@ -1,42 +1,22 @@
package com.projectswg.holocore.services.gameplay.player.experience;
import com.projectswg.common.data.swgfile.ClientFactory;
import com.projectswg.common.data.swgfile.visitors.DatatableData;
import com.projectswg.common.network.packets.SWGPacket;
import com.projectswg.common.network.packets.swg.zone.object_controller.ChangeRoleIconChoice;
import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent;
import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent.IntentType;
import com.projectswg.holocore.intents.support.global.network.InboundPacketIntent;
import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader;
import com.projectswg.holocore.resources.support.data.server_info.loader.PlayerRoleLoader.RoleInfo;
import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject;
import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject;
import me.joshlarson.jlcommon.control.IntentHandler;
import me.joshlarson.jlcommon.control.Service;
import me.joshlarson.jlcommon.log.Log;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ExperienceRoleService extends Service {
private final Map<Integer, Set<String>> roleIconMap;
public ExperienceRoleService() {
roleIconMap = new HashMap<>();
}
@Override
public boolean initialize() {
DatatableData roleIconTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/role/role.iff");
for (int i = 0; i < roleIconTable.getRowCount(); i++) {
int iconIndex = (int) roleIconTable.getCell(i, 0);
String qualifyingSkill = (String) roleIconTable.getCell(i, 2);
Set<String> qualifyingSkills = roleIconMap.computeIfAbsent(iconIndex, k -> new HashSet<>());
qualifyingSkills.add(qualifyingSkill);
}
return true;
}
@IntentHandler
@@ -48,8 +28,23 @@ public class ExperienceRoleService extends Service {
}
}
@IntentHandler
private void handleGrantSkillIntent(GrantSkillIntent gsi) {
if (gsi.getIntentType() != IntentType.GIVEN)
return;
RoleInfo qualifyingSkills = DataLoader.playerRoles().getRoleBySkill(gsi.getSkillName());
if (qualifyingSkills == null)
return;
PlayerObject playerObject = gsi.getTarget().getPlayerObject();
assert playerObject != null;
playerObject.setProfessionIcon(qualifyingSkills.getIndex());
}
private void changeRoleIcon(CreatureObject creature, int chosenIcon) {
Set<String> qualifyingSkills = roleIconMap.get(chosenIcon);
RoleInfo qualifyingSkills = DataLoader.playerRoles().getRoleByIndex(chosenIcon);
if (qualifyingSkills == null) {
Log.w("%s tried to use undefined role icon %d", creature, chosenIcon);
return;
@@ -57,13 +52,8 @@ public class ExperienceRoleService extends Service {
PlayerObject playerObject = creature.getPlayerObject();
assert playerObject != null;
for (String qualifyingSkill : qualifyingSkills) {
if (creature.hasSkill(qualifyingSkill)) {
playerObject.setProfessionIcon(chosenIcon);
return;
}
}
Log.e("%s could not be given role icon %d - does not have qualifying skill! Qualifying: %s", creature, chosenIcon, qualifyingSkills);
if (creature.hasSkill(qualifyingSkills.getQualifyingSkill()))
playerObject.setProfessionIcon(qualifyingSkills.getIndex());
}
}

View File

@@ -1,7 +1,6 @@
package com.projectswg.holocore.services.gameplay.player.experience.skills;
import com.projectswg.holocore.intents.gameplay.player.badge.SetTitleIntent;
import com.projectswg.holocore.intents.gameplay.player.experience.LevelChangedIntent;
import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent;
import com.projectswg.holocore.intents.gameplay.player.experience.skills.SkillModIntent;
import com.projectswg.holocore.resources.support.data.server_info.StandardLog;
@@ -10,6 +9,7 @@ import com.projectswg.holocore.resources.support.data.server_info.loader.SkillLo
import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject;
import me.joshlarson.jlcommon.control.IntentHandler;
import me.joshlarson.jlcommon.control.Service;
import me.joshlarson.jlcommon.log.Log;
public class SkillService extends Service {
@@ -26,6 +26,7 @@ public class SkillService extends Service {
String skillName = gsi.getSkillName();
CreatureObject target = gsi.getTarget();
SkillInfo skillData = DataLoader.skills().getSkillByName(skillName);
Log.t("skillData=%s", skillData);
if (skillData == null)
return;
@@ -60,11 +61,6 @@ public class SkillService extends Service {
sti.getRequester().setTitle(title);
}
@IntentHandler
private void handleLevelChangedIntent(LevelChangedIntent lci) {
}
private boolean hasRequiredSkills(SkillInfo skillData, CreatureObject creatureObject) {
String[] requiredSkills = skillData.getSkillsRequired();
if (requiredSkills == null)

View File

@@ -29,8 +29,6 @@ package com.projectswg.holocore.services.gameplay.player.experience.skills;
import com.projectswg.common.data.RGB;
import com.projectswg.common.data.encodables.oob.StringId;
import com.projectswg.common.data.encodables.tangible.Race;
import com.projectswg.common.data.swgfile.ClientFactory;
import com.projectswg.common.data.swgfile.visitors.DatatableData;
import com.projectswg.common.network.packets.swg.zone.PlayClientEffectObjectMessage;
import com.projectswg.common.network.packets.swg.zone.PlayMusicMessage;
import com.projectswg.common.network.packets.swg.zone.object_controller.ShowFlyText;
@@ -40,9 +38,11 @@ import com.projectswg.holocore.intents.gameplay.player.experience.LevelChangedIn
import com.projectswg.holocore.intents.gameplay.player.experience.skills.GrantSkillIntent;
import com.projectswg.holocore.intents.support.objects.items.CreateStaticItemIntent;
import com.projectswg.holocore.intents.support.objects.swg.ObjectCreatedIntent;
import com.projectswg.holocore.resources.support.data.server_info.loader.DataLoader;
import com.projectswg.holocore.resources.support.data.server_info.loader.RoadmapRewardLoader.RoadmapRewardInfo;
import com.projectswg.holocore.resources.support.data.server_info.loader.SkillTemplateLoader.SkillTemplateInfo;
import com.projectswg.holocore.resources.support.global.player.Player;
import com.projectswg.holocore.resources.support.objects.ObjectCreator;
import com.projectswg.holocore.resources.support.objects.items.RoadmapReward;
import com.projectswg.holocore.resources.support.objects.swg.SWGObject;
import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject;
import com.projectswg.holocore.resources.support.objects.swg.player.PlayerObject;
@@ -52,10 +52,7 @@ import me.joshlarson.jlcommon.control.IntentHandler;
import me.joshlarson.jlcommon.control.Service;
import me.joshlarson.jlcommon.log.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
/**
* This is a service that listens for {@link LevelChangedIntent} and grants
@@ -64,14 +61,9 @@ import java.util.Map;
*/
public final class SkillTemplateService extends Service {
private final Map<String, String[]> skillTemplates;
private final Map<String, RoadmapReward> rewards;
private final Map<String, String[]> badgeNames;
public SkillTemplateService() {
skillTemplates = new HashMap<>();
rewards = new HashMap<>();
badgeNames = new HashMap<>();
badgeNames.put("bounty_hunter_1a", new String[]{"new_prof_bountyhunter_master"});
badgeNames.put("commando_1a", new String[]{"new_prof_commando_master"});
@@ -87,22 +79,6 @@ public final class SkillTemplateService extends Service {
badgeNames.put("trader_0c", new String[]{"new_prof_crafting_merchant_master", "new_prof_crafting_artisan_master", "new_prof_crafting_armorsmith_master", "new_prof_crafting_weaponsmith_master"});
badgeNames.put("trader_0d", new String[]{"new_prof_crafting_merchant_master", "new_prof_crafting_artisan_master", "new_prof_crafting_droidengineer_master"});
}
@Override
public boolean initialize() {
DatatableData skillTemplateTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/skill_template/skill_template.iff");
for (int row = 0; row < skillTemplateTable.getRowCount(); row++) {
String profession = (String) skillTemplateTable.getCell(row, 0);
String[] templates = ((String) skillTemplateTable.getCell(row, 4)).split(",");
skillTemplates.put(profession, templates);
}
loadRewardItemsIff();
return super.initialize();
}
@IntentHandler
private void handleLevelChangedIntent(LevelChangedIntent lci) {
@@ -115,10 +91,10 @@ public final class SkillTemplateService extends Service {
for (int level = oldLevel + 1; level <= newLevel; level++) {
// Skills are only awarded every third or fourth level
if ((level == 4 || level == 7 || level == 10) || ((level > 10) && (((level - 10) % 4) == 0))) {
if ((level == 1 || level == 4 || level == 7 || level == 10) || ((level > 10) && (((level - 10) % 4) == 0))) {
PlayerObject playerObject = creatureObject.getPlayerObject();
Profession profession = playerObject.getProfession();
String[] templates = skillTemplates.get(profession.getClientName());
SkillTemplateInfo templates = DataLoader.skillTemplates().getTemplateFromName(profession.getClientName());
if (templates == null) {
Log.w("%s tried to level up to %d with invalid profession %s", creatureObject, level, profession);
@@ -127,7 +103,7 @@ public final class SkillTemplateService extends Service {
int skillIndex = (level <= 10) ? ((level - 1) / 3) : (((level - 10) / 4) + 3);
String skillName = templates[skillIndex];
String skillName = templates.getTemplates()[skillIndex];
new GrantSkillIntent(GrantSkillIntent.IntentType.GRANT, skillName, creatureObject, true).broadcast();
playerObject.setProfWheelPosition(skillName);
@@ -161,57 +137,37 @@ public final class SkillTemplateService extends Service {
}
private void giveRewardItems(CreatureObject creatureObject, String skillName) {
RoadmapReward reward = rewards.get(skillName);
RoadmapRewardInfo reward = DataLoader.roadmapRewards().getRewardBySkillName(skillName);
if (reward == null)
return; // No reward to give
Race characterRace = creatureObject.getRace();
String species = characterRace.getSpecies().toUpperCase();
String species = characterRace.getSpecies().toUpperCase(Locale.US);
SWGObject inventory = creatureObject.getSlottedObject("inventory");
String[] items;
if (reward.hasItems() || reward.isUniversalReward()) {
if (reward.isUniversalReward())
items = reward.getDefaultRewardItems();
else if (species.equals("ITHORIAN"))
items = reward.getIthorianRewardItems();
else if (species.equals("WOOKIEE"))
items = reward.getWookieeRewardItems();
else
items = reward.getDefaultRewardItems();
if (species.equals("ITHORIAN") && reward.getIthorianItems().length > 0)
items = reward.getIthorianItems();
else if (species.equals("WOOKIEE") && reward.getWookieeItems().length > 0)
items = reward.getWookieeItems();
else
items = reward.getDefaultItems();
Collection<String> staticItems = new ArrayList<>();
for (String item : items) {
if (item.endsWith(".iff")) {
SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(ClientFactory.formatToSharedFile(item));
if (nonStaticItem != null) {
nonStaticItem.moveToContainer(inventory);
}
new ObjectCreatedIntent(nonStaticItem).broadcast();
} else {
staticItems.add(item);
}
}
// No reason to broadcast this intent if we don't need new static items anyways
if (!staticItems.isEmpty())
new CreateStaticItemIntent(creatureObject, inventory, new StaticItemService.LootBoxHandler(creatureObject), staticItems.toArray(new String[0])).broadcast();
}
}
private void loadRewardItemsIff() {
DatatableData rewardsTable = (DatatableData) ClientFactory.getInfoFromFile("datatables/roadmap/item_rewards.iff");
Collection<String> staticItems = new ArrayList<>();
for (int row = 0; row < rewardsTable.getRowCount(); row++) {
String roadmapTemplate = rewardsTable.getCell(row, 0).toString();
String roadmapSkillName = rewardsTable.getCell(row, 1).toString();
String appearanceName = rewardsTable.getCell(row, 2).toString();
String stringId = rewardsTable.getCell(row, 3).toString();
String itemDefault = rewardsTable.getCell(row, 4).toString();
String itemWookiee = rewardsTable.getCell(row, 5).toString();
String itemIthorian = rewardsTable.getCell(row, 6).toString();
rewards.put(roadmapSkillName, new RoadmapReward(roadmapTemplate, roadmapSkillName, appearanceName, stringId, itemDefault, itemWookiee, itemIthorian));
for (String item : items) {
if (item.endsWith(".iff")) {
SWGObject nonStaticItem = ObjectCreator.createObjectFromTemplate(item);
nonStaticItem.moveToContainer(inventory);
new ObjectCreatedIntent(nonStaticItem).broadcast();
} else {
staticItems.add(item);
}
}
// No reason to broadcast this intent if we don't need new static items anyways
if (!staticItems.isEmpty())
new CreateStaticItemIntent(creatureObject, inventory, new StaticItemService.LootBoxHandler(creatureObject), staticItems.toArray(String[]::new)).broadcast();
}
private void grantMasteryBadge(CreatureObject creature, Profession profession, String skillName) {

View File

@@ -0,0 +1,58 @@
/***********************************************************************************
* Copyright (c) 2019 /// Project SWG /// www.projectswg.com *
* *
* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on *
* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. *
* Our goal is to create an emulator which will provide a server for players to *
* continue playing a game similar to the one they used to play. We are basing *
* it on the final publish of the game prior to end-game events. *
* *
* This file is part of Holocore. *
* *
* --------------------------------------------------------------------------------*
* *
* Holocore is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Affero General Public License as *
* published by the Free Software Foundation, either version 3 of the *
* License, or (at your option) any later version. *
* *
* Holocore is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Affero General Public License for more details. *
* *
* You should have received a copy of the GNU Affero General Public License *
* along with Holocore. If not, see <http://www.gnu.org/licenses/>. *
***********************************************************************************/
package com.projectswg.holocore.services.gameplay.player.experience;
import com.projectswg.holocore.intents.gameplay.player.experience.LevelChangedIntent;
import com.projectswg.holocore.resources.support.objects.swg.player.Profession;
import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillService;
import com.projectswg.holocore.services.gameplay.player.experience.skills.SkillTemplateService;
import com.projectswg.holocore.test.resources.GenericCreatureObject;
import com.projectswg.holocore.test.runners.TestRunnerSynchronousIntents;
import org.junit.Assert;
import org.junit.Test;
public class TestSkillTemplateService extends TestRunnerSynchronousIntents {
@Test
public void testStartingProfessionIcon() {
registerService(new SkillService());
registerService(new SkillTemplateService());
registerService(new ExperienceRoleService());
GenericCreatureObject creature = new GenericCreatureObject(1);
creature.setLevel(0);
creature.getPlayerObject().setProfession(Profession.SMUGGLER);
Assert.assertEquals(0, creature.getPlayerObject().getProfessionIcon());
creature.setLevel(1);
broadcastAndWait(new LevelChangedIntent(creature, (short) 0, (short) 1));
Assert.assertEquals(25, creature.getPlayerObject().getProfessionIcon());
Assert.assertTrue(creature.getSkills().contains("class_smuggler_phase1_novice"));
}
}