[Scummvm-git-logs] scummvm master -> 37db3eff264c456e18405c1a46096769b5c612da
mduggan
mgithub at guarana.org
Thu Apr 30 07:16:48 UTC 2020
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
37db3eff26 ULTIMA8: Fix lots more coverity issues
Commit: 37db3eff264c456e18405c1a46096769b5c612da
https://github.com/scummvm/scummvm/commit/37db3eff264c456e18405c1a46096769b5c612da
Author: Matthew Duggan (mgithub at guarana.org)
Date: 2020-04-30T16:16:36+09:00
Commit Message:
ULTIMA8: Fix lots more coverity issues
Changed paths:
engines/ultima/ultima8/audio/audio_channel.cpp
engines/ultima/ultima8/games/game_data.cpp
engines/ultima/ultima8/games/u8_game.cpp
engines/ultima/ultima8/graphics/frame_id.h
engines/ultima/ultima8/graphics/inverter_process.cpp
engines/ultima/ultima8/graphics/texture.cpp
engines/ultima/ultima8/gumps/container_gump.cpp
engines/ultima/ultima8/gumps/credits_gump.cpp
engines/ultima/ultima8/gumps/game_map_gump.cpp
engines/ultima/ultima8/gumps/message_box_gump.cpp
engines/ultima/ultima8/gumps/quit_gump.cpp
engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
engines/ultima/ultima8/gumps/widgets/button_widget.cpp
engines/ultima/ultima8/usecode/uc_machine.cpp
engines/ultima/ultima8/world/actors/actor.cpp
engines/ultima/ultima8/world/actors/animation_tracker.cpp
engines/ultima/ultima8/world/actors/combat_process.cpp
engines/ultima/ultima8/world/actors/pathfinder.cpp
engines/ultima/ultima8/world/actors/pathfinder.h
engines/ultima/ultima8/world/actors/pathfinder_process.cpp
engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
engines/ultima/ultima8/world/actors/weapon_overlay.h
engines/ultima/ultima8/world/camera_process.cpp
engines/ultima/ultima8/world/create_item_process.cpp
engines/ultima/ultima8/world/gravity_process.cpp
engines/ultima/ultima8/world/item.cpp
engines/ultima/ultima8/world/item_sorter.cpp
engines/ultima/ultima8/world/missile_tracker.cpp
engines/ultima/ultima8/world/sprite_process.cpp
diff --git a/engines/ultima/ultima8/audio/audio_channel.cpp b/engines/ultima/ultima8/audio/audio_channel.cpp
index c997fd16b2..9e8383a3a0 100644
--- a/engines/ultima/ultima8/audio/audio_channel.cpp
+++ b/engines/ultima/ultima8/audio/audio_channel.cpp
@@ -33,7 +33,7 @@ namespace Ultima8 {
AudioChannel::AudioChannel(Audio::Mixer *mixer, uint32 sampleRate, bool stereo) :
_mixer(mixer), _decompressorSize(0), _frameSize(0), _loop(0), _sample(nullptr),
- _frameEvenOdd(0), _paused(false), _priority(0) {
+ _frameEvenOdd(0), _paused(false), _priority(0), _lVol(0), _rVol(0), _pitchShift(0) {
}
AudioChannel::~AudioChannel(void) {
diff --git a/engines/ultima/ultima8/games/game_data.cpp b/engines/ultima/ultima8/games/game_data.cpp
index b16aaad126..fe942de632 100644
--- a/engines/ultima/ultima8/games/game_data.cpp
+++ b/engines/ultima/ultima8/games/game_data.cpp
@@ -457,7 +457,7 @@ SpeechFlex *GameData::getSpeechFlex(uint32 shapeNum) {
char langletter = _gameInfo->getLanguageFileLetter();
if (!langletter) {
perr << "GameData::getSpeechFlex: Unknown language." << Std::endl;
- // FIXME: This leaks s
+ delete s;
return nullptr;
}
diff --git a/engines/ultima/ultima8/games/u8_game.cpp b/engines/ultima/ultima8/games/u8_game.cpp
index cee3db478b..27b2d76c63 100644
--- a/engines/ultima/ultima8/games/u8_game.cpp
+++ b/engines/ultima/ultima8/games/u8_game.cpp
@@ -125,6 +125,7 @@ bool U8Game::startGame() {
Common::SeekableReadStream *npcd = u8save->getDataSource("NPCDATA.DAT");
if (!npcd) {
perr << "Unable to load savegame/u8save.000/NPCDATA.DAT." << Std::endl;
+ delete icd;
return false;
}
diff --git a/engines/ultima/ultima8/graphics/frame_id.h b/engines/ultima/ultima8/graphics/frame_id.h
index 7f83737c0e..fa6512de0b 100644
--- a/engines/ultima/ultima8/graphics/frame_id.h
+++ b/engines/ultima/ultima8/graphics/frame_id.h
@@ -33,7 +33,7 @@ struct FrameID {
uint32 _shapeNum;
uint32 _frameNum;
- FrameID() { }
+ FrameID() : _flexId(0), _shapeNum(0), _frameNum(0) { }
FrameID(uint16 flex, uint32 shape, uint32 frame)
: _flexId(flex), _shapeNum(shape), _frameNum(frame) {
}
diff --git a/engines/ultima/ultima8/graphics/inverter_process.cpp b/engines/ultima/ultima8/graphics/inverter_process.cpp
index c44ac53b17..c8eacbf6a7 100644
--- a/engines/ultima/ultima8/graphics/inverter_process.cpp
+++ b/engines/ultima/ultima8/graphics/inverter_process.cpp
@@ -48,7 +48,7 @@ InverterProcess *InverterProcess::_inverter = nullptr;
DEFINE_RUNTIME_CLASSTYPE_CODE(InverterProcess, Process)
InverterProcess::InverterProcess()
- : Process() {
+ : Process(), _targetState(0) {
}
diff --git a/engines/ultima/ultima8/graphics/texture.cpp b/engines/ultima/ultima8/graphics/texture.cpp
index a0ebfff456..0c99aec0aa 100644
--- a/engines/ultima/ultima8/graphics/texture.cpp
+++ b/engines/ultima/ultima8/graphics/texture.cpp
@@ -31,7 +31,8 @@ namespace Ultima {
namespace Ultima8 {
-Texture::Texture() : _format(TEX_FMT_STANDARD), _glTex(0), _next(nullptr) {
+Texture::Texture() : _format(TEX_FMT_STANDARD), _glTex(0),
+ _next(nullptr), _wlog2(-1), _hlog2(-1) {
}
//
diff --git a/engines/ultima/ultima8/gumps/container_gump.cpp b/engines/ultima/ultima8/gumps/container_gump.cpp
index 4f5e1d6ff5..87cc3c6962 100644
--- a/engines/ultima/ultima8/gumps/container_gump.cpp
+++ b/engines/ultima/ultima8/gumps/container_gump.cpp
@@ -47,14 +47,16 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(ContainerGump, ItemRelativeGump)
ContainerGump::ContainerGump()
- : ItemRelativeGump(), _displayDragging(false) {
+ : ItemRelativeGump(), _displayDragging(false), _draggingShape(0),
+ _draggingFrame(0), _draggingFlags(0), _draggingX(0), _draggingY(0) {
}
ContainerGump::ContainerGump(Shape *shape, uint32 frameNum, uint16 owner,
uint32 flags, int32 layer)
: ItemRelativeGump(0, 0, 5, 5, owner, flags, layer),
- _displayDragging(false) {
+ _displayDragging(false), _draggingShape(0), _draggingFrame(0),
+ _draggingFlags(0), _draggingX(0), _draggingY(0) {
_shape = shape;
_frameNum = frameNum;
}
@@ -192,6 +194,7 @@ uint16 ContainerGump::TraceObjId(int32 mx, int32 my) {
bool ContainerGump::GetLocationOfItem(uint16 itemid, int32 &gx, int32 &gy,
int32 lerp_factor) {
Item *item = getItem(itemid);
+ if (!item) return false;
Item *parent_ = item->getParentAsContainer();
if (!parent_) return false;
if (parent_->getObjId() != _owner) return false;
diff --git a/engines/ultima/ultima8/gumps/credits_gump.cpp b/engines/ultima/ultima8/gumps/credits_gump.cpp
index 52bb81b06e..6f3d460cfb 100644
--- a/engines/ultima/ultima8/gumps/credits_gump.cpp
+++ b/engines/ultima/ultima8/gumps/credits_gump.cpp
@@ -38,15 +38,24 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(CreditsGump, ModalGump)
CreditsGump::CreditsGump()
- : ModalGump() {
-
+ : ModalGump(), _parSkip(0), _timer(0), _title(nullptr),
+ _nextTitle(nullptr), _state(CS_PLAYING),
+ _nextTitleSurf(0), _currentSurface(0), _currentY(0) {
+ for (int i = 0; i < 4; i++) {
+ _scroll[i] = nullptr;
+ _scrollHeight[i] = 0;
+ }
}
CreditsGump::CreditsGump(const Std::string &text, int parskip,
uint32 flags, int32 layer)
- : ModalGump(0, 0, 320, 200, 0, flags, layer), _text(text), _parSkip(parskip),
- _timer(0), _title(nullptr), _nextTitle(nullptr), _state(CS_PLAYING),
- _nextTitleSurf(0), _currentSurface(0), _currentY(0) {
+ : ModalGump(0, 0, 320, 200, 0, flags, layer), _text(text), _parSkip(parskip),
+ _timer(0), _title(nullptr), _nextTitle(nullptr), _state(CS_PLAYING),
+ _nextTitleSurf(0), _currentSurface(0), _currentY(0) {
+ for (int i = 0; i < 4; i++) {
+ _scroll[i] = nullptr;
+ _scrollHeight[i] = 0;
+ }
}
CreditsGump::~CreditsGump() {
diff --git a/engines/ultima/ultima8/gumps/game_map_gump.cpp b/engines/ultima/ultima8/gumps/game_map_gump.cpp
index 1cdcc9a5bc..d7d44a8cc8 100644
--- a/engines/ultima/ultima8/gumps/game_map_gump.cpp
+++ b/engines/ultima/ultima8/gumps/game_map_gump.cpp
@@ -59,7 +59,8 @@ DEFINE_RUNTIME_CLASSTYPE_CODE(GameMapGump, Gump)
bool GameMapGump::_highlightItems = false;
GameMapGump::GameMapGump() :
- Gump(), _displayDragging(false) {
+ Gump(), _displayDragging(false), _displayList(0), _draggingShape(0),
+ _draggingFrame(0), _draggingFlags(0) {
_displayList = new ItemSorter();
}
diff --git a/engines/ultima/ultima8/gumps/message_box_gump.cpp b/engines/ultima/ultima8/gumps/message_box_gump.cpp
index eaa0393186..fbe1cde203 100644
--- a/engines/ultima/ultima8/gumps/message_box_gump.cpp
+++ b/engines/ultima/ultima8/gumps/message_box_gump.cpp
@@ -46,7 +46,7 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(MessageBoxGump, ModalGump)
MessageBoxGump::MessageBoxGump()
- : ModalGump() {
+ : ModalGump(), _titleColour(0) {
}
diff --git a/engines/ultima/ultima8/gumps/quit_gump.cpp b/engines/ultima/ultima8/gumps/quit_gump.cpp
index 0a5549d964..233a96e0fb 100644
--- a/engines/ultima/ultima8/gumps/quit_gump.cpp
+++ b/engines/ultima/ultima8/gumps/quit_gump.cpp
@@ -36,7 +36,7 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(QuitGump, ModalGump)
-QuitGump::QuitGump(): ModalGump(0, 0, 5, 5) {
+QuitGump::QuitGump(): ModalGump(0, 0, 5, 5), _yesWidget(0), _noWidget(0) {
Mouse *mouse = Mouse::get_instance();
mouse->pushMouseCursor();
mouse->setMouseCursor(Mouse::MOUSE_HAND);
diff --git a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
index 83a3da2474..51c1f71e0e 100644
--- a/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
+++ b/engines/ultima/ultima8/gumps/shape_viewer_gump.cpp
@@ -52,17 +52,17 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(ShapeViewerGump, ModalGump)
ShapeViewerGump::ShapeViewerGump()
- : ModalGump(), _curFlex(0), _flex(nullptr), _curShape(0),
- _curFrame(0), _background(0), _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
+ : ModalGump(), _curFlex(0), _flex(nullptr), _curShape(0), _curFrame(0),
+ _background(0), _fontNo(0), _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
}
ShapeViewerGump::ShapeViewerGump(int x, int y, int width, int height,
Std::vector<Std::pair<Std::string, ShapeArchive *> > &flexes,
uint32 flags, int32 layer)
- : ModalGump(x, y, width, height, 0, flags, layer),
- _flexes(flexes), _curFlex(0), _curShape(0), _curFrame(0),
- _background(0), _fontNo(0), _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
+ : ModalGump(x, y, width, height, 0, flags, layer), _flexes(flexes),
+ _curFlex(0), _curShape(0), _curFrame(0), _background(0), _fontNo(0),
+ _shapeW(0), _shapeH(0), _shapeX(0), _shapeY(0) {
if (_flexes.size())
_flex = _flexes[0].second;
else
diff --git a/engines/ultima/ultima8/gumps/widgets/button_widget.cpp b/engines/ultima/ultima8/gumps/widgets/button_widget.cpp
index 18da138879..4e43c1572a 100644
--- a/engines/ultima/ultima8/gumps/widgets/button_widget.cpp
+++ b/engines/ultima/ultima8/gumps/widgets/button_widget.cpp
@@ -54,7 +54,8 @@ ButtonWidget::ButtonWidget(int x, int y, Std::string txt, bool gamefont,
ButtonWidget::ButtonWidget(int x, int y, FrameID frame_up, FrameID frame_down,
bool mouseOver, int32 layer)
- : Gump(x, y, 5, 5, 0, 0, layer), _textWidget(0), _mouseOver(mouseOver) {
+ : Gump(x, y, 5, 5, 0, 0, layer), _textWidget(0), _mouseOver(mouseOver),
+ _origW(0), _origH(0), _mouseOverBlendCol(0) {
_shapeUp = GameData::get_instance()->getShape(frame_up);
_shapeDown = GameData::get_instance()->getShape(frame_down);
_frameNumUp = frame_up._frameNum;
diff --git a/engines/ultima/ultima8/usecode/uc_machine.cpp b/engines/ultima/ultima8/usecode/uc_machine.cpp
index fb5a9e28d4..0fda9da3f5 100644
--- a/engines/ultima/ultima8/usecode/uc_machine.cpp
+++ b/engines/ultima/ultima8/usecode/uc_machine.cpp
@@ -896,7 +896,7 @@ void UCMachine::execProcess(UCProcess *p) {
break;
- case 0x38:
+ case 0x38: {
// 38 xx yy
// is element (size xx) in list? (or slist if yy is true)
// free list/slist afterwards
@@ -904,19 +904,23 @@ void UCMachine::execProcess(UCProcess *p) {
ui16a = cs.readByte();
ui32a = cs.readByte();
ui16b = p->_stack.pop2();
- if (ui32a) { // stringlist
+ UCList *l = getList(ui16b);
+ if (!l) {
+ perr << "Invalid list id " << ui16b << Std::endl;
+ error = true;
+ } else if (ui32a) { // stringlist
if (ui16a != 2) {
perr << "Unhandled operand " << ui16a << " to in slist"
<< Std::endl;
error = true;
}
- if (getList(ui16b)->stringInList(p->_stack.pop2()))
+ if (l->stringInList(p->_stack.pop2()))
p->_stack.push2(1);
else
p->_stack.push2(0);
freeStringList(ui16b);
} else {
- bool found = getList(ui16b)->inList(p->_stack.access());
+ bool found = l->inList(p->_stack.access());
p->_stack.addSP(ui16a);
if (found)
p->_stack.push2(1);
@@ -927,7 +931,7 @@ void UCMachine::execProcess(UCProcess *p) {
}
LOGPF(("in list\t\t%s slist==%02X\n", print_bp(ui16a), ui32a));
break;
-
+ }
case 0x39:
// 39
// 16 bit bitwise and
diff --git a/engines/ultima/ultima8/world/actors/actor.cpp b/engines/ultima/ultima8/world/actors/actor.cpp
index 44f8bab067..0a538a0914 100644
--- a/engines/ultima/ultima8/world/actors/actor.cpp
+++ b/engines/ultima/ultima8/world/actors/actor.cpp
@@ -995,7 +995,8 @@ void Actor::clearInCombat() {
if ((_actorFlags & ACT_INCOMBAT) == 0) return;
CombatProcess *cp = getCombatProcess();
- cp->terminate();
+ if (cp)
+ cp->terminate();
clearActorFlag(ACT_INCOMBAT);
}
diff --git a/engines/ultima/ultima8/world/actors/animation_tracker.cpp b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
index 79554adf63..5dac4c0656 100644
--- a/engines/ultima/ultima8/world/actors/animation_tracker.cpp
+++ b/engines/ultima/ultima8/world/actors/animation_tracker.cpp
@@ -44,7 +44,12 @@ namespace Ultima8 {
static const int watchactor = WATCHACTOR;
#endif
-AnimationTracker::AnimationTracker() {
+AnimationTracker::AnimationTracker() : _firstFrame(true), _done(false),
+ _blocked(false), _unsupported(false), _hitObject(0), _mode(NormalMode),
+ _actor(0), _dir(0), _animAction(nullptr), _x(0), _y(0), _z(0),
+ _prevX(0), _prevY(0), _prevZ(0), _startX(0), _startY(0), _startZ(0),
+ _targetDx(0), _targetDy(0), _targetDz(0), _targetOffGroundLeft(0),
+ _firstStep(false), _shapeFrame(0), _currentFrame(0) {
}
AnimationTracker::~AnimationTracker() {
diff --git a/engines/ultima/ultima8/world/actors/combat_process.cpp b/engines/ultima/ultima8/world/actors/combat_process.cpp
index 8537b31c15..9bbfef0b61 100644
--- a/engines/ultima/ultima8/world/actors/combat_process.cpp
+++ b/engines/ultima/ultima8/world/actors/combat_process.cpp
@@ -44,18 +44,15 @@ namespace Ultima8 {
// p_dynamic_cast stuff
DEFINE_RUNTIME_CLASSTYPE_CODE(CombatProcess, Process)
-CombatProcess::CombatProcess() : Process() {
+CombatProcess::CombatProcess() : Process(), _target(0), _fixedTarget(0), _combatMode(CM_WAITING) {
}
-CombatProcess::CombatProcess(Actor *actor_) {
+CombatProcess::CombatProcess(Actor *actor_) : _target(0), _fixedTarget(0), _combatMode(CM_WAITING) {
assert(actor_);
_itemNum = actor_->getObjId();
_type = 0x00F2; // CONSTANT !
- _target = 0;
- _fixedTarget = 0;
- _combatMode = CM_WAITING;
}
void CombatProcess::terminate() {
@@ -239,9 +236,9 @@ ObjId CombatProcess::seekTarget() {
int CombatProcess::getTargetDirection() {
Actor *a = getActor(_itemNum);
- if (!a)
- return 0; // shouldn't happen
Actor *t = getActor(_target);
+ if (!a || !t)
+ return 0; // shouldn't happen
return a->getDirToItemCentre(*t);
}
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.cpp b/engines/ultima/ultima8/world/actors/pathfinder.cpp
index f5031773f5..edfae3b357 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder.cpp
@@ -113,7 +113,9 @@ bool PathNodeCmp::operator()(const PathNode *n1, const PathNode *n2) const {
return (n1->heuristicTotalCost < n2->heuristicTotalCost);
}
-Pathfinder::Pathfinder() {
+Pathfinder::Pathfinder() : _actor(nullptr), _targetItem(nullptr),
+ _hitMode(false), _expandTime(0), _targetX(0), _targetY(0),
+ _targetZ(0), _actorXd(0), _actorYd(0), _actorZd(0) {
expandednodes = 0;
}
diff --git a/engines/ultima/ultima8/world/actors/pathfinder.h b/engines/ultima/ultima8/world/actors/pathfinder.h
index bc618fd5d4..670a896476 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder.h
+++ b/engines/ultima/ultima8/world/actors/pathfinder.h
@@ -34,6 +34,9 @@ class Actor;
class Item;
struct PathfindingState {
+ PathfindingState() : _x(0), _y(0), _z(0), _direction(0),
+ _lastAnim(Animation::walk), _flipped(false),
+ _firstStep(true), _combat(false) {};
int32 _x, _y, _z;
Animation::Sequence _lastAnim;
uint32 _direction;
diff --git a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
index f84691b72f..6e98757efd 100644
--- a/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
+++ b/engines/ultima/ultima8/world/actors/pathfinder_process.cpp
@@ -42,7 +42,8 @@ PathfinderProcess::PathfinderProcess() : Process(),
}
PathfinderProcess::PathfinderProcess(Actor *actor, ObjId item_, bool hit) :
- _currentStep(0), _targetItem(item_), _hitMode(hit) {
+ _currentStep(0), _targetItem(item_), _hitMode(hit),
+ _targetX(0), _targetY(0), _targetZ(0) {
assert(actor);
_itemNum = actor->getObjId();
_type = 0x0204; // CONSTANT !
@@ -78,18 +79,12 @@ PathfinderProcess::PathfinderProcess(Actor *actor, ObjId item_, bool hit) :
actor->setActorFlag(Actor::ACT_PATHFINDING);
}
-PathfinderProcess::PathfinderProcess(Actor *actor_,
- int32 x, int32 y, int32 z) {
+PathfinderProcess::PathfinderProcess(Actor *actor_, int32 x, int32 y, int32 z) :
+ _targetX(x), _targetY(y), _targetZ(z), _targetItem(0), _currentStep(0),
+ _hitMode(false) {
assert(actor_);
_itemNum = actor_->getObjId();
- _targetX = x;
- _targetY = y;
- _targetZ = z;
- _targetItem = 0;
-
- _currentStep = 0;
-
Pathfinder pf;
pf.init(actor_);
pf.setTarget(_targetX, _targetY, _targetZ);
diff --git a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
index 180cd9099f..6e83ce7e17 100644
--- a/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
+++ b/engines/ultima/ultima8/world/actors/teleport_to_egg_process.cpp
@@ -31,8 +31,8 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(TeleportToEggProcess, Process)
-TeleportToEggProcess::TeleportToEggProcess() : Process() {
-
+TeleportToEggProcess::TeleportToEggProcess() : Process(),
+ _mapNum(0), _teleportId(0) {
}
diff --git a/engines/ultima/ultima8/world/actors/weapon_overlay.h b/engines/ultima/ultima8/world/actors/weapon_overlay.h
index e8a066f3eb..411da2947d 100644
--- a/engines/ultima/ultima8/world/actors/weapon_overlay.h
+++ b/engines/ultima/ultima8/world/actors/weapon_overlay.h
@@ -38,8 +38,7 @@ struct WeaponOverlay {
unsigned int _dirCount;
Std::vector<WeaponOverlayFrame> *_frames; // 8 or 16 directions
- WeaponOverlay() {
- _frames = NULL;
+ WeaponOverlay() : _frames(nullptr), _dirCount(0) {
}
~WeaponOverlay() {
delete[] _frames;
diff --git a/engines/ultima/ultima8/world/camera_process.cpp b/engines/ultima/ultima8/world/camera_process.cpp
index 7f9c225adb..84f570255f 100644
--- a/engines/ultima/ultima8/world/camera_process.cpp
+++ b/engines/ultima/ultima8/world/camera_process.cpp
@@ -102,12 +102,14 @@ CameraProcess::CameraProcess(uint16 _itemnum) :
if (_itemNum) {
Item *item = getItem(_itemNum);
-
- // Got it
if (item) {
item->setExtFlag(Item::EXT_CAMERA);
item->getLocation(_ex, _ey, _ez);
_ez += 20; //!!constant
+ } else {
+ _ex = 0;
+ _ey = 0;
+ _ez = 0;
}
return;
}
diff --git a/engines/ultima/ultima8/world/create_item_process.cpp b/engines/ultima/ultima8/world/create_item_process.cpp
index 059089f219..8cf65c9abe 100644
--- a/engines/ultima/ultima8/world/create_item_process.cpp
+++ b/engines/ultima/ultima8/world/create_item_process.cpp
@@ -32,17 +32,19 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(CreateItemProcess, Process)
CreateItemProcess::CreateItemProcess()
- : Process() {
+ : Process(), _shape(0), _frame(0), _quality(0), _flags(0),
+ _npcNum(0), _mapNum(0), _extendedFlags(0),
+ _x(0), _y(0), _z(0) {
}
-CreateItemProcess::CreateItemProcess(uint32 shape_, uint32 frame_,
- uint16 quality_, uint16 flags_,
- uint16 npcnum_, uint16 mapnum_,
- uint32 extendedflags_,
+CreateItemProcess::CreateItemProcess(uint32 shape, uint32 frame,
+ uint16 quality, uint16 flags,
+ uint16 npcnum, uint16 mapnum,
+ uint32 extendedflags,
int32 x, int32 y, int32 z)
- : _shape(shape_), _frame(frame_), _quality(quality_), _flags(flags_),
- _npcNum(npcnum_), _mapNum(mapnum_), _extendedFlags(extendedflags_),
+ : _shape(shape), _frame(frame), _quality(quality), _flags(flags),
+ _npcNum(npcnum), _mapNum(mapnum), _extendedFlags(extendedflags),
_x(x), _y(y), _z(z) {
}
diff --git a/engines/ultima/ultima8/world/gravity_process.cpp b/engines/ultima/ultima8/world/gravity_process.cpp
index 8afb0a3d3f..093a1f41df 100644
--- a/engines/ultima/ultima8/world/gravity_process.cpp
+++ b/engines/ultima/ultima8/world/gravity_process.cpp
@@ -36,7 +36,7 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(GravityProcess, Process)
GravityProcess::GravityProcess()
- : Process() {
+ : Process(), _xSpeed(0), _ySpeed(0), _zSpeed(0), _gravity(0) {
}
diff --git a/engines/ultima/ultima8/world/item.cpp b/engines/ultima/ultima8/world/item.cpp
index 72eb4298b7..0cb15593b2 100644
--- a/engines/ultima/ultima8/world/item.cpp
+++ b/engines/ultima/ultima8/world/item.cpp
@@ -2585,6 +2585,7 @@ uint32 Item::I_legalMoveToContainer(const uint8 *args, unsigned int /*argsize*/)
ARG_ITEM_FROM_PTR(item);
ARG_CONTAINER_FROM_PTR(container);
ARG_UINT16(unknown); // always 0
+ if (!item || !container) return 0; // shouldn't happen?
// try to move item to container checking weight and volume
return item->moveToContainer(container, true);
@@ -2840,7 +2841,7 @@ uint32 Item::I_canReach(const uint8 *args, unsigned int /*argsize*/) {
// TODO: add cheat to make this always return 1
- if (item && item->canReach(other, range))
+ if (item && other && item->canReach(other, range))
return 1;
else
return 0;
diff --git a/engines/ultima/ultima8/world/item_sorter.cpp b/engines/ultima/ultima8/world/item_sorter.cpp
index 51563dd219..773de3c0f4 100644
--- a/engines/ultima/ultima8/world/item_sorter.cpp
+++ b/engines/ultima/ultima8/world/item_sorter.cpp
@@ -43,7 +43,14 @@ namespace Ultima8 {
// This does NOT need to be in the header
struct SortItem {
SortItem(SortItem *n) : _next(n), _prev(nullptr), _itemNum(0),
- _shape(nullptr), _order(-1), _depends() { }
+ _shape(nullptr), _order(-1), _depends(), _shapeNum(0),
+ _frame(0), _flags(0), _extFlags(0), _sx(0), _sy(0),
+ _sx2(0), _sy2(0), _x(0), _y(0), _z(0), _xLeft(0),
+ _yFar(0), _zTop(0), _sxLeft(0), _sxRight(0), _sxTop(0),
+ _syTop(0), _sxBot(0), _syBot(0),_f32x32(false), _flat(false),
+ _occl(false), _solid(false), _draw(false), _roof(false),
+ _noisy(false), _anim(false), _trans(false), _fixed(false),
+ _land(false), _occluded(false), _clipped(0) { }
SortItem *_next;
SortItem *_prev;
@@ -575,7 +582,7 @@ inline bool SortItem::operator<<(const SortItem &si2) const {
ItemSorter::ItemSorter() :
_shapes(nullptr), _surf(nullptr), _items(nullptr), _itemsTail(nullptr),
- _itemsUnused(nullptr), _sortLimit(0) {
+ _itemsUnused(nullptr), _sortLimit(0), _camSx(0), _camSy(0), _orderCounter(0) {
int i = 2048;
while (i--) _itemsUnused = new SortItem(_itemsUnused);
}
diff --git a/engines/ultima/ultima8/world/missile_tracker.cpp b/engines/ultima/ultima8/world/missile_tracker.cpp
index d173d2e228..bb6aa67564 100644
--- a/engines/ultima/ultima8/world/missile_tracker.cpp
+++ b/engines/ultima/ultima8/world/missile_tracker.cpp
@@ -34,25 +34,19 @@ namespace Ultima8 {
MissileTracker::MissileTracker(Item *item, int32 sx, int32 sy, int32 sz,
int32 tx, int32 ty, int32 tz,
- int32 speed, int32 gravity_) {
+ int32 speed, int32 gravity) :
+ _destX(tx), _destY(ty), _destZ(tz), _gravity(gravity) {
_objId = item->getObjId();
- _destX = tx;
- _destY = ty;
- _destZ = tz;
- _gravity = gravity_;
init(sx, sy, sz, speed);
}
MissileTracker::MissileTracker(Item *item, int32 tx, int32 ty, int32 tz,
- int32 speed, int32 gravity_) {
+ int32 speed, int32 gravity) :
+ _destX(tx), _destY(ty), _destZ(tz), _gravity(gravity) {
assert(item->getParent() == 0);
_objId = item->getObjId();
- _destX = tx;
- _destY = ty;
- _destZ = tz;
- _gravity = gravity_;
int32 x, y, z;
item->getLocation(x, y, z);
@@ -140,6 +134,11 @@ bool MissileTracker::isPathClear() {
CurrentMap *map = world->getCurrentMap();
Item *item = getItem(_objId);
+ if (!item) {
+ // Item disappeared? shouldn't happen, but call the path clear.
+ return true;
+ }
+
item->getFootpadWorld(dims[0], dims[1], dims[2]);
item->getLocation(start[0], start[1], start[2]);
diff --git a/engines/ultima/ultima8/world/sprite_process.cpp b/engines/ultima/ultima8/world/sprite_process.cpp
index ec9261bab3..108bacff95 100644
--- a/engines/ultima/ultima8/world/sprite_process.cpp
+++ b/engines/ultima/ultima8/world/sprite_process.cpp
@@ -35,15 +35,16 @@ namespace Ultima8 {
DEFINE_RUNTIME_CLASSTYPE_CODE(SpriteProcess, Process)
SpriteProcess::SpriteProcess()
- : Process() {
-
+ : Process(), _shape(0), _frame(0), _firstFrame(0), _lastFrame(0),
+ _repeats(0), _delay(0), _x(0), _y(0), _z(0), _delayCounter(0),
+ _initialized(false) {
}
-SpriteProcess::SpriteProcess(int Shape, int Frame, int LastFrame,
- int Repeats, int Delay, int x, int y, int z,
+SpriteProcess::SpriteProcess(int shape, int frame, int lastFrame,
+ int repeats, int delay, int x, int y, int z,
bool delayed_init) :
- _shape(Shape), _frame(Frame), _firstFrame(Frame), _lastFrame(LastFrame),
- _repeats(Repeats), _delay(Delay * 2), _x(x), _y(y), _z(z), _delayCounter(0),
+ _shape(shape), _frame(frame), _firstFrame(frame), _lastFrame(lastFrame),
+ _repeats(repeats), _delay(delay * 2), _x(x), _y(y), _z(z), _delayCounter(0),
_initialized(false) {
if (!delayed_init)
init();
More information about the Scummvm-git-logs
mailing list