G:^:w:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:MORE | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_0 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | MORE | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x11 --> visible trap -- open pit
G:^:s:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_1 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x12 --> visible trap -- spiked pit
M:TRAP_PIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_2 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x13 --> visible trap -- poison pit
M:TRAP_PIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_3 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x14 --> visible trap -- rune -- summon
W:2
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_4 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x15 --> visible trap -- rune -- teleport
G:^:o:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_5 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x16 --> visible trap -- spot -- fire
G:^:u:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_6 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x17 --> visible trap -- spot -- acid
M:TRAP_FIRE
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_7 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x18 --> visible trap -- dart -- slow
G:^:r:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_8 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x19 --> visible trap -- dart -- lose str
M:TRAP_SLOW
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_9 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1A --> visible trap -- dart -- lose dex
M:TRAP_SLOW
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_10 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1B --> visible trap -- dart -- lose con
M:TRAP_SLOW
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_11 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1C --> visible trap -- gas -- blind
G:^:g:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_12 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1D --> visible trap -- gas -- confuse
M:TRAP_BLIND
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_13 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1E --> visible trap -- gas -- poison
M:TRAP_BLIND
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_14 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x1F --> visible trap -- gas -- sleep
M:TRAP_BLIND
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_15 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
# 0x2x --> locked door (power 0)
E:Pattern startpoint
G:*:w
W:16
-F:POWER_0 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_0 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:66:PATTERN_1
E:section of the Pattern
G:*:B
W:16
-F:POWER_1 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_1 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:67:PATTERN_2
E:section of the Pattern
G:*:b
W:16
-F:POWER_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:68:PATTERN_3
E:section of the Pattern
G:*:B
W:16
-F:POWER_3 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_3 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:69:PATTERN_4
E:section of the Pattern
G:*:b
W:16
-F:POWER_4 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_4 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:70:PATTERN_END
E:section of the Pattern
G:*:W
W:16
-F:POWER_5 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_5 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:71:PATTERN_OLD
E:section of the Pattern (discharged)
G:*:W
W:16
-F:POWER_6 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_6 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:72:PATTERN_EXIT
E:Pattern exit
G:*:w
W:16
-F:POWER_7 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_7 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
N:73:PATTERN_CORRUPTED
E:corrupted section of the Pattern
G:*:D
W:16
-F:POWER_8 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
+F:SUBTYPE_8 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | PERMANENT | CAN_FLY |
F:PATTERN
# 0x4A --> shop -- general store (perm)
E:General Store
G:1:U
W:10
-F:POWER_0 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_0 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x4B --> shop -- armoury (perm)
E:Armoury
G:2:s
W:10
-F:POWER_1 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_1 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x4C --> shop -- weapon shop (perm)
E:Weapon Smiths
G:3:w
W:10
-F:POWER_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x4D --> shop -- temple (perm)
E:Temple
G:4:g
W:10
-F:POWER_3 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_3 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x4E --> shop -- alchemist (perm)
E:Alchemy Shop
G:5:b
W:10
-F:POWER_4 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_4 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x4F --> shop -- magic shop (perm)
E:Magic Shop
G:6:r
W:10
-F:POWER_5 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_5 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x50 --> shop -- black market (perm)
E:Black Market
G:7:D
W:10
-F:POWER_6 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_6 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x51 --> shop -- home (perm)
E:Home
G:8:y
W:10
-F:POWER_7 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_7 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x52 --> shop -- bookstore (perm)
E:Bookstore
G:9:o
W:10
-F:POWER_8 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_8 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
# 0x53 --> terrain -- deep water
W:2
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_16 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:91:TRAP_ALARM
J:·ÙÊóÁõÃÖ
G:^:R:LIT
W:2
K:DESTROYED:*FLOOR*
-F:POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM | TRAP |
-F:HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_17 | POWER_5 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:92:TRAP_OPEN
J:³«Ì祹¥¤¥Ã¥Á
G:^:w:LIT
W:10
K:DESTROYED:*FLOOR*
-F:POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM |
-F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_18 | POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:93:FLOWER
J:²Ö
E:Museum
G:0:v
W:10
-F:POWER_9 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
+F:SUBTYPE_9 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | STORE | DOOR |
F:PERMANENT | GLOW
N:96:TREE
E:Building
G:+:U
W:10
-F:POWER_0 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_0 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:129:BUILDING_1
E:Building
G:+:U
W:10
-F:POWER_1 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_1 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:130:BUILDING_2
E:Building
G:+:v
W:10
-F:POWER_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:131:BUILDING_3
E:Building
G:+:U
W:10
-F:POWER_3 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_3 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:132:BUILDING_4
E:Building
G:+:U
W:10
-F:POWER_4 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_4 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:133:BUILDING_5
E:Building
G:+:U
W:10
-F:POWER_5 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_5 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:134:BUILDING_6
E:Building
G:+:U
W:10
-F:POWER_6 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_6 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:135:BUILDING_7
E:Building
G:+:o
W:10
-F:POWER_7 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_7 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:136:BUILDING_8
E:Building
G:+:R
W:10
-F:POWER_8 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_8 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:137:BUILDING_9
E:Building
G:+:G
W:10
-F:POWER_9 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_9 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:138:BUILDING_10
E:Building
G:+:v
W:10
-F:POWER_10 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_10 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:139:BUILDING_11
E:Building
G:+:u
W:10
-F:POWER_11 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_11 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:140:BUILDING_12
E:Building
G:+:w
W:10
-F:POWER_12 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_12 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:141:BUILDING_13
E:Building
G:+:B
W:10
-F:POWER_13 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_13 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:142:BUILDING_14
E:Building
G:+:B
W:10
-F:POWER_14 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_14 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:143:BUILDING_15
E:Building
G:+:B
W:10
-F:POWER_15 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_15 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:144:BUILDING_16
E:Building
G:+:B
W:10
-F:POWER_16 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_16 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:145:BUILDING_17
E:Building
G:+:B
W:10
-F:POWER_17 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_17 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:146:BUILDING_18
E:Building
G:+:B
W:10
-F:POWER_18 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_18 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:147:BUILDING_19
E:Building
G:+:B
W:10
-F:POWER_19 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_19 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:148:BUILDING_20
E:Building
G:+:B
W:10
-F:POWER_20 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_20 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:149:BUILDING_21
E:Building
G:+:B
W:10
-F:POWER_21 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_21 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:150:BUILDING_22
E:Building
G:+:B
W:10
-F:POWER_22 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_22 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:151:BUILDING_23
E:Building
G:+:B
W:10
-F:POWER_23 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_23 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:152:BUILDING_24
E:Building
G:+:B
W:10
-F:POWER_24 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_24 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:153:BUILDING_25
E:Building
G:+:B
W:10
-F:POWER_25 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_25 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:154:BUILDING_26
E:Building
G:+:B
W:10
-F:POWER_26 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_26 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:155:BUILDING_27
E:Building
G:+:B
W:10
-F:POWER_27 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_27 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:156:BUILDING_28
E:Building
G:+:B
W:10
-F:POWER_28 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_28 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:157:BUILDING_29
E:Building
G:+:B
W:10
-F:POWER_29 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_29 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:158:BUILDING_30
E:Building
G:+:B
W:10
-F:POWER_30 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_30 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
N:159:BUILDING_31
E:Building
G:+:B
W:10
-F:POWER_31 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:SUBTYPE_31 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
F:GLOW | BLDG
#### Special fake terrains (160-166) ####
N:160:*FLOOR*
M:FLOOR
-F:POWER_0 | CONVERT
+F:SUBTYPE_0 | CONVERT
N:161:*WALL*
M:GRANITE
-F:POWER_1 | CONVERT
+F:SUBTYPE_1 | CONVERT
N:162:*INNER*
M:GRANITE
-F:POWER_2 | CONVERT
+F:SUBTYPE_2 | CONVERT
N:163:*OUTER*
M:GRANITE
-F:POWER_3 | CONVERT
+F:SUBTYPE_3 | CONVERT
N:164:*SOLID*
M:GRANITE
-F:POWER_4 | CONVERT
+F:SUBTYPE_4 | CONVERT
N:165:*STREAM1*
M:MAGMA_VEIN
-F:POWER_5 | CONVERT
+F:SUBTYPE_5 | CONVERT
N:166:*STREAM2*
M:QUARTZ_VEIN
-F:POWER_6 | CONVERT
+F:SUBTYPE_6 | CONVERT
N:191:ARENA_GATE
J:Æþ¾ìÌç
E:gate of arena
G:+:v
W:10
-F:POWER_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT | BLDG
+F:SUBTYPE_2 | LOS | PROJECT | MOVE | NOTICE | REMEMBER | DOOR | PERMANENT |
+F:BLDG
N:192:TOWN
J:³¹
W:10
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
-F:POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM |
-F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_19 | POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
N:198:TRAP_PIRANHA
J:¥Ô¥é¥Ë¥¢¡¦¥È¥é¥Ã¥×
W:10
K:DESTROYED:*FLOOR*
K:HIT_TRAP:*FLOOR*
-F:POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER | DISARM |
-F:TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
+F:SUBTYPE_20 | POWER_100 | LOS | PROJECT | MOVE | PLACE | NOTICE | REMEMBER |
+F:DISARM | TRAP | HIT_TRAP | CAN_FLY | HURT_DISI | TELEPORTABLE
#### Glass features (199-219) (for testing) ####
return;
}
- which = f_info[cave[py][px].feat].power;
+ which = f_info[cave[py][px].feat].subtype;
bldg = &building[which];
else if (darkened_grid(c_ptr))
{
/* Unsafe cave grid -- idea borrowed from Unangband */
- feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? FEAT_UNDETECTED : FEAT_NONE;
+ feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
/* Access darkness */
f_ptr = &f_info[feat];
else
{
/* Unsafe cave grid -- idea borrowed from Unangband */
- if (view_unsafe_grids && (c_ptr->info & (CAVE_UNSAFE)))
- feat = FEAT_UNDETECTED;
- else
- feat = FEAT_NONE;
+ feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
/* Access darkness */
f_ptr = &f_info[feat];
if (have_flag(f_ptr->flags, FF_LOS) && have_flag(f_ptr->flags, FF_PROJECT))
{
/* Unsafe cave grid -- idea borrowed from Unangband */
- feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? FEAT_UNDETECTED : FEAT_NONE;
+ feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
/* Access darkness */
f_ptr = &f_info[feat];
else
{
/* Unsafe cave grid -- idea borrowed from Unangband */
- if (view_unsafe_grids && (c_ptr->info & (CAVE_UNSAFE)))
- feat = FEAT_UNDETECTED;
- else
- feat = FEAT_NONE;
+ feat = (view_unsafe_grids && (c_ptr->info & CAVE_UNSAFE)) ? feat_undetected : feat_none;
/* Access feature */
f_ptr = &f_info[feat];
/* Clear out-of-bound tiles */
/* Access darkness */
- feature_type *f_ptr = &f_info[FEAT_NONE];
+ feature_type *f_ptr = &f_info[feat_none];
/* Normal attr */
a = f_ptr->x_attr[F_LIT_STANDARD];
if (have_flag(f_ptr->flags, FF_CONVERT))
{
- switch (f_ptr->power)
+ switch (f_ptr->subtype)
{
case CONVERT_TYPE_FLOOR:
return floor_type[randint0(100)];
/* Get the cave grid */
cave_type *c_ptr = &cave[y][x];
-
- int trap_feat = c_ptr->feat;
+ feature_type *f_ptr = &f_info[c_ptr->feat];
+ int trap_feat_type = have_flag(f_ptr->flags, FF_TRAP) ? f_ptr->subtype : NOT_TRAP;
#ifdef JP
cptr name = "¥È¥é¥Ã¥×";
cave_alter_feat(y, x, FF_HIT_TRAP);
/* Analyze XXX XXX XXX */
- switch (trap_feat)
+ switch (trap_feat_type)
{
- case FEAT_TRAP_TRAPDOOR:
+ case TRAP_TRAPDOOR:
{
if (p_ptr->levitation)
{
break;
}
- case FEAT_TRAP_PIT:
+ case TRAP_PIT:
{
if (p_ptr->levitation)
{
break;
}
- case FEAT_TRAP_SPIKED_PIT:
+ case TRAP_SPIKED_PIT:
{
if (p_ptr->levitation)
{
break;
}
- case FEAT_TRAP_POISON_PIT:
+ case TRAP_POISON_PIT:
{
if (p_ptr->levitation)
{
break;
}
- case FEAT_TRAP_TY_CURSE:
+ case TRAP_TY_CURSE:
{
#ifdef JP
msg_print("²¿¤«¤¬¥Ô¥«¥Ã¤È¸÷¤Ã¤¿¡ª");
break;
}
- case FEAT_TRAP_TELEPORT:
+ case TRAP_TELEPORT:
{
#ifdef JP
msg_print("¥Æ¥ì¥Ý¡¼¥È¡¦¥È¥é¥Ã¥×¤Ë¤Ò¤Ã¤«¤«¤Ã¤¿¡ª");
break;
}
- case FEAT_TRAP_FIRE:
+ case TRAP_FIRE:
{
#ifdef JP
msg_print("±ê¤ËÊñ¤Þ¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_ACID:
+ case TRAP_ACID:
{
#ifdef JP
msg_print("»À¤¬¿á¤¤«¤±¤é¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_SLOW:
+ case TRAP_SLOW:
{
if (check_hit(125))
{
break;
}
- case FEAT_TRAP_LOSE_STR:
+ case TRAP_LOSE_STR:
{
if (check_hit(125))
{
break;
}
- case FEAT_TRAP_LOSE_DEX:
+ case TRAP_LOSE_DEX:
{
if (check_hit(125))
{
break;
}
- case FEAT_TRAP_LOSE_CON:
+ case TRAP_LOSE_CON:
{
if (check_hit(125))
{
break;
}
- case FEAT_TRAP_BLIND:
+ case TRAP_BLIND:
{
#ifdef JP
msg_print("¹õ¤¤¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_CONFUSE:
+ case TRAP_CONFUSE:
{
#ifdef JP
msg_print("¤¤é¤á¤¯¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_POISON:
+ case TRAP_POISON:
{
#ifdef JP
msg_print("»É·ãŪ¤ÊÎп§¤Î¥¬¥¹¤ËÊñ¤ß¹þ¤Þ¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_SLEEP:
+ case TRAP_SLEEP:
{
#ifdef JP
msg_print("´ñ̯¤ÊÇò¤¤Ì¸¤ËÊñ¤Þ¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_TRAPS:
+ case TRAP_TRAPS:
{
#ifdef JP
msg_print("¤Þ¤Ð¤æ¤¤Á®¸÷¤¬Áö¤Ã¤¿¡ª");
break;
}
- case FEAT_TRAP_ALARM:
+ case TRAP_ALARM:
{
#ifdef JP
msg_print("¤±¤¿¤¿¤Þ¤·¤¤²»¤¬ÌĤê¶Á¤¤¤¿¡ª");
break;
}
- case FEAT_TRAP_OPEN:
+ case TRAP_OPEN:
{
#ifdef JP
msg_print("Âç²»¶Á¤È¶¦¤Ë¤Þ¤ï¤ê¤ÎÊɤ¬Êø¤ì¤¿¡ª");
break;
}
- case FEAT_TRAP_ARMAGEDDON:
+ case TRAP_ARMAGEDDON:
{
static int levs[10] = {0, 0, 20, 10, 5, 3, 2, 1, 1, 1};
int evil_idx = 0, good_idx = 0;
break;
}
- case FEAT_TRAP_PIRANHA:
+ case TRAP_PIRANHA:
{
#ifdef JP
msg_print("ÆÍÁ³Êɤ«¤é¿å¤¬°î¤ì½Ð¤·¤¿¡ª¥Ô¥é¥Ë¥¢¤¬¤¤¤ë¡ª");
if (!is_pattern_tile_cur && !is_pattern_tile_new) return TRUE;
- pattern_type_cur = is_pattern_tile_cur ? cur_f_ptr->power : NOT_PATTERN_TILE;
- pattern_type_new = is_pattern_tile_new ? new_f_ptr->power : NOT_PATTERN_TILE;
+ pattern_type_cur = is_pattern_tile_cur ? cur_f_ptr->subtype : NOT_PATTERN_TILE;
+ pattern_type_new = is_pattern_tile_new ? new_f_ptr->subtype : NOT_PATTERN_TILE;
if (pattern_type_new == PATTERN_TILE_START)
{
bool trap_can_be_ignored(int feat)
{
- switch (feat)
+ feature_type *f_ptr = &f_info[feat];
+
+ if (!have_flag(f_ptr->flags, FF_TRAP)) return TRUE;
+
+ switch (f_ptr->subtype)
{
- case FEAT_TRAP_TRAPDOOR:
- case FEAT_TRAP_PIT:
- case FEAT_TRAP_SPIKED_PIT:
- case FEAT_TRAP_POISON_PIT:
+ case TRAP_TRAPDOOR:
+ case TRAP_PIT:
+ case TRAP_SPIKED_PIT:
+ case TRAP_POISON_PIT:
if (p_ptr->levitation) return TRUE;
break;
- case FEAT_TRAP_TELEPORT:
+ case TRAP_TELEPORT:
if (p_ptr->anti_tele) return TRUE;
break;
- case FEAT_TRAP_FIRE:
+ case TRAP_FIRE:
if (p_ptr->immune_fire) return TRUE;
break;
- case FEAT_TRAP_ACID:
+ case TRAP_ACID:
if (p_ptr->immune_acid) return TRUE;
break;
- case FEAT_TRAP_BLIND:
+ case TRAP_BLIND:
if (p_ptr->resist_blind) return TRUE;
break;
- case FEAT_TRAP_CONFUSE:
+ case TRAP_CONFUSE:
if (p_ptr->resist_conf) return TRUE;
break;
- case FEAT_TRAP_POISON:
+ case TRAP_POISON:
if (p_ptr->resist_pois) return TRUE;
break;
- case FEAT_TRAP_SLEEP:
+ case TRAP_SLEEP:
if (p_ptr->free_act) return TRUE;
break;
}
#define MAX_FEAT_STATES 8
-/*** Terrain Feature Indexes (see "lib/edit/f_info.txt") ***/
-
-/* Nothing */
-#define FEAT_NONE 0x00
-
-/* Various */
-#define FEAT_FLOOR 0x01
-#define FEAT_INVIS 0x02
-#define FEAT_GLYPH 0x03
-#define FEAT_OPEN 0x04
-#define FEAT_BROKEN 0x05
-#define FEAT_LESS 0x06
-#define FEAT_MORE 0x07
-
-/* Quest features -KMW- */
-#define FEAT_QUEST_ENTER 0x08
-#define FEAT_QUEST_EXIT 0x09
-#define FEAT_QUEST_DOWN 0x0A
-#define FEAT_QUEST_UP 0x0B
-
-#define FEAT_LESS_LESS 0x0D
-#define FEAT_MORE_MORE 0x0E
-
-/* Feature 0x0E - 0x0F unused */
-
-/* Traps */
-#define FEAT_TRAP_TRAPDOOR 0x10
-#define FEAT_TRAP_PIT 0x11
-#define FEAT_TRAP_SPIKED_PIT 0x12
-#define FEAT_TRAP_POISON_PIT 0x13
-#define FEAT_TRAP_TY_CURSE 0x14
-#define FEAT_TRAP_TELEPORT 0x15
-#define FEAT_TRAP_FIRE 0x16
-#define FEAT_TRAP_ACID 0x17
-#define FEAT_TRAP_SLOW 0x18
-#define FEAT_TRAP_LOSE_STR 0x19
-#define FEAT_TRAP_LOSE_DEX 0x1A
-#define FEAT_TRAP_LOSE_CON 0x1B
-#define FEAT_TRAP_BLIND 0x1C
-#define FEAT_TRAP_CONFUSE 0x1D
-#define FEAT_TRAP_POISON 0x1E
-#define FEAT_TRAP_SLEEP 0x1F
-
-/* Doors */
-#define FEAT_DOOR_HEAD 0x20
-#define FEAT_DOOR_TAIL 0x2F
-
-/* Extra */
-#define FEAT_SECRET 0x30
-#define FEAT_RUBBLE 0x31
-
-/* Seams */
-#define FEAT_MAGMA 0x32
-#define FEAT_QUARTZ 0x33
-#define FEAT_MAGMA_H 0x34
-#define FEAT_QUARTZ_H 0x35
-#define FEAT_MAGMA_K 0x36
-#define FEAT_QUARTZ_K 0x37
-
-/* Walls */
-#define FEAT_WALL 0x38
-#define FEAT_WALL_INNER 0x39
-#define FEAT_WALL_OUTER 0x3A
-#define FEAT_WALL_SOLID 0x3B
-#define FEAT_PERM 0x3C
-#define FEAT_PERM_INNER 0x3D
-#define FEAT_PERM_OUTER 0x3E
-#define FEAT_PERM_SOLID 0x3F
-
-/* Glyph */
-#define FEAT_MINOR_GLYPH 0x40
-
-/* Pattern */
-#define FEAT_PATTERN_START 0x41
-#define FEAT_PATTERN_1 0x42
-#define FEAT_PATTERN_2 0x43
-#define FEAT_PATTERN_3 0x44
-#define FEAT_PATTERN_4 0x45
-#define FEAT_PATTERN_END 0x46
-#define FEAT_PATTERN_OLD 0x47
-#define FEAT_PATTERN_XTRA1 0x48
-#define FEAT_PATTERN_XTRA2 0x49
-
-/* Shops */
-#define FEAT_SHOP_HEAD 0x4A
-#define FEAT_SHOP_TAIL 0x52
-
-/* Terrains */
-#define FEAT_DEEP_WATER 0x53
-#define FEAT_SHAL_WATER 0x54
-#define FEAT_DEEP_LAVA 0x55
-#define FEAT_SHAL_LAVA 0x56
-#define FEAT_DARK_PIT 0x57
-#define FEAT_DIRT 0x58
-#define FEAT_GRASS 0x59
-
-#define FEAT_TRAP_TRAPS 0x5A
-#define FEAT_TRAP_ALARM 0x5B
-#define FEAT_TRAP_OPEN 0x5C
-
-#define FEAT_FLOWER 0x5D
-#define FEAT_DEEP_GRASS 0x5E
-#define FEAT_MUSEUM 0x5F
-
-/* Terrain */
-#define FEAT_TREES 0x60
-#define FEAT_MOUNTAIN 0x61
-#define FEAT_MOUNTAIN_WALL 0x62
-
-/* Feature 0x63 - 0x7F unused */
-
-/* Buildings */
-#define FEAT_BLDG_HEAD 0x80
-#define FEAT_BLDG_TAIL 0x9F
-
-/* Hack -- Special fake terrains for f_info */
-#define FEAT_CONVERT_FLOOR 0xa0
-#define FEAT_CONVERT_WALL 0xa1
-#define FEAT_CONVERT_INNER 0xa2
-#define FEAT_CONVERT_OUTER 0xa3
-#define FEAT_CONVERT_SOLID 0xa4
-#define FEAT_CONVERT_STREAM1 0xa5
-#define FEAT_CONVERT_STREAM2 0xa6
-
-#define FEAT_TOWN 0xc0
-#define FEAT_ENTRANCE 0xc1
-#define FEAT_SWAMP 0xc2
-
-/* for mirror master */
-#define FEAT_MIRROR 0xc3
-
-/* unknown grid (not detected) */
-#define FEAT_UNDETECTED 0xc4
-
-/* special traps */
-#define FEAT_TRAP_ARMAGEDDON 0xc5
-#define FEAT_TRAP_PIRANHA 0xc6
-
/*
* Wilderness terrains
*/
#define TELEPORT_DEC_VALOUR 0x00000004
-/* Type of pattern tiles */
+/* Types of normal traps */
+#define NOT_TRAP -1
+#define TRAP_TRAPDOOR 0
+#define TRAP_PIT 1
+#define TRAP_SPIKED_PIT 2
+#define TRAP_POISON_PIT 3
+#define TRAP_TY_CURSE 4
+#define TRAP_TELEPORT 5
+#define TRAP_FIRE 6
+#define TRAP_ACID 7
+#define TRAP_SLOW 8
+#define TRAP_LOSE_STR 9
+#define TRAP_LOSE_DEX 10
+#define TRAP_LOSE_CON 11
+#define TRAP_BLIND 12
+#define TRAP_CONFUSE 13
+#define TRAP_POISON 14
+#define TRAP_SLEEP 15
+#define TRAP_TRAPS 16
+#define TRAP_ALARM 17
+
+
+/* Types of special traps */
+#define TRAP_OPEN 18
+#define TRAP_ARMAGEDDON 19
+#define TRAP_PIRANHA 20
+
+
+/* Maximum locked/jammed doors */
+#define MAX_LJ_DOORS 8
+
+
+/* Types of pattern tiles */
#define NOT_PATTERN_TILE -1
#define PATTERN_TILE_START 0
#define PATTERN_TILE_1 1
#define PATTERN_TILE_WRECKED 8
-/* Type of conversions */
+/* Types of conversions */
#define CONVERT_TYPE_FLOOR 0
#define CONVERT_TYPE_WALL 1
#define CONVERT_TYPE_INNER 2
static void wreck_the_pattern(void)
{
int to_ruin = 0, r_y, r_x;
- int pattern_type = f_info[cave[py][px].feat].power;
+ int pattern_type = f_info[cave[py][px].feat].subtype;
if (pattern_type == PATTERN_TILE_WRECKED)
{
scatter(&r_y, &r_x, py, px, 4, 0);
if (pattern_tile(r_y, r_x) &&
- (f_info[cave[r_y][r_x].feat].power != PATTERN_TILE_WRECKED))
+ (f_info[cave[r_y][r_x].feat].subtype != PATTERN_TILE_WRECKED))
{
- cave_set_feat(r_y, r_x, FEAT_PATTERN_XTRA2);
+ cave_set_feat(r_y, r_x, feat_pattern_corrupted);
}
}
- cave_set_feat(py, px, FEAT_PATTERN_XTRA2);
+ cave_set_feat(py, px, feat_pattern_corrupted);
}
wreck_the_pattern();
}
- pattern_type = f_info[cave[py][px].feat].power;
+ pattern_type = f_info[cave[py][px].feat].subtype;
switch (pattern_type)
{
(void)restore_level();
(void)hp_player(1000);
- cave_set_feat(py, px, FEAT_PATTERN_OLD);
+ cave_set_feat(py, px, feat_pattern_old);
#ifdef JP
msg_print("¡Ö¥Ñ¥¿¡¼¥ó¡×¤Î¤³¤ÎÉôʬ¤Ï¾¤ÎÉôʬ¤è¤ê¶¯ÎϤǤʤ¤¤è¤¦¤À¡£");
if (!have_flag(f_ptr->flags, FF_STORE)) continue;
/* Verify store type */
- if (f_ptr->power == n)
+ if (f_ptr->subtype == n)
{
/* Message */
#ifdef JP
extern kamae kamae_shurui[MAX_KAMAE];
extern kamae kata_shurui[MAX_KATA];
extern cptr exp_level_str[5];
-extern s16b conv_terrain2feat[MAX_WILDERNESS];
extern cptr silly_attacks[MAX_SILLY_ATTACK];
#ifdef JP
extern cptr silly_attacks2[MAX_SILLY_ATTACK];
extern bool ambush_flag;
extern bool generate_encounter;
extern cptr screen_dump;
+
+/*** Terrain feature variables ***/
+extern s16b feat_none;
+extern s16b feat_floor;
+extern s16b feat_glyph;
+extern s16b feat_explosive_rune;
+extern s16b feat_mirror;
+extern s16b feat_open_door;
+extern s16b feat_broken_door;
+extern s16b feat_closed_door;
+extern s16b feat_locked_door[MAX_LJ_DOORS];
+extern s16b num_locked_door;
+extern s16b feat_jammed_door[MAX_LJ_DOORS];
+extern s16b num_jammed_door;
+extern s16b feat_up_stair;
+extern s16b feat_down_stair;
+extern s16b feat_entrance;
+extern s16b feat_trap_open;
+extern s16b feat_trap_armageddon;
+extern s16b feat_trap_piranha;
+extern s16b feat_rubble;
+extern s16b feat_magma_vein;
+extern s16b feat_quartz_vein;
+extern s16b feat_granite;
+extern s16b feat_permanent;
+extern s16b feat_pattern_start;
+extern s16b feat_pattern_1;
+extern s16b feat_pattern_2;
+extern s16b feat_pattern_3;
+extern s16b feat_pattern_4;
+extern s16b feat_pattern_end;
+extern s16b feat_pattern_old;
+extern s16b feat_pattern_exit;
+extern s16b feat_pattern_corrupted;
+extern s16b feat_black_market;
+extern s16b feat_town;
+extern s16b feat_deep_water;
+extern s16b feat_shallow_water;
+extern s16b feat_deep_lava;
+extern s16b feat_shallow_lava;
+extern s16b feat_dirt;
+extern s16b feat_grass;
+extern s16b feat_flower;
+extern s16b feat_brake;
+extern s16b feat_tree;
+extern s16b feat_mountain;
+extern s16b feat_swamp;
+extern s16b feat_undetected;
+
extern byte dungeon_type;
extern s16b *max_dlv;
extern s16b feat_wall_outer;
extern cptr err_str[PARSE_ERROR_MAX];
extern errr init_v_info(void);
extern errr init_buildings(void);
+extern s16b f_tag_to_index_in_init(cptr str);
extern void init_angband(void);
extern cptr get_check_sum(void);
extern void place_gold(int y, int x);
extern s16b drop_near(object_type *o_ptr, int chance, int y, int x);
extern void acquirement(int y1, int x1, int num, bool great, bool known);
+extern void init_normal_traps(void);
extern s16b choose_random_trap(void);
extern void disclose_grid(int y, int x);
extern void place_trap(int y, int x);
extern void wilderness_gen(void);
extern void wilderness_gen_small(void);
extern errr init_wilderness(void);
+extern void init_wilderness_terrains(void);
extern void seed_wilderness(void);
extern errr parse_line_wilderness(char *buf, int ymin, int xmin, int ymax, int xmax, int *y, int *x);
extern bool change_wild_mode(void);
/* No stairs down from Quest */
if ((change_floor_mode & CFM_UP) && !quest_number(dun_level))
{
- if (change_floor_mode & CFM_SHAFT)
- c_ptr->feat = FEAT_MORE_MORE;
- else
- c_ptr->feat = FEAT_MORE;
+ c_ptr->feat = (change_floor_mode & CFM_SHAFT) ? feat_state(feat_down_stair, FF_SHAFT) : feat_down_stair;
}
/* No stairs up when ironman_downward */
else if ((change_floor_mode & CFM_DOWN) && !ironman_downward)
{
- if (change_floor_mode & CFM_SHAFT)
- c_ptr->feat = FEAT_LESS_LESS;
- else
- c_ptr->feat = FEAT_LESS;
+ c_ptr->feat = (change_floor_mode & CFM_SHAFT) ? feat_state(feat_up_stair, FF_SHAFT) : feat_up_stair;
}
/* Paranoia -- Clear mimic */
/* Create a staircase */
if (up)
{
- if (dest_sf_ptr->last_visit && dest_sf_ptr->dun_level <= dun_level - 2)
- cave_set_feat(py, px, FEAT_LESS_LESS);
- else
- cave_set_feat(py, px, FEAT_LESS);
+ cave_set_feat(py, px,
+ (dest_sf_ptr->last_visit && (dest_sf_ptr->dun_level <= dun_level - 2)) ?
+ feat_state(feat_up_stair, FF_SHAFT) : feat_up_stair);
}
else
{
- if (dest_sf_ptr->last_visit && dest_sf_ptr->dun_level >= dun_level + 2)
- cave_set_feat(py, px, FEAT_MORE_MORE);
- else
- cave_set_feat(py, px, FEAT_MORE);
+ cave_set_feat(py, px,
+ (dest_sf_ptr->last_visit && (dest_sf_ptr->dun_level >= dun_level + 2)) ?
+ feat_state(feat_down_stair, FF_SHAFT) : feat_down_stair);
}
build_maze_vault(cur_wid/2-1, cur_hgt/2-1, cur_wid-4, cur_hgt-4, FALSE);
/* Place 3 or 4 down stairs near some walls */
- if (!alloc_stairs(FEAT_MORE, rand_range(2, 3), 3)) return FALSE;
+ if (!alloc_stairs(feat_down_stair, rand_range(2, 3), 3)) return FALSE;
/* Place 1 or 2 up stairs near some walls */
- if (!alloc_stairs(FEAT_LESS, 1, 3)) return FALSE;
+ if (!alloc_stairs(feat_up_stair, 1, 3)) return FALSE;
}
/* Build some rooms */
/* Choose water or lava */
if ((randint1(MAX_DEPTH * 2) - 1 > dun_level) && (d_info[dungeon_type].flags1 & DF1_WATER_RIVER))
{
- feat1 = FEAT_DEEP_WATER;
- feat2 = FEAT_SHAL_WATER;
+ feat1 = feat_deep_water;
+ feat2 = feat_shallow_water;
}
else if (d_info[dungeon_type].flags1 & DF1_LAVA_RIVER)
{
- feat1 = FEAT_DEEP_LAVA;
- feat2 = FEAT_SHAL_LAVA;
+ feat1 = feat_deep_lava;
+ feat2 = feat_shallow_lava;
}
else feat1 = 0;
}
/* Place 3 or 4 down stairs near some walls */
- if (!alloc_stairs(FEAT_MORE, rand_range(3, 4), 3)) return FALSE;
+ if (!alloc_stairs(feat_down_stair, rand_range(3, 4), 3)) return FALSE;
/* Place 1 or 2 up stairs near some walls */
- if (!alloc_stairs(FEAT_LESS, rand_range(1, 2), 3)) return FALSE;
+ if (!alloc_stairs(feat_up_stair, rand_range(1, 2), 3)) return FALSE;
}
if (!dun->laketype)
for (x = qx + 1; x < qx + SCREEN_WID - 1; x++)
{
/* Create empty floor */
- cave[y][x].feat = FEAT_FLOOR;
+ cave[y][x].feat = feat_floor;
}
}
i = y_height + 4;
j = xval;
- cave[i][j].feat = FEAT_BLDG_HEAD + 3;
+ cave[i][j].feat = f_tag_to_index("BUILDING_3");
cave[i][j].info |= (CAVE_GLOW | CAVE_MARK);
player_place(i, j);
}
for (x = qx + 1; x < qx + SCREEN_WID - 1; x++)
{
/* Create empty floor */
- cave[y][x].feat = FEAT_FLOOR;
+ cave[y][x].feat = feat_floor;
}
}
if (tmp < 300)
{
/* Create open door */
- set_cave_feat(y, x, FEAT_OPEN);
+ set_cave_feat(y, x, feat_open_door);
}
/* Broken doors (100/1000) */
else if (tmp < 400)
{
/* Create broken door */
- set_cave_feat(y, x, FEAT_BROKEN);
+ set_cave_feat(y, x, feat_broken_door);
}
/* Secret doors (200/1000) */
if (tmp < 300)
{
/* Create closed door */
- cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00);
+ cave_set_feat(y, x, feat_closed_door);
}
/* Locked doors (99/400) */
else if (tmp < 399)
{
/* Create locked door */
- cave_set_feat(y, x, FEAT_DOOR_HEAD + randint1(7));
+ cave_set_feat(y, x, feat_locked_door[randint0(num_locked_door)]);
}
/* Stuck doors (1/400) */
else
{
/* Create jammed door */
- cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x08 + randint0(8));
+ cave_set_feat(y, x, feat_jammed_door[randint0(num_jammed_door)]);
}
/* Now it is not floor */
/* This should not be used */
/*#define set_cave_info(Y,X,I) (cave[(Y)][(X)].info = (I)) */
-#define place_rubble(Y,X) set_cave_feat(Y,X,FEAT_RUBBLE)
-#define place_up_stairs(Y,X) set_cave_feat(Y,X,FEAT_LESS)
-#define place_down_stairs(Y,X) set_cave_feat(Y,X,FEAT_MORE)
+#define place_rubble(Y,X) set_cave_feat(Y,X,feat_rubble)
+#define place_up_stairs(Y,X) set_cave_feat(Y,X,feat_up_stair)
+#define place_down_stairs(Y,X) set_cave_feat(Y,X,feat_down_stair)
#define is_floor_bold(Y,X) (cave[Y][X].info & CAVE_FLOOR)
#define is_extra_bold(Y,X) (cave[Y][X].info & CAVE_EXTRA)
#define place_extra_perm_bold(Y, X) \
{ \
- set_cave_feat(Y,X,FEAT_PERM); \
+ set_cave_feat(Y,X,feat_permanent); \
cave[Y][X].info &= ~(CAVE_MASK); \
add_cave_info(Y,X,CAVE_EXTRA); \
delete_monster(Y, X); \
#define place_extra_perm_grid(C) \
{ \
- (C)->feat = FEAT_PERM; \
+ (C)->feat = feat_permanent; \
(C)->info &= ~(CAVE_MASK); \
(C)->info |= CAVE_EXTRA; \
if ((C)->m_idx) delete_monster_idx((C)->m_idx); \
#define place_inner_perm_bold(Y, X) \
{ \
- set_cave_feat(Y,X,FEAT_PERM); \
+ set_cave_feat(Y,X,feat_permanent); \
cave[Y][X].info &= ~(CAVE_MASK); \
add_cave_info(Y,X,CAVE_INNER); \
delete_monster(Y, X); \
#define place_inner_perm_grid(C) \
{ \
- (C)->feat = FEAT_PERM; \
+ (C)->feat = feat_permanent; \
(C)->info &= ~(CAVE_MASK); \
(C)->info |= CAVE_INNER; \
if ((C)->m_idx) delete_monster_idx((C)->m_idx); \
#define place_outer_perm_bold(Y, X) \
{ \
- set_cave_feat(Y,X,FEAT_PERM); \
+ set_cave_feat(Y,X,feat_permanent); \
cave[Y][X].info &= ~(CAVE_MASK); \
add_cave_info(Y,X,CAVE_OUTER); \
delete_monster(Y, X); \
#define place_outer_perm_grid(C) \
{ \
- (C)->feat = FEAT_PERM; \
+ (C)->feat = feat_permanent; \
(C)->info &= ~(CAVE_MASK); \
(C)->info |= CAVE_OUTER; \
if ((C)->m_idx) delete_monster_idx((C)->m_idx); \
#define place_solid_perm_bold(Y, X) \
{ \
- set_cave_feat(Y,X,FEAT_PERM); \
+ set_cave_feat(Y,X,feat_permanent); \
cave[Y][X].info &= ~(CAVE_MASK); \
add_cave_info(Y,X,CAVE_SOLID); \
delete_monster(Y, X); \
#define place_solid_perm_grid(C) \
{ \
- (C)->feat = FEAT_PERM; \
+ (C)->feat = feat_permanent; \
(C)->info &= ~(CAVE_MASK); \
(C)->info |= CAVE_SOLID; \
if ((C)->m_idx) delete_monster_idx((C)->m_idx); \
while (*t == ' ' || *t == '|') t++;
}
+ /* XXX XXX XXX Hack -- Read feature subtype */
+ if (1 == sscanf(s, "SUBTYPE_%d", &i))
+ {
+ /* Extract a "subtype" */
+ f_ptr->subtype = i;
+
+ /* Start at next entry */
+ s = t;
+
+ /* Continue */
+ continue;
+ }
+
/* XXX XXX XXX Hack -- Read feature power */
if (1 == sscanf(s, "POWER_%d", &i))
{
int index = zz[0][0];
/* Reset the info for the letter */
- letter[index].feature = FEAT_NONE;
+ letter[index].feature = feat_none;
letter[index].monster = 0;
letter[index].object = 0;
letter[index].ego = 0;
letter[index].artifact = 0;
- letter[index].trap = FEAT_NONE;
+ letter[index].trap = feat_none;
letter[index].cave_info = 0;
letter[index].special = 0;
letter[index].random = RANDOM_NONE;
}
+static feat_tag_is_not_found = FALSE;
+
+
+s16b f_tag_to_index_in_init(cptr str)
+{
+ s16b feat = f_tag_to_index(str);
+
+ if (feat < 0) feat_tag_is_not_found = TRUE;
+
+ return feat;
+}
+
+
+/*
+ * Initialize feature variables
+ */
+static errr init_feat_variables(void)
+{
+ int i;
+
+ /* Nothing */
+ feat_none = f_tag_to_index_in_init("NONE");
+
+ /* Floor */
+ feat_floor = f_tag_to_index_in_init("FLOOR");
+
+ /* Objects */
+ feat_glyph = f_tag_to_index_in_init("GLYPH");
+ feat_explosive_rune = f_tag_to_index_in_init("EXPLOSIVE_RUNE");
+ feat_mirror = f_tag_to_index_in_init("MIRROR");
+
+ /* Doors */
+ feat_open_door = f_tag_to_index_in_init("OPEN_DOOR");
+ feat_broken_door = f_tag_to_index_in_init("BROKEN_DOOR");
+ feat_closed_door = f_tag_to_index_in_init("CLOSED_DOOR");
+
+ /* Locked doors */
+ for (i = 1; i < MAX_LJ_DOORS; i++)
+ {
+ s16b door = f_tag_to_index(format("LOCKED_DOOR_%d", i));
+ if (door < 0) break;
+ feat_locked_door[num_locked_door++] = door;
+ }
+ if (!num_locked_door) return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+
+ /* Jammed doors */
+ for (i = 0; i < MAX_LJ_DOORS; i++)
+ {
+ s16b door = f_tag_to_index(format("JAMMED_DOOR_%d", i));
+ if (door < 0) break;
+ feat_jammed_door[num_jammed_door++] = door;
+ }
+ if (!num_jammed_door) return PARSE_ERROR_UNDEFINED_TERRAIN_TAG;
+
+ /* Stairs */
+ feat_up_stair = f_tag_to_index_in_init("UP_STAIR");
+ feat_down_stair = f_tag_to_index_in_init("DOWN_STAIR");
+ feat_entrance = f_tag_to_index_in_init("ENTRANCE");
+
+ /* Normal traps */
+ init_normal_traps();
+
+ /* Special traps */
+ feat_trap_open = f_tag_to_index_in_init("TRAP_OPEN");
+ feat_trap_armageddon = f_tag_to_index_in_init("TRAP_ARMAGEDDON");
+ feat_trap_piranha = f_tag_to_index_in_init("TRAP_PIRANHA");
+
+ /* Rubble */
+ feat_rubble = f_tag_to_index_in_init("RUBBLE");
+
+ /* Seams */
+ feat_magma_vein = f_tag_to_index_in_init("MAGMA_VEIN");
+ feat_quartz_vein = f_tag_to_index_in_init("QUARTZ_VEIN");
+
+ /* Walls */
+ feat_granite = f_tag_to_index_in_init("GRANITE");
+ feat_permanent = f_tag_to_index_in_init("PERMANENT");
+
+ /* Pattern */
+ feat_pattern_start = f_tag_to_index_in_init("PATTERN_START");
+ feat_pattern_1 = f_tag_to_index_in_init("PATTERN_1");
+ feat_pattern_2 = f_tag_to_index_in_init("PATTERN_2");
+ feat_pattern_3 = f_tag_to_index_in_init("PATTERN_3");
+ feat_pattern_4 = f_tag_to_index_in_init("PATTERN_4");
+ feat_pattern_end = f_tag_to_index_in_init("PATTERN_END");
+ feat_pattern_old = f_tag_to_index_in_init("PATTERN_OLD");
+ feat_pattern_exit = f_tag_to_index_in_init("PATTERN_EXIT");
+ feat_pattern_corrupted = f_tag_to_index_in_init("PATTERN_CORRUPTED");
+
+ /* Various */
+ feat_black_market = f_tag_to_index_in_init("BLACK_MARKET");
+ feat_town = f_tag_to_index_in_init("TOWN");
+
+ /* Terrains */
+ feat_deep_water = f_tag_to_index_in_init("DEEP_WATER");
+ feat_shallow_water = f_tag_to_index_in_init("SHALLOW_WATER");
+ feat_deep_lava = f_tag_to_index_in_init("DEEP_LAVA");
+ feat_shallow_lava = f_tag_to_index_in_init("SHALLOW_LAVA");
+ feat_dirt = f_tag_to_index_in_init("DIRT");
+ feat_grass = f_tag_to_index_in_init("GRASS");
+ feat_flower = f_tag_to_index_in_init("FLOWER");
+ feat_brake = f_tag_to_index_in_init("BRAKE");
+ feat_tree = f_tag_to_index_in_init("TREE");
+ feat_mountain = f_tag_to_index_in_init("MOUNTAIN");
+ feat_swamp = f_tag_to_index_in_init("SWAMP");
+
+ /* Unknown grid (not detected) */
+ feat_undetected = f_tag_to_index_in_init("UNDETECTED");
+
+ /* Wilderness terrains */
+ init_wilderness_terrains();
+
+ return feat_tag_is_not_found ? PARSE_ERROR_UNDEFINED_TERRAIN_TAG : 0;
+}
+
+
/*
* Initialize some other arrays
*/
#ifdef JP
note("[¥Ç¡¼¥¿¤Î½é´ü²½Ãæ... (ÃÏ·Á)]");
if (init_f_info()) quit("ÃÏ·Á½é´ü²½ÉÔǽ");
+ if (init_feat_variables()) quit("ÃÏ·Á½é´ü²½ÉÔǽ");
#else
note("[Initializing arrays... (features)]");
if (init_f_info()) quit("Cannot initialize features");
+ if (init_feat_variables()) quit("Cannot initialize features");
#endif
/* Old hidden trap flag */
#define CAVE_TRAP 0x8000
+/*** Terrain Feature Indexes (see "lib/edit/f_info.txt") ***/
+#define OLD_FEAT_INVIS 0x02
+#define OLD_FEAT_GLYPH 0x03
+#define OLD_FEAT_MINOR_GLYPH 0x40
+#define OLD_FEAT_MIRROR 0xc3
+
/*
* Read the dungeon (old method)
*
c_ptr = &cave[y][x];
/* Very old */
- if (c_ptr->feat == FEAT_INVIS)
+ if (c_ptr->feat == OLD_FEAT_INVIS)
{
- c_ptr->feat = FEAT_FLOOR;
+ c_ptr->feat = feat_floor;
c_ptr->info |= CAVE_TRAP;
}
/* Older than 1.1.1 */
- if (c_ptr->feat == FEAT_MIRROR)
+ if (c_ptr->feat == OLD_FEAT_MIRROR)
{
- c_ptr->feat = FEAT_FLOOR;
+ c_ptr->feat = feat_floor;
c_ptr->info |= CAVE_OBJECT;
}
}
/* Old CAVE_IN_MIRROR flag */
if (c_ptr->info & CAVE_OBJECT)
{
- c_ptr->mimic = FEAT_MIRROR;
+ c_ptr->mimic = feat_mirror;
}
/* Runes will be mimics and flags */
- else if (c_ptr->feat == FEAT_MINOR_GLYPH ||
- c_ptr->feat == FEAT_GLYPH)
+ else if ((c_ptr->feat == OLD_FEAT_MINOR_GLYPH) ||
+ (c_ptr->feat == OLD_FEAT_GLYPH))
{
c_ptr->info |= CAVE_OBJECT;
c_ptr->mimic = c_ptr->feat;
- c_ptr->feat = FEAT_FLOOR;
+ c_ptr->feat = feat_floor;
}
/* Hidden traps will be trap terrains mimicing floor */
}
/* Another hidden trap */
- else if (c_ptr->feat == FEAT_INVIS)
+ else if (c_ptr->feat == OLD_FEAT_INVIS)
{
- c_ptr->mimic = FEAT_FLOOR;
- c_ptr->feat = FEAT_TRAP_OPEN;
+ c_ptr->mimic = feat_floor;
+ c_ptr->feat = feat_trap_open;
}
}
}
}
-#define MAX_TRAPS 18
+#define MAX_NORMAL_TRAPS 18
-static int trap_num[MAX_TRAPS] =
-{
- FEAT_TRAP_TRAPDOOR,
- FEAT_TRAP_PIT,
- FEAT_TRAP_SPIKED_PIT,
- FEAT_TRAP_POISON_PIT,
- FEAT_TRAP_TY_CURSE,
- FEAT_TRAP_TELEPORT,
- FEAT_TRAP_FIRE,
- FEAT_TRAP_ACID,
- FEAT_TRAP_SLOW,
- FEAT_TRAP_LOSE_STR,
- FEAT_TRAP_LOSE_DEX,
- FEAT_TRAP_LOSE_CON,
- FEAT_TRAP_BLIND,
- FEAT_TRAP_CONFUSE,
- FEAT_TRAP_POISON,
- FEAT_TRAP_SLEEP,
- FEAT_TRAP_TRAPS,
- FEAT_TRAP_ALARM,
-};
+/* See init_feat_variables() in init2.c */
+static s16b normal_traps[MAX_NORMAL_TRAPS];
+/*
+ * Initialize arrays for normal traps
+ */
+void init_normal_traps(void)
+{
+ int cur_trap = 0;
+
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPDOOR");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_PIT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SPIKED_PIT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON_PIT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TY_CURSE");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TELEPORT");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_FIRE");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ACID");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLOW");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_STR");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_DEX");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_LOSE_CON");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_BLIND");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_CONFUSE");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_POISON");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_SLEEP");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_TRAPS");
+ normal_traps[cur_trap++] = f_tag_to_index_in_init("TRAP_ALARM");
+}
/*
* Get random trap
while (1)
{
/* Hack -- pick a trap */
- feat = trap_num[randint0(MAX_TRAPS)];
+ feat = normal_traps[randint0(MAX_NORMAL_TRAPS)];
/* Accept non-trapdoors */
if (!have_flag(f_info[feat].flags, FF_MORE)) break;
}
else
{
- set_cave_feat(y, x, FEAT_DOOR_HEAD+randint1(7));
+ set_cave_feat(y, x, feat_locked_door[randint0(num_locked_door)]);
cave[y][x].info &= ~(CAVE_FLOOR);
delete_monster(y, x);
}
/* Black market in a dungeon */
case 'S':
- set_cave_feat(y, x, FEAT_SHOP_HEAD + STORE_BLACK);
+ set_cave_feat(y, x, feat_black_market);
store_init(NO_TOWN, STORE_BLACK);
break;
-
+
/* The Pattern */
case 'p':
- set_cave_feat(y, x, FEAT_PATTERN_START);
+ set_cave_feat(y, x, feat_pattern_start);
break;
-
+
case 'a':
- set_cave_feat(y, x, FEAT_PATTERN_1);
+ set_cave_feat(y, x, feat_pattern_1);
break;
-
+
case 'b':
- set_cave_feat(y, x, FEAT_PATTERN_2);
+ set_cave_feat(y, x, feat_pattern_2);
break;
-
+
case 'c':
- set_cave_feat(y, x, FEAT_PATTERN_3);
+ set_cave_feat(y, x, feat_pattern_3);
break;
-
+
case 'd':
- set_cave_feat(y, x, FEAT_PATTERN_4);
+ set_cave_feat(y, x, feat_pattern_4);
break;
-
+
case 'P':
- set_cave_feat(y, x, FEAT_PATTERN_END);
+ set_cave_feat(y, x, feat_pattern_end);
break;
-
+
case 'B':
- set_cave_feat(y, x, FEAT_PATTERN_XTRA1);
+ set_cave_feat(y, x, feat_pattern_exit);
break;
case 'A':
switch (type)
{
case LAKE_T_LAVA: /* Lava */
- feat1 = FEAT_DEEP_LAVA;
- feat2 = FEAT_SHAL_LAVA;
+ feat1 = feat_deep_lava;
+ feat2 = feat_shallow_lava;
feat3 = floor_type[randint0(100)];
break;
case LAKE_T_WATER: /* Water */
- feat1 = FEAT_DEEP_WATER;
- feat2 = FEAT_SHAL_WATER;
+ feat1 = feat_deep_water;
+ feat2 = feat_shallow_water;
feat3 = floor_type[randint0(100)];
break;
case LAKE_T_CAVE: /* Collapsed cave */
feat1 = floor_type[randint0(100)];
feat2 = floor_type[randint0(100)];
- feat3 = FEAT_RUBBLE;
+ feat3 = feat_rubble;
break;
case LAKE_T_EARTH_VAULT: /* Earth vault */
- feat1 = FEAT_RUBBLE;
+ feat1 = feat_rubble;
feat2 = floor_type[randint0(100)];
- feat3 = FEAT_RUBBLE;
+ feat3 = feat_rubble;
break;
case LAKE_T_AIR_VAULT: /* Air vault */
- feat1 = FEAT_GRASS;
- feat2 = FEAT_TREES;
- feat3 = FEAT_GRASS;
+ feat1 = feat_grass;
+ feat2 = feat_tree;
+ feat3 = feat_grass;
break;
case LAKE_T_WATER_VAULT: /* Water vault */
- feat1 = FEAT_SHAL_WATER;
- feat2 = FEAT_DEEP_WATER;
- feat3 = FEAT_SHAL_WATER;
+ feat1 = feat_shallow_water;
+ feat2 = feat_deep_water;
+ feat3 = feat_shallow_water;
break;
case LAKE_T_FIRE_VAULT: /* Fire Vault */
- feat1 = FEAT_SHAL_LAVA;
- feat2 = FEAT_DEEP_LAVA;
- feat3 = FEAT_SHAL_LAVA;
+ feat1 = feat_shallow_lava;
+ feat2 = feat_deep_lava;
+ feat3 = feat_shallow_lava;
break;
/* Paranoia */
/* Place the wall open trap */
cave[yval][xval].mimic = cave[yval][xval].feat;
- cave[yval][xval].feat = FEAT_TRAP_OPEN;
+ cave[yval][xval].feat = feat_trap_open;
/* Sort the entries */
for (i = 0; i < 16 - 1; i++)
}
if (dun_level < 30 + randint1(30))
- trap = FEAT_TRAP_PIRANHA;
+ trap = feat_trap_piranha;
else
- trap = FEAT_TRAP_ARMAGEDDON;
+ trap = feat_trap_armageddon;
/* Place a special trap */
c_ptr = &cave[rand_spread(yval, ysize/4)][rand_spread(xval, xsize/4)];
#else
msg_format("A tree %s", message);
#endif
- cave_set_feat(y, x, (one_in_(3) ? FEAT_DEEP_GRASS : FEAT_GRASS));
+ cave_set_feat(y, x, one_in_(3) ? feat_brake : feat_grass);
/* Observe */
if (c_ptr->info & (CAVE_MARK)) obvious = TRUE;
if (player_bold(y, x)) break;
/* Create a closed door */
- cave_set_feat(y, x, FEAT_DOOR_HEAD + 0x00);
+ cave_set_feat(y, x, feat_closed_door);
/* Observe */
if (c_ptr->info & (CAVE_MARK)) obvious = TRUE;
if (player_bold(y, x)) break;
/* Create a closed door */
- cave_set_feat(y, x, FEAT_TREES);
+ cave_set_feat(y, x, feat_tree);
/* Observe */
if (c_ptr->info & (CAVE_MARK)) obvious = TRUE;
/* Create a glyph */
c_ptr->info |= CAVE_OBJECT;
- c_ptr->mimic = FEAT_GLYPH;
+ c_ptr->mimic = feat_glyph;
/* Notice */
note_spot(y, x);
if (player_bold(y, x)) break;
/* Place a wall */
- cave_set_feat(y, x, FEAT_WALL);
+ cave_set_feat(y, x, feat_granite);
break;
}
if (!have_flag(f_ptr->flags, FF_FLOOR)) break;
/* Place a shallow lava */
- cave_set_feat(y, x, FEAT_SHAL_LAVA);
+ cave_set_feat(y, x, feat_shallow_lava);
}
/* Deep Lava */
else if (dam)
{
/* Place a deep lava */
- cave_set_feat(y, x, FEAT_DEEP_LAVA);
+ cave_set_feat(y, x, feat_deep_lava);
}
break;
}
if (!have_flag(f_ptr->flags, FF_FLOOR)) break;
/* Place a shallow water */
- cave_set_feat(y, x, FEAT_SHAL_WATER);
+ cave_set_feat(y, x, feat_shallow_water);
}
/* Deep Water */
else if (dam)
{
/* Place a deep water */
- cave_set_feat(y, x, FEAT_DEEP_WATER);
+ cave_set_feat(y, x, feat_deep_water);
}
break;
}
if (t < 20)
{
/* Create granite wall */
- cave_set_feat(y, x, FEAT_WALL);
+ cave_set_feat(y, x, feat_granite);
}
else if (t < 70)
{
/* Create quartz vein */
- cave_set_feat(y, x, FEAT_QUARTZ);
+ cave_set_feat(y, x, feat_quartz_vein);
}
else if (t < 100)
{
/* Create magma vein */
- cave_set_feat(y, x, FEAT_MAGMA);
+ cave_set_feat(y, x, feat_magma_vein);
}
else
{
else if (t < 70)
{
/* Create quartz vein */
- c_ptr->feat = FEAT_QUARTZ;
+ c_ptr->feat = feat_quartz_vein;
}
else if (t < 100)
{
/* Create magma vein */
- c_ptr->feat = FEAT_MAGMA;
+ c_ptr->feat = feat_magma_vein;
}
else
{
if (t < 20)
{
/* Create granite wall */
- cave_set_feat(yy, xx, FEAT_WALL);
+ cave_set_feat(yy, xx, feat_granite);
}
/* Quartz */
else if (t < 70)
{
/* Create quartz vein */
- cave_set_feat(yy, xx, FEAT_QUARTZ);
+ cave_set_feat(yy, xx, feat_quartz_vein);
}
/* Magma */
else if (t < 100)
{
/* Create magma vein */
- cave_set_feat(yy, xx, FEAT_MAGMA);
+ cave_set_feat(yy, xx, feat_magma_vein);
}
/* Floor */
/* Create a glyph */
cave[py][px].info |= CAVE_OBJECT;
- cave[py][px].mimic = FEAT_GLYPH;
+ cave[py][px].mimic = feat_glyph;
/* Notice */
note_spot(py, px);
/* Create a mirror */
cave[py][px].info |= CAVE_OBJECT;
- cave[py][px].mimic = FEAT_MIRROR;
+ cave[py][px].mimic = feat_mirror;
/* Turn on the light */
cave[py][px].info |= CAVE_GLOW;
/* Create a glyph */
cave[py][px].info |= CAVE_OBJECT;
- cave[py][px].mimic = FEAT_MINOR_GLYPH;
+ cave[py][px].mimic = feat_explosive_rune;
/* Notice */
note_spot(py, px);
}
/* Extract the store code */
- which = f_info[c_ptr->feat].power;
+ which = f_info[c_ptr->feat].subtype;
old_town_num = p_ptr->town_num;
if ((which == STORE_HOME) || (which == STORE_MUSEUM)) p_ptr->town_num = 1;
if ((distance(j, i, y, x) > 1) || (randint1(100) < 25))
{
if (randint1(100) < 75)
- cave[j][i].feat = FEAT_TREES;
+ cave[j][i].feat = feat_tree;
}
else
{
- cave[j][i].feat = FEAT_RUBBLE;
+ cave[j][i].feat = feat_rubble;
}
/* Clear garbage of hidden trap or door */
if (!ironman_downward && one_in_(3))
{
/* up stair */
- cave[y][x].feat = FEAT_LESS;
+ cave[y][x].feat = feat_up_stair;
}
}
{"[Unskilled]", "[Beginner]", "[Skilled]", "[Expert]", "[Master]"};
#endif
-s16b conv_terrain2feat[MAX_WILDERNESS] =
-{
- FEAT_PERM,
- FEAT_TOWN,
- FEAT_DEEP_WATER,
- FEAT_SHAL_WATER,
- FEAT_SWAMP,
- FEAT_DIRT,
- FEAT_GRASS,
- FEAT_TREES,
- FEAT_DIRT,
- FEAT_SHAL_LAVA,
- FEAT_DEEP_LAVA,
- FEAT_MOUNTAIN
-};
-
/* Weird melee attack types when hallucinating */
#ifdef JP
cptr silly_attacks[MAX_SILLY_ATTACK] =
* Feature state structure
*
* - Action (FF_*)
- * - Result (FEAT_*)
+ * - Result (f_info ID)
*/
typedef struct feature_state feature_state;
feature_state state[MAX_FEAT_STATES];
+ byte subtype;
byte power;
byte d_attr[F_LIT_MAX]; /* Default feature attribute */
cptr screen_dump = NULL;
+/*** Terrain feature variables ***/
+
+/* Nothing */
+s16b feat_none;
+
+/* Floor */
+s16b feat_floor;
+
+/* Objects */
+s16b feat_glyph;
+s16b feat_explosive_rune;
+s16b feat_mirror;
+
+/* Doors */
+s16b feat_open_door;
+s16b feat_broken_door;
+s16b feat_closed_door;
+s16b feat_locked_door[MAX_LJ_DOORS];
+s16b num_locked_door = 0;
+s16b feat_jammed_door[MAX_LJ_DOORS];
+s16b num_jammed_door = 0;
+
+/* Stairs */
+s16b feat_up_stair;
+s16b feat_down_stair;
+s16b feat_entrance;
+
+/* Special traps */
+s16b feat_trap_open;
+s16b feat_trap_armageddon;
+s16b feat_trap_piranha;
+
+/* Rubble */
+s16b feat_rubble;
+
+/* Seams */
+s16b feat_magma_vein;
+s16b feat_quartz_vein;
+
+/* Walls */
+s16b feat_granite;
+s16b feat_permanent;
+
+/* Pattern */
+s16b feat_pattern_start;
+s16b feat_pattern_1;
+s16b feat_pattern_2;
+s16b feat_pattern_3;
+s16b feat_pattern_4;
+s16b feat_pattern_end;
+s16b feat_pattern_old;
+s16b feat_pattern_exit;
+s16b feat_pattern_corrupted;
+
+/* Various */
+s16b feat_black_market;
+s16b feat_town;
+
+/* Terrains */
+s16b feat_deep_water;
+s16b feat_shallow_water;
+s16b feat_deep_lava;
+s16b feat_shallow_lava;
+s16b feat_dirt;
+s16b feat_grass;
+s16b feat_flower;
+s16b feat_brake;
+s16b feat_tree;
+s16b feat_mountain;
+s16b feat_swamp;
+
+/* Unknown grid (not detected) */
+s16b feat_undetected;
+
/*
* Which dungeon ?
*/
}
+#define MAX_FEAT_IN_TERRAIN 18
+
/*
* The default table in terrain level generation.
*/
-static int terrain_table[MAX_WILDERNESS][18] =
-{
- /* TERRAIN_EDGE */
- {
- FEAT_PERM,
- FEAT_PERM,
- FEAT_PERM,
-
- FEAT_PERM,
- FEAT_PERM,
- FEAT_PERM,
-
- FEAT_PERM,
- FEAT_PERM,
- FEAT_PERM,
-
- FEAT_PERM,
- FEAT_PERM,
- FEAT_PERM,
-
- FEAT_PERM,
- FEAT_PERM,
- FEAT_PERM,
-
- FEAT_PERM,
- FEAT_PERM,
- FEAT_PERM,
- },
- /* TERRAIN_TOWN */
- {
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
-
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
-
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
-
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
-
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
-
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
- },
- /* TERRAIN_DEEP_WATER */
- {
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
-
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
-
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
-
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- },
- /* TERRAIN_SHALLOW_WATER */
- {
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
- FEAT_DEEP_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
-
- FEAT_FLOOR,
- FEAT_DIRT,
- FEAT_GRASS,
- },
- /* TERRAIN_SWAMP */
- {
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_GRASS,
-
- FEAT_GRASS,
- FEAT_GRASS,
- FEAT_TREES,
-
- FEAT_DEEP_GRASS,
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
-
- FEAT_SHAL_WATER,
- FEAT_SHAL_WATER,
- FEAT_SWAMP,
-
- FEAT_SWAMP,
- FEAT_SWAMP,
- FEAT_SWAMP,
-
- FEAT_SWAMP,
- FEAT_SWAMP,
- FEAT_SWAMP,
- },
- /* TERRAIN_DIRT */
- {
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_FLOOR,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_FLOWER,
- FEAT_DEEP_GRASS,
-
- FEAT_GRASS,
- FEAT_TREES,
- FEAT_TREES,
- },
- /* TERRAIN_GRASS */
- {
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_GRASS,
- FEAT_GRASS,
-
- FEAT_GRASS,
- FEAT_GRASS,
- FEAT_GRASS,
-
- FEAT_GRASS,
- FEAT_GRASS,
- FEAT_GRASS,
-
- FEAT_GRASS,
- FEAT_FLOWER,
- FEAT_DEEP_GRASS,
-
- FEAT_DEEP_GRASS,
- FEAT_TREES,
- FEAT_TREES,
- },
- /* TERRAIN_TREES */
- {
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_DIRT,
-
- FEAT_TREES,
- FEAT_TREES,
- FEAT_TREES,
-
- FEAT_TREES,
- FEAT_TREES,
- FEAT_TREES,
-
- FEAT_TREES,
- FEAT_TREES,
- FEAT_TREES,
-
- FEAT_TREES,
- FEAT_TREES,
- FEAT_DEEP_GRASS,
-
- FEAT_DEEP_GRASS,
- FEAT_GRASS,
- FEAT_GRASS,
- },
- /* TERRAIN_DESERT */
- {
- FEAT_FLOOR,
- FEAT_FLOOR,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_GRASS,
- FEAT_GRASS,
- FEAT_GRASS,
- },
- /* TERRAIN_SHALLOW_LAVA */
- {
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
-
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
-
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
-
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
-
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
- FEAT_DEEP_LAVA,
-
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
- FEAT_MOUNTAIN,
- },
- /* TERRAIN_DEEP_LAVA */
- {
- FEAT_DIRT,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
- FEAT_SHAL_LAVA,
-
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
-
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
-
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
- FEAT_DEEP_LAVA,
-
- FEAT_DEEP_LAVA,
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
- },
- /* TERRAIN_MOUNTAIN */
- {
- FEAT_FLOOR,
- FEAT_DEEP_GRASS,
- FEAT_GRASS,
-
- FEAT_GRASS,
- FEAT_DIRT,
- FEAT_DIRT,
-
- FEAT_TREES,
- FEAT_TREES,
- FEAT_MOUNTAIN,
-
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
-
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
-
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
- FEAT_MOUNTAIN,
- },
-
-};
+static int terrain_table[MAX_WILDERNESS][MAX_FEAT_IN_TERRAIN];
static void generate_wilderness_area(int terrain, u32b seed, bool border, bool corner)
{
for (x1 = 0; x1 < MAX_WID; x1++)
{
- cave[y1][x1].feat = FEAT_PERM;
+ cave[y1][x1].feat = feat_permanent;
}
}
*/
if (wilderness[y][x].road)
{
- cave[MAX_HGT/2][MAX_WID/2].feat = FEAT_FLOOR;
+ cave[MAX_HGT/2][MAX_WID/2].feat = feat_floor;
if (wilderness[y-1][x].road)
{
for (y1 = 1; y1 < MAX_HGT/2; y1++)
{
x1 = MAX_WID/2;
- cave[y1][x1].feat = FEAT_FLOOR;
+ cave[y1][x1].feat = feat_floor;
}
}
for (y1 = MAX_HGT/2; y1 < MAX_HGT - 1; y1++)
{
x1 = MAX_WID/2;
- cave[y1][x1].feat = FEAT_FLOOR;
+ cave[y1][x1].feat = feat_floor;
}
}
for (x1 = MAX_WID/2; x1 < MAX_WID - 1; x1++)
{
y1 = MAX_HGT/2;
- cave[y1][x1].feat = FEAT_FLOOR;
+ cave[y1][x1].feat = feat_floor;
}
}
for (x1 = 1; x1 < MAX_WID/2; x1++)
{
y1 = MAX_HGT/2;
- cave[y1][x1].feat = FEAT_FLOOR;
+ cave[y1][x1].feat = feat_floor;
}
}
}
dy = rand_range(6, cur_hgt - 6);
dx = rand_range(6, cur_wid - 6);
- cave[dy][dx].feat = FEAT_ENTRANCE;
+ cave[dy][dx].feat = feat_entrance;
cave[dy][dx].special = wilderness[y][x].entrance;
/* Use the complex RNG */
/* Special boundary walls -- North */
for (i = 0; i < MAX_WID; i++)
{
- cave[0][i].feat = FEAT_PERM;
+ cave[0][i].feat = feat_permanent;
cave[0][i].mimic = border.north[i];
}
/* Special boundary walls -- South */
for (i = 0; i < MAX_WID; i++)
{
- cave[MAX_HGT - 1][i].feat = FEAT_PERM;
+ cave[MAX_HGT - 1][i].feat = feat_permanent;
cave[MAX_HGT - 1][i].mimic = border.south[i];
}
/* Special boundary walls -- West */
for (i = 0; i < MAX_HGT; i++)
{
- cave[i][0].feat = FEAT_PERM;
+ cave[i][0].feat = feat_permanent;
cave[i][0].mimic = border.west[i];
}
/* Special boundary walls -- East */
for (i = 0; i < MAX_HGT; i++)
{
- cave[i][MAX_WID - 1].feat = FEAT_PERM;
+ cave[i][MAX_WID - 1].feat = feat_permanent;
cave[i][MAX_WID - 1].mimic = border.east[i];
}
if (have_flag(f_ptr->flags, FF_BLDG))
{
- if ((f_ptr->power == 4) || ((p_ptr->town_num == 1) && (f_ptr->power == 0)))
+ if ((f_ptr->subtype == 4) || ((p_ptr->town_num == 1) && (f_ptr->subtype == 0)))
{
if (c_ptr->m_idx) delete_monster_idx(c_ptr->m_idx);
p_ptr->oldpy = y;
}
+static s16b conv_terrain2feat[MAX_WILDERNESS];
+
/*
* Build the wilderness area.
* -DG-
for (i = 0; i < MAX_WID; i++)
for (j = 0; j < MAX_HGT; j++)
{
- cave[j][i].feat = FEAT_PERM;
+ cave[j][i].feat = feat_permanent;
}
/* Init the wilderness */
{
if (wilderness[j][i].town && (wilderness[j][i].town != NO_TOWN))
{
- cave[j][i].feat = FEAT_TOWN;
+ cave[j][i].feat = feat_town;
cave[j][i].special = wilderness[j][i].town;
}
- else if (wilderness[j][i].road) cave[j][i].feat = FEAT_FLOOR;
+ else if (wilderness[j][i].road) cave[j][i].feat = feat_floor;
else if (wilderness[j][i].entrance && (p_ptr->total_winner || !(d_info[wilderness[j][i].entrance].flags1 & DF1_WINNER)))
{
- cave[j][i].feat = FEAT_ENTRANCE;
+ cave[j][i].feat = feat_entrance;
cave[j][i].special = (byte)wilderness[j][i].entrance;
}
else cave[j][i].feat = conv_terrain2feat[wilderness[j][i].terrain];
}
+static void init_terrain_table(int terrain, s16b feat_global, cptr fmt, ...)
+{
+ va_list vp;
+ cptr p;
+ int cur = 0;
+ char check = 'a';
+ s16b feat;
+ int num;
+
+ /* Begin the varargs stuff */
+ va_start(vp, fmt);
+
+ /* Wilderness terrains on global map */
+ conv_terrain2feat[terrain] = feat_global;
+
+ /* Wilderness terrains on local map */
+ for (p = fmt; *p; p++)
+ {
+ if (*p == check)
+ {
+ int lim;
+
+ feat = va_arg(vp, s16b);
+ num = va_arg(vp, int);
+ lim = cur + num;
+
+ for (; (cur < lim) && (cur < MAX_FEAT_IN_TERRAIN); cur++)
+ terrain_table[terrain][cur] = feat;
+ if (cur >= MAX_FEAT_IN_TERRAIN) break;
+
+ check++;
+ }
+ else /* Paranoia */
+ {
+ plog_fmt("Format error");
+ }
+ }
+
+ feat = terrain_table[terrain][cur];
+ for (; cur < MAX_FEAT_IN_TERRAIN; cur++) terrain_table[terrain][cur] = feat;
+
+ /* End the varargs stuff */
+ va_end(vp);
+}
+
+
+/*
+ * Initialize arrays for wilderness terrains
+ */
+void init_wilderness_terrains(void)
+{
+ init_terrain_table(TERRAIN_EDGE, feat_permanent, "a",
+ feat_permanent, MAX_FEAT_IN_TERRAIN);
+
+ init_terrain_table(TERRAIN_TOWN, feat_town, "a",
+ feat_floor, MAX_FEAT_IN_TERRAIN);
+
+ init_terrain_table(TERRAIN_DEEP_WATER, feat_deep_water, "ab",
+ feat_deep_water, 12,
+ feat_shallow_water, MAX_FEAT_IN_TERRAIN - 12);
+
+ init_terrain_table(TERRAIN_SHALLOW_WATER, feat_shallow_water, "abcde",
+ feat_deep_water, 3,
+ feat_shallow_water, 12,
+ feat_floor, 1,
+ feat_dirt, 1,
+ feat_grass, MAX_FEAT_IN_TERRAIN - 17);
+
+ init_terrain_table(TERRAIN_SWAMP, feat_swamp, "abcdef",
+ feat_dirt, 2,
+ feat_grass, 3,
+ feat_tree, 1,
+ feat_brake, 1,
+ feat_shallow_water, 4,
+ feat_swamp, MAX_FEAT_IN_TERRAIN - 11);
+
+ init_terrain_table(TERRAIN_DIRT, feat_dirt, "abcdef",
+ feat_floor, 3,
+ feat_dirt, 10,
+ feat_flower, 1,
+ feat_brake, 1,
+ feat_grass, 1,
+ feat_tree, MAX_FEAT_IN_TERRAIN - 16);
+
+ init_terrain_table(TERRAIN_GRASS, feat_grass, "abcdef",
+ feat_floor, 2,
+ feat_dirt, 2,
+ feat_grass, 9,
+ feat_flower, 1,
+ feat_brake, 2,
+ feat_tree, MAX_FEAT_IN_TERRAIN - 16);
+
+ init_terrain_table(TERRAIN_TREES, feat_tree, "abcde",
+ feat_floor, 2,
+ feat_dirt, 1,
+ feat_tree, 11,
+ feat_brake, 2,
+ feat_grass, MAX_FEAT_IN_TERRAIN - 16);
+
+ init_terrain_table(TERRAIN_DESERT, feat_dirt, "abc",
+ feat_floor, 2,
+ feat_dirt, 13,
+ feat_grass, MAX_FEAT_IN_TERRAIN - 15);
+
+ init_terrain_table(TERRAIN_SHALLOW_LAVA, feat_shallow_lava, "abc",
+ feat_shallow_lava, 14,
+ feat_deep_lava, 3,
+ feat_mountain, MAX_FEAT_IN_TERRAIN - 17);
+
+ init_terrain_table(TERRAIN_DEEP_LAVA, feat_deep_lava, "abcd",
+ feat_dirt, 3,
+ feat_shallow_lava, 3,
+ feat_deep_lava, 10,
+ feat_mountain, MAX_FEAT_IN_TERRAIN - 16);
+
+ init_terrain_table(TERRAIN_MOUNTAIN, feat_mountain, "abcdef",
+ feat_floor, 1,
+ feat_brake, 1,
+ feat_grass, 2,
+ feat_dirt, 2,
+ feat_tree, 2,
+ feat_mountain, MAX_FEAT_IN_TERRAIN - 8);
+}
+
+
bool change_wild_mode(void)
{
int i;
*/
static void do_cmd_wiz_create_feature(void)
{
- static int prev_feat = FEAT_NONE;
- static int prev_mimic = FEAT_NONE;
+ static int prev_feat = 0;
+ static int prev_mimic = 0;
cave_type *c_ptr;
feature_type *f_ptr;
char tmp_val[160];
/* Create stairs down */
- cave_set_feat(y, x, FEAT_MORE);
+ cave_set_feat(y, x, feat_down_stair);
/* Remember to update everything */
p_ptr->update |= (PU_FLOW);
if (!(c_ptr->info & CAVE_MARK) && !player_can_see_bold(y, x))
{
/* Forget feature */
- feat = FEAT_NONE;
+ feat = feat_none;
}
f_ptr = &f_info[feat];
/* Hack -- special handling for building doors */
if (have_flag(f_ptr->flags, FF_BLDG) && !p_ptr->inside_arena)
{
- name = building[f_ptr->power].name;
+ name = building[f_ptr->subtype].name;
}
else if (have_flag(f_ptr->flags, FF_ENTRANCE))
{
{
name = town[c_ptr->special].name;
}
- else if (p_ptr->wild_mode && (feat == FEAT_FLOOR))
+ else if (p_ptr->wild_mode && (feat == feat_floor))
{
#ifdef JP
name = "ƻ";