Browse Source

added farmland and flint hoe

Kolja Strohm 2 years ago
parent
commit
84cb3844ad

+ 60 - 0
FactoryCraft/BasicTool.cpp

@@ -0,0 +1,60 @@
+#include "BasicTool.h"
+
+
+BasicToolItem::BasicToolItem(int itemTypeId, const char *name)
+    : Item(itemTypeId, name)
+{
+    hp = 10.f;
+    maxHp = 10.f;
+    durability = 10.f;
+    maxDurability = 10.f;
+    usable = 1;
+}
+
+void BasicToolItem::updateBasedOnUsedMaterial() {
+    float basicDurability = 10.f;
+    float headDurabilityModifier = 1.f;
+    float rodDurabilityModifier = 1.f;
+    // TODO: adjust durability modifier based on material
+    float currentDurability = durability / maxDurability;
+    maxDurability
+        = basicDurability * headDurabilityModifier * rodDurabilityModifier;
+    durability = currentDurability * maxDurability;
+}
+
+void BasicToolItem::setHeadMaterial(int headMaterial)
+{
+    this->headMaterial = headMaterial;
+}
+
+void BasicToolItem::setRodMaterial(int rodMaterial)
+{
+    this->rodMaterial = rodMaterial;
+}
+
+
+BasicToolItemType::BasicToolItemType(int id,
+    const char* name,
+    ItemSkillLevelUpRule* levelUpRule,
+    int brokenTypeId,
+    ModelInfo model)
+    : ItemType(id, name, levelUpRule, brokenTypeId, model)
+{}
+
+void BasicToolItemType::loadSuperItem(
+    Item* zItem, Framework::StreamReader* zReader) const
+{
+    ItemType::loadSuperItem(zItem, zReader);
+    BasicToolItem* item = dynamic_cast<BasicToolItem*>(zItem);
+    zReader->lese((char*)&item->headMaterial, 4);
+    zReader->lese((char*)&item->rodMaterial, 4);
+}
+
+void BasicToolItemType::saveSuperItem(
+    const Item* zItem, Framework::StreamWriter* zWriter) const
+{
+    ItemType::saveSuperItem(zItem, zWriter);
+    const BasicToolItem* item = dynamic_cast<const BasicToolItem*>(zItem);
+    zWriter->schreibe((char*)&item->headMaterial, 4);
+    zWriter->schreibe((char*)&item->rodMaterial, 4);
+}

+ 37 - 0
FactoryCraft/BasicTool.h

@@ -0,0 +1,37 @@
+#pragma once
+
+#include "BasicItems.h"
+#include "Item.h"
+
+class BasicToolItemType;
+
+class BasicToolItem : public Item
+{
+private:
+    int headMaterial;
+    int rodMaterial;
+
+protected:
+    virtual void updateBasedOnUsedMaterial();
+
+public:
+    BasicToolItem(int itemTypeId, const char* name);
+    void setHeadMaterial(int headMaterial);
+    void setRodMaterial(int rodMaterial);
+
+    friend BasicToolItemType;
+};
+
+class BasicToolItemType : public ItemType
+{
+protected:
+    BasicToolItemType(int id,
+        const char* name,
+        ItemSkillLevelUpRule* levelUpRule,
+        int brokenTypeId,
+        ModelInfo model);
+    virtual void loadSuperItem(
+        Item* zItem, Framework::StreamReader* zReader) const;
+    virtual void saveSuperItem(
+        const Item* zItem, Framework::StreamWriter* zWriter) const;
+};

+ 2 - 1
FactoryCraft/BlockType.h

@@ -37,8 +37,9 @@ public:
     static const int SEBLING_WOOD_PINE = 20;
     static const int TORCH = 21;
     static const int GRASS = 22;
+    static const int FARMLAND = 23;
 
-    static const int MAX_VALUE = 22;
+    static const int MAX_VALUE = 23;
 };
 
 class BlockType : public virtual Framework::ReferenceCounter

+ 4 - 0
FactoryCraft/FactoryCraft.vcxproj

@@ -100,6 +100,7 @@
     <ClInclude Include="Area.h" />
     <ClInclude Include="BasicBlocks.h" />
     <ClInclude Include="BasicItems.h" />
+    <ClInclude Include="BasicTool.h" />
     <ClInclude Include="BiomGenerator.h" />
     <ClInclude Include="Block.h" />
     <ClInclude Include="BlockType.h" />
@@ -121,6 +122,7 @@
     <ClInclude Include="GenerationTemplate.h" />
     <ClInclude Include="GrasslandBiom.h" />
     <ClInclude Include="Grass.h" />
+    <ClInclude Include="Hoe.h" />
     <ClInclude Include="Inventory.h" />
     <ClInclude Include="Item.h" />
     <ClInclude Include="ItemEntity.h" />
@@ -166,6 +168,7 @@
     <ClCompile Include="Area.cpp" />
     <ClCompile Include="BasicBlock.cpp" />
     <ClCompile Include="BasicItems.cpp" />
+    <ClCompile Include="BasicTool.cpp" />
     <ClCompile Include="BiomGenerator.cpp" />
     <ClCompile Include="Block.cpp" />
     <ClCompile Include="BlockType.cpp" />
@@ -184,6 +187,7 @@
     <ClCompile Include="GenerationTemplate.cpp" />
     <ClCompile Include="GrasslandBiom.cpp" />
     <ClCompile Include="Grass.cpp" />
+    <ClCompile Include="Hoe.cpp" />
     <ClCompile Include="Inventory.cpp" />
     <ClCompile Include="Item.cpp" />
     <ClCompile Include="ItemEntity.cpp" />

+ 15 - 0
FactoryCraft/FactoryCraft.vcxproj.filters

@@ -67,6 +67,9 @@
     <Filter Include="world\structures">
       <UniqueIdentifier>{5565ec67-00d8-460a-b202-9b22323697e4}</UniqueIdentifier>
     </Filter>
+    <Filter Include="inventory\items\tools">
+      <UniqueIdentifier>{1dafa00c-6eca-4e1f-aeda-ba7c1b95265d}</UniqueIdentifier>
+    </Filter>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="Chunk.h">
@@ -261,6 +264,12 @@
     <ClInclude Include="Grass.h">
       <Filter>world\blocks</Filter>
     </ClInclude>
+    <ClInclude Include="Hoe.h">
+      <Filter>inventory\items\tools</Filter>
+    </ClInclude>
+    <ClInclude Include="BasicTool.h">
+      <Filter>inventory\items\tools</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="Server.cpp">
@@ -440,5 +449,11 @@
     <ClCompile Include="Grass.cpp">
       <Filter>world\blocks</Filter>
     </ClCompile>
+    <ClCompile Include="Hoe.cpp">
+      <Filter>inventory\items\tools</Filter>
+    </ClCompile>
+    <ClCompile Include="BasicTool.cpp">
+      <Filter>inventory\items\tools</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>

+ 89 - 0
FactoryCraft/Hoe.cpp

@@ -0,0 +1,89 @@
+#include "Hoe.h"
+
+#include "Game.h"
+
+HoeToolItemType::HoeToolItemType() // TODO: add broken hoe
+    : BasicToolItemType(ItemTypeEnum::HOE, "Hoe", new HoeToolLevelUpRule(), 0, ModelInfo("tools.m3/hoe", "tools.ltdb/stonehoe.png", 1))
+{}
+
+Item* HoeToolItemType::createItem() const
+{
+    return new BasicToolItem(ItemTypeEnum::HOE, "Hoe");
+}
+
+ItemSkill* HoeToolItemType::createDefaultItemSkill() const
+{
+    return new HoeToolSkill();
+}
+
+void HoeToolItemType::loadSuperItemSkill(
+    ItemSkill* zSkill, Framework::StreamReader* zReader) const
+{
+    HoeToolSkill* skill = dynamic_cast<HoeToolSkill*>(zSkill);
+    zReader->lese((char*)&skill->level, 4);
+    zReader->lese((char*)&skill->xp, 4);
+    zReader->lese((char*)&skill->maxXP, 4);
+}
+
+void HoeToolItemType::saveSuperItemSkill(
+    const ItemSkill* zSkill, Framework::StreamWriter* zWriter) const
+{
+    const HoeToolSkill* skill = dynamic_cast<const HoeToolSkill*>(zSkill);
+    zWriter->schreibe((char*)&skill->level, 4);
+    zWriter->schreibe((char*)&skill->xp, 4);
+    zWriter->schreibe((char*)&skill->maxXP, 4);
+}
+
+
+HoeToolLevelUpRule::HoeToolLevelUpRule()
+    : ItemSkillLevelUpRule()
+{}
+
+void HoeToolLevelUpRule::applyOn(ItemSkill* zSkill)
+{
+    HoeToolSkill* skill = dynamic_cast<HoeToolSkill*>(zSkill);
+    if (skill->xp >= skill->maxXP)
+    {
+        skill->level++;
+        skill->xp = 0;
+        skill->maxXP = skill->maxXP * 2;
+    }
+}
+
+HoeToolSkill::HoeToolSkill()
+    : ItemSkill(ItemTypeEnum::HOE),
+      level(1),
+      xp(0.f),
+      maxXP(10.f),
+      nextActionCounter(0)
+{}
+
+void HoeToolSkill::use(Entity* zActor, Item* zUsedItem, Block* zTarget)
+{
+    if (nextActionCounter == 0)
+    {
+        if (zTarget->zBlockType()->getId() == BlockTypeEnum::DIRT)
+        {
+            if (zActor->getStamina() > 0.5f / (float)level)
+            {
+                zActor->setStamina(zActor->getStamina() - 0.5f / (float)level);
+                zUsedItem->setDurability(zUsedItem->getDurability() - 0.5f);
+                Vec3<int> pos = zTarget->getPos();
+                int dimension = zTarget->getDimensionId();
+                xp += 0.5f;
+                Game::INSTANCE->doLater([pos, dimension]() {
+                    Game::INSTANCE->zDimension(dimension)->placeBlock(
+                        pos, BlockTypeEnum::FARMLAND);
+                });
+                nextActionCounter = 20;
+            }
+        }
+    }
+    else if (nextActionCounter > 0)
+        nextActionCounter--;
+}
+
+void HoeToolSkill::use(Entity* zActor, Item* zUsedItem, Entity* zTarget)
+{
+    // a hoe can not be used on an entity
+}

+ 43 - 0
FactoryCraft/Hoe.h

@@ -0,0 +1,43 @@
+#pragma once
+
+#include "ItemType.h"
+#include "ItemSkill.h"
+#include "BasicTool.h"
+
+class HoeToolItemType : public BasicToolItemType
+{
+protected:
+    void loadSuperItemSkill(
+        ItemSkill* zSkill, Framework::StreamReader* zReader) const override;
+    void saveSuperItemSkill(const ItemSkill* zSkill,
+        Framework::StreamWriter* zWriter) const override;
+
+public:
+    HoeToolItemType();
+    Item* createItem() const override;
+    ItemSkill* createDefaultItemSkill() const override;
+};
+
+class HoeToolLevelUpRule : public ItemSkillLevelUpRule
+{
+public:
+    HoeToolLevelUpRule();
+    void applyOn(ItemSkill* zSkill) override;
+};
+
+class HoeToolSkill : public ItemSkill
+{
+private:
+    int level;
+    float xp;
+    float maxXP;
+    int nextActionCounter;
+
+public:
+    HoeToolSkill();
+    void use(Entity* zActor, Item* zUsedItem, Block* zTarget) override;
+    void use(Entity* zActor, Item* zUsedItem, Entity* zTarget) override;
+
+    friend HoeToolItemType;
+    friend HoeToolLevelUpRule;
+};

+ 5 - 0
FactoryCraft/Item.cpp

@@ -24,6 +24,11 @@ void Item::setHp(float hp)
     this->hp = hp;
 }
 
+void Item::setDurability(float durability)
+{
+    this->durability = durability;
+}
+
 void Item::tick() {}
 
 const ItemType* Item::zItemType() const

+ 1 - 0
FactoryCraft/Item.h

@@ -28,6 +28,7 @@ protected:
 
 public:
     void setHp(float hp);
+    void setDurability(float durability);
     virtual void tick();
 
     const ItemType* zItemType() const;

+ 3 - 0
FactoryCraft/ItemType.h

@@ -23,6 +23,9 @@ public:
     static const int RESIN = BlockTypeEnum::MAX_VALUE + 3;
     static const int PLAYER_HAND = BlockTypeEnum::MAX_VALUE + 4;
     static const int STONE_TOOL_BROKEN = BlockTypeEnum::MAX_VALUE + 5;
+    static const int HOE = BlockTypeEnum::MAX_VALUE + 6;
+    static const int BROKEN_HOE = BlockTypeEnum::MAX_VALUE + 7;
+    static const int FLINT = BlockTypeEnum::MAX_VALUE + 8;
 };
 
 class ItemType : public virtual Framework::ReferenceCounter

+ 63 - 7
FactoryCraft/StaticInitializerOrder.cpp

@@ -3,9 +3,9 @@
 #include "StaticRegistry.h"
 // block types
 #include "BasicBlocks.h"
+#include "Grass.h"
 #include "NoBlock.h"
 #include "TreeSeblingBlock.h"
-#include "Grass.h"
 // dimensions
 #include "OverworldDimension.h"
 // entities
@@ -19,6 +19,7 @@
 #include "AddEntityUpdate.h"
 #include "EntityRemovedUpdate.h"
 // Multiblocks
+#include "Hoe.h"
 #include "LightSources.h"
 #include "MultiblockTree.h"
 
@@ -58,7 +59,8 @@ void initializeBlockTypes()
          "Oak Wood"))
         ->setHardness(1.5f)
         ->initializeDefault();
-    (new BasicBlockType(BlockTypeEnum::LEAVES_WOOD_OAK,
+    (new BasicBlockType(
+         BlockTypeEnum::LEAVES_WOOD_OAK,
          ItemTypeEnum::LEAVES_WOOD_OAK,
          ModelInfo("cube", "blocks.ltdb/leaves.png", 6),
          [](Vec3<int> pos) {
@@ -96,7 +98,8 @@ void initializeBlockTypes()
          "Birch Wood"))
         ->setHardness(1.5f)
         ->initializeDefault();
-    (new BasicBlockType(BlockTypeEnum::LEAVES_WOOD_BIRCH,
+    (new BasicBlockType(
+         BlockTypeEnum::LEAVES_WOOD_BIRCH,
          ItemTypeEnum::LEAVES_WOOD_BIRCH,
          ModelInfo("cube", "blocks.ltdb/leaves.png", 6),
          [](Vec3<int> pos) {
@@ -116,7 +119,8 @@ void initializeBlockTypes()
          "Beech Wood"))
         ->setHardness(1.5f)
         ->initializeDefault();
-    (new BasicBlockType(BlockTypeEnum::LEAVES_WOOD_BEECH,
+    (new BasicBlockType(
+         BlockTypeEnum::LEAVES_WOOD_BEECH,
          ItemTypeEnum::LEAVES_WOOD_BEECH,
          ModelInfo("cube", "blocks.ltdb/leaves.png", 6),
          [](Vec3<int> pos) {
@@ -142,7 +146,8 @@ void initializeBlockTypes()
          "Pine Wood"))
         ->setHardness(1.4f)
         ->initializeDefault();
-    (new BasicBlockType(BlockTypeEnum::LEAVES_WOOD_PINE,
+    (new BasicBlockType(
+         BlockTypeEnum::LEAVES_WOOD_PINE,
          ItemTypeEnum::LEAVES_WOOD_PINE,
          ModelInfo("cube", "blocks.ltdb/leaves.png", 6),
          [](Vec3<int> pos) {
@@ -192,7 +197,8 @@ void initializeBlockTypes()
          ItemTypeEnum::SEBLING_WOOD_PINE,
          ModelInfo("blocks.m3/sebling", "blocks.ltdb/sebling.png", 1),
          BlockTypeEnum::WOOD_PINE,
-         BlockTypeEnum::LEAVES_WOOD_PINE, "Pine Wood Sebling"))
+         BlockTypeEnum::LEAVES_WOOD_PINE,
+         "Pine Wood Sebling"))
         ->setHardness(0.1f)
         ->initializeDefault();
     (new GrassBlockType(BlockTypeEnum::GRASS,
@@ -200,6 +206,16 @@ void initializeBlockTypes()
          ModelInfo("grass", "blocks.ltdb/grass.png", 16).setTransparent(),
          "Grass"))
         ->initializeDefault();
+    (new BasicBlockType(BlockTypeEnum::FARMLAND,
+         ItemTypeEnum::DIRT,
+         ModelInfo("cube", {"blocks.ltdb/dirt.png",
+                 "blocks.ltdb/dirt.png",
+                 "blocks.ltdb/dirt.png",
+                 "blocks.ltdb/dirt.png",
+                 "blocks.ltdb/farmland.png",
+                 "blocks.ltdb/dirt.png"}),
+         "Farmland"))
+        ->initializeDefault();
 }
 
 void initializeItemTypes()
@@ -391,7 +407,27 @@ void initializeItemTypes()
         ModelInfo("itemCube", "blocks.ltdb/stone.png", 6),
         []() {
             return ItemType::createBasicItem(ItemTypeEnum::STONE_TOOL_BROKEN,
-                "Stone Tool",
+                "Broken Stone Tool",
+                100.f,
+                100.f,
+                100.f,
+                100.f,
+                0,
+                0,
+                0,
+                1,
+                0,
+                10);
+        }));
+    new HoeToolItemType();
+    new NoBlockItemType(ItemTypeEnum::BROKEN_HOE,
+        "BrokenHoe",
+        0,
+        0,
+        ModelInfo("tools.m3/hoe", "tools.ltdb/stonehoe", 1),
+        []() {
+            return ItemType::createBasicItem(ItemTypeEnum::STONE_TOOL_BROKEN,
+                "Broken Hoe",
                 100.f,
                 100.f,
                 100.f,
@@ -402,6 +438,26 @@ void initializeItemTypes()
                 1,
                 0,
                 10);
+        });
+
+    (new NoBlockItemType(ItemTypeEnum::FLINT,
+        "Flint",
+        0,
+        0,
+        ModelInfo("items.m3/flint", "items.ltdb/flint.png", 1),
+        []() {
+            return ItemType::createBasicItem(ItemTypeEnum::FLINT,
+                "Flint",
+                1.f,
+                1.f,
+                10.f,
+                10.f,
+                0,
+                0,
+                0,
+                1,
+                0,
+                50);
         }));
 }