Dominion Strategy Forum

Please login or register.

Login with username, password and session length

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - chipperMDW

Filter to certain boards:

Pages: [1] 2 3 ... 10
1
Dominion General Discussion / Re: Complexity of Dominion
« on: October 09, 2018, 12:05:38 am »
That doesn't mean that... the game was ever actually in the intermediate states you considered on the way to the final one.

Actually, let me take this one statement back.  The game's state actually is identical to all the intermediate states when you consider the intermediate states to include the effects that have yet to be applied, which my script does.  Each iteration of the loop in upper_substate() essentially performs a simplification on the game state, transforming it into an exactly equivalent state where one effect that is outstanding in the "lower" state is no longer outstanding in the simpler state "above" it. Sorta like how a + or * "disappears" from an expression when you transform it to an equivalent expression by applying that operator.

2
Dominion General Discussion / Re: Complexity of Dominion
« on: October 08, 2018, 04:48:52 pm »
So, your whole algorithm depends on effects taking place at an instance in time.  Which maybe comes from the Magic layers system, I dunno.

But Quarry's effect isn't written to take place at an instant in time...it's a continuous effect. As is inheritance's effect.  Which is what crj was trying to get at, I believe.

It does not depend on "effects taking place at an instant in time." I'm aware that continuous effects are meant to always apply, and that they don't "occur" at instants in time.  There's absolutely no "time" involved in the algorithm I'm discussing (nor is time involved in Magic's layer system, for that matter). In these lines from the last section of my script:
Code: [Select]
print "1. Play Quarry Before Buying Inheritance:"
s = State()
s.play_quarry()
s.inherit_village()
print "\t" + s.as_str() + "\n"

the concept of "time passing" is present only in the instructions "play_quarry" and "inherit_village".  The game has only one state at any given time.  Those two are the only instructions that mutate the game's state from one moment in time to the next.  Specifically, it starts at an initial state, progresses to a state where a Quarry has been played, then progresses to a state where Inheritance has been bought.  The algorithm I'm discussing doesn't involve any of that (and, as is demonstrated, is independent of the time order in which those two things occurred).

The algorithm I'm discussing occurs entirely within the call to as_str(), which does not mutate the game state; it merely determines a string representation of the game's current state at this one instant in time.  Of course, the algorithm progresses through a series of steps in order to reach its result, where certain things happen logically before other things.  As any algorithm must do.  That doesn't mean that those steps represent a passage of time, or that the game was ever actually in the intermediate states you considered on the way to the final one.

Take the equation x = 2 + 3 * 5.  In order to determine x, you have to follow a sequence of steps.  You have to follow them in the correct order, and one step along the way is that you find one of the subexpressions is equal to 15.  That doesn't somehow mean that x is equal to 15 from that moment in time until you finish the next step, after which it "becomes" 17.  Just because you're following the steps in a procedure doesn't mean you're representing the passage of time.

Likewise, just because you consider a game state where Inheritance's effect has been evaluated, but not Quarry's, that doesn't mean you're saying the game actually has that state at any given point in time.  It's just an intermediate concept you use on the way to evaluating the actual state at a given moment.  Just like the subexpression 3 * 5 is an intermediate concept you use on the way to evaluating x.


Quote
When translating such continuous effects into code, or making them instantaneous otherwise, you must add additional constraints, because "we can't go back".  I believe in this case rather than saying it's a "priority" thing (which sounds arbitrary), it should be considered as a "dependency" thing.  Quarry's cost-reduction depends on type, Inheritance effects type, so Quarry depends on Inheritance.  Thus I(Q(G)) evaluated as a single point-effect doesn't make sense, because Q depends on I, and dependencies should always be evaluated first.

I entirely agree that a priority order is completely arbitrary, and would probably not be the desirable way to describe an evaluation order in Dominion.  I also agree that a dependency order is probably what is intended.

I used the priority order in the code only because my intent was to show that, as I keep saying, the order of evaluation matters.  Even if what you're evaluating is a game state at one instant in time.  The simplest way to represent an order of evaluation is to assign a number to each thing you're evaluating. I wasn't trying to write a complete Dominion rules engine there.

My point, from the start, was that a hypothetical Dominion "Comprehensive Rules" document would explain what order to evaluate those effects. Nowhere am I saying that "dependency order" is somehow unacceptable. I'm just saying it's not called out anywhere (and doesn't really need to be, as far as I'm concerned). So one reason that the page counts of the rules that have been written for Dominion and those written for Magic are not directly comparable is because Magic's Comprehensive Rules are... more comprehensive. There are topics covered in Magic's rules that are not covered in Dominion's, but are nonetheless present (in fewer instances) there.

3
Dominion General Discussion / Re: Complexity of Dominion
« on: October 07, 2018, 08:53:36 pm »
For a concrete example of why you have to think in those terms, consider this:
  • You play Quarry A
  • You play Quarry B
  • You buy Bonfire and trash Quarry A
  • You buy a Village
How much does the Village cost when you buy it? $1. You cannot reach that conclusion by reducing the cost of Village by $2 (minimum $0) when you play Quarry A, then by another $2 (minimum $0) when you play Quarry B, then increasing it by $2 when you remove Quarry A from play.

The only correct option is to think in terms of evaluating the cost of Village at the moment when you buy it, using an algorithm which is dynamically adjusted by the course of play.

So, I think I figured out why you made this comment, and why you don't agree that Q(I(G)) produces a different result from I(Q(G)). You must still be thinking that Q(I(G)) is supposed to represent a sequence of states that a game progresses through as time passes. Like, you think Q(x) effectively means "play a Quarry." I explained before that that's not what I mean, and that the notation is intended to describe an evaluation order. The expressions inside parentheses don't represent past states, but substates.

I'm not sure how to explain better than I already have in text, so I wrote this instead. It's a Python script that uses the model I've been describing to process the effects we've been talking about in a very simple Dominion-inspired game state. The evaluation of effects is ordered by a simple priority order, with Inheritance always happening before Quarry (although it could be modified to use a dependency system like you effectively describe). Hopefully the code speaks for itself and makes it more clear what I've been saying. (Assuming you want to read/run it at all.)

(It assumes all Estates are "yours," by the way.)

Code: [Select]
class Substate(object):
    def __init__(self, effects):
        self.effects = effects
    def has_outstanding_effects(self):
        return len(self.effects) > 0
    def next_state(self):
        effects = sorted(self.effects, key = lambda e: e.priority)
        return effects[0](self, effects[1:])

# First element is cost; second element is whether it's an action
carddefs = { "Estate": [2, False], "Village": [3, True] }

class RawState(Substate):
    def __init__(self):
        Substate.__init__(self, [])
    def card_cost(self, name):
        return carddefs[name][0]
    def card_is_action(self, name):
        return carddefs[name][1]
    def as_str(self):
        return "G"

class ModifiedState(Substate):
    def __init__(self, underlying_state, outstanding_effects):
        Substate.__init__(self, outstanding_effects)
        self.underlying_state = underlying_state
    def card_cost(self, name):
        return self.underlying_state.card_cost(name)
    def card_is_action(self, name):
        return self.underlying_state.card_is_action(name)
    def as_str(self):
        return self.sym() + "(" + self.underlying_state.as_str() + ")"

class InheritanceEffect(ModifiedState):
    def card_is_action(self, name):
        action = self.underlying_state.card_is_action(name)
        return True if name == "Estate" else action
    def sym(self):
        return "I"
    priority = 0

class QuarryEffect(ModifiedState):
    def card_cost(self, name):
        action = self.underlying_state.card_is_action(name)
        cost = self.underlying_state.card_cost(name)
        return max(0, cost - 2) if action else cost
    def sym(self):
        return "Q"
    priority = 1

class State:
    def __init__(self):
        self.raw = RawState()
    def upper_substate(self):
        substate = self.raw
        while substate.has_outstanding_effects():
            substate = substate.next_state()
        return substate
    def card_cost(self, name):
        return self.upper_substate().card_cost(name)
    def card_is_action(self, name):
        return self.upper_substate().card_is_action(name)
    def as_str(self):
        return "%s: Estate $%u, Village $%u" % (
            self.upper_substate().as_str(),
            self.card_cost("Estate"),
            self.card_cost("Village"))
    def play_quarry(self):
        self.raw.effects.append(QuarryEffect)
    def unplay_quarry(self):
        self.raw.effects.remove(QuarryEffect)
    def inherit_village(self):
        self.raw.effects.append(InheritanceEffect)

print "1. Play Quarry Before Buying Inheritance:"
s = State()
s.play_quarry()
s.inherit_village()
print "\t" + s.as_str() + "\n"

print "2. Buy Inheritance Before Playing Quarry"
s = State()
s.inherit_village()
s.play_quarry()
print "\t" + s.as_str() + "\n"

print "3. How Not To Do It"
InheritanceEffect.priority = 2
print "\t" + s.as_str() + "\n"
InheritanceEffect.priority = 0

print "4. Play Two Quarries..."
s = State()
s.play_quarry()
s.play_quarry()
print "\t" + s.as_str()
print "...Then Remove One From Play"
s.unplay_quarry()
print "\t" + s.as_str()

Here's the output:
Code: [Select]
1. Play Quarry Before Buying Inheritance:
        Q(I(G)): Estate $0, Village $1

2. Buy Inheritance Before Playing Quarry
        Q(I(G)): Estate $0, Village $1

3. How Not To Do It
        I(Q(G)): Estate $2, Village $1

4. Play Two Quarries...
        Q(Q(G)): Estate $2, Village $0
...Then Remove One From Play
        Q(G): Estate $2, Village $1

The first two cases demonstrate both orders of playing Quarry and buying Inheritance. They both produce the correct results (which are identical to one another), and they both result in state Q(I(G)) due to the priority used to decide the evaluation order of the two types of effects. The third case temporarily mucks around with the priority ordering to show that evaluating the effects in the order I(Q(G)) produces a different (incorrect) result. Also, the last case demonstrates that the model doesn't have the issue you were describing with playing multiple Quarries and then removing one from play.

4
Rules Questions / Re: Band of Misfits as Reserve Cards
« on: October 07, 2018, 02:06:14 am »
I play BoM as Embargo. I follow the instructions on Embargo top to bottom (like I'm pretty sure I should) get +$2, then trash the Embargo that is actually a BoM. Since the card is no longer in play, do I get to put an embargo token on a supply pile? The BoM left play, and BoM doesn't tell me to put embargo tokens on things. Logic tells me I don't get to put an embargo token on anything. Am I wrong? And if so, why?

Imagine that, as the first step of playing a card, you start by copying its on-play ability onto a Post-it. Then, you follow the instructions on the Post-it. If the text on the card changes while you're playing it, who cares? You're not looking at the card; you're following the instructions written on the Post-it. Then, when you're done playing the card, throw the Post-it away.

Now, imagine that you want to save trees and ink, so, instead of writing stuff on Post-its all the time, you do the same thing mentally.


Quote
Thare are rulings (even in the rulebook) saying that when you trash a BoM-as-Fortress, the when-trash-ability of the Fortress is resolved, even though you actually resolve it when the Fortress is a BoM. So this supports the rule that you always resolve a triggered ability.

This doesn't affect BoM as a card with a when trash ability because when you trash the card with a when trash ability, two things are happening at the same time, the when trash ability triggers, and BoM loses all of its abilities it got from being played as an action card from the supply. You can simply choose to resolve the when trash ability before BoM loses it.

That's not a "two things happen at the same time" scenario. There's only one thing happening there: a card is trashed. As part of being trashed, it stops being in play, so if an effect is causing it to have abilities as long as it's in play, it stops having those abilities.

5
Dominion General Discussion / Re: Complexity of Dominion
« on: October 06, 2018, 01:29:08 am »
For a concrete example of why you have to think in those terms, consider this:
  • You play Quarry A
  • You play Quarry B
  • You buy Bonfire and trash Quarry A
  • You buy a Village
How much does the Village cost when you buy it? $1. You cannot reach that conclusion by reducing the cost of Village by $2 (minimum $0) when you play Quarry A, then by another $2 (minimum $0) when you play Quarry B, then increasing it by $2 when you remove Quarry A from play.

The only correct option is to think in terms of evaluating the cost of Village at the moment when you buy it, using an algorithm which is dynamically adjusted by the course of play.

I described Q(x) as a state where the costs of actions are $2 less than they are in x. I would have hoped it was clear that moving one Quarry out of play would cause one Q to be removed from the evaluation order (i.e. the game state would change from Q(Q(G)) to Q(G)), so the resulting final state would evaluate an action's cost by applying a single cost reduction of $2 to the printed cost. It would say Village costs $1. I'm not sure whether something I described actually led you to understand that I'd be trying to add $2 whenever I removed a Quarry from play, but that's not the case.

I think I understand the model you're describing. It's different from how I think about it (which is closer to the layer system described in M:tG's rules), but I think it provides the same results, and it's nice that your algorithm imposes an implicit dependency order on evaluations so that the "intuitive and obvious" result is the only one you can arrive at.

6
Dominion General Discussion / Re: Complexity of Dominion
« on: October 05, 2018, 01:08:24 pm »
Both of those are ongoing effects, which will compound in the obvious way: once you've Inherited an Action, all of your Estates cost $2 while a Quarry is in play. The relative ordering of buying Inheritance, taking ownership of the Estate and playing a Quarry is unimportant.

First, I think you may have typoed this statement. All your (Inherited) Estates cost $0, not $2, while Quarry is in play. That's the "obvious way" they compound, right?

Second, nowhere was I claiming that the order of buying Inheritance and playing Quarry had any effect on the resulting state. In fact, I'm claiming the exact opposite: the order in which the effects come into being cannot matter; the result must be the same either way (your Inherited Estates cost $0). And in order for that to be the case, there must be an understood evaluation order.

Say Q(x) represents a game state like x, but with Quarry's effect applied. I(x) represents a game state like x, but with the effects of Inheriting Village applied. G is a game state where everything is as printed.

If you evaluate Q(I(G)), you get $0 Estates. If you evaluate I(Q(G)), you get $2 Estates. In order to get a consistent result of $0 Estates, you should only ever be picking Q(I(G)) whenever you have to evaluate both of them.

Now, say you're at G, and you play Quarry. You're now at Q(G). Now Inherit Village. You can't just apply I(x) to the current game state, or you end up at the incorrect I(Q(G)) and you have $2 Estates. Instead, you have to insert the evaluation of I at an intermediate point in order to get Q(I(G)). In other words, you need a rule that says I(x) effects to be evaluated inside the parentheses of Q(x) effects.

Donald says there'd need to be a "timing" if you had both cost increasers and cost reducers. Presumably, that's because cost reducers say they cap the result at $0. Say B(x) is the effect of Bridge and J(x) is a hypothetical effect that increases all card costs by $1. If you evaluated B(J(G)), then Coppers would cost $0 because the effects canceled out; if you evaluated J(B(G)), then Coppers would cost $1 because the cost increase was not "visible" at the point you evaluated B, so it capped at $0. Presumably, you'd always want Coppers to cost $0 in this case, so you'd need a rule that says increasers have to be evaluated "before" (inside the parentheses of) reducers.*

I'm saying that the exact same thing is true with Quarry and Inheritance: the order of evaluation matters. In either case, you can say that the result is "obvious," but you'd still following a rule (perhaps an obvious, intuitively understood rule) to get the result, even if you didn't realize it. And everyone else would need to follow the same rule in order to get the same result you did.


* Or else say that the capping at $0 isn't part of B but something that gets evaluated after all the cost-modifying effects, which I recall was also considered as an option.

7
Dominion General Discussion / Re: Complexity of Dominion
« on: October 05, 2018, 12:59:45 am »
This is only possible due to the particular set of effects. If I had both "cards cost $1 less" and "cards cost $1 more" then you'd need timing.

I'm pretty certain that having both Quarry and Inheritance means you need "timing" as well. Inheritance's effect modifies types. Quarry's effect cares about types. I'm not aware of a way to evaluate them other than one at a time, and the order you choose matters. One way (the correct way, I believe) makes your Estates $0 because the modifications made by Inheritance's effect are visible to Quarry at this point; the other way makes them stay $2 because Inheritance's modifications are not visible to it.

8
Dominion General Discussion / Re: Complexity of Dominion
« on: October 04, 2018, 05:47:16 pm »
One section in Magic's big rules document is on "interaction of continuous effects," which explains what order to evaluate abilities that do things like change an object's color or power/toughness. It can matter what order you apply these in, so the game's rules explain how you can determine that order.

Dominion also deals with such effects, albeit in much smaller quantities. The order in which they're applied can matter in Dominion, too. For example, you have to apply Inheritance's type-changing effect before you apply Quarry's cost-changing effect, because the latter depends on the former. But there's no rule that explains why you evaluate them in that order, or that you're not allowed to evaluate them in the other order. There's not even an official name for that type of effect. It's just a thing people seem to know intuitively.

I guess my point is that there are things that are not explicitly covered in Dominion's rules documents, but are nonetheless necessary concepts for precisely describing Dominion's rules (and thus contributing to its complexity).

9
Dominion: Renaissance Previews / Re: Your reviews of the previews
« on: October 04, 2018, 09:59:00 am »
Thr hndrd thrt mlln ppl spk smtc lnggs rnd th wrld, hw hrd cn t b?

What are osmotic languages?

10
Most of the obscure bugs are known about, and are just a much lower priority than the other work. And in most cases, what people would encounter arenít actually bugs at all, so I donít think this would help. They donít have the problem of not enough things to do.

Really?  Wow.  I thought that Rio Games bought Dominion and I was assuming that under that corporate umbrella it made sense. 

So is shuffle IT independent of dominion, or just like a third party contractor?

Shuffle iT is Stef, he has some kind of a contract with RGG.

I thought it was Stef and SCSN?

I think he said no.

11
It's B. You are at the window of time for resolving when-trashed abilities for the cards you trashed to Chapel. But then Rats shows up with a new window of time, resolving when-trashed abilities for trashing Rats. You handle that first and then resume resolving the "when-trashed for Chapel" stuff.

Thanks! I was hoping it was that one. So it sounds like Chris is me is correct regarding a stack.

12
I'm sure this has been answered at some point years ago, but... what happens here?

Buy Sewers.  Use Chapel to simultaneously trash a Catacombs and an Estate.  You now have 3 pending triggered effects: Catacombs, Sewers, Sewers. Decide to order a Sewers effect first.  Use it to trash a Rats.  This produces another pending triggered effect.

Which is true at this point?

   A) You may order the Rats, Catacombs, and Sewers effects any way you like.

   B) You must resolve Rats' effect immediately after the instruction that triggered it, so you cannot resolve the Catacombs or Sewers effects until after that.

   C) You must resolve the first set of effects (Catacombs and Sewers) before you can resolve the new one from Rats. (In which case there would have to be some follow up questions to about what that actually means.)

   D) Other.

In other words, and more generally, is there only one set of pending triggered effects at any given time, or can there be multiple sets, which have to be handled in a certain order themselves?

13
Dominion: Renaissance Previews / Re: Renaissance name BINGO
« on: September 27, 2018, 11:31:41 am »
Maybe the next Dominion expansion is Dominion: In Space, to avoid this problem.

Looking forward to Star Port, Mars Colony, Moon Rocks, and Space Explorer.

14
Rules Questions / Re: Order of Resolution with Imp and Royal Carriage
« on: August 30, 2018, 08:42:54 pm »
In other words, I assumed that the confusion arose because Imp happened to have "play a card" as its final instruction, but since it's obvious that "play a card" has to behave the same in all instances, Golem and TR tell us that it's always part of resolving the original card.

Dominion doesn't support tail call optimization.

15
This is basically what MTG does, except the cards say "You control target player during that playerís next turn."  And that's one of the examples I was talking about where they wrote an entire section of the rules just to explain what that one card did. But now there are multiple other cards that also let you control other players.

Hmm... Mindshaver could be a good name for that Zombie Barber people were talking about earlier.

16
Dominion General Discussion / Re: Best cards to learn specific rules?
« on: July 18, 2018, 09:47:41 am »
I also notice that some players, when buying a card, tend to take that card into their hand, and then do clean-up
I don't see that one. But I do see people confusing their play area and their discard pile quite frequently: gaining to in-play, or playing to the discard pile.

I also see a lot of people throwing their Victory cards into play along with their Treasures. Which can matter.

I'm not sure there's any specific card or cards which demonstrate why these are wrong, though. Any engine will do.

The first one I see very sparingly, the second a lot.

Bonfire would work for the second. I can't quickly think of a simpler one.

I was thinking Pilgrimage.

17
Dominion General Discussion / Re: Interview with Donald X.
« on: July 13, 2018, 05:11:32 pm »
Have you ever had to choose different artwork or a different concept for a card due to it being printed in a certain country? I know China in particular will censor, like, human skeletons, which could have been a problem for something with Nocturne's theme.

18
every one of these garbage tangents ends up there anyway

Pro Tip: Never make an insightful post in a thread like this one because your respect will just disappear* when it gets moved to RSP[G].

* Or maybe just turn invisible.

19
tenant

*tenet

(sorry)
if only less people would make these mistakes



fewer

Couldn't resist.

In retrospect, Donald's post making a grammar mistake works well as a joke about people making grammar mistakes. However, because we know he doesn't playtest his posts as jokes, it's funny only due to happy accident. If only you'd known what you were doing, Donald.

20
If you had perfect info the game would just be mindlessly clicking buttons.

Chess and Go (and, well, Prismata) feel sad.

21
What does Delayed X mean?

I mean, this is how I think about it:

Code: [Select]
Card           |  Cost to Play        This Turn                  Next Turn  |   Net
---------------+------------------------------------------------------------+------------------
Copper         |  -1 Card             +1 Coin                               |  -1 Card +1 Coin
Guardian       |  -1 Card                                        +1 Coin    |  -1 Card +1 Coin
---------------+------------------------------------------------------------+------------------
Peddler        |  -1 Action -1 Card   +1 Action +1 Card +1 Coin             |  +1 Coin
Caravan Guard  |  -1 Action -1 Card   +1 Action +1 Card          +1 Coin    |  +1 Coin
---------------+------------------------------------------------------------+------------------
Laboratory     |  -1 Action -1 Card   +1 Action +2 Cards                    |  +1 Card
Caravan        |  -1 Action -1 Card   +1 Action +1 Card          +1 Card    |  +1 Card
Den of Sin     |  -1 Card                                        +2 Cards   |  +1 Card

Cards with the same net effect (over this turn and the next) are listed together in a group.

Guardian has the same net effect as Copper, but the coin part is shifted over into next turn, so Guardian is like a delayed Copper. Same logic for Caravan Guard being like a delayed Peddler.

Caravan is like a Lab that has +1 Card of the net effect shifted into next turn. Den of Sin is like a Lab that has +2 Cards of the net effect shifted into next turn (leaving -1 Card for this turn). Den of Sin is not "more delayed," but it has more of its effect delayed.

22
or even when you draw an Exorcist dead with Gear (save Exorcist and an Estate)

What would it mean to draw a Night card dead?
In the case of Exorcist, typically drawing it with only 0-cost cards.

That's true in general, but crj was using that phrase to describe a situation where you play Gear to draw Exorcist, and you have both the Exorcist and an Estate in hand when you're deciding what to put back for Gear. I'm not sure how the Exorcist could be considered to have been drawn dead in that situation, presuming you'd like to trash the Estate with it. I believe he momentarily forgot that Exorcist was a Night card and was thinking you could draw it and somehow not be able to play it.

(He had already separately covered the case where you draw Exorcist without an Estate, in which case it of course makes sense to set hold back the Exorcist.)

23
or even when you draw an Exorcist dead with Gear (save Exorcist and an Estate)

What would it mean to draw a Night card dead?

24
Dominion General Discussion / Re: Fix the worst cards
« on: June 14, 2018, 01:29:08 pm »
I was thinking at least Harvest and Navigator, perhaps.

You mean Vest and Gator?

25
Dominion FAQ / Re: Counterfeit Clarification
« on: June 06, 2018, 11:03:32 am »
Thank you so much, chipper.

No problem. I'm glad I helped!

Pages: [1] 2 3 ... 10

Page created in 0.083 seconds with 19 queries.