[Scummvm-git-logs] scummvm master -> 57e13c641ed964976d77f7bf41b30150b01bf606

mduggan mgithub at guarana.org
Fri May 28 12:33:12 UTC 2021


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
766dbca6ef ULTIMA8: Fix ammo mode for Crusader Weasel
6a36460e6e ULTIMA8: Make max stats cheat good for Cruasder too
dce0e34485 ULTIMA8: Avoid assert from proc loop workaround
57e13c641e ULTIMA8: Don't abort unstoppable animations on fall


Commit: 766dbca6ef39a4044f9dcc6ae959877400ef156d
    https://github.com/scummvm/scummvm/commit/766dbca6ef39a4044f9dcc6ae959877400ef156d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-28T21:32:56+09:00

Commit Message:
ULTIMA8: Fix ammo mode for Crusader Weasel

The ammo data is stored in shop data 1, and is always the same.  Items and
weapons should all be shown in "weapons" mode.

This is still not exact to original - it seems the ammo needs filtering based
on something, probably the unknown data field in stuff.dat.

Changed paths:
    engines/ultima/ultima8/gumps/weasel_dat.cpp
    engines/ultima/ultima8/gumps/weasel_gump.cpp
    engines/ultima/ultima8/gumps/weasel_gump.h


diff --git a/engines/ultima/ultima8/gumps/weasel_dat.cpp b/engines/ultima/ultima8/gumps/weasel_dat.cpp
index 5e9c5fb7e7..83472c08e4 100644
--- a/engines/ultima/ultima8/gumps/weasel_dat.cpp
+++ b/engines/ultima/ultima8/gumps/weasel_dat.cpp
@@ -56,7 +56,8 @@ WeaselDat::WeaselDat(Common::ReadStream *rs) {
 		else
 			entry._type = kUnknown;
 
-		_items.push_back(entry);
+		if (entry._shapeNo)
+			_items.push_back(entry);
 	}
 
 	const uint skip = (BLOCKS - numentries) * 16;
diff --git a/engines/ultima/ultima8/gumps/weasel_gump.cpp b/engines/ultima/ultima8/gumps/weasel_gump.cpp
index 17b3de40e6..96af97739f 100644
--- a/engines/ultima/ultima8/gumps/weasel_gump.cpp
+++ b/engines/ultima/ultima8/gumps/weasel_gump.cpp
@@ -273,7 +273,17 @@ void WeaselGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled)
 bool WeaselGump::OnKeyDown(int key, int mod) {
 	if (Gump::OnKeyDown(key, mod)) return true;
 
-	// TODO: support keyboard input
+	// TODO: support more keyboard input
+	switch (key) {
+		case Common::KEYCODE_LEFT:
+			if (_state == kWeaselBrowsing)
+				prevItem();
+			break;
+		case Common::KEYCODE_RIGHT:
+			if (_state == kWeaselBrowsing)
+				nextItem();
+			break;
+	}
 
 	return true;
 }
@@ -293,11 +303,11 @@ void WeaselGump::onButtonClick(int entry) {
 	switch (entry) {
 	case kBtnWeapons:
 		_ammoMode = false;
-		updateAmmoButtons();
+		updateForAmmoMode();
 		break;
 	case kBtnAmmo:
 		_ammoMode = true;
-		updateAmmoButtons();
+		updateForAmmoMode();
 		break;
 	case kBtnLeft:
 		prevItem();
@@ -329,31 +339,32 @@ void WeaselGump::onButtonClick(int entry) {
 	}
 }
 
-void WeaselGump::updateAmmoButtons() {
-	_ammoMode = !_ammoMode;
+void WeaselGump::updateForAmmoMode() {
 	Gump *ammobtn = _ui->FindGump(&FindByIndex<kBtnAmmo>);
 	Gump *wpnbtn = _ui->FindGump(&FindByIndex<kBtnWeapons>);
 	assert(ammobtn && wpnbtn);
-	ammobtn->SetVisibility(_ammoMode);
-	wpnbtn->SetVisibility(!_ammoMode);
+	ammobtn->SetVisibility(!_ammoMode);
+	wpnbtn->SetVisibility(_ammoMode);
 	_curItem = 0;
+
+	_weaselDat = GameData::get_instance()->getWeaselDat(_ammoMode ? 1 : _level);
+	if (!_weaselDat || _weaselDat->getNumItems() == 0)
+		Close();
+
 	updateItemDisplay();
 }
 
+
 void WeaselGump::prevItem() {
-	WeaselDat::WeaselType curtype = _ammoMode ? WeaselDat::kItem : WeaselDat::kWeapon;
-	int itemcount = _weaselDat->getNumOfType(curtype);
 	_curItem--;
 	if (_curItem < 0)
-		_curItem = itemcount - 1;
+		_curItem = _weaselDat->getNumItems() - 1;
 	updateItemDisplay();
 }
 
 void WeaselGump::nextItem() {
-	WeaselDat::WeaselType curtype = _ammoMode ? WeaselDat::kItem : WeaselDat::kWeapon;
-	int itemcount = _weaselDat->getNumOfType(curtype);
 	_curItem++;
-	if (_curItem >= itemcount)
+	if (_curItem >= _weaselDat->getNumItems())
 		_curItem = 0;
 	updateItemDisplay();
 }
@@ -413,7 +424,7 @@ void WeaselGump::setYesNoQuestion(const Std::string &msg) {
 void WeaselGump::browsingMode(bool browsing) {
 	_ui->UnhideGump();
 
-	updateAmmoButtons();
+	updateForAmmoMode();
 	updateItemDisplay();
 
 	// Note: all these searches are not super effieient but it's
@@ -442,8 +453,8 @@ void WeaselGump::browsingMode(bool browsing) {
 		qtxt->SetVisibility(!browsing);
 
 	buybtn->SetVisibility(browsing);
-	wpnbtn->SetVisibility(browsing && !_ammoMode);
-	ammobtn->SetVisibility(browsing && _ammoMode);
+	wpnbtn->SetVisibility(browsing && _ammoMode);
+	ammobtn->SetVisibility(browsing && !_ammoMode);
 	exitbtn->SetVisibility(browsing);
 	blankbtn->SetVisibility(browsing);
 	leftbtn->SetVisibility(browsing);
@@ -473,25 +484,13 @@ int WeaselGump::purchasedCount(uint16 shape) const {
 }
 
 void WeaselGump::updateItemDisplay() {
-	WeaselDat::WeaselType curtype = _ammoMode ? WeaselDat::kItem : WeaselDat::kWeapon;
 	const Std::vector<WeaselDat::WeaselEntry> &items = _weaselDat->getItems();
-	Std::vector<WeaselDat::WeaselEntry>::const_iterator iter = items.begin();
-
-	int i = 0;
-	for (; iter != items.end(); iter++) {
-		if (iter->_type == curtype) {
-			if (i == _curItem)
-				break;
-			else
-				i++;
-		}
-	}
 
-	// should always find the item..
-	assert(iter != items.end());
+	// should always have the item..
+	assert(_curItem < (int)items.size());
 
-	_curItemCost = iter->_cost;
-	_curItemShape = iter->_shapeNo;
+	_curItemCost = items[_curItem]._cost;
+	_curItemShape = items[_curItem]._shapeNo;
 
 	const ShapeInfo *shapeinfo = GameData::get_instance()->getMainShapes()->getShapeInfo(_curItemShape);
 	if (!shapeinfo || !shapeinfo->_weaponInfo) {
diff --git a/engines/ultima/ultima8/gumps/weasel_gump.h b/engines/ultima/ultima8/gumps/weasel_gump.h
index 959c6879a5..2d49458cb0 100644
--- a/engines/ultima/ultima8/gumps/weasel_gump.h
+++ b/engines/ultima/ultima8/gumps/weasel_gump.h
@@ -78,7 +78,7 @@ private:
 	void prevItem();
 	void nextItem();
 	void buyItem();
-	void updateAmmoButtons();
+	void updateForAmmoMode();
 	void checkClose();
 	void completePurchase();
 	void abortPurchase();


Commit: 6a36460e6edd6b36b1729af53c59cada4067610d
    https://github.com/scummvm/scummvm/commit/6a36460e6edd6b36b1729af53c59cada4067610d
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-28T21:32:56+09:00

Commit Message:
ULTIMA8: Make max stats cheat good for Cruasder too

Changed paths:
    engines/ultima/ultima8/misc/debugger.cpp


diff --git a/engines/ultima/ultima8/misc/debugger.cpp b/engines/ultima/ultima8/misc/debugger.cpp
index 8b9aac3d06..b9275c95d1 100644
--- a/engines/ultima/ultima8/misc/debugger.cpp
+++ b/engines/ultima/ultima8/misc/debugger.cpp
@@ -393,16 +393,21 @@ bool Debugger::cmdMaxStats(int argc, const char **argv) {
 	}
 	MainActor *mainActor = getMainActor();
 
-	// constants!!
-	mainActor->setStr(25);
-	mainActor->setDex(25);
-	mainActor->setInt(25);
-	mainActor->setHP(mainActor->getMaxHP());
-	mainActor->setMana(mainActor->getMaxMana());
+	if (GAME_IS_CRUSADER) {
+		mainActor->setHP(mainActor->getMaxHP());
+		mainActor->setMana(mainActor->getMaxMana());
+	} else {
+		// constants!!
+		mainActor->setStr(25);
+		mainActor->setDex(25);
+		mainActor->setInt(25);
+		mainActor->setHP(mainActor->getMaxHP());
+		mainActor->setMana(mainActor->getMaxMana());
 
-	AudioProcess *audioproc = AudioProcess::get_instance();
-	if (audioproc)
-		audioproc->playSFX(0x36, 0x60, 1, 0); //constants!!
+		AudioProcess *audioproc = AudioProcess::get_instance();
+		if (audioproc)
+			audioproc->playSFX(0x36, 0x60, 1, 0); //constants!!
+	}
 	return false;
 }
 


Commit: dce0e344853fce5f849a3f40ff290f5b49caf4e0
    https://github.com/scummvm/scummvm/commit/dce0e344853fce5f849a3f40ff290f5b49caf4e0
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-28T21:32:56+09:00

Commit Message:
ULTIMA8: Avoid assert from proc loop workaround

Changed paths:
    engines/ultima/ultima8/kernel/kernel.cpp


diff --git a/engines/ultima/ultima8/kernel/kernel.cpp b/engines/ultima/ultima8/kernel/kernel.cpp
index a1eda84ab4..b0064f1bb7 100644
--- a/engines/ultima/ultima8/kernel/kernel.cpp
+++ b/engines/ultima/ultima8/kernel/kernel.cpp
@@ -173,7 +173,7 @@ void Kernel::runProcesses() {
 			// we can work out what it is avoid the game totally hanging at this
 			// point.
 			//
-			if (num_run > 500) {
+			if (num_run > 1000 && !p->is_terminated()) {
 				warning("Seem to be stuck in process loop - killing current process");
 				p->fail();
 			}


Commit: 57e13c641ed964976d77f7bf41b30150b01bf606
    https://github.com/scummvm/scummvm/commit/57e13c641ed964976d77f7bf41b30150b01bf606
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2021-05-28T21:32:56+09:00

Commit Message:
ULTIMA8: Don't abort unstoppable animations on fall

This caused death animations to stop half way if the NPC also fell while dying.

Changed paths:
    engines/ultima/ultima8/world/actors/actor_anim_process.cpp


diff --git a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
index 048e640e8b..da723d2018 100644
--- a/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
+++ b/engines/ultima/ultima8/world/actors/actor_anim_process.cpp
@@ -355,7 +355,7 @@ void ActorAnimProcess::run() {
 
 	if (_repeatCounter == _tracker->getAnimAction()->getFrameRepeat()) {
 		if (_tracker->isUnsupported()) {
-			_animAborted = true;
+			_animAborted = !_tracker->getAnimAction()->hasFlags(AnimAction::AAF_UNSTOPPABLE);
 
 #ifdef WATCHACTOR
 			if (_itemNum == watchactor) {




More information about the Scummvm-git-logs mailing list