void PlayerInventoryHud::dragEntity(Entity * io, const Vec2s &pos) { Vec2f anchorPos = g_playerInventoryHud.anchorPosition(); Vec2i iPos = Vec2i(anchorPos); if(g_playerInventoryHud.containsPos(pos)) { if(!GInput->actionPressed(CONTROLS_CUST_STEALTHMODE)) { if((io->ioflags & IO_ITEM) && io->_itemdata->count > 1) { if(io->_itemdata->count - 1 > 0) { Entity * ioo = AddItem(io->classPath()); ioo->show = SHOW_FLAG_NOT_DRAWN; ioo->_itemdata->count = 1; io->_itemdata->count--; ioo->scriptload = 1; ARX_SOUND_PlayInterface(SND_INVSTD); Set_DragInter(ioo); RemoveFromAllInventories(ioo); sInventory = 1; float fX = (pos.x - iPos.x) / (32 * m_scale); float fY = (pos.y - iPos.y) / (32 * m_scale); sInventoryPos.x = checked_range_cast<short>(fX); sInventoryPos.y = checked_range_cast<short>(fY); SendInitScriptEvent(ioo); ARX_INVENTORY_IdentifyIO(ioo); return; } } } } arx_assert(player.bag >= 0); arx_assert(player.bag <= 3); for(size_t bag = 0; bag < size_t(player.bag); bag++) for(size_t y = 0; y < INVENTORY_Y; y++) for(size_t x = 0; x < INVENTORY_X; x++) { INVENTORY_SLOT & slot = inventory[bag][x][y]; if(slot.io == io) { slot.io = NULL; slot.show = true; sInventory = 1; float fX = (pos.x - iPos.x) / (32 * m_scale); float fY = (pos.y - iPos.y) / (32 * m_scale); sInventoryPos.x = checked_range_cast<short>(fX); sInventoryPos.y = checked_range_cast<short>(fY); } } Set_DragInter(io); RemoveFromAllInventories(io); ARX_INVENTORY_IdentifyIO(io); }
void Entity::cleanReferences() { ARX_INTERACTIVE_DestroyIOdelayedRemove(this); if(DRAGINTER == this) { Set_DragInter(NULL); } if(FlyingOverIO == this) { FlyingOverIO = NULL; } if(COMBINE == this) { COMBINE = NULL; } if(pIOChangeWeapon == this) { pIOChangeWeapon = NULL; // TODO we really need a proper weak_ptr } if(ioSteal == this) { ioSteal = NULL; } if(!FAST_RELEASE) { TREATZONE_RemoveIO(this); } gameFlags &= ~GFLAG_ISINTREATZONE; ARX_INTERACTIVE_DestroyDynamicInfo(this); RemoveFromAllInventories(this); ARX_SCRIPT_Timer_Clear_For_IO(this); spells.endByCaster(index()); lightHandleDestroy(ignit_light); if(ignit_sound != audio::INVALID_ID) { ARX_SOUND_Stop(ignit_sound), ignit_sound = audio::INVALID_ID; } }
bool SecondaryInventoryHud::dragEntity(Entity * io, const Vec2s & pos) { if(SecondaryInventory != NULL) { if(g_secondaryInventoryHud.containsPos(pos) && (io->ioflags & IO_ITEM)) { Entity * ioo = SecondaryInventory->io; if(ioo->ioflags & IO_SHOP) { long cos = ARX_INTERACTIVE_GetPrice(io, ioo); float fcos = cos - cos * player.m_skillFull.intuition * 0.005f; cos = checked_range_cast<long>(fcos); if(player.gold < cos) { return false; } ARX_SOUND_PlayInterface(SND_GOLD); player.gold -= cos; if(io->_itemdata->count > 1) { Entity * ioo = CloneIOItem(io); ioo->show = SHOW_FLAG_NOT_DRAWN; ioo->scriptload = 1; ioo->_itemdata->count = 1; io->_itemdata->count--; ARX_SOUND_PlayInterface(SND_INVSTD); Set_DragInter(ioo); return true; } } else if(io->_itemdata->count > 1) { if(!GInput->actionPressed(CONTROLS_CUST_STEALTHMODE)) { Entity * ioo = CloneIOItem(io); ioo->show = SHOW_FLAG_NOT_DRAWN; ioo->scriptload = 1; ioo->_itemdata->count = 1; io->_itemdata->count--; ARX_SOUND_PlayInterface(SND_INVSTD); Set_DragInter(ioo); sInventory = 2; Vec2f calc; calc.x = (pos.x + m_fadePosition - (2 * m_scale)) / (32 * m_scale); calc.y = (pos.y - (13 * m_scale)) / (32 * m_scale); sInventoryPos.x = checked_range_cast<short>(calc.x); sInventoryPos.y = checked_range_cast<short>(calc.y); //ARX_INVENTORY_Object_Out(SecondaryInventory->io, ioo); ARX_INVENTORY_IdentifyIO(ioo); return true; } } } for(long j = 0; j < SecondaryInventory->m_size.y; j++) for(long i = 0; i < SecondaryInventory->m_size.x; i++) { INVENTORY_SLOT & slot = SecondaryInventory->slot[i][j]; if(slot.io != io) continue; slot.io = NULL; slot.show = true; sInventory = 2; float fCalcX = (pos.x + m_fadePosition - (2 * m_scale)) / (32 * m_scale); float fCalcY = (pos.y - (13 * m_scale)) / (32 * m_scale); sInventoryPos.x = checked_range_cast<short>(fCalcX); sInventoryPos.y = checked_range_cast<short>(fCalcY); } } Set_DragInter(io); RemoveFromAllInventories(io); ARX_INVENTORY_IdentifyIO(io); return true; }
void ARX_EQUIPMENT_Equip(Entity * target, Entity * toequip) { if(!target || !toequip || target != entities.player()) return; EntityHandle validid = EntityHandle(); for(size_t i = 0; i < entities.size(); i++) { const EntityHandle handle = EntityHandle(i); Entity * e = entities[handle]; if(e == toequip) { validid = handle; break; } } if(validid == EntityHandle()) return; RemoveFromAllInventories(toequip); toequip->show = SHOW_FLAG_ON_PLAYER; // on player if(toequip == DRAGINTER) Set_DragInter(NULL); if(toequip->type_flags & (OBJECT_TYPE_DAGGER | OBJECT_TYPE_1H | OBJECT_TYPE_2H |OBJECT_TYPE_BOW)) { if(ValidIONum(player.equiped[EQUIP_SLOT_WEAPON])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_WEAPON]]); player.equiped[EQUIP_SLOT_WEAPON] = validid; if(toequip->type_flags & OBJECT_TYPE_BOW) EERIE_LINKEDOBJ_LinkObjectToObject(target->obj, toequip->obj, "weapon_attach", "test", toequip); else EERIE_LINKEDOBJ_LinkObjectToObject(target->obj, toequip->obj, "weapon_attach", "primary_attach", toequip); if((toequip->type_flags & (OBJECT_TYPE_2H | OBJECT_TYPE_BOW)) && ValidIONum(player.equiped[EQUIP_SLOT_SHIELD])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_SHIELD]]); } else if(toequip->type_flags & OBJECT_TYPE_SHIELD) { if(ValidIONum(player.equiped[EQUIP_SLOT_SHIELD])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_SHIELD]]); player.equiped[EQUIP_SLOT_SHIELD] = validid; EERIE_LINKEDOBJ_LinkObjectToObject(target->obj, toequip->obj, "shield_attach", "shield_attach", toequip); if(ValidIONum(player.equiped[EQUIP_SLOT_WEAPON])) { if(entities[player.equiped[EQUIP_SLOT_WEAPON]]->type_flags & (OBJECT_TYPE_2H | OBJECT_TYPE_BOW)) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_WEAPON]]); } } else if(toequip->type_flags & OBJECT_TYPE_RING) { // check first, if not already equiped if (!((ValidIONum(player.equiped[EQUIP_SLOT_RING_LEFT]) && (toequip == entities[player.equiped[EQUIP_SLOT_RING_LEFT]])) || (ValidIONum(player.equiped[EQUIP_SLOT_RING_RIGHT]) && (toequip == entities[player.equiped[EQUIP_SLOT_RING_RIGHT]])))) { long willequip = -1; if(player.equiped[EQUIP_SLOT_RING_LEFT] == EntityHandle()) willequip = EQUIP_SLOT_RING_LEFT; if(player.equiped[EQUIP_SLOT_RING_RIGHT] == EntityHandle()) willequip = EQUIP_SLOT_RING_RIGHT; if(willequip == -1) { if(bRing) { if(ValidIONum(player.equiped[EQUIP_SLOT_RING_RIGHT])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_RING_RIGHT]]); willequip = EQUIP_SLOT_RING_RIGHT; } else { if(ValidIONum(player.equiped[EQUIP_SLOT_RING_LEFT])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_RING_LEFT]]); willequip = EQUIP_SLOT_RING_LEFT; } bRing = !bRing; } player.equiped[willequip] = validid; } } else if(toequip->type_flags & OBJECT_TYPE_ARMOR) { if(ValidIONum(player.equiped[EQUIP_SLOT_ARMOR])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_ARMOR]]); player.equiped[EQUIP_SLOT_ARMOR] = validid; } else if(toequip->type_flags & OBJECT_TYPE_LEGGINGS) { if(ValidIONum(player.equiped[EQUIP_SLOT_LEGGINGS])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_LEGGINGS]]); player.equiped[EQUIP_SLOT_LEGGINGS] = validid; } else if(toequip->type_flags & OBJECT_TYPE_HELMET) { if(ValidIONum(player.equiped[EQUIP_SLOT_HELMET])) ARX_EQUIPMENT_UnEquip(target, entities[player.equiped[EQUIP_SLOT_HELMET]]); player.equiped[EQUIP_SLOT_HELMET] = validid; } if(toequip->type_flags & (OBJECT_TYPE_HELMET | OBJECT_TYPE_ARMOR | OBJECT_TYPE_LEGGINGS)) ARX_EQUIPMENT_RecreatePlayerMesh(); ARX_PLAYER_ComputePlayerFullStats(); }
Entity::~Entity() { cleanReferences(); if(!FAST_RELEASE) { TREATZONE_RemoveIO(this); } if(ignit_light > -1) { DynLight[ignit_light].exist = 0, ignit_light = -1; } if(ignit_sound != audio::INVALID_ID) { ARX_SOUND_Stop(ignit_sound), ignit_sound = audio::INVALID_ID; } if(FlyingOverIO == this) { FlyingOverIO = NULL; } if((MasterCamera.exist & 1) && MasterCamera.io == this) { MasterCamera.exist = 0; } if((MasterCamera.exist & 2) && MasterCamera.want_io == this) { MasterCamera.exist = 0; } ARX_INTERACTIVE_DestroyDynamicInfo(this); IO_UnlinkAllLinkedObjects(this); // Releases ToBeDrawn Transparent Polys linked to this object ! tweaks.clear(); ARX_SCRIPT_Timer_Clear_For_IO(this); if(obj && !(ioflags & IO_CAMERA) && !(ioflags & IO_MARKER) && !(ioflags & IO_GOLD)) { delete obj, obj = NULL; } ARX_SPELLS_RemoveAllSpellsOn(this); delete tweakerinfo; delete tweaky, tweaky = NULL; RemoveFromAllInventories(this); ReleaseScript(&script); ReleaseScript(&over_script); for(long n = 0; n < MAX_ANIMS; n++) { if(anims[n]) { EERIE_ANIMMANAGER_ReleaseHandle(anims[n]); anims[n] = NULL; } } if(damagedata >= 0) { damages[damagedata].exist = 0; } if(ValidDynLight(dynlight)) { DynLight[dynlight].exist = 0, dynlight = -1; } if(ValidDynLight(halo.dynlight)) { DynLight[halo.dynlight].exist = 0, halo.dynlight = -1; } free(usepath); free(symboldraw), symboldraw = NULL; if(ioflags & IO_NPC) { delete _npcdata; } else if(ioflags & IO_ITEM) { free(_itemdata->equipitem); free(_itemdata); } else if(ioflags & IO_FIX) { free(_fixdata); } else if(ioflags & IO_CAMERA && _camdata) { if(ACTIVECAM == &_camdata->cam) { ACTIVECAM = &subj; } free(_camdata); } if(TSecondaryInventory && TSecondaryInventory->io == this) { TSecondaryInventory = NULL; } free(inventory); if(m_index != size_t(-1)) { entities.remove(m_index); } if(pIOChangeWeapon == this) { pIOChangeWeapon = NULL; // TODO we really need a proper weak_ptr } }