bool World::erase(ScriptItem item, int amount) { if (amount > item.getNumber()) { amount = item.getNumber(); } if (item.type == ScriptItem::it_inventory || item.type == ScriptItem::it_belt) { //Wenn Item rechts belegt und links ein Belegt ist [Zweihanditem] das Belegt mit l�schen if (item.itempos == RIGHT_TOOL && (item.owner->GetItemAt(LEFT_TOOL)).getId() == BLOCKEDITEM) { item.owner->increaseAtPos(LEFT_TOOL, -255); } else if (item.itempos == LEFT_TOOL && (item.owner->GetItemAt(RIGHT_TOOL)).getId() == BLOCKEDITEM) { item.owner->increaseAtPos(RIGHT_TOOL, -255); } item.owner->increaseAtPos(item.itempos, -amount); return true; } //Item befindet sich auf einen Feld am Boden liegend. else if (item.type == ScriptItem::it_field) { try { Field &field = fieldAt(item.pos); bool erased=false; field.increaseItemOnStack(-amount, erased); if (erased) { sendRemoveItemFromMapToAllVisibleCharacters(item.pos); } else { sendSwapItemOnMapToAllVisibleCharacter(item.getId(), item.pos, item); } return true; } catch (FieldNotFound &) { logMissingField("erase", item.pos); return false; } } else if (item.type == ScriptItem::it_container) { if (item.inside) { item.inside->increaseAtPos(item.itempos, -amount); sendContainerSlotChange(item.inside, item.itempos); return true; } else { return false; } } return false; }
void SeaView::mouseReleaseEvent(QMouseEvent* e) { if (m_screen->active()) { m_screen->onMouseRelease(e->pos()); } int f = fieldAt(e->pos()); if (f == -1) { return; } BattleFieldView* field = m_fields[f]; if (e->button() == Qt::LeftButton) { field->onMouseRelease(e->pos() - field->pos()); } }
ScriptItem World::getItemOnField(const position &pos) { ScriptItem item; try { Field &field = fieldAt(pos); Item it; if (field.viewItemOnStack(it)) { item = it; item.pos = pos; item.type = ScriptItem::it_field; } } catch (FieldNotFound &) { logMissingField("getItemOnField", pos); } return item; }
bool World::swap(ScriptItem item, TYPE_OF_ITEM_ID newitem, unsigned short int newQuality) { if (item.type == ScriptItem::it_inventory || item.type == ScriptItem::it_belt) { item.owner->swapAtPos(item.itempos, newitem, newQuality); return true; } else if (item.type == ScriptItem::it_field) { try { Field &field = fieldAt(item.pos); Item it; if (field.viewItemOnStack(it)) { if (field.swapItemOnStack(newitem, newQuality)) { Item dummy; dummy.setId(newitem); dummy.setNumber(it.getNumber()); if (it.getId() != newitem) { sendSwapItemOnMapToAllVisibleCharacter(it.getId(), item.pos, dummy); } } else { Logger::error(LogFacility::Script) << "World::swap: Swapping item on Field " << item.pos << " failed!" << Log::end; return false; } } } catch (FieldNotFound &) { logMissingField("swap", item.pos); return false; } } else if (item.type == ScriptItem::it_container) { if (item.inside) { item.inside->swapAtPos(item.itempos, newitem, newQuality); sendContainerSlotChange(item.inside, item.itempos); return true; } else { return false; } } return false; }
character_ptr World::createMonster(unsigned short id, const position &pos, short movepoints) { try { Field &field = fieldAt(pos); try { Monster *newMonster = new Monster(id, pos); newMonster->setActionPoints(movepoints); newMonsters.push_back(newMonster); field.setChar(); return character_ptr(newMonster); } catch (Monster::unknownIDException &) { Logger::error(LogFacility::Script) << "World::createMonster: Failed to create monster with unknown id " << id << "!" << Log::end; return character_ptr(); } } catch (FieldNotFound &) { logMissingField("createMonster", pos); return character_ptr(); } return character_ptr(); }
bool World::changeItem(ScriptItem item) { if (item.type == ScriptItem::it_inventory || item.type == ScriptItem::it_belt) { item.owner->items[ item.itempos ] = (Item)item; //Wenn character ein Spieler ist ein update schicken if (item.owner->getType() == Character::player) { dynamic_cast<Player *>(item.owner)->sendCharacterItemAtPos(item.itempos); } item.owner->updateAppearanceForAll(true); return true; } else if (item.type == ScriptItem::it_field) { try { Field &field = fieldAt(item.pos); Item it; if (field.takeItemFromStack(it)) { field.addItemOnStack(static_cast<Item>(item)); if (item.getId() != it.getId() || it.getNumber() != item.getNumber()) { sendSwapItemOnMapToAllVisibleCharacter(it.getId(), item.pos, item); } } return true; } catch (FieldNotFound &) { return false; } } else if (item.type == ScriptItem::it_container) { if (item.inside) { item.inside->changeItem(item); sendContainerSlotChange(item.inside, item.itempos); return true; } } return false; }
bool World::addWarpField(const position &where, const position &target, unsigned short int starttilenr, Item::id_type startitemnr) { try { Field &field = fieldAt(where); if (starttilenr != 0) { field.setTileId(starttilenr); } if (startitemnr != 0) { Item warpfi; warpfi.setId(startitemnr); warpfi.setNumber(1); warpfi.makePermanent(); field.addItemOnStack(warpfi); } field.setWarp(target); return true; } catch (FieldNotFound &) { return false; } }
void CardViewItem::showFullString( const QPoint &itempos, CardViewTip *tip ) { bool trimmed( false ); QString s; int mrg = mView->itemMargin(); int y = mView->d->mBFm->height() + 6 + mrg; int w = mView->itemWidth() - (2 * mrg); int lw; bool drawLabels = mView->drawFieldLabels(); bool isLabel = drawLabels && itempos.x() < w / 2 ? true : false; if ( itempos.y() < y ) { if ( itempos.y() < 8 + mrg || itempos.y() > y - 4 ) return; // this is the caption s = caption(); trimmed = mView->d->mBFm->width( s ) > w - 4; y = 2 + mrg; lw = 0; isLabel = true; } else { // find the field Field *f = fieldAt( itempos ); if ( !f || ( !mView->showEmptyFields() && f->second.isEmpty() ) ) return; // y position: // header font height + 4px hader margin + 2px leading + item margin // + actual field index * (fontheight + 2px leading) int maxLines = mView->maxFieldLines(); bool se = mView->showEmptyFields(); int fh = mView->d->mFm->height(); Field *_f; for ( _f = d->mFieldList.first(); _f != f; _f = d->mFieldList.next() ) if ( se || ! _f->second.isEmpty() ) y += ( qMin( _f->second.count( '\n' ) + 1, maxLines ) * fh ) + 2; if ( isLabel && itempos.y() > y + fh ) return; s = isLabel ? f->first : f->second; int colonWidth = mView->d->mFm->width(":"); lw = drawLabels ? qMin( w / 2 - 4 - mrg, d->maxLabelWidth + colonWidth + 4 ) : 0; int mw = isLabel ? lw - colonWidth : w - lw - ( mrg * 2 ); if ( isLabel ) { trimmed = mView->d->mFm->width( s ) > mw - colonWidth; } else { QRect r( mView->d->mFm->boundingRect( 0, 0, INT_MAX, INT_MAX, Qt::AlignTop|Qt::AlignLeft, s ) ); trimmed = r.width() > mw || r.height() / fh > qMin( s.count( '\n' ) + 1, maxLines ); } } if ( trimmed ) { tip->setFont( (isLabel && !lw) ? mView->headerFont() : mView->font() ); tip->setText( s ); tip->adjustSize(); // find a proper position int lx; lx = isLabel || !drawLabels ? mrg : lw + mrg + 2; QPoint pnt( mView->contentsToViewport( QPoint( d->x, d->y ) ) ); pnt += QPoint( lx, y ); if ( pnt.x() < 0 ) pnt.setX( 0 ); if ( pnt.x() + tip->width() > mView->visibleWidth() ) pnt.setX( mView->visibleWidth() - tip->width() ); if ( pnt.y() + tip->height() > mView->visibleHeight() ) pnt.setY( qMax( 0, mView->visibleHeight() - tip->height() ) ); // show tip->move( pnt ); tip->show(); } }