if (afterLock) {
bool blocked(CheckBlocking());
OnMove(!blocked);
- afterLock = false;
controlled->SetOrientation(Entity::Orientation(nextDirection));
if (!blocked) {
+ afterLock = false;
controlled->SetSpeed(walkingSpeed);
moveTimer.Clear();
if (pushed) {
return false;
} else {
LockEntities();
- return CheckMonster() || CheckTrigger();
+ return CheckMonster() || CheckLockTrigger();
}
}
return false;
}
-bool MapState::CheckTrigger() {
+bool MapState::CheckLockTrigger() {
Trigger *trigger(map->TriggerAt(Vector<int>(controlled->Position())));
- if (trigger) {
- // TODO: run trigger script
- if (trigger->map) {
- ctrl->PushState(new ColorFade(this, 0, 500, true));
- ctrl->PushState(new TransitionState(this, trigger->map, trigger->target));
- ColorFade *fadeOut(new ColorFade(this, 0, 500, false));
- fadeOut->SetLeadOutTime(500);
- ctrl->PushState(fadeOut);
- return true;
- }
- }
- return false;
+ if (!trigger || trigger->GetType() != Trigger::TYPE_CONTACT) return false;
+ RunTrigger(*trigger);
+ return true;
}
void MapState::OnMove(bool realMove) {
+ if (CheckMoveTrigger()) {
+ return;
+ }
// TODO: evaluate monster movements
if (realMove) {
UpdateFollower(*controlled);
}
}
+bool MapState::CheckMoveTrigger() {
+ Trigger *trigger(map->TriggerAt(Vector<int>(controlled->Position())));
+ if (!trigger || int(trigger->GetType()) != nextDirection) return false;
+ RunTrigger(*trigger);
+ return true;
+}
+
+void MapState::RunTrigger(Trigger &trigger) {
+ if (!trigger.HasScript()) return;
+ runner.Run(*this, trigger.GetScript());
+}
+
void MapState::UpdateFollower(Entity &e) {
if (!e.Follower()) return;
return lhs->Position().Y() < rhs->Position().Y();
}
+
+void MapState::HandleSyscall(common::ScriptRunner &r) {
+ switch (r.Integer0()) {
+ case TRANSITION: {
+ ctrl->PushState(new ColorFade(this, 0, 500, true));
+ ctrl->PushState(new TransitionState(this, reinterpret_cast<Map *>(r.Address0()), r.Vector0()));
+ ColorFade *fadeOut(new ColorFade(this, 0, 500, false));
+ fadeOut->SetLeadOutTime(500);
+ ctrl->PushState(fadeOut);
+ break;
+ }
+ }
+}
+
}