ShadowRift

Veracity

Developer
Staff member
I wanted an external script that VMF could call to do the daily turn-free quest from Rufus. So here we are.
It's essentially complete, as of revision 7: it works fine for the artifact, entities, and items, and is VMF-ready.
It is tested from VMF, which calls it as part of free fights, with an item drop familiar.

Code:
> ShadowRift help

ShadowRift KEYWORD [KEYWORD]...

KEYWORD can be a command:
help - print this message
check - visit Rufus and see what he is looking for.

KEYWORD can be 'default' to simply use all properties as configured/defaulted.
That is normal behaviour unless you override individual properties.
You only need this if you don't intend (need) to override anything.

KEYWORD can override configuration properties:

What kind of quest to accept (VSR.QuestGoal):
artifact, entity, items

What reward to get at the Labyrinth of Shadows (VSR.LabyrinthGoal - 'items' only)
muscle, mysticality, moxie, effects, maxHP, maxMP, resistance

What reward to get with your shadow lodestone (VSR.QuestReward)
forge, waters, forest (once per day; chooses waters subsequently)

Which shadow rift ingress to use for getting the quest reward (VSR.RiftIngress)
(also used for adventuring, except for 'items', if it doesn't have what Rufus wants)
desertbeach, forestvillage, mclargehuge, beanstalk, manor3, 8bit
pyramid, giantcastle, woods, hiddencity, cemetery, plains, town_right

random - pick an ingress at random. For 'items', one which has what Rufus wants.

What kind of shadow item you want to harvest.
(randomly selects one of the 3-4 ingresses that provide that item.)
bread, brick, flame, fluid, glass, ice
nectar, sausage, sinew, skin, stick, venom

Use free turns (Shadow Affinity) only? (VSR.FreeTurnsOnly)
(If not and you attempt it, you'll get a nag to confirm.
onlyfree, notonlyfree

Buy shadow items to full Rufus's needs for an 'items' quest? (VSR.BuyShadowItems)
(This will let you finish the quest with no turns spent.)
buy, nobuy

Use up Shadow Affinity if fulfill quest with turns available? (VSR.UseUpShadowAffinity)
allfree, notallfree
Examples:

Code:
> ShadowRrift check
You are not currently on a quest for Rufus.

use 1 closed-circuit pay phone
Encounter: Calling Rufus
He'd like you to fight a shadow orrery
He'd like you to retrieve a shadow bucket
He'd like you to fetch 3 shadow bricks
(And now the "rufusDesiredArtifact", "rufusDesiredEntity", "rufusDesiredItems" properties are set, for use by scripts.)

Code:
> ShadowRrift check
You are on an 'items' quest to get 3 shadow bricks for Rufus
You are ready to call him back and turn it in!
(Those are from "questRufus", "rufusQuestType", and "rufusQuestTarget".)

Code:
> ShadowRift artifact random forest
Accept the artifact quest from Rufus, go to a random Shadow Rift ingress, and after Rufus gives you a shadow lodestone, go into the chosen Shadow Rift and visit the forest, collecting items.

Code:
> ShadowRift entity 8bit forge
Accept the entity quest from Rufus, enter the Shadow Rift through The 8-bit Realm, and after Rufus gives you a shadow lodestone, open the Shadow Forge.

Code:
> ShadowRift items hiddencity forest buy
Accept the items quest from Rufus, 'acquire' the items he wants, turn them in, and after Rufus gives you the shadow lodestone, enter the Shadow Rift through the Hidden City and visit the forest, collecting items. (If you have already visited the forest today, visit the fountain and get Shadow Waters.)

Code:
> ShadowRift items hiddencity waters nobuy
Accept the items quest from Rufus, adventure for the items he wants, turn them in, and after Rufus gives you the shadow lodestone, enter the Shadow Rift through the Hidden City and visit the fountain, getting the Shadow Waters effect.
We will stop adventuring when you either have the items or have encountered the Shadow Labyrinth and gotten the desired reward. I.e., at most 11 turns.
(I don't recommend adventuring for items. Items you already have will count against the three you need, so maybe you only need to find 1 or 2 more, but even so, the drop rates are so low, it may take multiple iterations.)

Your CCS has to be capable of dealing with normal shadow monsters.
We maximize for item drop, but do not switch to an item drop familiar. Make sure you have one at your side.
If you are using free turns to adventure, we'll cast Steely-eyed Squint to double your item drop, if it is available.
Since it only lasts for one turn, this is a perfect place to use it.

Install via:

Code:
> git checkout Veracity0/shadow-rift

Potential improvements:

1) For entity quest, when you are about to fight the boss, we'll heal you to 100% (avoid first round insta-kill from scythe, say), but is there anything else we could do? We depend on your CCS to handle each kind of boss, which is the easiest; only you know what your resources are and how you wish to use them.
2) Before adventuring, we maximize using "Item Drop -equip broken champagne bottle". Perhaps we should give you (configurable) control to add additional arguments?
3) Add documentation to README.md on github. If nothing more, installation instructions and the "help" text.

Suggestions (and even Pull Requests) are welcome.

Here's the configuration info from the top of the script.

Code:
//-------------------------------------------------------------------------
// All of the configuration variables have default values, which apply
// to any character who does not override the variable using the
// appropriate property.
//
// You can edit the default here in the script and it will apply to all
// characters which do not override it.
//
// define_property( PROPERTY, TYPE, DEFAULT )
// define_property( PROPERTY, TYPE, DEFAULT, COLLECTION )
// define_property( PROPERTY, TYPE, DEFAULT, COLLECTION, DELIMITER )
//
// Otherwise, you can change the value for specific characters in the gCLI:
//
//     set PROPERTY=VALUE
//
// Both DEFAULT and a property VALUE will be normalized
//
// All properties used directly by this script start with "VMF."
//-------------------------------------------------------------------------

// What is our quest goal?
//
// artifact             Easiest.
//                      10 combats with normal shadow creatures; mundane shadow item
//                      non-combat offers a choice for the artifact.
// entity               Most profitable, but hardest.
//                      10 combats with normal shadow creatures
//                      non-combat replaced by shadow boss, with combat powers
//                      Each boss always drops two specific mundane shadow items
// items                10 combats with normal shadow creatures.
//                      non-combat offers buffs or stats
//                      costs 3 of a specific mundane shadow item

string quest_goal = define_property( "VSR.QuestGoal", "string", "artifact" );

// If we seek items, the Shadow Labyrinth will give us a buff or stats.
// Which one do you want?
//
// muscle               90-100 Muscle substats
// mysticality          90-100 Mysticality substats
// moxie                90-100 Moxie substats
// effects              +3 turns to 3 random effects
// maxHP                30 Shadow's Heart: Maximum HP +300%
// maxMP                30 Shadow's Chill: Maximum MP +300
// resistance           30 Shadow's Thickness: +5 Spooky, Hot, Sleaze resistance

string labyrinth_goal = define_property( "VSR.LabyrinthGoal", "string", "maxHP" );

// What is our quest reward?
//
// forge                Opens Shadow Forge until you use an adventure.
//                      You can craft special shadow items from mundane shadow items.
// waters               30 turns of Shadow Waters:
//                      Initiative: +100, Item Drop: +100, Meat Drop: +200, Combat Rate: -10
// forest               (Once per day) 2-3 each of the 3 mundane items from the
//                      specific ingress you used to enter the Shadow Rift

// Default is "forest" (or "waters" if already looted forest today).
string quest_reward = define_property( "VSR.QuestReward", "string", "forest" );

// Which shadow rift ingress to use?
//
// desertbeach          shadow flame    shadow fluid    shadow sinew
// forestvillage        shadow bread    shadow ice      shadow venom
// mclargehuge          shadow skin     shadow ice      shadow stick
// beanstalk            shadow fluid    shadow glass    shadow nectar
// manor3               shadow sausage  shadow flame    shadow venom
// 8bit                 shadow ice      shadow fluid    shadow glass
// pyramid              shadow sausage  shadow brick    shadow sinew
// giantcastle          shadow sausage  shadow bread    shadow fluid
// woods                shadow flame    shadow nectar   shadow stick
// hiddencity           shadow brick    shadow sinew    shadow nectar
// cemetery             shadow bread    shadow brick    shadow stick
// plains               shadow sausage  shadow skin     shadow venom
// town_right           shadow skin     shadow bread    shadow glass
//
// random               Pick one at random from the 13 possible
//
// This will be the rift we collect the reward from. If Rufus wants "items", we might
// have to pick a different one that has the specific mundane item that Rufus wants.

string rift_ingress = define_property( "VSR.RiftIngress", "string", "random" );

// Should we use only free turns? I.e., require Shadow Affinity to be
// active (or available).  If so, we will prompt for confirmation if you
// attempt a quest where you will run out of free turns.

boolean free_turns_only = define_property( "VSR.FreeTurnsOnly", "boolean", "true" ).to_boolean();

// Should we buy items to fulfill an "items" quest?

boolean buy_shadow_items = define_property( "VSR.BuyShadowItems", "boolean", "true" ).to_boolean();

// Should we use up remaining turns of Shadow Affinity after fulfilling quest?
//
// If you are questing for "items" and are buying them, quests take zero
// turns.  You might want to do that as often as you like and then
// finish up with a different quest which will use up all your free
// turns.

boolean use_up_shadow_affinity = define_property( "VSR.UseUpShadowAffinity", "boolean", "true" ).to_boolean();
 

Magus_Prime

Well-known member
I ran the following on an alternate character:
ShadowRift artifact random forest
And the script ran fine until it hit the following:
[22544] Shadow Rift (Somewhere Over the Beanstalk)
Encounter: A Labyrinth of Shadows
Manual control requested for choice #1499
choice 1: Move blindly ahead (Randomize themes)
choice 2: Leap into the frost-rimed void (30 Shadow's Chill: Maximum MP +300%)
choice 3: Run to the soaked road (90-100 Moxie substats)
choice 4: Fly at the dilapidated breach (+3 turns to 3 random effects)
choice 5: Wait a while (Randomize themes)
choice 6: Withdraw in fear (Leave with nothing)
Click here to continue in the relay browser.


You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
You are currently in a choice.
This is how the script started to adventure:
You want to accept an artifact quest from Rufus.
You want the 'forest' reward for accomplishing that.
You want to enter (a random ingress).
We chose Shadow Rift (Somewhere Over the Beanstalk) for you.
You will find the following items there: shadow fluid, shadow glass, shadow nectar
Encounter: Calling Rufus
Submitting option 2 for choice 1497
You acquire an effect: Shadow Affinity (11)
You accepted an 'artifact' quest to get shadow wave
Internal checkpoint created.
Maximizer: Item Drop, -equip broken champagne bottle
Maximizing (1st time may take a while)...
48 combinations checked, best score 260.13
Putting on bounty-hunting helmet...
Equipment changed.
Wielding bounty-hunting rifle...
Equipment changed.
Putting on Misty Cloak...
Equipment changed.
Putting on bounty-hunting pants...
Equipment changed.
Putting on tiny plastic passenger car...
Equipment changed.
Putting on lucky rabbit's foot...
Equipment changed.
Putting on Copper Alpha of Sincerity...
Equipment changed.
Stealing annoying pitchfork from Mistletoe Diesel the Yule Hound...
Unequipping Mistletoe Diesel the Yule Hound...
Familiar unequipped.
Putting on annoying pitchfork...
Equipment changed.
Internal checkpoint created.
I ran it on an my main with:
ShadowRift entity random forest
And it finished without issue, fought the shadow orrery. turned in the reward and visited the forest.
 
Last edited:

Veracity

Developer
Staff member
So, if you have "Manual Choice" set for the Labyrinth of Shadows, it will not automate.
That is completely expected - except the script depends on it automating.
I had this nagging feeling about that...
I'll fix it by setting the labyrinthGoal from the property even if your quest goal is not "items".
 

Veracity

Developer
Staff member
Revision 4 fixes that issue: we will set shadowLabyrinthGoal to the chosen or default value of VSR.LabyrinthGoal - which defaults to "maxHP" - for both "items" and "artifact". "entity" doesn't care, since the shadow boss is your NC.

It also improved the data - there is now a ShadowRift record which contains: ingress keyword, location, and array of three items found there.

I will also mention that if you want to just run the script and have it pull everthing from the properties, rather than requiring you to specify keywords, you can just use "ShadowRift default". I would like to have been able to have "ShadowRift" with no args do that, but KoLmafia is coded to prompt you for arguments, if your main() function says it takes parameters.
 

Veracity

Developer
Staff member
Revision 5 improves "items" quest:

New configuration variables:
Code:
// Should we buy items to fulfill an "items" quest?

boolean buy_shadow_items = define_property( "VSR.BuyShadowItems", "boolean", "true" ).to_boolean();

// Should we use up turns of Shadow Affinity?

boolean use_up_shadow_affinity = define_property( "VSR.UseUpShadowAffinity", "boolean", "true" ).to_boolean();
  1. If you select the "items" goal, we are willing to use items in inventory - and even buy them, if so-directed - to fulfill the quest.
    Doing so allows you to fulfill an "items" quest without spending a single turn adventuring - or using up a single turn of Shadow Affinity.
  2. We formerly always used up your Shadow Affinity, assuming you'd be adventuring. Now, doing so is optional.
The net result of the above is that you can do:
Code:
ShadowRift items 8bit forest dontuseallfree
ShadowRift items pyramid forest dontuseallfree
...

ad infinitum and it will not adventure - or use Shadow Affinity turns - until you run out of items.
The specified rift is used for collecting the reward - significant only for the first "forest" of the day.
Subsequent "forest" rewards turn into "waters" and the rift you enter is not significant - except insofar as KoL remembers it as your "current" ingress.

We also (supposedly) will choose an "appropriate" ingress if you actually have to adventure for items.
I haven't had a chance to actually test that, yet.

Additionally, if you have already accepted - but not turned in - a quest from Rufus, we should be able to detect this and carry on from where you left off.
Again, I haven't had a chance to test that, yet.
 

Veracity

Developer
Staff member
Revision 6 finishes this up, modulo suggestions and bugs.

I tested/fixed/verified that you can do a "items" quest in zero turns if you buy items, and can attempt to adventure for items in a rift that has the required one, if you don't want to buy. I don't recommend that, since the drop rates are so low. But it works - using at most 11 adventures per attempt; it stops after visiting the Shadow Labyrinth).

I updated the initial note on this thread with up-to-date instructions and example.
 

Veracity

Developer
Staff member
I've been thinking how I'd like to use this in VMF.

1) Add 12 new keywords - glass, venom, stick, etc. - for the 12 kinds of mundane shadow items
2) Make those be like "random" - but selected from the 3-4 ingresses that supply that item.
(We have the technology; when adventuring for items, we choose an ingress that supplies it.)

Code:
call ShadowRift check
(look at rufusDesiredItems and see what he wants. Suppose it is shadow glass)
call ShadowRift items glass waters onlyfree buy notallfree
call ShadowRift artifact glass forest onlyfree allfree

1) Check out which mundane shadow item Rufus wants.
2) Start a quest to retrieve it - get 11 turns of Shadow Affinity
Fulfill the quest by buying the items
Get 30 turns of Shadow Waters - Init +100, Item Drop +100, Meat Drop +100
No turns used. Still have 11 Shadow Affinity
3) Start a quest to retrieve an artifact.
Adventure for 10 turns in a rift that provides us the item we turned in.
Get and turn in the artifact.
Visit the forest - get 2-3 each of 3 items, one of which is the one we turned in.
No turns used. Shadow Affinity is gone.

Net result is we trade 3 items for 6-9 items - including at least 2 of the one we spent.
We had 10 free fights (including stats/meat from model train set).
Those fights might have given us yet more items.
And we end up with 30 turns of Shadow Waters still active.

At which time VMF continues on with the rest of your free fights.

All I need is 12 more "item" keywords which are like a specialized "random".
 

Veracity

Developer
Staff member
Revision 7 allows you to use either "brick" or "shadow brick" to mean "an ingress where shadow bricks drop".
 

Veracity

Developer
Staff member
Ooh!

I just added 6 "issues" to github for this repository listing improvements I have in mind for this script.
I think none are critical, so don't look for them "soon", but feel free to comment.

 

Veracity

Developer
Staff member
Revision 14 (so the "issues" each increment the version? Huh.) fixes one of the issues: better support for combat.

It adds a consult script which handles all the shadow monsters and bosses.

It requires you to have Saucegeyser, will use Silent Treatment, if you have it, and throws gas cans at the shadow orrery, which reflects skills.

If you can handle that, add it to your CCS like this:

Code:
[ shadow rift ]
consult ShadowRiftConsult.ash

If your CCS is already set up to handle all the shadow monsters that you will meet - including bosses, if you will accept "entity" quests - you're all set. But if not, this consult script should help you figure out how to become all set. :)

If you have other strategies which work without those skills/items - and think that the consult script could be enhanced to use those those also - feel free to suggest them here, or on github.
 

Veracity

Developer
Staff member
Revision 16 makes combat spell and combat item configurable.
They default to Saucegeyser and gas can, but make your own choices.
It also detects if you have Drunkula's wineglass equipped and thus cannot use skills or items.
(Although, as it turns out, you can still pickpocket.)

Code:
// Which combat skill to use.
skill combat_spell = define_property( "VSR.CombatSpell", "skill", "Saucegeyser" ).to_skill();

// Which combat item to use.
item combat_item = define_property( "VSR.CombatItem", "item", "gas can" ).to_item();
 

Veracity

Developer
Staff member
Revision 17 improves combat support.

1) New configuration property (default to true):
Code:
boolean use_consult_script = define_property( "VSR.UseShadowRiftConsult", "boolean", "true" ).to_boolean();
We will create (if necessary) shadow-rift.ccs containing:
Code:
[ shadow rift ]
consult ShadowRiftConsult.ash
And switch to it during execution (restoring previous CCS script afterwards).

Huh. I just realized that your battleAction has to be set to "custom combat script" to ensure that happens.
I'll fix that.

2) New configuration property (default to false):
Code:
boolean use_space_tourist_phaser = define_property( "VSR.UseSpaceTouristPhaser", "boolean", "false" ).to_boolean();
As part of maximizing equipment, if true, we will equip a Space Tourist Phaser.

This converts physical damage to elemental, thus bypassing shadow monster 100% physical resistance.
With this, depending on your attack power, you can go quite far without needing Silent Treatment, combat spells, or combat items.
Caveat: defeating a shadow matrix requires a spell or combat item.

I did this:
Code:
set VSR.CombatSpell=none
set VSR.CombatItem=none
set VSR.UseSpaceTouristPhaser=true
And repeatedly ran "entity" quests:
Code:
ShadowRift entity random waters notonlyfree
And it worked great using nothing but physical attacks.
Until the entity quest was a shadow matrix. :)

3) If you have (and can equip) Drunkula's wineglass, you can visit a Shadow Rift overdrunk.
This might be most useful for turning in items quests via buying items, rather than fighting for them - since you still need to "adventure" through a shadow rift in order to use up a shadow lodestone - but with a Space Tourist Phaser (which we require and will use in this scenario), you can fight shadow critters quite well using nothing but attacks. Except for the shadow matrix of course.

This revision should complete the "improve combat" and "allow overdrunk" issues.
 

Veracity

Developer
Staff member
Revision 18:

1) Allow "mainstat" to choose that kind of substats as the Shadow Labyrinth reward.

2) User can configure extra parameters to append to the outfit maximizer expression.
Code:
string extra_maximizer_parameters = define_property( "VSR.ExtraMaximizerParameters", "string", "" );

3) If you start with a shadow lodestone, rather than aborting, collect the reward you asked for on the command line and then exit without starting a new quest.

4) We don't actually have to create a CCS file. Instead, we can set "battleAction" to "consult ShadowRiftConsult.ash" and that will be the special CCS action used for all fights.

5) Since a consult script can abort, catch the result of adv1() (which is whether we are now in an error state) and exit if it failed, rather than trying to finish up the script (while still in a fight, no less.)

6) Handle the shadow matrix better in ShadowRiftConsult: use your combat spell, if configured, otherwise throw items, if configured and you have not run out. If no spells and out of items, abort with a message of doom.
 

Veracity

Developer
Staff member
Revision 19:

If you have Shadow Affinity up, we can use your Platinum Yendorian Express Card to extend it by 5 turns.
This is configurable, and you have to opt in. Any extra 5 free fights seems like a strong use of the card, but it's up to you.
I stole the function from VMF which does fancy stuff to fetch it from the stash and return it, if you need to borrow it from your clan.

Code:
// Should we use a Platinum Yendorian Express Card to extend Shadow
// Affinity et. al. by 5 turns?
//
// We'll use it to gain 5 extra turns of Shadow Affinity - 5 additional
// free fight.  Seems like a strong choice to use the card for this
// purpose, but perhaps you have something you prefer, so, default is
// false, and you have to opt in.
//
// If you have autoSatisfyWithStash set to true, we will do special
// shenanigans to fetch & retrieve the card from your clan stash.

boolean use_pyec = define_property( "VSR.UsePYEC", "boolean", "false" ).to_boolean();
 

Veracity

Developer
Staff member
Revision 20 adds extensive documentation, visible by simply visiting the project on github.
Take a look and tell me what you think!

Note that there is a little symbol (representing a list) at the top-left of the documentation panel, which is a menu of the various section headers, allowing for easy navigation, once you know what you want to look for.

Suggestions welcome.

 

Veracity

Developer
Staff member
Revision 21 adds the ability to specify which familiar to bring with you.

It is likely to be an Item Drop familiar - and Jumpsuited Hound Dog is always a strong choice for that - but lacking that, it's not obvious which one you might want. In fact (using VMF, for example), perhaps you want your lubricated Robortender.

Rather than make a choice for you, there is a configuration property.

Code:
set VSR.ChosenFamiliar=your familiar here

If you use "none" - or don't specify, since that is the default - we'll not switch familiars, assuming you've already done so.
Otherwise, will use the familiar before adventuring and restore whatever you had before afterwords.
 

Veracity

Developer
Staff member
Revision 23 handles excess turns of Shadow Affinity (as from a PYEC, say) better.

Yesterday, after my quest, I burned 10 turns of Shadow Affinity by fighting regular shadow monsters.
(I SHOULD have immediately gone for the boss, since that is free, regardless of Shadow Affinity.)
Today, I accepted an entity quest, fought the shadow boss, got the reward, accepted another entity quest, fought 10 shadow monsters, fought the shadow boss, and got the reward again.

Tomorrow, I will only get one entity, but the day after I will get another two.
 

Veracity

Developer
Staff member
Revision 25 adds support for using a Jurassic Parka.
Here is the new configuration property to configure this:

Code:
// Should we equip a Jurassic Parka?
//
// This is always a strong choice, since it blocks the first attack against you,
// allowing an extra round of prep. The best Item Drop shirt currently gives +25.
//
// The parka also has a mode that gives you 5 uses of a combat skill that
// forces an NC next adventure. More NCs means more quests.
//
// none                 Do not equip a parka.
// hp                   Use kachungasaur mode, which grants Maximum HP +100
// spikes               Use spikolodon mode, which grants the combat skill
//                      It also increases Monster Level by 3 per level, max +33.
//                      That means more XP, but harder fights.
// both                 Use spikolodon mode for normal shadow monsters
//                      and kachungasaur mode for shadow bosses.

string parka_mode = define_property( "VSR.UseJurassicParka", "string", "both" );

I ran with this today in "both" mode. WIth 16 turns of Shadow Affinity (I have a PYEC)

fought 1 shadow bat, 1 shadow guy, 1 shadow prism, 3 shadow slab, 4 shadow snake (10 normal shadow monsters)
fought 1 shadow cauldron, 3 shadow matrix, 1 shadow spire, 1 shadow tongue (6 shadow bosses)
spent 3 shadow bricks.
found 1 shadow bread, 6 shadow brick, 3 shadow flame, 1 shadow fluid, 1 shadow glass, 3 shadow nectar, 2 shadow sausage, 7 shadow sinew, 3 shadow skin, 1 shadow stick (net gain of 25 items)
And ended up with 180 turns of Shadow Waters.

All using 0 turns.

I'd call that successful.

I hope it works well for you. I'm going on vacation for three weeks starting tomorrow, and, although I will have my laptop, I will not be coding. :)

Here is the comment from my PR:


--------

A Jurassic Parka is interesting for several reasons

1) The first attack against you always misses. This gives you an extra round against a shadow scythe or shadow spire and basically makes all fights safer.
2) In spikolodon mode, you can force the next adventure to be an NC. Which is to say, the Labyrinth of Shadows or a shadow boss. You can do this 5 times a day. That means that 11 turns of Shadow Affinity let you fulfill 5 artifact or entity quests, with either 1 or 6 turns of Shadow Affinity left over.
Code:
Accept an artifact quest (gain 11 Shadow Affinity)
Fight a normal shadow monster, launch spikolodon spikes, finish combat (1 turn of Shadow Affinity used)
Get artifact from Labyrinth of Shadows (no Shadow Affinity Used)
Get lodestone from Rufus and get reward
(repeat 4 times)
5 normal shadow monsters (item drops) + 150 turns of Shadow Waters + 6 turns of Shadow Affinity to burn on 6 normal shadow monsters.
Code:
Accept an entity quest (gain 11 Shadow Affinity)
Fight a normal shadow monster, launch spikolodon spikes, finish combat (1 turn of Shadow Affinity used)
Fight shadow boss (1 turn of Shadow Affinity used)
Get lodestone from Rufus and get reward
(repeat 4 times)
5 normal shadow monsters (item drops) + 5 shadow bosses (2 guaranteed items each) + 150 turns of Shadow Waters + 1 turn of Shadow Affinity to burn on a normal shadow monster

In both scenarios, 11 combats, but, as always, entity goal is more profitable.

I tested today like this:
Code:
encountersUntilSRChoice = 1
ShadowRift check
ShadowRift items brick forest onlyfree notallfree
(11 + 5 = 16 turns of affinity, using PYEC)
ShadowRift entity random waters onlyfree notallfree
(burning affinity yesterday left the NC 1 turn away, so no spikes needed or used)
(monster + boss -> 16 - 2 = 14 turns of affinity)
ShadowRift entity random waters onlyfree notallfree
(monster spikes + boss  -> 14 - 2 = 12 turns of affinity)
ShadowRift entity random waters onlyfree notallfree
(monster spikes + boss -> 12 - 2 = 10 turns of affinity)
ShadowRift entity random waters onlyfree allfree
(monster spikes + boss -> 10 - 2 = 8 turns of affinity)
(monster spikes + boss -> 8 - 2 = 6 turns of affinity)
(monster spikes + boss -> 6 -2 = 4 turns of affinity)
(monster -> 4 - 1 = 3 turns of affinity)
(monster -> 3 - 1 = 2 turns of affinity)
(monster -> 2 - 1 = 1 turns of affinity)
(monster -> 1 - 1 = 0 turns of affinity)

10 monsters, 6 bosses -> 16 free fights
180 turns of Shadow Waters -> +100 Items +100 Meat +100 Init
3 items spent, 28 items farmed -> net gain 25 items in 0 turns.
encountersUntilSEChoice = 6

This PR addresses Issue https://github.com/Veracity0/shadow-rift/issues/24

Things to come - after I get back from my three week vacation starting tomorrow, where I will not be coding:

1) I need to say something more about this in README.md than simply mentioning the new configuration property.

2) I have to think more about whether having extra Shadow Affinity from a PYEC is better to use before or after. Using it after gives you a head start for tomorrow - and will the carry-over quest progress allow a quest to be fullfilled before you start spiking and forcing NCs? Mayyyyybe. If so I should figure out how to manage that.
 
Top