Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Saturas sells High Robe twice #25

Closed
AmProsius opened this issue Jan 1, 2021 · 10 comments · Fixed by #83
Closed

Saturas sells High Robe twice #25

AmProsius opened this issue Jan 1, 2021 · 10 comments · Fixed by #83
Labels
compatibility: easy This issue is easy to make compatible. impl: hook script func This issue requires hooking script functions. type: session fix The fix for this issues is persistent across a session.
Milestone

Comments

@AmProsius
Copy link
Owner

Saturas offers to sell a second High Robe of Water.

@AmProsius AmProsius added this to To Do in v1.0.0 via automation Jan 1, 2021
@AmProsius AmProsius removed ai labels Jan 1, 2021
@catalinstoian
Copy link

catalinstoian commented Jan 16, 2021

FUNC int KDW_600_Saturas_HEAVYARMOR_Condition()
{
if (Npc_GetTrueGuild (hero) == GIL_KDW)
{
return TRUE;
};
};

change to

FUNC int  KDW_600_Saturas_HEAVYARMOR_Condition()
{	
	if (Npc_GetTrueGuild (hero) == GIL_KDW) && (!Npc_HasItems(hero, KDW_ARMOR_H))
	{
		return TRUE;
	};
};

@szapp szapp added type: session fix The fix for this issues is persistent across a session. compatibility: easy This issue is easy to make compatible. labels Jan 24, 2021
szapp added a commit that referenced this issue Jan 26, 2021
v1.0.0 automation moved this from To Do to Done Jan 26, 2021
AmProsius added a commit that referenced this issue Jan 26, 2021
#25: Saturas no longer sells the robe twice
@AmProsius AmProsius added this to the v1.0.0 milestone Feb 9, 2021
@szapp
Copy link
Collaborator

szapp commented Mar 6, 2021

@AmProsius Could it be that the same happens for Corristo?

/*------------------------------------------------------------------------
SCHWERE ROBE
------------------------------------------------------------------------*/
instance KDF_402_Corristo_HEAVYARMOR (C_INFO)
{
npc = KDF_402_Corristo;
condition = KDF_402_Corristo_HEAVYARMOR_Condition;
information = KDF_402_Corristo_HEAVYARMOR_Info;
important = 0;
permanent = 1;
description = B_BuildBuyArmorString(NAME_CorristoHighRobe,VALUE_KDF_ARMOR_H);
};
FUNC int KDF_402_Corristo_HEAVYARMOR_Condition()
{
if (Npc_GetTrueGuild (hero) == GIL_KDF)
{
return TRUE;
};
};
FUNC void KDF_402_Corristo_HEAVYARMOR_Info()
{
AI_Output (other, self,"KDF_402_Corristo_HEAVYARMOR_Info_15_01"); //Master, I'd like to wear the high robe of Fire.
if (Kapitel < 3)
{
AI_Output (self, other,"KDF_402_Corristo_WANNBEKDF_Info_14_04"); //You are not ready yet. Come back when you've learned more.
//AI_Output (other, self,"KDF_402_Corristo_HEAVYARMOR_Info_15_02"); //Es ist noch nicht deine Zeit, die hohe Robe zu tragen. //***FALSCHE STIMME***
}
else if (Npc_HasItems (hero,ItMinugget)< VALUE_KDF_ARMOR_H)
{
AI_Output (self, other,"KDF_402_Corristo_HEAVYARMOR_Info_14_03"); //You don't own enough ore.
}
else
{
AI_Output (self, other,"KDF_402_Corristo_HEAVYARMOR_Info_14_04"); //The time has come. You are worthy of wearing the high robe of Fire.
CreateInvItem (hero,KDF_ARMOR_H);
CreateInvItem (self, ItAmArrow);
B_GiveInvItems (self, hero, ItAmArrow, 1);
Npc_RemoveInvItem (hero, ItAmArrow);
B_GiveInvItems (hero, self, ItMinugget,VALUE_KDF_ARMOR_H);
AI_EquipBestArmor (hero);
KDF_402_Corristo_HEAVYARMOR.permanent = 0;
};
};

@AmProsius
Copy link
Owner Author

AmProsius commented Mar 6, 2021

Could it be that the same happens for Corristo?

That depends on whether the player is able to get the High Robe before the dialog. I'll have to check that.

Right now I don't even understand how the player is able to get the High Robe of Water twice...

@szapp
Copy link
Collaborator

szapp commented Mar 6, 2021

The line KDF_402_Corristo_HEAVYARMOR.permanent = 0; is supposed to remove the availability of the dialog. However, that line is not valid. Up on saving and loading, the dialog should be available again.

That’s why I speculate the same thing happening here, too. I just had no opportunity to test it yet.

@szapp
Copy link
Collaborator

szapp commented Mar 6, 2021

Unrelated, there seems to be a ton of occurrences of C_Info.permanent = .... Which are all non-save persistent and probably all cause bugs

_work\Data\Scripts\Content\Story\Missions\DIA_EBR_106_Bartholo.d:
  124          B_GiveXP            (XP_WeedShipmentDelivered);
  125  
  126:         Info_Bartholo_Krautbote.permanent = 0;
  127      }
  128      else

_work\Data\Scripts\Content\Story\Missions\DIA_GRD_200_Thorus.d:
  982          AI_Output (self, other,"GRD_200_Thorus_ZWEIHAND1_Info_09_06"); //Two-handed swords are ideal for coordinating side hits to keep opponents at a distance.
  983          AI_Output (self, other,"GRD_200_Thorus_ZWEIHAND1_Info_09_07"); //That should do to begin with. Have a practice.
  984:         GRD_200_Thorus_ZWEIHAND1.permanent = 0;
  985      };
  986  };
  ...
 1021          AI_Output (self, other,"GRD_200_Thorus_ZWEIHAND2_Info_09_08"); //When you've finished your attack, block your opponent and wait for an opening to strike again.
 1022          AI_Output (self, other,"GRD_200_Thorus_ZWEIHAND2_Info_09_09"); //The key to success is varying your stances and changing positions.
 1023:         GRD_200_Thorus_ZWEIHAND2.permanent = 0 ;
 1024      };
 1025  };

_work\Data\Scripts\Content\Story\Missions\DIA_GRD_205_Scorpio.d:
  222              AI_Output (self, other,"GRD_205_Scorpio_CROSSBOW_OK_13_06"); //Aim right at your target and pull the bolt right back. There's more force behind a bolt than there is behind an arrow from a longbow, so it's going to cause more damage!
  223              B_GiveInvItems (hero,other,ItMiNugget,200);
  224:             GRD_205_Scorpio_CROSSBOW.permanent = 0;
  225          };
  226      }
  ...
  282          AI_Output (self, other,"GRD_205_Scorpio_CROSSBOW2_OK_13_06"); //That's it, I've taught you all I know.
  283          B_GiveInvItems (hero,other,ItMiNugget,300);
  284:         GRD_205_Scorpio_CROSSBOW2.permanent = 0;
  285          };
  286      }

_work\Data\Scripts\Content\Story\Missions\DIA_GRD_216_Torwache.d:
  134  
  135          B_GiveInvItems  (hero, self, ItMiNugget, 100);
  136:         DIA_Grd_216_DustyZoll.permanent = 0;
  137          B_LogEntry          (CH1_RecruitDusty,"I managed to bribe the guards at the rear south gate. Everyone has a price!");
  138          B_GiveXP            (XP_BribedDustyGuard);

_work\Data\Scripts\Content\Story\Missions\DIA_GRD_260_Drake.d:
   88          AI_Output           (self,hero,"Grd_260_Drake_Crawler_Okay_11_04");//Or stand with your back to the wall. That way you may stand a chance!
   89  
   90:         //Grd_260_Drake_Crawler_Okay.permanent = 0;
   91      }
   92      else
   93      {
   94          AI_Output           (self,other,"Grd_260_Drake_Crawler_Okay_11_06");//Are you kidding me? Come back when you have some beer.
   95:         Grd_260_Drake_Crawler_Okay.permanent = 1;
   96     };
   97  };

_work\Data\Scripts\Content\Story\Missions\DIA_GRD_262_Aaron.d:
  123      Aaron_lock = LOG_RUNNING;
  124      Snipes_Deal = LOG_SUCCESS;
  125:     GRD_262_Aaron_BLUFF.permanent = 0;
  126  
  127      B_LogEntry      (CH2_SnipesDeal,"I lured Aaron away from the chest on the pretext that Ian wanted to see him. I hope he'll take it in good humor.");

_work\Data\Scripts\Content\Story\Missions\DIA_GUR_1201_CorKalom.d:
  505          B_GiveXP            (XP_WeedShipmentReported);
  506  
  507:         Info_Kalom_KrautboteBACK.permanent = 0;
  508      }
  509      else

_work\Data\Scripts\Content\Story\Missions\DIA_GUR_1202_CorAngar.d:
  204      {
  205          AI_Output       (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_02"); //You are not yet ready. You can join us as soon as you've gathered more experience.
  206:         GUR_1202_CorAngar_WANNABETPL.permanent = 1;
  207      }
  208      else if (hero.level >= 10)
  ...
  214          AI_Output       (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_07"); //Remember: A focused spirit and a trained body may withstand any threat.
  215          AI_Output       (self, other,"GUR_1202_CorAngar_WANNABETPL_Info_08_08"); //Now go to Gor Na Toth at the training ground. He'll give you new armor.
  216:         GUR_1202_CorAngar_WANNABETPL.permanent = 0;
  217          Npc_SetTrueGuild(hero, GIL_TPL);
  218          hero.guild = GIL_TPL;
  ...
  260          AI_Output           (self, other,"GUR_1202_CorAngar_ZWEIHAND1_Info_08_05"); //Concentration is the key. Body and mind unite in concentration.
  261  
  262:         GUR_1202_CorAngar_ZWEIHAND1.permanent       = 0;
  263  
  264          AI_StopProcessInfos (self);
  ...
  302          AI_Output           (self, other,"GUR_1202_CorAngar_ZWEIHAND2_Info_08_08"); //Use your skill cautiously. And remember: To provoke a fight means you will die in a fight.
  303  
  304:         GUR_1202_CorAngar_ZWEIHAND2.permanent = 0;
  305  
  306          AI_StopProcessInfos (self);

_work\Data\Scripts\Content\Story\Missions\DIA_GUR_1208_BaalCadar.d:
  273          AI_Output (self, other,"Gur_1208_BaalCadar_KREIS1_Info_02_05"); //Only Y'Berion and a few others set off and founded the Brotherhood.
  274          AI_Output (self, other,"Gur_1208_BaalCadar_KREIS1_Info_02_06"); //The moment they obeyed the Sleeper's call, the First Circle was born. The magic of the runes will be understood by anybody who follows the Sleeper.
  275:         Gur_1208_BaalCadar_KREIS1.permanent = 0;
  276      };
  277      AI_StopProcessInfos ( self );
  ...
  311          AI_Output (self, other,"Gur_1208_BaalCadar_KREIS2_Info_02_05"); //Together they tried to contact the Sleeper on a spiritual level.
  312          AI_Output (self, other,"Gur_1208_BaalCadar_KREIS2_Info_02_06"); //The Second Circle was born.
  313:         Gur_1208_BaalCadar_KREIS2.permanent = 0;
  314      };
  315      AI_StopProcessInfos ( self );
  ...
  384          AI_Output (self, other,"Gur_1208_BaalCadar_KREIS4_Info_02_05"); //Perseverance and stability of faith represent the Fourth Circle.
  385          AI_Output (self, other,"Gur_1208_BaalCadar_KREIS4_Info_02_06"); //Now you know everything a brother needs to know about magic. You have been a good student.
  386:         Gur_1208_BaalCadar_KREIS4.permanent = 0;
  387      };
  388  

_work\Data\Scripts\Content\Story\Missions\DIA_KDF_402_Corristo.d:
  122          AI_Output (self, other,"KDF_402_Corristo_WANNBEKDF_Info_14_05"); //Your spirit is mature and ready to join us. If you want to become a magician, I must test you first. Let me know when you're ready for the test.
  123          Corristo_KDFAufnahme = 1;
  124:         KDF_402_Corristo_WANNBEKDF.permanent = 0;
  125          Info_ClearChoices (KDF_402_Corristo_WANNBEKDF);
  126  
  ...
  468          AI_Output (self, other,"KDF_402_Corristo_KREIS1_Info_14_08"); //With every Circle you enter, you learn to use further runes as well.
  469          AI_Output (self, other,"KDF_402_Corristo_KREIS1_Info_14_09"); //Use the power of the runes to recognize yourself.
  470:         KDF_402_Corristo_KREIS1.permanent   = 0;
  471      };
  472  };
  ...
  507          AI_Output (self, other,"KDF_402_Corristo_KREIS2_Info_14_07"); //But a true magician only uses magic when it is necessary.
  508          AI_Output (self, other,"KDF_402_Corristo_KREIS2_Info_14_08"); //Understand the situation, then you'll recognize the power of the runes.
  509:         KDF_402_Corristo_KREIS2.permanent = 0;
  510      };
  511  
  ...
  545          AI_Output (self, other,"KDF_402_Corristo_KREIS3_Info_14_06"); //Do not hesitate to use your powers as soon as you've made your choice.
  546          AI_Output (self, other,"KDF_402_Corristo_KREIS3_Info_14_07"); //Understand your path, then you'll recognize the power of the decision.
  547:         KDF_402_Corristo_KREIS3.permanent = 0;
  548      };
  549  
  ...
  582          AI_Output (self, other,"KDF_402_Corristo_KREIS4_Info_14_06"); //You have now learned everything I can teach you.
  583          AI_Output (self, other,"KDF_402_Corristo_KREIS4_Info_14_07"); //Understand the magic, then you'll discover the secret of power.
  584:         KDF_402_Corristo_KREIS4.permanent = 0;
  585      };
  586  };
  ...
  631          B_GiveInvItems      (hero, self, ItMinugget,VALUE_KDF_ARMOR_H);
  632          AI_EquipBestArmor   (hero);
  633:         KDF_402_Corristo_HEAVYARMOR.permanent = 0;
  634      };
  635  

_work\Data\Scripts\Content\Story\Missions\DIA_KDF_404_Xardas.d:
  967              hero.guild  = GIL_DMB;
  968              Npc_SetTrueGuild    ( hero, GIL_DMB );
  969:             Info_Xardas_LOADSWORD09.permanent = 0;
  970              AI_StopProcessInfos ( self );
  971          };

_work\Data\Scripts\Content\Story\Missions\DIA_KDW_600_Saturas.d:
  918          AI_Output           (self, other,"KDW_600_Saturas_KREIS1_Info_14_08"); //With every Circle you enter, you learn to use further runes as well.
  919          AI_Output           (self, other,"KDW_600_Saturas_KREIS1_Info_14_09"); //Use the power of the runes to recognize yourself.
  920:         KDW_600_Saturas_KREIS1.permanent = 0;
  921      };
  922  };
  ...
  959          AI_Output           (self, other,"KDW_600_Saturas_KREIS2_Info_14_07"); //But a true magician only uses magic when it is necessary.
  960          AI_Output           (self, other,"KDW_600_Saturas_KREIS2_Info_14_08"); //Understand the situation, then you'll recognize the power of the runes.
  961:         KDW_600_Saturas_KREIS2.permanent = 0;
  962      };
  963  
  ...
  999          AI_Output           (self, other,"KDW_600_Saturas_KREIS3_Info_14_06"); //Do not hesitate to use your powers as soon as you've made your choice.
 1000          AI_Output           (self, other,"KDW_600_Saturas_KREIS3_Info_14_07"); //Understand your path, then you'll recognize the power of the decision.
 1001:         KDW_600_Saturas_KREIS3.permanent = 0;
 1002      };
 1003  
 ....
 1039          //AI_Output         (self, other,"KDW_600_Saturas_KREIS4_Info_14_06"); //Du hast jetzt alles gelernt, was ich dir beibringen kann.
 1040          AI_Output           (self, other,"KDW_600_Saturas_KREIS4_Info_14_07"); //Understand the magic, then you'll discover the secret of power.
 1041:         KDW_600_Saturas_KREIS4.permanent = 0;
 1042      };
 1043  };
 ....
 1078          AI_Output       (self, other,"KDW_600_Saturas_KREIS4_Info_14_06"); //You have now learned everything I can teach you.
 1079          AI_Output       (self, other,"KDW_600_Saturas_KREIS5_Info_14_06"); //Expose your limits, then you'll recognize your true power.
 1080:         KDW_600_Saturas_KREIS5.permanent = 0;
 1081      };
 1082  };
 ....
 1120      {
 1121          AI_Output           (self, other,"KDW_600_Saturas_HEAVYARMOR_Info_14_04"); //The time has come. You are worthy of wearing the high robe of Water.
 1122:         KDW_600_Saturas_HEAVYARMOR.permanent = 0;
 1123  
 1124          B_GiveInvItems      (hero,self, ItMinugget,VALUE_KDW_ARMOR_H);

_work\Data\Scripts\Content\Story\Missions\DIA_SLD_700_Lee.d:
  598          AI_Output           (self, other,"Sld_700_Lee_ZWEIHAND1_Info_08_07"); //That should do to begin with. Have a practice.
  599  
  600:         Sld_700_Lee_ZWEIHAND1.permanent = 0;
  601      };
  602  };
  ...
  641          AI_Output           (self, other,"Sld_700_Lee_ZWEIHAND2_Info_08_09"); //The key to success is varying your stances and changing positions.
  642  
  643:         Sld_700_Lee_ZWEIHAND2.permanent = 0;
  644      };
  645  };

_work\Data\Scripts\Content\Story\Missions\DIA_SLD_709_Cord.d:
   91              AI_Output           (self,other,"SLD_709_Cord_TRAIN_14_07"); //But the further you progress, the better you get.
   92              B_GiveInvItems (hero, self,ItMiNugget,30);
   93:             SLD_709_Cord_TRAIN.permanent = 0;
   94          };
   95      }
   ..
  136              AI_Output       (self, other,"SLD_709_Cord_TRAINAGAIN_Info_14_05"); //And back to the front. Don't forget: practice makes perfect. So, get going and become a real master of the art of one-handed fighting.
  137              B_GiveInvItems  (hero, self, ItMiNugget, 50);
  138:             SLD_709_Cord_TRAINAGAIN.permanent = 0;
  139          };
  140      }

_work\Data\Scripts\Content\Story\Missions\DIA_TPL_1402_GorNaToth.d:
  419          AI_Output           (self,other,"TPL_1402_GorNaToth_TRAIN_11_06"); //Oh yeah, one more thing: Some hits cause more damage than others! As a beginner, you don't stand much of a chance of making critical hits.
  420          AI_Output           (self,other,"TPL_1402_GorNaToth_TRAIN_11_07"); //But the further you progress, the better you get.
  421:         TPL_1402_GorNaToth_TRAIN.permanent = 0;
  422  
  423          AI_StopProcessInfos (self);
  ...
  457          AI_Output (self, other,"TPL_1402_GorNaToth_TRAINAGAIN_Info_11_04"); //Then bring your blade across from right to left once more.
  458          AI_Output (self, other,"TPL_1402_GorNaToth_TRAINAGAIN_Info_11_05"); //And back to the front. Don't forget: practice makes perfect. So, get going and become a real master of the art of one-handed fighting.
  459:         TPL_1402_GorNaToth_TRAINAGAIN.permanent = 0;
  460  
  461          AI_StopProcessInfos (self);

_work\Data\Scripts\Content\Story\Missions\DIA_TPL_1415_Torwache.d:
  196          CreateInvItem (self, NOV_ARMOR_L);
  197          B_GiveInvItems (self, hero, NOV_ARMOR_L, 1);
  198:         Tpl_1415_Templer_ROCK.permanent = 0;
  199      };
  200  

_work\Data\Scripts\Content\Story\Missions\DIA_TPL_1438_Templer.d:
  196          Log_CreateTopic (GE_AnimalTrophies,LOG_NOTE);
  197          B_LogEntry      (GE_AnimalTrophies,"How to remove mandibles - minecrawlers");
  198:         Tpl_1438_Templer_TEACHZANGEN.permanent      = 0;
  199          PrintScreen     ("Learn: Cutting out minecrawlers' mandibles", -1,-1,"FONT_OLD_20_WHITE.TGA",2);
  200      }

_work\Data\Scripts\Content\Story\Missions\DIA_VLK_584_Snipes.d:
  118          B_GiveInvItems  (hero, self, ItMiNugget,30);
  119          B_GiveInvItems  (self, hero, ItKe_OM_02, 1);
  120:         VLK_584_Snipes_DEAL_2.permanent = 0;
  121  
  122          B_LogEntry      (CH2_SnipesDeal,"I bought the key to the chest from Snipes! I wonder what Aaron is going to do when I tell him about it?");

_work\Data\Scripts\Content\Story\Missions\DIA_VLK_585_Aleph.d:
  247          Npc_SetPermAttitude (self, ATT_FRIENDLY );
  248          Info_ClearChoices   (VLK_585_Aleph_SCHUPPEN);
  249:         VLK_585_Aleph_SCHUPPEN.permanent = 0;
  250          B_Aleph_StorageShedKey();
  251      }
  ...
  253      {
  254          AI_Output (self,other,"VLK_585_Aleph_SCHUPPEN_50_05_03"); //You don't have that much ore!
  255:         VLK_585_Aleph_SCHUPPEN.permanent = 1;
  256      };
  257  };
  ...
  269          AI_Output (other,self,"VLK_585_Aleph_SCHUPPEN_30_15_01"); //30 ore should be enough.
  270          AI_Output (self,other,"VLK_585_Aleph_SCHUPPEN_30_05_02"); //Alright, I happen to have the key here.
  271:         VLK_585_Aleph_SCHUPPEN.permanent = 0;
  272          B_Aleph_StorageShedKey();
  273      }
  ...
  275      {
  276          AI_Output (self,other,"VLK_585_Aleph_SCHUPPEN_30_05_03"); //You don't have that much ore.
  277:         VLK_585_Aleph_SCHUPPEN.permanent = 1;
  278      };
  279  };
  ...
  282      AI_Output (other,self,"VLK_585_Aleph_SCHUPPEN_15_15_01"); //Is 15 ore alright with you?
  283      AI_Output (self,other,"VLK_585_Aleph_SCHUPPEN_15_05_02"); //15 ore? I don't know anything about a key!
  284:     VLK_585_Aleph_SCHUPPEN.permanent = 0;
  285  };
  286  func void VLK_585_Aleph_SCHUPPEN_Back ()
  287  {
  288      Info_ClearChoices   (  VLK_585_Aleph_SCHUPPEN );
  289:     VLK_585_Aleph_SCHUPPEN.permanent = 1;
  290  };
  291  
  ...
  332          B_GiveInvItems      (self, other, ItKe_OM_03, 1);
  333          Info_ClearChoices   ( VLK_585_Aleph_DIRTY );
  334:         VLK_585_Aleph_DIRTY.permanent = 0;
  335          B_Aleph_StorageShedKey();
  336      }
  ...
  338      {
  339          AI_Output (self,other,"VLK_585_Aleph_DIRTY_100_Info_05_03"); //Do you think I'm stupid or what? 100 ore, and not a nugget less!
  340:         VLK_585_Aleph_DIRTY.permanent = 1;
  341      };
  342  };
  ...
  345      AI_Output (other,self,"VLK_585_Aleph_DIRTY_NO_Info_15_01"); //I'm not gonna throw 100 ore at you!
  346      AI_Output (self,other,"VLK_585_Aleph_DIRTY_NO_Info_05_02"); //Hey, it's you who constantly starts talking to me!
  347:     VLK_585_Aleph_DIRTY.permanent = 0;
  348  };
  349  

@AmProsius
Copy link
Owner Author

AmProsius commented Mar 6, 2021

I've at least heard about the Dusty exploit, but I didn't know how to reproduce it yet. I will try to check the highlighted situations.

@szapp is there a simpler solution than to update the condition for every single occurrence?

@szapp
Copy link
Collaborator

szapp commented Mar 6, 2021

@szapp is there a simpler solution than to update the condition for every single occurrence?

Regarding the setting of C_Info.permanent? Unfortunately, this will have to be fixed in the info condition functions. In each case there will have to be an additional check whether the specific “branch” of the dialog had been executed. How that can be determined varies from occurrence to occurrence and is not even guaranteed to be possible.

@AmProsius
Copy link
Owner Author

I just confirmed the Dusty exploit. The player can bribe the Guard (100 ore, 250 EXP), then save the game, then load the save and bribe the Guard again. So as long as the player has enough ore, he can get 250 EXP for 100 ore each.

So I guess that is true for all of the occurences. I will add issues for them when I have the time. Thank you for spotting these issues!

@szapp
Copy link
Collaborator

szapp commented Mar 6, 2021

I just confirmed the Dusty exploit. The player can bribe the Guard (100 ore, 250 EXP), then save the game, then load the save and bribe the Guard again. So as long as the player has enough ore, he can get 250 EXP for 100 ore each.

Cool, thank you for taking the time to confirm and explain the bug.

So I guess that is true for all of the occurences. I will add issues for them when I have the time. Thank you for spotting these issues!

That sounds good. There is a fair chance that not all of them can be fixed. But creating the issues would already provide some structure for looking at and discussing them individually.

PS: The list I complied above was a simple file search for the phrase .permanent (mind the prefixed dot).

@AmProsius AmProsius added this to Info condition in Fix templates Mar 7, 2021
@szapp
Copy link
Collaborator

szapp commented Mar 7, 2021

From the search list above, these are the infos that need fixing (judging from the scripts alone and excluding any that already have an issue created)

  • GRD_205_Scorpio_CROSSBOW
  • Grd_260_Drake_Crawler_Okay
  • Info_Kalom_KrautboteBACK
  • KDF_402_Corristo_WANNBEKDF
  • VLK_585_Aleph_SCHUPPEN
  • VLK_585_Aleph_DIRTY

@szapp szapp added the impl: hook script func This issue requires hooking script functions. label Mar 16, 2021
@szapp szapp moved this from Hook Daedalus function to Unsorted in Fix templates Mar 16, 2021
@szapp szapp moved this from Unsorted to Dialog: Info condition in Fix templates Mar 17, 2021
AmProsius added a commit that referenced this issue Apr 15, 2021
@szapp szapp moved this from Modify dialog conditions to Add dialog conditions in Fix templates Feb 6, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compatibility: easy This issue is easy to make compatible. impl: hook script func This issue requires hooking script functions. type: session fix The fix for this issues is persistent across a session.
Projects
Fix templates
Add dialog conditions
v1.0.0
  
Done
Development

Successfully merging a pull request may close this issue.

3 participants