stateDiagram-v2
  [*] --> DemoPlay
  
  DemoPlay --> Waiting : quickPlay()
  Waiting --> Playing : 2 jugadores conectados
  
  state Playing {
    [*] --> VariantSelection
    VariantSelection --> RoundActive : seleccionar G1-G5
    
    state RoundActive {
      [*] --> OfferPhase
      
      state OfferPhase {
        [*] --> CheckForce
        CheckForce --> ForcedOffer : G2 && forcedByP2
        CheckForce --> OptionalOffer : !forcedByP2
        ForcedOffer --> ProposeOffer : debe ofrecer
        OptionalOffer --> ProposeOffer : ofrecer
        OptionalOffer --> NoOffer : no ofrecer
      }
      
      ProposeOffer --> P2Decision : offerActive=true
      NoOffer --> NextRound : auto-avance
      
      state P2Decision {
        [*] --> WaitingP2
        WaitingP2 --> Accept : p2Action
        WaitingP2 --> Reject : p2Action
        WaitingP2 --> Snatch : p2Action
      }
      
      Accept --> TokenExchange : intercambiar
      Reject --> NoChange : sin cambios
      Snatch --> CheckVariant : robar tokens
      
      TokenExchange --> NextRound : auto-avance
      NoChange --> NextRound : auto-avance
      
      state CheckVariant {
        [*] --> CheckG3G4
        CheckG3G4 --> ShameDecision : G3
        CheckG3G4 --> ReportDecision : G4
        CheckG3G4 --> NextRound : otros
      }
      
      ShameDecision --> NextRound : asignar/no asignar
      ReportDecision --> Sanction : denunciar
      ReportDecision --> NextRound : no denunciar
      Sanction --> NextRound : aplicar sanción inversa
    }
    
    NextRound --> RoundActive : round < 3
    NextRound --> Finished : round = 3
  }
  
  Finished --> VariantSelection : cambiar variante reinicia
  Playing --> Finished : 3 rondas completadas
  
  note right of VariantSelection
    Cualquier jugador puede
    cambiar variante en
    cualquier momento
  end note
  
  note right of P2Decision
    Una sola acción
    permitida por oferta
  end note

