Skip to content

Commit 5a4f627

Browse files
committed
Merge pull request #325 from Ghabry/development
Parallel Event segfaulting
2 parents 36c228d + 9a6c891 commit 5a4f627

File tree

9 files changed

+61
-23
lines changed

9 files changed

+61
-23
lines changed

src/game_character.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ bool Game_Character::IsPassable(int x, int y, int d) const {
9494
if (!Game_Map::IsValid(new_x, new_y))
9595
return false;
9696

97-
if (through) return true;
97+
if (GetThrough()) return true;
9898

9999
if (!Game_Map::IsPassable(x, y, d, this))
100100
return false;
@@ -116,7 +116,7 @@ bool Game_Character::IsLandable(int x, int y) const
116116
if (!Game_Map::IsValid(x, y))
117117
return false;
118118

119-
if (through) return true;
119+
if (GetThrough()) return true;
120120

121121
if (!Game_Map::IsLandable(x, y, this))
122122
return false;

src/game_character.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -646,7 +646,7 @@ class Game_Character {
646646
*
647647
* @return through flag.
648648
*/
649-
bool GetThrough() const;
649+
virtual bool GetThrough() const;
650650

651651
/**
652652
* Gets animation ID.

src/game_commonevent.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,12 @@
2525

2626
Game_CommonEvent::Game_CommonEvent(int common_event_id, bool battle) :
2727
common_event_id(common_event_id),
28-
battle(battle),
29-
interpreter(NULL) {
28+
battle(battle) {
3029
}
3130

3231
Game_CommonEvent::Game_CommonEvent(int common_event_id, bool battle, const RPG::SaveCommonEvent& data) :
3332
common_event_id(common_event_id),
34-
battle(battle),
35-
interpreter(NULL) {
33+
battle(battle) {
3634

3735
if (!data.event_data.commands.empty()) {
3836
interpreter.reset(new Game_Interpreter_Map());
@@ -65,11 +63,13 @@ void Game_CommonEvent::Update() {
6563
CheckEventTriggerAuto();
6664

6765
if (interpreter) {
66+
Game_Map::SetParallelInterpreter(interpreter);
6867
if (!interpreter->IsRunning()) {
6968
interpreter->Setup(GetList(), 0, -common_event_id, -2);
7069
} else {
7170
interpreter->Update();
7271
}
72+
Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter>());
7373
}
7474
}
7575

src/game_commonevent.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ class Game_CommonEvent {
107107
bool battle;
108108

109109
/** Interpreter for parallel common events. */
110-
boost::scoped_ptr<Game_Interpreter> interpreter;
110+
EASYRPG_SHARED_PTR<Game_Interpreter> interpreter;
111111
};
112112

113113
#endif

src/game_event.cpp

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ Game_Event::Game_Event(int map_id, const RPG::Event& event) :
3737
from_save(false) {
3838

3939
ID = event.ID;
40-
through = true;
4140

4241
SetMapId(map_id);
4342
MoveTo(event.x, event.y);
@@ -225,6 +224,10 @@ void Game_Event::SetFlashTimeLeft(int time_left) {
225224
data.flash_time_left = time_left;
226225
}
227226

227+
bool Game_Event::GetThrough() const {
228+
return page == NULL || Game_Character::GetThrough();
229+
}
230+
228231
void Game_Event::ClearStarting() {
229232
starting = false;
230233
}
@@ -238,7 +241,6 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
238241
SetSpriteIndex(0);
239242
SetDirection(RPG::EventPage::Direction_down);
240243
//move_type = 0;
241-
through = true;
242244
trigger = -1;
243245
list.clear();
244246
interpreter.reset();
@@ -258,23 +260,24 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
258260
pattern = page->character_pattern;
259261
original_pattern = pattern;
260262
}
261-
//opacity = page.opacity;
262-
//opacity = page.translucent ? 192 : 255;
263-
//blend_type = page.blend_type;
263+
264264
move_type = page->move_type;
265265
SetMoveSpeed(page->move_speed);
266266
SetMoveFrequency(page->move_frequency);
267267
original_move_route = page->move_route;
268268
SetOriginalMoveRouteIndex(0);
269269
animation_type = page->animation_type;
270+
SetOpacity(page->translucent ? 160 : 255);
270271

271272
SetLayer(page->layer);
272273
trigger = page->trigger;
273274
list = page->event_commands;
274-
through = false;
275275

276276
// Free resources if needed
277-
interpreter.reset();
277+
if (interpreter) {
278+
interpreter->Clear();
279+
interpreter.reset();
280+
}
278281
if (trigger == RPG::EventPage::Trigger_parallel) {
279282
interpreter.reset(new Game_Interpreter_Map());
280283
}
@@ -467,7 +470,6 @@ bool Game_Event::CheckEventTriggerTouch(int x, int y) {
467470
return false;
468471

469472
if ((trigger == RPG::EventPage::Trigger_collision) && (Main_Data::game_player->IsInPosition(x, y))) {
470-
471473
// TODO check over trigger VX differs from XP here
472474
if (!IsJumping()) {
473475
Start();
@@ -477,8 +479,6 @@ bool Game_Event::CheckEventTriggerTouch(int x, int y) {
477479
return true;
478480
}
479481

480-
481-
482482
void Game_Event::Update() {
483483
if (!data.active) {
484484
return;
@@ -488,13 +488,14 @@ void Game_Event::Update() {
488488
CheckEventTriggerAuto();
489489

490490
if (interpreter) {
491+
Game_Map::SetParallelInterpreter(interpreter);
491492
if (!interpreter->IsRunning()) {
492493
interpreter->Setup(list, event.ID, -event.x, event.y);
493494
} else {
494495
interpreter->Update();
495496
}
497+
Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter>());
496498
}
497-
498499
}
499500

500501
RPG::Event& Game_Event::GetEvent() {

src/game_event.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ class Game_Event : public Game_Character {
119119
*/
120120
int GetTrigger() const;
121121

122+
/**
123+
* Gets through state.
124+
*
125+
* @return Event has through state or has a null-page.
126+
*/
127+
bool GetThrough() const;
128+
122129
/**
123130
* Gets event commands list.
124131
*
@@ -149,7 +156,6 @@ class Game_Event : public Game_Character {
149156
RPG::Event& GetEvent();
150157

151158
const RPG::SaveMapEvent& GetSaveData();
152-
153159
private:
154160
// Not a reference on purpose.
155161
// Events change during map change and old are destroyed, breaking the
@@ -162,7 +168,7 @@ class Game_Event : public Game_Character {
162168
RPG::Event event;
163169
RPG::EventPage* page;
164170
std::vector<RPG::EventCommand> list;
165-
boost::scoped_ptr<Game_Interpreter> interpreter;
171+
EASYRPG_SHARED_PTR<Game_Interpreter> interpreter;
166172
bool from_save;
167173
};
168174

src/game_interpreter.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ void Game_Interpreter::Clear() {
7272
child_interpreter.reset(); // child interpreter for common events, etc
7373
continuation = NULL; // function to execute to resume command
7474
button_timer = 0;
75+
list.clear();
7576
}
7677

7778
// Is interpreter running.
@@ -366,7 +367,12 @@ void Game_Interpreter::InputButton() {
366367

367368
bool Game_Interpreter::CommandEnd() {
368369
CloseMessageWindow();
369-
Game_Message::FullClear();
370+
371+
// FIXME: Hangs in some cases when Autostart events start
372+
//if (main_flag) {
373+
// Game_Message::FullClear();
374+
//}
375+
370376
list.clear();
371377

372378
if ((main_flag) && (event_id > 0)) {

src/game_map.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ namespace {
6363
int scroll_speed;
6464

6565
boost::scoped_ptr<Game_Interpreter> interpreter;
66+
EASYRPG_SHARED_PTR<Game_Interpreter> parallel_interpreter;
6667
Game_Vehicle* vehicles[3];
6768

6869
bool pan_locked;
@@ -296,6 +297,7 @@ void Game_Map::Refresh() {
296297
i->second->Refresh();
297298
}
298299
}
300+
299301
need_refresh = false;
300302
}
301303

@@ -304,6 +306,14 @@ Game_Interpreter& Game_Map::GetInterpreter() {
304306
return *interpreter;
305307
}
306308

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;
315+
}
316+
307317
void Game_Map::ScrollDown(int distance) {
308318
map_info.position_y = min(map_info.position_y + distance, (GetHeight() - 15) * SCREEN_TILE_WIDTH);
309319
}
@@ -653,7 +663,7 @@ void Game_Map::UpdateScroll() {
653663
}
654664

655665
void Game_Map::Update() {
656-
if (need_refresh) Refresh();
666+
if (GetNeedRefresh()) Refresh();
657667
UpdateScroll();
658668
UpdatePan();
659669
UpdateParallax();

src/game_map.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,21 @@ namespace Game_Map {
391391
*/
392392
Game_Interpreter& GetInterpreter();
393393

394+
/**
395+
* Gets the currently running parallel interpreter.
396+
*
397+
* @return running parallel interpreter.
398+
*/
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);
408+
394409
/**
395410
* Sets the need refresh flag.
396411
*

0 commit comments

Comments
 (0)