Monopoly app bouwen in Salesforce – deel 11: Drie manieren om de Gevangenis te verlaten

Er zijn een paar manieren om in de gevangenis te komen en een paar manieren om er weer uit te komen bij Monopoly.

  • In aflevering 4 las je hoe spelers naar de gevangenis gaan als ze drie keer na elkaar een dubbele worp hebben gedaan.
  • In aflevering 5 hebben we geregeld dat wie op het vakje “Ga direct naar de gevangenis” komt, daar ook heen verplaatst wordt. De flow gebruikt hiervoor een Rule die we in aflevering 3 hebben gekoppeld aan dat vakje op het speelbord.
  • De derde mogelijkheid is een Kans of Algemeen Fonds kaartje dat je direct naar de gevangenis stuurt. Dit hebben we in aflevering 6 toegevoegd.

In de gevangenis terecht komen kan dus al op al dezelfde manieren als in het echte spel, maar hoe kom je eruit?

Dat kan ook op drie manieren:

  • Dubbel gooien
  • € 5.000 betalen
  • Een Verlaat de gevangenis zonder betalen kaartje inzetten

Dubbel gooien

Dit mag je maximaal 3 beurten na elkaar proberen. Lukt het ook bij de derde beurt dat je in de gevangenis zit niet, dan moet je alsnog € 5.000 betalen. Daarom is het belangrijk om bij te kunnen houden hoe lang de speler al in de gevangenis zit.

Hiervoor introduceren we het nieuwe veld Number of turns in jail op het Player object. 1 cijfer voor en 0 na de komma, standaard waarde 0. Geen enkel profiel krijgt toegang, want dit doen we via Permission Sets, en de precieze plaats op de Page Layout en Lightning Page bepalen we later.

€ 5.000 betalen

Waar de optie van dubbel gooien alleen maar inzetbaar is als je dat niet al 3 keer eerder zonder succes geprobeerd hebt en je zo’n mooi Verlaat de gevangenis zonder betalen kaartje wel moet hebben, is de optie om maar gewoon € 5.000 te betalen altijd beschikbaar. Hiervoor zijn dus geen speciale voorbereidingen nodig.

Nadat we onze voorbereidingen voor de Kans kaart mogelijkheid hebben getroffen, zullen we weer een flow bouwen voor het afhandelen van dit scenario.

Verlaat de gevangenis zonder betalen

Dit kaartje komt in de Kans en Algemeen Fonds stapels beide één keer voor. Anders dan de andere Rules in de Kans en Algemeen Fonds Stapels, hebben we voor deze regel nog geen ‘Action’ bedacht.

Dus wanneer je als speler deze kaart krijgt vanaf de stapel, gebeurt er niets. Maar wat er zou moeten gebeuren is dat je de Rule bij je mag houden en deze niet op de stapel ligt voor anderen.

Om dat op te lossen moeten we het volgende regelen:

  • De Rule moet aan een speler gekoppeld kunnen worden
  • De flow moet die relatie kunnen aanmaken wanneer een speler dit kaartje krijgt
  • Zolang de Rule in bezit is van een speler, moeten anderen deze niet van de stapel kunnen pakken
  • Zodra de speler de kaart heeft ingezet moet deze terug in de stapel worden gelegd

De eerste stap is een lookup van Rule naar Player maken. Zo kunnen we deze kaart uitsluiten voor andere spelers en kunnen we de speler de mogelijkheid geven die in te zetten om de gevangenis te verlaten.

Ook hierbij is het nodig om te zorgen dat andere potjes niet beïnvloed worden door wat er in dit potje met de Rule gebeurt. In aflevering 9 hebben we verschillende objecten daarvoor aan een overkoepelende Game gekoppeld, maar Rules nog niet.

Stap 1 is dus een Game lookup te maken op het Rule object.

Stap 2 is een relatie naar Player maken met als filter dat de Player en de Rule tot dezelfde Game moeten behoren.

In deze screenshot zie je hoe we ook de naam van de Related List op het Player object waar de Rules bewaard kunnen worden bepalen. Deze noemen we Rules in Hand. Hier gaat het echt om de API name van de Child Relationship en daar mogen we geen spaties in gebruiken. In Stap 7 kun je het Label van de Related list bepalen en daar mogen spaties wel.

Voor beide nieuwe velden, schakel ik wederom geen toegang in via profielen, maar deze voegen we weer toe aan onze Permission Sets. De precieze plaatsing van de velden op de Lightning Page en eventuele voorwaardelijke zichtbaarheid zullen we later in een soort bezemronde nog regelen.

Nu we toch in de Object Manager zijn bij het Rule object, voegen we meteen ook een vijfde picklist waarde toe aan het veld Action: Save for Later.

Vergeet niet om op de Rules voor Verlaat de gevangenis zonder betalen ook het Action veld te updaten naar Save for Later.

Save for later

Allereerst voegen we de afhandeling van het nieuwe Save for Later scenario in de SCR – Execute Rule flow toe. Hiervoor voegen we een vijfde uitkomst toe aan de Rule Action Decision.

Daar vullen we de In Player’s Hand relatie met de Id van de actieve speler en deze update van de inputRule slaan we op met een Update records element.

We slaan de flow op als een nieuwe versie met een notitie in de Description die uitlegt wat er is gewijzigd ten opzichte van de voorgaande versie. De nieuwe versie activeren we ook meteen.

In de SCR – Check for and Execute Position Rule flow moeten we het eerste Get records element aanpassen. Hier moet als derde voorwaarde aan toegevoegd worden dat de Rule niet in de hand van een speler mag zitten. Deze Get haalt echter een Position Rule op en In Player’s Hand is een veld op Position, dus alleen wanneer ik een formuleveld op het Position Rule object maak kan ik daar op filteren.

De formule is_in_a_Player_s_hand__c op het Position Rule object heeft de waarde true als deze lookup op de bovenliggende Position met leeg is.

En dan is dit het aangepaste Get records element.

De beurt van de gevangene

Omdat de beurt van de gevangene deels wel hetzelfde werkt als een gewone beurt, voegen we alle elementen die we nodig hebben om de beurt van de gevangene uit te voeren toe aan de al bestaande flow om de beurt van een speler uit te voeren: de SCR – Roll and Move flow.

Meteen in het begin hebben we al een Decision element nodig, want spelers die vanuit de gevangenis beginnen, krijgen een heel ander eerste scherm te zien. Bovendien moeten we vóór het tonen van het eerste scherm al bepalen of de speler een Verlaat de gevangenis zonder betalen kaartje heeft.

De external Id van de gevangenis eindigt op 40. Zo bepalen we op de speler erin zit.
We zoeken naar een Save for Later Rule die in de hand van de actieve speler zit.

Aan het begin van de beurt die start in de gevangenis, krijgt de speler altijd een keuze. Proberen dubbel te gooien of bij voorbaat al besluiten € 5.000,- te betalen. Wanneer de speler een Verlaat de gevangenis zonder betalen kaartje heeft, is er ook een derde optie beschikbaar.

Op dit scherm plaatsen we daarom twee varianten van deze keuzelijst. Één mét de mogelijkheid om het Verlaat de gevangenis zonder betalen kaartje in te zetten en één zonder. Beide krijgen hun eigen voorwaardelijke zichtbaarheid. Ik heb overigens voor elk nieuw scherm dat we nu toevoegen het bestaande eerste scherm van deze flow gekopieerd en aangepast, zodat de tekst opmaak van alle schermen gelijk is door de hele flow.

Hierna hebben we eerst weer 3 elementen gemeen met de beurt voor een speler die niet in de gevangenis zit. Daarna takken we weer af en volgt meteen nog een Decision element voor de verdere afhandeling een beslissing op basis van de keuze die de speler gemaakt heeft.

Bij de voorwaarden voor de beslissingsuitkomst Roll a Double moeten we ook bepalen welke set Radio buttons de gebruiker gezien en gebruikt heeft. Daarom checken we daar ook weer of de speler een Verlaat de gevangenis zonder betalen kaartje had en raadplegen we op basis daarvan hun keuze in de eerste of tweede lijst met opties.

Verlaat de gevangenis zonder betalen

Zet de speler het Verlaat de gevangenis zonder betalen kaartje in, dan moet het volgende gebeuren.

  • De speler levert het kaartje in en gaat op de aflegstapel
  • De speler gooit met de dobbelstenen
  • De speler gaat naar het juiste veld

Het gooien met de dobbelstenen en bepalen naar welk veld te verplaatsen is op dit punt al gebeurd in het deel van de flow dat we 1 op 1 delen met een ‘normale’ beurt.

De verlaat de gevangenis zonder betalen kaart op de aflegstapel leggen is eigenlijk al half gebeurd.

Toen de speler deze kaart trok, is de index van alle position Rules van deze kaart al op 999 gezet, waardoor niemand anders hem nog een keer kan trekken en de kaart ook mee geschud wordt zodra de stapel leeg is. Daar hoeven we nu dus niets meer voor te doen.

Wél moeten we de relatie naar de Player op de Rule (In_Player_s_Hand__c) weer leeg maken. Daardoor kan de speler dezelfde kaart niet ten onrechte nog een keer inzetten en zouden andere spelers deze kaart (nadat de aflegstapel is geschud) ook weer kunnen trekken.

Hiervoor zoeken we deze kaart eerst op.

In de Remove from Player’s hand assignment maken de het In_Player_s_Hand__c veld van deze record leeg en het Update Rule element slaat deze wijziging op deze Rule op in de database.

Voor we vanaf hier de reguliere route van de flow vervolgen, laten we de speler eerst nog in een scherm zien waar ze zich naartoe verplaatsen. Dit is precies hetzelfde scherm als in de reguliere flow na een niet dubbele worp.

Hierna wordt, net als bij de andere uitkomsten waarbij de speler de gevangenis uit gaat en net zoals in een reguliere beurt de nieuwe Postion van de speler toegewezen en met hetzelfde Update Records element als er al stond in de flow bijgewerkt.

Dubbel gooien

Als de speler heeft gekozen om te proberen dubbel te gooien, willen we verschillende routes volgen als het wel of niet gelukt is.

Als het wel gelukt is, mag de speler net zoveel plaatsen verder lopen als de waarde van de worp is. We laten dan een scherm zien en gaan dan verder naar het Assign Player’s new Position – double element dat in het oudere deel van de flow ook gebruikt wordt bij een dubbele worp.

Hierna moet de speler immers nog een keer gooien. Dat je in deze situatie deze normale route van de flow verder kunt volgen, is de belangrijkste reden dat we deze elementen allemaal toevoegen in deze bestaande flow in plaats van een afzonderlijke nieuwe flow te maken. De speler mag na deze dubbele worp immer nog een keer gooien en bij die worp geldt de werkwijze die al langer in SCR- Roll and Move zit.

Door op de tekst aan het einde van de connector te klikken, wordt het element waar die connector uitkomt gemarkeerd.

Laten we ook het tellen van het aantal dubbele worpen ook nog even kopiëren naar vóór de connector.

Is dubbel gooien niet gelukt, dan moet de speler in de gevangenis blijven tenzij die daar al 3 beurten lang in zit. Of dat zo is zien we aan Number of turns in jail op de Player record. De eerste keer is de waarde daarvan 0, de tweede keer 1 en de derde keer 2. Als de waarde van dit veld lager de 2 is, moet de speler dus in de gevangenis blijven.

Hierna moeten we dat Number of turns in jail met 1 verhogen voor de juiste beslissing in de volgende beurt, de speler een scherm laten zien en afsluiten met het starten van de beurt van de volgende speler.

Dat Number of turns in jail moeten we trouwens nog wel op 0 zetten als de speler de gevangenis uit gaat. Daarvoor voegen we een extra veldtoewijzing toe in deze assignments.

Wilde de speler dubbel proberen te gooien in de derde beurt in de gevangenis en lukt dat niet, dan moet de speler € 5.000,- betalen en het aantal stappen zetten dat de waarde van de worp is. Hiervoor connecten we meteen naar het Pay € 5.000,- pad van de beslissing en gebruiken we dezelfde Assignment om € 5.000,- van de Player’s Cash Balance af te trekken en hetzelfde scherm.

Ook vanuit deze route komen we uit bij de assigment om de Player naar de nieuwe Position te verplaatsen, waar we ook uitkomen als we een Verlaat de gevangenis zonder betalen kaartje gebruiken.

We zijn flink opgeschoten met het maken van onze Monopoly app. Met de volgende aspecten van het spel zullen we in de komende edities nog aan de slag gaan.

  • Kans kaarten met te berekenen bedragen
  • Huizen en hotels bouwen
  • Handelen met andere spelers
  • Geldnood, wat nu?
  • Zien wat de andere spelers aan het doen zijn

Dank je voor het lezen. Heb je vragen of suggesties? Laat ze gerust achter in de comments.