From 93b60a4e47000a9628c3dd5e3cfd6481e50d4f24 Mon Sep 17 00:00:00 2001 From: Rampoina Date: Thu, 14 Apr 2022 20:49:42 +0200 Subject: [PATCH] Add support for multiple levels --- levels | 15 ++++++++++++++ soko.bqn | 59 ++++++++++++++++++++++++++++---------------------------- 2 files changed, 44 insertions(+), 30 deletions(-) create mode 100644 levels diff --git a/levels b/levels new file mode 100644 index 0000000..a1a0f42 --- /dev/null +++ b/levels @@ -0,0 +1,15 @@ +####### +#.@ # # +#$* $ # +# $ # +# .. # +# * # +####### + +####### +#.@ # # +#$* $ # +# $ # +# .. # +# * # +####### diff --git a/soko.bqn b/soko.bqn index fb2c5bf..c0ccccf 100755 --- a/soko.bqn +++ b/soko.bqn @@ -14,64 +14,63 @@ # ⟨ 4 ⟩ ⟨ 1 0 ⟩ ⟨ 2 0 ⟩ ⟨ 0 ⟩ ⟨ 4 ⟩ #@*.# # ⟨ 4 ⟩ ⟨ 4 ⟩ ⟨ 4 ⟩ ⟨ 4 ⟩ ⟨ 4 ⟩ #####" # ┘ ┘ -moves←⟨0‿0⟩ -chars←" @$.+*#" -level ← >⟨ -"#######" -"#.@ # #" -"#$* $ #" -"# $ #" -"# .. #" -"# * #" -"#######" - ⟩ +moves←⟨0‿0⟩ # list of moves, each move is a direction, we start without moving +chars←" @$.+*#" # legal characters -ll←{(⊑chars⊐𝕩)⊑⟨≍0,1‿0,2‿0,≍3,1‿3,2‿3,≍6⟩}¨(⊢↑˝·≍⟜¬2+≢)level -#ll←≍¨(⊢↑˝·≍⟜¬2+≢)chars⊐level # ascii to numbers, 0pad and listify -#_change←{ll↩𝔽¨⌾((ll∊≍¨𝕩)/○⥊⊢)ll} # Add 0s to the boxes and player: ⟨2⟩ -> ⟨2,0⟩ -#∾⟜0 _change 1‿2 ⋄ (-≍○⊑⊢)⟜3 _change 4‿5 # change 5('*') to ⟨2,3⟩, 5('+') to ⟨1,3⟩ -#Rle←(∾´∾¨)∘((+⟜(×⟜10)´ -⟜'0'∘⌽)⊸⥊⟜<¨)˜´(≠⊸⥊⟜1‿0)⊸⊔∘(1⊸↓)∘(((+`»⊸≠) '0'⊸< ∧ '9'⊸>)⊸⊔)`))) +SplitOnEmpty←{𝕩⊔˜(⊢-˜+`׬)0=≠¨𝕩} +Ascii2Matrix←{(⊑chars⊐𝕩)⊑⟨≍0,1‿0,2‿0,≍3,1‿3,2‿3,≍6⟩}¨(⊢↑˝·≍⟜¬2+≢) -# 𝕨 C 𝕩 | 𝕩: object coordinate (3‿1) | 𝕨: direction vector (¯1‿0) + +# 𝕨 Tiles 𝕩 | 𝕩: object coordinate (3‿1) | 𝕨: direction vector (¯1‿0) # result: ⟨ ⟨ 3 1 ⟩ ⟨ 2 1 ⟩ ⟨ 1 1 ⟩ ⟩ # returns 3 tiles in the specified direction from the Tiles←{⟨𝕩,𝕩+𝕨,𝕩+2×𝕨⟩} # given object (including itself) -Player←{⊑/○⥊⟜(↕≢)1⍷⊑¨𝕩} # P 𝕩 | 𝕩:level | returns the coordinate of the [P]layer +Player←{⊑/○⥊⟜(↕≢)1⍷⊑¨𝕩} # Player 𝕩 | 𝕩:level | returns the coordinate of the [P]layer -# M 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨0⟩⟩ (2 tiles) | result: ⟨⟨0⟩,⟨1,0⟩⟩ -# [M]ove the first object in the first tile to the second tile. +# Move 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨0⟩⟩ (2 tiles) | result: ⟨⟨0⟩,⟨1,0⟩⟩ +# Move the first object in the first tile to the second tile. # Only move Player/Box -> Floor/Goal # the second tile can't be a box because we moved it previously # if it is it means that the box was unmovable (next to a wall) so we do nothing Move←{a‿b:⟨1↓a,(⊑a)∾b⟩}⍟{∨´(⥊1‿2≍⌜0‿3)≡⌜<⊑¨𝕩} -# P 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨2,0⟩,⟨0,0)⟩ (3 tiles) | result: ⟨⟨0⟩,⟨1,0⟩,⟨2,0)⟩ +# Push 𝕩 | 𝕩: ⟨⟨1,0⟩,⟨2,0⟩,⟨0,0)⟩ (3 tiles) | result: ⟨⟨0⟩,⟨1,0⟩,⟨2,0)⟩ # Given 3 tiles try to [P]ush the second tile (possible box) # and afterwards try to move the first one (player) if possible Push←Move⌾(2↑⊢)Move⌾(1↓⊢) S←{Push⌾((𝕨 Tiles Player 𝕩 )⊸⊑)𝕩} # 𝕨 S 𝕩 | 𝕨: direction | 𝕩:level | step the game -Draw←{chars⊏˜+´¨ll S´ ⌽𝕩} # Draw 𝕩 | 𝕩: level | Draw the game in ASCII +Draw←{chars⊏˜+´¨𝕨 S´ ⌽𝕩} # Draw 𝕩 | 𝕩: moves | Draw the game in ASCII W←{(2≡¨⊑¨𝕩) =○(+´⥊) (<2‿3)≡¨𝕩} # W 𝕩 | 𝕩: level | [W]in condition N←{moves↩moves∾<𝕩} Undo←{𝕊:moves↩(-1<≠)⊸↓moves} While ← {𝕨{𝕊∘𝔾⍟𝔽𝕩}𝕩@}´ -•term.RawMode 1 -•Out "[?25l" -•Out "Press key" ⋄ •Out˘ Draw moves +# Main loop +# Load file containing levels +levels←Ascii2Matrix¨>¨SplitOnEmpty•FLines "levels" +currentLevel←0 +•term.RawMode 1 # set terminal to raw mode +•Out "[?25l" # Cursor to origin, hide it and clear screen clear←"" -While {𝕤⋄¬W ll S´⌽moves}‿{𝕤 +While {𝕤⋄currentLevel<≠levels}‿{𝕤 # Loop until the user wins •Out "" + •Out "Level: "∾•Repr 1+currentLevel + •Out "7" + •Out "Press key" + •Out˘ (currentLevel⊑levels) Draw moves key←•term.CharB @ {𝕤⋄N ⊑("hjkl"=key)/⟨0‿¯1,1‿0,¯1‿0,0‿1⟩}⍟(⊑key∊"hjkl")@ {𝕤⋄Undo @}⍟(key='u')@ + {𝕤⋄•Out "[?12l[?25h"⋄•Exit 0}⍟(key='q')@ {𝕤⋄clear↩""}⍟(((1⊸+>○(⌊1+10⋆⁼1⌈⊢)⊢)¯1+≠moves)∧key='u')@ + •Out "8" {𝕤⋄•Out clear∾"Press key"}⍟(⊑key∊"hjklu")@ - {𝕤⋄•Out "Wrong key"}⍟(¬⊑key∊"hjklu")@ - •Out˘ Draw moves - •Out "Moves: "∾{'0'+⌽10|⌊𝕩÷10⋆↕(⌊1+10⋆⁼1⌈⊢)𝕩}¯1+≠moves + {𝕤⋄•Out "Wrong key"}⍟(¬⊑key∊"hjkluq")@ + •Out˘ (currentLevel⊑levels) Draw moves + •Out "Moves: "∾•Repr ¯1+≠moves + {𝕤⋄•Out ""⋄currentLevel↩currentLevel+1⋄moves↩⟨0‿0⟩}⍟(W (currentLevel⊑levels) S´⌽moves)@ } -•Out "Well played!" +•Out "Well played, you win!" •Out "[?12l[?25h"