about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ap_state.cpp23
-rw-r--r--src/ap_state.h9
-rw-r--r--src/connection_dialog.cpp8
-rw-r--r--src/game_data.cpp20
-rw-r--r--src/game_data.h2
-rw-r--r--src/tracker_panel.h2
-rw-r--r--src/tracker_state.cpp36
7 files changed, 88 insertions, 12 deletions
diff --git a/src/ap_state.cpp b/src/ap_state.cpp index bdd9cb2..1ac6575 100644 --- a/src/ap_state.cpp +++ b/src/ap_state.cpp
@@ -67,8 +67,10 @@ struct APState {
67 bool pilgrimage_allows_roof_access = false; 67 bool pilgrimage_allows_roof_access = false;
68 bool pilgrimage_allows_paintings = false; 68 bool pilgrimage_allows_paintings = false;
69 SunwarpAccess sunwarp_access = kSUNWARP_ACCESS_NORMAL; 69 SunwarpAccess sunwarp_access = kSUNWARP_ACCESS_NORMAL;
70 bool sunwarp_shuffle = false;
70 71
71 std::map<std::string, std::string> painting_mapping; 72 std::map<std::string, std::string> painting_mapping;
73 std::map<int, SunwarpMapping> sunwarp_mapping;
72 74
73 void Connect(std::string server, std::string player, std::string password) { 75 void Connect(std::string server, std::string player, std::string password) {
74 if (!initialized) { 76 if (!initialized) {
@@ -140,6 +142,8 @@ struct APState {
140 pilgrimage_allows_roof_access = false; 142 pilgrimage_allows_roof_access = false;
141 pilgrimage_allows_paintings = false; 143 pilgrimage_allows_paintings = false;
142 sunwarp_access = kSUNWARP_ACCESS_NORMAL; 144 sunwarp_access = kSUNWARP_ACCESS_NORMAL;
145 sunwarp_shuffle = false;
146 sunwarp_mapping.clear();
143 147
144 connected = false; 148 connected = false;
145 has_connection_result = false; 149 has_connection_result = false;
@@ -251,6 +255,7 @@ struct APState {
251 slot_data.contains("pilgrimage_allows_paintings") && 255 slot_data.contains("pilgrimage_allows_paintings") &&
252 slot_data["pilgrimage_allows_paintings"].get<int>() == 1; 256 slot_data["pilgrimage_allows_paintings"].get<int>() == 1;
253 sunwarp_access = slot_data["sunwarp_access"].get<SunwarpAccess>(); 257 sunwarp_access = slot_data["sunwarp_access"].get<SunwarpAccess>();
258 sunwarp_shuffle = slot_data["shuffle_sunwarps"].get<int>() == 1;
254 259
255 if (painting_shuffle && slot_data.contains("painting_entrance_to_exit")) { 260 if (painting_shuffle && slot_data.contains("painting_entrance_to_exit")) {
256 painting_mapping.clear(); 261 painting_mapping.clear();
@@ -261,6 +266,18 @@ struct APState {
261 } 266 }
262 } 267 }
263 268
269 if (sunwarp_shuffle && slot_data.contains("sunwarp_permutation")) {
270 std::vector<int> inverted_sunwarps;
271 for (const auto& item : slot_data["sunwarp_permutation"]) {
272 inverted_sunwarps.push_back(item);
273 }
274
275 for (int i = 0; i < 6; i++) {
276 sunwarp_mapping[inverted_sunwarps[i]] = SunwarpMapping{
277 .dots = i + 1, .exit_index = inverted_sunwarps[i + 6]};
278 }
279 }
280
264 connected = true; 281 connected = true;
265 has_connection_result = true; 282 has_connection_result = true;
266 283
@@ -474,4 +491,10 @@ bool AP_DoesPilgrimageAllowPaintings() {
474 491
475SunwarpAccess AP_GetSunwarpAccess() { return GetState().sunwarp_access; } 492SunwarpAccess AP_GetSunwarpAccess() { return GetState().sunwarp_access; }
476 493
494bool AP_IsSunwarpShuffle() { return GetState().sunwarp_shuffle; }
495
496const std::map<int, SunwarpMapping>& AP_GetSunwarpMapping() {
497 return GetState().sunwarp_mapping;
498}
499
477bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); } 500bool AP_HasReachedGoal() { return GetState().HasReachedGoal(); }
diff --git a/src/ap_state.h b/src/ap_state.h index e1f34c7..36694b2 100644 --- a/src/ap_state.h +++ b/src/ap_state.h
@@ -31,6 +31,11 @@ enum SunwarpAccess {
31 kSUNWARP_ACCESS_PROGRESSIVE = 4 31 kSUNWARP_ACCESS_PROGRESSIVE = 4
32}; 32};
33 33
34struct SunwarpMapping {
35 int dots;
36 int exit_index;
37};
38
34void AP_SetTrackerFrame(TrackerFrame* tracker_frame); 39void AP_SetTrackerFrame(TrackerFrame* tracker_frame);
35 40
36void AP_Connect(std::string server, std::string player, std::string password); 41void AP_Connect(std::string server, std::string player, std::string password);
@@ -69,6 +74,10 @@ bool AP_DoesPilgrimageAllowPaintings();
69 74
70SunwarpAccess AP_GetSunwarpAccess(); 75SunwarpAccess AP_GetSunwarpAccess();
71 76
77bool AP_IsSunwarpShuffle();
78
79const std::map<int, SunwarpMapping>& AP_GetSunwarpMapping();
80
72bool AP_HasReachedGoal(); 81bool AP_HasReachedGoal();
73 82
74#endif /* end of include guard: AP_STATE_H_664A4180 */ 83#endif /* end of include guard: AP_STATE_H_664A4180 */
diff --git a/src/connection_dialog.cpp b/src/connection_dialog.cpp index 9dd9984..45be8b8 100644 --- a/src/connection_dialog.cpp +++ b/src/connection_dialog.cpp
@@ -4,10 +4,10 @@
4 4
5ConnectionDialog::ConnectionDialog() 5ConnectionDialog::ConnectionDialog()
6 : wxDialog(nullptr, wxID_ANY, "Connect to Archipelago") { 6 : wxDialog(nullptr, wxID_ANY, "Connect to Archipelago") {
7 server_box_ = new wxTextCtrl(this, -1, GetTrackerConfig().ap_server, wxDefaultPosition, 7 server_box_ = new wxTextCtrl(this, -1, GetTrackerConfig().ap_server,
8 {300, -1}); 8 wxDefaultPosition, {300, -1});
9 player_box_ = new wxTextCtrl(this, -1, GetTrackerConfig().ap_player, wxDefaultPosition, 9 player_box_ = new wxTextCtrl(this, -1, GetTrackerConfig().ap_player,
10 {300, -1}); 10 wxDefaultPosition, {300, -1});
11 password_box_ = new wxTextCtrl(this, -1, GetTrackerConfig().ap_password, 11 password_box_ = new wxTextCtrl(this, -1, GetTrackerConfig().ap_password,
12 wxDefaultPosition, {300, -1}); 12 wxDefaultPosition, {300, -1});
13 13
diff --git a/src/game_data.cpp b/src/game_data.cpp index 75c5b7e..7db6413 100644 --- a/src/game_data.cpp +++ b/src/game_data.cpp
@@ -53,6 +53,7 @@ struct GameData {
53 std::vector<int> door_definition_order_; 53 std::vector<int> door_definition_order_;
54 54
55 std::map<std::string, int> room_by_painting_; 55 std::map<std::string, int> room_by_painting_;
56 std::map<int, int> room_by_sunwarp_;
56 57
57 std::vector<int> achievement_panels_; 58 std::vector<int> achievement_panels_;
58 59
@@ -112,7 +113,8 @@ struct GameData {
112 if (option["room"]) { 113 if (option["room"]) {
113 door_room = option["room"].as<std::string>(); 114 door_room = option["room"].as<std::string>();
114 } 115 }
115 exit_obj.door = AddOrGetDoor(door_room, option["door"].as<std::string>()); 116 exit_obj.door =
117 AddOrGetDoor(door_room, option["door"].as<std::string>());
116 } 118 }
117 119
118 if (option["painting"] && option["painting"].as<bool>()) { 120 if (option["painting"] && option["painting"].as<bool>()) {
@@ -443,6 +445,18 @@ struct GameData {
443 } 445 }
444 } 446 }
445 447
448 if (room_it.second["sunwarps"]) {
449 for (const auto &sunwarp : room_it.second["sunwarps"]) {
450 int index = sunwarp["dots"].as<int>() - 1;
451 if (sunwarp["direction"].as<std::string>() == "exit") {
452 index += 6;
453 }
454
455 rooms_[room_id].sunwarps.push_back(index);
456 room_by_sunwarp_[index] = room_id;
457 }
458 }
459
446 if (room_it.second["progression"]) { 460 if (room_it.second["progression"]) {
447 for (const auto &progression_it : room_it.second["progression"]) { 461 for (const auto &progression_it : room_it.second["progression"]) {
448 std::string progressive_item_name = 462 std::string progressive_item_name =
@@ -686,3 +700,7 @@ int GD_GetItemIdForColor(LingoColor color) {
686const std::vector<int> &GD_GetSunwarpDoors() { 700const std::vector<int> &GD_GetSunwarpDoors() {
687 return GetState().sunwarp_doors_; 701 return GetState().sunwarp_doors_;
688} 702}
703
704int GD_GetRoomForSunwarp(int index) {
705 return GetState().room_by_sunwarp_.at(index);
706}
diff --git a/src/game_data.h b/src/game_data.h index 16d006c..cd09627 100644 --- a/src/game_data.h +++ b/src/game_data.h
@@ -94,6 +94,7 @@ struct Room {
94 std::string name; 94 std::string name;
95 std::vector<Exit> exits; 95 std::vector<Exit> exits;
96 std::vector<PaintingExit> paintings; 96 std::vector<PaintingExit> paintings;
97 std::vector<int> sunwarps;
97 std::vector<int> panels; 98 std::vector<int> panels;
98}; 99};
99 100
@@ -129,5 +130,6 @@ int GD_GetRoomForPainting(const std::string& painting_id);
129const std::vector<int>& GD_GetAchievementPanels(); 130const std::vector<int>& GD_GetAchievementPanels();
130int GD_GetItemIdForColor(LingoColor color); 131int GD_GetItemIdForColor(LingoColor color);
131const std::vector<int>& GD_GetSunwarpDoors(); 132const std::vector<int>& GD_GetSunwarpDoors();
133int GD_GetRoomForSunwarp(int index);
132 134
133#endif /* end of include guard: GAME_DATA_H_9C42AC51 */ 135#endif /* end of include guard: GAME_DATA_H_9C42AC51 */
diff --git a/src/tracker_panel.h b/src/tracker_panel.h index cb4f082..2dc034c 100644 --- a/src/tracker_panel.h +++ b/src/tracker_panel.h
@@ -25,7 +25,7 @@ class TrackerPanel : public wxPanel {
25 int real_y2 = 0; 25 int real_y2 = 0;
26 bool active = true; 26 bool active = true;
27 }; 27 };
28 28
29 void OnPaint(wxPaintEvent &event); 29 void OnPaint(wxPaintEvent &event);
30 void OnMouseMove(wxMouseEvent &event); 30 void OnMouseMove(wxMouseEvent &event);
31 31
diff --git a/src/tracker_state.cpp b/src/tracker_state.cpp index 5a99254..0101e98 100644 --- a/src/tracker_state.cpp +++ b/src/tracker_state.cpp
@@ -85,10 +85,17 @@ class StateCalculator {
85 85
86 const Room& room_obj = GD_GetRoom(room_exit.destination_room); 86 const Room& room_obj = GD_GetRoom(room_exit.destination_room);
87 for (const Exit& out_edge : room_obj.exits) { 87 for (const Exit& out_edge : room_obj.exits) {
88 if (out_edge.type != EntranceType::kPainting || 88 if (out_edge.type == EntranceType::kPainting &&
89 !AP_IsPaintingShuffle()) { 89 AP_IsPaintingShuffle()) {
90 new_boundary.push_back(out_edge); 90 continue;
91 } 91 }
92
93 if (out_edge.type == EntranceType::kSunwarp &&
94 AP_IsSunwarpShuffle()) {
95 continue;
96 }
97
98 new_boundary.push_back(out_edge);
92 } 99 }
93 100
94 if (AP_IsPaintingShuffle()) { 101 if (AP_IsPaintingShuffle()) {
@@ -104,6 +111,21 @@ class StateCalculator {
104 } 111 }
105 } 112 }
106 113
114 if (AP_IsSunwarpShuffle()) {
115 for (int index : room_obj.sunwarps) {
116 if (AP_GetSunwarpMapping().count(index)) {
117 const SunwarpMapping& sm = AP_GetSunwarpMapping().at(index);
118
119 Exit sunwarp_exit;
120 sunwarp_exit.destination_room =
121 GD_GetRoomForSunwarp(sm.exit_index);
122 sunwarp_exit.door = GD_GetSunwarpDoors().at(sm.dots - 1);
123
124 new_boundary.push_back(sunwarp_exit);
125 }
126 }
127 }
128
107 if (AP_HasEarlyColorHallways() && room_obj.name == "Starting Room") { 129 if (AP_HasEarlyColorHallways() && room_obj.name == "Starting Room") {
108 new_boundary.push_back( 130 new_boundary.push_back(
109 {.destination_room = GD_GetRoomByName("Outside The Undeterred"), 131 {.destination_room = GD_GetRoomByName("Outside The Undeterred"),
@@ -139,12 +161,14 @@ class StateCalculator {
139 161
140 const std::set<int>& GetReachableRooms() const { return reachable_rooms_; } 162 const std::set<int>& GetReachableRooms() const { return reachable_rooms_; }
141 163
142 const std::map<int, Decision>& GetDoorDecisions() const { return door_decisions_; } 164 const std::map<int, Decision>& GetDoorDecisions() const {
165 return door_decisions_;
166 }
143 167
144 const std::set<int>& GetSolveablePanels() const { return solveable_panels_; } 168 const std::set<int>& GetSolveablePanels() const { return solveable_panels_; }
145 169
146 private: 170 private:
147 Decision IsNonGroupedDoorReachable(const Door& door_obj) { 171 Decision IsNonGroupedDoorReachable(const Door& door_obj) {
148 bool has_item = AP_HasItem(door_obj.ap_item_id); 172 bool has_item = AP_HasItem(door_obj.ap_item_id);
149 173
150 if (!has_item) { 174 if (!has_item) {
@@ -209,7 +233,7 @@ class StateCalculator {
209 if (result != kMaybe) { 233 if (result != kMaybe) {
210 door_decisions_[door_id] = result; 234 door_decisions_[door_id] = result;
211 } 235 }
212 236
213 return result; 237 return result;
214 } 238 }
215 239