This commit is contained in:
VDH
2026-04-14 11:35:15 +07:00
8 changed files with 367 additions and 12 deletions
@@ -1531,6 +1531,50 @@ public static class generate_item_temp
return 0;
}
public static int generate_revivescroll<RAND_CLASS>(uint id, ID_SPACE idspace, out byte[] data, out uint size, RAND_CLASS cls)
{
data = new byte[0];
size = 0;
DATA_TYPE datatype = DATA_TYPE.DT_INVALID;
object obj = itemdataman._edm.get_data_ptr(id, idspace, ref datatype);
if(obj == null || datatype != DATA_TYPE.DT_REVIVESCROLL_ESSENCE)
return -1;
REVIVESCROLL_ESSENCE ess = (REVIVESCROLL_ESSENCE)obj;
size = (uint)(Marshal.SizeOf(typeof(item_data)) + Marshal.SizeOf(typeof(REVIVESCROLL_ESSENCE)));
// allocate the buffer with exact length
data = new byte[size];
int offset = 0;
WriteUInt(data, ref offset, id); //ƷģID
WriteUInt(data, ref offset, 1); //Ʒ
WriteUInt(data, ref offset, (uint)ess.pile_num_max); //ƷĶѵ
WriteInt(data, ref offset, 0); //ƷĿװ־
WriteInt(data, ref offset, (int)ess.proc_type); //ƷĴʽ
WriteInt(data, ref offset, (int)DATA_TYPE.DT_REVIVESCROLL_ESSENCE); //ƷӦID
if(ess.has_guid == 1){
int g1,g2;
itemdataman.get_item_guid(id,out g1,out g2);
WriteInt(data, ref offset, g1);
WriteInt(data, ref offset, g2);
}
else{
WriteInt(data, ref offset, 0);
WriteInt(data, ref offset, 0);
}
WriteInt(data, ref offset, ess.price);
WriteInt(data, ref offset, 0);
int content_length = 0;
int content_length_ptr = offset;
WriteInt(data, ref offset, 0);
int item_content = offset;
WriteInt(data, ref offset, 0);
content_length = (int)(size - offset);
WriteInt(data, ref content_length_ptr, content_length);
WriteInt(data, ref item_content, offset);
itemdataman.set_to_classid(DATA_TYPE.DT_REVIVESCROLL_ESSENCE, data, -1);
return 0;
}
#region Write Functions
private static void WriteUInt(byte[] buf, ref int offset, uint value)
{
@@ -500,6 +500,9 @@ namespace BrewMonster
case DATA_TYPE.DT_TOWNSCROLL_ESSENCE:
ret = generate_item_temp.generate_townscroll(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND);
break;
case DATA_TYPE.DT_REVIVESCROLL_ESSENCE:
ret = generate_item_temp.generate_revivescroll(id, ID_SPACE.ID_SPACE_ESSENCE, out item, out size, SPECIFIC.SPECIFIC_RAND);
break;
default:
ret = -1;
@@ -62,7 +62,7 @@ namespace BrewMonster
public string FileHitGfx => ByteToStringUtils.ByteArrayToCP936String(file_hitgfx);
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] file_hitsfx; // Hit sound effect file pathpublic string FileHitSfx => ByteToStringUtils.ByteArrayToCP936String(file_hitsfx);
public byte[] file_hitsfx; // Hit sound effect file path
public string FileHitSfx => ByteToStringUtils.ByteArrayToCP936String(file_hitsfx);
public float probability_fastest; // Attack frequency probability: Fastest -0.1
public float probability_fast; // Attack frequency probability: Fast -0.05
@@ -1673,13 +1673,13 @@ namespace BrewMonster
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
public ushort[] name; // Name, max 15 characters
public string Name => ByteToStringUtils.UshortArrayToUnicodeString(name);
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] file_matter; // Material file path
public string FileMatter => ByteToStringUtils.ByteArrayToCP936String(file_matter);
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] file_icon; // Icon file path
public string FileIcon => ByteToStringUtils.ByteArrayToCP936String(file_icon);
public float use_time; // Use time (seconds)
public int cool_time; // Cooldown time (milliseconds)
@@ -980,7 +980,6 @@ namespace BrewMonster.Scripts
/// </summary>
public override int GetScaledPrice()
{
Debug.Log($"GetScaledPrice: m_iScaleType: {m_iScaleType}");
if (m_iScaleType != (int)EC_IvtrItem.ScaleType.SCALE_SELL)
return base.GetScaledPrice();
@@ -988,13 +987,11 @@ namespace BrewMonster.Scripts
if (MaxEndurance == CurEndurance || MaxEndurance == 0)
{
Debug.Log($"GetScaledPrice: price: {price}, MaxEndurance: {m_fPriceScale}");
return (int)(price * m_fPriceScale + 0.5f);
}
else
{
Debug.Log($"GetScaledPrice: price: {price}, PriceScale: {m_fPriceScale}, CurEndurance: {CurEndurance}, MaxEndurance: {MaxEndurance}, factor: {CurEndurance / (float)MaxEndurance}");
return (int)(price * m_fPriceScale * CurEndurance / (float)MaxEndurance + 0.5f);
}
}
@@ -140,8 +140,6 @@ namespace BrewMonster.Scripts
if (m_pDBEssence.hp_add_total > 0)
{
BMLogger.Log("EC_IvtrMedicine: BuildEffectDesc: m_pDBEssence.hp_add_total: " + m_pDBEssence.hp_add_total);
BMLogger.Log("EC_IvtrMedicine: BuildEffectDesc: m_pDBEssence.hp_add_time: " + m_pDBEssence.hp_add_time);
if (m_pDBEssence.hp_add_time > 0)
AddDescText(white, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_ADDHPINTIME), m_pDBEssence.hp_add_time, m_pDBEssence.hp_add_total);
else
@@ -1,8 +1,13 @@
using BrewMonster;
using BrewMonster.Scripts.Managers;
using ModelRenderer.Scripts.GameData;
using CSNetwork.GPDataType;
using BrewMonster.Network;
namespace BrewMonster.Scripts
{
public class EC_IvtrRevScroll : EC_IvtrItem
{
public REVIVESCROLL_ESSENCE m_pDBEssence;
/// <summary>
/// Not create logic yet (add summary later)
/// </summary>
@@ -10,11 +15,83 @@ namespace BrewMonster.Scripts
/// <param name="expire_date">Expire date</param>
public EC_IvtrRevScroll(int tid, int expire_date) : base(tid, expire_date)
{
elementdataman pDB = ElementDataManProvider.GetElementDataMan();
DATA_TYPE DataType = default;
m_pDBEssence = (REVIVESCROLL_ESSENCE)pDB.get_data_ptr((uint)tid, ID_SPACE.ID_SPACE_ESSENCE,ref DataType);
m_iPileLimit = m_pDBEssence.pile_num_max;
m_iPrice = m_pDBEssence.price;
m_iShopPrice = m_pDBEssence.shop_price;
m_iProcType = (int)m_pDBEssence.proc_type;
m_i64EquipMask = 0;
m_bUseable = true;
m_bNeedUpdate = false;
}
public EC_IvtrRevScroll(EC_IvtrRevScroll other) : base(other)
{
m_pDBEssence = other.m_pDBEssence;
}
public override bool SetItemInfo(byte[] pInfoData, int iDataLen)
{
base.SetItemInfo(pInfoData, iDataLen);
return true;
}
// Get item icon file name
public override string GetIconFile()
{
return m_pDBEssence.FileIcon;
}
// Get item name
public override string GetName()
{
return m_pDBEssence.Name;
}
public override int GetCoolTime(out int piMax/* NULL */)
{
piMax = 0;
CECHostPlayer pHost = CECGameRun.Instance.GetHostPlayer();
return pHost ? pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_SOUL_STONE, out piMax) : 0;
}
// Get item description text
protected override string GetNormalDesc(bool bRepair)
{
m_strDesc = "";
// Try to build item description
CECStringTab pDescTab = EC_Game.GetItemDesc();
int white = (int) DescriptipionMsg.ITEMDESC_COL_WHITE;
int namecol = DecideNameCol();
if (m_iCount > 1)
AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAMENUMBER), GetName(), m_iCount);
else
AddDescText(namecol, true, pDescTab.GetWideString((int)DescriptipionMsg.ITEMDESC_NAME), GetName());
AddIDDescText();
AddExpireTimeDesc();
// Price
AddPriceDesc(white, bRepair);
// Extend description
AddExtDescText();
return m_strDesc;
}
// Get drop model for shown
public override string GetDropModel()
{
return m_pDBEssence.FileMatter;
}
}
}
@@ -52,8 +52,9 @@ namespace BrewMonster.Scripts
return m_pDBEssence.FileIcon;
}
// Get item cool time
public int GetCoolTime(ref int piMax)
public override int GetCoolTime(out int piMax)
{
piMax =0;
CECHostPlayer pHost = EC_Game.GetGameRun().GetHostPlayer();
return pHost ? pHost.GetCoolTime((int)CoolTimeIndex.GP_CT_TOWNSCROLL, out piMax) : 0;
}
@@ -471,8 +471,243 @@ public class NPCShopUIManager : AUIDialog
itemName = ByteToStringUtils.UshortArrayToUnicodeString(projectileEssence.name);
shopPrice = projectileEssence.shop_price;
break;
case DATA_TYPE.DT_REVIVESCROLL_ESSENCE:
var revivescrollEssence = (REVIVESCROLL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(revivescrollEssence.name);
shopPrice = revivescrollEssence.shop_price;
break;
case DATA_TYPE.DT_TASKNORMALMATTER_ESSENCE:
var tasknormalmatterEssence = (TASKNORMALMATTER_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(tasknormalmatterEssence.name);
shopPrice = tasknormalmatterEssence.shop_price;
break;
case DATA_TYPE.DT_DAMAGERUNE_ESSENCE:
var damageruneEssence = (DAMAGERUNE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(damageruneEssence.name);
shopPrice = damageruneEssence.shop_price;
break;
case DATA_TYPE.DT_ARMORRUNE_ESSENCE:
var armorruneEssence = (ARMORRUNE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(armorruneEssence.name);
shopPrice = armorruneEssence.shop_price;
break;
case DATA_TYPE.DT_SKILLTOME_ESSENCE:
var skilltomeEssence = (SKILLTOME_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(skilltomeEssence.name);
shopPrice = skilltomeEssence.shop_price;
break;
case DATA_TYPE.DT_FLYSWORD_ESSENCE:
var flyswordEssence = (FLYSWORD_ESSENCE)itemData;
itemName = flyswordEssence.Name;
shopPrice = flyswordEssence.shop_price;
break;
case DATA_TYPE.DT_WINGMANWING_ESSENCE:
var wingmanwingEssence = (WINGMANWING_ESSENCE)itemData;
itemName = wingmanwingEssence.Name;
shopPrice = wingmanwingEssence.shop_price;
break;
case DATA_TYPE.DT_TOWNSCROLL_ESSENCE:
var townscrollEssence = (TOWNSCROLL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(townscrollEssence.name);
shopPrice = townscrollEssence.shop_price;
break;
case DATA_TYPE.DT_UNIONSCROLL_ESSENCE:
var unionscrollEssence = (UNIONSCROLL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(unionscrollEssence.name);
shopPrice = unionscrollEssence.shop_price;
break;
case DATA_TYPE.DT_ELEMENT_ESSENCE:
var elementEssence = (ELEMENT_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(elementEssence.name);
shopPrice = elementEssence.shop_price;
break;
case DATA_TYPE.DT_TOSSMATTER_ESSENCE:
var tossmatterEssence = (TOSSMATTER_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(tossmatterEssence.name);
shopPrice = tossmatterEssence.shop_price;
break;
case DATA_TYPE.DT_FASHION_ESSENCE:
var fashionEssence = (FASHION_ESSENCE)itemData;
itemName = fashionEssence.Name;
shopPrice = fashionEssence.shop_price;
break;
case DATA_TYPE.DT_FACETICKET_ESSENCE:
var faceticketEssence = (FACETICKET_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(faceticketEssence.name);
shopPrice = faceticketEssence.shop_price;
break;
case DATA_TYPE.DT_FACEPILL_ESSENCE:
var facepillEssence = (FACEPILL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(facepillEssence.name);
shopPrice = facepillEssence.shop_price;
break;
case DATA_TYPE.DT_PET_FACETICKET_ESSENCE:
var petFaceticketEssence = (PET_FACETICKET_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(petFaceticketEssence.name);
shopPrice = petFaceticketEssence.shop_price;
break;
case DATA_TYPE.DT_FIREWORKS_ESSENCE:
var fireworksEssence = (FIREWORKS_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(fireworksEssence.name);
shopPrice = fireworksEssence.shop_price;
break;
case DATA_TYPE.DT_WAR_TANKCALLIN_ESSENCE:
var warTankcallinEssence = (WAR_TANKCALLIN_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(warTankcallinEssence.name);
shopPrice = warTankcallinEssence.shop_price;
break;
case DATA_TYPE.DT_SKILLMATTER_ESSENCE:
var skillmatterEssence = (SKILLMATTER_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(skillmatterEssence.name);
shopPrice = skillmatterEssence.shop_price;
break;
case DATA_TYPE.DT_REFINE_TICKET_ESSENCE:
var refineTicketEssence = (REFINE_TICKET_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(refineTicketEssence.name);
shopPrice = refineTicketEssence.shop_price;
break;
case DATA_TYPE.DT_DESTROYING_ESSENCE:
var destroyingEssence = (DESTROYING_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(destroyingEssence.name);
shopPrice = destroyingEssence.shop_price;
break;
case DATA_TYPE.DT_BIBLE_ESSENCE:
var bibleEssence = (BIBLE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(bibleEssence.name);
shopPrice = bibleEssence.shop_price;
break;
case DATA_TYPE.DT_SPEAKER_ESSENCE:
var speakerEssence = (SPEAKER_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(speakerEssence.name);
shopPrice = speakerEssence.shop_price;
break;
case DATA_TYPE.DT_AUTOHP_ESSENCE:
var autohpEssence = (AUTOHP_ESSENCE)itemData;
itemName = autohpEssence.Name;
shopPrice = autohpEssence.shop_price;
break;
case DATA_TYPE.DT_AUTOMP_ESSENCE:
var autompEssence = (AUTOMP_ESSENCE)itemData;
itemName = autompEssence.Name;
shopPrice = autompEssence.shop_price;
break;
case DATA_TYPE.DT_DOUBLE_EXP_ESSENCE:
var doubleExpEssence = (DOUBLE_EXP_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(doubleExpEssence.name);
shopPrice = doubleExpEssence.shop_price;
break;
case DATA_TYPE.DT_TRANSMITSCROLL_ESSENCE:
var transmitscrollEssence = (TRANSMITSCROLL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(transmitscrollEssence.name);
shopPrice = transmitscrollEssence.shop_price;
break;
case DATA_TYPE.DT_DYE_TICKET_ESSENCE:
var dyeTicketEssence = (DYE_TICKET_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(dyeTicketEssence.name);
shopPrice = dyeTicketEssence.shop_price;
break;
case DATA_TYPE.DT_GOBLIN_ESSENCE:
var goblinEssence = (GOBLIN_ESSENCE)itemData;
itemName = goblinEssence.Name;
shopPrice = goblinEssence.shop_price;
break;
case DATA_TYPE.DT_GOBLIN_EQUIP_ESSENCE:
var goblinEquipEssence = (GOBLIN_EQUIP_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(goblinEquipEssence.name);
shopPrice = goblinEquipEssence.shop_price;
break;
case DATA_TYPE.DT_GOBLIN_EXPPILL_ESSENCE:
var goblinExppillEssence = (GOBLIN_EXPPILL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(goblinExppillEssence.name);
shopPrice = goblinExppillEssence.shop_price;
break;
case DATA_TYPE.DT_SELL_CERTIFICATE_ESSENCE:
var sellCertificateEssence = (SELL_CERTIFICATE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(sellCertificateEssence.name);
shopPrice = sellCertificateEssence.shop_price;
break;
case DATA_TYPE.DT_TARGET_ITEM_ESSENCE:
var targetItemEssence = (TARGET_ITEM_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(targetItemEssence.name);
shopPrice = targetItemEssence.shop_price;
break;
case DATA_TYPE.DT_LOOK_INFO_ESSENCE:
var lookInfoEssence = (LOOK_INFO_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(lookInfoEssence.name);
shopPrice = lookInfoEssence.shop_price;
break;
case DATA_TYPE.DT_INC_SKILL_ABILITY_ESSENCE:
var incSkillAbilityEssence = (INC_SKILL_ABILITY_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(incSkillAbilityEssence.name);
shopPrice = incSkillAbilityEssence.shop_price;
break;
case DATA_TYPE.DT_WEDDING_BOOKCARD_ESSENCE:
var weddingBookcardEssence = (WEDDING_BOOKCARD_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(weddingBookcardEssence.name);
shopPrice = weddingBookcardEssence.shop_price;
break;
case DATA_TYPE.DT_WEDDING_INVITECARD_ESSENCE:
var weddingInvitecardEssence = (WEDDING_INVITECARD_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(weddingInvitecardEssence.name);
shopPrice = weddingInvitecardEssence.shop_price;
break;
case DATA_TYPE.DT_SHARPENER_ESSENCE:
var sharpenerEssence = (SHARPENER_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(sharpenerEssence.name);
shopPrice = sharpenerEssence.shop_price;
break;
case DATA_TYPE.DT_FACTION_MATERIAL_ESSENCE:
var factionMaterialEssence = (FACTION_MATERIAL_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(factionMaterialEssence.name);
shopPrice = factionMaterialEssence.shop_price;
break;
case DATA_TYPE.DT_CONGREGATE_ESSENCE:
var congregateEssence = (CONGREGATE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(congregateEssence.name);
shopPrice = congregateEssence.shop_price;
break;
case DATA_TYPE.DT_FORCE_TOKEN_ESSENCE:
var forceTokenEssence = (FORCE_TOKEN_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(forceTokenEssence.name);
shopPrice = forceTokenEssence.shop_price;
break;
case DATA_TYPE.DT_DYNSKILLEQUIP_ESSENCE:
var dynskillequipEssence = (DYNSKILLEQUIP_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(dynskillequipEssence.name);
shopPrice = dynskillequipEssence.shop_price;
break;
case DATA_TYPE.DT_MONEY_CONVERTIBLE_ESSENCE:
var moneyConvertibleEssence = (MONEY_CONVERTIBLE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(moneyConvertibleEssence.name);
shopPrice = moneyConvertibleEssence.shop_price;
break;
case DATA_TYPE.DT_MONSTER_SPIRIT_ESSENCE:
var monsterSpiritEssence = (MONSTER_SPIRIT_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(monsterSpiritEssence.name);
shopPrice = monsterSpiritEssence.shop_price;
break;
case DATA_TYPE.DT_POKER_DICE_ESSENCE:
var pokerDiceEssence = (POKER_DICE_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(pokerDiceEssence.name);
shopPrice = pokerDiceEssence.shop_price;
break;
case DATA_TYPE.DT_POKER_ESSENCE:
var pokerEssence = (POKER_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(pokerEssence.name);
shopPrice = pokerEssence.shop_price;
break;
case DATA_TYPE.DT_SHOP_TOKEN_ESSENCE:
var shopTokenEssence = (SHOP_TOKEN_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(shopTokenEssence.name);
shopPrice = shopTokenEssence.shop_price;
break;
case DATA_TYPE.DT_UNIVERSAL_TOKEN_ESSENCE:
var universalTokenEssence = (UNIVERSAL_TOKEN_ESSENCE)itemData;
itemName = ByteToStringUtils.UshortArrayToUnicodeString(universalTokenEssence.name);
shopPrice = universalTokenEssence.shop_price;
break;
default:
itemName = $"Item_{good.id}";
itemName = $"Item_{good.id}_{itemDataType}";
break;
}