Browse Source

add shovel to harvest dirt gravel and sand faster

Kolja Strohm 1 year ago
parent
commit
56e9d84d66

+ 2 - 0
FactoryCraft/ItemType.h

@@ -26,6 +26,8 @@ public:
     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;
+    static const int SHOVEL = BlockTypeEnum::MAX_VALUE + 9;
+    static const int SHOVEL_BROKEN = BlockTypeEnum::MAX_VALUE + 10;
 };
 
 class ItemType : public virtual Framework::ReferenceCounter

+ 88 - 0
FactoryCraft/Shovel.cpp

@@ -0,0 +1,88 @@
+#include "Shovel.h"
+#include "Game.h"
+
+ShovelToolItemType::ShovelToolItemType() // TODO: add broken Shovel
+    : BasicToolItemType(ItemTypeEnum::SHOVEL,
+        "Shovel",
+        new ShovelToolLevelUpRule(),
+        0,
+        ModelInfo("tools.m3/shovel", "tools.ltdb/stonehoe.png", 1)) // use same texture as hoe
+{}
+
+Item* ShovelToolItemType::createItem() const
+{
+    return new BasicToolItem(ItemTypeEnum::SHOVEL, "Shovel");
+}
+
+ItemSkill* ShovelToolItemType::createDefaultItemSkill() const
+{
+    return new ShovelToolSkill();
+}
+
+void ShovelToolItemType::loadSuperItemSkill(
+    ItemSkill* zSkill, Framework::StreamReader* zReader) const
+{
+    ShovelToolSkill* skill = dynamic_cast<ShovelToolSkill*>(zSkill);
+    zReader->lese((char*)&skill->level, 4);
+    zReader->lese((char*)&skill->xp, 4);
+    zReader->lese((char*)&skill->maxXP, 4);
+}
+
+void ShovelToolItemType::saveSuperItemSkill(
+    const ItemSkill* zSkill, Framework::StreamWriter* zWriter) const
+{
+    const ShovelToolSkill* skill = dynamic_cast<const ShovelToolSkill*>(zSkill);
+    zWriter->schreibe((char*)&skill->level, 4);
+    zWriter->schreibe((char*)&skill->xp, 4);
+    zWriter->schreibe((char*)&skill->maxXP, 4);
+}
+
+ShovelToolLevelUpRule::ShovelToolLevelUpRule()
+    : ItemSkillLevelUpRule()
+{}
+
+void ShovelToolLevelUpRule::applyOn(ItemSkill* zSkill)
+{
+    ShovelToolSkill* skill = dynamic_cast<ShovelToolSkill*>(zSkill);
+    if (skill->xp >= skill->maxXP)
+    {
+        skill->level++;
+        skill->xp = 0;
+        skill->maxXP = skill->maxXP * 2;
+    }
+}
+
+ShovelToolSkill::ShovelToolSkill()
+    : ItemSkill(ItemTypeEnum::SHOVEL),
+      level(1),
+      xp(0.f),
+      maxXP(10.f)
+{}
+
+void ShovelToolSkill::use(Entity* zActor, Item* zUsedItem, Block* zTarget)
+{
+    if (zActor->getStamina() > 0.0001f)
+    {
+        if (zTarget->zBlockType()->getId() == BlockTypeEnum::DIRT
+            || zTarget->zBlockType()->getId() == BlockTypeEnum::GRAVEL
+            || zTarget->zBlockType()->getId() == BlockTypeEnum::SAND)
+        {
+            float damage
+                = (2 + ((float)level / 3.f)) / (zTarget->getHardness() + 1);
+            zTarget->setHP(zTarget->getHP() - damage);
+            xp += damage / 20;
+            zActor->setStamina(zActor->getStamina() - 0.0001f);
+            zUsedItem->setHp(zUsedItem->getHp() - damage / 50);
+        }
+        else
+        {
+            zActor->setStamina(zActor->getStamina() - 0.0001f);
+            zUsedItem->setHp(zUsedItem->getHp() - 0.001f);
+        }
+    }
+}
+
+void ShovelToolSkill::use(Entity* zActor, Item* zUsedItem, Entity* zTarget)
+{
+    // an Shovel can not be used on an entity
+}

+ 41 - 0
FactoryCraft/Shovel.h

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

+ 23 - 1
FactoryCraft/StaticInitializerOrder.cpp

@@ -17,6 +17,8 @@
 #include "Player.h"
 // item skills
 #include "Axe.h"
+#include "Hoe.h"
+#include "Shovel.h"
 #include "BasicItems.h"
 #include "PlayerHand.h"
 // world updates
@@ -24,7 +26,6 @@
 #include "EntityRemovedUpdate.h"
 // Multiblocks
 #include "Game.h"
-#include "Hoe.h"
 #include "LightSources.h"
 #include "MultiblockTree.h"
 
@@ -625,6 +626,27 @@ void initializeItemTypes()
         ModelInfo("blocks.m3/chest",
             {"blocks.ltdb/chest.png", "blocks.ltdb/chestcover.png"}),
         BlockTypeEnum::CHEST));
+
+    new ShovelToolItemType();
+    (new NoBlockItemType(ItemTypeEnum::SHOVEL_BROKEN,
+        "Broken Shovel",
+        0,
+        0,
+        ModelInfo("tools.m3/shovel", "tools.ltdb/stonehoe.png", 6),
+        []() {
+            return ItemType::createBasicItem(ItemTypeEnum::SHOVEL_BROKEN,
+                "Broken Shovel",
+                100.f,
+                100.f,
+                100.f,
+                100.f,
+                0,
+                0,
+                0,
+                1,
+                0,
+                10);
+        }));
 }
 
 void initializeEntityTypes()

+ 2 - 0
Windows Version/Windows Version.vcxproj

@@ -220,6 +220,7 @@ copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll<
     <ClCompile Include="..\FactoryCraft\SaveCommand.cpp" />
     <ClCompile Include="..\FactoryCraft\Server.cpp" />
     <ClCompile Include="..\FactoryCraft\ShapedNoise.cpp" />
+    <ClCompile Include="..\FactoryCraft\Shovel.cpp" />
     <ClCompile Include="..\FactoryCraft\Start.cpp" />
     <ClCompile Include="..\FactoryCraft\StaticInitializerOrder.cpp" />
     <ClCompile Include="..\FactoryCraft\TickOrganizer.cpp" />
@@ -301,6 +302,7 @@ copy ..\..\..\..\..\Allgemein\Framework\x64\release\Framework.dll Framework.dll<
     <ClInclude Include="..\FactoryCraft\Server.h" />
     <ClInclude Include="..\FactoryCraft\Dimension.h" />
     <ClInclude Include="..\FactoryCraft\ShapedNoise.h" />
+    <ClInclude Include="..\FactoryCraft\Shovel.h" />
     <ClInclude Include="..\FactoryCraft\StaticRegistry.h" />
     <ClInclude Include="..\FactoryCraft\Tickable.h" />
     <ClInclude Include="..\FactoryCraft\TickOrganizer.h" />

+ 6 - 0
Windows Version/Windows Version.vcxproj.filters

@@ -315,6 +315,9 @@
     <ClCompile Include="..\FactoryCraft\Chest.cpp">
       <Filter>world\blocks\storage</Filter>
     </ClCompile>
+    <ClCompile Include="..\FactoryCraft\Shovel.cpp">
+      <Filter>inventory\items\tools</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\FactoryCraft\Chunk.h">
@@ -554,5 +557,8 @@
     <ClInclude Include="..\FactoryCraft\Chest.h">
       <Filter>world\blocks\storage</Filter>
     </ClInclude>
+    <ClInclude Include="..\FactoryCraft\Shovel.h">
+      <Filter>inventory\items\tools</Filter>
+    </ClInclude>
   </ItemGroup>
 </Project>

+ 32 - 0
Windows Version/data/recipies/tools.json

@@ -83,5 +83,37 @@
 		"output": {
 			"itemType": "Axe"
 		}
+	},
+	{
+		"type": "shaped",
+		"group": "inventory",
+		"width": 1,
+		"height": 3,
+		"inputs": [
+			{
+				"x": 0,
+				"y": 0,
+				"filter": {
+					"itemType": "Flint"
+				}
+			},
+			{
+				"x": 0,
+				"y": 1,
+				"filter": {
+					"itemType": "WoodenStick"
+				}
+			},
+			{
+				"x": 0,
+				"y": 2,
+				"filter": {
+					"itemType": "WoodenStick"
+				}
+			}
+		],
+		"output": {
+			"itemType": "Shovel"
+		}
 	}
 ]