code wiki / (root) / nx_decl_townscape_test.nx

nx_decl_townscape_test.nx source

↩ module page · 103 lines · 4191 B

1// nx_decl_townscape_test.nx -- smoke for the fifth 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_simple_scene.nx" 12import "nx_decl_townscape.nx" 13 14func main() -> nx_int { 15 // ---- T1: kind validity ---------------------------------------- 16 if nx_town_kind_is_valid(NX_TOWN_KIND_HAMLET) != 1 { return 1 } 17 if nx_town_kind_is_valid(NX_TOWN_KIND_METROPOLIS) != 1 { return 2 } 18 if nx_town_kind_is_valid(NX_TOWN_KIND_N) != 0 { return 3 } 19 if nx_town_kind_is_valid(-1) != 0 { return 4 } 20 21 // ---- T2: REAL townscape -> scene populated + non-sci-fi kind -- 22 let t: *NxTownscape = nx_ts_alloc() 23 nx_decl_townscape(t, NX_RE_MODIFIER_REAL, 7) 24 if t.is_valid != 1 { return 10 } 25 if t.scene.is_valid != 1 { return 11 } 26 if t.kind == NX_TOWN_KIND_OUTPOST { return 12 } // sci-fi only 27 if t.kind == NX_TOWN_KIND_METROPOLIS { return 13 } // sci-fi only 28 if t.building_count <= 0 { return 14 } 29 if t.road_count <= 0 { return 15 } 30 if t.population_log10 < 10 { return 16 } 31 if t.population_log10 > 60 { return 17 } 32 33 // ---- T3: FANTASY townscape -> fantasy kinds only ------------- 34 let f: *NxTownscape = nx_ts_alloc() 35 nx_decl_townscape(f, NX_RE_MODIFIER_FANTASY, 7) 36 if f.kind == NX_TOWN_KIND_OUTPOST { return 20 } 37 if f.kind == NX_TOWN_KIND_METROPOLIS { return 21 } 38 if f.scene.env.size_tiles != 512 { return 22 } 39 40 // ---- T4: SCI_FI townscape -> OUTPOST/CITY/METROPOLIS -------- 41 let s: *NxTownscape = nx_ts_alloc() 42 nx_decl_townscape(s, NX_RE_MODIFIER_SCI_FI, 7) 43 if s.kind != NX_TOWN_KIND_OUTPOST { 44 if s.kind != NX_TOWN_KIND_CITY { 45 if s.kind != NX_TOWN_KIND_METROPOLIS { return 30 } 46 } 47 } 48 if s.scene.env.size_tiles != 1024 { return 31 } 49 50 // ---- T5: bigger kinds have more buildings + roads ------------ 51 if _ts_building_count(NX_TOWN_KIND_CITY) <= _ts_building_count(NX_TOWN_KIND_VILLAGE) { return 40 } 52 if _ts_road_count(NX_TOWN_KIND_CITY) <= _ts_road_count(NX_TOWN_KIND_VILLAGE) { return 41 } 53 if _ts_building_count(NX_TOWN_KIND_METROPOLIS) <= _ts_building_count(NX_TOWN_KIND_CITY) { return 42 } 54 55 // ---- T6: amenity rules --------------------------------------- 56 // Hamlet has no market. 57 let h: *NxTownscape = nx_ts_alloc() 58 nx_decl_townscape(h, NX_RE_MODIFIER_REAL, 0) 59 // (seed-dependent; we check the predicate instead by forcing a known kind) 60 // Just verify the rule indirectly: if kind == HAMLET, market == 0 61 if h.kind == NX_TOWN_KIND_HAMLET { 62 if h.market_present != 0 { return 50 } 63 if h.temple_present != 0 { return 51 } 64 } 65 66 // ---- T7: determinism ----------------------------------------- 67 let p: *NxTownscape = nx_ts_alloc() 68 let q: *NxTownscape = nx_ts_alloc() 69 nx_decl_townscape(p, NX_RE_MODIFIER_REAL, 12345) 70 nx_decl_townscape(q, NX_RE_MODIFIER_REAL, 12345) 71 if p.kind != q.kind { return 60 } 72 if p.building_count != q.building_count { return 61 } 73 if p.scene.light_kind != q.scene.light_kind { return 62 } 74 75 // ---- T8: invalid modifier -> is_valid=0 ----------------------- 76 let bad: *NxTownscape = nx_ts_alloc() 77 nx_decl_townscape(bad, 999, 0) 78 if bad.is_valid != 0 { return 70 } 79 80 // ---- T9: reflection ------------------------------------------ 81 let n: *u8 = nx_town_kind_name(NX_TOWN_KIND_VILLAGE) 82 if (n[0] as i64 & 255) != 86 { return 80 } // 'V' 83 84 // Print debug line composing 3 reflectors. 85 sys_write(1, "modifier=" as *u8, 9) 86 let mn: *u8 = nx_re_modifier_name(t.modifier) 87 var i: i64 = 0 88 while mn[i] != 0 { i = i + 1 } 89 sys_write(1, mn, i) 90 sys_write(1, " kind=" as *u8, 6) 91 let tn: *u8 = nx_town_kind_name(t.kind) 92 var j: i64 = 0 93 while tn[j] != 0 { j = j + 1 } 94 sys_write(1, tn, j) 95 sys_write(1, " light=" as *u8, 7) 96 let ln: *u8 = nx_ss_light_name(t.scene.light_kind) 97 var k: i64 = 0 98 while ln[k] != 0 { k = k + 1 } 99 sys_write(1, ln, k) 100 sys_write(1, "\n" as *u8, 1) 101 102 return 0 103}