Implemented split between consumable crafting initialization and equipment enhancement initialization.
This commit is contained in:
parent
b02936fcb5
commit
4e3c9877e7
@ -90,6 +90,7 @@ void Menu::InitializeBlacksmithCraftingWindow(){
|
|||||||
})END;
|
})END;
|
||||||
armorTab->selectionType=SelectionType::HIGHLIGHT;
|
armorTab->selectionType=SelectionType::HIGHLIGHT;
|
||||||
|
|
||||||
|
#pragma region Weapon Inventory Display
|
||||||
auto weaponsDisplay=blacksmithWindow->ADD("Weapon Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
auto weaponsDisplay=blacksmithWindow->ADD("Weapon Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
||||||
[](MenuFuncData data){
|
[](MenuFuncData data){
|
||||||
RowItemDisplay*comp=DYNAMIC_CAST<RowItemDisplay*>(data.component);
|
RowItemDisplay*comp=DYNAMIC_CAST<RowItemDisplay*>(data.component);
|
||||||
@ -121,7 +122,9 @@ void Menu::InitializeBlacksmithCraftingWindow(){
|
|||||||
)END;
|
)END;
|
||||||
AddInventoryListener(weaponsDisplay,"Equipment");
|
AddInventoryListener(weaponsDisplay,"Equipment");
|
||||||
weaponsDisplay->SetCompactDescriptions(CRAFTING_INFO);
|
weaponsDisplay->SetCompactDescriptions(CRAFTING_INFO);
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#pragma region Armor Inventory Display
|
||||||
auto armorDisplay=blacksmithWindow->ADD("Armor Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
auto armorDisplay=blacksmithWindow->ADD("Armor Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,blacksmithWindow->size.y-44}},"Item Name Label","Item Description Label",
|
||||||
[](MenuFuncData data){
|
[](MenuFuncData data){
|
||||||
Menu::OpenMenu(CRAFT_ITEM);
|
Menu::OpenMenu(CRAFT_ITEM);
|
||||||
@ -154,6 +157,7 @@ void Menu::InitializeBlacksmithCraftingWindow(){
|
|||||||
AddInventoryListener(armorDisplay,"Equipment");
|
AddInventoryListener(armorDisplay,"Equipment");
|
||||||
armorDisplay->Enable(false);
|
armorDisplay->Enable(false);
|
||||||
armorDisplay->SetCompactDescriptions(CRAFTING_INFO);
|
armorDisplay->SetCompactDescriptions(CRAFTING_INFO);
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
#pragma region Inventory Description
|
#pragma region Inventory Description
|
||||||
float inventoryDescriptionWidth=blacksmithWindow->pos.x+blacksmithWindow->size.x-26-224;
|
float inventoryDescriptionWidth=blacksmithWindow->pos.x+blacksmithWindow->size.x-26-224;
|
||||||
|
185
Crawler/ConsumableCraftingWindow.cpp
Normal file
185
Crawler/ConsumableCraftingWindow.cpp
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
#pragma region License
|
||||||
|
/*
|
||||||
|
License (OLC-3)
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Copyright 2018 - 2022 OneLoneCoder.com
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions or derivations of source code must retain the above copyright
|
||||||
|
notice, this list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions or derivative works in binary form must reproduce the above
|
||||||
|
copyright notice. This list of conditions and the following disclaimer must be
|
||||||
|
reproduced in the documentation and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its contributors may
|
||||||
|
be used to endorse or promote products derived from this software without specific
|
||||||
|
prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||||
|
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||||
|
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||||
|
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGE.
|
||||||
|
|
||||||
|
Portions of this software are copyright © 2023 The FreeType
|
||||||
|
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
|
||||||
|
All rights reserved.
|
||||||
|
*/
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#include "Menu.h"
|
||||||
|
#include "Crawler.h"
|
||||||
|
#include "MenuItemItemButton.h"
|
||||||
|
#include "PlayerMoneyLabel.h"
|
||||||
|
#include "RowInventoryScrollableWindowComponent.h"
|
||||||
|
#include "EnhancementStatsLabel.h"
|
||||||
|
#include "RequiredMaterialsList.h"
|
||||||
|
|
||||||
|
INCLUDE_game
|
||||||
|
INCLUDE_ITEM_CATEGORIES
|
||||||
|
INCLUDE_DATA
|
||||||
|
INCLUDE_GFX
|
||||||
|
|
||||||
|
void Menu::InitializeConsumableCraftingWindow(){
|
||||||
|
Menu*consumableCraftingWindow=CreateMenu(CRAFT_CONSUMABLE,CENTERED,game->GetScreenSize()-vi2d{52,52});
|
||||||
|
|
||||||
|
std::vector<std::pair<std::string,int>>categories;
|
||||||
|
std::vector<std::weak_ptr<Item>>weaponInventory;
|
||||||
|
std::vector<std::weak_ptr<Item>>armorInventory;
|
||||||
|
|
||||||
|
#pragma region Build Equipment Lists
|
||||||
|
std::for_each(Inventory::get("Equipment").begin(),Inventory::get("Equipment").end(),[&](const std::shared_ptr<Item> item){
|
||||||
|
switch(item.get()->GetEquipSlot()){
|
||||||
|
case EquipSlot::WEAPON:{
|
||||||
|
weaponInventory.push_back(item);
|
||||||
|
}break;
|
||||||
|
case EquipSlot::NONE:
|
||||||
|
case EquipSlot::RING1:
|
||||||
|
case EquipSlot::RING2:break;//No-op
|
||||||
|
default:{ //We assume everything else is armor.
|
||||||
|
armorInventory.push_back(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
auto weaponTab=consumableCraftingWindow->ADD("Weapon Tab",MenuComponent)({{2,0},{consumableCraftingWindow->size.x/2-4,24}},"Weapon",[](MenuFuncData data){
|
||||||
|
Component<MenuComponent>(CRAFT_CONSUMABLE,"Armor Tab")->selected=false;
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(CRAFT_CONSUMABLE,"Weapon Inventory Display")->Enable(true);
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(CRAFT_CONSUMABLE,"Armor Inventory Display")->Enable(false);
|
||||||
|
data.component->selected=true;
|
||||||
|
return true;
|
||||||
|
})END;
|
||||||
|
weaponTab->selected=true;
|
||||||
|
weaponTab->selectionType=SelectionType::HIGHLIGHT;
|
||||||
|
auto armorTab=consumableCraftingWindow->ADD("Armor Tab",MenuComponent)({{consumableCraftingWindow->size.x/2+2,0},{consumableCraftingWindow->size.x/2-4,24}},"Armor",[](MenuFuncData data){
|
||||||
|
Component<MenuComponent>(CRAFT_CONSUMABLE,"Weapon Tab")->selected=false;
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(CRAFT_CONSUMABLE,"Weapon Inventory Display")->Enable(false);
|
||||||
|
Component<RowInventoryScrollableWindowComponent>(CRAFT_CONSUMABLE,"Armor Inventory Display")->Enable(true);
|
||||||
|
data.component->selected=true;
|
||||||
|
return true;
|
||||||
|
})END;
|
||||||
|
armorTab->selectionType=SelectionType::HIGHLIGHT;
|
||||||
|
|
||||||
|
#pragma region Weapon Inventory Display
|
||||||
|
auto weaponsDisplay=consumableCraftingWindow->ADD("Weapon Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,consumableCraftingWindow->size.y-44}},"Item Name Label","Item Description Label",
|
||||||
|
[](MenuFuncData data){
|
||||||
|
RowItemDisplay*comp=DYNAMIC_CAST<RowItemDisplay*>(data.component);
|
||||||
|
const std::weak_ptr<Item>item=comp->GetItem();
|
||||||
|
|
||||||
|
std::string label="";
|
||||||
|
if(item.lock()->EnhancementIsPossible()&&item.lock()->GetEnhancementInfo().size()>item.lock()->EnhancementLevel()+1){
|
||||||
|
label=std::format("Level {} ->#00AA00 {}",item.lock()->EnhancementLevel(),item.lock()->EnhancementLevel()+1);
|
||||||
|
}
|
||||||
|
Component<MenuLabel>(CRAFT_ITEM,"Enhancement Level Header")->SetLabel(label);
|
||||||
|
Component<MenuLabel>(CRAFT_ITEM,"Item Name Header")->SetLabel(std::format("Crafting {}",item.lock()->DisplayName()));
|
||||||
|
Component<EnhancementStatsLabel>(CRAFT_ITEM,"Enhancement Stats Label")->SetItem(item);
|
||||||
|
Component<RequiredMaterialsList>(CRAFT_ITEM,"Required Materials List")->SetItem(item);
|
||||||
|
Component<MenuComponent>(CRAFT_ITEM,"Craft Button")->SetGrayedOut(!item.lock()->CanEnhanceItem());
|
||||||
|
Menu::OpenMenu(CRAFT_ITEM);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[](MenuFuncData data){
|
||||||
|
RowItemDisplay*rowItem=DYNAMIC_CAST<RowItemDisplay*>(data.component);
|
||||||
|
Component<MenuItemItemButton>(CRAFT_CONSUMABLE,"Item Icon")->SetItem(rowItem->GetItem());
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[](MenuFuncData data){
|
||||||
|
Component<MenuItemItemButton>(CRAFT_CONSUMABLE,"Item Icon")->SetItem(Item::BLANK);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
InventoryCreator::RowPlayerWeapons_InventoryUpdate,
|
||||||
|
{.padding=1,.size={207,28}}
|
||||||
|
)END;
|
||||||
|
AddInventoryListener(weaponsDisplay,"Equipment");
|
||||||
|
weaponsDisplay->SetCompactDescriptions(CRAFTING_INFO);
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#pragma region Armor Inventory Display
|
||||||
|
auto armorDisplay=consumableCraftingWindow->ADD("Armor Inventory Display",RowInventoryScrollableWindowComponent)({{2,28},{220,consumableCraftingWindow->size.y-44}},"Item Name Label","Item Description Label",
|
||||||
|
[](MenuFuncData data){
|
||||||
|
Menu::OpenMenu(CRAFT_ITEM);
|
||||||
|
RowItemDisplay*comp=DYNAMIC_CAST<RowItemDisplay*>(data.component);
|
||||||
|
const std::weak_ptr<Item>item=comp->GetItem();
|
||||||
|
|
||||||
|
std::string label="";
|
||||||
|
if(item.lock()->EnhancementIsPossible()&&item.lock()->GetEnhancementInfo().size()>item.lock()->EnhancementLevel()+1){
|
||||||
|
label=std::format("Level {} ->#00AA00 {}",item.lock()->EnhancementLevel(),item.lock()->EnhancementLevel()+1);
|
||||||
|
}
|
||||||
|
Component<MenuLabel>(CRAFT_ITEM,"Enhancement Level Header")->SetLabel(label);
|
||||||
|
Component<MenuLabel>(CRAFT_ITEM,"Item Name Header")->SetLabel(std::format("Crafting {}",item.lock()->DisplayName()));
|
||||||
|
Component<EnhancementStatsLabel>(CRAFT_ITEM,"Enhancement Stats Label")->SetItem(item);
|
||||||
|
Component<RequiredMaterialsList>(CRAFT_ITEM,"Required Materials List")->SetItem(item);
|
||||||
|
Component<MenuComponent>(CRAFT_ITEM,"Craft Button")->SetGrayedOut(!item.lock()->CanEnhanceItem());
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[](MenuFuncData data){
|
||||||
|
RowItemDisplay*rowItem=DYNAMIC_CAST<RowItemDisplay*>(data.component);
|
||||||
|
Component<MenuItemItemButton>(CRAFT_CONSUMABLE,"Item Icon")->SetItem(rowItem->GetItem());
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
[](MenuFuncData data){
|
||||||
|
Component<MenuItemItemButton>(CRAFT_CONSUMABLE,"Item Icon")->SetItem(Item::BLANK);
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
InventoryCreator::RowPlayerArmor_InventoryUpdate,
|
||||||
|
{.padding=1,.size={207,28}}
|
||||||
|
)END;
|
||||||
|
AddInventoryListener(armorDisplay,"Equipment");
|
||||||
|
armorDisplay->Enable(false);
|
||||||
|
armorDisplay->SetCompactDescriptions(CRAFTING_INFO);
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#pragma region Inventory Description
|
||||||
|
float inventoryDescriptionWidth=consumableCraftingWindow->pos.x+consumableCraftingWindow->size.x-26-224;
|
||||||
|
consumableCraftingWindow->ADD("Item Description Outline",MenuLabel)({{224,28},{inventoryDescriptionWidth,consumableCraftingWindow->size.y-44}},"",1,ComponentAttr::LEFT_ALIGN|ComponentAttr::OUTLINE|ComponentAttr::BACKGROUND)END;
|
||||||
|
consumableCraftingWindow->ADD("Item Icon",MenuItemItemButton)({{226+inventoryDescriptionWidth/2-24,30},{48,48}},Item::BLANK,MenuType::ENUM_END,DO_NOTHING,"","",IconButtonAttr::NOT_SELECTABLE)END;
|
||||||
|
consumableCraftingWindow->ADD("Item Name Label",MenuLabel)({{226,84},{inventoryDescriptionWidth-6,12}},"",0.75f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END;
|
||||||
|
consumableCraftingWindow->ADD("Item Description Label",MenuLabel)({{226,94},{inventoryDescriptionWidth-6,consumableCraftingWindow->size.y-44-66}},"",0.5f,ComponentAttr::LEFT_ALIGN|ComponentAttr::SHADOW)END;
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#pragma region Money Display
|
||||||
|
vf2d moneyIconPos={224+inventoryDescriptionWidth-24,28+consumableCraftingWindow->size.y-44+6};
|
||||||
|
auto moneyIcon=consumableCraftingWindow->ADD("Money Icon",MenuIconButton)({moneyIconPos,{24,24}},GFX["money.png"].Decal(),DO_NOTHING,IconButtonAttr::NOT_SELECTABLE|IconButtonAttr::NO_OUTLINE|IconButtonAttr::NO_BACKGROUND)END;
|
||||||
|
std::string moneyText=std::to_string(game->GetPlayer()->GetMoney());
|
||||||
|
vf2d moneyTextSize=game->GetTextSizeProp(moneyText)*2;
|
||||||
|
auto moneyDisplay=consumableCraftingWindow->ADD("Money Label",PlayerMoneyLabel)({moneyIconPos-vf2d{2+moneyTextSize.x,-2},moneyTextSize},2,ComponentAttr::SHADOW|ComponentAttr::LEFT_ALIGN)END;
|
||||||
|
moneyDisplay->SetRightAlignment(true);
|
||||||
|
Player::AddMoneyListener(moneyDisplay);
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
consumableCraftingWindow->ADD("Leave Button",MenuComponent)({{consumableCraftingWindow->size.x/2-48,28+consumableCraftingWindow->size.y-44+6},{96,24}},"Leave",MenuType::ENUM_END,
|
||||||
|
[](MenuFuncData data){
|
||||||
|
Menu::CloseMenu();
|
||||||
|
return true;
|
||||||
|
},{2,2})END;
|
||||||
|
}
|
@ -37,10 +37,10 @@ All rights reserved.
|
|||||||
#pragma endregion
|
#pragma endregion
|
||||||
#include "CraftingRequirement.h"
|
#include "CraftingRequirement.h"
|
||||||
|
|
||||||
CraftingRequirement::CraftingRequirement(const std::vector<Item>&craftingItems,const uint32_t cost)
|
CraftingRequirement::CraftingRequirement(const std::vector<std::pair<IT,int>>&craftingItems,const uint32_t cost)
|
||||||
:craftingItems(craftingItems),cost(cost){}
|
:craftingItems(craftingItems),cost(cost){}
|
||||||
|
|
||||||
const std::vector<Item>&CraftingRequirement::GetItems()const{
|
const std::vector<std::pair<IT,int>>&CraftingRequirement::GetItems()const{
|
||||||
return craftingItems;
|
return craftingItems;
|
||||||
}
|
}
|
||||||
const uint32_t CraftingRequirement::GetCost()const{
|
const uint32_t CraftingRequirement::GetCost()const{
|
||||||
|
@ -39,10 +39,10 @@ All rights reserved.
|
|||||||
#include "Item.h"
|
#include "Item.h"
|
||||||
|
|
||||||
class CraftingRequirement{
|
class CraftingRequirement{
|
||||||
std::vector<Item>craftingItems;
|
std::vector<std::pair<IT,int>>craftingItems;
|
||||||
uint32_t cost;
|
uint32_t cost;
|
||||||
public:
|
public:
|
||||||
CraftingRequirement(const std::vector<Item>&craftingItems,const uint32_t cost);
|
CraftingRequirement(const std::vector<std::pair<IT,int>>&craftingItems,const uint32_t cost);
|
||||||
const std::vector<Item>&GetItems()const;
|
const std::vector<std::pair<IT,int>>&GetItems()const;
|
||||||
const uint32_t GetCost()const;
|
const uint32_t GetCost()const;
|
||||||
};
|
};
|
@ -471,6 +471,7 @@
|
|||||||
<ClCompile Include="ChargedArrow.cpp" />
|
<ClCompile Include="ChargedArrow.cpp" />
|
||||||
<ClCompile Include="ClassSelectionWindow.cpp" />
|
<ClCompile Include="ClassSelectionWindow.cpp" />
|
||||||
<ClCompile Include="ConnectionPoint.cpp" />
|
<ClCompile Include="ConnectionPoint.cpp" />
|
||||||
|
<ClCompile Include="ConsumableCraftingWindow.cpp" />
|
||||||
<ClCompile Include="CraftingRequirement.cpp">
|
<ClCompile Include="CraftingRequirement.cpp">
|
||||||
<SubType>
|
<SubType>
|
||||||
</SubType>
|
</SubType>
|
||||||
@ -607,6 +608,7 @@
|
|||||||
<Text Include="assets\config\story\Chapter 1.txt" />
|
<Text Include="assets\config\story\Chapter 1.txt" />
|
||||||
<Text Include="Crawler_Story_Chapter_1 (2).txt" />
|
<Text Include="Crawler_Story_Chapter_1 (2).txt" />
|
||||||
<Text Include="Crawler_System_Overview.txt" />
|
<Text Include="Crawler_System_Overview.txt" />
|
||||||
|
<Text Include="Merchant%27s Items.txt" />
|
||||||
<Text Include="NewClasses.txt" />
|
<Text Include="NewClasses.txt" />
|
||||||
<Text Include="InitialConcept.txt" />
|
<Text Include="InitialConcept.txt" />
|
||||||
<Text Include="Slime_King_Encounter.txt" />
|
<Text Include="Slime_King_Encounter.txt" />
|
||||||
|
@ -644,6 +644,9 @@
|
|||||||
<ClCompile Include="CraftItemWindow.cpp">
|
<ClCompile Include="CraftItemWindow.cpp">
|
||||||
<Filter>Source Files\Interface</Filter>
|
<Filter>Source Files\Interface</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="ConsumableCraftingWindow.cpp">
|
||||||
|
<Filter>Source Files\Interface</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="cpp.hint" />
|
<None Include="cpp.hint" />
|
||||||
@ -755,6 +758,9 @@
|
|||||||
<Text Include="assets\config\items\Weapons.txt">
|
<Text Include="assets\config\items\Weapons.txt">
|
||||||
<Filter>Configurations\Items</Filter>
|
<Filter>Configurations\Items</Filter>
|
||||||
</Text>
|
</Text>
|
||||||
|
<Text Include="Merchant%27s Items.txt">
|
||||||
|
<Filter>Documentation\Menus</Filter>
|
||||||
|
</Text>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Image Include="assets\heart.ico">
|
<Image Include="assets\heart.ico">
|
||||||
|
@ -90,9 +90,9 @@ protected:
|
|||||||
std::string percentageSign=attr.DisplayAsPercent()?"%":"";
|
std::string percentageSign=attr.DisplayAsPercent()?"%":"";
|
||||||
|
|
||||||
window.DrawShadowStringDecal(drawPos+vf2d{maxAttributeLabelSize+4+24,yOffset},std::format("{:>5} ->#00AA00 {:<5}",
|
window.DrawShadowStringDecal(drawPos+vf2d{maxAttributeLabelSize+4+24,yOffset},std::format("{:>5} ->#00AA00 {:<5}",
|
||||||
attr.ShowAsDecimal()?std::format("{:>4.1f}{}",value,percentageSign):std::format("{}{}",value,percentageSign),
|
attr.ShowAsDecimal()?std::format("{:>4.2f}{}",value,percentageSign):std::format("{}{}",value,percentageSign),
|
||||||
nextStageValue!=0?
|
nextStageValue!=0?
|
||||||
attr.ShowAsDecimal()?std::format("{:<4.1f}{}",nextStageValue,percentageSign):std::format("{}{}",nextStageValue,percentageSign)
|
attr.ShowAsDecimal()?std::format("{:<4.2f}{}",nextStageValue,percentageSign):std::format("{}{}",nextStageValue,percentageSign)
|
||||||
:"MAX"),
|
:"MAX"),
|
||||||
WHITE,BLACK,adjustedScale,fitToLabel?std::numeric_limits<float>::max():rect.size.x,1.0f);
|
WHITE,BLACK,adjustedScale,fitToLabel?std::numeric_limits<float>::max():rect.size.x,1.0f);
|
||||||
yOffset+=16;
|
yOffset+=16;
|
||||||
|
@ -60,6 +60,7 @@ std::map<std::string,EquipSlot>ItemInfo::nameToEquipSlot;
|
|||||||
int Item::IsBlankStaticCallCounter=0;
|
int Item::IsBlankStaticCallCounter=0;
|
||||||
safemap<int,float>Stats::maxDamageReductionTable;
|
safemap<int,float>Stats::maxDamageReductionTable;
|
||||||
ItemEnhancementFunctionPrimingData Item::enhanceFunctionPrimed("CanEnhanceItem()");
|
ItemEnhancementFunctionPrimingData Item::enhanceFunctionPrimed("CanEnhanceItem()");
|
||||||
|
std::vector<ItemInfo*>ItemInfo::craftableConsumables;
|
||||||
|
|
||||||
ItemInfo::ItemInfo()
|
ItemInfo::ItemInfo()
|
||||||
:customProps({nullptr,nullptr}),img(nullptr){}
|
:customProps({nullptr,nullptr}),img(nullptr){}
|
||||||
@ -148,34 +149,47 @@ void ItemInfo::InitializeItems(){
|
|||||||
if(statValueList.size()>0){
|
if(statValueList.size()>0){
|
||||||
EnhancementInfo enhancementStats;
|
EnhancementInfo enhancementStats;
|
||||||
for(int enhancementLevel=0;enhancementLevel<=10;enhancementLevel++){
|
for(int enhancementLevel=0;enhancementLevel<=10;enhancementLevel++){
|
||||||
|
uint8_t availableChapter=1;
|
||||||
datafile&dat=data[key]["StatValues["+std::to_string(enhancementLevel)+"]"];
|
datafile&dat=data[key]["StatValues["+std::to_string(enhancementLevel)+"]"];
|
||||||
int attrIndex=0;
|
int attrIndex=0;
|
||||||
for(ItemAttribute&attr:statValueList){
|
for(ItemAttribute&attr:statValueList){
|
||||||
enhancementStats.SetAttribute(enhancementLevel,attr,dat.GetReal(attrIndex));
|
enhancementStats.SetAttribute(enhancementLevel,attr,dat.GetReal(attrIndex));
|
||||||
attrIndex++;
|
attrIndex++;
|
||||||
}
|
}
|
||||||
std::vector<Item>itemsRequired;
|
std::vector<std::pair<IT,int>>itemsRequired;
|
||||||
uint32_t goldCost=0;
|
uint32_t goldCost=0;
|
||||||
if(enhancementLevel!=0){ //The first level does not require any crafting, skip this level.
|
if(enhancementLevel!=0){ //The first level does not require any crafting, skip this level.
|
||||||
while(data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)].HasProperty(std::format("Item[{}]",itemsRequired.size()))){
|
while(data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)].HasProperty(std::format("Item[{}]",itemsRequired.size()))){
|
||||||
datafile&item=data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)][std::format("Item[{}]",itemsRequired.size())];
|
datafile&item=data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)][std::format("Item[{}]",itemsRequired.size())];
|
||||||
itemsRequired.push_back(Item(item.GetInt(1),item.GetString(0)));
|
itemsRequired.push_back({item.GetString(0),item.GetInt(1)});
|
||||||
}
|
}
|
||||||
goldCost=data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)]["Gold"].GetInt();
|
goldCost=data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)]["Gold"].GetInt();
|
||||||
}else
|
if(data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)].HasProperty("AvailableChapter")){
|
||||||
if(data[key].HasProperty("Crafting")&&!data[key]["Crafting"].HasProperty("Level[1]")){
|
availableChapter=data[key]["Crafting"][std::format("Level[{}]",enhancementLevel)]["AvailableChapter"].GetInt();
|
||||||
//If the item has a key called "Crafting" but did not specify a level number, then we assume this item just has one base level for normal crafting and thus we will add the requirements to craft this item under enhancement level 1.
|
|
||||||
while(data[key]["Crafting"].HasProperty(std::format("Item[{}]",itemsRequired.size()))){
|
|
||||||
datafile&item=data[key]["Crafting"][std::format("Item[{}]",itemsRequired.size())];
|
|
||||||
itemsRequired.push_back(Item(item.GetInt(1),item.GetString(0)));
|
|
||||||
}
|
}
|
||||||
goldCost=data[key]["Crafting"]["Gold"].GetInt();
|
enhancementStats.SetCraftingRequirements(enhancementLevel,itemsRequired,goldCost,availableChapter);
|
||||||
enhancementLevel=1;
|
|
||||||
}
|
}
|
||||||
enhancementStats.SetCraftingRequirements(enhancementLevel,itemsRequired,goldCost);
|
|
||||||
}
|
}
|
||||||
it.enhancement=enhancementStats;
|
it.enhancement=enhancementStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(data[key].HasProperty("Crafting")&&!data[key]["Crafting"].HasProperty("Level[1]")){
|
||||||
|
std::vector<std::pair<IT,int>>itemsRequired;
|
||||||
|
uint32_t goldCost=0;
|
||||||
|
uint8_t availableChapter=1;
|
||||||
|
//If the item has a key called "Crafting" but did not specify a level number, then we assume this item just has one base level for normal crafting and thus we will add the requirements to craft this item under enhancement level 1.
|
||||||
|
while(data[key]["Crafting"].HasProperty(std::format("Item[{}]",itemsRequired.size()))){
|
||||||
|
datafile&item=data[key]["Crafting"][std::format("Item[{}]",itemsRequired.size())];
|
||||||
|
itemsRequired.push_back({item.GetString(0),item.GetInt(1)});
|
||||||
|
}
|
||||||
|
goldCost=data[key]["Crafting"]["Gold"].GetInt();
|
||||||
|
if(data[key]["Crafting"].HasProperty("AvailableChapter")){
|
||||||
|
availableChapter=data[key]["Crafting"]["AvailableChapter"].GetInt();
|
||||||
|
}
|
||||||
|
craftableConsumables.push_back(&it);
|
||||||
|
it.enhancement.SetCraftingRequirements(1,itemsRequired,goldCost,availableChapter);
|
||||||
|
}
|
||||||
|
|
||||||
if(scriptName!=""){
|
if(scriptName!=""){
|
||||||
if(scriptName=="RestoreDuringCast"){
|
if(scriptName=="RestoreDuringCast"){
|
||||||
useDuringCast=true;
|
useDuringCast=true;
|
||||||
@ -533,17 +547,18 @@ const std::string Item::Description(CompactText compact)const{
|
|||||||
description+="\n\nCrafting Requirements:\n---------\n";
|
description+="\n\nCrafting Requirements:\n---------\n";
|
||||||
if(IsEquippable()&&EnhancementLevel()<"Item.Item Max Enhancement Level"_I||IsCraftable()){
|
if(IsEquippable()&&EnhancementLevel()<"Item.Item Max Enhancement Level"_I||IsCraftable()){
|
||||||
const EnhancementLevelInfo&info=GetEnhancementInfo()[EnhancementLevel()+1];
|
const EnhancementLevelInfo&info=GetEnhancementInfo()[EnhancementLevel()+1];
|
||||||
for(const Item&itemRequirement:info.craftingRequirement.GetItems()){
|
for(const auto&[name,amt]:info.craftingRequirement.GetItems()){
|
||||||
description+=std::format("{}{} x{} ({})\n",
|
description+=std::format("{}{} x{} ({})\n",
|
||||||
Inventory::GetItemCount(itemRequirement.ActualName())<itemRequirement.Amt()?"#FF0000":"#FFFFFF",
|
Inventory::GetItemCount(name)<amt?"#FF0000":"#FFFFFF",
|
||||||
itemRequirement.DisplayName(),
|
name,
|
||||||
itemRequirement.Amt(),
|
amt,
|
||||||
Inventory::GetItemCount(itemRequirement.ActualName()));
|
Inventory::GetItemCount(name));
|
||||||
}
|
}
|
||||||
description+="\n";
|
description+="\n";
|
||||||
description+=std::format("{}Crafting Cost: {}",
|
description+=std::format("{}Crafting Cost: {} {}",
|
||||||
game->GetPlayer()->GetMoney()<info.craftingRequirement.GetCost()?"#FF0000":"#FFFFFF",
|
game->GetPlayer()->GetMoney()<info.craftingRequirement.GetCost()?"#FF0000":"#FFFFFF",
|
||||||
info.craftingRequirement.GetCost());
|
info.craftingRequirement.GetCost(),
|
||||||
|
"Item.Currency Name"_S);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -758,8 +773,8 @@ void Item::EnhanceItem(){
|
|||||||
|
|
||||||
const CraftingRequirement&consumedResources=GetEnhancementInfo()[EnhancementLevel()].craftingRequirement;
|
const CraftingRequirement&consumedResources=GetEnhancementInfo()[EnhancementLevel()].craftingRequirement;
|
||||||
|
|
||||||
for(const Item&it:consumedResources.GetItems()){
|
for(const auto&[name,amt]:consumedResources.GetItems()){
|
||||||
Inventory::RemoveItem(it.ActualName(),it.Amt());
|
Inventory::RemoveItem(name,amt);
|
||||||
}
|
}
|
||||||
game->GetPlayer()->SetMoney(game->GetPlayer()->GetMoney()-consumedResources.GetCost());
|
game->GetPlayer()->SetMoney(game->GetPlayer()->GetMoney()-consumedResources.GetCost());
|
||||||
};
|
};
|
||||||
@ -890,7 +905,7 @@ void Stats::InitializeDamageReductionTable(){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void EnhancementInfo::SetCraftingRequirements(const int enhanceLevel,const std::vector<Item>&requiredItems,const uint32_t goldCost){
|
void EnhancementInfo::SetCraftingRequirements(const int enhanceLevel,const std::vector<std::pair<IT,int>>&requiredItems,const uint32_t goldCost,const uint8_t availableChapter){
|
||||||
while(craftingRequirements.size()<=enhanceLevel){
|
while(craftingRequirements.size()<=enhanceLevel){
|
||||||
craftingRequirements.push_back(CraftingRequirement({},0));
|
craftingRequirements.push_back(CraftingRequirement({},0));
|
||||||
}
|
}
|
||||||
@ -903,11 +918,14 @@ EnhancementLevelInfo::EnhancementLevelInfo(const Stats&stats,const CraftingRequi
|
|||||||
const bool Item::CanEnhanceItem()const{
|
const bool Item::CanEnhanceItem()const{
|
||||||
if(ISBLANK(std::make_shared<Item>(*this)))return false;
|
if(ISBLANK(std::make_shared<Item>(*this)))return false;
|
||||||
if(!GetEnhancementInfo().CanBeEnhanced())return false;
|
if(!GetEnhancementInfo().CanBeEnhanced())return false;
|
||||||
|
if(GetEnhancementInfo().AvailableChapter()<game->GetCurrentChapter())return false;
|
||||||
const EnhancementLevelInfo&enhanceInfo=GetEnhancementInfo()[EnhancementLevel()+1];
|
const EnhancementLevelInfo&enhanceInfo=GetEnhancementInfo()[EnhancementLevel()+1];
|
||||||
|
if(GetEnhancementInfo().size()>2){ //If the item has exactly 2 enhancement levels, then it's an item that can only simply be crafted. Therefore, don't do the max enhancement level check.
|
||||||
if(EnhancementLevel()>="Item.Item Max Enhancement Level"_I)return false;
|
if(EnhancementLevel()>="Item.Item Max Enhancement Level"_I)return false;
|
||||||
|
}
|
||||||
if(game->GetPlayer()->GetMoney()<enhanceInfo.craftingRequirement.GetCost())return false;
|
if(game->GetPlayer()->GetMoney()<enhanceInfo.craftingRequirement.GetCost())return false;
|
||||||
for(const Item&it:enhanceInfo.craftingRequirement.GetItems()){
|
for(const auto&[name,amt]:enhanceInfo.craftingRequirement.GetItems()){
|
||||||
if(Inventory::GetItemCount(it.ActualName())<it.Amt()){
|
if(Inventory::GetItemCount(name)<amt){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -961,3 +979,7 @@ const bool ItemInfo::IsCraftable()const{
|
|||||||
const bool Item::EnhancementIsPossible()const{
|
const bool Item::EnhancementIsPossible()const{
|
||||||
return it->IsCraftable();
|
return it->IsCraftable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const uint8_t EnhancementInfo::AvailableChapter()const{
|
||||||
|
return availableChapter;
|
||||||
|
}
|
@ -118,10 +118,12 @@ struct EnhancementInfo{
|
|||||||
private:
|
private:
|
||||||
std::vector<Stats>enhancementStats;
|
std::vector<Stats>enhancementStats;
|
||||||
std::vector<CraftingRequirement>craftingRequirements;
|
std::vector<CraftingRequirement>craftingRequirements;
|
||||||
|
uint8_t availableChapter=1;
|
||||||
public:
|
public:
|
||||||
void SetAttribute(int enhanceLevel,ItemAttribute attribute,float value);
|
void SetAttribute(int enhanceLevel,ItemAttribute attribute,float value);
|
||||||
void SetCraftingRequirements(const int enhanceLevel,const std::vector<Item>&requiredItems,const uint32_t goldCost);
|
void SetCraftingRequirements(const int enhanceLevel,const std::vector<std::pair<IT,int>>&requiredItems,const uint32_t goldCost,const uint8_t availableChapter);
|
||||||
const bool CanBeEnhanced()const;
|
const bool CanBeEnhanced()const;
|
||||||
|
const uint8_t AvailableChapter()const;
|
||||||
const EnhancementLevelInfo operator[](int level)const;
|
const EnhancementLevelInfo operator[](int level)const;
|
||||||
const size_t size()const;
|
const size_t size()const;
|
||||||
};
|
};
|
||||||
@ -285,6 +287,7 @@ private:
|
|||||||
static void InitializeScripts();
|
static void InitializeScripts();
|
||||||
static void InitializeSets();
|
static void InitializeSets();
|
||||||
static std::map<std::string,EquipSlot>nameToEquipSlot;
|
static std::map<std::string,EquipSlot>nameToEquipSlot;
|
||||||
|
static std::vector<ItemInfo*>craftableConsumables;
|
||||||
public:
|
public:
|
||||||
static void InitializeItems();
|
static void InitializeItems();
|
||||||
ItemInfo();
|
ItemInfo();
|
||||||
|
@ -108,6 +108,7 @@ void Menu::InitializeMenus(){
|
|||||||
InitializeSellItemWindow();
|
InitializeSellItemWindow();
|
||||||
InitializeBlacksmithCraftingWindow();
|
InitializeBlacksmithCraftingWindow();
|
||||||
InitializeCraftItemWindow();
|
InitializeCraftItemWindow();
|
||||||
|
InitializeConsumableCraftingWindow();
|
||||||
|
|
||||||
for(MenuType type=MenuType(int(MenuType::ENUM_START)+1);type<MenuType::ENUM_END;type=MenuType(int(type+1))){
|
for(MenuType type=MenuType(int(MenuType::ENUM_START)+1);type<MenuType::ENUM_END;type=MenuType(int(type+1))){
|
||||||
if(menus.count(type)==0){
|
if(menus.count(type)==0){
|
||||||
|
@ -77,6 +77,7 @@ enum MenuType{
|
|||||||
SELL_ITEM,
|
SELL_ITEM,
|
||||||
BLACKSMITH,
|
BLACKSMITH,
|
||||||
CRAFT_ITEM,
|
CRAFT_ITEM,
|
||||||
|
CRAFT_CONSUMABLE,
|
||||||
#pragma region Enum End //DO NOT REMOVE
|
#pragma region Enum End //DO NOT REMOVE
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////
|
||||||
/*DO NOT REMOVE!!*/ENUM_END////////////////////////////////
|
/*DO NOT REMOVE!!*/ENUM_END////////////////////////////////
|
||||||
@ -100,6 +101,7 @@ class Menu:public IAttributable{
|
|||||||
static void InitializeSellItemWindow();
|
static void InitializeSellItemWindow();
|
||||||
static void InitializeBlacksmithCraftingWindow();
|
static void InitializeBlacksmithCraftingWindow();
|
||||||
static void InitializeCraftItemWindow();
|
static void InitializeCraftItemWindow();
|
||||||
|
static void InitializeConsumableCraftingWindow();
|
||||||
|
|
||||||
friend class Crawler;
|
friend class Crawler;
|
||||||
friend struct Player;
|
friend struct Player;
|
||||||
|
12
Crawler/Merchant's Items.txt
Normal file
12
Crawler/Merchant's Items.txt
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
Merchants items
|
||||||
|
Minor Health Potion (s: 16g b: 23g) // Buyable or crafted with 3x Green Slime Remains + 1 Blue Slime Remains
|
||||||
|
Minor Mana Potion (s: 21g b: 30g) // Buyable or crafted with 1 Red Slime Remains + 1 Yellow Slime Remains
|
||||||
|
Bandages (s: 7g b: 10g) // Buyable
|
||||||
|
|
||||||
|
other Consumables
|
||||||
|
Berries (s: 8g) // 5% dropp from every Flower or Slime
|
||||||
|
Elixir of Bear Strength (s: 30g) // crafted with 1 Bear Claw + 1 Bear Blood
|
||||||
|
Minor Recovery Potion (s: 15g) // crafted with 1 Blue Slime Remains, 1 Red Slime Remains and 1 Flower Petal"
|
||||||
|
|
||||||
|
Only for 4 potions to craft in chapter 1.
|
||||||
|
But guess if every chapter has 4-5 potions that should be enough
|
@ -947,15 +947,19 @@ void EntityStats::RecalculateEquipStats(){
|
|||||||
component->OnEquipStatsUpdate();
|
component->OnEquipStatsUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const float&EntityStats::GetStat(ItemAttribute stat)const{
|
const float&EntityStats::GetStat(ItemAttribute stat)const{
|
||||||
return equipStats.A_Read(stat);
|
return equipStats.A_Read(stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float&EntityStats::GetStat(std::string_view stat)const{
|
const float&EntityStats::GetStat(std::string_view stat)const{
|
||||||
return equipStats.A_Read(stat);
|
return equipStats.A_Read(stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float&EntityStats::GetBaseStat(ItemAttribute stat)const{
|
const float&EntityStats::GetBaseStat(ItemAttribute stat)const{
|
||||||
return baseStats.A_Read(stat);
|
return baseStats.A_Read(stat);
|
||||||
}
|
}
|
||||||
|
|
||||||
const float&EntityStats::GetBaseStat(std::string_view stat)const{
|
const float&EntityStats::GetBaseStat(std::string_view stat)const{
|
||||||
return baseStats.A_Read(stat);
|
return baseStats.A_Read(stat);
|
||||||
}
|
}
|
||||||
|
@ -68,13 +68,13 @@ protected:
|
|||||||
if(itemRef.lock()->EnhancementIsPossible()&&itemRef.lock()->GetEnhancementInfo().size()>itemRef.lock()->EnhancementLevel()+1){
|
if(itemRef.lock()->EnhancementIsPossible()&&itemRef.lock()->GetEnhancementInfo().size()>itemRef.lock()->EnhancementLevel()+1){
|
||||||
float drawWidth=rect.size.x/3;
|
float drawWidth=rect.size.x/3;
|
||||||
int index=0;
|
int index=0;
|
||||||
for(const auto&item:itemRef.lock()->GetEnhancementInfo()[itemRef.lock()->EnhancementLevel()+1].craftingRequirement.GetItems()){
|
for(const auto&[name,amt]:itemRef.lock()->GetEnhancementInfo()[itemRef.lock()->EnhancementLevel()+1].craftingRequirement.GetItems()){
|
||||||
Pixel textCol=WHITE;
|
Pixel textCol=WHITE;
|
||||||
if(Inventory::GetItemCount(item.ActualName())<item.Amt())textCol=RED;
|
if(Inventory::GetItemCount(name)<amt)textCol=RED;
|
||||||
vf2d drawPos=rect.pos+vf2d{drawWidth*(index%3),12.f*(index/3)};
|
vf2d drawPos=rect.pos+vf2d{drawWidth*(index%3),12.f*(index/3)};
|
||||||
std::string labelText=std::format("{}",item.DisplayName());
|
std::string labelText=std::format("{}",name);
|
||||||
float labelWidth=game->GetTextSizeProp(labelText).x;
|
float labelWidth=game->GetTextSizeProp(labelText).x;
|
||||||
window.DrawShadowStringDecal(drawPos,std::format("{:>3}",item.Amt()),textCol,BLACK);
|
window.DrawShadowStringDecal(drawPos,std::format("{:>3}",amt),textCol,BLACK);
|
||||||
window.DrawShadowStringPropDecal(drawPos+vf2d{26,0},labelText,textCol,BLACK,{std::min(1.f,(drawWidth-26-2)/labelWidth),1.f});
|
window.DrawShadowStringPropDecal(drawPos+vf2d{26,0},labelText,textCol,BLACK,{std::min(1.f,(drawWidth-26-2)/labelWidth),1.f});
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
@ -70,7 +70,8 @@ public:
|
|||||||
MenuComponent::DrawDecal(window,focused);
|
MenuComponent::DrawDecal(window,focused);
|
||||||
|
|
||||||
if(!canEnhance&&fadeOutIfMissingRequirements){
|
if(!canEnhance&&fadeOutIfMissingRequirements){
|
||||||
window.FillRectDecal(rect.pos+vf2d{1,1},rect.size-vf2d{1,1},VERY_DARK_GREY);
|
Pixel col=PixelLerp(VERY_DARK_GREY,DARK_GREY,hoverEffect/"ThemeGlobal.HighlightTime"_F);
|
||||||
|
window.FillRectDecal(rect.pos+vf2d{1,1},rect.size-vf2d{1,1},col);
|
||||||
}
|
}
|
||||||
|
|
||||||
float scaleFactor=(rect.size.y-4)/24;
|
float scaleFactor=(rect.size.y-4)/24;
|
||||||
|
@ -42,3 +42,4 @@ Story proofreading/correcting/storyboarding
|
|||||||
- Game Controller Support
|
- Game Controller Support
|
||||||
- Should use the Keybind structure that already exists.
|
- Should use the Keybind structure that already exists.
|
||||||
- Loading Screen
|
- Loading Screen
|
||||||
|
- Title Screen setpieces
|
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 1
|
#define VERSION_PATCH 1
|
||||||
#define VERSION_BUILD 5026
|
#define VERSION_BUILD 5036
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
@ -27,6 +27,7 @@ Monsters
|
|||||||
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
||||||
DROP[0] = Green Slime Remains,65%,1,2
|
DROP[0] = Green Slime Remains,65%,1,2
|
||||||
DROP[1] = Minor Health Potion,5%,1,1
|
DROP[1] = Minor Health Potion,5%,1,1
|
||||||
|
DROP[2] = Berries,5%,1,1
|
||||||
|
|
||||||
#Additional custom animations go down below. Start with ANIMATION[0]. Order is:
|
#Additional custom animations go down below. Start with ANIMATION[0]. Order is:
|
||||||
# Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse)
|
# Frame Count, Frame Speed (s), Frame Cycling (Repeat,OneShot,PingPong,Reverse)
|
||||||
@ -58,6 +59,7 @@ Monsters
|
|||||||
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
||||||
DROP[0] = Blue Slime Remains,65%,1,2
|
DROP[0] = Blue Slime Remains,65%,1,2
|
||||||
DROP[1] = Minor Health Potion,5%,1,1
|
DROP[1] = Minor Health Potion,5%,1,1
|
||||||
|
DROP[2] = Berries,5%,1,1
|
||||||
|
|
||||||
#Additional custom animations go down below. Start with ANIMATION[0]
|
#Additional custom animations go down below. Start with ANIMATION[0]
|
||||||
#ANIMATION[0] = MY_NEW_ANIMATION
|
#ANIMATION[0] = MY_NEW_ANIMATION
|
||||||
@ -88,6 +90,7 @@ Monsters
|
|||||||
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
||||||
DROP[0] = Red Slime Remains,65%,1,2
|
DROP[0] = Red Slime Remains,65%,1,2
|
||||||
DROP[1] = Minor Health Potion,5%,1,1
|
DROP[1] = Minor Health Potion,5%,1,1
|
||||||
|
DROP[2] = Berries,5%,1,1
|
||||||
|
|
||||||
#Additional custom animations go down below. Start with ANIMATION[0]
|
#Additional custom animations go down below. Start with ANIMATION[0]
|
||||||
#ANIMATION[0] = MY_NEW_ANIMATION
|
#ANIMATION[0] = MY_NEW_ANIMATION
|
||||||
@ -116,7 +119,7 @@ Monsters
|
|||||||
DeathAnimation = 10, 0.1, OneShot
|
DeathAnimation = 10, 0.1, OneShot
|
||||||
|
|
||||||
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
||||||
#DROP[0] = Bandages,30%,1,1
|
DROP[0] = Berries,5%,1,1
|
||||||
|
|
||||||
#Additional custom animations go down below. Start with ANIMATION[0]
|
#Additional custom animations go down below. Start with ANIMATION[0]
|
||||||
#ANIMATION[0] = MY_NEW_ANIMATION
|
#ANIMATION[0] = MY_NEW_ANIMATION
|
||||||
@ -146,7 +149,7 @@ Monsters
|
|||||||
|
|
||||||
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
||||||
DROP[0] = Bandages,30%,1,1
|
DROP[0] = Bandages,30%,1,1
|
||||||
DROP[1] = Shell Helmet,100%,1,1
|
DROP[1] = Berries,5%,1,1
|
||||||
|
|
||||||
#Additional custom animations go down below. Start with ANIMATION[0]
|
#Additional custom animations go down below. Start with ANIMATION[0]
|
||||||
#ANIMATION[0] = MY_NEW_ANIMATION
|
#ANIMATION[0] = MY_NEW_ANIMATION
|
||||||
@ -176,7 +179,7 @@ Monsters
|
|||||||
DeathAnimation = 10, 0.1, OneShot
|
DeathAnimation = 10, 0.1, OneShot
|
||||||
|
|
||||||
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
# Drop Item Name, Drop Percentage(0-100%), Drop Min Quantity, Drop Max Quantity
|
||||||
#DROP[0] = Bandages,30%,1,1
|
DROP[0] = Berries,5%,1,1
|
||||||
|
|
||||||
#Additional custom animations go down below. Start with ANIMATION[0]
|
#Additional custom animations go down below. Start with ANIMATION[0]
|
||||||
ANIMATION[0] = monsters/Slime King - Cast.png
|
ANIMATION[0] = monsters/Slime King - Cast.png
|
||||||
|
@ -10,12 +10,6 @@ ItemDatabase
|
|||||||
Cooldown Time = 5.0
|
Cooldown Time = 5.0
|
||||||
Cast Time = 0.0
|
Cast Time = 0.0
|
||||||
SellValue = 8
|
SellValue = 8
|
||||||
Crafting
|
|
||||||
{
|
|
||||||
Item[0] = Green Slime Remains,2
|
|
||||||
|
|
||||||
Gold = 8
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Minor Health Potion
|
Minor Health Potion
|
||||||
{
|
{
|
||||||
@ -27,6 +21,16 @@ ItemDatabase
|
|||||||
Cast Time = 0.0
|
Cast Time = 0.0
|
||||||
SellValue = 16
|
SellValue = 16
|
||||||
BuyValue = 23
|
BuyValue = 23
|
||||||
|
Crafting
|
||||||
|
{
|
||||||
|
# When this crafting recipe is available.
|
||||||
|
AvailableChapter = 1
|
||||||
|
|
||||||
|
Item[0] = Green Slime Remains,3
|
||||||
|
Item[1] = Blue Slime Remains,1
|
||||||
|
|
||||||
|
Gold = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Minor Mana Potion
|
Minor Mana Potion
|
||||||
{
|
{
|
||||||
@ -38,6 +42,16 @@ ItemDatabase
|
|||||||
Cast Time = 0.0
|
Cast Time = 0.0
|
||||||
SellValue = 21
|
SellValue = 21
|
||||||
BuyValue = 30
|
BuyValue = 30
|
||||||
|
Crafting
|
||||||
|
{
|
||||||
|
# When this crafting recipe is available.
|
||||||
|
AvailableChapter = 1
|
||||||
|
|
||||||
|
Item[0] = Red Slime Remains,1
|
||||||
|
Item[1] = Yellow Slime Remains,1
|
||||||
|
|
||||||
|
Gold = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Minor Recovery Potion
|
Minor Recovery Potion
|
||||||
{
|
{
|
||||||
@ -47,6 +61,18 @@ ItemDatabase
|
|||||||
ItemCategory = Consumables
|
ItemCategory = Consumables
|
||||||
Cooldown Time = 5.0
|
Cooldown Time = 5.0
|
||||||
Cast Time = 0.0
|
Cast Time = 0.0
|
||||||
|
SellValue = 15
|
||||||
|
Crafting
|
||||||
|
{
|
||||||
|
# When this crafting recipe is available.
|
||||||
|
AvailableChapter = 1
|
||||||
|
|
||||||
|
Item[0] = Blue Slime Remains,1
|
||||||
|
Item[1] = Red Slime Remains,1
|
||||||
|
Item[2] = Flower Petals,1
|
||||||
|
|
||||||
|
Gold = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Elixir of Bear Strength
|
Elixir of Bear Strength
|
||||||
{
|
{
|
||||||
@ -56,6 +82,17 @@ ItemDatabase
|
|||||||
ItemCategory = Consumables
|
ItemCategory = Consumables
|
||||||
Cooldown Time = 5.0
|
Cooldown Time = 5.0
|
||||||
Cast Time = 0.0
|
Cast Time = 0.0
|
||||||
|
SellValue = 30
|
||||||
|
Crafting
|
||||||
|
{
|
||||||
|
# When this crafting recipe is available.
|
||||||
|
AvailableChapter = 1
|
||||||
|
|
||||||
|
Item[0] = Bear Claw,1
|
||||||
|
Item[1] = Bear Blood,1
|
||||||
|
|
||||||
|
Gold = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Bandages
|
Bandages
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user