コード例 #1
0
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;
}
コード例 #2
0
ファイル: seaview.cpp プロジェクト: TI-ECS/battleship
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());
    }
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
0
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();
}
コード例 #6
0
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;
}
コード例 #7
0
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;
    }

}
コード例 #8
0
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();
  }
}