[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