Skip to content

Commit c2b7847

Browse files
committed
Divided normal and special exits into separate tile types.
1 parent 4e25c2a commit c2b7847

File tree

4 files changed

+40
-25
lines changed

4 files changed

+40
-25
lines changed

simalq/tile/__init__.hy

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,16 @@
229229
;; ** `deftile`
230230
;; --------------------------------------------------------------
231231

232-
(defmacro-kwargs deftile [mapsym name superc #** kwargs]
232+
(defmacro-kwargs deftile [[mapsym None] [name None] [superc None] #** kwargs]
233233
"Declare a new concrete and final tile type. Superclasses of other
234234
tiles not meant to themselves be instantiated should be declared
235235
with `defclass`."
236236

237+
; Although `mapsym` is first of the three named arguments, it's the
238+
; one that's actually optional.
239+
(assert (is-not name None))
240+
(assert (is-not superc None))
241+
237242
(setv superc (if (isinstance superc hy.models.List)
238243
superc
239244
`[~superc]))
@@ -242,6 +247,8 @@
242247
(setv (get kwargs "stem") (re.sub r"\A(a|an|the|some) "
243248
(fn [m] (setv (get kwargs "article") (.group m 1)) "")
244249
name))
250+
(when mapsym
251+
(setv (get kwargs "mapsym") mapsym))
245252

246253
(defn un! [x]
247254
(.removeprefix x "hyx_Xexclamation_markX"))
@@ -260,7 +267,7 @@
260267
:if (!= k (un! k))
261268
(un! k))))
262269
~@(gfor
263-
[k v] (.items (dict :mapsym mapsym #** kwargs))
270+
[k v] (.items kwargs)
264271
:setv k (un! k)
265272
; Treat `(meth …)` and `(property-meth …)` forms specially.
266273
(cond

simalq/tile/scenery.hy

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -360,15 +360,10 @@
360360
;; * Exits
361361
;; --------------------------------------------------------------
362362

363-
(deftile :name "an exit" :superc Scenery
364-
:field-defaults (dict
365-
:level-n None)
366-
:color-bg 'lime
367-
:iq-ix [
368-
7 ; normal exit
369-
94] ; special exit
363+
(defclass Exit [Scenery]
364+
(setv color-bg 'lime)
370365

371-
:mapsym (property-meth []
366+
(defmeth [property] mapsym []
372367
(setv n (- (@effective-level-n) G.level-n))
373368
(cond
374369
(< n -1) "<<"
@@ -377,7 +372,10 @@
377372
(= n 1) "> "
378373
True ">>"))
379374

380-
:suffix-dict (meth []
375+
(defmeth effective-level-n []
376+
G.level.next-level)
377+
378+
(defmeth suffix-dict []
381379
{
382380
(.format "{}to" (if (<= (@effective-level-n) G.level-n)
383381
"back "
@@ -386,24 +384,35 @@
386384
"victory"
387385
f"level {(@effective-level-n)}")})
388386

389-
:blocks-monster T
390-
:blocks-player-shots F :blocks-monster-shots F
391-
392-
:read-tile-extras (classmethod (fn [cls mk-pos v1 v2]
393-
(dict :level-n v2)))
394-
395-
:!effective-level-n (meth []
396-
(if (is @level-n None) G.level.next-level @level-n))
387+
(setv
388+
blocks-monster T
389+
blocks-player-shots F blocks-monster-shots F)
397390

398-
:hook-player-walked-into (meth []
391+
(defmeth hook-player-walked-into []
399392
(doc f"Takes you to dungeon level {(@effective-level-n)}. If you're already on that level, it's refreshed. If there is no such level, you win the quest.")
400393

401394
(hy.I.simalq/quest.start-level (@effective-level-n))
402395
(setv G.player.just-exited T)
403-
True)
396+
True))
397+
398+
(deftile :name "an exit" :superc Exit
399+
:iq-ix 7
404400

405401
:flavor "Get me outta here.")
406402

403+
(deftile :name "a special exit" :superc Exit
404+
:iq-ix 94
405+
:field-defaults (dict
406+
:level-n 0)
407+
408+
:read-tile-extras (classmethod (fn [cls mk-pos v1 v2]
409+
(dict :level-n v2)))
410+
411+
:effective-level-n (meth []
412+
@level-n)
413+
414+
:flavor "What's so special about it? Well, it might take you to a different level from a normal exit. Of course, all exits are special; some are just more special than others.")
415+
407416
;; --------------------------------------------------------------
408417
;; * Disappearing walls
409418
;; --------------------------------------------------------------

tests/test_scenery.hy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,10 @@
204204
(init
205205
[
206206
:map "> @ >1"
207-
:map-marks {">1" ["exit" :level-n 1]}]
207+
:map-marks {">1" ["special exit" :level-n 1]}]
208208
[])
209209
(assert-full-name 'W "an exit (to level 2)")
210-
(assert-full-name 'E "an exit (back to level 1)")
210+
(assert-full-name 'E "a special exit (back to level 1)")
211211
(wk (if use-special-exit? 'E 'W))
212212
(assert (= G.level-n (if use-special-exit? 1 2)))))
213213

tests/test_un_iq.hy

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,8 @@
240240
; A normal exit
241241
(setv [t] (get m 10 8))
242242
(assert (= t.stem "exit"))
243-
(assert (is t.level-n None))
244243

245244
; A special exit
246245
(setv [t] (get m 7 15))
247-
(assert (= t.stem "exit"))
246+
(assert (= t.stem "special exit"))
248247
(assert (= t.level-n 15)))

0 commit comments

Comments
 (0)