menu working, still need to fix size and add events

This commit is contained in:
Henrique Santiago 2012-01-03 20:27:31 -02:00
parent 01a2e3a636
commit 7c4191b1e6
9 changed files with 102 additions and 89 deletions

View File

@ -5,14 +5,51 @@ function Thing:createMenu(menuPosition)
menu:addOption('Look', function() Game.look(self) end) menu:addOption('Look', function() Game.look(self) end)
-- Open or Use, depending if thing is a container -- Open or Use, depending if thing is a container
if not self:asCreature() then
if self:isContainer() then if self:isContainer() then
menu:addOption('Open', function() print('open') end) menu:addOption('Open', function() print('open') end)
else else
menu:addOption('Use', function() print('use') end) if self:isMultiUse() then
menu:addOption('Use with ...', function() print('use with...') end)
else
menu:addOption('Use', function() Game.use(self) end)
end end
end
if self:isRotateable() then
menu:addOption('Rotate', function() print('rotate') end)
end
menu:addSeparator()
if not self:isNotMoveable() and self:isPickupable() then
menu:addOption('Trade with ...', function() print('trade with') end)
end
else
menu:addSeparator()
if self:asLocalPlayer() then if self:asLocalPlayer() then
menu:addOption('Set Outfit', function() Game.openOutfitWindow() end) menu:addOption('Set Outfit', function() Game.openOutfitWindow() end)
else
-- todo: check for stop attack/follow
menu:addOption('Attack', function() print('attack') end)
menu:addOption('Follow', function() print('follow') end)
if self:asPlayer() then
menu:addSeparator()
menu:addOption('Message to ' .. self:asCreature():getName(), function() print('message') end)
menu:addOption('Add to VIP list', function() print('vip') end)
menu:addOption('Ignore ' .. self:asCreature():getName(), function() print('ignore') end)
menu:addOption('Invite to Party', function() print('invite to party') end)
end
end
menu:addSeparator()
menu:addOption('Copy Name', function() print('copy name') end)
end end
menu:display(menuPosition) menu:display(menuPosition)

View File

@ -185,6 +185,20 @@ void Game::look(const ThingPtr& thing)
m_protocolGame->sendLookAt(thing->getPosition(), thing->getId(), 0); m_protocolGame->sendLookAt(thing->getPosition(), thing->getId(), 0);
} }
void Game::use(const ThingPtr& thing)
{
// thing is at map
if(thing->getPosition().x != 65535) {
TilePtr tile = g_map.getTile(thing->getPosition());
int stackpos = tile->getThingStackpos(thing);
if(stackpos != -1)
m_protocolGame->sendUseItem(thing->getPosition(), thing->getId(), stackpos, 0);
}
// thing is at inventory
else
m_protocolGame->sendUseItem(thing->getPosition(), thing->getId(), 0, 0); // last 0 has something to do with container
}
void Game::talkChannel(int channelType, int channelId, const std::string& message) void Game::talkChannel(int channelType, int channelId, const std::string& message)
{ {
if(!m_online) if(!m_online)

View File

@ -49,6 +49,7 @@ public:
void walk(Otc::Direction direction); void walk(Otc::Direction direction);
void turn(Otc::Direction direction); void turn(Otc::Direction direction);
void look(const ThingPtr& thing); void look(const ThingPtr& thing);
void use(const ThingPtr& thing);
void talkChannel(int channelType, int channelId, const std::string& message); void talkChannel(int channelType, int channelId, const std::string& message);
void talkPrivate(int channelType, const std::string& receiver, const std::string& message); void talkPrivate(int channelType, const std::string& receiver, const std::string& message);
void openOutfitWindow(); void openOutfitWindow();

View File

@ -82,3 +82,23 @@ bool Thing::isContainer()
{ {
return m_type->properties[ThingType::IsContainer]; return m_type->properties[ThingType::IsContainer];
} }
bool Thing::isMultiUse()
{
return m_type->properties[ThingType::IsMultiUse];
}
bool Thing::isRotateable()
{
return m_type->properties[ThingType::IsRotateable];
}
bool Thing::isNotMoveable()
{
return m_type->properties[ThingType::IsNotMovable];
}
bool Thing::isPickupable()
{
return m_type->properties[ThingType::IsPickupable];
}

View File

@ -67,6 +67,10 @@ public:
virtual StaticTextPtr asStaticText() { return nullptr; } virtual StaticTextPtr asStaticText() { return nullptr; }
bool isContainer(); bool isContainer();
bool isMultiUse();
bool isRotateable();
bool isNotMoveable();
bool isPickupable();
protected: protected:
void internalDraw(const Point& p, int layer); void internalDraw(const Point& p, int layer);

View File

@ -62,14 +62,14 @@ struct ThingType
IsFluidContainer, IsFluidContainer,
IsFluid, IsFluid,
NotWalkable, NotWalkable,
NotMovable, IsNotMovable,
BlockProjectile, BlockProjectile,
NotPathable, NotPathable,
Pickupable, IsPickupable,
IsHangable, IsHangable,
HookSouth, HookSouth,
HookEast, HookEast,
IsRotable, IsRotateable,
HasLight, HasLight,
DontHide, DontHide,
IsTranslucent, IsTranslucent,

View File

@ -133,6 +133,14 @@ ThingPtr Tile::getThing(int stackPos)
return nullptr; return nullptr;
} }
int Tile::getThingStackpos(const ThingPtr& thing)
{
for(uint stackpos = 0; stackpos < m_things.size(); ++stackpos)
if(thing == m_things[stackpos])
return stackpos;
return -1;
}
ThingPtr Tile::getTopThing() ThingPtr Tile::getTopThing()
{ {
if(isEmpty()) if(isEmpty())
@ -262,83 +270,3 @@ bool Tile::isEmpty()
{ {
return m_things.size() == 0; return m_things.size() == 0;
} }
/*bool Tile::canAttack()
{
return hasCreature();
}
bool Tile::canFollow()
{
return hasCreature();
}
bool Tile::canCopyName()
{
return hasCreature();
}*/
// TODO:
/*
Get menu options
if creature:
Look
-----
Attack
Follow
-----
Copy Name
if item:
Look
Use (if not container)
Open (if container)
Use with ... (if multiuse?)
Rotate (if rotable)
-----
Trade with ... (if pickupable?)
if player:
Look
-----
Attack
Follow
-----
Message to NAME
Add to VIP list
Ignore NAME
Invite to Party
-----
Report Offense
-----
Copy Name
if localplayer:
Look
-----
Set Outfit
-----
Copy Name
*/
void Tile::useItem()
{
// Get top item of stack priority 2 (do a function to do this later)
ThingPtr thing;
int lastStackpos = -1;
for(int stackPos = 0; stackPos < (int)m_things.size(); ++stackPos) {
int otherPriority = m_things[stackPos]->getStackPriority();
if(otherPriority == 2) {
thing = m_things[stackPos];
lastStackpos = stackPos;
}
}
if(lastStackpos != -1) {
// use this
g_game.getProtocolGame()->sendUseItem(m_position, thing->getId(), lastStackpos, 0); // 0 has something to do with container
}
}

View File

@ -39,6 +39,7 @@ public:
ThingPtr addThing(const ThingPtr& thing, int stackPos = -1); ThingPtr addThing(const ThingPtr& thing, int stackPos = -1);
ThingPtr getThing(int stackPos); ThingPtr getThing(int stackPos);
int getThingStackpos(const ThingPtr& thing);
ThingPtr getTopThing(); ThingPtr getTopThing();
ThingPtr removeThing(int stackPos); ThingPtr removeThing(int stackPos);
ThingPtr removeThing(const ThingPtr& thing); ThingPtr removeThing(const ThingPtr& thing);

View File

@ -38,9 +38,16 @@ void OTClient::registerLuaFunctions()
g_lua.bindClassMemberFunction<Thing>("getId", &Thing::getId); g_lua.bindClassMemberFunction<Thing>("getId", &Thing::getId);
g_lua.bindClassMemberFunction<Thing>("getType", &Thing::getType); g_lua.bindClassMemberFunction<Thing>("getType", &Thing::getType);
g_lua.bindClassMemberFunction<Thing>("isContainer", &Thing::isContainer); g_lua.bindClassMemberFunction<Thing>("isContainer", &Thing::isContainer);
g_lua.bindClassMemberFunction<Thing>("isMultiUse", &Thing::isMultiUse);
g_lua.bindClassMemberFunction<Thing>("isRotateable", &Thing::isRotateable);
g_lua.bindClassMemberFunction<Thing>("isNotMoveable", &Thing::isNotMoveable);
g_lua.bindClassMemberFunction<Thing>("isPickupable", &Thing::isPickupable);
g_lua.bindClassMemberFunction<Thing>("asCreature", &Thing::asCreature);
g_lua.bindClassMemberFunction<Thing>("asPlayer", &Thing::asPlayer);
g_lua.bindClassMemberFunction<Thing>("asLocalPlayer", &Thing::asLocalPlayer); g_lua.bindClassMemberFunction<Thing>("asLocalPlayer", &Thing::asLocalPlayer);
g_lua.registerClass<Creature, Thing>(); g_lua.registerClass<Creature, Thing>();
g_lua.bindClassMemberFunction("getName", &Creature::getName);
g_lua.bindClassMemberFunction("setOutfit", &Creature::setOutfit); g_lua.bindClassMemberFunction("setOutfit", &Creature::setOutfit);
g_lua.bindClassMemberFunction("getOutfit", &Creature::getOutfit); g_lua.bindClassMemberFunction("getOutfit", &Creature::getOutfit);
@ -58,6 +65,7 @@ void OTClient::registerLuaFunctions()
g_lua.bindClassStaticFunction<Game>("openOutfitWindow", std::bind(&Game::openOutfitWindow, &g_game)); g_lua.bindClassStaticFunction<Game>("openOutfitWindow", std::bind(&Game::openOutfitWindow, &g_game));
g_lua.bindClassStaticFunction<Game>("setOutfit", std::bind(&Game::setOutfit, &g_game, _1)); g_lua.bindClassStaticFunction<Game>("setOutfit", std::bind(&Game::setOutfit, &g_game, _1));
g_lua.bindClassStaticFunction<Game>("look", std::bind(&Game::look, &g_game, _1)); g_lua.bindClassStaticFunction<Game>("look", std::bind(&Game::look, &g_game, _1));
g_lua.bindClassStaticFunction<Game>("use", std::bind(&Game::use, &g_game, _1));
g_lua.registerClass<UIItem, UIWidget>(); g_lua.registerClass<UIItem, UIWidget>();
g_lua.bindClassStaticFunction<UIItem>("create", &UIItem::create<UIItem>); g_lua.bindClassStaticFunction<UIItem>("create", &UIItem::create<UIItem>);