Skip to content

Commit

Permalink
- Renamed RoomObject to RenderedMovableEntity
Browse files Browse the repository at this point in the history
- Adapted Room/Trap/Missiles to use the same logic for construction
- Added boulder trap
- Traps now deal damage when Missile hits only (if it hits)
fixes #233
fixes #231
fixes #197
  • Loading branch information
hwoarangmy committed Oct 17, 2014
1 parent 8b299fb commit beb69e5
Show file tree
Hide file tree
Showing 48 changed files with 1,123 additions and 1,015 deletions.
3 changes: 2 additions & 1 deletion CMakeLists.txt
Expand Up @@ -180,7 +180,6 @@ set(OD_SOURCEFILES
${SRC}/CullingManager.cpp
${SRC}/CullingQuad.cpp
${SRC}/DummyArrayClass.cpp
${SRC}/DirectionalTrap.cpp
${SRC}/EditorMode.cpp
${SRC}/FppMode.cpp
${SRC}/GameEntity.cpp
Expand All @@ -207,7 +206,9 @@ set(OD_SOURCEFILES
${SRC}/MenuModeMultiplayerServer.cpp
${SRC}/MenuModeSkirmish.cpp
${SRC}/MiniMap.cpp
${SRC}/MissileBoulder.cpp
${SRC}/MissileObject.cpp
${SRC}/MissileOneHit.cpp
${SRC}/ModeManager.cpp
${SRC}/MortuaryQuad.cpp
${SRC}/MovableGameEntity.cpp
Expand Down
4 changes: 3 additions & 1 deletion CREDITS
Expand Up @@ -116,7 +116,8 @@ textures/
-> TentacleBed.png West CC0 http://forum.freegamedev.net/viewtopic.php?p=60091#p60091
-> TrainingDummy2_texture.png Danimal CC-BY-SA 3.0 http://forum.freegamedev.net/viewtopic.php?p=59239#p59239
-> TrainingDummy3.png P0ss CC-BY 3.0 http://forum.freegamedev.net/viewtopic.php?p=59351#p59351
-> TrainingDummy4.png Nobiax CC0 http://forum.freegamedev.net/viewtopic.php?p=59621#p59621p=59621#p59621
-> TrainingDummy4.png Nobiax CC0 http://forum.freegamedev.net/viewtopic.php?p=59621#p59621
-> Boulder.png Nobiax CC0 http://forum.freegamedev.net/viewtopic.php?p=59832#p59832


======================
Expand Down Expand Up @@ -210,6 +211,7 @@ Troll_Rock.mesh Dm3d CC-BY-SA 3.0
Water* Skorpio CC-BY-SA 3.0, GPL 3.0
Wizard.* Skorpio CC-BY-SA 3.0, GPL 3.0
Wyvern.* Andrew Buck, Skorpio CC-BY-SA 3.0, GPL 3.0
Boulder.* Danimal CC-BY-SA 3.0 http://forum.freegamedev.net/viewtopic.php?p=59832#p59832


====================
Expand Down
1 change: 1 addition & 0 deletions gui/OpenDungeonsIcons.imageset
Expand Up @@ -19,5 +19,6 @@

<Image height="60" name="CannonButton" width="60" xPos="132" yPos="159" />
<Image height="60" name="SpikeTrapButton" width="60" xPos="194" yPos="159" />
<Image height="60" name="BoulderTrapButton" width="60" xPos="256" yPos="159" />
<Image height="60" name="DestroyTrapButton" width="60" xPos="450" yPos="97" />
</Imageset>
Binary file modified gui/OpenDungeonsIcons.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions gui/OpenDungeonsMenuTraps.layout
Expand Up @@ -19,6 +19,12 @@
<Property name="TooltipText" value="Build a spike trap" />
<Property name="InheritsAlpha" value="False" />
</Window>
<Window type="OD/ImageButton" name="BoulderTrapButton" >
<Property name="Area" value="{{0,160},{0,20},{0,220},{0,80}}" />
<Property name="NormalImage" value="OpenDungeonsIcons/BoulderTrapButton" />
<Property name="TooltipText" value="Build a boulder trap" />
<Property name="InheritsAlpha" value="False" />
</Window>
<Window type="OD/ImageButton" name="DestroyTrapButton" >
<Property name="Area" value="{{0,20},{0,20},{0,80},{0,80}}" />
<Property name="NormalImage" value="OpenDungeonsIcons/DestroyTrapButton" />
Expand Down
42 changes: 42 additions & 0 deletions materials/scripts/Boulder.material
@@ -0,0 +1,42 @@
// Boulder genrated by blender2ogre 0.6.0

material Boulder
{
receive_shadows on

technique
{
pass Boulder
{
ambient 0.800000011920929 0.800000011920929 0.800000011920929 1.0
diffuse 0.6400000190734865 0.6400000190734865 0.6400000190734865 1.0
specular 0.0 0.0 0.0 1.0 12.5
emissive 0.0 0.0 0.0 1.0

alpha_to_coverage off
colour_write on
cull_hardware clockwise
depth_check on
depth_func less_equal
depth_write on
illumination_stage
light_clip_planes off
light_scissor off
lighting on
normalise_normals off
polygon_mode solid
scene_blend one zero
scene_blend_op add
shading gouraud
transparent_sorting on

texture_unit
{
texture Boulder.png
tex_address_mode wrap
scale 1.0 1.0
colour_op modulate
}
}
}
}
Binary file added materials/textures/Boulder.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added models/Boulder.mesh
Binary file not shown.
105 changes: 31 additions & 74 deletions source/ChickenEntity.cpp
Expand Up @@ -18,7 +18,6 @@
#include "ChickenEntity.h"
#include "ODPacket.h"
#include "GameMap.h"
#include "RoomTreasury.h"
#include "Random.h"
#include "LogManager.h"

Expand All @@ -30,16 +29,18 @@ const int32_t NB_TURNS_DIE_BEFORE_REMOVE = 5;
ChickenEntity::ChickenEntity(GameMap* gameMap, const std::string& hatcheryName) :
RenderedMovableEntity(gameMap, hatcheryName, "Chicken", 0.0f),
mChickenState(ChickenState::free),
nbTurnOutsideHatchery(0),
nbTurnDie(0)
mNbTurnOutsideHatchery(0),
mNbTurnDie(0),
mIsDropped(false)
{
}

ChickenEntity::ChickenEntity(GameMap* gameMap) :
RenderedMovableEntity(gameMap),
mChickenState(ChickenState::free),
nbTurnOutsideHatchery(0),
nbTurnDie(0)
mNbTurnOutsideHatchery(0),
mNbTurnDie(0),
mIsDropped(false)
{
setMeshName("Chicken");
}
Expand All @@ -52,7 +53,7 @@ void ChickenEntity::doUpkeep()
return;

Tile* tile = getPositionTile();
OD_ASSERT_TRUE_MSG(tile != nullptr, "tile=" + Tile::displayAsString(tile));
OD_ASSERT_TRUE_MSG(tile != nullptr, "entityName=" + getName());
if(tile == nullptr)
return;

Expand All @@ -61,9 +62,9 @@ void ChickenEntity::doUpkeep()

if(mChickenState == ChickenState::dying)
{
if(nbTurnDie < NB_TURNS_DIE_BEFORE_REMOVE)
if(mNbTurnDie < NB_TURNS_DIE_BEFORE_REMOVE)
{
nbTurnDie++;
++mNbTurnDie;
return;
}
mChickenState = ChickenState::dead;
Expand All @@ -82,19 +83,19 @@ void ChickenEntity::doUpkeep()
Room* currentHatchery = tile->getCoveringRoom();
if((currentHatchery != nullptr) && (currentHatchery->getType() == Room::RoomType::hatchery))
{
nbTurnOutsideHatchery = 0;
mNbTurnOutsideHatchery = 0;
}
else
{
// If we are outside a hatchery for too long, we die
if(nbTurnOutsideHatchery >= NB_TURNS_OUTSIDE_HATCHERY_BEFORE_DIE)
if(mNbTurnOutsideHatchery >= NB_TURNS_OUTSIDE_HATCHERY_BEFORE_DIE)
{
mChickenState = ChickenState::dying;
tile->removeChickenEntity(this);
setAnimationState("Die", false);
return;
}
++nbTurnOutsideHatchery;
++mNbTurnOutsideHatchery;
}

// Handle normal behaviour : move or pick (if not already moving)
Expand Down Expand Up @@ -173,8 +174,8 @@ bool ChickenEntity::tryPickup(Seat* seat, bool isEditorMode)
return false;

Tile* tile = getPositionTile();
OD_ASSERT_TRUE_MSG(tile != NULL, "tile=" + Tile::displayAsString(tile));
if(tile == NULL)
OD_ASSERT_TRUE_MSG(tile != nullptr, "entityName=" + getName());
if(tile == nullptr)
return false;

if(!tile->isClaimedForSeat(seat) && !isEditorMode)
Expand All @@ -187,7 +188,7 @@ void ChickenEntity::pickup()
{
Tile* tile = getPositionTile();
RenderedMovableEntity::pickup();
OD_ASSERT_TRUE_MSG(tile != nullptr, "tile=" + Tile::displayAsString(tile));
OD_ASSERT_TRUE_MSG(tile != nullptr, "entityName=" + getName());
if(tile == nullptr)
return;
OD_ASSERT_TRUE(tile->removeChickenEntity(this));
Expand All @@ -209,6 +210,13 @@ bool ChickenEntity::tryDrop(Seat* seat, Tile* tile, bool isEditorMode)
return false;
}

void ChickenEntity::drop(const Ogre::Vector3& v)
{
mIsDropped = true;
RenderedMovableEntity::drop(v);
mIsDropped = false;
}

void ChickenEntity::setPosition(const Ogre::Vector3& v)
{
if(!getIsOnMap())
Expand All @@ -220,21 +228,22 @@ void ChickenEntity::setPosition(const Ogre::Vector3& v)
Tile* oldTile = getPositionTile();
RenderedMovableEntity::setPosition(v);
Tile* tile = getPositionTile();
OD_ASSERT_TRUE_MSG(tile != nullptr, "tile=" + Tile::displayAsString(tile));
OD_ASSERT_TRUE_MSG(tile != nullptr, "entityName=" + getName());
if(tile == nullptr)
return;
if(tile == oldTile)
if(!mIsDropped && (tile == oldTile))
return;

if(oldTile != nullptr)
oldTile->removeChickenEntity(this);

tile->addChickenEntity(this);
OD_ASSERT_TRUE(tile->addChickenEntity(this));
}

bool ChickenEntity::eatChicken(Creature* creature)
{
Tile* tile = getPositionTile();
OD_ASSERT_TRUE_MSG(tile != nullptr, "tile=" + Tile::displayAsString(tile));
OD_ASSERT_TRUE_MSG(tile != nullptr, "entityName=" + getName());
if(tile == nullptr)
return false;

Expand All @@ -246,72 +255,20 @@ bool ChickenEntity::eatChicken(Creature* creature)
return true;
}

const char* ChickenEntity::getFormat()
{
// TODO : implement saving/loading in the level file
return "position";
}

ChickenEntity* ChickenEntity::getChickenEntityFromStream(GameMap* gameMap, std::istream& is)
{
ChickenEntity* obj = new ChickenEntity(gameMap);
Ogre::Vector3 position;
Ogre::Real x, y, z;
OD_ASSERT_TRUE(is >> x >> y >> z);
obj->setPosition(Ogre::Vector3(x, y, z));
Tile* tile = obj->getPositionTile();
OD_ASSERT_TRUE(tile != nullptr);
if(tile != nullptr)
tile->addChickenEntity(obj);
return obj;

}

ChickenEntity* ChickenEntity::getChickenEntityFromPacket(GameMap* gameMap, ODPacket& packet)
ChickenEntity* ChickenEntity::getChickenEntityFromPacket(GameMap* gameMap, ODPacket& is)
{
ChickenEntity* obj = new ChickenEntity(gameMap);
OD_ASSERT_TRUE(packet >> obj);
Tile* tile = obj->getPositionTile();
OD_ASSERT_TRUE(tile != nullptr);
if(tile != nullptr)
tile->addChickenEntity(obj);

return obj;
}

void ChickenEntity::exportToPacket(ODPacket& packet)
{
packet << this;
}

std::ostream& operator<<(std::ostream& os, ChickenEntity* obj)
{
std::string name = obj->getName();
Ogre::Vector3 position = obj->getPosition();
os << name;
os << position.x;
os << position.y;
os << position.z;
return os;
}

ODPacket& operator>>(ODPacket& is, ChickenEntity* obj)
{
std::string name;
OD_ASSERT_TRUE(is >> name);
obj->setName(name);
Ogre::Vector3 position;
OD_ASSERT_TRUE(is >> position);
obj->setPosition(position);
return is;
}

ODPacket& operator<<(ODPacket& os, ChickenEntity* obj)
const char* ChickenEntity::getFormat()
{
std::string name = obj->getName();
std::string meshName = obj->getMeshName();
Ogre::Vector3 position = obj->getPosition();
os << name;
os << position;
return os;
// TODO : implement saving/loading in the level file
return "position";
}
16 changes: 7 additions & 9 deletions source/ChickenEntity.h
Expand Up @@ -42,19 +42,16 @@ class ChickenEntity: public RenderedMovableEntity
{ return RenderedMovableEntityType::chickenEntity; }

virtual bool tryPickup(Seat* seat, bool isEditorMode);
virtual void pickup();
virtual bool tryDrop(Seat* seat, Tile* tile, bool isEditorMode);
virtual void drop(const Ogre::Vector3& v);

virtual void exportToPacket(ODPacket& packet);
virtual void pickup();
virtual void setPosition(const Ogre::Vector3& v);
bool eatChicken(Creature* creature);

static const char* getFormat();
static ChickenEntity* getChickenEntityFromStream(GameMap* gameMap, std::istream& is);
static ChickenEntity* getChickenEntityFromPacket(GameMap* gameMap, ODPacket& packet);
friend ODPacket& operator<<(ODPacket& os, ChickenEntity* obj);
friend ODPacket& operator>>(ODPacket& os, ChickenEntity* obj);
friend std::ostream& operator<<(std::ostream& os, ChickenEntity* obj);
static ChickenEntity* getChickenEntityFromPacket(GameMap* gameMap, ODPacket& is);
static const char* getFormat();
private:
enum ChickenState
{
Expand All @@ -64,8 +61,9 @@ class ChickenEntity: public RenderedMovableEntity
dead
};
ChickenState mChickenState;
int32_t nbTurnOutsideHatchery;
int32_t nbTurnDie;
int32_t mNbTurnOutsideHatchery;
int32_t mNbTurnDie;
bool mIsDropped;

void addTileToListIfPossible(int x, int y, Room* currentHatchery, std::vector<Tile*>& possibleTileMove);
};
Expand Down
20 changes: 10 additions & 10 deletions source/Creature.cpp
Expand Up @@ -1695,7 +1695,7 @@ bool Creature::handleDepositGoldAction()
popAction();

Tile* tile = getPositionTile();
OD_ASSERT_TRUE_MSG(tile != nullptr, "tile=" + Tile::displayAsString(tile));
OD_ASSERT_TRUE_MSG(tile != nullptr, "entityName=" + getName());
if(tile == nullptr)
return true;
TreasuryObject* obj = new TreasuryObject(getGameMap(), mGold);
Expand Down Expand Up @@ -1955,6 +1955,15 @@ bool Creature::handleEatingAction(bool isForced)
return false;
}

if ((isForced && mHunger < 5.0) ||
(!isForced && mHunger <= Random::Double(0.0, 15.0)))
{
popAction();

stopEating();
return true;
}

// If we are in a hatchery, we go to the closest chicken in it. If we are not
// in a hatchery, we check if there is a free chicken and eat it if we see it
Tile* closestChickenTile = nullptr;
Expand Down Expand Up @@ -2026,15 +2035,6 @@ bool Creature::handleEatingAction(bool isForced)
}
}

if ((isForced && mHunger < 5.0) ||
(!isForced && mHunger <= Random::Double(0.0, 25.0)))
{
popAction();

stopEating();
return true;
}

if(mEatRoom != nullptr)
return false;

Expand Down

0 comments on commit beb69e5

Please sign in to comment.