New kind of tool speed and wear calculation thingy

This commit is contained in:
Perttu Ahola 2011-11-13 15:45:38 +02:00
parent e19d1ea95a
commit f97d4355be
4 changed files with 232 additions and 160 deletions

@ -31,12 +31,65 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define WATER_VISC 1 #define WATER_VISC 1
#define LAVA_VISC 7 #define LAVA_VISC 7
// TODO: Get rid of these and set up some attributes like toughness, void setConstantMaterialProperties(MaterialProperties &mprop, float time)
// fluffyness, and a funciton to calculate time and durability loss {
// (and sound? and whatever else) from them mprop.diggability = DIGGABLE_CONSTANT;
void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness); mprop.constant_time = time;
void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness); }
void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness);
void setStoneLikeMaterialProperties(MaterialProperties &mprop, float toughness)
{
mprop.diggability = DIGGABLE_NORMAL;
mprop.weight = 5.0 * toughness;
mprop.crackiness = 1.0;
mprop.crumbliness = -0.1;
mprop.cuttability = -0.2;
}
void setDirtLikeMaterialProperties(MaterialProperties &mprop, float toughness)
{
mprop.diggability = DIGGABLE_NORMAL;
mprop.weight = toughness * 2.0;
mprop.crackiness = 0;
mprop.crumbliness = 1.2;
mprop.cuttability = -0.4;
}
void setGravelLikeMaterialProperties(MaterialProperties &mprop, float toughness)
{
mprop.diggability = DIGGABLE_NORMAL;
mprop.weight = toughness * 2.0;
mprop.crackiness = 0.5;
mprop.crumbliness = 1.5;
mprop.cuttability = -1.0;
}
void setWoodLikeMaterialProperties(MaterialProperties &mprop, float toughness)
{
mprop.diggability = DIGGABLE_NORMAL;
mprop.weight = toughness * 1.0;
mprop.crackiness = 2.0;
mprop.crumbliness = -1.0;
mprop.cuttability = 2.0;
}
void setLeavesLikeMaterialProperties(MaterialProperties &mprop, float toughness)
{
mprop.diggability = DIGGABLE_NORMAL;
mprop.weight = -0.5 * toughness;
mprop.crackiness = 0;
mprop.crumbliness = 0;
mprop.cuttability = 2.0;
}
void setGlassLikeMaterialProperties(MaterialProperties &mprop, float toughness)
{
mprop.diggability = DIGGABLE_NORMAL;
mprop.weight = 0.5 * toughness;
mprop.crackiness = 2.0;
mprop.crumbliness = -1.0;
mprop.cuttability = -1.0;
}
/* /*
A conversion table for backwards compatibility. A conversion table for backwards compatibility.
@ -131,7 +184,7 @@ void content_mapnode_init()
f->is_ground_content = true; f->is_ground_content = true;
f->often_contains_mineral = true; f->often_contains_mineral = true;
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_COBBLE)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_COBBLE)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 1.0); setStoneLikeMaterialProperties(f->material, 1.0);
if(invisible_stone) if(invisible_stone)
f->solidness = 0; // For debugging, hides regular stone f->solidness = 0; // For debugging, hides regular stone
@ -143,7 +196,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_MUD)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_MUD)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0); setDirtLikeMaterialProperties(f->material, 1.0);
i = CONTENT_GRASS_FOOTSTEPS; i = CONTENT_GRASS_FOOTSTEPS;
f = &content_features(i); f = &content_features(i);
@ -153,7 +206,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_MUD)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_MUD)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0); setDirtLikeMaterialProperties(f->material, 1.0);
i = CONTENT_MUD; i = CONTENT_MUD;
f = &content_features(i); f = &content_features(i);
@ -162,7 +215,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0); setDirtLikeMaterialProperties(f->material, 1.0);
i = CONTENT_SAND; i = CONTENT_SAND;
f = &content_features(i); f = &content_features(i);
@ -171,7 +224,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0); setDirtLikeMaterialProperties(f->material, 1.0);
i = CONTENT_GRAVEL; i = CONTENT_GRAVEL;
f = &content_features(i); f = &content_features(i);
@ -180,7 +233,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.75); setGravelLikeMaterialProperties(f->material, 1.0);
i = CONTENT_SANDSTONE; i = CONTENT_SANDSTONE;
f = &content_features(i); f = &content_features(i);
@ -189,7 +242,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAND)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAND)+" 1";
setDirtLikeDiggingProperties(f->digging_properties, 1.0); setDirtLikeMaterialProperties(f->material, 1.0);
i = CONTENT_CLAY; i = CONTENT_CLAY;
f = &content_features(i); f = &content_features(i);
@ -198,7 +251,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("CraftItem lump_of_clay 4"); f->dug_item = std::string("CraftItem lump_of_clay 4");
setDirtLikeDiggingProperties(f->digging_properties, 1.0); setDirtLikeMaterialProperties(f->material, 1.0);
i = CONTENT_BRICK; i = CONTENT_BRICK;
f = &content_features(i); f = &content_features(i);
@ -207,7 +260,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("CraftItem clay_brick 4"); f->dug_item = std::string("CraftItem clay_brick 4");
setStoneLikeDiggingProperties(f->digging_properties, 1.0); setStoneLikeMaterialProperties(f->material, 1.0);
i = CONTENT_TREE; i = CONTENT_TREE;
f = &content_features(i); f = &content_features(i);
@ -217,7 +270,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 1.0); setWoodLikeMaterialProperties(f->material, 1.0);
i = CONTENT_JUNGLETREE; i = CONTENT_JUNGLETREE;
f = &content_features(i); f = &content_features(i);
@ -227,7 +280,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
//f->is_ground_content = true; //f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 1.0); setWoodLikeMaterialProperties(f->material, 1.0);
i = CONTENT_JUNGLEGRASS; i = CONTENT_JUNGLEGRASS;
f = &content_features(i); f = &content_features(i);
@ -240,7 +293,7 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces f->solidness = 0; // drawn separately, makes no faces
f->walkable = false; f->walkable = false;
setWoodLikeDiggingProperties(f->digging_properties, 0.10); setLeavesLikeMaterialProperties(f->material, 1.0);
i = CONTENT_LEAVES; i = CONTENT_LEAVES;
f = &content_features(i); f = &content_features(i);
@ -262,7 +315,7 @@ void content_mapnode_init()
f->extra_dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAPLING)+" 1"; f->extra_dug_item = std::string("MaterialItem2 ")+itos(CONTENT_SAPLING)+" 1";
f->extra_dug_item_rarity = 20; f->extra_dug_item_rarity = 20;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 0.15); setLeavesLikeMaterialProperties(f->material, 1.0);
i = CONTENT_CACTUS; i = CONTENT_CACTUS;
f = &content_features(i); f = &content_features(i);
@ -273,7 +326,7 @@ void content_mapnode_init()
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 0.75); setWoodLikeMaterialProperties(f->material, 0.75);
i = CONTENT_PAPYRUS; i = CONTENT_PAPYRUS;
f = &content_features(i); f = &content_features(i);
@ -285,7 +338,7 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
f->solidness = 0; // drawn separately, makes no faces f->solidness = 0; // drawn separately, makes no faces
f->walkable = false; f->walkable = false;
setWoodLikeDiggingProperties(f->digging_properties, 0.25); setLeavesLikeMaterialProperties(f->material, 0.5);
i = CONTENT_BOOKSHELF; i = CONTENT_BOOKSHELF;
f = &content_features(i); f = &content_features(i);
@ -297,7 +350,7 @@ void content_mapnode_init()
//f->setInventoryTextureCube("wood.png", "bookshelf.png", "bookshelf.png"); //f->setInventoryTextureCube("wood.png", "bookshelf.png", "bookshelf.png");
f->param_type = CPT_MINERAL; f->param_type = CPT_MINERAL;
f->is_ground_content = true; f->is_ground_content = true;
setWoodLikeDiggingProperties(f->digging_properties, 0.75); setWoodLikeMaterialProperties(f->material, 0.75);
i = CONTENT_GLASS; i = CONTENT_GLASS;
f = &content_features(i); f = &content_features(i);
@ -310,7 +363,7 @@ void content_mapnode_init()
f->visual_solidness = 1; f->visual_solidness = 1;
f->setAllTextures("glass.png"); f->setAllTextures("glass.png");
f->setInventoryTextureCube("glass.png", "glass.png", "glass.png"); f->setInventoryTextureCube("glass.png", "glass.png", "glass.png");
setWoodLikeDiggingProperties(f->digging_properties, 0.15); setGlassLikeMaterialProperties(f->material, 1.0);
i = CONTENT_FENCE; i = CONTENT_FENCE;
f = &content_features(i); f = &content_features(i);
@ -322,7 +375,7 @@ void content_mapnode_init()
f->air_equivalent = true; // grass grows underneath f->air_equivalent = true; // grass grows underneath
f->setInventoryTexture("fence.png"); f->setInventoryTexture("fence.png");
f->used_texturenames["fence.png"] = true; f->used_texturenames["fence.png"] = true;
setWoodLikeDiggingProperties(f->digging_properties, 0.75); setWoodLikeMaterialProperties(f->material, 0.75);
i = CONTENT_RAIL; i = CONTENT_RAIL;
f = &content_features(i); f = &content_features(i);
@ -336,7 +389,7 @@ void content_mapnode_init()
f->air_equivalent = true; // grass grows underneath f->air_equivalent = true; // grass grows underneath
f->walkable = false; f->walkable = false;
f->selection_box.type = NODEBOX_FIXED; f->selection_box.type = NODEBOX_FIXED;
setDirtLikeDiggingProperties(f->digging_properties, 0.75); setDirtLikeMaterialProperties(f->material, 0.75);
i = CONTENT_LADDER; i = CONTENT_LADDER;
f = &content_features(i); f = &content_features(i);
@ -352,14 +405,14 @@ void content_mapnode_init()
f->walkable = false; f->walkable = false;
f->climbable = true; f->climbable = true;
f->selection_box.type = NODEBOX_WALLMOUNTED; f->selection_box.type = NODEBOX_WALLMOUNTED;
setWoodLikeDiggingProperties(f->digging_properties, 0.5); setWoodLikeMaterialProperties(f->material, 0.5);
// Deprecated // Deprecated
i = CONTENT_COALSTONE; i = CONTENT_COALSTONE;
f = &content_features(i); f = &content_features(i);
f->setAllTextures("stone.png^mineral_coal.png"); f->setAllTextures("stone.png^mineral_coal.png");
f->is_ground_content = true; f->is_ground_content = true;
setStoneLikeDiggingProperties(f->digging_properties, 1.5); setStoneLikeMaterialProperties(f->material, 1.5);
i = CONTENT_WOOD; i = CONTENT_WOOD;
f = &content_features(i); f = &content_features(i);
@ -367,7 +420,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("wood.png", "wood.png", "wood.png"); f->setInventoryTextureCube("wood.png", "wood.png", "wood.png");
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setWoodLikeDiggingProperties(f->digging_properties, 0.75); setWoodLikeMaterialProperties(f->material, 0.75);
i = CONTENT_MESE; i = CONTENT_MESE;
f = &content_features(i); f = &content_features(i);
@ -375,7 +428,7 @@ void content_mapnode_init()
f->setInventoryTextureCube("mese.png", "mese.png", "mese.png"); f->setInventoryTextureCube("mese.png", "mese.png", "mese.png");
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 0.5); setStoneLikeMaterialProperties(f->material, 0.5);
i = CONTENT_CLOUD; i = CONTENT_CLOUD;
f = &content_features(i); f = &content_features(i);
@ -615,7 +668,7 @@ void content_mapnode_init()
-BS/10, -BS/2, -BS/10, BS/10, -BS/2+BS/3.333*2, BS/10); -BS/10, -BS/2, -BS/10, BS/10, -BS/2+BS/3.333*2, BS/10);
f->selection_box.wall_side = core::aabbox3d<f32>( f->selection_box.wall_side = core::aabbox3d<f32>(
-BS/2, -BS/3.333, -BS/10, -BS/2+BS/3.333, BS/3.333, BS/10); -BS/2, -BS/3.333, -BS/10, -BS/2+BS/3.333, BS/3.333, BS/10);
f->digging_properties.set("", DiggingProperties(true, 0.0, 0)); setConstantMaterialProperties(f->material, 0.0);
i = CONTENT_SIGN_WALL; i = CONTENT_SIGN_WALL;
f = &content_features(i); f = &content_features(i);
@ -631,7 +684,7 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
if(f->initial_metadata == NULL) if(f->initial_metadata == NULL)
f->initial_metadata = new SignNodeMetadata("Some sign"); f->initial_metadata = new SignNodeMetadata("Some sign");
f->digging_properties.set("", DiggingProperties(true, 0.5, 0)); setConstantMaterialProperties(f->material, 0.5);
f->selection_box.type = NODEBOX_WALLMOUNTED; f->selection_box.type = NODEBOX_WALLMOUNTED;
i = CONTENT_CHEST; i = CONTENT_CHEST;
@ -646,7 +699,7 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
if(f->initial_metadata == NULL) if(f->initial_metadata == NULL)
f->initial_metadata = new ChestNodeMetadata(); f->initial_metadata = new ChestNodeMetadata();
setWoodLikeDiggingProperties(f->digging_properties, 1.0); setWoodLikeMaterialProperties(f->material, 1.0);
i = CONTENT_LOCKABLE_CHEST; i = CONTENT_LOCKABLE_CHEST;
f = &content_features(i); f = &content_features(i);
@ -660,7 +713,7 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
if(f->initial_metadata == NULL) if(f->initial_metadata == NULL)
f->initial_metadata = new LockingChestNodeMetadata(); f->initial_metadata = new LockingChestNodeMetadata();
setWoodLikeDiggingProperties(f->digging_properties, 1.0); setWoodLikeMaterialProperties(f->material, 1.0);
i = CONTENT_FURNACE; i = CONTENT_FURNACE;
f = &content_features(i); f = &content_features(i);
@ -672,7 +725,7 @@ void content_mapnode_init()
f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_COBBLE)+" 6"; f->dug_item = std::string("MaterialItem2 ")+itos(CONTENT_COBBLE)+" 6";
if(f->initial_metadata == NULL) if(f->initial_metadata == NULL)
f->initial_metadata = new FurnaceNodeMetadata(); f->initial_metadata = new FurnaceNodeMetadata();
setStoneLikeDiggingProperties(f->digging_properties, 3.0); setStoneLikeMaterialProperties(f->material, 3.0);
i = CONTENT_COBBLE; i = CONTENT_COBBLE;
f = &content_features(i); f = &content_features(i);
@ -681,7 +734,7 @@ void content_mapnode_init()
f->param_type = CPT_NONE; f->param_type = CPT_NONE;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 0.9); setStoneLikeMaterialProperties(f->material, 0.9);
i = CONTENT_MOSSYCOBBLE; i = CONTENT_MOSSYCOBBLE;
f = &content_features(i); f = &content_features(i);
@ -690,7 +743,7 @@ void content_mapnode_init()
f->param_type = CPT_NONE; f->param_type = CPT_NONE;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 0.8); setStoneLikeMaterialProperties(f->material, 0.8);
i = CONTENT_STEEL; i = CONTENT_STEEL;
f = &content_features(i); f = &content_features(i);
@ -700,7 +753,7 @@ void content_mapnode_init()
f->param_type = CPT_NONE; f->param_type = CPT_NONE;
f->is_ground_content = true; f->is_ground_content = true;
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 5.0); setStoneLikeMaterialProperties(f->material, 5.0);
i = CONTENT_NC; i = CONTENT_NC;
f = &content_features(i); f = &content_features(i);
@ -710,14 +763,14 @@ void content_mapnode_init()
f->setTexture(4, "nc_back.png"); // Z+ f->setTexture(4, "nc_back.png"); // Z+
f->setInventoryTexture("nc_front.png"); f->setInventoryTexture("nc_front.png");
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 3.0); setStoneLikeMaterialProperties(f->material, 3.0);
i = CONTENT_NC_RB; i = CONTENT_NC_RB;
f = &content_features(i); f = &content_features(i);
f->setAllTextures("nc_rb.png"); f->setAllTextures("nc_rb.png");
f->setInventoryTexture("nc_rb.png"); f->setInventoryTexture("nc_rb.png");
f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1"; f->dug_item = std::string("MaterialItem2 ")+itos(i)+" 1";
setStoneLikeDiggingProperties(f->digging_properties, 3.0); setStoneLikeMaterialProperties(f->material, 3.0);
i = CONTENT_SAPLING; i = CONTENT_SAPLING;
f = &content_features(i); f = &content_features(i);
@ -730,7 +783,7 @@ void content_mapnode_init()
f->air_equivalent = false; f->air_equivalent = false;
f->solidness = 0; // drawn separately, makes no faces f->solidness = 0; // drawn separately, makes no faces
f->walkable = false; f->walkable = false;
f->digging_properties.set("", DiggingProperties(true, 0.0, 0)); setConstantMaterialProperties(f->material, 0.0);
i = CONTENT_APPLE; i = CONTENT_APPLE;
f = &content_features(i); f = &content_features(i);
@ -743,62 +796,7 @@ void content_mapnode_init()
f->walkable = false; f->walkable = false;
f->air_equivalent = true; f->air_equivalent = true;
f->dug_item = std::string("CraftItem apple 1"); f->dug_item = std::string("CraftItem apple 1");
f->digging_properties.set("", DiggingProperties(true, 0.0, 0)); setConstantMaterialProperties(f->material, 0.0);
// NOTE: Remember to add frequently used stuff to the texture atlas in tile.cpp
/*
Add MesePick to everything
*/
for(u16 i=0; i<=MAX_CONTENT; i++)
{
content_features(i).digging_properties.set("MesePick",
DiggingProperties(true, 0.0, 65535./1337));
}
}
void setStoneLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
{
list.set("",
DiggingProperties(true, 15.0*toughness, 0));
list.set("WPick",
DiggingProperties(true, 1.3*toughness, 65535./30.*toughness));
list.set("STPick",
DiggingProperties(true, 0.75*toughness, 65535./100.*toughness));
list.set("SteelPick",
DiggingProperties(true, 0.50*toughness, 65535./333.*toughness));
/*list.set("MesePick",
DiggingProperties(true, 0.0*toughness, 65535./20.*toughness));*/
}
void setDirtLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
{
list.set("",
DiggingProperties(true, 0.75*toughness, 0));
list.set("WShovel",
DiggingProperties(true, 0.4*toughness, 65535./50.*toughness));
list.set("STShovel",
DiggingProperties(true, 0.2*toughness, 65535./150.*toughness));
list.set("SteelShovel",
DiggingProperties(true, 0.15*toughness, 65535./400.*toughness));
}
void setWoodLikeDiggingProperties(DiggingPropertiesList &list, float toughness)
{
list.set("",
DiggingProperties(true, 3.0*toughness, 0));
list.set("WAxe",
DiggingProperties(true, 1.5*toughness, 65535./30.*toughness));
list.set("STAxe",
DiggingProperties(true, 0.75*toughness, 65535./100.*toughness));
list.set("SteelAxe",
DiggingProperties(true, 0.5*toughness, 65535./333.*toughness));
} }

@ -26,7 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef SERVER #ifndef SERVER
#include "tile.h" #include "tile.h"
#endif #endif
#include "materials.h" // DiggingProperties #include "materials.h" // MaterialProperties
/* /*
Content feature list Content feature list
@ -175,13 +175,12 @@ struct ContentFeatures
// Amount of light the node emits // Amount of light the node emits
u8 light_source; u8 light_source;
// Digging properties for different tools
DiggingPropertiesList digging_properties;
u32 damage_per_second; u32 damage_per_second;
NodeBox selection_box; NodeBox selection_box;
MaterialProperties material;
// NOTE: Move relevant properties to here from elsewhere // NOTE: Move relevant properties to here from elsewhere
void reset() void reset()
@ -216,9 +215,9 @@ struct ContentFeatures
liquid_alternative_source = CONTENT_IGNORE; liquid_alternative_source = CONTENT_IGNORE;
liquid_viscosity = 0; liquid_viscosity = 0;
light_source = 0; light_source = 0;
digging_properties.clear();
damage_per_second = 0; damage_per_second = 0;
selection_box = NodeBox(); selection_box = NodeBox();
material = MaterialProperties();
} }
ContentFeatures() ContentFeatures()

@ -2,20 +2,103 @@
#include "mapnode.h" #include "mapnode.h"
#include "mapnode_contentfeatures.h" #include "mapnode_contentfeatures.h"
// NOTE: DEPRECATED
DiggingPropertiesList * getDiggingPropertiesList(u16 content) struct ToolProperties
{ {
return &content_features(content).digging_properties; // time = basetime + sum(feature here * feature in MaterialProperties)
float basetime;
float dt_weight;
float dt_crackiness;
float dt_crumbliness;
float dt_cuttability;
float basedurability;
float dd_weight;
float dd_crackiness;
float dd_crumbliness;
float dd_cuttability;
ToolProperties(float a=0.75, float b=0, float c=0, float d=0, float e=0,
float f=50, float g=0, float h=0, float i=0, float j=0):
basetime(a),
dt_weight(b),
dt_crackiness(c),
dt_crumbliness(d),
dt_cuttability(e),
basedurability(f),
dd_weight(g),
dd_crackiness(h),
dd_crumbliness(i),
dd_cuttability(j)
{}
};
ToolProperties getToolProperties(const std::string &toolname)
{
// weight, crackiness, crumbleness, cuttability
if(toolname == "WPick")
return ToolProperties(2.0, 0,-1,2,0, 50, 0,0,0,0);
else if(toolname == "STPick")
return ToolProperties(1.5, 0,-1,2,0, 100, 0,0,0,0);
else if(toolname == "SteelPick")
return ToolProperties(1.0, 0,-1,2,0, 300, 0,0,0,0);
else if(toolname == "MesePick")
return ToolProperties(0, 0,0,0,0, 1337, 0,0,0,0);
else if(toolname == "WShovel")
return ToolProperties(1.5, 0.5,2,-1.5,0.3, 50, 0,0,0,0);
else if(toolname == "STShovel")
return ToolProperties(1.0, 0.5,2,-1.5,0.1, 100, 0,0,0,0);
else if(toolname == "SteelShovel")
return ToolProperties(0.6, 0.5,2,-1.5,0.0, 300, 0,0,0,0);
// weight, crackiness, crumbleness, cuttability
else if(toolname == "WAxe")
return ToolProperties(2.0, 0.5,-0.2,1,-0.5, 50, 0,0,0,0);
else if(toolname == "STAxe")
return ToolProperties(1.5, 0.5,-0.2,1,-0.5, 100, 0,0,0,0);
else if(toolname == "SteelAxe")
return ToolProperties(1.0, 0.5,-0.2,1,-0.5, 300, 0,0,0,0);
else if(toolname == "WSword")
return ToolProperties(3.0, 3,0,1,-1, 50, 0,0,0,0);
else if(toolname == "STSword")
return ToolProperties(2.5, 3,0,1,-1, 100, 0,0,0,0);
else if(toolname == "SteelSword")
return ToolProperties(2.0, 3,0,1,-1, 300, 0,0,0,0);
// Properties of hand
return ToolProperties(0.5, 1,0.4,-0.75,0, 50, 0,0,0,0);
} }
DiggingProperties getDiggingProperties(u16 content, const std::string &tool) DiggingProperties getDiggingProperties(u16 material, const std::string &tool)
{ {
DiggingPropertiesList *mprop = getDiggingPropertiesList(content); MaterialProperties &mp = content_features(material).material;
if(mprop == NULL) if(mp.diggability == DIGGABLE_NOT)
// Not diggable return DiggingProperties(false, 0, 0);
return DiggingProperties(); if(mp.diggability == DIGGABLE_CONSTANT)
return DiggingProperties(true, mp.constant_time, 0);
return mprop->get(tool); ToolProperties tp = getToolProperties(tool);
float time = tp.basetime;
time += tp.dt_weight * mp.weight;
time += tp.dt_crackiness * mp.crackiness;
time += tp.dt_crumbliness * mp.crumbliness;
time += tp.dt_cuttability * mp.cuttability;
if(time < 0.2)
time = 0.2;
float durability = tp.basedurability;
durability += tp.dd_weight * mp.weight;
durability += tp.dd_crackiness * mp.crackiness;
durability += tp.dd_crumbliness * mp.crumbliness;
durability += tp.dd_cuttability * mp.cuttability;
if(durability < 1)
durability = 1;
float wear = 1.0 / durability;
u16 wear_i = wear/65535.;
return DiggingProperties(true, time, wear_i);
} }

@ -27,6 +27,46 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common_irrlicht.h" #include "common_irrlicht.h"
#include <string> #include <string>
enum Diggability
{
DIGGABLE_NOT,
DIGGABLE_NORMAL,
DIGGABLE_CONSTANT
};
struct MaterialProperties
{
// Values can be anything. 0 is normal.
enum Diggability diggability;
// Constant time for DIGGABLE_CONSTANT
float constant_time;
// Weight; the amount of stuff in the block. Not realistic.
float weight;
// Rock; wood a bit.
// A Pickaxe manages high crackiness well.
float crackiness;
// Sand is extremely crumble; dirt is quite crumble.
// A shovel is good for crumbly stuff. Pickaxe is horrible.
float crumbliness;
// An axe is best for cuttable heavy stuff.
// Sword is best for cuttable light stuff.
float cuttability;
// If high, ignites easily
//float flammability;
MaterialProperties():
diggability(DIGGABLE_NOT),
constant_time(0.5),
weight(1),
crackiness(1),
crumbliness(1),
cuttability(1)
{}
};
struct DiggingProperties struct DiggingProperties
{ {
DiggingProperties(): DiggingProperties():
@ -48,55 +88,7 @@ struct DiggingProperties
u16 wear; u16 wear;
}; };
/* // Tool "" is bare hands
This is a bad way of determining mining characteristics.
TODO: Get rid of this and set up some attributes like toughness,
fluffyness, and a funciton to calculate time and durability loss
(and sound? and whatever else) from them
*/
class DiggingPropertiesList
{
public:
DiggingPropertiesList()
{
}
void set(const std::string toolname,
const DiggingProperties &prop)
{
m_digging_properties[toolname] = prop;
}
DiggingProperties get(const std::string toolname)
{
core::map<std::string, DiggingProperties>::Node *n;
n = m_digging_properties.find(toolname);
if(n == NULL)
{
// Not diggable by this tool, try to get defaults
n = m_digging_properties.find("");
if(n == NULL)
{
// Not diggable at all
return DiggingProperties();
}
}
// Return found properties
return n->getValue();
}
void clear()
{
m_digging_properties.clear();
}
private:
// toolname="": default properties (digging by hand)
// Key is toolname
core::map<std::string, DiggingProperties> m_digging_properties;
};
// For getting the default properties, set tool=""
DiggingProperties getDiggingProperties(u16 material, const std::string &tool); DiggingProperties getDiggingProperties(u16 material, const std::string &tool);
#endif #endif