Compare commits

...
3 changed files with 51 additions and 39 deletions
+37 -24
View File
@@ -704,6 +704,24 @@ void gameMouseRefresh()
int primaryAction = -1;
switch (FID_TYPE(pointedObject->fid)) {
case OBJ_TYPE_SCENERY:
case OBJ_TYPE_WALL:
case OBJ_TYPE_MISC: {
if (_obj_action_can_use(pointedObject)) {
primaryAction = GAME_MOUSE_ACTION_MENU_ITEM_USE;
break;
}
primaryAction = GAME_MOUSE_ACTION_MENU_ITEM_LOOK;
// if the pointedObject is scenery/wall/misc object then it finds possible outlined item object behind it
Object* itemObject = gameMouseGetObjectUnderCursor(OBJ_TYPE_ITEM, true, gElevation);
if (itemObject == nullptr) {
break;
}
pointedObject = itemObject;
}
// FALLTHROUGH
case OBJ_TYPE_ITEM:
primaryAction = GAME_MOUSE_ACTION_MENU_ITEM_USE;
if (gGameMouseItemHighlightEnabled) {
@@ -733,16 +751,6 @@ void gameMouseRefresh()
}
}
break;
case OBJ_TYPE_SCENERY:
if (!_obj_action_can_use(pointedObject)) {
primaryAction = GAME_MOUSE_ACTION_MENU_ITEM_LOOK;
} else {
primaryAction = GAME_MOUSE_ACTION_MENU_ITEM_USE;
}
break;
case OBJ_TYPE_WALL:
primaryAction = GAME_MOUSE_ACTION_MENU_ITEM_LOOK;
break;
}
if (primaryAction != -1) {
@@ -993,6 +1001,25 @@ void _gmouse_handle_event(int mouseX, int mouseY, int mouseState)
Object* targetObj = gameMouseGetObjectUnderCursor(-1, true, gElevation);
if (targetObj != nullptr) {
switch (FID_TYPE(targetObj->fid)) {
case OBJ_TYPE_WALL:
case OBJ_TYPE_SCENERY:
case OBJ_TYPE_MISC: {
// if the targetObj is wall/scenery/misc object then it allows to pickup outlined items potentially behind
Object* itemObj = gameMouseGetObjectUnderCursor(OBJ_TYPE_ITEM, true, gElevation);
if (!objectIsOutlined(itemObj)) {
if (_obj_action_can_use(targetObj)) {
_action_use_an_object(gDude, targetObj);
}
break;
}
targetObj = itemObj;
if (objectExamine(gDude, targetObj) == -1) {
objectLookAt(gDude, targetObj);
}
}
// FALLTHROUGH
case OBJ_TYPE_ITEM:
actionPickUp(gDude, targetObj);
break;
@@ -1018,20 +1045,6 @@ void _gmouse_handle_event(int mouseX, int mouseY, int mouseState)
}
}
break;
case OBJ_TYPE_SCENERY:
if (_obj_action_can_use(targetObj)) {
_action_use_an_object(gDude, targetObj);
} else {
if (objectExamine(gDude, targetObj) == -1) {
objectLookAt(gDude, targetObj);
}
}
break;
case OBJ_TYPE_WALL:
if (objectExamine(gDude, targetObj) == -1) {
objectLookAt(gDude, targetObj);
}
break;
}
}
return;
+13 -15
View File
@@ -821,10 +821,8 @@ void _obj_render_pre_roof(Rect* rect, int elevation)
if ((objectListNode->obj->flags & OBJECT_HIDDEN) == 0) {
_obj_render_object(objectListNode->obj, &updatedRect, lightIntensity);
if ((objectListNode->obj->outline & OUTLINE_TYPE_MASK) != 0) {
if ((objectListNode->obj->outline & OUTLINE_DISABLED) == 0 && _outlineCount < 100) {
_outlinedObjects[_outlineCount++] = objectListNode->obj;
}
if (objectIsOutlined(objectListNode->obj) && _outlineCount < 100) {
_outlinedObjects[_outlineCount++] = objectListNode->obj;
}
}
}
@@ -859,10 +857,8 @@ void _obj_render_pre_roof(Rect* rect, int elevation)
if ((objectListNode->obj->flags & OBJECT_HIDDEN) == 0) {
_obj_render_object(object, &updatedRect, lightIntensity);
if ((objectListNode->obj->outline & OUTLINE_TYPE_MASK) != 0) {
if ((objectListNode->obj->outline & OUTLINE_DISABLED) == 0 && _outlineCount < 100) {
_outlinedObjects[_outlineCount++] = objectListNode->obj;
}
if (objectIsOutlined(objectListNode->obj) && _outlineCount < 100) {
_outlinedObjects[_outlineCount++] = objectListNode->obj;
}
}
}
@@ -1881,7 +1877,7 @@ int objectHide(Object* object, Rect* rect)
object->flags |= OBJECT_HIDDEN;
if ((object->outline & OUTLINE_TYPE_MASK) != 0) {
if (objectIsOutlined(object)) {
object->outline |= OUTLINE_DISABLED;
}
@@ -1919,7 +1915,7 @@ int objectDisableOutline(Object* object, Rect* rect)
return -1;
}
if ((object->outline & OUTLINE_TYPE_MASK) != 0) {
if (objectIsOutlined(object)) {
object->outline |= OUTLINE_DISABLED;
}
@@ -2335,10 +2331,7 @@ void objectGetRect(Object* obj, Rect* rect)
return;
}
bool isOutlined = false;
if ((obj->outline & OUTLINE_TYPE_MASK) != 0) {
isOutlined = true;
}
bool isOutlined = objectIsOutlined(obj);
CacheEntry* artHandle;
Art* art = artLock(obj->fid, &artHandle);
@@ -2888,6 +2881,11 @@ void _intensity_mask_buf_to_buf(unsigned char* src, int srcWidth, int srcHeight,
}
}
bool objectIsOutlined(Object* obj)
{
return obj != nullptr && (obj->outline & OUTLINE_TYPE_MASK) != 0 && (obj->outline & OUTLINE_DISABLED) == 0;
}
// 0x48C2B4 obj_outline_object
int objectSetOutline(Object* obj, int outlineType, Rect* rect)
{
@@ -2895,7 +2893,7 @@ int objectSetOutline(Object* obj, int outlineType, Rect* rect)
return -1;
}
if ((obj->outline & OUTLINE_TYPE_MASK) != 0) {
if (objectIsOutlined(obj)) {
return -1;
}
+1
View File
@@ -102,6 +102,7 @@ void _obj_fix_violence_settings(int* fid);
Object* objectTypedFindById(int id, int type);
bool isExitGridAt(int tile, int elevation);
bool objectIsOutlined(Object* obj);
// RAII wrapper for Object*.
class UniqueObject {