nx_decl_dungeon_floor_test.nx source
↩ module page · 95 lines · 3723 B
1// nx_decl_dungeon_floor_test.nx -- smoke for the fourth declarator.
2//
3// expect_exit: 0
4//
5// license_tier: ORIGINAL
6
7import "nx_syscalls.nx"
8import "nx_types.nx"
9import "nx_tier.nx"
10import "nx_decl_random_environment.nx"
11import "nx_decl_dungeon_floor.nx"
12
13func main() -> nx_int {
14 // ---- T1: mood validity ----------------------------------------
15 if nx_dungeon_mood_is_valid(NX_DUNGEON_MOOD_CRYPT) != 1 { return 1 }
16 if nx_dungeon_mood_is_valid(NX_DUNGEON_MOOD_LAB) != 1 { return 2 }
17 if nx_dungeon_mood_is_valid(NX_DUNGEON_MOOD_N) != 0 { return 3 }
18 if nx_dungeon_mood_is_valid(-1) != 0 { return 4 }
19
20 // ---- T2: REAL dungeon -> 24x24, fantasy moods only -----------
21 let d: *NxDungeonFloor = nx_df_alloc()
22 nx_decl_dungeon_floor(d, NX_RE_MODIFIER_REAL, 42)
23 if d.is_valid != 1 { return 10 }
24 if d.grid_width != 24 { return 11 }
25 if d.grid_height != 24 { return 12 }
26 if d.mood == NX_DUNGEON_MOOD_REACTOR { return 13 } // sci-fi only
27 if d.mood == NX_DUNGEON_MOOD_LAB { return 14 }
28 if nx_dungeon_mood_is_valid(d.mood) != 1 { return 15 }
29 if d.room_count < 4 { return 16 }
30 if d.corridor_count < 0 { return 17 }
31 if d.treasure_count < 1 { return 18 }
32 if d.trap_count < 0 { return 19 }
33 if d.light_level_q10 < 0 { return 20 }
34 if d.light_level_q10 > 1024 { return 21 }
35
36 // ---- T3: FANTASY dungeon scales up ---------------------------
37 let f: *NxDungeonFloor = nx_df_alloc()
38 nx_decl_dungeon_floor(f, NX_RE_MODIFIER_FANTASY, 42)
39 if f.grid_width != 48 { return 30 }
40 if f.grid_height != 48 { return 31 }
41 if f.room_count < 8 { return 32 }
42 if f.mood == NX_DUNGEON_MOOD_REACTOR { return 33 } // still fantasy
43 if f.mood == NX_DUNGEON_MOOD_LAB { return 34 }
44
45 // ---- T4: SCI_FI dungeon picks REACTOR or LAB only ------------
46 let s: *NxDungeonFloor = nx_df_alloc()
47 nx_decl_dungeon_floor(s, NX_RE_MODIFIER_SCI_FI, 42)
48 if s.grid_width != 32 { return 40 }
49 if s.mood != NX_DUNGEON_MOOD_REACTOR {
50 if s.mood != NX_DUNGEON_MOOD_LAB { return 41 }
51 }
52
53 // ---- T5: determinism (same seed -> identical floor) ----------
54 let p: *NxDungeonFloor = nx_df_alloc()
55 let q: *NxDungeonFloor = nx_df_alloc()
56 nx_decl_dungeon_floor(p, NX_RE_MODIFIER_FANTASY, 99)
57 nx_decl_dungeon_floor(q, NX_RE_MODIFIER_FANTASY, 99)
58 if p.mood != q.mood { return 50 }
59 if p.room_count != q.room_count { return 51 }
60 if p.treasure_count != q.treasure_count { return 52 }
61 if p.trap_count != q.trap_count { return 53 }
62 if p.boss_present != q.boss_present { return 54 }
63
64 // ---- T6: corridor count = room_count - 1 (when rooms >= 2) ----
65 if p.room_count >= 2 {
66 if p.corridor_count != p.room_count - 1 { return 60 }
67 }
68
69 // ---- T7: invalid modifier -> is_valid=0 -----------------------
70 let bad: *NxDungeonFloor = nx_df_alloc()
71 nx_decl_dungeon_floor(bad, 999, 0)
72 if bad.is_valid != 0 { return 70 }
73
74 // ---- T8: mood reflection -------------------------------------
75 let n1: *u8 = nx_dungeon_mood_name(NX_DUNGEON_MOOD_CRYPT)
76 if (n1[0] as i64 & 255) != 67 { return 80 } // 'C'
77
78 let n2: *u8 = nx_dungeon_mood_name(NX_DUNGEON_MOOD_REACTOR)
79 if (n2[0] as i64 & 255) != 82 { return 81 } // 'R'
80
81 // Print a representative debug line.
82 sys_write(1, "modifier=" as *u8, 9)
83 let mn: *u8 = nx_re_modifier_name(f.modifier)
84 var i: i64 = 0
85 while mn[i] != 0 { i = i + 1 }
86 sys_write(1, mn, i)
87 sys_write(1, " mood=" as *u8, 6)
88 let dn: *u8 = nx_dungeon_mood_name(f.mood)
89 var j: i64 = 0
90 while dn[j] != 0 { j = j + 1 }
91 sys_write(1, dn, j)
92 sys_write(1, "\n" as *u8, 1)
93
94 return 0
95}