[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