[Scummvm-git-logs] scummvm master -> f6c5fed1739ddadc59b919407859bec7ee403c35
mduggan
mgithub at guarana.org
Sat Oct 3 12:30:55 UTC 2020
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b890fe997f ULTIMA8: Remove out-of-date TODO
f6c5fed173 ULTIMA8: Implement PaceProcess for Crusader NPCs
Commit: b890fe997f9c522e7ce791a8c9efd8b2d8c74ed6
https://github.com/scummvm/scummvm/commit/b890fe997f9c522e7ce791a8c9efd8b2d8c74ed6
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-10-03T21:21:24+09:00
Commit Message:
ULTIMA8: Remove out-of-date TODO
Changed paths:
engines/ultima/ultima8/world/item.cpp
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index c9f813024b..dbb5706f48 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -592,7 +592,6 @@ bool Item::isCentreOn(const Item &item2) const {
}
bool Item::isOnScreen() const {
- // TODO: would be cleaner to have this logic inside GameMapGump itself.
GameMapGump *game_map = Ultima8Engine::get_instance()->getGameMapGump();
if (!game_map)
Commit: f6c5fed1739ddadc59b919407859bec7ee403c35
https://github.com/scummvm/scummvm/commit/f6c5fed1739ddadc59b919407859bec7ee403c35
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-10-03T21:30:33+09:00
Commit Message:
ULTIMA8: Implement PaceProcess for Crusader NPCs
Changed paths:
A engines/ultima/ultima8/world/actors/pace_process.cpp
A engines/ultima/ultima8/world/actors/pace_process.h
engines/ultima/module.mk
engines/ultima/ultima8/world/actors/actor.cpp
diff --git a/engines/ultima/module.mk b/engines/ultima/module.mk
index d61212c8d7..200809d838 100644
--- a/engines/ultima/module.mk
+++ b/engines/ultima/module.mk
@@ -574,6 +574,7 @@ MODULE_OBJS := \
ultima8/world/actors/loiter_process.o \
ultima8/world/actors/main_actor.o \
ultima8/world/actors/npc_dat.o \
+ ultima8/world/actors/pace_process.o \
ultima8/world/actors/pathfinder.o \
ultima8/world/actors/pathfinder_process.o \
ultima8/world/actors/quick_avatar_mover_process.o \
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index a527c38ce2..0dbb68085e 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -21,45 +21,46 @@
*/
#include "ultima/ultima8/misc/pent_include.h"
-#include "ultima/ultima8/world/actors/actor.h"
#include "ultima/ultima8/kernel/object_manager.h"
#include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/kernel/delay_process.h"
+#include "ultima/ultima8/kernel/core_app.h"
#include "ultima/ultima8/usecode/uc_machine.h"
#include "ultima/ultima8/usecode/uc_list.h"
-#include "ultima/ultima8/world/world.h"
-#include "ultima/ultima8/world/actors/actor_anim_process.h"
-#include "ultima/ultima8/world/actors/animation_tracker.h"
-#include "ultima/ultima8/world/current_map.h"
#include "ultima/ultima8/misc/direction.h"
#include "ultima/ultima8/misc/direction_util.h"
#include "ultima/ultima8/games/game_data.h"
#include "ultima/ultima8/graphics/main_shape_archive.h"
-#include "ultima/ultima8/world/actors/anim_action.h"
#include "ultima/ultima8/graphics/shape_info.h"
-#include "ultima/ultima8/world/actors/pathfinder.h"
+#include "ultima/ultima8/graphics/shape.h"
+#include "ultima/ultima8/world/actors/actor.h"
+#include "ultima/ultima8/world/actors/actor_anim_process.h"
+#include "ultima/ultima8/world/actors/animation_tracker.h"
+#include "ultima/ultima8/world/actors/anim_action.h"
#include "ultima/ultima8/world/actors/animation.h"
#include "ultima/ultima8/world/actors/npc_dat.h"
-#include "ultima/ultima8/kernel/delay_process.h"
-#include "ultima/ultima8/kernel/core_app.h"
+#include "ultima/ultima8/world/actors/pathfinder.h"
#include "ultima/ultima8/world/actors/resurrection_process.h"
-#include "ultima/ultima8/world/destroy_item_process.h"
#include "ultima/ultima8/world/actors/clear_feign_death_process.h"
#include "ultima/ultima8/world/actors/pathfinder_process.h"
-#include "ultima/ultima8/graphics/shape.h"
#include "ultima/ultima8/world/actors/loiter_process.h"
#include "ultima/ultima8/world/actors/guard_process.h"
#include "ultima/ultima8/world/actors/combat_process.h"
+#include "ultima/ultima8/world/actors/pace_process.h"
#include "ultima/ultima8/world/actors/surrender_process.h"
-#include "ultima/ultima8/audio/audio_process.h"
+#include "ultima/ultima8/world/world.h"
+#include "ultima/ultima8/world/current_map.h"
+#include "ultima/ultima8/world/destroy_item_process.h"
#include "ultima/ultima8/world/sprite_process.h"
#include "ultima/ultima8/world/target_reticle_process.h"
#include "ultima/ultima8/world/item_selection_process.h"
#include "ultima/ultima8/world/actors/main_actor.h"
-#include "ultima/ultima8/audio/music_process.h"
#include "ultima/ultima8/world/get_object.h"
#include "ultima/ultima8/world/item_factory.h"
#include "ultima/ultima8/world/loop_script.h"
#include "ultima/ultima8/world/fire_type.h"
+#include "ultima/ultima8/audio/audio_process.h"
+#include "ultima/ultima8/audio/music_process.h"
namespace Ultima {
namespace Ultima8 {
@@ -659,8 +660,7 @@ uint16 Actor::setActivityCru(int activity) {
case 1: // stand
return doAnim(Animation::stand, dir_current);
case 3: // pace
- perr << "Actor::setActivityCru TODO: Implement new PaceProcess(this);" << Std::endl;
- return Kernel::get_instance()->addProcess(new LoiterProcess(this));
+ return Kernel::get_instance()->addProcess(new PaceProcess(this));
case 2: // loiter
Kernel::get_instance()->addProcess(new LoiterProcess(this));
return Kernel::get_instance()->addProcess(new DelayProcess(1));
diff --git a/engines/ultima/ultima8/world/actors/pace_process.cpp b/engines/ultima/ultima8/world/actors/pace_process.cpp
new file mode 100644
index 0000000000..8575098d21
--- /dev/null
+++ b/engines/ultima/ultima8/world/actors/pace_process.cpp
@@ -0,0 +1,129 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "ultima/ultima8/misc/pent_include.h"
+#include "ultima/ultima8/world/actors/pace_process.h"
+#include "ultima/ultima8/world/actors/actor.h"
+#include "ultima/ultima8/world/actors/main_actor.h"
+#include "ultima/ultima8/world/actors/animation.h"
+#include "ultima/ultima8/world/actors/actor_anim_process.h"
+#include "ultima/ultima8/misc/direction_util.h"
+#include "ultima/ultima8/kernel/kernel.h"
+#include "ultima/ultima8/kernel/delay_process.h"
+#include "ultima/ultima8/world/get_object.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+// p_dynamic_cast stuff
+DEFINE_RUNTIME_CLASSTYPE_CODE(PaceProcess)
+
+PaceProcess::PaceProcess() : Process(), _counter(0) {
+}
+
+PaceProcess::PaceProcess(Actor *actor): _counter(0) {
+ assert(actor);
+ _itemNum = actor->getObjId();
+ _type = 0x255;
+}
+
+
+bool PaceProcess::maybeStartDefaultActivity1(Actor *actor) {
+ const Actor *mainactor = getMainActor();
+ if (!mainactor)
+ return false;
+
+ uint16 activity = actor->getDefaultActivity(1);
+ uint16 cur_activity = actor->getCurrentActivityNo();
+
+ if (actor->isOnScreen() && activity > 0 && cur_activity != activity) {
+ int range = actor->getRangeIfVisible(*mainactor);
+ if (range > 0) {
+ actor->setActivity(activity);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+void PaceProcess::run() {
+ Actor *a = getActor(_itemNum);
+ Kernel *kernel = Kernel::get_instance();
+ assert(kernel);
+
+ if (!a || a->isDead()) {
+ // dead?
+ terminate();
+ return;
+ }
+
+ if (maybeStartDefaultActivity1(a))
+ return;
+
+ if (kernel->getNumProcesses(a->getObjId(), ActorAnimProcess::ACTOR_ANIM_PROC_TYPE)) {
+ return;
+ }
+
+ Animation::Result result = a->tryAnim(Animation::walk, a->getDir());
+ if (result == Animation::SUCCESS) {
+ uint16 walkprocid = a->doAnim(Animation::walk, a->getDir());
+ waitFor(walkprocid);
+ } else {
+ _counter++;
+ if (_counter > 1) {
+ uint32 shapeno = a->getShape();
+ if (shapeno == 0x2f5 || shapeno == 0x2f7 || shapeno != 0x2f6 ||
+ shapeno == 0x344 || shapeno == 0x597) {
+ a->setActivity(5); // attack
+ } else {
+ a->setActivity(7); // surrender
+ }
+ return;
+ }
+
+ // Stand, turn around, and wait for 60.
+ uint16 standprocid = a->doAnim(Animation::stand, a->getDir());
+ uint16 turnprocid = a->turnTowardDir(Direction_Invert(a->getDir()));
+ Process *turnproc = kernel->getProcess(turnprocid);
+ turnproc->waitFor(standprocid);
+ Process *waitproc = new DelayProcess(60);
+ Kernel::get_instance()->addProcess(waitproc);
+ waitproc->waitFor(turnproc);
+ waitFor(waitproc);
+ }
+}
+
+void PaceProcess::saveData(Common::WriteStream *ws) {
+ Process::saveData(ws);
+ ws->writeByte(_counter);
+}
+
+bool PaceProcess::loadData(Common::ReadStream *rs, uint32 version) {
+ bool result = Process::loadData(rs, version);
+ if (result)
+ _counter = rs->readByte();
+ return result;
+}
+
+} // End of namespace Ultima8
+} // End of namespace Ultima
diff --git a/engines/ultima/ultima8/world/actors/pace_process.h b/engines/ultima/ultima8/world/actors/pace_process.h
new file mode 100644
index 0000000000..07acca6c92
--- /dev/null
+++ b/engines/ultima/ultima8/world/actors/pace_process.h
@@ -0,0 +1,55 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef WORLD_ACTORS_PACEPROCESS_H
+#define WORLD_ACTORS_PACEPROCESS_H
+
+#include "ultima/ultima8/kernel/process.h"
+
+namespace Ultima {
+namespace Ultima8 {
+
+class Actor;
+
+class PaceProcess : public Process {
+public:
+ PaceProcess();
+ PaceProcess(Actor *actor);
+
+ // p_dynamic_cast stuff
+ ENABLE_RUNTIME_CLASSTYPE()
+
+ void run() override;
+
+ bool loadData(Common::ReadStream *rs, uint32 version);
+ void saveData(Common::WriteStream *ws) override;
+
+private:
+ bool maybeStartDefaultActivity1(Actor *actor);
+
+ uint8 _counter;
+};
+
+} // End of namespace Ultima8
+} // End of namespace Ultima
+
+#endif
More information about the Scummvm-git-logs
mailing list