From 46361d4055beb2443ed33c6eb765427f71048189 Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Sun, 15 May 2022 18:13:59 -0300 Subject: Price for some recipes is now automatically generated. This means you'll sell items by the total cost of their materials. It also makes possible to buy the items in theory. And dismantling them is no longer a profitable "cheat" --- npc/craft/price.txt | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++ npc/craft/recipes.txt | 4 +- npc/scripts.conf | 1 + 3 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 npc/craft/price.txt (limited to 'npc') diff --git a/npc/craft/price.txt b/npc/craft/price.txt new file mode 100644 index 000000000..88e90f5ce --- /dev/null +++ b/npc/craft/price.txt @@ -0,0 +1,158 @@ +// TMW-2 Script. +// Author: +// Jesusalva +// Description: +// Modifies the sell price for crafts +// Always run this when casting @reloaditemdb +function script _fix_cPrice { + .@const$ = data_to_string(getarg(0)); + .@m = getarg(1, 35); + + // Shady code by gumi + if (startswith(.@const$, "Craft")) { + // infer the item constant from the craft constant + .@recipe = getarg(0); + + .@item = string_to_data(substr(.@const$, 5, getstrlen(.@const$) - 1)); + } else { + // infer the craft constant from the item constant + .@recipe = string_to_data(sprintf("Craft%s", .@const$)); + .@item = getarg(0); + } + + if (.@item <= 0) { + // target item not found + consolebug("ERROR, INVALID ITEM ID DETECTED at _fix_cPrice"); + return; + } + + .@price = 0; + // More shady code by gumi + for (.@inv = 0; .@inv < 9; ++.@inv) { + .@size = getcraftrecipe(.@recipe, .@inv, .@qty[0], .@item_id[0]); + + if (.@size < 0) { + if (.@size == -1) { + // recipe does not exist + break; + } + // inventory does not exist + break; + } + + // More shady code to build new price + for (.@it = 0; .@it < .@size; ++.@it) { + .@recipe_item = .@item_id[.@it]; + .@recipe_qty = .@qty[.@it]; + + if (.@recipe_item <= 0) { + break; + } + + // Increase the final price + debugmes("Price %d + %d GP (%dx %s)", .@price, getiteminfo(.@recipe_item, ITEMINFO_SELLPRICE), + .@recipe_qty, getitemname(.@recipe_item)); + .@price += getiteminfo(.@recipe_item, ITEMINFO_SELLPRICE) * .@recipe_qty; + debugmes("New price: %d", .@price); + } + + // Update the final price + if (.@price > 0) { + consoleinfo("Price for %s adjusted from %d (%d) to %d (%d) GP", getitemname(.@item), getiteminfo(.@item, ITEMINFO_BUYPRICE), getiteminfo(.@item, ITEMINFO_SELLPRICE), .@price * .@m / 10, .@price); + setiteminfo(.@item, ITEMINFO_BUYPRICE, .@price * .@m / 10); + setiteminfo(.@item, ITEMINFO_SELLPRICE, .@price); + debugmes("New Price for %s is now %d (%d) GP", getitemname(.@item), getiteminfo(.@item, ITEMINFO_BUYPRICE), getiteminfo(.@item, ITEMINFO_SELLPRICE)); + } + } + debugmes "\n\n-------------------------------------------------------"; + return; +} + +function script fix_cPrice { + // In some cases, we don't care + if (debug) return; + + // Otherwise... + // Fix potions prices + _fix_cPrice(AgiPotionA); + _fix_cPrice(AgiPotionB); + _fix_cPrice(AgiPotionC); + _fix_cPrice(VitPotionA); + _fix_cPrice(VitPotionB); + _fix_cPrice(VitPotionC); + _fix_cPrice(IntPotionA); + _fix_cPrice(IntPotionB); + _fix_cPrice(IntPotionC); + _fix_cPrice(DexPotionA); + _fix_cPrice(DexPotionB); + _fix_cPrice(DexPotionC); + _fix_cPrice(LukPotionA); + _fix_cPrice(LukPotionB); + _fix_cPrice(LukPotionC); + //_fix_cPrice(HastePotion); // 240 -> 75 + //_fix_cPrice(StrengthPotion); // 240 -> 195 + + // TODO: Scrolls? Reagents? + // And reagents should happen before potions + + // And weapons + _fix_cPrice(WoodenSword); + _fix_cPrice(BugSlayer); + _fix_cPrice(ShortGladius); + _fix_cPrice(Backsword); + _fix_cPrice(ShortSword); + _fix_cPrice(Kitana); + _fix_cPrice(BoneKnife); + _fix_cPrice(LongSword); + _fix_cPrice(RockKnife); + _fix_cPrice(DivineSword); + + // And two hand weapons + _fix_cPrice(MiereCleaver); + _fix_cPrice(Broadsword); + _fix_cPrice(Halberd); + _fix_cPrice(ImmortalSword); + + // And archery + _fix_cPrice(ShortBow); + _fix_cPrice(ForestBow); + _fix_cPrice(ElficBow); + _fix_cPrice(ChampionshipBow); + _fix_cPrice(BansheeBow); + + // And magic + _fix_cPrice(TrainingWand, 22); + _fix_cPrice(NoviceWand, 27); + _fix_cPrice(ApprenticeWand); + _fix_cPrice(LeaderWand); + _fix_cPrice(MysticWand); + + // And Firestaves + _fix_cPrice(PynRevolver); + _fix_cPrice(PynRifle); + _fix_cPrice(PynGatling); + _fix_cPrice(PynShotgun); + + // And misc + _fix_cPrice(TerranitePants); + _fix_cPrice(TerraniteArmor); + _fix_cPrice(Skypiercer); + return; +} + +- script craft_price_fix -1,{ + end; + +OnCall: + atcommand("@reloaditemdb"); + fix_cPrice(); + end; + +OnInit: + bindatcmd "reloaditemdb2", "craft_price_fix::OnCall", 99, 100, 1; + // This should be called last + sleep(750); + fix_cPrice(); + end; +} + diff --git a/npc/craft/recipes.txt b/npc/craft/recipes.txt index 4dd2cbcfc..7f49114d6 100644 --- a/npc/craft/recipes.txt +++ b/npc/craft/recipes.txt @@ -138,9 +138,9 @@ function readAlchemy { mesc "----------"+l("General Boosts")+"----------", 2; showRecipe(HastePotion, StrengthPotion, - StatusResetPotion, + StatusResetPotion, // BROKEN HomunResetPotion, - MoveSpeedPotion, + MoveSpeedPotion, // BROKEN PrecisionPotion, DodgePotion, SacredLifePotion, diff --git a/npc/scripts.conf b/npc/scripts.conf index 737f2df8a..fcf973775 100644 --- a/npc/scripts.conf +++ b/npc/scripts.conf @@ -97,6 +97,7 @@ "npc/craft/smith.txt", "npc/craft/tweak.txt", "npc/craft/recipes.txt", +"npc/craft/price.txt", // custom atcommands "npc/commands/music.txt", -- cgit v1.2.3-70-g09d2