• Dear forum reader,
    To actively participate in our forum discussions or to start your own threads, in addition to your game account you need a forum account. You can
    REGISTER HERE!
    Please ensure a translation in to English is provided if your post is not in English and to respect your fellow players when posting.

Feedback Fellowship Event 2023

Status
Not open for further replies.

xivarmy

Overlord
Perk Creator
Having now updated and played around with optimization a little in my sim:

4/4 managers takes ~21 hours per run
3/3 managers takes ~50 hours per run
3/4 managers presents as an interesting in between option at ~36 hours per run - basically by taking an extra shipcarriage manager level you restore the state of things with even managers in st pats where you would naturally overship and level festival first giving a very fast return on levelling ship afterwards; where in fellowship with even managers we usually do shipcarriage first because we're not shipping enough to gain anything from levelling festivalbanquet first.

Tasks as they stand also present a few interesting choices - where you might add some hours to a run for a few more tasks but no more gem cost in some situations if you were going to run out of gems anyways - and a few futile traps. I'd be hesitant about asking for the traps to be reviewed though as this feels like a monkey paw wish where some currently easy tasks might become more challenging as well :p
 

Sinitar

Regent
4/4 managers takes ~21 hours per run
Are you sure about this? Since I started today the 2nd city at midday and probably I will ultimate festival at midnight... According with some numbers :
Lvl 200 banquet produce 800b each 5 sec x 12 times are 9,6T each min x 60 mins are 576T for 9h are 5.184T or 5,18Q...
To reach 8,4Q it requires 14h and 36mins:rolleyes:
 

xivarmy

Overlord
Perk Creator
Are you sure about this? Since I started today the 2nd city at midday and probably I will ultimate festival at midnight... According with some numbers :
Lvl 200 banquet produce 800b each 5 sec x 12 times are 9,6T each min x 60 mins are 576T for 9h are 5.184T or 5,18Q...
To reach 8,4Q it requires 14h and 36mins:rolleyes:

You suffer from some crude rounding. It doesn't take 5 seconds for the banquet at 4. I just counted 19 in 62 seconds to be sure = 3.26 seconds per lap - which lines up with my calculation of 3.27 pretty closely :)

It'll come out to a bit over 10 hours of waiting on the final step. and 11 hours to get there in a somewhat optimized order:


Step Description​
New Capital​
Cumulative Time (s)​
Step Time (s)​
Start​
Add To​
#​
0.00E+00​
0​
0.0​
Spice-10​
Spice​
9​
1.90E+02​
45​
45.1​
Carriage-5​
Carriage​
4​
6.24E+02​
52​
7.4​
Banquet-5​
Banquet​
4​
4.99E+02​
58​
5.9​
Spice-25​
Spice​
15​
1.05E+03​
71​
12.4​
Spice-50​
Spice​
25​
1.36E+04​
87​
16.1​
Carriage-15​
Carriage​
10​
4.44E+03​
91​
3.6​
Banquet-15​
Banquet​
10​
3.55E+03​
93​
2.6​
Carriage-25​
Carriage​
10​
1.80E+04​
94​
1.1​
Banquet-25​
Banquet​
10​
1.44E+04​
95​
0.9​
Juice-10​
Juice​
10​
2.35E+05​
107​
12.2​
Juice-25​
Juice​
15​
1.21E+06​
139​
31.7​
Juice-50​
Juice​
25​
1.57E+07​
219​
80.1​
Carriage-50​
Carriage​
25​
7.61E+05​
223​
3.9​
Banquet-50​
Banquet​
25​
6.09E+05​
226​
2.8​
Spice-100​
Spice​
50​
1.74E+06​
226​
0.2​
Farm-10​
Farm​
10​
3.48E+07​
231​
4.9​
Farm-25​
Farm​
15​
1.80E+08​
267​
36.2​
Carriage-100​
Carriage​
50​
8.50E+08​
403​
135.5​
Banquet-100​
Banquet​
50​
6.80E+08​
499​
96.6​
Juice-100​
Juice​
50​
2.01E+09​
543​
43.4​
Farm-50​
Farm​
25​
2.32E+09​
560​
17.1​
Bakery-1​
Bakery​
1​
2.73E+09​
570​
10.4​
Bakery-2​
Bakery​
1​
3.00E+09​
579​
9.2​
Bakery-10​
Bakery​
8​
3.77E+10​
676​
97.1​
Carriage Levels​
Carriage​
32​
7.37E+10​
860​
183.5​
Banquet Levels​
Banquet​
20​
1.05E+10​
883​
23.2​
Carriage-150​
Carriage​
18​
8.48E+11​
2479​
1596.2​
Banquet Levels​
Banquet​
20​
1.71E+11​
2796​
316.7​
Banquet-150​
Banquet​
10​
5.55E+11​
3676​
880.4​
Bakery-25​
Bakery​
15​
2.25E+11​
3682​
5.2​
Bakery-50​
Bakery​
25​
2.91E+12​
3749​
67.2​
Carriage Levels​
Carriage​
30​
6.01E+13​
5292​
1543.6​
Banquet Levels​
Banquet​
10​
2.25E+12​
5344​
51.9​
Carriage Levels​
Carriage​
13​
3.15E+14​
12163​
6819.0​
Banquet Levels​
Banquet​
18​
3.39E+13​
12899​
735.8​
Carriage-200​
Carriage​
7​
6.24E+14​
25408​
12508.8​
Banquet Levels​
Banquet​
8​
7.60E+13​
26890​
1481.6​
Banquet Levels​
Banquet​
10​
3.44E+14​
33305​
6415.5​
Banquet-200​
Banquet​
4​
3.42E+14​
39363​
6057.4​
Optimized 4-4​
21.0487583714214​
8.40E+15​
75776​
36413.0​
 
Last edited:
Fellowship%20logo%20copy.png

Dear Kings and Queens,
On Wednesday, May 31st, you can enjoy the Fellowship Event again and prepare many feasts!

This is the place to be if you have any questions about it or would like to discuss it with other players.
Please keep in mind that your opinion may differ from the opinions of other players, you don't have to convince each other of anything here. :)

We appreciate your feedback!

Please write your feedback in a factual and constructive way and stay on topic.
So that we can pass your feedback on to the developers, the following points would be important to note:
  • Feedback that only contains one sentence like "Too much food!" is not helpful. Please make sure to include reasons for your opinion.
  • The same goes for positive feedback. We are happy about it of course, but describing what exactly you like is always very helpful!
  • Limit your feedback to the actual content. Feedback like "You should improve X" or feedback that refers to other game content or previous events is not helpful.
  • Use the "Like" button if another player has already reflected your opinion well.
Thank you very much and have fun!

Sincerely,
Your Forge of Empires Team
The game is badly out of balance. I have easily produced over 21Q of food but, after 36hrs have only managed to transport just over 3Q to the final provisions feast. The Banquet and transport features need to faster and cost much less.
 
The game is badly out of balance. I have easily produced over 21Q of food but, after 36hrs have only managed to transport just over 3Q to the final provisions feast. The Banquet and transport features need to faster and cost much less.
Just the costing much less should fix it.

My biggest complaints about St Paddies was that I should not have to wait for 2000 productions to be able to upgrade my building to the final level. I'm on level 190 of feast producing 179B and cost 30T to upgrade to 191. That is 168 productions FOR ONE LEVEL, and that extra level only gives what 1B upgrade or less. Each level to 200 is exponentially more expensive, I believe it was almost 100T from 199-200 or 500 productions.

And then you have to do this twice for the carriage, which is even more expensive and slower.
 

CDmark

Baronet
the task "carriage level 300" should be amended - it is impossible to do - even 250 would take more than 40 days
the task "butcher level 50" although possible is not really economic
The cut and paste tasks has pros and cons. These two mentioned take a long time but we did them in St Pats. But some other tasks in St Pats that took time, like "generate 50B juices (flowers)" went in a second versus a few hours. 15T farm (cakes) with L3 mgr took about an hour (didn't time it exactly) versus more time that I remember in St Pats, think 4 hours comes to mind. I will try L1 farm mgr next town 2 as mentioned on the MC sheet.

For those that want an accurate time, I did L4 banquet and coach managers to collect 8.4 Q. In 11.5 hours, I collected 9.6 Q, so the math says a little over 10 hours. I want to get some times around certain parts of the minigame so I do not have to babysit it. As Xiphos mentioned, this event will happen when I don't want to be on the computer a lot, summer. So, I will probably just do 10 towns in 21 days when it goes live which is still a lot of time.
 

CDmark

Baronet
You suffer from some crude rounding. It doesn't take 5 seconds for the banquet at 4. I just counted 19 in 62 seconds to be sure = 3.26 seconds per lap - which lines up with my calculation of 3.27 pretty closely :)

It'll come out to a bit over 10 hours of waiting on the final step. and 11 hours to get there in a somewhat optimized order:


Step Description​
New Capital​
Cumulative Time (s)​
Step Time (s)​
Start​
Add To​
#​
0.00E+00​
0​
0.0​
Spice-10​
Spice​
9​
1.90E+02​
45​
45.1​
Carriage-5​
Carriage​
4​
6.24E+02​
52​
7.4​
Banquet-5​
Banquet​
4​
4.99E+02​
58​
5.9​
Spice-25​
Spice​
15​
1.05E+03​
71​
12.4​
Spice-50​
Spice​
25​
1.36E+04​
87​
16.1​
Carriage-15​
Carriage​
10​
4.44E+03​
91​
3.6​
Banquet-15​
Banquet​
10​
3.55E+03​
93​
2.6​
Carriage-25​
Carriage​
10​
1.80E+04​
94​
1.1​
Banquet-25​
Banquet​
10​
1.44E+04​
95​
0.9​
Juice-10​
Juice​
10​
2.35E+05​
107​
12.2​
Juice-25​
Juice​
15​
1.21E+06​
139​
31.7​
Juice-50​
Juice​
25​
1.57E+07​
219​
80.1​
Carriage-50​
Carriage​
25​
7.61E+05​
223​
3.9​
Banquet-50​
Banquet​
25​
6.09E+05​
226​
2.8​
Spice-100​
Spice​
50​
1.74E+06​
226​
0.2​
Farm-10​
Farm​
10​
3.48E+07​
231​
4.9​
Farm-25​
Farm​
15​
1.80E+08​
267​
36.2​
Carriage-100​
Carriage​
50​
8.50E+08​
403​
135.5​
Banquet-100​
Banquet​
50​
6.80E+08​
499​
96.6​
Juice-100​
Juice​
50​
2.01E+09​
543​
43.4​
Farm-50​
Farm​
25​
2.32E+09​
560​
17.1​
Bakery-1​
Bakery​
1​
2.73E+09​
570​
10.4​
Bakery-2​
Bakery​
1​
3.00E+09​
579​
9.2​
Bakery-10​
Bakery​
8​
3.77E+10​
676​
97.1​
Carriage Levels​
Carriage​
32​
7.37E+10​
860​
183.5​
Banquet Levels​
Banquet​
20​
1.05E+10​
883​
23.2​
Carriage-150​
Carriage​
18​
8.48E+11​
2479​
1596.2​
Banquet Levels​
Banquet​
20​
1.71E+11​
2796​
316.7​
Banquet-150​
Banquet​
10​
5.55E+11​
3676​
880.4​
Bakery-25​
Bakery​
15​
2.25E+11​
3682​
5.2​
Bakery-50​
Bakery​
25​
2.91E+12​
3749​
67.2​
Carriage Levels​
Carriage​
30​
6.01E+13​
5292​
1543.6​
Banquet Levels​
Banquet​
10​
2.25E+12​
5344​
51.9​
Carriage Levels​
Carriage​
13​
3.15E+14​
12163​
6819.0​
Banquet Levels​
Banquet​
18​
3.39E+13​
12899​
735.8​
Carriage-200​
Carriage​
7​
6.24E+14​
25408​
12508.8​
Banquet Levels​
Banquet​
8​
7.60E+13​
26890​
1481.6​
Banquet Levels​
Banquet​
10​
3.44E+14​
33305​
6415.5​
Banquet-200​
Banquet​
4​
3.42E+14​
39363​
6057.4​
Optimized 4-4​
21.0487583714214​
8.40E+15​
75776​
36413.0​
Ah, I was writing at the same time. For those that have a spreadsheet phobia, here is the translation

There will be some time to get carriage and banquet to L150, hurdle 1 (times to be defined)
There will be more time to get carriage and banquet to L200, hurdle 2 (times to be defined but I think you want to do coach first)
Then it will take 10 hours to collect 8.4Q to move on
NOTE L4 managers needed
 

xivarmy

Overlord
Perk Creator
Ah, I was writing at the same time. For those that have a spreadsheet phobia, here is the translation

There will be some time to get carriage and banquet to L150, hurdle 1 (times to be defined)
There will be more time to get carriage and banquet to L200, hurdle 2 (times to be defined but I think you want to do coach first)
Then it will take 10 hours to collect 8.4Q to move on
NOTE L4 managers needed
L150 hurdle is only like 30 minutes. You should plan to still be paying attention to get it there in your "first sitting". Both at 150 and Bakery at 50 so the carriage isn't starved is at about the 1.1 hour mark.

L200 hurdle is the big one. The more you split it up into substeps the more time you save (about 2-3 hours in total vs just going carriage 200 in one lump and then banquet 200 in another lump).

The biggest impact is getting ~18 cheap carriage levels in before you go afk. This avoids your banquet wasting capacity while you're off doing who knows what (by default at level 4 managers, banquet is ~12% faster in production rate than carriage, so 150 * 1.12 = 168).

Slightly better still is then adding in say 10 festival levels and 12 more carriage levels to go with it, will cut off another 7% or so of the stall. This adds on about half an hour putting you at a bit over 1.5 hours after your start.

Time permitting, repeat with a little on each in about that ratio until you're close enough to carriage 200 to just go for it and then work on finishing the banquet to 200.
 
Last edited:

MooingCat

Viceroy
Spoiler Poster
You suffer from some crude rounding. It doesn't take 5 seconds for the banquet at 4. I just counted 19 in 62 seconds to be sure = 3.26 seconds per lap - which lines up with my calculation of 3.27 pretty closely :)

It'll come out to a bit over 10 hours of waiting on the final step. and 11 hours to get there in a somewhat optimized order:
What managers are you using? And exactly how are you upgrading banquet/carriage from 100 > 150 and 150 > 200? Inputting that strategy in my simulator with 4,4,2,2,2,2,2 managers I get 25 hours if you upgrade carriage 100 > 150, banquet 100 > 150, carriage 150 > 200, banquet 150 > 200, down to around 23h40m with a bit of optimizing in the 100 > 200 leveling.

Python simulator:
Code:
from simulator import simulation
dt = 1
levelsAhead = 1
# xiv strat
managers = [4,4,2,2,2,2,2]
town = 1

'''
f = banquet
s = carriage
h = spice
fl = juice
c = farm
d = bakery
fi = butchery
'''

order = ["h10","s5","f5","h50","s15","f15","s25","f25","fl50","s50","f50","h100","c25","s100","f100","fl100","c50","d10","f135","s150","f150","d50","s180","f189","s200","f200"]
simulation(managers,town,order,dt,levelsAhead)
Code:
import random
import math
from matplotlib import pyplot as plt
import numpy as np
from copy import copy
import re
import datetime
def getStep(s):
    prefixes = ["f","s","h","fl","c","d","fi"]
    bs2,ls2 = "x",0
    try:
        match = re.match(r"([a-z]+)([0-9]+)([a-z]+)([0-9]+)", s, re.I)
        bs, ls, bs2, ls2 = match.groups()
    except:
        #print("except")
        match = re.match(r"([a-z]+)([0-9]+)", s, re.I)
        bs, ls = match.groups()
        
    #print(bs,ls,bs2,ls2)
    b = prefixes.index(bs)
    l = int(ls)
    b2 = prefixes.index(bs2) if bs2 != "x" else "x"
    l2 = int(ls2)
    return b, l, b2, l2

def getTask(s):
    if s == 0:
        return -1,-1,-1
    prefixes = ["f","s","h","fl","c","d","fi"]
    codes = ["co","tr","ge"]
    match = re.match(r"([a-z]+)([0-9]+)", s, re.I)
    string, num = match.groups()
        
    t = 0
    b = -1
    if string[:2] in codes:
        if string[2:3] in prefixes:
            if string[2:4] in prefixes:
                b = prefixes.index(string[2:4])
            else:
                b = prefixes.index(string[2:3])
        t = string[:2]
    elif "m" in string:
        t = "m"
        if len(string) == 2:
            b = prefixes.index(string[:1])
        else:
            b = prefixes.index(string[:2])
    elif string in prefixes:
        t = "le"
        b = prefixes.index(string)
    elif string[:1] == "u":
        t = "up"
    n = int(num)
    return t, b, n
def simulation(managers,town,order,dt,levelsAhead):
    
    mcosts = [[10,20,40,120,360],[10,20,40,120,360],[10,20,30,60,120],[15,30,60,120,240],[20,40,80,160,320],[25,50,100,200,400],[30,60,120,240,480]]
    costs = []
    for i in range(len(managers)):
        costs.append(sum(mcosts[i][:managers[i]]))
    
    t1 = [0,"h25","co50000",0,"fl1","fm3","u50","co1000000","c1","fl50","cm1","tr250000000","h100","flm2","u50","ge1000000000","d1","dm2","c50","u50","hm3","cm3","fl100","co50000000000","sm4","u100","tr1000000000000","fim2","u150","c100","ge4000000000000","gefl10000000000","d50","u200","h200","co16000000000000000","u250","fi75","f999","f999","f999"]
    t2 = ["f10","sm1","sm3","geh60000","fl1","u50","flm2","tr15000000","c1","c25","fm3","u100","co99000000000","h100","dm2","u100","ged5000000000","cm3","d25","fl100","co16000000000","fi1","flm3","u150","h200","tr32000000000","fim2","c100","gec15000000000000","fi50","u150","gefl50000000000","fl200","s300","sm4","co18000000000000000","geh200000000000","u200","f999","f999","f999"]
    t3 = ["hm1","s10","geh50000","flm1","tr3000000","u50","fl50","fm2","c1","flm2","u50","co1000000000","sm3","c25","cm2","gec25000000000","h100","u100","d1","dm3","d25","gefl3000000000","fm4","u100","fi1","tr30000000000000","fl150","fim2","d50","u150","gefi10000000000000000","c100","fi50","h200","u200","co12000000000000000","d100","ged10000000000000000","f999","f999","f999"]
    tasks = [t1,t2,t3]
    
    # Milestones and factors for fest/ship (m) and production (p) buildings
    m1 = [5,15,25,50,100,150,200,250,300,350]
    m2 = [2,4,8,16,32,64,4,4,4,4]
    p1 = [10,25,50,100,200,300]
    p2 = [2,4,8,16,32,2]
    # Base building values - all other values are calculated from these
    prods = [250,350,11,9000 ,1_700_000,2_700_000_000,8_400_000_000_000]
    price = [100,125,14,14730,2_180_000,2_730_000_000,8_360_000_000_000]
    times = [10,15,3,10,60,45,180]
    # Upgrade cost scaling factor
    f = [1.15,1.15,1.1,1.1,1.1,1.1,1.1]
    
    # Manager boosts
    pBoosts = [[1.2,1.2,1.8,1.8,3.95],[1.2,1.2,1.5,1.5,3.0],[1.15,1.15,1.5,1.5,3.0],[1.15,1.15,1.9,1.9,3.7],[1.15,1.15,1.5,1.5,2.5],[1.05,1.05,2.0,2.0,4.0],[1.05,1.05,1.5,1.5,2.5]]
    tBoosts = [[1,1.25,1.25,2.75,2.75],[1,1.35,1.35,3.5,3.5],[1,1.5,1.5,3.0,3.0],[1,1.2,1.2,2.0,2.0],[1,1.3,1.3,2.3,2.3],[1,1.15,1.15,2.0,2.0],[1,1.25,1.25,2.25,2.25]]
    # Update times based on managers
    for i in range(7):
        times[i] /= tBoosts[i][managers[i]-1]
    # Divide shipyard time in 2 for the two parts of the shipyard
    times[1] /= 2
    shipPos = True # Use a flag to keep track of where ship is. True = east, False = west
    # Set up initial values - these are kept track of and updated during the simulation
    cTimes = [x for x in times] # Timers for all the buildings
    cProd = [240,320,12,0,0,0,0] # Production amounts (unboosted)
    cPrice = [x for x in price] # Upgrade cost for next level
    cLevel = [1,1,1,0,0,0,0] # Current level of buildings
    time = 0 # Total time (in sec) of the simulation
    ltime = 0 # Time when last step completed, used in calculating time for step
    east = 0 # Shamrocks stockpiled on production side
    west = 0 # Shamrocks stockpiled on collection side
    ship = 0 # Shamrocks in ship
    shamrocks = 0 # Collected shamrocks
    # Names used for nice printing :) 
    names = ["Festival","Shipyard","Hats","Flowers","Cakes","Drinks","Fireworks"]    
    # Set up current tasks
    tIndex = 0 # Number of latest task (1-indexed)
    rTasks = copy(tasks[town-1]) # Make a new list of all tasks of chosen town
    totalTasks = 0 # Number of tasks completed
    ta = [] # Task type
    bu = [] # Building
    nu = [] # Number
    iu = [] # Task number
    tu = [] # Task timer
    while len(ta) < 3: # Add 3 tasks
        tIndex += 1 # Increment task number
        t = getTask(rTasks[0]) # Parse next task
        del rTasks[0] # Remove the task from the list
        if t[0] == -1: # This indicates the task is auto-completed
            totalTasks += 1
            print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
            continue # Move on to next task without adding this to active tasks
        elif t[0] == "m": # If the task is a manager task, check if it is completed
            if managers[t[1]] >= t[2]:
                totalTasks += 1
                print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                continue # Move on to next task without adding this to active tasks
        # Add task to current list of tasks
        # This is quite a messy way to do it, but I started doing it this way so I just kept on adding lists instead of being smart about it :P
        ta.append(t[0])
        bu.append(t[1])
        nu.append(t[2])
        iu.append(tIndex)
        tu.append(0)
    # Keep track of if a task slot has been completed
    complete = [False,False,False]
    # The start of the simulation! Run through each step of the upgrade order
    for step in order:
        task = False
        wait = False
        # Check if the step is waiting for a task to be active
        if str(step).isnumeric(): # Wait for task 
            task = True
            ltime = time
            taskTarget = step
        # Check if the step is to wait for a given time
        elif step[0].isnumeric(): # Wait a given time
            amount, typ = re.match(r"([0-9]+)([a-z]+)", step, re.I).groups()
            amount = int(amount)
            wait = True
            ltime = time
            wtime = amount if typ == "s" else amount*60 if typ == "m" else amount*3600
        # Upgrade building to given level
        else:
            ltime = time
            b1, l1, b2, l2 = getStep(step)
            b, l = b1, l1
        while True:
            # Check if task you need to wait for is active
            if task:
                if taskTarget <= max(iu):
                    break
            # Check if wait time is over
            elif wait:
                if time-ltime >= wtime:
                    break
            # Target level reached?
            elif cLevel[b1] >= l1:
                if b2 != "x": # If leveling 2 buildings at the same time, check if 2nd building has also reached target
                    if cLevel[b2] >= l2:
                        break
                else:
                    break
                
            # Check if tasks are completed
            for j in range(len(complete)):
                # If task has been completed, remove it from list and prin completed message
                if complete[2-j]:
                    totalTasks += 1
                    ttime = str(datetime.timedelta(seconds=time-tu[2-j]))
                    print(" - Completed",totalTasks,"/ 38:","task",iu[2-j],"-",tasks[town-1][iu[2-j]-1],"- Time:",ttime)
                    #if iu[2-j] == 20:
                    #print(cLevel)
                    del ta[2-j]
                    del bu[2-j]
                    del nu[2-j]
                    del iu[2-j]
                    del tu[2-j]
                    complete[2-j] = False
                    
            # Update current tasks - if a task has been removed (completed) this will add until 3 tasks are in the active tasks list (or there are no more tasks)
            while (len(ta) < 3):
                t = getTask(rTasks[0])
                tIndex += 1
                del rTasks[0]
                
                # Check if task is already completed
                if t[0] == -1:
                    totalTasks += 1
                    print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                    continue
                if t[0] == "m":
                    if managers[t[1]] >= t[2] and cLevel[t[1]] > 0:
                        totalTasks += 1
                        print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                        continue
                if t[0] == "le":
                    if cLevel[t[1]] >= t[2]:
                        totalTasks += 1
                        print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                        continue
                # If not completed, add to list
            
                ta.append(t[0])
                bu.append(t[1])
                nu.append(t[2])
                iu.append(tIndex)
                tu.append(time)
                #if(tIndex == 31):
                #    print(cLevel)
                    
                    
            # Step ahead one time step
            time += dt
            
            # Updated timers for buildings. This is done by subtracting time step
            cTimes = [x - dt for x in cTimes]
            # If timers are below 0, collection is ready. Add all ready collections to a list
            collectable = [x for x in cTimes if x < 0]
            # If any buildings are ready to collect
            if len(collectable) > 0:
                for _ in range(len(collectable)):
                    # Get the lowest value - handle the building that was first completed first
                    val = min(collectable)
                    del collectable[collectable.index(val)]
                    i = cTimes.index(val) # Index of building
                    if cTimes[i] < 0: # Unnecesary check that's still in place that I would rather write this long description for than remove, which would probably be quicker :P
                        cTimes[i] += times[i] # Add production time to the building. This ensures minimum drift if time step is too big. I saw practically no difference between 1 sec and 0.1 sec, etc.
                        if i == 0: #Festival - add shamrocks to collected shamrocks
                            p = min(west,cProd[i]*pBoosts[i][managers[i]-1]) # Pick the minimum of stockpile and collection rate
                            shamrocks += p
                            west -= p
                            # If a collection task is active, update that
                            for j in range(len(ta)):
                                if ta[j] == "co" and bu[j] < 0:
                                    nu[j] -= p
                                    if nu[j] < 0: # Task completed?
                                        complete[j] = True
                        elif i == 1: #Shipyard
                            if shipPos: # Step 1 - collect on eastern side of the river
                                ship = min(east,cProd[i]*pBoosts[i][managers[i]-1])
                                east -= min(east,cProd[i]*pBoosts[i][managers[i]-1])
                            else: # Step 2 - drop off on western side of river
                                west += ship
                                # If transportation task is active, update that
                                for j in range(len(ta)):
                                    if ta[j] == "tr":
                                        nu[j] -= ship
                                        if nu[j] < 0:
                                            complete[j] = True
                                ship = 0
                            shipPos = not shipPos # Alternate flag when a step has been completed
                        else: #Production - add shamrocks to eastern side
                            p = cProd[i]*pBoosts[i][managers[i]-1]
                            east += p
                            # If collection task is active, update that
                            for j in range(len(ta)):
                                if ta[j] == "ge":# and bu[j] == i:
                                    if bu[j] == -1:
                                        nu[j] -= p
                                    elif bu[j] > 0 and bu[j] == i:
                                        nu[j] -= p
                                        
                                    if nu[j] < 0:
                                        complete[j] = True
                                
            # Upgrade building (if not waiting)
            while True and not wait:
                # If yo don't have enough shamrocks, or the building has reached target level, move on to next timestep
                if (cPrice[b] > shamrocks) or (cLevel[b] >= l):
                    break
                
                # Level building
                shamrocks -= cPrice[b] # Subtract cost
                cPrice[b] *= f[b] # Update price for next level
                if cLevel[b] == 0: # If this is the first level of the building, update production rate and timer
                    cProd[b] = prods[b]
                    cTimes[b] = times[b]
                    for j in range(len(ta)):
                        if ta[j] == "m" and bu[j] == b:                        
                            if managers[b] >= nu[j]:
                                complete[j] = True
                else: # If not the first level, scale production by the formula x[n] = x[n-1]*(1+1/(n-1)). (cLevel is already n-1, so that's why 1 is not subtracted here)
                    cProd[b] *= (1+(1/(cLevel[b])))
                cLevel[b] += 1
                # Check if upgrade task or building level task is completed
                for j in range(len(ta)):
                    if ta[j] == "up":
                        nu[j] -= 1
                        if nu[j] <= 0:
                            complete[j] = True
                    if ta[j] == "le" and bu[j] == b:
                        if cLevel[b] >= nu[j]:
                            #print(nu[j],cLevel[b])
                            complete[j] = True
                    
                # Check for milestone level, multiply by factor if it is
                if b < 2: # Shipyard/Festival
                    if cLevel[b] in m1:
                        cProd[b] *= m2[m1.index(cLevel[b])]
                else: # Production buildings
                    if cLevel[b] in p1:
                        cProd[b] *= p2[p1.index(cLevel[b])]
                
                # Update what the current building is (if leveling 2 at the same time)
                if b2 != "x":
                    # Pick the lowest, with b1 the priority if the same level
                    b = b1 if (cLevel[b1] < cLevel[b2]+levelsAhead) else b2
                    l = l1 if (cLevel[b1] < cLevel[b2]+levelsAhead) else l2
                    if cLevel[b1] >= l1: # If target level has been reached
                        b,l = b2, l2
                        
        # This executes when a step has been completed
        stime = str(datetime.timedelta(seconds=time-ltime)) # Time to complete this step
        ctime = str(datetime.timedelta(seconds=time)) # Total time completed so far
        if task:
            print("| Step:",stime," | Total:",ctime,"| Completed waiting for task \"",tasks[town-1][taskTarget-1],"\" to start")
        elif wait:
            print("| Step:",stime," | Total:",ctime,"| Completed waiting for",step)
        else:
            name = names[b1] if b2 == "x" else names[b1] + "/" + names[b2]
            level = l1 if b2 == "x" else str(l1) + "/" + str(l2)
            print("| Step:",stime," | Total:",ctime,"| Completed leveling",name,"to level",level)
    # After all steps are completed, collect 8.4Q. Could probably have included this in the loop above, but I didn't wanna add a bunch of conditions so just copied the relevant parts xD
    ltime = time
    # Collect 8.4Q
    while True:
        # Check if tasks are completed
        for j in range(len(complete)):
            if complete[2-j]:
                totalTasks += 1
                ttime = str(datetime.timedelta(seconds=time-tu[2-j]))
                print(" - Completed",totalTasks,"/ 38:","task",iu[2-j],"-",tasks[town-1][iu[2-j]-1],"- Time:",ttime)
                del ta[2-j]
                del bu[2-j]
                del nu[2-j]
                del iu[2-j]
                del tu[2-j]
                complete[2-j] = False
        # Update current tasks
        while len(ta) < 3:
            t = getTask(rTasks[0])
            tIndex += 1
            del rTasks[0]
            if t[0] == -1:
                totalTasks += 1
                print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                continue
            elif t[0] == "m":
                if managers[t[1]] >= t[2]:
                    totalTasks += 1
                    print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                    continue
            elif t[0] == "le":
                if cLevel[t[1]] >= t[2]:
                    totalTasks += 1
                    print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                    continue
                    
            ta.append(t[0])
            bu.append(t[1])
            nu.append(t[2])
            iu.append(tIndex)
            tu.append(time)
        # Step ahead one time step
        time += dt
        # Add completed productions
        cTimes = [x - dt for x in cTimes]
        collectable = [x for x in cTimes if x < 0]
        if len(collectable) > 0:
            for _ in range(len(collectable)):
                val = min(collectable)
                del collectable[collectable.index(val)]
                i = cTimes.index(val)
                if cTimes[i] < 0:
                    cTimes[i] += times[i]
                    if i == 0: #Festival
                        p = min(west,cProd[i]*pBoosts[i][managers[i]-1])
                        shamrocks += p
                        west -= p
                        for j in range(len(ta)):
                            if ta[j] == "co" and bu[j] < 0:
                                nu[j] -= p
                                if nu[j] < 0:
                                    complete[j] = True
                    elif i == 1: #Shipyard
                        if shipPos:
                            ship = min(east,cProd[i]*pBoosts[i][managers[i]-1])
                            east -= min(east,cProd[i]*pBoosts[i][managers[i]-1])
                        else:
                            west += ship
                            for j in range(len(ta)):
                                if ta[j] == "tr":
                                    nu[j] -= ship
                                    if nu[j] < 0:
                                        complete[j] = True
                            ship = 0
                        shipPos = not shipPos
                    else: #Production
                        p = cProd[i]*pBoosts[i][managers[i]-1]
                        east += p
                        for j in range(len(ta)):
                            if ta[j] == "ge":# and bu[j] == i:
                                if bu[j] == -1:
                                    nu[j] -= p
                                elif bu[j] > 0 and bu[j] == i:
                                    nu[j] -= p
                                if nu[j] < 0:
                                    complete[j] = True
        if shamrocks > 8.4*(10**15):
            break
    stime = str(datetime.timedelta(seconds=time-ltime))
    ctime = str(datetime.timedelta(seconds=time))
    print("\n==Completed collecting 8.4Q Shamrocks - Step:",stime,"| Total:",ctime)
    print("==Manager Cost:",sum(costs),costs)
    # print(ta)
    # print(bu)
    # print(nu)
    # print(iu)
    # print(cLevel)
 

MooingCat

Viceroy
Spoiler Poster
For reference, all the base production / time / cost / cost growth values have changed from St. Pat. New ones are:

BanquetCarriageSpiceJuiceFarmBakeryButchery
Production Time10 9 sec15 sec (10+5)3 sec10 sec60 sec (!?)45 sec180 sec
Starting Production250350119K1.7M2.7B8.4T
Starting Cost1001251414.7K2.18M2.73B8.36T
Cost Growth Factor1.151.151.11.11.11.11.1

Milestones have also been updated:

Banquet / Carriage
Milestone Level5152550100150every 50 after
Multiplication Factor2481632644

Production Buildings
Milestone Level102550100200every 100 after
Multiplication Factor248163264
 
Last edited:

xivarmy

Overlord
Perk Creator
What managers are you using? And exactly how are you upgrading banquet/carriage from 100 > 150 and 150 > 200? Inputting that strategy in my simulator with 4,4,2,2,2,2,2 managers I get 25 hours if you upgrade carriage 100 > 150, banquet 100 > 150, carriage 150 > 200, banquet 150 > 200, down to around 23h40m with a bit of optimizing in the 100 > 200 leveling.

Python simulator:
Code:
from simulator import simulation
dt = 1
levelsAhead = 1
# xiv strat
managers = [4,4,2,2,2,2,2]
town = 1

'''
f = banquet
s = carriage
h = spice
fl = juice
c = farm
d = bakery
fi = butchery
'''

order = ["h10","s5","f5","h50","s15","f15","s25","f25","fl50","s50","f50","h100","c25","s100","f100","fl100","c50","d10","f135","s150","f150","d50","s180","f189","s200","f200"]
simulation(managers,town,order,dt,levelsAhead)
Code:
import random
import math
from matplotlib import pyplot as plt
import numpy as np
from copy import copy
import re
import datetime
def getStep(s):
    prefixes = ["f","s","h","fl","c","d","fi"]
    bs2,ls2 = "x",0
    try:
        match = re.match(r"([a-z]+)([0-9]+)([a-z]+)([0-9]+)", s, re.I)
        bs, ls, bs2, ls2 = match.groups()
    except:
        #print("except")
        match = re.match(r"([a-z]+)([0-9]+)", s, re.I)
        bs, ls = match.groups()
      
    #print(bs,ls,bs2,ls2)
    b = prefixes.index(bs)
    l = int(ls)
    b2 = prefixes.index(bs2) if bs2 != "x" else "x"
    l2 = int(ls2)
    return b, l, b2, l2

def getTask(s):
    if s == 0:
        return -1,-1,-1
    prefixes = ["f","s","h","fl","c","d","fi"]
    codes = ["co","tr","ge"]
    match = re.match(r"([a-z]+)([0-9]+)", s, re.I)
    string, num = match.groups()
      
    t = 0
    b = -1
    if string[:2] in codes:
        if string[2:3] in prefixes:
            if string[2:4] in prefixes:
                b = prefixes.index(string[2:4])
            else:
                b = prefixes.index(string[2:3])
        t = string[:2]
    elif "m" in string:
        t = "m"
        if len(string) == 2:
            b = prefixes.index(string[:1])
        else:
            b = prefixes.index(string[:2])
    elif string in prefixes:
        t = "le"
        b = prefixes.index(string)
    elif string[:1] == "u":
        t = "up"
    n = int(num)
    return t, b, n
def simulation(managers,town,order,dt,levelsAhead):
  
    mcosts = [[10,20,40,120,360],[10,20,40,120,360],[10,20,30,60,120],[15,30,60,120,240],[20,40,80,160,320],[25,50,100,200,400],[30,60,120,240,480]]
    costs = []
    for i in range(len(managers)):
        costs.append(sum(mcosts[i][:managers[i]]))
  
    t1 = [0,"h25","co50000",0,"fl1","fm3","u50","co1000000","c1","fl50","cm1","tr250000000","h100","flm2","u50","ge1000000000","d1","dm2","c50","u50","hm3","cm3","fl100","co50000000000","sm4","u100","tr1000000000000","fim2","u150","c100","ge4000000000000","gefl10000000000","d50","u200","h200","co16000000000000000","u250","fi75","f999","f999","f999"]
    t2 = ["f10","sm1","sm3","geh60000","fl1","u50","flm2","tr15000000","c1","c25","fm3","u100","co99000000000","h100","dm2","u100","ged5000000000","cm3","d25","fl100","co16000000000","fi1","flm3","u150","h200","tr32000000000","fim2","c100","gec15000000000000","fi50","u150","gefl50000000000","fl200","s300","sm4","co18000000000000000","geh200000000000","u200","f999","f999","f999"]
    t3 = ["hm1","s10","geh50000","flm1","tr3000000","u50","fl50","fm2","c1","flm2","u50","co1000000000","sm3","c25","cm2","gec25000000000","h100","u100","d1","dm3","d25","gefl3000000000","fm4","u100","fi1","tr30000000000000","fl150","fim2","d50","u150","gefi10000000000000000","c100","fi50","h200","u200","co12000000000000000","d100","ged10000000000000000","f999","f999","f999"]
    tasks = [t1,t2,t3]
  
    # Milestones and factors for fest/ship (m) and production (p) buildings
    m1 = [5,15,25,50,100,150,200,250,300,350]
    m2 = [2,4,8,16,32,64,4,4,4,4]
    p1 = [10,25,50,100,200,300]
    p2 = [2,4,8,16,32,2]
    # Base building values - all other values are calculated from these
    prods = [250,350,11,9000 ,1_700_000,2_700_000_000,8_400_000_000_000]
    price = [100,125,14,14730,2_180_000,2_730_000_000,8_360_000_000_000]
    times = [10,15,3,10,60,45,180]
    # Upgrade cost scaling factor
    f = [1.15,1.15,1.1,1.1,1.1,1.1,1.1]
  
    # Manager boosts
    pBoosts = [[1.2,1.2,1.8,1.8,3.95],[1.2,1.2,1.5,1.5,3.0],[1.15,1.15,1.5,1.5,3.0],[1.15,1.15,1.9,1.9,3.7],[1.15,1.15,1.5,1.5,2.5],[1.05,1.05,2.0,2.0,4.0],[1.05,1.05,1.5,1.5,2.5]]
    tBoosts = [[1,1.25,1.25,2.75,2.75],[1,1.35,1.35,3.5,3.5],[1,1.5,1.5,3.0,3.0],[1,1.2,1.2,2.0,2.0],[1,1.3,1.3,2.3,2.3],[1,1.15,1.15,2.0,2.0],[1,1.25,1.25,2.25,2.25]]
    # Update times based on managers
    for i in range(7):
        times[i] /= tBoosts[i][managers[i]-1]
    # Divide shipyard time in 2 for the two parts of the shipyard
    times[1] /= 2
    shipPos = True # Use a flag to keep track of where ship is. True = east, False = west
    # Set up initial values - these are kept track of and updated during the simulation
    cTimes = [x for x in times] # Timers for all the buildings
    cProd = [240,320,12,0,0,0,0] # Production amounts (unboosted)
    cPrice = [x for x in price] # Upgrade cost for next level
    cLevel = [1,1,1,0,0,0,0] # Current level of buildings
    time = 0 # Total time (in sec) of the simulation
    ltime = 0 # Time when last step completed, used in calculating time for step
    east = 0 # Shamrocks stockpiled on production side
    west = 0 # Shamrocks stockpiled on collection side
    ship = 0 # Shamrocks in ship
    shamrocks = 0 # Collected shamrocks
    # Names used for nice printing :)
    names = ["Festival","Shipyard","Hats","Flowers","Cakes","Drinks","Fireworks"]  
    # Set up current tasks
    tIndex = 0 # Number of latest task (1-indexed)
    rTasks = copy(tasks[town-1]) # Make a new list of all tasks of chosen town
    totalTasks = 0 # Number of tasks completed
    ta = [] # Task type
    bu = [] # Building
    nu = [] # Number
    iu = [] # Task number
    tu = [] # Task timer
    while len(ta) < 3: # Add 3 tasks
        tIndex += 1 # Increment task number
        t = getTask(rTasks[0]) # Parse next task
        del rTasks[0] # Remove the task from the list
        if t[0] == -1: # This indicates the task is auto-completed
            totalTasks += 1
            print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
            continue # Move on to next task without adding this to active tasks
        elif t[0] == "m": # If the task is a manager task, check if it is completed
            if managers[t[1]] >= t[2]:
                totalTasks += 1
                print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                continue # Move on to next task without adding this to active tasks
        # Add task to current list of tasks
        # This is quite a messy way to do it, but I started doing it this way so I just kept on adding lists instead of being smart about it :P
        ta.append(t[0])
        bu.append(t[1])
        nu.append(t[2])
        iu.append(tIndex)
        tu.append(0)
    # Keep track of if a task slot has been completed
    complete = [False,False,False]
    # The start of the simulation! Run through each step of the upgrade order
    for step in order:
        task = False
        wait = False
        # Check if the step is waiting for a task to be active
        if str(step).isnumeric(): # Wait for task
            task = True
            ltime = time
            taskTarget = step
        # Check if the step is to wait for a given time
        elif step[0].isnumeric(): # Wait a given time
            amount, typ = re.match(r"([0-9]+)([a-z]+)", step, re.I).groups()
            amount = int(amount)
            wait = True
            ltime = time
            wtime = amount if typ == "s" else amount*60 if typ == "m" else amount*3600
        # Upgrade building to given level
        else:
            ltime = time
            b1, l1, b2, l2 = getStep(step)
            b, l = b1, l1
        while True:
            # Check if task you need to wait for is active
            if task:
                if taskTarget <= max(iu):
                    break
            # Check if wait time is over
            elif wait:
                if time-ltime >= wtime:
                    break
            # Target level reached?
            elif cLevel[b1] >= l1:
                if b2 != "x": # If leveling 2 buildings at the same time, check if 2nd building has also reached target
                    if cLevel[b2] >= l2:
                        break
                else:
                    break
              
            # Check if tasks are completed
            for j in range(len(complete)):
                # If task has been completed, remove it from list and prin completed message
                if complete[2-j]:
                    totalTasks += 1
                    ttime = str(datetime.timedelta(seconds=time-tu[2-j]))
                    print(" - Completed",totalTasks,"/ 38:","task",iu[2-j],"-",tasks[town-1][iu[2-j]-1],"- Time:",ttime)
                    #if iu[2-j] == 20:
                    #print(cLevel)
                    del ta[2-j]
                    del bu[2-j]
                    del nu[2-j]
                    del iu[2-j]
                    del tu[2-j]
                    complete[2-j] = False
                  
            # Update current tasks - if a task has been removed (completed) this will add until 3 tasks are in the active tasks list (or there are no more tasks)
            while (len(ta) < 3):
                t = getTask(rTasks[0])
                tIndex += 1
                del rTasks[0]
              
                # Check if task is already completed
                if t[0] == -1:
                    totalTasks += 1
                    print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                    continue
                if t[0] == "m":
                    if managers[t[1]] >= t[2] and cLevel[t[1]] > 0:
                        totalTasks += 1
                        print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                        continue
                if t[0] == "le":
                    if cLevel[t[1]] >= t[2]:
                        totalTasks += 1
                        print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                        continue
                # If not completed, add to list
          
                ta.append(t[0])
                bu.append(t[1])
                nu.append(t[2])
                iu.append(tIndex)
                tu.append(time)
                #if(tIndex == 31):
                #    print(cLevel)
                  
                  
            # Step ahead one time step
            time += dt
          
            # Updated timers for buildings. This is done by subtracting time step
            cTimes = [x - dt for x in cTimes]
            # If timers are below 0, collection is ready. Add all ready collections to a list
            collectable = [x for x in cTimes if x < 0]
            # If any buildings are ready to collect
            if len(collectable) > 0:
                for _ in range(len(collectable)):
                    # Get the lowest value - handle the building that was first completed first
                    val = min(collectable)
                    del collectable[collectable.index(val)]
                    i = cTimes.index(val) # Index of building
                    if cTimes[i] < 0: # Unnecesary check that's still in place that I would rather write this long description for than remove, which would probably be quicker :P
                        cTimes[i] += times[i] # Add production time to the building. This ensures minimum drift if time step is too big. I saw practically no difference between 1 sec and 0.1 sec, etc.
                        if i == 0: #Festival - add shamrocks to collected shamrocks
                            p = min(west,cProd[i]*pBoosts[i][managers[i]-1]) # Pick the minimum of stockpile and collection rate
                            shamrocks += p
                            west -= p
                            # If a collection task is active, update that
                            for j in range(len(ta)):
                                if ta[j] == "co" and bu[j] < 0:
                                    nu[j] -= p
                                    if nu[j] < 0: # Task completed?
                                        complete[j] = True
                        elif i == 1: #Shipyard
                            if shipPos: # Step 1 - collect on eastern side of the river
                                ship = min(east,cProd[i]*pBoosts[i][managers[i]-1])
                                east -= min(east,cProd[i]*pBoosts[i][managers[i]-1])
                            else: # Step 2 - drop off on western side of river
                                west += ship
                                # If transportation task is active, update that
                                for j in range(len(ta)):
                                    if ta[j] == "tr":
                                        nu[j] -= ship
                                        if nu[j] < 0:
                                            complete[j] = True
                                ship = 0
                            shipPos = not shipPos # Alternate flag when a step has been completed
                        else: #Production - add shamrocks to eastern side
                            p = cProd[i]*pBoosts[i][managers[i]-1]
                            east += p
                            # If collection task is active, update that
                            for j in range(len(ta)):
                                if ta[j] == "ge":# and bu[j] == i:
                                    if bu[j] == -1:
                                        nu[j] -= p
                                    elif bu[j] > 0 and bu[j] == i:
                                        nu[j] -= p
                                      
                                    if nu[j] < 0:
                                        complete[j] = True
                              
            # Upgrade building (if not waiting)
            while True and not wait:
                # If yo don't have enough shamrocks, or the building has reached target level, move on to next timestep
                if (cPrice[b] > shamrocks) or (cLevel[b] >= l):
                    break
              
                # Level building
                shamrocks -= cPrice[b] # Subtract cost
                cPrice[b] *= f[b] # Update price for next level
                if cLevel[b] == 0: # If this is the first level of the building, update production rate and timer
                    cProd[b] = prods[b]
                    cTimes[b] = times[b]
                    for j in range(len(ta)):
                        if ta[j] == "m" and bu[j] == b:                      
                            if managers[b] >= nu[j]:
                                complete[j] = True
                else: # If not the first level, scale production by the formula x[n] = x[n-1]*(1+1/(n-1)). (cLevel is already n-1, so that's why 1 is not subtracted here)
                    cProd[b] *= (1+(1/(cLevel[b])))
                cLevel[b] += 1
                # Check if upgrade task or building level task is completed
                for j in range(len(ta)):
                    if ta[j] == "up":
                        nu[j] -= 1
                        if nu[j] <= 0:
                            complete[j] = True
                    if ta[j] == "le" and bu[j] == b:
                        if cLevel[b] >= nu[j]:
                            #print(nu[j],cLevel[b])
                            complete[j] = True
                  
                # Check for milestone level, multiply by factor if it is
                if b < 2: # Shipyard/Festival
                    if cLevel[b] in m1:
                        cProd[b] *= m2[m1.index(cLevel[b])]
                else: # Production buildings
                    if cLevel[b] in p1:
                        cProd[b] *= p2[p1.index(cLevel[b])]
              
                # Update what the current building is (if leveling 2 at the same time)
                if b2 != "x":
                    # Pick the lowest, with b1 the priority if the same level
                    b = b1 if (cLevel[b1] < cLevel[b2]+levelsAhead) else b2
                    l = l1 if (cLevel[b1] < cLevel[b2]+levelsAhead) else l2
                    if cLevel[b1] >= l1: # If target level has been reached
                        b,l = b2, l2
                      
        # This executes when a step has been completed
        stime = str(datetime.timedelta(seconds=time-ltime)) # Time to complete this step
        ctime = str(datetime.timedelta(seconds=time)) # Total time completed so far
        if task:
            print("| Step:",stime," | Total:",ctime,"| Completed waiting for task \"",tasks[town-1][taskTarget-1],"\" to start")
        elif wait:
            print("| Step:",stime," | Total:",ctime,"| Completed waiting for",step)
        else:
            name = names[b1] if b2 == "x" else names[b1] + "/" + names[b2]
            level = l1 if b2 == "x" else str(l1) + "/" + str(l2)
            print("| Step:",stime," | Total:",ctime,"| Completed leveling",name,"to level",level)
    # After all steps are completed, collect 8.4Q. Could probably have included this in the loop above, but I didn't wanna add a bunch of conditions so just copied the relevant parts xD
    ltime = time
    # Collect 8.4Q
    while True:
        # Check if tasks are completed
        for j in range(len(complete)):
            if complete[2-j]:
                totalTasks += 1
                ttime = str(datetime.timedelta(seconds=time-tu[2-j]))
                print(" - Completed",totalTasks,"/ 38:","task",iu[2-j],"-",tasks[town-1][iu[2-j]-1],"- Time:",ttime)
                del ta[2-j]
                del bu[2-j]
                del nu[2-j]
                del iu[2-j]
                del tu[2-j]
                complete[2-j] = False
        # Update current tasks
        while len(ta) < 3:
            t = getTask(rTasks[0])
            tIndex += 1
            del rTasks[0]
            if t[0] == -1:
                totalTasks += 1
                print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                continue
            elif t[0] == "m":
                if managers[t[1]] >= t[2]:
                    totalTasks += 1
                    print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                    continue
            elif t[0] == "le":
                if cLevel[t[1]] >= t[2]:
                    totalTasks += 1
                    print(" - Completed",totalTasks,"/ 38:","task",tIndex,"-",tasks[town-1][tIndex-1],"- Time: 0:00:00")
                    continue
                  
            ta.append(t[0])
            bu.append(t[1])
            nu.append(t[2])
            iu.append(tIndex)
            tu.append(time)
        # Step ahead one time step
        time += dt
        # Add completed productions
        cTimes = [x - dt for x in cTimes]
        collectable = [x for x in cTimes if x < 0]
        if len(collectable) > 0:
            for _ in range(len(collectable)):
                val = min(collectable)
                del collectable[collectable.index(val)]
                i = cTimes.index(val)
                if cTimes[i] < 0:
                    cTimes[i] += times[i]
                    if i == 0: #Festival
                        p = min(west,cProd[i]*pBoosts[i][managers[i]-1])
                        shamrocks += p
                        west -= p
                        for j in range(len(ta)):
                            if ta[j] == "co" and bu[j] < 0:
                                nu[j] -= p
                                if nu[j] < 0:
                                    complete[j] = True
                    elif i == 1: #Shipyard
                        if shipPos:
                            ship = min(east,cProd[i]*pBoosts[i][managers[i]-1])
                            east -= min(east,cProd[i]*pBoosts[i][managers[i]-1])
                        else:
                            west += ship
                            for j in range(len(ta)):
                                if ta[j] == "tr":
                                    nu[j] -= ship
                                    if nu[j] < 0:
                                        complete[j] = True
                            ship = 0
                        shipPos = not shipPos
                    else: #Production
                        p = cProd[i]*pBoosts[i][managers[i]-1]
                        east += p
                        for j in range(len(ta)):
                            if ta[j] == "ge":# and bu[j] == i:
                                if bu[j] == -1:
                                    nu[j] -= p
                                elif bu[j] > 0 and bu[j] == i:
                                    nu[j] -= p
                                if nu[j] < 0:
                                    complete[j] = True
        if shamrocks > 8.4*(10**15):
            break
    stime = str(datetime.timedelta(seconds=time-ltime))
    ctime = str(datetime.timedelta(seconds=time))
    print("\n==Completed collecting 8.4Q Shamrocks - Step:",stime,"| Total:",ctime)
    print("==Manager Cost:",sum(costs),costs)
    # print(ta)
    # print(bu)
    # print(nu)
    # print(iu)
    # print(cLevel)
4,4,1,2,2,1,1? managers (last 1 doesn't matter since I don't use butcher for anything)

In between steps are done in lumps at the breakpoints mentioned:

Carriage 100->132; Banquet 100->120; Carriage 132->150; Banquet 120->140->150
Carriage 150->180; Banquet 150->160; Carriage 180->193; Banquet 160->178; Carriage 193->200; Banquet 178->186->196->200

I may be off by a few minutes here and there because I treat all sources as continuous producers rather than discrete. But it should mostly cancel out over the duration. I'll compare your baseline data to mine to see if the difference is somewhere in there.
 

MooingCat

Viceroy
Spoiler Poster
I have Banquet at 9 second baseline instead of your 10 second (pretty sure i've timed it multiple times)
You are indeed correct! All the values are available in the game metadata, I copied over the wrong value for Banquet :) I'll double check the others I posted above as well, but believe they should be correct.

With 9 sec I get it down to 21h53m for your strat :)
 

Sinitar

Regent
You suffer from some crude rounding. It doesn't take 5 seconds for the banquet at 4. I just counted 19 in 62 seconds to be sure = 3.26 seconds per lap - which lines up with my calculation of 3.27 pretty closely :)
until I tested the same thing, was wrong my aproximation; my mistake
But a screenshot is a better dimostration, unless you have some other ideas to take less time to reach 8,4Q
https://prnt.sc/ft7rNrjzJZbT 5,92Q : 8h = 0,74Q/h so requires around 11h and 21 mins + it takes me 11h:30mins to reach 200 banquet/carovans = around 23h
 

Goldra

Marquis
There are two important things to say about hte event:
- Production and cost has been changed, but the misions not. This is a terrible mistake that should be fixed soon.
- The strategies to make cities in 24h says to upgrade carriage and banquet to 4. Adding the other admin in level 2 by the misions, this means a very high use of gems. Seeing that this has been copied too, would we have enough gems to make a daily city in this terms of expend? Or how many cities can be done with the gems given with the quests?
 

MooingCat

Viceroy
Spoiler Poster
Thanks @xivarmy for finding my error, I've updated my initial recommendations based on the actual Banquet production time :)

1685657684262.png

I played around with some different orders of level 100 > 150 > 200, but in the end there were basically no difference adding a few levels here and there. The values I landed on were within the range that gave me the lowest time, while also being nice and round numbers. I tried your order as well @xivarmy, and compared to what I used here it lost a few seconds, so basically no difference :)
 

MooingCat

Viceroy
Spoiler Poster
There are two important things to say about hte event:
- Production and cost has been changed, but the misions not. This is a terrible mistake that should be fixed soon.
- The strategies to make cities in 24h says to upgrade carriage and banquet to 4. Adding the other admin in level 2 by the misions, this means a very high use of gems. Seeing that this has been copied too, would we have enough gems to make a daily city in this terms of expend? Or how many cities can be done with the gems given with the quests?
I agree on the missions. Brand new ones would be really cool, but the least they should do is check if all are possible :p

As for managers, for my specific strats the costs are in line with St. Pat strats, actually 50 gems cheaper per 3-town cycle. You spend more to get managers for banquet/carriage, but less for the other buildings.
 

xivarmy

Overlord
Perk Creator
until I tested the same thing, was wrong my aproximation; my mistake
But a screenshot is a better dimostration, unless you have some other ideas to take less time to reach 8,4Q
https://prnt.sc/ft7rNrjzJZbT 5,92Q : 8h = 0,74Q/h so requires around 11h and 21 mins + it takes me 11h:30mins to reach 200 banquet/carovans = around 23h
I believe the "time skip" isn't really a time skip from my past glances - though i haven't checked it super-closely as I don't actually use the time skip, considering it wasteful.

Basically my impression from past using it to gauge "how long will something take" is that it doesn't account for stockpiles. It takes the minimum of Festival, Ship, and Factory Production and multiplies it for the time period. i.e. you can have 5Q sitting waiting for the festival but a slow ship will determine how much it offers you for a time-skip I believe.

With this in mind, Carriage is about 12% slower, but if you did Carriage to 200 before Banquet to 200 you probably built up enough of a stockpile to hold you over through the shortage (your 1.5Q there now should do) til you make your 8.4Q and will thus make it faster than the Carriage's rate - at the Banquet's Rate :) Which should bring you down to just over 10 hours :)
 

GateKeeper

Baronet
What managers are you using? And exactly how are you upgrading banquet/carriage from 100 > 150 and 150 > 200? Inputting that strategy in my simulator with 4,4,2,2,2,2,2 managers I get 25 hours if you upgrade carriage 100 > 150, banquet 100 > 150, carriage 150 > 200, banquet 150 > 200, down to around 23h40m with a bit of optimizing in the 100 > 200 leveling.
I followed Mooingcat Town 2 yesterday, and will only take 30-31 hours overall from start to get 8.4Q. So it appaers the fast method can also be applied to this event. Initially with all the posts, I thought it would have been the slow method and opening all 6 chests was the only way.

I also only needed to open the Butcher to Lvl 1, but i see no harm in getting it to lvl 10 if you need a few cheap levels to complete a quest

also yup those 3 quests below are fubar.

1685661938307.png
 
Last edited:
Status
Not open for further replies.
Top