Skip to content

Commit 6b83ccc

Browse files
committed
Merge pull request #369 from Zegeri/development
Fix pan, move frequency and delayed deallocation with multiple parallel interpreters
2 parents d66a99b + 223a5a1 commit 6b83ccc

File tree

6 files changed

+58
-62
lines changed

6 files changed

+58
-62
lines changed

src/game_commonevent.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@ void Game_CommonEvent::Refresh() {
5151
: static_cast<Game_Interpreter*>(new Game_Interpreter_Map()));
5252
Update();
5353
}
54-
} else {
55-
interpreter.reset();
54+
return;
5655
}
57-
} else {
56+
}
57+
if (interpreter) {
58+
interpreter->Clear();
59+
Game_Map::ReserveInterpreterDeletion(interpreter);
5860
interpreter.reset();
5961
}
6062
}
@@ -63,13 +65,11 @@ void Game_CommonEvent::Update() {
6365
CheckEventTriggerAuto();
6466

6567
if (interpreter) {
66-
Game_Map::SetParallelInterpreter(interpreter);
6768
if (!interpreter->IsRunning()) {
6869
interpreter->Setup(GetList(), 0, -common_event_id, -2);
6970
} else {
7071
interpreter->Update();
7172
}
72-
Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter>());
7373
}
7474
}
7575

src/game_event.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ void Game_Event::ClearStarting() {
241241
void Game_Event::Setup(RPG::EventPage* new_page) {
242242
page = new_page;
243243

244+
// Free resources if needed
245+
if (interpreter) {
246+
interpreter->Clear();
247+
Game_Map::ReserveInterpreterDeletion(interpreter);
248+
interpreter.reset();
249+
}
250+
244251
if (page == NULL) {
245252
tile_id = 0;
246253
SetSpriteName("");
@@ -249,7 +256,6 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
249256
//move_type = 0;
250257
trigger = -1;
251258
list.clear();
252-
interpreter.reset();
253259
return;
254260
}
255261
SetSpriteName(page->character_name);
@@ -270,6 +276,7 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
270276
move_type = page->move_type;
271277
SetMoveSpeed(page->move_speed);
272278
SetMoveFrequency(page->move_frequency);
279+
original_move_frequency = page->move_frequency;
273280
original_move_route = page->move_route;
274281
SetOriginalMoveRouteIndex(0);
275282
animation_type = page->animation_type;
@@ -279,11 +286,6 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
279286
trigger = page->trigger;
280287
list = page->event_commands;
281288

282-
// Free resources if needed
283-
if (interpreter) {
284-
interpreter->Clear();
285-
interpreter.reset();
286-
}
287289
if (trigger == RPG::EventPage::Trigger_parallel) {
288290
interpreter.reset(new Game_Interpreter_Map());
289291
}
@@ -494,13 +496,11 @@ void Game_Event::Update() {
494496
CheckEventTriggerAuto();
495497

496498
if (interpreter) {
497-
Game_Map::SetParallelInterpreter(interpreter);
498499
if (!interpreter->IsRunning()) {
499500
interpreter->Setup(list, event.ID, -event.x, event.y);
500501
} else {
501502
interpreter->Update();
502503
}
503-
Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter>());
504504
}
505505
}
506506

src/game_map.cpp

+5-8
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace {
6363
int scroll_speed;
6464

6565
boost::scoped_ptr<Game_Interpreter> interpreter;
66-
EASYRPG_SHARED_PTR<Game_Interpreter> parallel_interpreter;
66+
std::vector<EASYRPG_SHARED_PTR<Game_Interpreter> > free_interpreters;
6767
Game_Vehicle* vehicles[3];
6868

6969
bool pan_locked;
@@ -229,7 +229,6 @@ void Game_Map::SetupCommon(int _id) {
229229
for (int i = 0; i < 3; i++)
230230
vehicles[i]->Refresh();
231231

232-
pan_locked = false;
233232
pan_wait = false;
234233
pan_speed = 0;
235234

@@ -306,12 +305,8 @@ Game_Interpreter& Game_Map::GetInterpreter() {
306305
return *interpreter;
307306
}
308307

309-
EASYRPG_SHARED_PTR<Game_Interpreter> Game_Map::GetParallelInterpreter() {
310-
return parallel_interpreter;
311-
}
312-
313-
void Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter) {
314-
parallel_interpreter = interpreter;
308+
void Game_Map::ReserveInterpreterDeletion(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter) {
309+
free_interpreters.push_back(interpreter);
315310
}
316311

317312
void Game_Map::ScrollDown(int distance) {
@@ -679,6 +674,8 @@ void Game_Map::Update() {
679674

680675
for (int i = 0; i < 3; ++i)
681676
vehicles[i]->Update();
677+
678+
free_interpreters.clear();
682679
}
683680

684681
RPG::Map const& Game_Map::GetMap() {

src/game_map.h

+3-11
Original file line numberDiff line numberDiff line change
@@ -392,19 +392,11 @@ namespace Game_Map {
392392
Game_Interpreter& GetInterpreter();
393393

394394
/**
395-
* Gets the currently running parallel interpreter.
395+
* Destroy an interpreter after all events and common events have been updated.
396396
*
397-
* @return running parallel interpreter.
397+
* @param interpreter to destroy.
398398
*/
399-
EASYRPG_SHARED_PTR<Game_Interpreter> GetParallelInterpreter();
400-
401-
/**
402-
* Sets the currently running parallel interpreter.
403-
* Used to hold a 2nd stromg reference to prevent destruction on refresh.
404-
*
405-
* @param interpreter executed interpreter.
406-
*/
407-
void SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter);
399+
void ReserveInterpreterDeletion(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter);
408400

409401
/**
410402
* Sets the need refresh flag.

src/game_player.cpp

+36-30
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ Game_Player::Game_Player():
3636
vehicle_getting_off(false),
3737
new_map_id(0),
3838
new_x(0),
39-
new_y(0) {
39+
new_y(0),
40+
last_pan_x(0),
41+
last_pan_y(0) {
4042
SetDirection(RPG::EventPage::Direction_down);
4143
SetMoveSpeed(4);
4244
}
@@ -199,6 +201,8 @@ void Game_Player::ReserveTeleport(int map_id, int x, int y) {
199201
new_map_id = map_id;
200202
new_x = x;
201203
new_y = y;
204+
last_pan_x = 0;
205+
last_pan_y = 0;
202206
}
203207

204208
void Game_Player::StartTeleport() {
@@ -225,8 +229,8 @@ bool Game_Player::IsTeleporting() const {
225229
}
226230

227231
void Game_Player::Center(int x, int y) {
228-
int center_x = (DisplayUi->GetWidth() / ( TILE_SIZE / 16) - TILE_SIZE * 2) * 8;
229-
int center_y = (DisplayUi->GetHeight() / (TILE_SIZE / 16) - TILE_SIZE) * 8;
232+
int center_x = (DisplayUi->GetWidth() / (TILE_SIZE / 16) - TILE_SIZE * 2) * 8 - Game_Map::GetPanX();
233+
int center_y = (DisplayUi->GetHeight() / (TILE_SIZE / 16) - TILE_SIZE) * 8 - Game_Map::GetPanY();
230234
int max_x = (Game_Map::GetWidth() - DisplayUi->GetWidth() / TILE_SIZE) * (SCREEN_TILE_WIDTH);
231235
int max_y = (Game_Map::GetHeight() - DisplayUi->GetHeight() / TILE_SIZE) * (SCREEN_TILE_WIDTH);
232236
Game_Map::SetDisplayX(max(0, min((x * SCREEN_TILE_WIDTH - center_x), max_x)));
@@ -248,36 +252,38 @@ void Game_Player::MoveTo(int x, int y) {
248252
}
249253

250254
void Game_Player::UpdateScroll(int last_real_x, int last_real_y) {
251-
int center_x = (DisplayUi->GetWidth() / (TILE_SIZE / 16) - TILE_SIZE * 2) * 8;
252-
int center_y = (DisplayUi->GetHeight() / (TILE_SIZE / 16) - TILE_SIZE) * 8;
255+
int center_x = (DisplayUi->GetWidth() / (TILE_SIZE / 16) - TILE_SIZE * 2) * 8 - Game_Map::GetPanX();
256+
int center_y = (DisplayUi->GetHeight() / (TILE_SIZE / 16) - TILE_SIZE) * 8 - Game_Map::GetPanY();
257+
int dx = 0;
258+
int dy = 0;
259+
260+
if (!Game_Map::IsPanLocked()) {
261+
if ((real_x > last_real_x && real_x - Game_Map::GetDisplayX() > center_x) ||
262+
(real_x < last_real_x && real_x - Game_Map::GetDisplayX() < center_x)) {
263+
dx = real_x - last_real_x;
264+
}
265+
if ((real_y > last_real_y && real_y - Game_Map::GetDisplayY() > center_y) ||
266+
(real_y < last_real_y && real_y - Game_Map::GetDisplayY() < center_y)) {
267+
dy = real_y - last_real_y;
268+
}
269+
}
253270

254-
if (Game_Map::IsPanLocked())
255-
return;
271+
if (Game_Map::GetPanX() != last_pan_x || Game_Map::GetPanY() != last_pan_y) {
272+
dx += Game_Map::GetPanX() - last_pan_x;
273+
dy += Game_Map::GetPanY() - last_pan_y;
256274

257-
if (Game_Map::GetPanX() != 0 || Game_Map::GetPanY() != 0) {
258-
int dx = real_x - center_x + Game_Map::GetPanX() - Game_Map::GetDisplayX();
259-
int dy = real_y - center_y + Game_Map::GetPanY() - Game_Map::GetDisplayY();
260-
if (dx > 0)
261-
Game_Map::ScrollRight(dx);
262-
if (dx < 0)
263-
Game_Map::ScrollLeft(-dx);
264-
if (dy > 0)
265-
Game_Map::ScrollDown(dy);
266-
if (dy < 0)
267-
Game_Map::ScrollUp(-dy);
268-
} else {
269-
if (real_y > last_real_y && real_y - Game_Map::GetDisplayY() > center_y)
270-
Game_Map::ScrollDown(real_y - last_real_y);
271-
272-
if (real_x < last_real_x && real_x - Game_Map::GetDisplayX() < center_x)
273-
Game_Map::ScrollLeft(last_real_x - real_x);
274-
275-
if (real_x > last_real_x && real_x - Game_Map::GetDisplayX() > center_x)
276-
Game_Map::ScrollRight(real_x - last_real_x);
277-
278-
if (real_y < last_real_y && real_y - Game_Map::GetDisplayY() < center_y)
279-
Game_Map::ScrollUp(last_real_y - real_y);
275+
last_pan_x = Game_Map::GetPanX();
276+
last_pan_y = Game_Map::GetPanY();
280277
}
278+
279+
if (dx > 0)
280+
Game_Map::ScrollRight(dx);
281+
else if (dx < 0)
282+
Game_Map::ScrollLeft(-dx);
283+
if (dy > 0)
284+
Game_Map::ScrollDown(dy);
285+
else if (dy < 0)
286+
Game_Map::ScrollUp(-dy);
281287
}
282288

283289
void Game_Player::Update() {

src/game_player.h

+1
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class Game_Player : public Game_Character {
102102
bool vehicle_getting_on;
103103
bool vehicle_getting_off;
104104
int new_map_id, new_x, new_y;
105+
int last_pan_x, last_pan_y;
105106
RPG::Music walking_bgm;
106107

107108
void UpdateScroll(int last_real_x, int last_real_y);

0 commit comments

Comments
 (0)